一 初识
ROS无法调度协调,且通信开销大,耗资源。百度自动驾驶团队开发了Cyber RT。
CyberRT从下到上依次为:
基础库:高性能,无锁队列;
通信层:Publish/Subscribe机制,Service/Client机制,服务自发现,自适应的通信机制(共享内存、Socket、进程内);
数据层:数据缓存与融合。多路传感器之间数据需要融合,而且算法可能需要缓存一定的数据。比如典型的仿真应用,不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用;
计算层:计算模型,任务以及任务调度;
此外,相比Ros,CyberRT增加了Component组件,组件之间通过 Cyber channel 通信。Cyber RT 中用Message实现模块间通信,其实现基于 protobuf。同时,CyberRT也支持异步计算任务,优化线程使用与系统资源分配,同时支持定义模块拓扑结构的配置文件。
但是CyberRT也存在用户经验少的短板,同时资源也没有Ros全面。
二 组件
早期,没有组件,使用一个公共基类。所有模块都继承此基类。
Component 是 Cyber RT提供的用来构建功能模块的基础类,可以理解为Cyber RT对算法功能模块的封装,配合Component对应的DAG文件,Cyber RT可实现对该功能模块的动态加载。以Apollo为例, Apollo 中所有的模块都由 Component 构建的。
被 Cyber RT加载的 Component 构成了一张去中心化的网络。每一个Component是一个算法功能模块,其依赖关系由对应的配置文件定义,而一个系统是由多个component组成,各个component由其相互间的依赖关系连接在一起,构成一张计算图。
下图是具有3个component,2个channel的简单网络:
2.1 Component 的优点
相较于在 main() 函数中写通信逻辑并编译为单独的可执行文件的方法,Component 有以下优点:
- 可以通过配置 launch 文件加载到不同进程中,可以弹性部署。
- 可以通过配置 DAG 文件来修改其中的参数配置,调度策略,Channel 名称。