1. CyberRT 是什么?
Apollo Cyber RT 是专为自动驾驶场景设计的开源、高性能运行时框架。 基于中心化计算模型,主要价值是提升自动驾驶系统的高并发、低延迟、高吞吐。
Apollo 并不是一开始就使用 CyberRT,在 v3.0 之前用的都是基于 ROS 框架进行开发。但在之前的版本中发现了很多问题,随着 Apollo 的发展,对最高水平的稳健性和性能的需求, Apollo Cyber RT 应运而生,它满足了一个面向商业化的自动驾驶解决方案的基础需求。
CyberRT 最明显的 3 个优点:
- 加速算法
- 简化部署
- 增强自动驾驶系统能力
本文的目的有 2 个:
- 弄清楚 CyberRT 的整体框架结构
- 弄清楚 CyberRT 内部大致协作机制
2. CyberRT 里面有什么?
CyberRT 是一堆庞大复杂的代码,因为我只是一个学习者,我事先也并不知道 CyberRT 的架构图,所以,也只能从代码中分析并从中找线索。
我注意到 Cyber 目录下有 cyber.h 这个文件,我认为它可能是最源头或者是最基础的元素,所以选择了从 cyber.h 入手。
这里面只有一个 CreateNode 方法,返回的是 Node 的引用。根据头文件引用及对代码的敏感性,刨去一些 log、time 之类的辅助类代码,我相信 CyberRT 中这些概念很重要:
- component
- node
- task
- timer
所以,研究 CyberRT 得到 CyberRT 全貌,我们可以从这些概念相应的代码入手。
2.1 Node
在 Node.h 文件中发现了很多有意义的东西。
注释中有提到一些关键信息:
- Node 是 CyberRT 的基础构件
- 任何 Module 包含相应的 Node
- Module 之间的通信也是通过 Node 进行交互
- Node 之间的通信可以设定不同的模式
- Read/Write 是一种 Node 之间的通信方式
- Service/Client 是另外一种 Node 之间的通信方式
另外,node 中的private属性指示了一些关键的成员变量
我们可以知道一个 Node 有一系列相关的 Reader。
也可以有相应的 NodeChannelImpl 和 NodeServiceImpl。
2.2 Reader
注释说了 3 点:
- Reader 通过订阅 Channel 获取信息
- 收到信息时会触发传递到 Reader 的回调 callback
- 也可以监听 Blocker 中的缓存信息
而上面的代码可以告诉我们,Reader 会和一种 Topology 网络发生关系,可以加入,也可以卸载。
并且, Reader 和 Channel 是相关联的,由 Chann