小白能看懂的CyberRT学习笔记

0. 简介

Apollo Cyber RT 是专为自动驾驶场景设计的开源、高性能运行时框架。 基于中心化计算模型,主要价值是提升自动驾驶系统的高并发、低延迟、高吞吐。

Apollo 并不是一开始就使用 CyberRT,在 v3.0 之前用的都是基于 ROS 框架进行开发。但在之前的版本中发现了很多问题,随着 Apollo 的发展,对最高水平的稳健性和性能的需求, Apollo Cyber RT 应运而生,它满足了一个面向商业化的自动驾驶解决方案的基础需求。

1. CyberRT结构

CyberRT 是一堆庞大复杂的代码,我们从cyber.h入手,可以看到这里面只有一个 CreateNode 方法,返回的是 Node 的引用。根据头文件引用及对代码的敏感性,刨去一些 log、time 之类的辅助类代码,我相信 CyberRT 中这些概念很重要:

  • component
  • node
  • task
  • timer

所以,研究 CyberRT 得到 CyberRT 全貌,我们可以从这些概念相应的代码入手。这里就不详述了,frank909大佬的文章讲的非常详细了,

总而言之,核心类是 Component 和 TimerComponent;支撑 component 的是 Node、Scheduler、Timer、DataVisitor;其他的 Reader、Writer、ChannelImple、TimerTask 等等是具体的细节相关类。

2. CyberRT架构

Cyber RT的框架如下图所示:

  1. 基础库:Cyber RT为了高性能和减少依赖,实现了自己的基础库。(Lock-free的对象池,队列)
  2. 通信层:Publish/Subscribe机制,Service/Client机制,服务自发现,自适应的通信机制(共享内存、Socket、进程内存)
  3. 数据缓存/融合层:数据缓存与融合。多路传感器之间数据需要融合,而且算法可能需要缓存一定的数据。比如典型的仿真应用,不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用
  4. 计算层:计算模型,任务以及任务调度
  5. 接口: Cyber RT为开发者提供了component类,开发者的算法业务模块只需要继承该类,实现其中的proc接口即可。该接口类似于ROS的callback,消息通过参数的方式传递。此外Cyber RT也提供了并行计算的相关接口以及用于开发调试、录制回放的工具。

3. CyberRT的运行流程

  1. 算法模块:算法模块通过有向无环图(DAG, Directed Acyclic Graph)配置任务间的逻辑关系。每个算法都可以进行优先级、运行时间、使用资源等方面的配置。
  2. 创建任务:Cyber RT可以结合DAG创建任务,任务的实现方式不是thread,而是协程(coroutine)。
  3. 调度器:调度器根据调度、任务配置将任务放入相关Processor的队列中。
  4. 数据输入: Senor输入数据驱动系统的运转。

…详情请参照古月居

猜你喜欢

转载自blog.csdn.net/lovely_yoshino/article/details/132298840