Cyber RT学习笔记 --- 1.Cyber RT框架介绍

1.Cyber RT框架介绍

1.1 Cyber RT简介

Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架,于2019年与Apollo 3.5开放平台同期发布,它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题,同时还提供了多种通信机制和用户级的协程,在资源有限的情况下会根据任务的优先级来进行调度处理。

如下图所示,Cyber RT通过Component来封装每个算法模块,通过有向无环图(DAG)来描述Components之间的逻辑关系。对于每个算法模块,都有其优先级、运行时间、使用资源等方面的配置。系统启动时,系统会结合DAG文件、调度配置等信息,创建相应的任务,从框架内部来讲,就是协程,然后图中间的调度器把任务放到各个处理器的队列中,最后由左上角Sensor输入的数据,驱动整个系统运转。
在这里插入图片描述

(1)Cyber RT定义

Cyber RT是百度Apollo推出的代替ROS的消息中间件,他是一个开源、高性能的运行实时框架。

(2) Cyber RT的应用背景

Apollo 3.5以前使用的系统为ROS,各节点之间的通信方式为进程间的通信。在实际的应用中,ROS在自动驾驶
领域遇到很多挑战:

首先ROS的算法模块以独立进程的形式存在,独立进程的节点的运行顺序无法确定,因此业务逻辑的调度顺序无法保证。

其次,ROS是一个分布式的系统,存在通信的开销。

此外,ROS系统中还存在其他很多不确定的地方,比如内存的动态申请。ROS的资源分配时不确定的,

(3) Cyber RT主要作用

Cyber主要的作用就是一个消息中间件,它们需要管理不同的模块,并让它们互相之间可以高效通信。在Apollo6.0中,它作为RTOS和自动驾驶各个模块的中间通信接口。

(4) Cyber RT 主要功能

Cyber是一个分布式收发消息,和调度的框架,同时对外提供一系列的工具和接口来辅助开发和定位问题。Cyber提供的功能主要包括一下方面:

消息队列: 主要作用是接收和发送各个节点的消息,涉及到消息的发布、订阅以及消息的buffer缓存等。
实时调度: 主要作用是调度处理上述消息的算法模块,保证算法模块能够实时调度处理消息。
用户接口: Cyber提供了灵活的用户接口
开发工具: 提供了一系列的工具包括消息监控(Cyber_monitor),消息可视化(Cyber_visualizer),录制/回放工具(Cyber_recorder), ros包录制(rosbag_to_recorder)。

1.1.1 框架优势

Apollo Cyber框架的优点主要有以下几点:

* 高性能:Apollo Cyber是专为自动驾驶定制的高性能运行时框架,能够处理高并发、低延迟、高吞吐等自动驾驶系统中的复杂任务。
* 灵活性:Apollo Cyber提供了多种通信机制和用户级的协程,可以根据任务的优先级来进行调度处理,能够灵活地应对各种自动驾驶场景。
* 可靠性:Apollo Cyber通过Component来封装每个算法模块,通过有向无环图(DAG)来描述Components之间的逻辑关系,能够确保系统各个模块之间的稳定性和可靠性。
* 扩展性:Apollo Cyber的架构可以支持各种不同类型和不同层次的自动驾驶任务,并且可以方便地扩展和升级。
*

1.1.2 框架结构

(1)粗略划分

在这里插入图片描述
Cyber RT的框架可以粗略的分为以上几个模块:

消息队列:主要作用是接收和发送各个节点的消息,涉及到消息的发布、订阅以及消息的缓存等
实时调度:主要是调度处理上述消息的算法模块,保证算法模块能够实时调度处理消息
用户接口:提供相关接口,将算法模块接入CyberRT的框架之内。
Log+Tool:提供高效的日志打印,以及一系列的工具,比如bag包播放,点云可视化,消息监控灯

总结起来就是,cyber是一个分布式收发消息,和调度框架,同时对外提供一系列的工具和接口来辅助开发和定位问题。

(2)详细划分

在这里插入图片描述详细一点的框架结构如上图所示:

* 第一层:主要是Apollo实现的基础库,比如有Lock-Free的对象池,Lock-Free的队列等。实现基础库可以减少相关的依赖并提高运行效率。
* 第二层、三层:主要是负责管理Cyber的通信机制,包括服务发现(负责管理通信中的Node节点)和Publish-Subscribe通信机制。并且Cyber也支持跨机、进程间、进程内通信,而且会根据不同的数据传输和业务逻辑自动选择效率最高最匹配的通信方式来进行通信。
* 第四层:主要是对传输过后的数据进行缓存,并会根据不同传感器得到的数据进行融合得到一个可处理可读的数据发送给另一个模块。
* 第五、六层:主要是管理每一个任务的调度和数据处理。
* 第七层:提供给开发者的一些API接口,让开发者有更多可操作性,提高开发效率。

