Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

cmd_vel_to_tracks

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.

Features

  • Subscribe to a cmd_vel topic
  • 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 .xacro file
  • Support motor inversion
  • Support left/right swap
  • Support maximum track speed limitation

Input

Default input topic:

/cmd_vel

Message type:

geometry_msgs/msg/Twist

Used fields:

linear.x   # forward/backward speed in m/s
angular.z  # yaw rate in rad/s

Outputs

Default output topics:

/left_wheel_speed
/right_wheel_speed

Message type:

std_msgs/msg/Float32

The output values are track speeds in m/s.

Conversion formula

For a tracked or differential-drive robot:

left_speed  = linear.x - angular.z * track_width / 2
right_speed = linear.x + angular.z * track_width / 2

Where:

track_width = distance between left and right tracks in meters

Package structure

cmd_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.cfg

Configuration

The configuration is stored in:

config/cmd_vel_to_tracks.xacro

Example:

<?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>

Parameters

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

Dependencies

This package depends on:

  • rclpy
  • geometry_msgs
  • std_msgs
  • xacro
  • launch_ros
  • ament_index_python

Install dependencies with:

sudo apt update
sudo apt install ros-$ROS_DISTRO-xacro

Build

From your ROS2 workspace:

cd ~/ros2_ws
colcon build --packages-select cmd_vel_to_tracks
source install/setup.bash

Run

Launch the node:

ros2 launch cmd_vel_to_tracks cmd_vel_to_tracks.launch.py

You 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: False

Test

Publish 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_speed

Check the right output:

ros2 topic echo /right_wheel_speed

Expected output:

data: 0.1

on both topics.

Rotation test

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/s

Publishing rate

The 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 Hz

You can check the rate with:

ros2 topic hz /cmd_vel
ros2 topic hz /left_wheel_speed
ros2 topic hz /right_wheel_speed

For motor control, a command rate of 20 Hz or higher is recommended.

Example use with a VESC control node

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 node

Notes

This 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.

License

MIT

About

ROS2 node that converts a Twist cmd_vel command into left and right track speed commands for a differential-drive.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages