ROS2 package that converts a geometry_msgs/msg/Twist command from /cmd_vel into left and right track speed commands in m/s.
This package is designed for differential-drive or tracked rovers. The configuration is loaded from a Xacro file.
- Subscribe to a
cmd_veltopic - Convert linear and angular velocity into left and right track speeds
- Publish left and right speed commands as
std_msgs/msg/Float32 - Configure all main parameters from a
.xacrofile - Support motor inversion
- Support left/right swap
- Support maximum track speed limitation
Default input topic:
/cmd_velMessage type:
geometry_msgs/msg/TwistUsed fields:
linear.x # forward/backward speed in m/s
angular.z # yaw rate in rad/sDefault output topics:
/left_wheel_speed
/right_wheel_speedMessage type:
std_msgs/msg/Float32The output values are track speeds in m/s.
For a tracked or differential-drive robot:
left_speed = linear.x - angular.z * track_width / 2
right_speed = linear.x + angular.z * track_width / 2Where:
track_width = distance between left and right tracks in meterscmd_vel_to_tracks/
├── cmd_vel_to_tracks/
│ ├── __init__.py
│ └── cmd_vel_to_tracks_node.py
├── config/
│ └── cmd_vel_to_tracks.xacro
├── launch/
│ └── cmd_vel_to_tracks.launch.py
├── resource/
│ └── cmd_vel_to_tracks
├── package.xml
├── setup.py
└── setup.cfgThe configuration is stored in:
config/cmd_vel_to_tracks.xacroExample:
<?xml version="1.0"?>
<config xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:property name="track_width" value="0.50"/>
<xacro:property name="cmd_vel_topic" value="/cmd_vel"/>
<xacro:property name="left_speed_topic" value="/left_wheel_speed"/>
<xacro:property name="right_speed_topic" value="/right_wheel_speed"/>
<xacro:property name="max_track_speed" value="2.0"/>
<xacro:property name="invert_left" value="false"/>
<xacro:property name="invert_right" value="false"/>
<xacro:property name="swap_left_right" value="false"/>
<cmd_vel_to_tracks
track_width="${track_width}"
cmd_vel_topic="${cmd_vel_topic}"
left_speed_topic="${left_speed_topic}"
right_speed_topic="${right_speed_topic}"
max_track_speed="${max_track_speed}"
invert_left="${invert_left}"
invert_right="${invert_right}"
swap_left_right="${swap_left_right}"
/>
</config>| Parameter | Description | Default |
|---|---|---|
track_width |
Distance between left and right tracks in meters | 0.50 |
cmd_vel_topic |
Input velocity command topic | /cmd_vel |
left_speed_topic |
Output topic for left track speed | /left_wheel_speed |
right_speed_topic |
Output topic for right track speed | /right_wheel_speed |
max_track_speed |
Maximum allowed track speed in m/s. Use 0.0 to disable limitation |
2.0 |
invert_left |
Invert left track command | false |
invert_right |
Invert right track command | false |
swap_left_right |
Swap left and right commands | false |
This package depends on:
rclpygeometry_msgsstd_msgsxacrolaunch_rosament_index_python
Install dependencies with:
sudo apt update
sudo apt install ros-$ROS_DISTRO-xacroFrom your ROS2 workspace:
cd ~/ros2_ws
colcon build --packages-select cmd_vel_to_tracks
source install/setup.bashLaunch the node:
ros2 launch cmd_vel_to_tracks cmd_vel_to_tracks.launch.pyYou should see the loaded configuration in the terminal:
cmd_vel_to_tracks_node started
track_width: 0.5 m
cmd_vel_topic: /cmd_vel
left_speed_topic: /left_wheel_speed
right_speed_topic: /right_wheel_speed
max_track_speed: 2.0 m/s
invert_left: False
invert_right: False
swap_left_right: FalsePublish a forward command:
ros2 topic pub -r 20 /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.1}, angular: {z: 0.0}}"Check the left output:
ros2 topic echo /left_wheel_speedCheck the right output:
ros2 topic echo /right_wheel_speedExpected output:
data: 0.1on both topics.
Publish a rotation command:
ros2 topic pub -r 20 /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.0}, angular: {z: 0.5}}"With:
<xacro:property name="track_width" value="0.50"/>The expected speeds are:
left_speed = -0.125 m/s
right_speed = 0.125 m/sThe node publishes at the same rate as the input /cmd_vel topic.
Example:
/cmd_vel at 20 Hz -> left and right outputs at 20 Hz
/cmd_vel at 50 Hz -> left and right outputs at 50 HzYou can check the rate with:
ros2 topic hz /cmd_vel
ros2 topic hz /left_wheel_speed
ros2 topic hz /right_wheel_speedFor motor control, a command rate of 20 Hz or higher is recommended.
This package can be used before a motor controller node.
Example architecture:
Nav2 / joystick / controller
↓
/cmd_vel
↓
cmd_vel_to_tracks
↓
/left_wheel_speed /right_wheel_speed
↓ ↓
left VESC node right VESC nodeThis package does not control motors directly. It only converts a robot velocity command into left and right track speed commands.
The motor controller node is responsible for converting the output speed commands into motor commands such as duty cycle, RPM, ERPM, current, or UART commands.
MIT