Bird
Raised Fist0
ROSframework~10 mins

cmd_vel topic for velocity commands in ROS - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - cmd_vel topic for velocity commands
Robot Node Subscribes to cmd_vel
Receive Velocity Message
Extract Linear and Angular Velocities
Send Commands to Robot Motors
Robot Moves Accordingly
Loop: Wait for Next cmd_vel Message
The robot listens to the cmd_vel topic, receives velocity commands, extracts linear and angular speeds, and moves accordingly.
Execution Sample
ROS
rostopic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.1}}'
This command sends a velocity message to move the robot forward at 0.5 m/s and rotate at 0.1 rad/s.
Execution Table
StepActionMessage ReceivedLinear Velocity (m/s)Angular Velocity (rad/s)Robot Movement
1Subscribe to /cmd_velNo message yet0.00.0Robot stationary
2Receive message{linear: x=0.5, y=0.0, z=0.0; angular: x=0.0, y=0.0, z=0.1}0.50.1Robot moves forward and turns slowly
3Receive message{linear: x=0.0, y=0.0, z=0.0; angular: x=0.0, y=0.0, z=0.0}0.00.0Robot stops
4Receive message{linear: x=-0.3, y=0.0, z=0.0; angular: x=0.0, y=0.0, z=-0.2}-0.3-0.2Robot moves backward and turns right
5No new messageNo new message0.00.0Robot maintains last command or stops if timeout
💡 No new messages or node shutdown stops robot movement
Variable Tracker
VariableStartAfter Step 2After Step 3After Step 4After Step 5
linear_velocity_x0.00.50.0-0.30.0
angular_velocity_z0.00.10.0-0.20.0
robot_statestationarymoving forward + turning leftstoppedmoving backward + turning rightstopped or last command
Key Moments - 3 Insights
Why does the robot stop when linear and angular velocities are zero?
Because the cmd_vel message with zero velocities tells the robot to stop moving, as shown in execution_table step 3.
What happens if no new cmd_vel messages arrive?
The robot either keeps the last velocity command or stops after a timeout, as shown in execution_table step 5.
Why are linear velocities only in x and angular only in z?
Because typical mobile robots move forward/backward (x) and rotate around vertical axis (z), matching the cmd_vel message fields.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at step 2, what is the linear velocity x value?
A0.5
B0.0
C-0.3
D0.1
💡 Hint
Check the 'Linear Velocity (m/s)' column at step 2 in execution_table.
At which step does the robot receive a command to move backward?
AStep 2
BStep 4
CStep 3
DStep 5
💡 Hint
Look for negative linear velocity x in execution_table.
If the angular velocity z was changed to 0.0 at step 2, what would happen?
ARobot would turn left faster
BRobot would stop
CRobot would move forward without turning
DRobot would move backward
💡 Hint
Refer to angular velocity z value and robot movement in execution_table step 2.
Concept Snapshot
cmd_vel topic sends velocity commands as geometry_msgs/Twist messages.
Linear velocities control forward/backward movement.
Angular velocities control rotation around vertical axis.
Robot nodes subscribe to cmd_vel and move accordingly.
Zero velocities stop the robot.
Continuous messages keep robot moving smoothly.
Full Transcript
The cmd_vel topic in ROS is used to send velocity commands to a robot. The robot node subscribes to this topic and listens for messages of type geometry_msgs/Twist. Each message contains linear and angular velocity components. When a message arrives, the robot extracts the linear x velocity to move forward or backward, and the angular z velocity to rotate left or right. If both velocities are zero, the robot stops. If no new messages arrive, the robot may keep the last command or stop after a timeout. This flow repeats continuously to control the robot's movement in real time.

Practice

(1/5)
1. What is the main purpose of the /cmd_vel topic in ROS?
easy
A. To configure robot hardware settings
B. To receive sensor data from the robot
C. To send velocity commands to control robot movement
D. To log robot status messages

Solution

  1. Step 1: Understand the role of /cmd_vel topic

    The /cmd_vel topic is used to send velocity commands to the robot.
  2. Step 2: Identify what velocity commands control

    Velocity commands control the robot's movement, including linear and angular velocities.
  3. Final Answer:

    To send velocity commands to control robot movement -> Option C
  4. Quick Check:

    /cmd_vel controls robot movement = A [OK]
Hint: Remember: cmd_vel means command velocity for robot movement [OK]
Common Mistakes:
  • Confusing cmd_vel with sensor data topics
  • Thinking cmd_vel configures hardware
  • Assuming cmd_vel logs messages