1.2 框架各部分数据处理流程

我们先看下cyber中整个的数据处理流程,通过理解数据流程中各个模块如何工作,来搞清楚每个模块的作用。
在这里插入图片描述
如上图所示,cyber的数据流程可以分为6个过程:

Node节点中的Write往通道里面写数据
通道中的Transmitter发布消息,通道中的Receiver接收消息
Receiver接收到消息之后,触发回调,触发DataDispather进行消息分发
DataDispather接收到消息之后,把消息放入CacheBuffer中,并且触发Notifier,通知对应的DataVisitor处理消息
DataVisitor把数据从CacheBuffer中读出,并且进行融合,然后通过notifier_唤醒对应的协程
协程执行对应的注册回调函数,进行数据处理,处理完成之后进入睡眠状态

1.3 运行流程

在这里插入图片描述
上图为Cyber RT在开发过程中的运行流程:

算法模块通过有向无环图(DAG),配置任务之间的逻辑关系。对于每个算法,也有其优先级,运行时间,使用资源等方面的配置。
系统启用时,结合而dag,调度配置等,创建相应的任务,从框架内部来讲,就是协程,调度器把任务放到各个Processor队列中
然后,由Sensor输入数据,驱动整个系统运转

1.4 Scheduler调度器简介

ROS 的主要挑战之一是没有调度,为了解决 ROS 遇到的问题,Cyber RT 的核心设计将调度、任务从内核空间搬到了用户空间,在原生的thread上加了一层协程(Coroutine),Cyber RT主要调度的就是协程。调度可以和算法业务逻辑紧密结合。

从 Cyber RT 角度,OS 的 Native thread 相当于物理 CPU。在 OS 中,是内核中的调度器负责调度任务(进程、线程…)到物理 CPU 上运行。而在 Cyber RT 中,Cyber RT 中的调度器调度协程(Coroutine)在 Native Thread 上有序运行。

上面设计到的Native Thread与Processer是相同的概念。

1.4.1 调度策略

在这里插入图片描述
在这里插入图片描述

1.4.2 协程

协程,即线程更上一层的载体,Cyber RT调度器调度有状态的协程在各个线程上运行。协程不仅切换快,而且调度有着高确定性,不像线程的调度完全依赖操作系统。
在这里插入图片描述

1.4.3 调度

如何能够有效分配计算资源,是调度主要解决的问题。Cyber的调度主要是基于任务优先级来并行运行,主要的目的就是保证系统在资源有限的情况下来提高运行效率。如图所示是一个任务调度的示意图,首先在系统初始化时,会对每一个模块的Component进行创建并初始化,每个Component都会有一个proc()函数,proc函数主要是描述了每个需要处理的数据和数据处理的方法。在运行时,每当生成新的数据时,调度器会将数据和对应的proc函数绑定程一个可执行的task,然后放到Task queue中执行,Task queue是一个有序的列表,每当任务入队的时候,会根据任务本身的优先级和周期状态对Task queue里的人物进行重新排序,以确保高优先级的任务能被第一时间执行,Thread Pool是实际执行任务的线程池,根据不同的硬件配置会有固定数量的Worker,每个Worker会持续得从Task queue中读取可执行的任务并进行执行。

在这里插入图片描述

1.5 代码框架与层级简介

在这里插入图片描述
核心类是:
(1)Component和TimerComponent
(2)支撑component的是Node,Scheduler,Timer,DataVisitor
(3)Reader,Writer,ChannelImple,TimerTask

1.5.1 启动顺序

从代码启动顺序上来说如下图所示:
在这里插入图片描述

1.5.2 开发流程

从开发流程上来说,可以分为以下几个层级:
在这里插入图片描述

1.6 总结

(1)CyberRT 是基于 Fast-RTPS 进行消息驱动的,所以业务模块可以基于此进行数据通讯,这个和 ROS2 没有多大差别;

(2)CyberRT 通过 Node 节点进行通信的底层对接,而 Component 则负责具体业务相关的逻辑;CRoutine 基于消息驱动的基础上,将 Component 中的 Proc 回调作为基础的协程执行单元,然后根据 Sheduler 相应的调度策略进行调度,它保证了多任务的执行顺序;

(3)TimerComponent 依靠 Timer 进行定时触发,它的 proc 方法被封装成为 TimeTask 中的回调,TimingWheel 根据调度策略进行定时任务执行;

