实时机器人控制意味着所需的计算和输入输出在指定截止时间内完成,且抖动有界。这不仅仅是高平均帧率的意思。一个偶尔停顿几毫秒的1 kHz环路,可能比一个最坏时序仍符合被控对象要求的较慢控制环更难使用。
ROS 2 可以是实时系统的一部分,但确定性依赖于操作系统、内核、调度、 CPU和中断的配置、内存行为、驱动程序、中间件路径、控制器代码和硬件接口。非实时感知、日志和服务应穿越有界接口,而非在关键环路中执行。
请使用本指南,配合 机器人关节网络比较 和 电机-驱动架构。实时理赔需要在最可信负载和明确故障响应下进行测量。
从截止日期和漏掉的后果开始
定义控制周期、允许的启动抖动、最差执行时间、 I/O时序和数据年龄限制。然后定义错过一次截止日期意味着什么:保留有界命令、降低性能、停止控制器或进入更安全状态。答案取决于被控对象的速度和危险程度。
软实时、强实时和硬实时描述了截止日期错过如何影响其实用性或可接受性;它们不是性能徽章。大多数通用机器人计算机需要系统特定的证据。保持与控制器配置的定时合同,这样后续的软件变更不会悄然使其失效。

硬件环路遵循读、更新和写入
ros2_control控制器管理器文档描述了管理控制器和硬件接口的组件,并讨论确定性。一个常见的循环读取硬件状态,更新控制器并以配置速率写入命令。
物理采样和命令应用实际发生的时间戳。软件功能录入不总是传感器捕获时间。将状态年龄跟踪到控制器,命令年龄在驱动器上。循环可以在消耗过时的网络数据的同时定期执行。
| 循环阶段 | 截止日期证据 | 隐藏延迟 | 检查 |
|---|---|---|---|
| 硬件读取 | 捕获到可用时间 | 设备或总线队列 | 物理时间戳 |
| 控制器更新 | 最差处决时间 | 分配或锁定 | 痕迹时长 |
| 硬件写入 | 命令应用时间 | 网络排程 | 驱动器时间戳 |
| 数据交换 | 生产者-消费者年龄 | 回拨积压 | 序列计数器 |
| 故障路径 | 检测到安全状态 | 服务或生命周期工作 | 注入未中 |
调度策略需要CPU和中断设计
实时线程可以使用固定优先级调度策略并获得适当权限,但仅靠优先级并不等同于隔离。在考虑整个系统的情况下分配CPU亲和力和中断处理。高优先级线程如果等待低优先级锁,仍然可能错过截止日期。
测量来自网络、存储、 GPU、摄像头和后台服务的干扰。避免导致核心或安全任务枯竭。文档调度器、优先级、亲和力、电源状态和固件,确保测试和部署机器相当。
内存故障和分配会产生时序尾部
动态分配、页错误、内存回收和无界容器增长可能引入可变延迟。预配置缓冲区,适当锁定内存,预热相关代码和数据路径,保持消息大小有界。未经验证行为,勿在紧环中分配或释放内存。
内存准备无法解决缓存争用或设备DMA干扰。应对整个应用进行压力,并检查尾延迟。确认错误路径、参数变更和控制器转换在环路活跃时不会意外分配或阻塞。
阻塞式I/O和日志记录应放在控制环之外
文件写入、控制台输出、同步服务、 DNS、动态发现和等待一般回调在硬边界更新路径内不合适,除非有特定实现证明了边界。通过实时安全机制向低优先级消费者发送简洁诊断。
限制队列长度,并决定是丢弃新数据还是旧数据。无界日志可以将时序问题转移到内存增长。保留对丢失诊断的计数器,避免仅仅因为证据被丢弃而让系统显得健康。

