随着机器人计算平台越来越强,一台机器人已经不再只是运行一个简单的运动控制程序。

今天的工业机器人、人形机器人、移动机器人甚至具身智能设备,往往需要在同一台计算平台上同时运行:

ROS 2
ros2_control
EtherCAT
AI推理
视觉
SLAM
路径规划
传感器融合
网络通信
日志系统
安全控制

从软件功能来看,这是一件好事。

一台设备可以完成越来越多的任务。

但从实时系统角度来看,却出现了一个越来越尖锐的问题:

如果AI突然占满CPU怎么办?

如果视觉算法突然执行时间翻倍怎么办?

如果SLAM线程出现异常怎么办?

如果某个节点发生内存泄漏怎么办?

如果日志线程疯狂写磁盘怎么办?

最关键的是:

这些问题发生的时候,1 kHz机器人控制还能不能准时运行?

如果答案是不确定,那么系统就存在一个非常重要的架构问题:

实时控制和非实时计算之间缺少明确的隔离边界。

这也是为什么机器人操作系统不能只讨论“实时调度”。

真正进入复杂机器人系统以后,还必须进一步讨论:

任务隔离
CPU隔离
内存隔离
IRQ隔离
进程隔离
故障隔离
资源隔离

最终目标只有一个:

让真正关键的实时控制任务拥有可预测的运行环境。


一、为什么机器人越“智能”,实时控制反而越容易受到干扰?

先看一台典型的人形机器人计算平台。

它可能同时运行:

┌───────────────────────────────┐
│          Robot Computer       │
│                               │
│ ROS 2                         │
│ ros2_control                  │
│ EtherCAT                      │
│ IMU                           │
│ Vision                        │
│ SLAM                          │
│ AI Inference                 │
│ Path Planning                │
│ Navigation                   │
│ Logging                      │
│ Network                      │
└───────────────────────────────┘

其中:

1kHz Joint Control

要求:

1ms周期

而视觉可能是:

30Hz
33ms周期

AI推理可能一次执行:

5ms
10ms
20ms
甚至更长

从各自任务的角度来看,这些时间都可能是合理的。

问题在于:

它们共享了同一套计算资源。

例如:

CPU0 CPU1 CPU2 CPU3
│    │    │    │
AI   Vision SLAM Planning

CPU4 CPU5
State Estimation

CPU6
1kHz Control

CPU7
EtherCAT / Safety

如果系统已经做好这样的CPU规划,那么实时控制就拥有了一定的资源边界。

但如果所有任务都可以自由进入所有CPU:

CPU0~CPU7
│
├── Control
├── AI
├── Vision
├── SLAM
├── Planning
├── Network
└── Logging

那么即使CPU总利用率只有50%,也不能说明1kHz控制是安全的。

因为实时系统关心的不是:

平均资源利用率。

而是:

关键任务在最坏情况下还能获得多少确定的资源。


二、为什么CPU利用率只有50%,实时任务仍然可能被拖慢?

这是理解实时系统非常重要的一点。

假设一个8核CPU:

总计算能力:800%

当前系统:

AI       100%
Vision    80%
SLAM      60%
Planning  30%
ROS 2     50%
其他      80%

总利用率可能只有:

400%

看起来还有大量CPU资源。

但是,如果1kHz控制线程恰好和某个高负载任务竞争同一个核心:

CPU6
│
├── Control
└── AI

那么对于控制线程来说:

CPU6 = 竞争激烈

而不是:

整个CPU还有50%空闲

这就是为什么实时系统不能只看:

CPU Usage

还需要看:

任务所在CPU
调度延迟
线程优先级
IRQ
CPU迁移
缓存
内存访问
锁竞争

甚至还需要考虑:

Memory Bandwidth
Cache
PCIe
DMA

所以:

“CPU还有很多空闲”与“实时任务拥有稳定资源”是两件完全不同的事情。


三、实时任务隔离到底是什么?

所谓实时任务隔离,并不是简单地:

“给实时线程设置一个很高的优先级。”

真正的任务隔离,需要建立一个边界:

实时任务
       │
       │ 资源边界
       ↓
