Junhyeok Lee

Applies to v0.1.0.

Vehicle control · ROS 1

The control contract is identical to ROS 2: the same /cmd_vel, the same units, the same conversion. Only the client library differs.

The contract

  • linear.x — forward speed in m/s, clamped at the car's ceiling.
  • angular.z — yaw rate in rad/s, positive is left.
  • Publish above 2 Hz, or the 0.5 s watchdog stops the car.

The full explanation of why a fixed yaw rate loses steering authority at speed, and how /ego/cmd_applied reports what the car obeyed, is on the ROS 2 page. None of it is version specific.

Worked example

limits = read_vehicle_info()               # /ego/vehicle_info, JSON in a String
vmax   = limits["max_speed_ms"]

cmd = Twist()
cmd.linear.x  = max(-vmax, min(vmax, 0.4))
cmd.angular.z = cmd.linear.x * math.tan(math.radians(
    -1.0 * limits["max_steer_deg"])) / limits["wheelbase_m"]  # -1.0 here = full right (ROS: positive angular.z is LEFT)
pub.publish(cmd)

Clamp the speed first, then convert the steering with that same speed. The teleop example does exactly this.