QoS 全称与解释
全称:Quality of Service,服务质量。
QoS 是 ROS2 中定义节点间数据传输策略的规则集,规定DDS底层怎么收发话题数据:是否重传、队列缓存多少、消息存活多久、历史怎么处理。底层基于DDS,用QoS策略权衡「可靠性、实时性、带宽开销」。两个核心策略:
- RELIABLE 可靠模式:等ACK、丢包重传,保证送达,代价是延迟和带宽高。适合标定结果、控制指令。
- BEST_EFFORT 尽力投递:无ACK不重传,延迟低,网络差丢包。适合高频图像、点云流数据。
QoS 可靠性兼容矩阵
发布者(Pub) | 订阅者(Sub) |
RELIABLE | RELIABLE |
RELIABLE | BEST_EFFORT |
BEST_EFFORT | BEST_EFFORT |
BEST_EFFORT | RELIABLE |
实验1(当前状态,能收到消息)
- publisher.py:ReliabilityPolicy.RELIABLE
- subscriber.py:ReliabilityPolicy.BEST_EFFORT
- 结果:✅ subscriber 持续打印 recv msg-...,通信正常(降级运行)
实验2(经典故障,复现收不到消息)
- 修改 publisher.py:ReliabilityPolicy.BEST_EFFORT
- 保持 subscriber.py:ReliabilityPolicy.RELIABLE
- 结果:❌ subscriber收不到任何消息,且无任何报错(静默失败)
- 这正是 QoS 排坑的高频场景:发布方提供不了订阅方要求的可靠保证,连接建立不起来。
操作提醒:实验2 完成后,记得把 publisher.py 改回 RELIABLE,保留可运行的示例。
常见坑提醒
- 很多教程简化写成「RELIABLE 和 BEST_EFFORT 不匹配」——这是片面的,真正指的反向场景(Pub BE / Sub RELIABLE)。
- QoS 排错时静默失败是常态:不匹配时通常不报错、只是收不到,容易被误判为话题名写错。
- depth(队列深度)也会影响收包,但不是连通性的决定因素;连通性由可靠性策略决定。