PX4 Rover: Wheels don’t move in OFFBOARD

Hi all,

I’m trying to drive a PX4 rover in OFFBOARD (velocity) using ROS 2. QGC shows OFFBOARD and the vehicle arms, but the wheels don’t spin. In MANUAL the wheels work fine.

Setup

  • Platform: Rover (diff/ackermann) on PX4

  • Control: ROS 2 node publishing OffboardControlMode + TrajectorySetpoint (+ VehicleOdometry from my odometry)

  • Offboard rate: ~20 Hz

  • OffboardControlMode: velocity=true, others false

  • TrajectorySetpoint.velocity = [vN, vE, vD] in NED (I send vD = 0.0)

  • Heading: when turning I send yawspeed (and yaw = NaN); otherwise I lock yaw to current NED yaw.

Example TS seen on PX4:

position: [nan, nan, nan]
velocity: [0.001, 0.300, 0.000]  # NED: vN, vE, vD
yaw: 1.56
yawspeed: 0.0

# sometimes (planner requests turn-in-place)
velocity: [0.000, 0.000, 0.000]
yaw: nan
yawspeed: 0.50

What works / state checks

  • OFFBOARD is active: nav_state = 14

  • Control flags: flag_control_offboard_enabled = true, flag_control_velocity_enabled = true

  • Local position is valid: vehicle_local_position fields are *_valid = true, yaw_align = true

  • /trajectory_setpoint is present and updating

  • In MANUAL the wheels respond normally

What doesn’t work

  • In OFFBOARD, actuator outputs stay zero:

    • listener actuator_outputs → all 0

It looks like the rover controller/control-allocation path isn’t producing actuator commands even though OFFBOARD and velocity control are enabled and valid setpoints are streaming.

Things I’ve tried

  • Ensure velocity is NED ([vN, vE, vD]) and vD=0.0 for rover

  • Added a small minimum linear speed (0.15–0.30 m/s) to overcome static friction/deadband

  • Verified OffboardControlMode and kept setpoints >10 Hz

  • Provided VehicleOdometry (vision) to EKF; vehicle_local_position is valid

I can’t figure out what the problem is or what’s missing. What additional checklist should I go through?

@starbax Just having a glance I noticed the `trajectory_setpoint` message is used for multicopters and as far as I can see not supported by rovers.

Did you follow the rover API doumentation?
Please particularly check the rover setpoints documentation which is also linked on the other page.