Skip to main content

Published ROS 2 Topics

The MAVLink Bridge Node reads binary MAVLink frames from the agent’s IPC socket and publishes them as standard ROS 2 topics. All topic names and message types are compatible with the mavros naming convention, so existing ROS tooling and packages work out of the box.

Topic reference

ROS TopicMessage TypeSourceRateQoS
/mavros/imu/datasensor_msgs/ImuATTITUDE + SCALED_IMU250 HzBest-effort
/mavros/local_position/posegeometry_msgs/PoseStampedLOCAL_POSITION_NED10-30 HzBest-effort
/mavros/global_position/globalsensor_msgs/NavSatFixGLOBAL_POSITION_INT5-10 HzReliable
/mavros/global_position/localnav_msgs/OdometryGLOBAL_POSITION_INT5-10 HzBest-effort
/mavros/vfr_hudgeometry_msgs/TwistStampedVFR_HUD5 HzBest-effort
/mavros/batterysensor_msgs/BatteryStateBATTERY_STATUS1-2 HzReliable
/mavros/statestd_msgs/StringHEARTBEAT1 HzReliable, transient-local
/mavros/rangefinder/rangefindersensor_msgs/RangeRANGEFINDER10-20 HzBest-effort
/mavros/statustext/recvstd_msgs/StringSTATUSTEXTEvent-drivenReliable, transient-local
/mavros/param/param_valuestd_msgs/StringPARAM_VALUEEvent-drivenReliable
/mavros/bridge/healthdiagnostic_msgs/DiagnosticStatusBridge internal1 HzReliable

Camera topics

When the camera node is running (VIO or Mapping profile), two additional topics are published:
ROS TopicMessage TypeRateNotes
/camera/image_rawsensor_msgs/Image30 HzBGR8 encoding, USB UVC camera
/camera/camera_infosensor_msgs/CameraInfo30 HzIntrinsics from calibration file if present

IMU merge behavior

The bridge merges two separate MAVLink messages into a single /mavros/imu/data message:
  • ATTITUDE provides orientation (roll, pitch, yaw as quaternion) and angular velocities
  • SCALED_IMU2 provides linear accelerations (converted from milliG to m/s^2)
If the flight controller sends ATTITUDE but not SCALED_IMU2 (some older firmware), the bridge still publishes IMU data but sets linear_acceleration_covariance[0] = -1.0. This is the ROS convention for “this data is not available.” Downstream nodes should check for this before using acceleration values.

Velocity setpoints (reverse direction)

The bridge also subscribes to one topic for sending commands back to the flight controller:
ROS TopicMessage TypeDirectionNotes
/mavros/setpoint_velocity/cmd_velgeometry_msgs/TwistStampedROS to FCRate-limited to 20 Hz
When you publish a velocity command, the bridge encodes it as a MAVLink SET_POSITION_TARGET_LOCAL_NED message and writes it back to the IPC socket. The coordinate conversion (ROS ENU to MAVLink NED) is handled automatically.

TF tree

The bridge broadcasts a single TF transform:
map -> base_link
The transform uses the orientation from the ATTITUDE message. Position data from LOCAL_POSITION_NED is published as a separate PoseStamped topic (not as a TF transform) because the NED-to-ENU frame conversion depends on your specific use case.

Health diagnostics

The /mavros/bridge/health topic publishes a DiagnosticStatus message every second with:
KeyTypeDescription
ipc_connectedboolWhether the bridge is connected to the agent’s MAVLink socket
ipc_reconnectsintNumber of reconnection attempts since startup
decode_errorsintMAVLink frames that failed to parse
publisher_dropsintMessages dropped due to queue overflow
armedboolWhether the flight controller is armed
modestringCurrent flight mode (e.g., “STABILIZE”, “GUIDED”)
boot_offset_msintEstimated offset between FC boot clock and system clock

Timestamp modes

The bridge supports two timestamp modes, controlled by a ROS parameter: receive_time (default): Stamps messages with the current ROS clock time when they arrive. Good for logging and general visualization. Introduces 1-5 ms of jitter. source_time: Stamps messages using the flight controller’s boot clock, corrected with a median-filter epoch offset. Necessary for VIO and sensor fusion where camera and IMU timestamps need tight alignment.
# Switch to source_time for VIO work
ros2 launch ados_mavlink_bridge bridge.launch.py timestamp_mode:=source_time