2. Which message type is published on the /cmd_vel topic to control robot velocity?
easy
A. geometry_msgs/Twist
B. std_msgs/String
C. sensor_msgs/LaserScan
D. nav_msgs/Odometry

Solution

  1. Step 1: Identify the message type for velocity commands

    The /cmd_vel topic uses geometry_msgs/Twist messages to send velocity commands.
  2. Step 2: Confirm other message types are unrelated

    sensor_msgs/LaserScan is for laser data, std_msgs/String is generic text, and nav_msgs/Odometry is for position data.
  3. Final Answer:

    geometry_msgs/Twist -> Option A
  4. Quick Check:

    Velocity commands use Twist messages = C [OK]
Hint: Twist means linear + angular velocity message [OK]
Common Mistakes:
  • Choosing sensor or odometry messages instead of Twist
  • Confusing std_msgs/String as velocity message
3. Given this Python ROS publisher code snippet, what linear x velocity will the robot move at?
import rospy
from geometry_msgs.msg import Twist

rospy.init_node('move_robot')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
msg = Twist()
msg.linear.x = 0.5
msg.angular.z = 0.0
pub.publish(msg)
medium
A. 0.0 m/s
B. Undefined velocity
C. 1.0 m/s
D. 0.5 m/s

Solution

  1. Step 1: Check the linear velocity set in the message

    The code sets msg.linear.x = 0.5, which means forward velocity is 0.5 meters per second.
  2. Step 2: Confirm angular velocity does not affect linear speed

    msg.angular.z = 0.0 means no rotation, so linear speed remains 0.5 m/s.
  3. Final Answer:

    0.5 m/s -> Option D
  4. Quick Check:

    linear.x = 0.5 means speed 0.5 m/s [OK]
Hint: Look for msg.linear.x value for forward speed [OK]
Common Mistakes:
  • Confusing angular.z with linear.x velocity
  • Assuming default velocity if not set
  • Ignoring the published message values
4. What is wrong with this ROS Python code snippet that publishes velocity commands?
import rospy
from geometry_msgs.msg import Twist

rospy.init_node('move_robot')
pub = rospy.Publisher('/cmd_vel', Twist)
msg = Twist()
msg.linear.x = 1.0
pub.publish(msg)
medium
A. Twist message fields are incorrectly assigned
B. Missing queue_size parameter in Publisher initialization
C. Node initialization is missing
D. Publisher topic name is incorrect

Solution

  1. Step 1: Check Publisher initialization parameters

    The rospy.Publisher requires a queue_size parameter to avoid runtime warnings or errors.
  2. Step 2: Verify other parts of the code

    Node initialization is present, message fields are correctly assigned, and topic name /cmd_vel is correct.
  3. Final Answer:

    Missing queue_size parameter in Publisher initialization -> Option B
  4. Quick Check:

    Publisher needs queue_size argument = A [OK]
Hint: Always add queue_size when creating a Publisher [OK]
Common Mistakes:
  • Omitting queue_size causes errors
  • Thinking node initialization is missing
  • Assuming topic name is wrong
5. You want your robot to move forward at 0.3 m/s and rotate at 0.5 rad/s simultaneously using /cmd_vel. Which code snippet correctly publishes this combined velocity command in Python?
hard
A. msg.linear.x = 0.3 msg.angular.z = 0.5 pub.publish(msg)
B. msg.linear.y = 0.3 msg.angular.x = 0.5 pub.publish(msg)
C. msg.linear.x = 0.5 msg.angular.z = 0.3 pub.publish(msg)
D. msg.linear.z = 0.3 msg.angular.y = 0.5 pub.publish(msg)

Solution

  1. Step 1: Identify correct fields for forward and rotational velocity

    Forward movement uses linear.x, and rotation uses angular.z in geometry_msgs/Twist.
  2. Step 2: Match values to correct fields

    Set linear.x = 0.3 for forward speed and angular.z = 0.5 for rotation speed.
  3. Step 3: Verify other options use incorrect axes

    Options A, B, and C assign values to wrong axes or swap linear and angular values.
  4. Final Answer:

    msg.linear.x = 0.3 msg.angular.z = 0.5 pub.publish(msg) -> Option A
  5. Quick Check:

    Forward = linear.x, rotate = angular.z = D [OK]
Hint: Forward speed = linear.x, rotation = angular.z [OK]
Common Mistakes:
  • Using wrong linear or angular axes
  • Swapping linear and angular values
  • Setting velocities on unused axes