实时安全缓冲区分隔时序域
非实时规划器可以将命令或轨迹发布到无锁或有界的切换中,控制器读取最新的完整对象而无需等待生产者。状态可以通过另一个有界快照向外移动。所有权和生命周期必须明确。
验证命令序列、时间戳和超时。如果生产器熄火,内环不应无限重复旧转矩。参数更新和模式开关也需要原子或分级应用,以确保部分更新的配置无法到达执行器。
| 运营 | 处于临界循环? | 首选图案 | 失效策略 |
|---|---|---|---|
| 阅读关节状态 | 是的 | 有界硬件接口 | 检测陈旧样本 |
| 更新控制定律 | 是的 | 固定功与记忆 | 截止日期监控 |
| 写执行器命令 | 是的 | 有界接口 | 本地暂停 |
| 保存日志 | 不 | 有界队列到工作者 | 掉落计数 |
| 服务或参数工作 | 不 | 阶段再换 | 拒绝无效转移 |
DDS 有用,但默认电机电流环路并不适用
DDS 和 ROS 2 通信可以支持可配置的服务质量和分布式应用,但内部的电流环路通常运行在驱动器或专用控制器内部。网络和执行路径必须在进入严格的关节控制截止时间内进行测量。
在时间证据合适的位置使用 ROS 2 进行编排、轨迹、状态及更高层。保持破坏性过流和快速保护本地化。中间件选择不能取代驱动器级确定性控制或硬件安全电路。
追踪暴露了罕见的排程和回拨延迟
ROS 2 文档包括用于分析执行的 追踪指导。仪器控制器周期、回调、输入输出和截止日期监控,开销低且具特征性。将走线与驱动器和网络日志对齐。
收集长跑的直方图和最大值,而非短期平均值。重现CPU、网络、存储、热限速和图形负载。识别每个尾部之前发生的事件。单个最大值且无痕迹上下文难以修复,而一个没有最大值的百分位数可能隐藏危险的失误。
在某些系统中,实时内核是必要的,但不够
可抢占式实时内核可以降低调度延迟,但应用锁、驱动、固件、电源管理和无界代码依然存在。相反,一个动态较慢的被控对象可能在经过精心测量的非实时配置下达成截止日期。需求和证据决定。
验证BIOS、 CPU电源状态、散热行为和驱动版本。内核、中间件、控制器或硬件更新后重新测试。生产镜像和部署配置应与时序报告一起纳入版本管理。
压力测试必须包括漏击和恢复
运行最大控制器数量、完整网络流量、传感器流、日志记录和真实应用负载。添加热浸、存储活动和错误处理。测量周期、执行时间、捕获到控制年龄、命令-应用年龄及连续未命中。
在支持的情况下注入过时状态、控制器错误、硬件超时和时钟变化。验证预期的停用、停止或降级模式。实时环路只有在其故障行为也有限制时才具有操作价值。
评估“ROS 2 实时控制:截止日期、抖动与ros2_control”时,还应保存模型版本、机器人配置、标定文件、测试日期和全部试验记录。把成功、失败、恢复与人工介入放在同一份数据中,才能区分模型能力、系统接口和现场流程造成的差异。
成本评估除了设备与算力,还要记录数据采集、工程调试、安全措施、维护、停机和人员培训。只有把这些持续投入与单位成功任务的价值比较,才能判断方案是否适合扩大。
上线后仍要持续检查分布变化、传感器漂移、机械磨损和人工接管原因。监测结果应能触发降级、停止与重新验证流程,并为下一轮数据采集和模型更新留下可追溯记录。
最终结论应明确写出已知限制、尚未验证的场景和下一项可证伪的实验,使后续团队能够沿着证据继续推进。
实际项目还应指定数据、模型、控制器和安全流程的负责人,并预先定义回滚条件。责任边界、审批记录与变更日志越清楚,故障发生后越容易停止扩散、定位原因并安全恢复。
- 写周期、抖动和数据时代合同。
- 保持读-更新-写路径有边界。
- 预先配置记忆,移动,在户外工作。
- 在满载生产负载下追踪尾部延迟。
- 定义并测试过时数据和漏掉周期的行为。
常见问题
ROS 2本身是一个实时操作系统吗?
不是。 ROS 2 是可以在操作系统、调度、代码、驱动和硬件经过相应设计和测量时,能够参与实时系统的中间件和库。
DDS能让关节控制环具备确定性吗?
不是自动的。服务质量有助于通信语义,但端到端延迟、执行器调度和硬件应用时间仍需证据。
更高的控制频率总是更好吗?
不行。被控对象、传感器、执行器和计算资源必须留有足够裕量。更快且错过截止日期的循环表现可能更差。
Python 能运行硬实时电机循环吗?
典型的 Python 执行存在非确定性来源,通常保持在最紧密的循环之外;仅在可测需求和架构允许的情况下使用。
应该先测量什么时机?
测量从捕获到命令的完整链,包括周期、最差执行、抖动、状态年龄、命令-应用延迟和漏接周期恢复。
实时控制边界说明
ROS 2 和实时内核本身并不能保证确定性。在最坏情况下的负载和所有相关故障转移下,验证调度、内存、驱动程序、通信、控制器代码和硬件输入输出。