┌───────────────────┐
│ Real-Time Domain  │
│                   │
│ 1kHz Control      │
│ Servo             │
│ Safety            │
│ Hardware IO       │
└───────────────────┘

┌───────────────────┐
│ Non-RT Domain     │
│                   │
│ AI                │
│ Vision            │
│ SLAM              │
│ Planning          │
│ Logging           │
└───────────────────┘

这两个区域之间仍然需要通信。

但是:

非实时任务不能无限制地干扰实时任务。

因此可以把隔离拆成几个层次。

任务隔离
   ↓
线程隔离
   ↓
CPU隔离
   ↓
IRQ隔离
   ↓
内存/资源隔离
   ↓
进程/故障隔离

这些并不是互相替代,而是不同层次的保护。


四、第一层:线程隔离——先把任务分清楚

假设ROS 2中存在:

Control Callback
Vision Callback
Planning Callback
Logging Callback

如果所有Callback都由一个线程执行:

SingleThreadedExecutor

那么实际上:

Control
Vision
Planning
Logging

形成串行关系。

这对于简单机器人系统非常方便。

但如果:

Vision = 15ms

而:

Control = 1ms

那么一个视觉Callback的执行时间就可能远大于一个控制周期。

因此,对于实时控制任务,需要首先明确:

哪些Callback属于实时域?
哪些Callback属于非实时域?

例如:

Realtime Callback
├── Joint Control
├── Servo
└── Safety

Non-Realtime Callback
├── Vision
├── Planning
├── Logging
└── UI

然后通过:

Callback Group
Executor
Thread

建立不同执行路径。

但需要再次强调:

Callback Group不是资源隔离机制。

它解决的是ROS 2层面的回调并发关系。

真正进入操作系统以后,仍然需要:

Thread
 ↓
Scheduler
 ↓
CPU

进行资源分配。


五、第二层:CPU隔离——让1kHz控制拥有自己的CPU

假设机器人有8个CPU核心:

CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7

可以进行类似这样的资源规划:

CPU0~CPU3
AI / Vision / SLAM / Planning

CPU4~CPU5
State Estimation

CPU6
1kHz Control

CPU7
Safety / Hardware / Reserved

然后:

Control Thread
      ↓
CPU6

这样做的核心意义是:

减少控制线程与大量普通计算任务之间的CPU竞争。

但这里一定要区分三个概念。

CPU Affinity

解决:

线程可以在哪些CPU运行?

例如:

Control → CPU6

Core Isolation

解决:

哪些普通任务尽量不要进入这个CPU?

例如:

CPU6
→ 实时控制专用

IRQ Affinity

解决:

哪个CPU处理硬件中断?

例如:

EtherCAT IRQ → CPU7
Network IRQ → CPU0~CPU3

所以完整的CPU隔离实际上是:

线程绑定
+
普通任务隔离
+
IRQ规划

三者共同作用。


六、第三层:为什么IRQ可能“偷偷破坏”CPU隔离?

假设我们已经完成:

Control Thread → CPU6

同时CPU6上没有普通任务。

看起来已经非常理想。

但是:

EtherCAT
Network
USB
PCIe
Sensor

都可能产生硬件中断。

如果这些IRQ也进入CPU6:

CPU6
│
├── Control
├── EtherCAT IRQ
├── Network IRQ
├── USB IRQ
└── Other IRQ

那么控制线程仍然可能被打断。

例如:

控制线程
│
├── 运行
├── 运行
├── 运行
│
└── IRQ
     ↓
   中断处理
     ↓
   控制线程恢复

这会增加控制线程的调度延迟。

因此,一个真正的实时CPU不能只考虑:

谁在这个CPU上运行?

还要考虑:

谁可以打断这个CPU?

这就是IRQ Affinity的重要性。

最终:

CPU隔离

实际上应该理解成:

Task Isolation
+
IRQ Isolation

而不是单纯把线程绑定到一个CPU。


七、第四层:内存隔离——CPU没被抢走,内存也可能成为瓶颈

这是更加容易被忽略的一层。

假设:

CPU6
1kHz Control

AI运行在:

CPU0~CPU3

看起来两个任务已经完全分开。

但是AI可能持续进行:

大规模内存访问
模型加载
Tensor计算
DMA
GPU数据交换

