3. ROS2核心概念
在PX4与ROS2的通信工程中,理解ROS2的核心概念是搭建可靠数据链路的前提。PX4通过uXRCE-DDS或Zenoh桥接将飞控内部数据暴露给ROS2生态,而ROS2则用节点、话题、服务、动作、参数等抽象来组织这些数据。本节从计算图的角度梳理这些概念,并重点解释DDS中间件与QoS策略如何决定通信质量。
一、计算图:节点与通信原语
ROS2的计算图由节点(Node)和它们之间的通信关系构成。节点是参与通信的最小进程单元,例如一个px4_ros_com桥接节点、一个offboard_control控制节点、一个rviz2可视化节点。节点之间通过四种原语交互:话题、服务、动作和参数。
- 话题(Topic):发布/订阅模型,异步、单向、多对多。适合高频连续数据,如
/fmu/out/vehicle_attitude姿态、/fmu/out/sensor_combined传感器数据。 - 服务(Service):请求/响应模型,同步、双向、一对一。适合一次性命令,如
/fmu/vehicle_command中的解锁、切换模式。 - 动作(Action):基于话题和服务的组合,支持长时任务、进度反馈与取消。适合航点飞行、起飞降落等耗时操作。
- 参数(Parameter):节点级配置键值对,可在运行时读写,如
use_sim_time、PX4参数映射。
二、DDS中间件:ROS2的通信底座
ROS2默认使用DDS(Data Distribution Service)作为中间件,节点之间的发现、序列化和传输都由DDS完成。DDS采用以数据为中心的发布/订阅模型,通过域(Domain)隔离不同网络,通过主题(Topic)匹配发布者和订阅者。PX4与ROS2通信时,uXRCE-DDS Agent充当DDS参与者,将PX4的uORB消息转换为DDS主题,从而让ROS2节点像订阅本地话题一样订阅飞控数据。
DDS的核心机制包括:
- 自动发现:节点加入域后自动广播,无需中心服务器。
- 序列化:使用CDR等格式将消息转为字节流。
- QoS匹配:发布者与订阅者的QoS策略必须兼容,否则无法建立连接。
三、QoS策略:决定通信可靠性
QoS(Quality of Service)是DDS最强大的特性之一,它允许为每个话题定制可靠性、持久性、历史深度等策略。PX4与ROS2桥接时,QoS不匹配是“话题存在但收不到数据”的最常见原因。
| QoS策略 | 常用取值 | 适用场景 |
|---|---|---|
| Reliability | RELIABLE / BEST_EFFORT | 控制指令用RELIABLE,高频传感器用BEST_EFFORT |
| Durability | VOLATILE / TRANSIENT_LOCAL | 参数、地图用TRANSIENT_LOCAL,实时数据用VOLATILE |
| History | KEEP_LAST / KEEP_ALL | KEEP_LAST配合depth控制缓存深度 |
| Depth | 1 / 10 / 100 | 高频数据用1,低频关键数据用10以上 |
| Deadline | 周期时间 | 监控数据是否按时到达 |
下面是一个ROS2订阅PX4姿态话题时设置QoS的示例:
from rclpy.qos import QoSProfile, ReliabilityPolicy, DurabilityPolicy
qos = QoSProfile(
reliability=ReliabilityPolicy.BEST_EFFORT,
durability=DurabilityPolicy.VOLATILE,
depth=1
)
self.create_subscription(
VehicleAttitude,
'/fmu/out/vehicle_attitude',
self.attitude_cb,
qos
)
四、典型场景:从飞控到控制节点的数据流
以Offboard控制为例,数据流如下:PX4飞控内部uORB消息经uXRCE-DDS Client发送到Agent,Agent将其转为DDS主题;ROS2控制节点订阅/fmu/out/vehicle_odometry获取位置,发布/fmu/in/offboard_control_mode和/fmu/in/trajectory_setpoint;PX4订阅这些输入话题并执行控制。整个链路中,话题负责数据流,服务负责模式切换,动作负责航点任务,参数负责调参。
五、常见误区与复盘
- 话题名写错:PX4的uORB话题经桥接后通常带
/fmu/out/或/fmu/in/前缀,需用ros2 topic list确认。 - QoS不匹配:订阅端RELIABLE、发布端BEST_EFFORT时无法接收,应统一为BEST_EFFORT。
- 域ID不一致:PX4与ROS2必须在同一
ROS_DOMAIN_ID下,否则发现不到对方。 - 服务与话题混用:模式切换用服务,高频控制用话题,长任务用动作,不要用话题模拟服务。
- 参数误改:PX4参数与ROS2参数是两套系统,桥接参数需通过
/fmu/param服务操作。
ros2 topic hz确认频率,再用ros2 topic echo确认内容,最后检查ros2 topic info --verbose中的QoS是否匹配。三步定位大多数通信问题。