简介
Cyber RT是一个runtime framework,可以理解为百度针对ROS 1在自动驾驶环境下的一些天生缺陷做的一套自己的框架(很多缺陷在ROS 2中得到了解决但ROS 2迟迟不见稳定版本),它介于底层的RTOS和上层算法之间。Cyber RT的目标是做到高并发,低延迟以及高吞吐,这些特性都是自动驾驶任务所必须的。
架构
以下为Cyber RT最主要的软件模块
- Apollo实现了最下层的基础库,比如Lock-Free的对象池,Lock-Free的队列等。这么做的目的一个是提高效率,另一个就是减少依赖。
- 通信机制(从下往上第2,3层),包括服务发现和Publish-Subscribe通信机制。Cyber RT也支持跨进程、跨机通信,上层业务逻辑无需关心,通信层会根据算法模块的部署,自动选择相应通信机制。
- 通信层之上的数据缓存/融合层(第4层)。不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用。
- 再往上是计算模型,包括调度层和任务。
- 最上面是提供给开发者的接口层。
上面这张图更清晰地展现了整个cyber的结构,之后连载的文章会大体按照模块-调度-通信的顺序来解析cyber代码。下面这张图是另外一位博主画的,链接在参考里给出,可以作为整体代码结构参照。
调度
- 将调度、任务从内核空间放到了用户空间,在原生的thread上加了一层协程(Coroutine),Cyber RT主要调度的就是协程。
- 调度编排策略,很好的结合了业务逻辑、数据共享和算力的平衡。并且任务不会在不同CPU上随机的调度来调度去,具有非常好的Cache友好性。通过多队列减少并发瓶颈,并且集成了一些独占的策略。
- 协程,即线程更上一层的载体,Cyber RT调度器调度有状态的协程在各个线程上运行。协程不仅切换快,而且调度有着高确定性,不像线程的调度完全依赖操作系统。
通信
上层业务逻辑无需关心,通信层会根据算法模块的部署,自动选择相应通信机制。
预告
本系列有关cyber的后续博客写作时间为2019年末至2020年,Apollo的版本是5.0。在阅读文章时为了便于理解需要同时对照cyber的代码(全粘到文章里实在太多了)。