ROS 2 服务质量是一套由发布端与订阅端商定的交付和时序策略。有用的配置文件取决于数据在缺失、迟交、重复或陈旧时的含义。为每个主题选择“可靠”可以增加队列,同时不保证机器人行为安全。
连续摄像头或激光雷达采样通常更有利于新鲜性和有界队列,而配置状态可能需要传递给后加入者。机器人命令需要确认、有效性和超时语义,而不仅仅是传输可靠性。将应用合同与承载它的 DDS 机制分开。
请阅读 ROS 2 实时控制指南 和 ROS 2 DDS 安全指南。在实际ROS发行版、 RMW实现、网络和执行器配置上测试所选配置文件。
从陈旧或缺失数据的后果中选择
对于每个主题,请说明生产速率、最大使用寿命、可接受损失、迟到的用户是否需要之前的数据,以及更新停止时消费者应采取的措施。这些要求比从预设的传感器数据或服务配置文件开始更为清晰。
如果下一帧及时到达,丢失的图像可能无害。延迟速度命令如果操作员松开控制后仍有效,则可能存在危险。缺少地图修订可能导致机器人不一致。在选择传输设置前,先设计应用响应。

把QoS理解为一组策略
可靠性控制是否重试送达。历史和深度控制保留样本。耐久性控制存储样本是否能到达晚接合者。截止时间、寿命和活力揭示了不同的时间或终点条件。其中一种配置是这些选择及其持续时间的组合。
默认值可能因 ROS API、配置文件和中间件而异。在运行时记录有效的端点策略,而不是仅信任 YAML 文件。当前的 ROS 2 QoS 概念文档描述了策略语义以及请求与提供的兼容性。
| 策略 | 问题已解答 | 常见风险 | 证据 |
|---|---|---|---|
| 可靠性 | 重试还是允许失败? | 亏损积压 | 交付和陈化样品 |
| 历史与深度 | 有多少样本要等? | 队列延迟 | 队列深度与回调时数据时效 |
| 耐久性 | 晚加入的人会获得存储的数据吗? | 过时瞬态 | 重启行为 |
| 截止日期或使用寿命 | 什么时候时机无效? | 无言陈旧使用 | 事件与拒绝 |
| 活力 | 作者被认为是活着的吗? | 错误健康推断 | 租赁与申请心跳 |
兼容性遵循所请求和提供的策略
发布者提供一定的服务水平,订阅者则请求相应的服务。有些组合能够沟通,有些则不会。可靠性是方向性的:一个可靠的发布者可以满足尽力而为的请求,而尽力而为的发布者则无法满足可靠的请求。耐久性与请求与提供之间的关系类似。
发现并不保证有用的交换。比较主题名称、类型、域、命名空间、安全权限及所有相关 QoS 策略。使用端点信息工具检查双方。将兼容性警告视为证据,但确认实际数据流和时间。
可靠的交付可能会用新鲜感换取完成度
可靠的传输会根据中间件行为和资源限制重试丢失的数据。在拥塞或有损链路上,重试和读取速度慢可能会延迟新样本。机器人可能接收所有保留的消息,但对已不再当前的观测数据采取行动。
测量源时间戳、接收时间和消耗时间。绑定队列并定义是否应丢弃旧样本。可靠适用于事件、状态转换或低速率命令,但无法提供机器人执行预定动作的端到端确认。

