1. 课程导入

在自动驾驶与智能机器人系统中,软件需要同时处理感知、定位、预测、规划、控制等多类任务,这些任务往往以不同频率运行,并通过大量消息彼此协作。传统基于 ROS 1 的通信模型在时延、确定性和资源调度上逐渐难以满足车规级量产需求。Cyber RT 正是为高吞吐、低时延、强实时场景设计的运行时框架,它把“计算任务”抽象为组件,把“数据交换”抽象为通道,从而让开发者能够以声明式方式搭建复杂的数据流水线。

本课程围绕两条主线展开:数据通道与组件开发。数据通道解决“数据如何高效、可靠、可观测地流动”;组件开发解决“计算逻辑如何被组织、调度与复用”。二者共同构成 Cyber RT 应用开发的核心能力。

一、Cyber RT 的定位:从通信中间件到运行时框架

Cyber RT 并不是单纯的“消息队列”,而是一个完整的运行时框架。它向下封装操作系统线程、共享内存、网络传输与调度策略,向上提供节点、通道、服务、参数、定时器等编程接口。其关键定位可以概括为三点:

  • 确定性调度:通过协程与调度器配合,减少线程切换与锁竞争,保证关键链路时延可控。
  • 零拷贝与共享内存:同一主机内的大块数据(如点云、图像)通过共享内存传递,避免序列化与复制开销。
  • 组件化复用:算法以 Component 形式封装,通过配置文件声明输入输出通道,便于替换与组合。

一句话理解:Cyber RT = 通信中间件 + 调度运行时 + 组件容器。数据通道是“血管”,组件是“器官”,调度器是“心跳”。

二、整体知识框架与数据流全景

下图展示了本课程的知识框架:左侧是数据通道相关能力,右侧是组件开发相关能力,中间通过调度器与运行时连接。理解这张图,有助于建立后续章节的坐标感。

Cyber RT 数据通道与组件开发知识框架 数据通道主线 Node 节点与 Channel 通道 创建、读写、发现与命名规范 消息与 Protobuf 定义 IDL、序列化与版本兼容 传输机制与 QoS 共享内存、零拷贝、可靠性策略 工具链与可观测性 cyber_monitor、channel 统计、日志 性能调优与排障 时延、丢包、背压与内存分析 组件开发主线 Component 组件模型 Init / Proc / 生命周期 DAG 与配置文件 dag 文件、通道绑定、参数注入 调度策略与协程 CLASSIC / CHOREOGRAPHY 服务、参数与定时器 Service、Parameter、Timer 测试、部署与工程化 单元测试、集成、打包与上线 Cyber RT 运行时 调度器 · 传输层 · 发现服务 数据通道负责“流动”,组件负责“计算”,运行时负责“调度与连接”

三、学习目标与实战路线

完成本课程后,你应当能够独立完成一个可运行的 Cyber RT 应用:定义消息、编写组件、配置 DAG、启动运行、观测通道并定位性能问题。具体目标如下:

  1. 理解 Cyber RT 的节点、通道、组件、调度器四类核心概念及其关系。
  2. 能够使用 Protobuf 定义消息,并通过 Channel 完成跨组件通信。
  3. 能够编写 Component 并正确实现 Init 与 Proc 回调。
  4. 能够编写 dag 配置文件,完成通道绑定、参数注入与调度策略选择。
  5. 能够使用 cyber_monitor、cyber_channel 等工具观测数据流并排查异常。
  6. 能够针对时延、丢包、CPU 占用等问题进行基础调优。

实战路线建议按“先跑通、再理解、后优化”的顺序推进。下面给出一个典型的最小可运行工程结构,后续章节会逐步填充每个文件的内容。

my_cyber_demo/
├── BUILD
├── conf/
│   └── demo.dag
├── proto/
│   └── demo_msg.proto
└── src/
    ├── driver_component.cc
    ├── driver_component.h
    ├── process_component.cc
    └── process_component.h

四、核心概念对照与常见误区

初学者最容易混淆的是“通道”和“组件”的职责边界。下表给出对照,帮助建立正确的心智模型。

维度 数据通道 Channel 组件 Component
核心职责 承载并传输消息 执行计算逻辑
关注点 时延、吞吐、可靠性、QoS 算法正确性、调度频率、资源占用
配置方式 通道名、消息类型、传输策略 dag 文件中的 readers/writers 绑定
常见问题 丢包、背压、序列化开销 阻塞、超时、线程竞争
观测工具 cyber_monitor、cyber_channel 日志、性能剖析、调度统计

常见误区一:把 Channel 当成“函数调用”。Channel 是异步数据流,写入后并不保证立即被消费,也不保证消费顺序与写入顺序完全一致,除非显式配置可靠性策略。

常见误区二:在 Proc 中执行耗时阻塞操作。Proc 运行在调度器管理的协程中,长时间阻塞会拖慢同调度组内的其他组件。

常见误区三:忽略消息定义版本兼容。Protobuf 字段编号一旦发布不应随意修改,否则会导致上下游解析失败。

五、案例场景:一个感知到控制的闭环

假设我们要搭建一个简化闭环:摄像头驱动组件发布图像,感知组件订阅图像并输出障碍物,规划组件订阅障碍物并输出轨迹,控制组件订阅轨迹并输出控制指令。每个箭头都是一条 Channel,每个方框都是一个 Component。这个场景贯穿本课程:

  • 驱动组件使用 Timer 定时触发,按固定频率写入图像通道。
  • 感知组件以图像通道为输入,输出障碍物通道,采用 CLASSIC 调度。
  • 规划与控制组件通过 dag 文件串联,形成有向无环图。
  • 通过 cyber_monitor 观察各通道频率与延迟,定位瓶颈环节。

学习建议:每学完一个知识点,就在自己的最小工程中增加一个组件或一条通道,并立即用工具观测效果。Cyber RT 的很多特性只有在真实运行时才能被直观感受到。