Cyber RT学习笔记---2.基础概念汇总

news2024/11/17 19:48:13

2.基础概念汇总

在前面我们介绍了Cyber RT的基础介绍以及框架方面的知识,我们对Cyber RT是一个什么样的系统和框架有了一个大概的认知。这节我们将介绍一下Cyber RT中的一些基础且关键的概念,搞清楚这些概念所代表的意义以及作用,之后我们再对Cyber RT的各个部分的详细过程以及使用方法进行细致的介绍。

这些概念我们将使用两种方法进行介绍,以保证我们对这些有一个大概的认知。首先我们会将这些概念与Ros中的概念进行对比介绍,以保证我们明白Cyber RT中这些概念与Ros中的概念的不同与相同,其次,我们会按照上节中所介绍的Cyber RT的框架的各个部分进行分门别类的介绍,以确保我们明白这些概念分别属于Cyber RT中的哪些部分以及相互之间的关系。

2.1 Cyber RT基础概念与ROS基础概念的对比

Cyber RT与ROS之间的对比如下图所示:
在这里插入图片描述

2.2 Cyber RT概念详解

接下来我们按照Cyber RT的框架进行相关概念的详细介绍。

2.2.1 基础库概念

(1)Lock-Free

		对象池
		队列

2.2.2 通信相关概念

(1)话题channel、Writer/Reader

在我们创建了Node之后,我们就可以使用Node去实例化Writer类和Reader类对Channel进行消息的推送和接收。

在使用时,我们需要标明Writer或者Reader推送或者接收的目标是谁,即要明确Topic;

而Channel可以看做是Topic对应的一块共享内存,这样我们就可以通过Writer/Reader进行数据的推送和接收了。

在此过程中使用的数据格式的定义是在对应的proto文件中。

该通信方式的使用场景:
适合于持续性通信的应用场景,比如雷达信号,摄像头图像信息这类数据的传输。

(2)服务server

服务Server的通信过程:
当客户端/Client发出消息请求获取某些数据的时候,服务端/Service才会进行对应的请求回应,并且将客户端需要的数据返回到指定的共享内存RTPS,客户端/Client自行从此共享内存取出数据。

在此过程中,Client与Server同样需要明确Topic是谁
RTPS可以看做是该Topic对应的一块共享内存。

Client和Service传输的数据依然在对应的proto文件中。
适用场景:
适用于不需要持续性发送数据

Service Discovery负责节点Node的监察。关于的详细介绍看这里:
Cyber - Service Discovery 模塊

(3)参数服务器ParameterServer

参数可以被看作是一些需要被各个模块共用或者使用过程中更改的“全局变量”。
Cyber RT中设计了全局参数服务器来实现这个功能,其通信依然基于RTps协议。

通过ParameterServer参数服务器我们可以对参数列表中的参数进行读取和更新,并且是客户端和服务端均可以进行该操作。

(4)数据通信基础Protobuf

Protobuf是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议,与XML和JSON格式相比,Protobuf更小、更快、更便捷。

Protobuf是跨语言的,并且自带一个编译器(protoc),只需要用protoc进行编译,就可以编译成Java、Python、C++、C#、Go等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。

只需要将要被序列化的结构化数据定义一次(在.proto文件定义),便可以使用特别生成的源代码(使用protobuf提供的生成工具)轻松的使用不同的数据流完成对结构数据的读写操作。甚至可以更新.proto文件中对数据结构的定义而不会破坏依赖旧格式编译出来的程序。

其优点如下:

性能效率高:序列化后字节占用空间比XML少3-10倍,序列化的时间效率比XML快20-100倍。
使用便捷便捷:将对结构化数据的操作封装成一个类,便于使用。
兼容性高:通信两方使用同一数据协议,当有一方修改了数据结构,不会影响另一方的使用。
跨语言:支持Java,C++,Python、Go、Ruby等多种语言。

(5)底层数据传输服务Transport