(4)CyberRT 强大之处在于它的 3 个拓扑网络,基于 fast-rtps 通过服务发现,能够快速找到相应的 Node 状态,也因为这个特性,这在我之前分析的系统监控 Monitor 中,能够轻松监控每个模块的健康状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/98008.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】STL-函数对象 + 谓词

1.函数对象使用 #include <iostream> using namespace std;//STL-函数对象&#xff08;仿函数&#xff09;class MyAdd { public:int operator()(int v1, int v2){return v1 v2;} }; //1、函数对象在使用时&#xff0c;可以像普通函数那用调用&#xff0c;可以有参数&am…

恒运资本:沪指涨逾1%,金融、地产等板块走强,北向资金净买入超60亿元

4日早盘&#xff0c;两市股指盘中强势上扬&#xff0c;沪指、深成指涨超1%&#xff0c;上证50指数涨近2%&#xff1b;两市半日成交约5500亿元&#xff0c;北向资金大举流入&#xff0c;半日净买入超60亿元。 截至午间收盘&#xff0c;沪指涨1.12%报3168.38点&#xff0c;深成指…

iKeyPrime完美解4G信号,可以登录iCloud,有消息通知,支持最新iOS16.6。

iKeyPrime是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone苹果手机&#xff0c;二网/三网恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone5S~X的所有型号&#xff0c;…

linux并发服务器 —— linux网络编程(七)

网络结构模式 C/S结构 - 客户机/服务器&#xff1b;采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互&#xff1b;C/S结构中&#xff0c;服务器 - 后台服务&#xff0c;客户机 - 前台功能&#xff1b; 优点 1. 充分发挥客户端PC处理能力…

【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「冀科数字」解题思路

第十届CCF大数据与计算智能大赛&#xff08;2022 CCF BDCI&#xff09;已圆满结束&#xff0c;大赛官方竞赛平台DataFountain&#xff08;简称DF平台&#xff09;正在陆续释出各赛题获奖队伍的方案思路&#xff0c;欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…

机器学习笔记之最优化理论与方法(六)无约束优化问题——最优性条件

机器学习笔记之最优化理论与方法——无约束优化问题[最优性条件] 引言无约束优化问题无约束优化问题最优解的定义 无约束优化问题的最优性条件无约束优化问题的充要条件无约束优化问题的必要条件无约束优化问题的充分条件 引言 本节将介绍无约束优化问题&#xff0c;主要介绍无…

Spring Boot 整合 Shiro(后端)

1 Shiro 什么是 Shiro 官网&#xff1a; http://shiro.apache.org/ 是一款主流的 Java 安全框架&#xff0c;不依赖任何容器&#xff0c;可以运行在 Java SE 和 Java EE 项目中&#xff0c;它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 …

avue实现用户本地保存自定义配置字段属性及注意事项(基于tj-vue2-tools)

avue实现用户本地保存自定义配置字段属性及注意事项&#xff08;基于tj-vue2-tools&#xff09; tj-vue2-tools项目地址&#xff1a;https://www.npmjs.com/package/tj-vue2-tools 文档请看项目官方 依赖js-base64 安装依赖 npm install js-base64安装 npm install tj-vue2-t…

Python综合案例(基本地图使用)

一、基本地图的使用 基本代码&#xff1a; """ 演示地图可视化的基本使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京", 99),("…

02-Flask-对象初始化参数

对象初始化参数 前言对象初始化参数import_namestatic_url_pathstatic_foldertemplate_floder 前言 本篇来学习Flask中对象初始化参数 对象初始化参数 import_name Flask程序所在的包(模块)&#xff0c;传__name__就可以 _name_ 是一个标识 Python 模块的名字的变量&#x…

网络协议从入门到底层原理学习(一)—— 简介及基本概念

文章目录 网络协议从入门到底层原理学习&#xff08;一&#xff09;—— 简介及基本概念一、简介1、网络协议的定义2、网络协议组成要素3、广泛的网络协议类型网络通信协议网络安全协议网络管理协议 4、网络协议模型对比图 二、基本概念1、网络互连模型2、计算机之间的通信基础…

配置本地maven

安装maven安装包 修改环境变量 vim ~/.bash_profile export JMETER_HOME/Users/yyyyjinying/apache-jmeter-5.4.1 export GOROOT/usr/local/go export GOPATH/Users/yyyyjinying/demo-file/git/backend/go export GROOVY_HOME/Users/yyyyjinying/sortware/groovy-4.0.14 exp…