这时候控制线程仍然会和AI共享:

内存控制器
内存带宽
Cache
PCIe
DMA资源

于是可能出现:

AI大量访问内存
       ↓
Memory Bandwidth上升
       ↓
Control访问内存
       ↓
访问时间变化
       ↓
控制周期抖动

因此:

CPU隔离并不等于完整资源隔离。

这也是为什么现代机器人实时系统越来越需要从:

CPU

扩展到:

CPU
Cache
Memory
DMA
I/O
Network

进行整体考虑。


八、第五层:锁隔离——最容易产生优先级反转的地方

再来看一个非常典型的场景。

系统存在:

High Priority
1kHz Control

Medium Priority
Vision

Low Priority
Logging

控制线程需要访问:

RobotState

日志线程也需要访问:

RobotState

于是两边使用:

std::mutex

某一时刻:

Logging
   ↓
获得锁

紧接着:

Control
   ↓
需要锁
   ↓
等待

这时如果:

Vision

又在运行:

Vision
   ↓
占用CPU

就可能形成:

High
Control
  ↓
等待Low释放锁
       ↑
       │
      Low
       │
       ↑
    被Medium干扰

这就是经典的优先级反转。

因此实时任务隔离还需要考虑:

共享数据
锁
临界区
优先级继承
无锁数据结构
双缓冲
环形缓冲

一个基本原则是:

实时控制线程尽量不要依赖不可预测的锁等待。

尤其是:

1kHz控制线程

每1ms就需要运行一次。

如果一次锁等待就是:

200μs

那么它已经消耗了整个周期20%的时间预算。

如果变成:

800μs

那么实时余量几乎已经消失。


九、为什么实时任务不能把日志直接写到控制循环里?

这个例子非常典型。

很多程序都会这样写:

void control_loop()
{
    read();

    calculate();

    printf("position=%f", position);

    write();
}

普通程序没有什么问题。

但如果这是:

1kHz Control

那么每秒:

1000次printf

甚至更多。

如果日志系统涉及:

格式化
内存分配
锁
终端输出
文件I/O
磁盘
网络

那么它就可能成为控制线程的实时干扰源。

更合理的方法是:

Realtime Thread
      │
      ├── Control
      │
      └── Write lightweight event
                    │
                    ▼
              Log Thread
                    │
                    ▼
               File / Network

即:

实时线程只记录必要信息,把真正的日志处理放到非实时线程。

同样的思想也适用于:

网络
数据库
UI
文件
ROS 2大消息
调试信息

不要让这些非实时操作直接进入关键控制路径。


十、故障隔离为什么比单纯的性能隔离更加重要?

前面讨论的主要是:

“AI运行太慢,会不会影响控制?”

但机器人还有另外一个更加现实的问题:

如果AI根本出故障了怎么办?

例如:

Vision Node

发生:

死循环
内存泄漏
异常退出
CPU占用100%

如果它和控制系统共享大量资源:

AI
 ↓
CPU资源耗尽
 ↓
系统负载上升
 ↓
ROS 2调度受影响
 ↓
控制线程延迟

那么最终可能影响机器人运动。

所以真正的实时系统不仅要考虑:

Performance Isolation
性能隔离

还需要考虑:

Fault Isolation
故障隔离

理想情况下:

AI异常
 │
 ├── AI进程退出
 ├── AI资源释放
 └── 控制域继续运行

而不是:

AI异常
 ↓
整个机器人控制系统异常

这也是为什么复杂机器人系统越来越强调:

进程隔离
资源隔离
权限隔离
故障隔离

十一、为什么进程隔离比单纯线程隔离更适合复杂机器人?

线程共享:

地址空间

这意味着:

Thread A
Thread B
Thread C

之间共享大量资源。

优点是:

通信方便
性能高
共享数据简单

但问题是:

一个线程出现严重内存错误

可能影响整个进程。

而采用多个进程:

Control Process
Vision Process
AI Process
Planning Process

可以建立更加明确的边界。

例如:

┌─────────────────────┐
│ Control Process     │
│                     │
│ 1kHz Control        │
│ ros2_control        │
│ Hardware Interface  │
└─────────────────────┘