Cyber多进程通讯模块-Transport(Shared Memory篇)

Cyber 多進程通訊模塊 - Transport(Intra 和 rtps 篇)

(6)数据访问接口DataVisitor

DataVisitor(消息访问器)是一个辅助的类,一个数据处理过程对应一个DataVisitor,通过在DataVisitor中注册Notify(唤醒对应的协程,协程执行绑定的回调函数),并且注册对应的Buffer到DataDispather/消息分发器,这样在DataDispather/消息分发器工作的时候会通知对应的DataVisitor去唤醒对应的协程。

详细介绍看这里:
Cyber data_visitor 分析

(7)RoutineFactory

(8)节点Node

Node 跟rosnode在定位上有點像,都是負責上層的讀寫功能。
可以用Node::Reader在某channel (topic)中註冊回調,可以用Node::Writer把新的數據寫到channel中。

(9)通信管理Topology

			TopologyManager
				nodeManager(查找Node是否存在于Topology),
				ChannelManager(查找channel是否存在于Topology以及对应的Writer和Reader),					
				ServiceManager(查找Service是否存在于Topology以及对应的Server和client)

(10)小节

Cyber RT里面的元素之间的关系由Topology来表达并呈现
Topology相当于一个有向无环图DAG的描述
Node是有向无环图DAG里面的某个顶点
Channel是Writer流向Reader的边
Service是Server流向Client的边
Topology是由TopologyManager生成的,TopologyManager里面有三个内容:nodeManager(查找Node是否存在于Topology),ChannelManager(查找channel是否存在于Topology以及对应的Writer和Reader),ServiceManager(查找Service是否存在于Topology以及对应的Server和client)
TopologyManager依靠fast-rtps进行通信,可以监听元素加入和离开topology网络,可以自己注册channnelfunc来见听topology网络的变化
在这里插入图片描述

2.2.3 数据缓存/融合层

	多路传感器之间的数据融合
	算法需要缓存一定的数据

2.2.4 计算模型

(1)调度器Scheduler

Cyber - Scheduler 模塊
Scheduler自然是把一堆Task做調度,然後順調度結果執行,就跟一般os的scheduling一样。

Scheduler中的主要Task有甚麼?
注意,Scheduler並不是負責管理Cyber中所有內部模塊的執行,有很多內部模塊有自己的thread,它們的調度是由os去做的,而不是Scheduler。Scheduler只管以下2種Task:
(1)第一種就是Component自身處理數據的task,即是Component中Proc()的部份
它會從DataVisitor拿數據,再調用bool Component::Process(const std::shared_ptr& msg0, …),最後調用Proc(),這種task的task name就是在dag檔案中定義的Component名字,比如control
(2)第二種task,就是Node::Reader不停從DataVisitor拿數據,然後Enqueue到自身的Blocker容器,最後調用回調。
注意,Component一般是不會從中的reader拿數據來用的,除非是在is_reality_mode是False時,才會不生成第一種task,改為靠Reader去拿數據處理。
這種Task的使用比較靈活,因為你可以在自己的Componet中用this->node_->CreateReader去直接生成第二種Task
而這種Task的名字為Component Name + '’ + Channel Name,比如"control/apollo/planning"

在这里插入图片描述
Processor 1 Processor等於一個Thread,內部會設定cpu親和度,用cpuset去把Processor的內部線程綁定到特定cpu
SchedulerFactory 外部接口,生成跟取得Scheduler實體
Scheduler 放Task到ProcessorContext的地方
SchedulerClassic Scheduler的Classic模式實現
SchedulerChoreography Scheduler的Choreography模式實現
ProcessorContext Processor拿Task的地方
ClassicContext ProcessorContext的Classic模式實現
ChoreographyContext ProcessorContext的Choreography模式實現

(2)协程Coroutine

			算法任务的载体

(3)DAG

