一、ROS实时性概述
1.1 什么是实时系统?
先问大家一个问题:你写了一个机器人程序,控制机械臂去抓杯子。如果指令晚发了10毫秒,杯子可能已经摔碎了。这就是实时性要解决的问题。
实时系统,说白了就是「在规定时间内必须完成任务」的系统。不是快,而是「准时」。我见过不少刚入行的朋友,以为实时就是跑得快,其实不然。你想想看,一个系统哪怕跑得再快,如果偶尔卡顿一下,对机器人来说可能就是灾难。
实时系统分两种:
- 硬实时:错过截止时间 = 系统崩溃。比如安全气囊、飞行控制器。
- 软实时:偶尔超时还能接受,但性能会下降。比如视频播放、机器人导航。
ROS 的应用场景,大部分属于软实时。但如果你在做工业机器人、自动驾驶,那就得往硬实时靠拢了。
核心要点:实时性不是「快」,而是「可预测」。一个稳定的10ms延迟,比一个偶尔1ms、偶尔100ms的系统要可靠得多。
1.2 ROS1 与 ROS2 实时性对比
我在2018年第一次用 ROS1 做电机控制项目时,踩了个大坑。电机控制周期要求5ms,ROS1 的发布-订阅机制在负载高的时候,延迟能飙到50ms以上。当时我以为是代码写错了,查了两天才发现——这是 ROS1 架构本身的问题。
为什么会这样?来看对比:
| 特性 | ROS1 | ROS2 |
|---|---|---|
| 通信中间件 | 自定义 TCPROS/UDPROS | DDS(数据分发服务) |
| 传输协议 | TCP 为主,UDP 可选 | UDP 多播,支持 QoS |
| 节点管理 | 中心化(roscore) | 去中心化(Discovery) |
| 实时性支持 | 无原生支持 | 原生支持实时内核 |
| 延迟典型值 | 1-10ms(不稳定) | 0.1-1ms(可预测) |
| 抖动 | 高(±5ms 常见) | 低(±0.1ms 以内) |
ROS1 最大的问题在于 roscore。所有节点都要通过它来握手,一旦 roscore 挂了,整个系统就瘫痪了。而且 TCP 协议本身就有重传机制,网络一波动,延迟就不可控。
ROS2 改用 DDS 后,情况好多了。DDS 支持 QoS 策略,你可以设置「可靠性」「时效性」「优先级」等参数。嗯,这里要注意:QoS 配置不对,反而会让性能更差。我见过有人把可靠性设成 RELIABLE,结果在弱网环境下延迟爆炸。
我的建议:如果你从 ROS1 迁移到 ROS2,别急着把所有 QoS 参数都调成最高。先跑一遍默认配置,再根据实际需求微调。我曾经在一个项目中,把「时效性」设得太严格,结果消息频繁被丢弃,反而影响了控制精度。
1.3 实时性三大指标
衡量实时性,我一般看三个数:延迟、抖动、吞吐量。这三个指标互相制约,你不可能同时做到最好。
延迟(Latency)
延迟就是「从事件发生到系统响应」的时间差。比如传感器采集到数据,到控制器发出指令,这中间的时间就是延迟。
在 ROS 里,延迟包括:
- 数据采集延迟(传感器到节点)
- 通信延迟(节点到节点)
- 处理延迟(算法计算时间)
- 输出延迟(指令到执行器)
我做过一个测试:在 ROS1 里,两个节点之间发一个 1KB 的消息,平均延迟 2ms,但最大延迟能到 15ms。而在 ROS2 里,同样条件下,平均延迟 0.3ms,最大延迟不超过 1ms。差距就是这么明显。
抖动(Jitter)
抖动比延迟更可怕。延迟高,你还能预估;抖动大,你根本没法做控制。
举个例子:你写了一个 PID 控制器,周期是 10ms。如果每次执行的时间分别是 9ms、11ms、8ms、12ms... 那 PID 参数怎么调?调了也没用,因为系统行为不可预测。
我习惯用「最大抖动」来衡量系统稳定性。公式很简单:
抖动 = 实际延迟 - 平均延迟
最大抖动 = max(抖动) - min(抖动)
在 ROS2 中,如果配置了实时内核和优先级调度,抖动可以控制在微秒级别。ROS1 嘛... 嗯,我建议你别抱太大期望。
吞吐量(Throughput)
吞吐量是「单位时间内能处理的消息数量」。这个指标在传感器数据量大的时候特别重要。比如激光雷达每秒发 10 万个点,你的系统能不能接得住?
吞吐量和延迟是矛盾的。你想想看:
- 想降低延迟?那就减少缓冲区,但吞吐量会下降。
- 想提高吞吐量?那就加大缓冲区,但延迟会上升。
我在做多传感器融合项目时,就遇到过这个问题。6 个摄像头同时采集数据,ROS1 直接卡死。后来换成 ROS2,配合适当的 QoS 配置,才把吞吐量提上去。
避坑指南:我曾经在一个项目中,为了追求低延迟,把 ROS2 的队列深度设成了 1。结果吞吐量太低,导致数据丢失严重。后来我改成队列深度 10,配合「部分可靠」的 QoS,才找到平衡点。记住:没有完美的配置,只有适合你场景的配置。
1.4 小结
这一章我们聊了实时系统的定义,对比了 ROS1 和 ROS2 的实时性差异,也讲了延迟、抖动、吞吐量这三个核心指标。
我个人觉得,ROS2 在实时性上确实比 ROS1 强了一个量级。但工具再好,也得会用。接下来的章节,我会带你一步步搭建实时 ROS2 系统,包括内核配置、优先级调度、锁优化等等。
嗯,下一章我们聊聊「实时内核配置与线程优先级管理」,到时候我会分享一些实战中踩过的坑,保证让你少走弯路。