4. PX4 ROS2桥接原理
PX4 与 ROS 2 的桥接并不是“把 MAVLink 换个壳”,而是围绕 uORB 消息建立的一条实时数据通道。理解这条通道,关键要抓住三个名字:microRTPS、px4_ros_com 和 XRCE-DDS。它们分别对应协议、工具链和中间件实现,共同完成从飞控内部话题到 ROS 2 话题的双向映射。
一、核心原理:uORB → XRCE-DDS → ROS 2
PX4 内部所有模块通过 uORB 发布/订阅消息,例如 sensor_combined、vehicle_attitude、vehicle_command。这些消息默认只在飞控内部流转。要让机载计算机上的 ROS 2 节点看到它们,需要在飞控侧运行一个 XRCE-DDS 客户端(历史上也称 microRTPS 客户端),由它把 uORB 话题序列化后,通过串口或 UDP 发送给机载计算机上的 XRCE-DDS 代理(Agent)。Agent 再把这些数据翻译成 ROS 2 的 DDS 话题,供 ROS 2 节点订阅;反向亦然。
因此,桥接的本质是:uORB 是数据源,XRCE-DDS 是传输协议,microRTPS 是早期实现名称,px4_ros_com 是 ROS 2 侧的配套功能包。四者关系可以用一句话概括:microRTPS 是“桥”的旧称,XRCE-DDS 是“桥”的现行标准,px4_ros_com 是“桥”的 ROS 2 工具箱。
二、方法流程:从启动 Agent 到收发话题
实际部署时,桥接的启动顺序和参数配置决定了通信能否建立。典型流程如下:
- 飞控侧配置:确认固件已包含 XRCE-DDS 客户端模块,并设置串口波特率或 UDP 端口。常用参数为
XRCE_DDS_CFG和XRCE_DDS_PRT。 - 启动 Agent:在机载计算机上运行
MicroXRCEAgent,指定传输方式与设备。 - 验证话题:使用
ros2 topic list查看是否出现/fmu/out/...与/fmu/in/...话题。 - 运行 px4_ros_com 示例:通过
offboard_control等节点验证双向通信。
# 启动 XRCE-DDS Agent(串口方式)
MicroXRCEAgent serial --dev /dev/ttyACM0 -b 921600
# 或使用 UDP 方式
MicroXRCEAgent udp4 -p 8888
# 查看桥接后的话题
ros2 topic list | grep fmu
# 查看具体消息内容
ros2 topic echo /fmu/out/vehicle_attitude
三、px4_ros_com 与 microRTPS 的角色区分
很多初学者会把 microRTPS 和 px4_ros_com 混为一谈。microRTPS 是 PX4 早期对“uORB 与 RTPS 桥接”的实现名称,后来逐步被 XRCE-DDS 取代。px4_ros_com 则是 ROS 2 工作空间中的功能包,提供消息定义、示例节点和启动脚本,它不负责底层传输,而是让开发者更方便地使用桥接后的话题。
| 名称 | 所在位置 | 核心职责 | 典型命令/文件 |
|---|---|---|---|
| microRTPS | PX4 飞控侧 | 早期 uORB 与 RTPS 桥接实现 | 已逐步被 XRCE-DDS 替代 |
| XRCE-DDS Client | PX4 飞控侧 | 将 uORB 话题序列化并发送 | uxrce_dds_client 模块 |
| XRCE-DDS Agent | 机载计算机侧 | 接收客户端数据并转为 DDS 话题 | MicroXRCEAgent |
| px4_ros_com | ROS 2 工作空间 | 消息定义、示例节点、启动脚本 | offboard_control、px4_msgs |
四、案例与场景:多机命名空间下的桥接
在多机场景中,每架 PX4 飞控对应一个独立的 XRCE-DDS 客户端,机载计算机上可以运行多个 Agent 实例,分别绑定不同串口或 UDP 端口。ROS 2 侧通过 命名空间 区分不同飞机的话题,例如 /px4_1/fmu/out/vehicle_attitude 与 /px4_2/fmu/out/vehicle_attitude。此时 px4_ros_com 的示例节点需要传入命名空间参数,否则会订阅到错误的话题。
# 为第二架飞机启动独立 Agent
MicroXRCEAgent udp4 -p 8889
# 在 ROS 2 中查看带命名空间的话题
ros2 topic list | grep px4_2
# 运行节点时指定命名空间
ros2 run px4_ros_com offboard_control --ros-args -r __ns:=/px4_2
五、常见误区与复盘
- 误区一:认为桥接是单向的。实际上 XRCE-DDS 支持双向通信,
/fmu/out/...是飞控输出,/fmu/in/...是飞控输入,两者缺一不可。 - 误区二:忽略消息频率与带宽。高频话题(如
sensor_combined)在串口带宽不足时会丢包,建议使用 UDP 或提高波特率。 - 误区三:把 px4_ros_com 当成桥接程序。它只是 ROS 2 侧的工具包,真正的桥接由 XRCE-DDS Client 与 Agent 完成。
- 误区四:不检查 Agent 日志。Agent 启动失败或端口占用时,飞控侧会一直重连,但 ROS 2 侧看不到任何话题。
复盘时建议按“飞控模块 → 传输链路 → Agent → ROS 2 话题 → 用户节点”的顺序逐段排查。先确认 uxrce_dds_client 是否运行,再确认 Agent 是否监听正确端口,最后用 ros2 topic list 和 ros2 topic echo 验证数据是否真正到达。只有这条链路每一段都打通,PX4 与 ROS 2 的桥接才算真正建立。