┌─────────────────────┐
│ Vision Process      │
│                     │
│ Camera              │
│ Image Processing    │
└─────────────────────┘

┌─────────────────────┐
│ AI Process          │
│                     │
│ Inference           │
│ Model Runtime       │
└─────────────────────┘

这时候即使:

AI Process

发生异常,也更容易将影响限制在对应进程范围内。

当然,进程隔离也会带来:

进程间通信
数据复制
共享内存
同步
管理复杂度

所以它并不是“越多越好”。

真正需要的是:

根据实时等级和故障风险划分合理的边界。


十二、共享内存为什么既是实时通信方案,又可能成为新的风险?

当我们把AI、视觉、控制放到不同进程以后,又会出现一个新问题:

Control Process
       ↓
需要Vision数据
       ↓
Vision Process

如果每次都进行大规模数据复制:

Image
 ↓
Copy
 ↓
Copy
 ↓
Control

那么对于图像、点云等大数据来说,成本可能很高。

所以会进一步使用:

Shared Memory

例如:

Vision Process
       │
       ▼
Shared Memory
       │
       ▼
Control Process

这样可以减少数据复制。

但是共享内存又会带来:

数据一致性
生命周期
锁
原子操作
缓存一致性
并发访问

因此:

共享内存不是“用了就实时”。

它只是提供了一种跨进程高效交换数据的机制。

如果设计不当:

Shared Memory
+
Mutex
+
大数据
+
复杂同步

仍然可能形成实时瓶颈。

所以在实时控制域中,更需要关注:

数据所有权
数据生命周期
访问方式
同步机制

十三、真正的实时任务隔离应该是什么样?

把前面的内容全部组合起来,可以得到一个更加完整的机器人系统架构:

                         Robot System
                              │
        ┌─────────────────────┼─────────────────────┐
        │                     │                     │
        ▼                     ▼                     ▼
  Real-Time Domain      Deterministic Domain    Non-RT Domain
        │                     │                     │
        │                     │                     │
     1kHz Control          500Hz State           AI
     Servo                 Estimation             Vision
     Safety                Sensor Fusion          SLAM
     EtherCAT              Trajectory             Planning
        │                     │                     │
        ▼                     ▼                     ▼
   RT Executor            RT Threads            Workers
        │                     │                     │
        ▼                     ▼                     ▼
      CPU6                  CPU4~5              CPU0~3
        │                     │                     │
        ▼                     ▼                     ▼
   RT Resources         Shared State          High Throughput

同时:

IRQ
│
├── EtherCAT → RT相关CPU
├── Sensor   → 对应实时域
└── Network  → 非实时CPU

内存:

Real-Time
│
├── Preallocated Buffer
├── Fixed-size Data
└── Controlled Access

Non-RT
│
├── Dynamic Memory
├── Large Image
└── AI Tensor

进程:

Control Process
Vision Process
AI Process
Planning Process

各自建立资源边界。

这样才真正形成:

从线程到CPU,从CPU到内存,从内存到IRQ,再到进程和故障域的系统级隔离。


十四、核心隔离为什么会成为机器人实时操作系统的重要能力?

到这里就能理解一个非常关键的问题。

为什么对于机器人操作系统来说,仅仅:

实时调度

还不够?

因为现代机器人已经进入:

CPU
+
GPU
+
NPU
+
AI
+
视觉
+
实时控制

共存的时代。

如果没有资源边界:

AI
   ↓
CPU/Memory/IRQ
   ↓
实时控制

就可能形成不可预测的干扰。

因此,实时系统需要从:

任务优先级

进一步发展到:

任务隔离

再进一步:

核心隔离

再进一步:

资源隔离

最终形成:

                     Robot OS
                         │
          ┌──────────────┼──────────────┐
          ↓              ↓              ↓
     Real-Time        Safety         AI/Compute
        Core           Core             Core
          │              │              │
       Control         Safety          Vision
       Servo           Monitor         AI
       EtherCAT        Protection       SLAM
          │              │              │
          └──────────────┼──────────────┘
                         ↓
                    Hardware

这也是核心隔离在机器人实时系统中真正有意义的地方。

它并不是简单地“指定某个线程跑在哪个CPU”。

