MAVROS 使用说明

本文说明本项目将 DJI PSDK 能力转换为 MAVLink 后,在 MAVROS 中通常如何查看、控制和理解这些数据。

  • PSDK 侧输出的 MAVLink 数据在 MAVROS 中对应哪些 topic 或服务。
  • MAVROS 可以通过哪些入口发送位置、速度、姿态、航点、相机和录像相关命令。
  • 哪些能力已经在当前项目代码中有对应的 MAVLink 处理。
  • 哪些 topic 名称可能受 MAVROS 版本、插件配置和命名空间影响。

1. 系统链路

当前项目的典型链路如下:

DJI PSDK / M4TD
  -> 项目内 MAVLink 转换模块
  -> UDP 14550
  -> MAVROS
  -> ROS2 topic / service

如果 PSDK 程序和 MAVROS 都运行在妙算 3 本机,常见配置为:

PSDK MAVLink 目标:127.0.0.1:14550
MAVROS 监听地址:udp://:14550@

如果 MAVROS 运行在另一台设备上,PSDK 目标地址不能使用 127.0.0.1,应改为 MAVROS 所在设备的实际 IP。

2. MAVROS 启动示例

ros2 run mavros mavros_node \
  --ros-args \
  -r __ns:=/mavros \
  -p "fcu_url:=udp://:14550@" \
  -p "target_system_id:=3" \
  -p "target_component_id:=1" \
  -p "fcu_protocol:=v2.0"

参数说明:

参数 说明
fcu_url MAVROS 监听 MAVLink UDP 数据的地址。
target_system_id MAVROS 期望通信的飞行器 system id,应与项目 mavlink_config.json 中的 system id 保持一致。
target_component_id MAVROS 期望通信的飞控 component id,通常为 1
fcu_protocol 使用 MAVLink 2.0。

如果项目中修改了 system_idcomponent_id 或 camera component id,MAVROS 和其它地面站也应按相同 ID 配置或识别。

3. 快速查看方式

建议优先查看与功能直接相关的 topic,而不是只依赖完整的 ros2 topic list

ros2 topic echo /mavros/state
ros2 topic echo /mavros/imu/data
ros2 topic echo /mavros/global_position/global
ros2 topic echo /mavros/local_position/pose
ros2 topic echo /mavros/battery
ros2 topic echo /mavros/rc/in

按类别查找扩展 topic:

ros2 topic list | grep -E "setpoint|local_position|global_position|imu|battery|rc"
ros2 topic list | grep -E "camera|image|video|storage|mount|gimbal"
ros2 topic list | grep -E "mission|home|geofence|fence"
ros2 topic list | grep -E "distance|range|obstacle"
ros2 topic list | grep -E "debug|statustext|param"

不同 MAVROS 版本和插件配置会导致 topic 名称略有差异。文档中的 topic 名称以常见 MAVROS 命名为准,现场应以实际 ros2 topic list 输出为准。

4. 飞行器状态与遥测显示

PSDK / MAVLink 能力 项目 MAVLink 消息 MAVROS 常见显示 说明
链路与飞行模式 HEARTBEAT /mavros/state 显示连接状态、模式、解锁状态、system status。
扩展飞行状态 EXTENDED_SYS_STATE /mavros/extended_state 显示 landed state、VTOL state 等扩展状态。
系统健康与电源 SYS_STATUS /mavros/sys_status 部分 MAVROS 版本或配置中可见。
文本提示 STATUSTEXT /mavros/statustext/recv 显示项目主动发送的状态、提示、错误文本。
系统时间 SYSTEM_TIMETIMESYNC 时间同步相关 topic 或内部使用 用于 MAVROS 时间同步和消息时间参考。
飞控能力 AUTOPILOT_VERSIONPROTOCOL_VERSION 能力协商相关 MAVROS 或地面站请求能力时使用。

5. 姿态、IMU、本地位置