DAG有向无环图
DAG有向无环图的拓扑排序方法:
按照每个顶点的输入量/输入边的数目的多少进行排序,例如下图中,其排序为542310或者452310。4,5顶点无输入,2,3顶点有一个输入,1,0顶点有两个输入
在这里插入图片描述

(4)Native Thread/Processor

(5)调度算法

经典调度算法

(6)任务Task

任务Task的实现:CRoutine模块

2.2.5 接口

Cyber Rt框架建立在组件的概念之上。作为Cyber Rt的构建块,每个组件都是特定乐算法模块,它处理一组输入并产生一组输出。
在这里插入图片描述

在上述的介绍中,我们看到,在Node里面与之有关的概念有通信机制类(Writer/Reader;Server/Client;Channel;Service),节点调度类(DAG,Topology,TopologyManager以及NodeManager、ChannelManager、ServiceManager),但除此之外,在Node里面还有Component和TimerComponent的存在。

(1)Component组件Component类

继承于Component,需要自己重写init和proc函数,由输入数据进行驱动

(2)Component组件TimerComponent类

继承于Component,需要自己重写init和proc函数,由Timer维持的计数器来进行计时并驱动。

(3)Timer

cyber中自己的计时器

(4)协程相关接口

2.2.5 工具

(1)开发调试

(2)录制回访

(3)其他调试工具

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年9月DAMA-CDGA/CDGP数据治理认证火热招生中

DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业…

Android列表片段

下面创建第二个片段WorkoutFragment,它包含不同训练项目构成的一个列表,用户可以从这个列表中选择训练项目。 列表视图是只包含一个列表的片段 列表片段是一种专门处理列表的片段,它会自动绑定到一个列表视图,所以不需要另外创建…

【 Tkinter界面-练习03】实现动画

一、说明 在本教程中,我们将学习Python Tkinter Animation。在这里,我们将了解如何在 python 中使用 Tkinter 创建动画,并将介绍与动画相关的不同示例。我们还将讨论这些主题 二、Python Tkinter 动画 在本节中,我们将学习 Python…

服务器数据恢复- Ext4文件系统分区挂载报错的数据恢复案例

Ext4文件系统相关概念: 块组:Ext4文件系统的空间被划分为若干个块组,每个块组内的结构大致相同。 块组描述符表:每个块组都对应一个块组描述符,这些块组描述符统一放在文件系统的前部,称为块组描述符表。每…

【python爬虫】15.Scrapy框架实战(热门职位爬取)

文章目录 前言明确目标分析过程企业排行榜的公司信息公司详情页面的招聘信息 代码实现创建项目定义item 创建和编写爬虫文件存储文件修改设置 代码实操总结 前言 上一关,我们学习了Scrapy框架,知道了Scrapy爬虫公司的结构和工作原理。 在Scrapy爬虫公司…

基于IPV6带外BMC在中兴R5500G4服务器上安装ESXi7.0U3n

本文讲解通过IPV6方式从带外BMC在中兴R5500G4服务器上安装VMWare ESXi7.0U3n的过程。 一、安装环境 服务器: 中兴R5500G4服务器(2*16C/384GB MEM/2*480GB SSD/24*8TB SATA/12*960GB SSD/8*10Ge) ISO:VMware-VMvisor-Installer-7.0U3n-21930508.x86_64…

zabbix配置钉钉告警、和故障自愈

钉钉告警python脚本 cat python20 #!/usr/bin/python3 #coding:utf-8 import requests,json,sys,os,datetime # 机器人的Webhook地址 webhook"钉钉" usersys.argv[1] textsys.argv[3] data{"msgtype": "text","text": {"conten…

UniTask保姆级教程

目录 一、UniTask的简介和安装 https://github.com/Cysharp/UniTask.gitpathsrc/UniTask/Assets/Plugins/UniTask 空载性能测试 二、基础用法详解 三、基础用法扩展 四、进阶 五、VContainer简介 六、VContainer基础实例 方便快速查找 一、UniTask的简介和安装 项目地…

