一、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 系统,包括内核配置、优先级调度、锁优化等等。

嗯,下一章我们聊聊「实时内核配置与线程优先级管理」,到时候我会分享一些实战中踩过的坑,保证让你少走弯路。