PSDK / MAVLink 能力 项目 MAVLink 消息 MAVROS 常见显示 说明
四元数姿态 ATTITUDE_QUATERNION /mavros/imu/data 飞行器姿态主显示来源。
欧拉角姿态 ATTITUDE /mavros/imu/data 或姿态相关输出 作为姿态显示补充。
原始 IMU SCALED_IMU /mavros/imu/data_raw/mavros/imu/mag 加速度、角速度、磁力计相关数据。
高精度 IMU HIGHRES_IMU /mavros/imu/data_raw 或 IMU 相关输出 当前项目代码中已有发送。
本地位置 LOCAL_POSITION_NED /mavros/local_position/pose 本地 NED 位置会被 MAVROS 转成 ROS 坐标显示。
本地速度 LOCAL_POSITION_NED /mavros/local_position/velocity_local 本地速度显示。
里程计 ODOMETRY /mavros/odometry/out 或 odometry 相关 topic 项目中使用 LOCAL_NED / BODY_FRD 语义发送。
高度 ALTITUDE /mavros/altitude 气压高度、相对高度、融合高度等。
飞行综合信息 VFR_HUD /mavros/vfr_hud 高度、地速、航向、爬升率等综合显示。

6. GPS、全局位置与 Home 点

PSDK / MAVLink 能力 项目 MAVLink 消息 MAVROS 常见显示 说明
原始 GPS GPS_RAW_INT /mavros/global_position/raw/fix 定位类型、经纬度、高度、卫星数、精度信息。
第二路 GPS GPS2_RAW GPS2 相关 topic 是否显示取决于 MAVROS 版本和插件。
全局位置 GLOBAL_POSITION_INT /mavros/global_position/global 经纬度、高度、相对高度、速度。
相对高度 GLOBAL_POSITION_INT /mavros/global_position/rel_alt 相对起飞点或 Home 点高度。
航向 GLOBAL_POSITION_INT /mavros/global_position/compass_hdg 指南针航向显示。
GPS 原点 GPS_GLOBAL_ORIGIN /mavros/global_position/gp_origin 全局坐标原点。
Home 点 HOME_POSITION /mavros/home_position/home 返航点或 Home 点位置。
RTK 信息 GPS_RTKGPS2_RTK RTK/GPS 相关输出 当前项目已有 RTK 相关 MAVLink 发送,MAVROS 显示取决于版本支持。

7. 电池、遥控器、动力与避障

