2. Cyber RT基础

Cyber RT 是面向自动驾驶场景设计的实时分布式计算框架,它把“感知—预测—规划—控制”这类高并发、低延迟、强时序的任务组织成可调度、可观测、可复用的软件系统。理解 Cyber RT,不能只记住几个名词,而要抓住三条主线:运行时架构决定任务在哪里执行,通信机制决定数据如何在模块之间流动,记录回放模块决定数据如何被保存、复现与离线分析。本节围绕这三条主线展开,为后续的记录回放与数据分析工程打下概念基础。

一、Cyber RT 的分层架构

从整体上看,Cyber RT 可以划分为四层:最底层是基础库与操作系统抽象层,提供线程、锁、时间、日志、内存池等能力;其上是通信与调度层,包含通道(Channel)、节点(Node)、服务(Service)、调度器(Scheduler)等核心设施;再往上是组件层,即 Component,把算法逻辑封装成可加载、可配置、可复用的运行单元;最上层是应用与工具层,包括各功能模块、录制回放工具、可视化与数据分析工具。记录回放模块位于工具层,但它同时依赖通信层和组件层,因此它既是“工具”,也是整个数据闭环的入口与出口。

Cyber RT 分层架构与记录回放模块定位 应用与工具层 感知 / 预测 / 规划 / 控制模块 · cyber_recorder · cyber_play · 可视化与数据分析 组件层 Component Component 基类 · 定时/触发/消息驱动 · 配置加载 · 生命周期管理 通信与调度层 Node 节点 · Channel 通道 · Reader/Writer · Service · Scheduler 调度器 · Transport 传输 共享内存 / 进程内 / 进程间通信,按 QoS 与频率策略分发 基础库与 OS 抽象层 线程 / 锁 / 时间 / 日志 / 内存池 / 参数解析 / 文件与序列化 记录模块:订阅通道 → 落盘 .record cyber_recorder record -a 回放模块:读取 .record → 发布通道 cyber_recorder play -f demo.record 数据闭环

二、核心组件与概念

Cyber RT 的运行时由若干关键对象构成,理解它们的职责边界,是后续排查“数据为什么没收到”“回放为什么对不上时间”的前提。

  • Node(节点):模块在框架中的身份标识,负责创建 Reader、Writer 和 Service,是通信的入口。一个进程可以创建多个 Node,但通常按功能划分。
  • Channel(通道):消息传输的逻辑管道,用唯一名称标识,例如 /apollo/perception/obstacles。通道是记录与回放的最小操作单位。
  • Reader / Writer:通道两端的读写句柄。Writer 发布消息,Reader 订阅消息,二者通过通道名匹配,不直接持有对方引用。
  • Message(消息):基于 Protobuf 定义的结构化数据,具备版本兼容与高效序列化能力,是跨进程传输和落盘的基本单元。
  • Component(组件):对“Node + Reader/Writer + 处理逻辑”的封装,支持定时触发、消息触发等模式,是算法模块的标准形态。
  • Scheduler(调度器):决定组件在哪个线程、以何种优先级和频率执行,直接影响实时性。

三、通信机制:从发布订阅到落盘

Cyber RT 采用基于通道的发布/订阅模型。发送方通过 Writer 向某个 Channel 写入消息,接收方通过 Reader 订阅同名 Channel。框架根据通信双方的部署关系自动选择传输方式:同一进程内可走进程内零拷贝路径,跨进程可走共享内存,跨主机则走网络传输。对上层算法而言,这些差异被屏蔽,开发者只需关心通道名和消息类型。

记录回放模块正是建立在这一通信机制之上:记录时,它以订阅者身份挂载到指定通道,把收到的消息按时间戳顺序写入 .record 文件;回放时,它读取文件,按原始时间戳或指定速率,把消息重新发布到对应通道,使下游组件仿佛仍在接收实时数据。因此,记录文件不是简单的日志,而是可重放的通道数据流。

# 查看当前系统中的通道
cyber_channel list

# 查看某通道的发布/订阅关系与频率
cyber_channel info /apollo/perception/obstacles

# 录制所有通道
cyber_recorder record -a

# 录制指定通道
cyber_recorder record -c /apollo/perception/obstacles /apollo/planning

# 回放记录文件
cyber_recorder play -f demo.record

# 查看记录文件信息
cyber_recorder info demo.record

四、记录回放模块的定位与典型场景

在工程实践中,记录回放模块承担三类角色。第一是数据采集:路测时录制关键通道,形成可追溯的数据资产。第二是问题复现:现场出现异常后,用记录文件在实验室内反复回放,稳定复现问题,避免“一次错过、无法重来”。第三是离线验证:算法迭代后,用同一份记录数据对比新旧版本输出,实现可重复的回归测试。

场景 操作对象 关键命令/参数 关注点
路测数据采集 全部或指定通道 record -a / record -c 磁盘容量、通道完整性
问题复现 单条记录文件 play -f demo.record 时间戳对齐、回放速率
算法回归 固定数据集 play -f + 离线组件 输出一致性、指标对比
通道排查 通道元信息 channel info 频率、订阅者数量
记录文件中的时间戳来自消息产生时刻,而非落盘时刻。回放时若使用 -r 调整速率,或使用循环回放,必须确认下游组件是否依赖真实时间间隔,否则可能得到与实车不一致的结论。

五、常见误区与复盘要点

初学者最容易犯的错误,是把“通道名”当成“模块名”。通道是数据接口,模块是执行单元,一个模块可以发布多个通道,一个通道也可能被多个模块订阅。第二个误区是忽略消息类型:回放时若下游订阅的消息类型与记录中的类型不一致,反序列化会失败,表现为“有数据但解析为空”。第三个误区是认为录制就是全量保存:实际上未订阅的通道不会被记录,因此录制前必须确认通道清单。

回放不是“重新跑一遍实车”。它复现的是数据流,不是传感器物理过程和控制闭环。涉及执行器反馈、车辆动力学和真实时延的验证,仍需结合仿真或实车测试,不能仅凭回放结果下结论。

复盘时建议按以下顺序检查:先确认记录文件包含哪些通道与时间范围,再确认回放时通道名和消息类型是否匹配,然后检查下游组件是否真正订阅成功,最后核对时间戳与回放速率是否符合预期。把这条链路走通,记录回放就不再是“黑盒工具”,而是可定位、可验证的数据分析基础设施。