Apollo进阶课程㉝丨Apollo ROS原理—2

原文链接:进阶课程㉝丨Apollo ROS原理—2

在ROS系统中,从数据的发布到订阅节点之间需要进行数据的拷贝。在数据量很大的情况下,很显然这会影响数据的传输效率。所以Apollo项目对于ROS第一个改造就是通过共享内存来减少数据拷贝,以提升通信性能。

上周阿波君为大家详细介绍了「进阶课程㉜Apollo ROS原理—1」。

此课程先从三个方面阐述了ROS的不足,第一,大数据传输性能瓶颈;第二,单中心的网络存在单点风险;第三,数据格式缺乏后向兼容。此外,还详细的介绍了Apollo ROS对ROS的改进,对其通信性能进行的优化。

本周阿波君将继续与大家分享Apollo ROS原理—2的相关课程。下面,我们一起进入进阶课程第33期。

目前ROS仅适用于Apollo 3.0之前的版本,最新代码及功能还请参照Apollo 3.5及5.0版本。

目录

1.Apollo ROS对ROS的改进

​2.去中心化网络拓扑

去中心化网络拓扑的原因

使用RTPS服务发现协议实现完全的P2P网络拓扑

3.数据兼容性扩展

数据兼容性扩展的原因

深度融合Protobuf功能,实现数据兼容性扩展


1.Apollo ROS对ROS的改进


2.去中心化网络拓扑

去中心化网络拓扑的原因

ROS是以Rosmaster节点管理器建立起来的一个P2P拓扑网络,这种拓扑网络有很明显的优势,如下:

  1. 节点之间相互独立,容错性比较强。
  2. 每个模块用不同的语言去开发,对其它的模块是透明的,其它模块不用关注和它通信的数据节点以及模块使用什么语言来开发。
  3. 模块开发之间是比较解耦合的,你只要定义好使用Topic/Service/Param的信息,然后按照这个格式去开发自己的模块。

但是也有两个比较明显的缺点。

  • 第一,节点之间的通信过于依赖Rosmaster单点。两个节点进行通信的链路过程,大概分为五部。第一步:发送节点去向Master注册一个发送节点。第二步:接收节点去向Master注册一个接收节点。第三步:Master向接收节点发送一个已有发送节点的一个信息拓扑。第四步:接收节点拿到这个拓扑信息之后去向发送节点请求建立一个tcp连接。第五步:在发送节点和接收节点建立一个P2P的单点拓扑连接之后就持续不断的向接收节点发送信息。整个过程中对Master依赖包含三步,在建立实际通信之后,对Master的依赖可能会降低很多,但是在建立之前是比较依赖Master节点的。
  • 第二,ROS没有提供一种异常恢复机制。如果某一个节点挂掉,尤其是Master节点挂掉,其它的节点却不知道发生了这样的行为,还会认为整个系统运行仍然处在正确的状态中。比如发送节点里面有一些Service或者Param相关的请求,它还是会照常去发请求或者是设置这个参数信息,这样就会产生一些不可控的行为。

Master单点在多机的方案里,这个单机单点的不足就会更加凸显。比如现在很多自动驾驶厂商所采用的比较主流的Nvidia Drive PX2板卡,它就包括两个系统:一个主系统,一个是冗余备份系统即容错系统。如果使用ROS通信在PX2上进行部署,Master只能起在一个节点上。如上图所示:左侧是它的主系统,右侧是它的冗余备份系统。当主系统里面Rosmaster宕机之后,备份系统里面的节点其实并不知道Rosmaster已经处于一个宕机的状态,那么备份系统就起不到其目的和意义了。因为此时整个系统处于一个功能不完整的状态,所以就失去了冗余备份的意义。

使用RTPS服务发现协议实现完全的P2P网络拓扑

