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
)
注意:PX4发布的多数uORB话题使用BEST_EFFORT + VOLATILE。如果订阅端使用RELIABLE,DDS会认为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订阅这些输入话题并执行控制。整个链路中,话题负责数据流,服务负责模式切换,动作负责航点任务,参数负责调参。

ROS2 计算图与 PX4 通信链路 PX4 飞控 uORB 消息总线 uXRCE-DDS Client Offboard 控制器 参数系统 动作服务器 DDS 中间件 uXRCE-DDS Agent Domain 0 QoS 匹配 CDR 序列化 ROS2 节点 订阅 /fmu/out/vehicle_attitude 订阅 /fmu/out/vehicle_odometry 发布 /fmu/in/trajectory_setpoint 服务 /fmu/vehicle_command 动作 /fmu/navigate_to uORB DDS Topic Setpoint uORB In QoS 策略 BEST_EFFORT · VOLATILE · KEEP_LAST(1)

五、常见误区与复盘

  1. 话题名写错:PX4的uORB话题经桥接后通常带/fmu/out/或/fmu/in/前缀,需用ros2 topic list确认。
  2. QoS不匹配:订阅端RELIABLE、发布端BEST_EFFORT时无法接收,应统一为BEST_EFFORT。
  3. 域ID不一致:PX4与ROS2必须在同一ROS_DOMAIN_ID下,否则发现不到对方。
  4. 服务与话题混用:模式切换用服务,高频控制用话题,长任务用动作,不要用话题模拟服务。
  5. 参数误改:PX4参数与ROS2参数是两套系统,桥接参数需通过/fmu/param服务操作。
调试建议:先用ros2 topic hz确认频率,再用ros2 topic echo确认内容,最后检查ros2 topic info --verbose中的QoS是否匹配。三步定位大多数通信问题。