Motion Control
Motion control is all about making the robot move. This is done by creating a reference for the desired motion, given in the robot local coordinates. Typically, a linear and angular velocity. The forward kinematics then transforms these references to the required wheel velocity references. The wheel velocity references are sent to the controller board, which actuates the wheels. The actual wheel velocities are found using wheel encoders. This data is available from the controller board, and is sent to the mechanical odometry.
The figure below illustrates how this is implemented in ROS 2.
Figure: Motion control communication diagram.
Motion Reference
The motion references for the uiabot is linear and angular velocities, given in the local coordinate frame. Generating these references are done by publishing the desired linear and angular velocity in a geometry_msgs/Twist message to the /cmd_vel
topic.
The figure above shows this by using the built-in teleop_twist_keyboard
node, that converts keyboard input to linear and angular velocity. Another solution would be to create a node that generates a trajectory and publishes a geometry_msgs/Twist message to the /cmd_vel
topic.
Note
Command to run the teleop_twist_keyboard
node:
ros2 run teleop_twist_keyboard teleop_twist_keyboard
Inverse Kinematics
To transform the linear and angular velocity references to wheel amgular velocity references we need the inverse kinematics of the robot. The following figure defines the robot local coordinate system, and positive linear wheel velocites.
Figure: Robot definition.
Each wheel has the linear velocities \(\dot{x_r}\) and \(\dot{x_l}\), corresponding to right and left wheels, respectively. As shown in the figure below, the wheel angular velocity is denoted by \(\dot{\phi}\), and wheel radius by \(r\).
Figure: Wheel definition.
The linear velocities for the wheels can be written as.
Assuming no lateral movement, the wheels must follow a circle, which yields the following equations for the right (4) and left wheel (5).
The inverse kinematics can then be written in matrix form as.
The inverse kinematics of the robot is implemented in the control node.
Note
Command to run the control
node:
ros2 run uiabot control
Forward Kinematics
The forward kinematics is used to transform wheel angular velocities, \(\dot{\phi}_r\) and \(\dot{\phi}_l\), to robot angular and linear velocities, \(\dot{x}\) and \(\dot{\theta}\), given in the local coordinate frame. Based on equation (8) from the inverse kinematics, we can solve for \(\dot{x}\) and \(\dot{\theta}\). Which gives the following equation.
The forward kinematics of the robot is implemented in the mechanical_odometry node.
Note
Command to run the mechanical_odometry
node:
ros2 run uiabot mechanical_odometry
Motor Controller
On the uiabot, the motors are driven by a ODrive controller board, which is connected to the Jetson Nano through USB. To make the ODrive available on the ROS 2 network, an interface node is created: odrive-ros2. This node makes it possible to publish velocity references to each wheel.
Note
Command to run the odrive_ros2
node:
ros2 run odrive_ros2 odrive_ros2