# Apollo Cyber​​ RT 框架 ## 简介 Apollo Cyber RT 是一个开源、高性能的运行时框架,专为自动驾驶场景而设计。针对自动驾驶的高并发、低延迟、高吞吐量进行了大幅优化。 在 Cyber RT 中,有以下几个重要概念: - **节点**(Node):一个可与其它节点进行数据通信的实体。在整个系统中,节点不能重名,否则会冲突。节点可以注册订阅、注册发布从而与其它节点通信。 - **通道**(Channel):用于节点间的通信。节点在注册订阅或发布时需要指定使用的通道名,注册后就能收到该通道里的消息或向通道里写入消息。 - **消息**(Message):是指在通道中传递的数据内容。消息的内容是用 protobuf 的格式事先约定的。 Cyber RT 支持跨进程通信,这个功能使得在同一计算机内的各个进程可以相互通信。在汽车系统上运行的软件,其实是多个互相独立的进程组成的。比如,图像采集是一个进程,控制底盘是另一个进程,它们互相独立,互不干涉,但通过 Cyber RT 就可以相互通信、相互协作。这也使得软件开发的协作变得更加容易。 除了跨进程通信,Cyber RT 也支持跨机通信,因此可以实现汽车与上位机软件之间的通信,实现发送指令、显示图像的功能。 ![](./images/Apollo-CyberRT-Communication.png) > 图:Cyber RT 跨进程、跨机通信示意图 ## 优势 Apollo Cyber RT 具有以下优势: - **加速开发**。具有数据融合功能的定义明确的任务接口,提供一系列开发工具,拥有大量传感器驱动程序。 - **简化部署**。高效自适应的消息通信,具有资源意识的可配置用户级调度程序,可移植,依赖更少。 - **为自动驾驶赋能**。默认的开源运行时框架,为自动驾驶搭建专用模块。 ## 工具 ### cyber_monitor `cyber_monitor` 是 Apollo Cyber RT 提供的监控工具,提供了终端中实时显示 channel 信息列表的功能。在开发调试过程中,可用于查看 Cyber RT 框架下相互通信的数据。 ### cyber_recorder `cyber_recorder` 是 Apollo Cyber RT 提供的播放工具,可以用来播放 record 文件。Record 是 Apollo 记录数据的一种数据格式,后缀是 `.record`。 ### cyber_visualizer `cyber_visualizer` 是一款用来显示 channel 数据的可视化工具。 ## 常用术语 ### Component 在自动驾驶系统中,模块(如感知、定位、控制系统等)在 Cyber RT 下以 Component 的形式存在。不同 Component 之间通过 Channel 进行通信。Component 概念不仅解耦了模块,还为将模块拆分为多个子模块提供了灵活性。 ### Channel Channel 用于管理 Cyber RT 中的数据通信。用户可以发布/订阅同一个 Channel,实现 P2P 通信。 ### Task Task 是 Cyber RT 中异步计算任务的抽象描述。 ### Node Node 是 Cyber RT 的基本组成部分。每个模块都包含一个 Node 并通过 Node 进行通信。通过在节点中定义 Reader/Writer 或 Service/Client,模块可以具有不同类型的通信形式。 ### Reader/Writer Reader/Writer 通常在 Node 内创建,作为 Cyber RT 中的主要消息传输接口。 ### Service/Client 除 Reader/Writer 外,Cyber RT 还提供了用于模块通信的 Service/Client 模式。它支持节点之间的双向通信。当对服务发出请求时,客户端节点将收到响应。 ### Parameter 参数服务在 Cyber RT 中提供了全局参数访问接口。它是基于 Service/Client 模式构建的。 ### 服务发现 作为一个去中心化的框架,Cyber RT 没有用于服务注册的主/中心节点。所有节点都被平等对待,可以通过“服务发现”找到其他服务节点。使用 `UDP` 用来服务发现。 ### CRoutine 参考协程(Coroutine)的概念,Cyber RT 实现了 Coroutine 来优化线程使用和系统资源分配。 ### Scheduler 为了更好地支持自动驾驶场景,Cyber RT 提供了多种资源调度算法供开发者选择。 ### Message Message 是 Cyber RT 中用于模块之间数据传输的数据单元。 ### Dag 文件 Dag 文件是模块拓扑关系的配置文件。您可以在 dag 文件中定义使用的 Component 和上游/下游通道。 ### Launch 文件 Launch 文件提供了一种启动模块的简单方法。通过在 launch 文件中定义一个或多个 dag 文件,可以同时启动多个模块。 ### Record 文件 Record 文件用于记录从 Cyber RT 中的 Channel 发送/接收的消息。回放 Record 文件可以帮助重现 Cyber RT 之前操作的行为。 ## 附录:Cyber RT 框架与 ROS 关键字对比 | Cyber RT | ROS | 注释 | | -------------- | ----------------- | ------------------------------------------------------------ | | Channel | Topic | channel 用于管理数据通信,用户可以通过 Reader/Writer 相同的 channel 来通信 | | Node | Node | 每一个模块包含 Node 并通过 Node 来通信。一个模块通过定义 read/write 和 / 或 service/client 使用不同的通信模式 | | Reader/Writer | Publish/Subscribe | 订阅者模式。往 channel 读写消息的类。 通常作为 Node 主要的消息传输接口 | | Service/Client | Service/Client | 请求 / 响应模式,支持节点间双向通信 | | Message | Message | Cyber RT 中用于模块间通信的数据单元。其实现基于 Protocol Buffers | | Parameter | Parameter | Parameter 服务提供全局参数访问接口。该服务基于 service/client 模式 | | Record file | Bag file | 用于记录从 channel 发送或接收的消息。 回放 record file 可以重现之前的操作行为 | | Launch file | Launch file | 提供一种启动模块的便利途径。通过在 launch file 中定义一个或多个 DAG 文件,可以同时启动多个 modules | | Component | 无 | 组件之间通过 Cyber channel 通信 | | Task | 无 | 异步计算任务 | | CRoutine | 无 | 协程,优化线程使用与系统资源分配 | | Scheduler | 无 | 用户空间任务调度器 | | Dag file | 无 | 定义模块拓扑结构的配置文件 |