简介
QoS(Quality of Service,服务质量)配置策略。这是 ROS 2 相比 ROS 1 的一个重要特性,因为它基于 DDS(Data Distribution Service),通信时可以灵活配置不同的 QoS 策略,适应不同的应用场景(比如机器人控制 vs 传感器数据流)。
ROS 2 常见 QoS 策略
在 ROS 2 里,QoS 策略主要包含以下几个方面:
Reliability(可靠性)
- RELIABLE: 确保消息一定会送达(适合命令、关键数据)
- BEST_EFFORT: 尽量传输,不保证(适合高频传感器,如激光雷达点云)
Durability(持久性)
- VOLATILE: 只接收订阅后发布的新消息
- TRANSIENT_LOCAL: 订阅者一旦加入,可以收到历史消息(适合参数或状态发布)
History(历史缓存策略)
- KEEP_LAST(n): 只保留最近 n 条消息
- KEEP_ALL: 保留所有消息(受限于内存)
Deadline(截止时间)
指定发布周期约束,订阅者能检测消息是否延迟。
Liveliness(活跃性)
检测发布者是否仍然活着,可以选择自动或手动信号。
Lifespan(消息寿命)
消息在网络中存活的时间,超时会丢弃
ROS 2 内置 QoS 配置
在 rclcpp 和 rclpy 中,ROS 2 已经内置了一些常用 QoS profile,方便直接使用: |
示例(C++):
rclcpp::QoS qos(rclcpp::KeepLast(10)); |
不同场景下常用 QoS 配置对照表
场景 | 推荐 QoS 配置 | 说明 |
---|---|---|
激光雷达 / 相机图像(高频传感器数据) | BEST_EFFORT + KEEP_LAST(1) (qos_profile_sensor_data ) |
高频大数据流,丢少量数据不影响整体,减少带宽和延迟 |
IMU 数据 | BEST_EFFORT + KEEP_LAST(5) |
高频,但每个数据包较小,允许丢少量数据 |
机器人控制命令(关节/速度/力矩指令) | RELIABLE + KEEP_LAST(1) |
必须保证命令送达,但只要最新的,历史没用 |
状态反馈(关节角度、电流等) | RELIABLE + KEEP_LAST(10) |
确保可靠传输,可以保留最近一段时间的数据 |
地图、参数、静态 TF | RELIABLE + TRANSIENT_LOCAL + KEEP_LAST(1) |
新订阅者加入时也能收到最近的消息(如静态地图、TF 树) |
参数事件(Parameter Events) | RELIABLE + KEEP_ALL (qos_profile_parameter_events ) |
确保不丢失参数变更通知 |
服务(Service) | RELIABLE + KEEP_LAST(1) (qos_profile_services_default ) |
请求-应答模式,必须可靠 |
Action(动作接口) | RELIABLE + KEEP_LAST(10) |
动作反馈需要可靠传输 |
小技巧
内置 QoS 配置
ROS 2 已经提供了常见 QoS,例如:
qos_profile_sensor_data → 传感器 |
调试 QoS 不匹配
发布者和订阅者的 QoS 策略必须“兼容”,否则无法通信。
可以用命令行工具检查:
ros2 topic info /topic_name --verbose |
QoS 和实时性
控制指令 → 要求低延迟(只要最新消息)。
感知数据 → 要求高吞吐(丢数据没关系)。
状态/参数 → 要求高可靠性(不能丢)。