Mobile robot simulation with SciPy ODE solver (0-10 points)
Goal
Modify the mobile robot simulation (previous task) to use an ODE solver (Python SciPy) for the motion equations calculations.
Description
Create a system that will simulate the motion of a mobile robot using an ODE solver in Python to handle the differential equations.
\left\{\begin{array}{rcl} \dot{x} & = & \cos{\phi}\cdot u_1,\\ \dot{y} & = & \sin{\phi}\cdot u_1,\\ \dot{\phi} & = & u_2,\end{array}\right.where:
x, y, \phi represent the pose of the robot (position and orientation),
u_1 is the linear velocity control signal,
u_2 is the angular velocity control signal.
The diagram shows an example system (in the simplest case, open-loop control)
Remarks
- Assume that the robot is moving on the XY plane and z is equal to 0.
- Assume that at the beginning robot is placed in point (0,0,0).
- Publish trajectory of the robot as a series of geometry_msgs/PoseStamped messages.
- Publish the robot pose also with tf2 as a transformation between
world
andbase_link
frame. You can assume that theworld
frame is constant. - Visualize the path and frames in rviz (alternatively in foxglove).
- The simulated robot should move in a meaningful way, for example, along a square (not a circle, as the control signals should not remain constant).
- Create a new ROS 2 package for your robot simulation project.
- Create a launcher (Python based launcher) that will start all nodes and load parameters from a YAML files. The system should be started with single command.
ros2 launch package_name launcher_name
- Document code.
Example of ODE solving with SciPy – solve_ivp
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt
# RHS of the ODE dot(x) = f(t, x, p), where
# t -- time
# x -- state
# p -- parameter
def f(t, x, p):
return -p * x
T = [0, 10] # Time horizon
x0 = [2] # Initial state
p = 0.5 # Parameter
# Solve
sol = solve_ivp(f, T, x0, args=[p])
# Plot the solution
plt.plot(sol.t, sol.y[0], label='x(t)')
plt.title('ODE Solution')
plt.xlabel('Time (t)')
plt.ylabel('State (x)')
plt.legend()
plt.show()
SciPy installation (if necessary)
pip install scipy