Apollo ROS进行了比较大的改造:先把这个中心化的网络拓扑给去掉,然后建立了一个点对点之间的一个复杂网络拓扑,主要是使用RTPS服务发现协议去完成P2P网络拓扑。如上图所示:右侧是ROS Node的一个框架图。左下角是引入RTPS服务相关的一些功能。其它部分是ROS Node现有的一些功能。Ros Node是分层级式的结构,最上层是Handler,Handler提供节点和ROS整个通信的基本交互的句柄。下一层左侧和右侧定义了这个节点发送和订阅的Channel信息。再下一层是Middleware,Middleware是这个节点和其它节点进行通信的时候去完成链路的建立和数据的发送。

接下来的一层左下角RTPS是新引入的一个功能。改造之后的ROS Node架构,当一个节点被启动的时候,它会通过RTPS向所有的节点发送信息:现在有一个新的节点要加入到这个拓扑网络。当它离开的时候,也会发送消息告诉所有的节点:现在这个节点要退出。以前这些功能都是通过Rosmaster来完成的。

下面通过几张图来描述:节点建立连接和通讯的一个主要流程。

第一步:Sub节点启动,通过组播向网络注册

订阅节点在启动的时候,它会向当前这个域里面所有的节点发送信息:现在有一个新的节点要启动。

第二步:通过节点发现,两两建立unicast

所有的节点在接收到新加入这个节点发生拓扑信息变更之后,会和新加入这个节点分别建立两两连接关系。

第三步:向新加入的节点发送它们已经有拓扑信息

所有已经存在的节点会向新加入的节点发送它们已经有拓扑信息,也就是在新节点加入之前每个节点其实是维护了它和其它所有节点的一个连接关系,这个连接关系发送给接收节点,供接收节点去更新自己的网络拓扑结构。

第四步:收发双方建立连接,开始通信

当新加入节点接到所有节点发送出来的历史拓扑信息之后,它会根据它自己注册的实际消息内容去决定和哪些节点建立实际的通信连接。如上图所示:新加入节点只和右下角的一个节点之间有拓扑关系,它除了维护所有的节点给它发送出的整个网络拓扑信息之外,同时会和发送节点建立点对点的通信连接。

通过RTPS拓扑发现方式,Apollo ROS去除了对Rosmaster这一个单点的依赖,从而提升整个系统的鲁棒性。这个修改完全是对ROS底层的修改,用户基于原生ROS代码写的节点程序,到Apollo ROS是完全兼容的一个迁移即开发者不需要去改动任何的接口,就可以直接使用RTPS网络拓扑这种新的关系建立。


3.数据兼容性扩展

数据兼容性扩展的原因

原生ROS基于Message的订阅发布消息模型。发送者和接收者在进行实际通讯之前需要进行消息格式定义,其包含字段:基础的数据类型或者复杂的数据类型。在它们进行消息通信的时候,才可以有选择性的去建立通信连接和数据实际发送。如果有一个节点订阅的消息类型不是Channel预先指定的消息类型,这种通信连接是建立不起来的。或是强制指定一个节点去订阅某一种类型的Channel信息,但是它的实际回调函数里却写的是另外一种消息类型,这种编译可能在实际运行的时候就会报相关的一些错误。

Message是两个节点进行消息通信的抽象描述文件。这个描述文件提前定义好两个节点之间进行消息通信的基本数据类型。ROS采用这种方式是因为能比较大概率地对两个节点之间进行解耦合,同时两个节点之间也是跨语言的,即不需要关注两个节点是用什么语言写的,都可以通过这种描述文件去进行实际的消息通信。通过Message通信的时候接、收节点在接受到信息之后,会进行MD5的校验、验证这个消息是否符合它的预先订阅,或者是在使用消息之后才会去进行消息的回调处理。

但是ROS基于Message这种通讯方式有很多的缺点。它最大限度解放两个点之点的一个耦合关系也带来了一些问题。比如Message接口升级,不同版本之间的兼容是需要做大量的适配工作。再如某个模块进行升级,之前所录制的一些实验数据,在进行回放的时候就会产生不匹配的现象。

历史数据在接口升级之后也面临着无法转化和兼容使用的问题。