对于连续传感器,尽力而为是正确的
“尽力而为”(Best Effort)模式避免重传,并在新样本很快会替代丢失的样本时保持流量。它通常适用于高速摄像头、激光雷达和受限链路遥测。选择仍取决于任务:低速率安全相关测量不能仅作为传感器主题。
当只有最新状态重要时,使用较小的“保持最后”深度,并确认回调是否跟上。检测遗漏序列和过高老化,使退化数据可见。平滑的可视化无法证明估计器是否获得了所需的时间模式。
| 数据类 | 起始简介 | 应用规则 | 压力测试 |
|---|---|---|---|
| 高速摄像机 | 尽力而为,深度小 | 使用最新的有效帧 | 损耗与带宽压力 |
| 机器人状态估计 | 任务特定可靠性 | 拒绝过度衰老 | 低消费和CPU负载 |
| 离散模式转换 | 可靠 | 确认已应用状态 | 重启与重复交付 |
| 速度指令 | 设计上是可靠或尽力而为 | 短有效期加看门狗 | 链路丢失与延迟数据包 |
| 静态配置 | 可靠且需要临时本地 | 版本与验证 | 迟来的加入与替换 |
机器人命令需要有效性和确认
传输可靠性仅表示中间件交付行为。它并不证明接收端控制器接受、应用或完成了命令。请在应用协议中包含命令身份、创建时间、有效性间隔、操作模式以及所需的序列或纪元。
对于流式命令,使用接收端看门狗,当新有效输入停止时,该看门狗会移动到定义状态。对于目标或事务,返回显式的接受、进度和完成。重新连接后,拒绝之前会话的命令,而不是重放保留的队列。
历史和深度可能导致隐藏的延迟
保持最后,深度为N保留的样本数量有界。保持所有尝试保留每个样本在资源限制内。如果消费者速度比发布者慢,深度队列可以将计算过载转化为数据年龄的稳步增加,而非明显的下降。
在回调开始时绘制队列占用率和年龄。测试阻塞回调、 CPU争用和突发发布。如果每个样本都必须处理,则明确调整资源大小和背压;如果只有最新状态重要,则用排水或覆盖旧工作,而不是假装深度能解决吞吐量问题。
耐久性定义了重启和晚加入者的行为
瞬态本地耐久性允许写入者在写入者保持可用时,为兼容的迟订用户保留样本。这适用于映射、校准状态或锁存配置。如果版本控制和生命周期语义较弱,进程重启后也能传递过时信息。
测试发布者优先订阅者和订阅者优先排序、写入重启、读者重启和配置替换。将版本、时间戳和有效性域附加到保留状态。当需要跨主机故障恢复时,不要用持久性代替持久的真实源。
时序策略会暴露不同的故障
截止时间描述了样品之间的预期间隔,并在错过合同时可能引发事件。生命周期限制样品有资格交付的时间。活跃度跟踪发布者在所选租赁和声明模型下是否被视为存活。无任何一个自动定义安全的机器人反应。
每个事件与应用逻辑和可观测性相连接。错过截止日期可能会要求降级操作,而命令过期则可能强制停止。活进程可能会发布无效数据,因此在需要时将中间件事件与范围检查、时间戳和应用心跳结合起来。
仅在确认语义后进行调谐传输
DDS 实现会暴露影响行为的传输、发现、套接字和内存设置。 ROS 2 DDS 调优指南 涵盖了平台相关因素,但厂商旋钮无法修复不兼容的配置文件或超过发布期限的回调。
首先确定端点兼容性和应用年龄限制。然后在同一时间线上记录丢包、重传、队列占用、回调调度和CPU负载。一次只更换一层,并在测试记录中保留精确的RMW、 DDS 厂商和配置。
录音和回放需要自己的 QoS 计划
记录器本身也是一个订阅端,必须与发布者兼容。播放则成为另一个发布者,其配置文件必须与读者匹配。一个rosbag数据包可能包含消息,但无法重现瞬态、截止日期或原始播放时的准确传递模式。
检查录制的元数据,覆盖有正当理由的配置文件,并测试目标回放拓扑。部署分支应阅读 rosbag2源代码和文档。记录源时间戳和配置,以避免离线评估将重放时间与物理时间混淆。
通过受控失效注入验证
测试名义负载、丢包、延迟、重排、带宽压力、缓慢订阅、阻塞执行器、发布者重启、订阅者重启及终端消失。测量接收序列、样本年龄、队列深度、截止日期事件、活跃度事件和机器人响应。
在接口定义旁边发布主题契约。这样可以让部署变得可重复,并防止未来的节点无声地改变通信行为。
评估“传感器数据和机器人指令ROS 2 QoS”时,还应保存模型版本、机器人配置、标定文件、测试日期和全部试验记录。把成功、失败、恢复与人工介入放在同一份数据中,才能区分模型能力、系统接口和现场流程造成的差异。
- 文件率、年龄限制和损失容忍度。
- 记录有效的发布者和订阅策略。
- 测量样本年龄,而非仅测量交付数量。
- 测试网络、执行器和重启失败。
- 版本 QoS 包含主题的应用语义。
常见问题
每个传感器主题都应该使用尽力而为吗?
不。正确的策略取决于采样率、替换行为、容错度以及缺失数据的结果。
可靠能保证命令会执行吗?
不是。它涉及中间件交付。应用需要接受、有效性、看门狗和完成语义。
不同的可靠性设置会总是阻止连接吗?
不。兼容性是方向性的:一个可靠的报价可以满足尽力而为的请求,但尽力而为的报价无法满足可靠的请求。
更高的队列深度能防止数据丢失吗?
它可能保留更多采样,但当用户速度较慢时,也可能增加延迟并消耗资源。
为什么一个主题即使 QoS 兼容,也会晚交?
传输拥堵、回调调度、锁、 CPU 负载、序列化和深度队列都可能延迟兼容性后的数据消耗。
QoS 行为与安全界限
QoS 行为取决于ROS分发、 RMW实现、 DDS 厂商、操作系统、网络和执行器设计。验证整个应用程序;仅靠中间件设置本身不是安全功能。