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 定义模块拓扑结构的配置文件