真正的核心隔离应该服务于一个更大的目标:

为关键实时任务建立相对独立、可预测、可控制的计算环境。

对于需要较强实时性、确定性和资源隔离能力的嵌入式机器人控制系统,望获rtLinux 可以作为底层实时Linux环境的一种技术选择,在操作系统层面支撑实时任务调度、CPU核心隔离以及相关资源管理。

但仍然需要强调:

核心隔离
≠
系统天然实时

应用层仍然需要:

合理线程模型
合理优先级
合理内存管理
合理锁设计
合理IRQ规划
合理驱动
合理硬件通信

只有软硬件协同起来,实时能力才能真正落地。


十五、如何验证“隔离”真的有效?

这是工程实践中最重要的一步。

不能因为:

Control → CPU6

就直接认为:

“CPU隔离已经完成。”

真正应该进行压力测试。

例如建立一个基准测试:

测试A:系统空载

AI关闭
Vision关闭
SLAM关闭
Network低负载

观察:

1kHz Control

得到:

最大调度延迟
最大周期抖动
Deadline Miss

然后进行:

测试B:AI高负载

AI = 高负载
GPU = 高负载
Memory = 高负载

重新测试。

再进行:

测试C:视觉高负载

Camera
+
Image Processing
+
Point Cloud

再测试。

最后:

测试D:全系统压力

AI
+
Vision
+
SLAM
+
Planning
+
Network
+
Logging
+
EtherCAT
+
1kHz Control

然后比较:

                空载      满载
──────────────────────────────
平均周期          X         X
最大周期          X         X
最大调度延迟      X         X
IRQ延迟            X         X
Deadline Miss      X         X

如果:

非实时任务负载增加

而:

1kHz控制最坏情况指标

仍然保持在设计范围内,那么才能说明隔离设计真正产生了价值。

这也是实时系统和普通性能测试一个非常大的区别:

不是证明“系统很快”,而是验证“外部负载变化时,关键任务仍然可预测”。


结语:AI时代的机器人操作系统,真正难的是让“快”和“准”同时存在

机器人正在变得越来越智能。

同一台设备可能同时拥有:

AI
视觉
SLAM
大模型
规划
导航
运动控制
安全控制

这些任务对计算资源的需求完全不同。

AI希望:

更多算力
更多内存带宽
更高吞吐

而实时控制希望:

稳定CPU
稳定调度
稳定内存访问
低抖动
可预测延迟

两者并不矛盾。

真正的问题是:

能不能把它们放在同一台机器上,同时保证关键控制任务不被非实时任务破坏?

这就是实时任务隔离、核心隔离和资源隔离需要解决的问题。

最终,一个面向复杂机器人的实时系统,应该逐渐形成这样的结构:

                         Robot Computer
                              │
        ┌─────────────────────┼─────────────────────┐
        │                     │                     │
        ▼                     ▼                     ▼
    Real-Time             Safety Domain         AI Domain
        │                     │                     │
    1kHz Control          Safety Monitor          AI
    Servo                 Fault Handler            Vision
    EtherCAT              Protection               SLAM
        │                     │                     │
        ▼                     ▼                     ▼
    Dedicated CPU          Reserved CPU          CPU/GPU
        │                     │                     │
        └─────────────────────┼─────────────────────┘
                              │
                         Robot Hardware

这时,实时操作系统的价值就不再只是:

“让线程跑得更快。”

而是:

让不同任务拥有不同的时间边界、资源边界和故障边界。

这也是未来机器人操作系统非常重要的一条技术演进路线。

从ROS 2的角度来看,软件生态已经越来越成熟;从ros2_control的角度来看,控制框架已经逐渐标准化;而从操作系统角度来看,真正需要继续解决的问题就是:

如何让ROS 2、实时控制、AI和硬件在同一计算平台上长期稳定共存。

下一步,就可以继续往更底层走:

《ROS 2实时控制为什么需要安全隔离?当控制、AI和故障处理共用一颗CPU时,机器人如何保证“停得下来”?》

这样可以把前面的“实时隔离”进一步延伸到安全控制、故障处理和功能安全,形成“实时性 → 隔离 → 安全”的下一条技术线。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