深度融合Protobuf功能,实现数据兼容性扩展

Apollo ROS实践里面引入了一种新的消息描述的格式去实现很好的向后兼容即Protobuf。只需要在使用的过程中,定义好必须的字段或者是一些新增的字段,新增的字段我们可以使用Optional属性去描述。在进行模块升级或者是模块之间的消息接口升级的时候,下游模块其实不需要关注新增字段对它来说会造成什么样的影响。如果它要去使用这个字段的话才需要去进行一定程度的适配。如果它的程序不使用这个新增的字段,就不需要做任何的修改。

上图是原生ROS和Apollo ROS对数据兼容支持的对比。

为了做好数据兼容,在原生ROS里面,开发者使用了一个trick:将Proto文件序列化成一个字符串信息放到Message信息里面,完成消息的向后兼容。比起Apollo ROS这个方式有两个明显的缺点:

  1. 它增加了一次数据序列化和反序列化。并把Proto序列化信息压到Message里面,增加了两次额外的数据Copy。

  2. 如果想实时调试信息,通过Rostopic echo打印出来Message里面那个序列化的字母串,若是采用Wrapper的方式,则这个字符串信息在屏幕上就会是一堆乱码。

Apollo ROS 为了满足数据兼容,深度整合了Protobuf的功能。用户可以直接定义Proto的字段信息,同时信息传递的过程不需要再进行额外的Message的数据转化。另外,在使用调试工具的时候,通过Rostopic echo可以看出原始消息传递的实际展示。

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

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

相关文章

Java 10 常用集合继承关系图

概述 集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用。 类图如下: 1、Iterable与Iterator接口之间的区别 我看到好多网上的文章类图里面Collection 是继承Iterator接口&a…

【CodeForces - 673D】Bear and Two Paths(构造,tricks)

题干: Bearland has n cities, numbered 1 through n. Cities are connected via bidirectional roads. Each road connects two distinct cities. No two roads connect the same pair of cities. Bear Limak was once in a city a and he wanted to go to a cit…

Apoll进阶课程㉞丨Apollo ROS原理—3

原文链接:进阶课程㉞丨Apollo ROS原理—3 机器人操作系统(ROS)是一个成熟而灵活的机器人编程框架。ROS提供了所需的工具,可以轻松访问传感器数据,处理数据,并为机器人的电机和其它执行器生成适当的响应。整个ROS系统被设计为在计…

SM3密码杂凑算法原理

目录 1.概述 2、算法描述 2.1 概述 2.2 填充 2.3 迭代压缩 2.3 消息扩展 2.4 压缩函数 2.5 杂凑值 1.概述 SM3是我国采用的一种密码散列函数标准,由国家密码管理局于2010年12月17日发布。相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。 在商用密码体…

动手学无人驾驶(1):交通标志识别

今天主要介绍无人驾驶当中深度学习技术的应用。 本文是根据博客专家AdamShan的文章整理而来,在此表示感谢。 关于深度学习的图像分类技术,网上已有很多关于深度学习的课程(如吴恩达老师的深度学习专项课程),故本文不对…

《操作系统真象还原》-阅读笔记(上)

第一章 配置bochs,进入bochs simulator后一直是黑屏,原来默认是调试模式,需要输入C(continue)来让调试继续。 第二章 主讲MBR及进入MBR前的步骤 1.实模式只能访问1MB的内存空间。 2.BIOS在ROM中。 3.开机上电后CS&a…

Apollo进阶课程㉟丨Apollo ROS原理—4

原文链接:进阶课程㉟丨Apollo ROS原理—4 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。 ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每…

《操作系统真象还原》-阅读笔记(中)

第七章 操作系统是由中断驱动的。 中断分为外部中断和内部中断。 外部中断分为可屏蔽中断和不可屏蔽中断,内部中断分为软中断和异常。 外部中断 来自CPU外部的中断。可屏蔽中断:通过INTR引脚进入CPU,外部设备如硬盘、网卡、打印机等发出的…