如何使用蚂蚁集团自动化混沌工程 ChaosMeta 做 OceanBase 攻防演练?

当前,业界主流的混沌工程项目基本只关注如何制造故障的问题,而经常做演练相关工作的工程师应该明白,每次演练时还会遇到以下痛点: 检测当前环境是否符合演练预设条件(演练准入); 业务流量是否满…

第四章网关

文章目录 Gateway服务网关为什么需要网关gateway快速入门断言工厂过滤器工厂路由过滤器的种类默认过滤器全局过滤器自定义全局过滤器 过滤器执行顺序 跨域问题什么是跨域问题 Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 S…

基于3D数字孪生系统开展水环境治理与修复的功能特点

“小水滴”折射“大民生”,城市供水是极为重要的民生工程、民心工程。上海市委、市政府始终把提高城市供水安全韧性摆在突出位置,着力打造更加完善、更高质量的城市供水网络体系,夯实筑牢城市供水生命线,确保城市水安全。经过多年…

TFTP服务器,NFS服务器

一,安装tftp服务器 1,什么是tftp服务器? tftp服务器是通过网络,将ubuntu程序下载到开发板中 2,安装步骤 1,保证连接外网成功 2,安装tftp服务器 sudo apt-get install tftp-hpa tftpd-hpat…

算法笔记 近似最近邻查找(Approximate Nearest Neighbor Search,ANN)

1 介绍 精准最近邻搜索中数据维度一般较低,所以会采用穷举搜索,即在数据库中依次计算其中样本与所查询数据之间的距离,抽取出所计算出来的距离最小的样本即为所要查找的最近邻。 当数据量非常大的时候,搜索效率急剧下降。——>…

公共实训中心物联网技术应用实训室建设方案

一、概述 1.1专业背景 物联网(Internet of Things)被称为继计算机、互联网之后世界信息产业第三次浪潮,它并非一个全新的技术领域,而是现代信息技术发展到一定阶段后出现的一种聚合性应用与技术提升,是随着传感网、通…

百度低质量站点怎么办?解决百度低质量站点的方法和工具

百度低质量站点怎么恢复?这是许多网站主和运营人员在SEO优化过程中经常面临的一个问题。百度作为中国最大的搜索引擎,对于网站收录和排名具有至关重要的影响。然而,由于各种原因,有些网站可能面临被百度降权或收录减少的情况。那么…

Netty服务端启动的整体流程-基于源码4.1.96Final分析

Netty采用的是主从Reactor多线程的模型,参考Scalable IO in Java,但netty的subReactor为一个组 一、从FileServer服务器示例入手 public final class FileServer {static final boolean SSL System.getProperty("ssl") ! null;// Use the …

RHCA之路---EX280(4)

RHCA之路—EX280(4) 1. 题目 Use the S2I functionality of your OpenShift instance to build an application in the rome project Use the Git repository at http://services.lab.example.com/php-helloworld for the application source Use the Docker image labeled re…

栈(Stack)的详解

目录 1.栈的概念 2.栈的模拟实现 1.栈的方法 2.模拟栈用(整型)数组的形式呈现 2.1栈的创建 2.2压栈 2.3栈是否为空 2.4出栈 2.5获取栈中有效元素个数 2.6获取栈顶元素 2.7完整代码实现 1.栈的概念 从上图中可以看到, Stack 继承了…

vite+vue3+element-plus

vitevue3element-plus 1.开始 npm create vitelatest app -- --template vuenpm installlnpm run dev2.引入element-ui npm install element-plus修改main.js import ElementPlus from element-plus import element-plus/dist/index.css createApp(App).use(ElementPlus).m…

剑指 Offer 65. 不用加减乘除做加法(简单)

题目: class Solution { public:int add(int a, int b) {while(b){ //总体思路:每一次加法器结果a上一次产生的进位数*进制数本位数,进制数为0的时候直接返回本位数a即可int carry a&b; //计算进位a a^b; //计算…