I wanted to share the progress I’ve made on the code my four wheel independent steering robot, zinger. The goal for this robot is to experiment with this drive system which allows movement in both forward and sideways directions as well as rotations. In the end I would like to create a robot that is able to navigate rough outdoor terrain.
So far I’ve written a controller that handles the coordination of the drive module steering angles and the wheel velocities for a given body motion (x-velocity vx, y-velocity vy and rotation w).
The transition between the current state and the desired state is handled by one of three motion profiles (linear, trapezoidal or s-curve) and the controller ensures that the drive modules are synchronized at all times during the transition.
Commands from the controller to the drive modules are send using the ROS2 control system. Using the JointGroupPositionController for the steering angles and the JointGroupVelocityController for the wheel velocities.
SLAM is done using the SLAM toolbox and a standard 2D LIDAR unit. And navigation is done using the Nav2 framework. The SMAC lattice planner is used for the global planning and the MPPI controller is used for the local paths. With the right setup this combination allows for omnidirectional movements.
The following video shows the robot navigating from one room in a complex to another room through a series of doorways. The robot is using all its directional capabilities during this movement.
The ROS2 packages can be found here:
- GitHub - pvandervelde/zinger_description: The ROS description for the zinger robot
- GitHub - pvandervelde/zinger_ignition: Contains the Gazebo worlds for the zinger robot
- GitHub - pvandervelde/zinger_swerve_controller: The swerve controller code for the zinger robot
- GitHub - pvandervelde/zinger_nav: Defines the ROS2 Nav setup for the zinger 4 wheel steering robot
Would love to hear suggestions for improvements or any other kind of comments.