动手学无人驾驶(2):车辆检测

上一篇博客介绍了无人驾驶中深度学习在交通标志识别中的应用(动手学无人驾驶(1):交通标志识别)。 本文介绍如何使用深度学习进行车辆检测,使用到的模型是YOLO模型,关于YOLO模型的具体检测原理&a…

《操作系统真象还原》-阅读笔记(下)

第十一章 任意进程的页目录表第0~767个页目录项属于用户空间,指向用户页表。第768~1023个页目录项指向内核页表。每创建一个新的用户进程,就将内核页目录项复制到用户进程的页目录表,其次需要把用户页目录表中最后一个页目录项更新为用户进程自己的页目…

Apollo进阶课程㊱丨Apollo ROS深入介绍

原文链接:进阶课程㊱丨Apollo ROS深入介绍 ROS是一个强大而灵活的机器人编程框架,从软件构架的角度说,它是一种基于消息传递通信的分布式多进程框架。ROS本身是基于消息机制的,可以根据功能把软件拆分成为各个模块,每…

一步步编写操作系统 31 cpu的分支预测 下

让我们说说预测的算法吧。 对于无条件跳转,没啥可犹豫的,直接跳过去就是了。所谓的预测是针对有条件跳转来说的,因为不知道条件成不成立。最简单的统计是根据上一次跳转的结果来预测本次,如果上一次跳转啦,这一次也预…

Apollo进阶课程㊲丨Apollo自动驾驶架构介绍

原文链接:进阶课程㊲丨Apollo自动驾驶架构介绍 自动驾驶硬件架构:一般采用激光雷达作为主要感知传感器,同时结合摄像头、GPS/IMU、毫米波雷达、超声波雷达等,以NVIDIA Drive PX2 或 Xavier作为主要计算平台,在工业PC机…

Apollo进阶课程㊳丨Apollo平台的快速入门

原文链接:进阶课程㊳丨Apollo平台的快速入门 Apollo是向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。 上周阿波君为大家详细介绍了「进阶课…

一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存

咱们先介绍0xE820子功能,这是最灵活的内存获取方式。 bios中断 0x15的子功能0xE820能够获取系统的内存布局,由于系统内存各部分的类型属性不同,bios就按照类型属性来划分这片系统内存,所以这种查询则呈迭代式,每次bio…

16.深度学习练习:Building your Recurrent Neural Network - Step by Step

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。课程链接:https://www.deeplearning.ai/deep-learning-specialization/Building your Recurrent Neural Network - Step by Step1 - Forward propagation for the basic Recurrent Neur…

【2019icpc徐州站】Random Access Iterator(概率dp,有坑,tricks)

题干: Recently Kumiko learns to use containers in C standard template library. She likes to use the std::vector very much. It is very convenient for her to do operations like an ordinary array. However, she is concerned about the random-access…

一步步编写操作系统 34 内核利用bios中断获取物理内存大小

接上文,另一个获取内存容量的方法是bios 0x15中断的子功能0xE801。 此方法虽然简单,但功能也不强大,最大只能识别4G内存,不过这对咱们32位地址总线足够了。稍微有点不便的是,此方法检测到的内存是分别存放到两组寄存器…

17.深度学习练习:Character level language model - Dinosaurus land

本文节选自吴恩达老师《深度学习专项课程》编程作业,在此表示感谢。 课程链接:https://www.deeplearning.ai/deep-learning-specialization/ 文章目录1 - Problem Statement1.1 - Dataset and Preprocessing1.2 - Overview of the model2 - Building blo…

Apollo进阶课程㊴丨Apollo安装过程概述

原文链接:进阶课程㊴丨Apollo安装过程概述 Apollo是一个自动驾驶的平台,推荐的参考运行环境为:ThinkPAD X240、CPU:i5 、四核 、内存 8G、 硬盘容量40G以上。 上周阿波君为大家详细介绍了「进阶课程㊳丨Apollo平台的快速入门」。 …