59 lines
1.7 KiB
Python
Executable File
59 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import numpy as np
|
|
from WheeledRobot import AckermanRobotEnv
|
|
|
|
# AckermanRobot kinematics
|
|
r = 0.1
|
|
|
|
# wheel equations function
|
|
def J(dX_R):
|
|
"""Transform desired robot velocities to control inputs"""
|
|
U = np.array([[1/r*dX_R[0,0]], [dX_R[0,0]/dX_R[2,0]]])
|
|
return U
|
|
|
|
def controller_ackerman(t, X_I, dX_I):
|
|
# example controller outputs
|
|
radius = 2; period = 10
|
|
dX_R_des = np.array([[2*np.pi*radius/period],[0],[2*np.pi/period]])
|
|
#dX_R_des = np.array([[1],[0],[0]])
|
|
#dX_R_des = np.array([[0],[1],[0]])
|
|
#dX_R_des = np.array([[0],[0],[1]])
|
|
|
|
U = J(dX_R_des)
|
|
return U
|
|
|
|
def run_simulation():
|
|
"""Run simulation using Gymnasium environment"""
|
|
env = AckermanRobotEnv(render_mode="human")
|
|
observation, _ = env.reset()
|
|
|
|
print("Starting Ackermann Robot Simulation")
|
|
print("Controller: Circular motion")
|
|
|
|
for step in range(1000):
|
|
# Extract controller inputs from observation
|
|
time = observation[6] # Current time
|
|
X_I = observation[:3].reshape(-1, 1) # State [x, y, theta]
|
|
dX_I = observation[3:6].reshape(-1, 1) # Derivatives [dx, dy, dtheta]
|
|
|
|
# Call original controller
|
|
U = controller_ackerman(time, X_I, dX_I)
|
|
|
|
# Step environment
|
|
observation, reward, terminated, truncated, _ = env.step(U.flatten())
|
|
|
|
# Render the environment
|
|
env.render()
|
|
|
|
if terminated or truncated:
|
|
print(f"Simulation ended at step {step}")
|
|
break
|
|
|
|
input("Press Enter to close the simulation window...")
|
|
env.close()
|
|
print("Simulation completed")
|
|
|
|
if __name__ == "__main__":
|
|
run_simulation()
|