PSDK / MAVLink 能力 项目 MAVLink 消息 MAVROS 常见显示 说明
电池状态 BATTERY_STATUS /mavros/battery 电压、电流、剩余电量、电池健康状态。
遥控器通道 RC_CHANNELS /mavros/rc/in 项目已将 DJI RC 订阅转换为标准 MAVLink RC 通道。
遥控覆盖输入 RC_CHANNELS_OVERRIDE MAVROS RC override 相关入口 项目代码可接收该消息并保存覆盖通道。
手动控制输入 MANUAL_CONTROL MAVROS manual control 相关服务或 topic 项目代码有队列处理,适合低频手动控制类输入。
执行器目标 ACTUATOR_CONTROL_TARGET actuator/setpoint 相关输出 项目中有处理和回显逻辑。
电调信息 ESC_INFOESC_STATUS /mavros/esc_info/mavros/esc_status 或相关 topic 是否显示取决于 MAVROS 插件。
舵机/PWM 输出 SERVO_OUTPUT_RAW /mavros/servo_output_raw 用于显示输出通道。
距离传感器 DISTANCE_SENSOR /mavros/distance_sensor/* 需要 MAVROS distance_sensor 插件配置。
障碍物距离 OBSTACLE_DISTANCE obstacle/distance 相关输出 项目已补充该消息,用于集中表达环向障碍距离。

如果 MAVROS 日志出现:

DS: Plugin not configured!

表示 MAVLink 距离类消息可能已经进入 MAVROS,但 MAVROS 的 distance_sensor 插件尚未配置,因此不会按预期发布距离 topic。

8. MAVROS 位置、速度和姿态控制

本项目不仅输出遥测,也接收 MAVROS 发送的控制 setpoint。代码中已经处理以下 MAVLink 输入:

MAVROS 控制入口 MAVLink 输入消息 项目处理 说明
/mavros/setpoint_raw/local SET_POSITION_TARGET_LOCAL_NED 解码后保存为 MavrosSetpointRawLocal 支持本地 NED 位置、速度、加速度、yaw、yaw_rate setpoint。
/mavros/setpoint_raw/global SET_POSITION_TARGET_GLOBAL_INT 解码后保存为 MavrosSetpointRawGlobal 支持全球经纬度目标、高度、速度、加速度、yaw、yaw_rate setpoint。
/mavros/setpoint_raw/attitude SET_ATTITUDE_TARGET 解码后保存为 MavrosSetpointRawAttitude 支持姿态四元数、角速度、thrust 等目标,执行能力受 DJI 飞控控制接口限制。
manual control 相关入口 MANUAL_CONTROL 进入异步队列处理 用于手动控制类输入。
RC override 相关入口 RC_CHANNELS_OVERRIDE 解码并保存 RC override 通道 用于通道覆盖类输入。

项目也会将收到的 setpoint 进行 MAVLink 回显:

回显消息 MAVROS 常见显示 说明
POSITION_TARGET_LOCAL_NED /mavros/setpoint_raw/target_local 本地位置/速度目标回显。
POSITION_TARGET_GLOBAL_INT /mavros/setpoint_raw/target_global 全球位置/速度目标回显。
ATTITUDE_TARGET /mavros/setpoint_raw/target_attitude 姿态目标回显。

8.1 使用条件

位置、速度和姿态 setpoint 类控制通常需要满足以下条件:

  • 飞行器已进入项目支持的外部控制或 Offboard 类模式。
  • MAVROS 持续发布 setpoint,频率不能过低。
  • 项目内 setpoint rate checker 认为输入有效。
  • 飞行器当前状态允许 PSDK 控制,例如未处于飞控接管的返航、低电量降落、失控保护等状态。
  • 若启用地理围栏或安全区域判断,目标点需要位于允许区域内。

8.2 本地速度控制示例

MAVROS ROS2 中常见消息类型为 mavros_msgs/msg/PositionTarget。下面示例表达“只控制本地 NED 速度,不控制位置和加速度”:

ros2 topic pub /mavros/setpoint_raw/local mavros_msgs/msg/PositionTarget "{
  header: {frame_id: 'map'},
  coordinate_frame: 1,
  type_mask: 3527,
  velocity: {x: 1.0, y: 0.0, z: 0.0},
  yaw_rate: 0.0
}"

说明:

  • coordinate_frame: 1 常见含义为 FRAME_LOCAL_NED
  • type_mask 用于指定忽略哪些字段。不同控制需求应按 MAVROS/MAVLink 常量组合。
  • NED 坐标中 z 方向向下,使用时要注意与 ROS ENU 坐标的方向差异。

8.3 本地位置控制示例

ros2 topic pub /mavros/setpoint_raw/local mavros_msgs/msg/PositionTarget "{
  header: {frame_id: 'map'},
  coordinate_frame: 1,
  type_mask: 3576,
  position: {x: 2.0, y: 0.0, z: -1.5},
  yaw: 0.0
}"

说明:

  • 示例表达本地 NED 目标位置。
  • z: -1.5 表示相对本地坐标向上 1.5 m。
  • 实际飞行速度、加减速和到点行为由项目飞控控制逻辑和 DJI 飞控接口共同决定。

8.4 全球位置控制

全球位置控制通过 /mavros/setpoint_raw/global 进入,MAVLink 对应 SET_POSITION_TARGET_GLOBAL_INT。常见用途是按经纬度和高度发送目标点。

MAVROS 常见消息类型为 mavros_msgs/msg/GlobalPositionTarget,字段包括:

  • latitude
  • longitude
  • altitude
  • velocity
  • acceleration_or_force
  • yaw
  • yaw_rate
  • type_mask
  • coordinate_frame

项目接收后会保存为 global setpoint,并可回显到 /mavros/setpoint_raw/target_global

8.5 姿态目标控制

姿态目标通过 /mavros/setpoint_raw/attitude 进入,MAVLink 对应 SET_ATTITUDE_TARGET。项目代码中已有解码、缓存、频率检测和目标回显。

需要注意:

  • DJI 飞控可开放的姿态控制能力和 PX4 Offboard 不完全一致。
  • 当前项目中更建议优先使用位置/速度 setpoint 做无人机移动控制。
  • 姿态目标适合做高级控制接口预留或特定场景调试,使用前需要确认飞行模式和安全条件。

9. 起飞、降落、返航、任务与模式

MAVROS 可通过 command 或 mode 相关服务发送标准 MAVLink 命令。项目代码中已处理多种常用命令:

MAVROS 常见入口 MAVLink 命令 项目行为
/mavros/cmd/takeoff/mavros/cmd/command MAV_CMD_NAV_TAKEOFF 执行起飞逻辑并返回 COMMAND_ACK
/mavros/cmd/land/mavros/cmd/command MAV_CMD_NAV_LAND 执行降落逻辑。
/mavros/cmd/arming MAV_CMD_COMPONENT_ARM_DISARM 执行解锁/上锁逻辑,任务模式下会限制部分操作。
/mavros/set_mode 或 command long MAV_CMD_DO_SET_MODE / SET_MODE 切换项目内部兼容模式。
/mavros/cmd/command MAV_CMD_NAV_RETURN_TO_LAUNCH 执行返航逻辑。
mission 相关服务 MISSION_COUNTMISSION_ITEM_INTMISSION_ACKMAV_CMD_MISSION_START 航点任务上传、确认和启动。
home position 相关服务 MAV_CMD_DO_SET_HOMEMAV_CMD_GET_HOME_POSITIONSET_HOME_POSITION 设置或请求 Home 点。
reposition MAV_CMD_DO_REPOSITION 项目代码中已有处理。
orbit MAV_CMD_DO_ORBIT 项目代码中已有处理。

任务状态输出:

项目 MAVLink 消息 MAVROS 常见显示 说明
MISSION_CURRENT mission 相关 topic 当前任务航点或任务进度。
MISSION_ITEM_REACHED /mavros/mission/reached 航点到达事件。
NAV_CONTROLLER_OUTPUT nav controller 相关 topic 导航控制输出,具体显示取决于 MAVROS 版本。

10. 云台、相机、拍照、录像与视频

当前项目代码中已经处理了多类相机和云台 MAVLink 能力。

10.1 云台控制与状态

MAVROS 常见入口或显示 MAVLink 消息/命令 项目行为
mount control 相关服务/topic MAV_CMD_DO_MOUNT_CONFIGURE 配置云台工作模式。
mount control 相关服务/topic MAV_CMD_DO_MOUNT_CONTROL 控制云台角度。
gimbal manager 相关服务/topic MAV_CMD_DO_GIMBAL_MANAGER_PITCHYAW 控制云台 pitch/yaw。
gimbal 状态相关 topic MOUNT_ORIENTATION 输出云台姿态角。
gimbal manager 状态相关 topic GIMBAL_MANAGER_INFORMATIONGIMBAL_MANAGER_STATUS 输出云台管理能力和状态。
gimbal device 状态相关 topic GIMBAL_DEVICE_ATTITUDE_STATUS 输出云台设备姿态状态。

10.2 相机信息与状态

项目 MAVLink 消息 MAVROS 常见显示 说明
CAMERA_INFORMATION camera information 相关 topic 或服务响应 相机基础信息。
CAMERA_SETTINGS camera settings 相关 topic 相机模式、变焦等设置状态。
CAMERA_CAPTURE_STATUS camera capture/status 相关 topic 拍照、录像状态。
STORAGE_INFORMATION storage/camera 相关 topic 存储卡容量、剩余空间。
CAMERA_TRIGGER camera trigger 相关 topic 拍照触发事件。
CAMERA_IMAGE_CAPTURED /mavros/camera/image_captured 或 camera 相关 topic 拍照完成事件。
VIDEO_STREAM_INFORMATION video stream 相关 topic 或服务响应 视频流地址、编码、分辨率等元信息。

说明:

  • MAVROS 对 camera/video/storage topic 的支持依赖版本和插件配置。
  • 如果 topic 名称不同,请使用 ros2 topic list | grep -E "camera|image|video|storage" 查找实际名称。
  • VIDEO_STREAM_INFORMATION 只是视频流元信息,真正的 H264/RTP/UDP 视频流不一定通过 MAVROS 转发。

10.3 切换拍照和录像模式

项目已处理:

MAVROS 入口 MAVLink 命令 命令号 项目行为
/mavros/cmd/command MAV_CMD_SET_CAMERA_MODE 530 切换拍照/录像工作模式,并向相机 component 返回 COMMAND_ACK

MAV_CMD_SET_CAMERA_MODE 的关键参数:

参数 含义
param1 保留,通常为 0
param2 camera mode。常见为 image/photo 或 video mode,具体值按 MAVLink camera mode 定义。

10.4 拍照

项目已处理两类拍照命令:

MAVROS 入口 MAVLink 命令 命令号 项目行为
/mavros/cmd/command MAV_CMD_IMAGE_START_CAPTURE 2000 启动拍照,发送 COMMAND_ACK,并发送 CAMERA_TRIGGERCAMERA_CAPTURE_STATUSCAMERA_IMAGE_CAPTURED
/mavros/cmd/command MAV_CMD_DO_DIGICAM_CONTROL 203 兼容旧式拍照命令,触发单张拍照并返回 ACK。
/mavros/cmd/command MAV_CMD_DO_TRIGGER_CONTROL 2003 按触发参数执行拍照。

单张拍照示例:

ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{
  broadcast: false,
  command: 2000,
  confirmation: 0,
  param1: 0.0,
  param2: 0.0,
  param3: 1.0,
  param4: 1.0,
  param5: .nan,
  param6: .nan,
  param7: .nan
}"

说明:

  • param3: 1.0 表示拍 1 张。
  • param4 可作为 capture sequence number。
  • 命令成功后,可观察 camera capture/status、camera trigger、image captured 相关 topic。

10.5 开始录像与停止录像

项目已处理:

MAVROS 入口 MAVLink 命令 命令号 项目行为
/mavros/cmd/command MAV_CMD_VIDEO_START_CAPTURE 2500 切换/进入录像,开始录像,返回 ACK,并发送 CAMERA_CAPTURE_STATUS
/mavros/cmd/command MAV_CMD_VIDEO_STOP_CAPTURE 2501 停止录像,返回 ACK,并发送录像停止状态。

开始录像示例:

ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{
  broadcast: false,
  command: 2500,
  confirmation: 0,
  param1: 0.0,
  param2: 1.0,
  param3: .nan,
  param4: .nan,
  param5: .nan,
  param6: .nan,
  param7: .nan
}"

停止录像示例:

ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{
  broadcast: false,
  command: 2501,
  confirmation: 0,
  param1: 0.0,
  param2: .nan,
  param3: .nan,
  param4: .nan,
  param5: .nan,
  param6: .nan,
  param7: .nan
}"

10.6 请求相机状态消息

项目已处理 MAV_CMD_REQUEST_MESSAGE,可请求以下消息:

请求消息 MAVLink message id 项目响应
CAMERA_INFORMATION 259 发送相机基础信息。
CAMERA_SETTINGS 260 发送当前相机设置。
CAMERA_CAPTURE_STATUS 262 发送拍照/录像状态。
STORAGE_INFORMATION 261 发送存储状态。
VIDEO_STREAM_INFORMATION 269 发送视频流元信息。

请求示例:

ros2 service call /mavros/cmd/command mavros_msgs/srv/CommandLong "{
  broadcast: false,
  command: 512,
  confirmation: 0,
  param1: 262.0,
  param2: 0.0,
  param3: 0.0,
  param4: 0.0,
  param5: 0.0,
  param6: 0.0,
  param7: 0.0
}"

其中 command: 512MAV_CMD_REQUEST_MESSAGEparam1 为请求的 MAVLink message id。

11. 参数、日志、调试与扩展消息

PSDK / MAVLink 能力 项目 MAVLink 消息或命令 MAVROS 常见显示 说明
参数列表 PARAM_REQUEST_LISTPARAM_VALUE MAVROS parameter 相关服务 项目可向 MAVROS/QGC 返回参数。
单参数读写 PARAM_REQUEST_READPARAM_SETPARAM_VALUE MAVROS parameter 相关服务 参数是否可写取决于项目参数表。
日志列表/数据 LOG_ENTRYLOG_DATA log_transfer 相关服务或 topic 项目中有 log request 处理。
debug 数值 DEBUGDEBUG_VECTDEBUG_FLOAT_ARRAY debug_value 相关 topic 工程调试使用。
命名数值 NAMED_VALUE_FLOATNAMED_VALUE_INT debug_value 相关 topic 可用于补充业务状态显示。
串口控制 SERIAL_CONTROL serial_control 相关入口 项目中有收发处理。
自定义通道 TUNNEL tunnel 相关 topic 用于自定义数据通道。

面向客户说明时,建议优先使用标准 MAVROS topic 和服务表达功能;DEBUGNAMED_VALUE_* 更适合作为工程辅助信息。

12. 常见现象说明

12.1 /mavros/state 已连接,但某些 topic 不存在

可能原因:

  • MAVROS 对应插件未启用。
  • 当前 MAVROS 版本未发布该 topic。
  • 项目只在特定设备状态下发送该类 MAVLink 消息。
  • camera、gimbal、distance、video 等扩展 topic 名称与文档示例不同。

建议先按关键字搜索:

ros2 topic list | grep -E "camera|image|video|storage"
ros2 topic list | grep -E "mount|gimbal"
ros2 topic list | grep -E "distance|range|obstacle"
ros2 topic list | grep -E "setpoint|target"

12.2 setpoint 已发布,但无人机没有动作

可能原因:

  • 当前模式不是项目支持的 Offboard/外部控制模式。
  • setpoint 频率过低,被 rate checker 判定为无效。
  • 飞控处于返航、低电量降落、失控保护等安全接管状态。
  • 目标点不在允许区域内。
  • type_mask 配置不符合预期,导致位置或速度字段被忽略。
  • 坐标系理解错误,例如 ROS ENU 与 MAVLink NED 的方向差异。

12.3 相机命令有 ACK,但 MAVROS 中看不到相机 topic

可能原因:

  • MAVROS camera 插件或当前版本不发布对应 topic。
  • 相机状态只通过 COMMAND_ACKCAMERA_CAPTURE_STATUSCAMERA_IMAGE_CAPTURED 返回。
  • 需要主动发送 MAV_CMD_REQUEST_MESSAGE 请求某些状态消息。
  • 相机 component id 与 MAVROS/地面站识别的 component 不一致。

12.4 视频流与 MAVROS 的关系

VIDEO_STREAM_INFORMATION 可以通过 MAVLink/MAVROS 表达视频流元信息,但实际 H264/RTP/UDP 视频流通常直接由项目推送到指定 IP/端口,不一定经过 MAVROS topic。

如果 MAVROS 中能看到视频流信息,但播放器或 QGC 无画面,应检查:

  • 视频目标 IP 是否为接收端实际 IP。
  • UDP/RTP 端口是否一致。
  • 防火墙是否允许 UDP。
  • QGC 或播放器视频协议是否与项目输出一致。
  • PSDK Liveview 是否成功启动。

13. 推荐给用户展示的 MAVROS 入口

功能 推荐入口
连接状态 /mavros/state
姿态 /mavros/imu/data
原始 IMU /mavros/imu/data_raw
本地位置 /mavros/local_position/pose
本地速度 /mavros/local_position/velocity_local
GPS 原始定位 /mavros/global_position/raw/fix
全局位置 /mavros/global_position/global
相对高度 /mavros/global_position/rel_alt
航向 /mavros/global_position/compass_hdg
电池 /mavros/battery
遥控器 /mavros/rc/in
文字状态 /mavros/statustext/recv
本地位置/速度控制 /mavros/setpoint_raw/local
全球位置/速度控制 /mavros/setpoint_raw/global
姿态目标控制 /mavros/setpoint_raw/attitude
本地目标回显 /mavros/setpoint_raw/target_local
全球目标回显 /mavros/setpoint_raw/target_global
姿态目标回显 /mavros/setpoint_raw/target_attitude
拍照/录像命令 /mavros/cmd/command
相机状态 通过 camera/image/video/storage 关键字查找实际 topic
云台状态 通过 mount/gimbal 关键字查找实际 topic
航点任务 通过 mission 关键字查找实际 topic/service
作者:孙渝泓  创建时间:2026-06-12 11:58
最后编辑:bai  更新时间:2026-07-08 09:44