对比ROS1.0与ROS2.0,探究ROS系统存在的问题以及改进空间。
等待一场姹紫嫣红的花事,是幸福,
在阳光下和喜欢的人一起筑梦,是幸福,
守着一段冷暖交织的光阴慢慢变老,亦是幸福
在之前的文章中,介绍了ROS漫长的演进过程《ROS的前世今生(附良心学习资料)》,从最初的几个人开发维护,到目前拥有庞大的支撑人员以及收益群体,ROS的成长之快超过了大多数人的想象,不知不觉ROS已经10多岁了,伴随着科技的巨变,ROS也慢慢开始暴露着自身的缺点,机器人开发者对新一代ROS的呼声越来越大,由此ROS 2就应运而生,众多新技术和新概念应用到了新一代的ROS之中,不仅带来了整体架构的颠覆,更是增强了ROS 2的综合性能。借此机会,总结一下ROS 2带来的新的突破。
系统框架
上图所示是ROS 2与ROS 1整体架构的对比:
ROS 1主要构建于Linux系统之上,主要支持Ubuntu。而ROS 2采用全新的架构,底层基于DDS通信机制,支持实时性、嵌入式、分布式、多操作系统。ROS 2支持的系统包括Linux、windows、Mac、RTOS,甚至是单片机等没有操作系统的裸机。
ROS 1的通讯系统基于TCPROS/UDPROS,强依赖于master节点的处理,而ROS 2的通讯系统是基于DDS,进而取消了master,同时在ROS2内部提供了DDS的抽象层实现,有了这个抽象层,用户就可以不去关注底层的DDS使用了哪个商家的API。
ROS 2目前已经在Ubuntu Xenial,OS X El Capitan以及Windows 10上进行了CI测试和支持。
编程语言
C ++标准:
ROS 1的核心是针对C ++ 03,并没有在其API中使用C ++ 11功能。ROS 2广泛使用C ++ 11,并使用C ++ 14的某些部分。在未来,ROS 2可能会开始使用C ++ 17。
python:
ROS 1是针对Python 2,ROS 2至少需要Python 3.5版本。
编译系统
ROS编译系统从初期使用的rosbuild,到groovy版本之后的catkin,再到ROS2中的ament虽然编译系统并不是ROS框架中的核心部分,但却是开发者最常接触的一个重要功能。
ROS 2新的编译系统ament是一种元编译系统,用来构建组成应用程序的多个独立功能包,它并不是一个全新的东西,是catkin编译系统进一步演化的版本,而这两个单词也是近义词。
ROS 2只支持隔离的构建
在ROS 1中,可以在单个CMake上下文中构建多个包。虽然这加快了构建步骤,但是每个包都需要确保正确定义了交叉包目标依赖关系。另外所有的软件包共享相同的命名空间,导致目标名称冲突等。
在ROS 2中,只支持隔离的构建,即每个包都是独立构建的。安装空间可以是隔离的或合并的。
取消了开发空间
在ROS 1中,可以在不安装包的情况下构建包。但在ROS 2中,必须先安装一个软件包,然后才能使用它。
ROS 1中使用开发空间的一个原因是为了使开发人员能够更改文件,例如Python代码或启动文件,并直接使用修改后的代码,而无需重新编译软件包。在ROS 2中保留了这一好处,可选择使用符号链接替换安装步骤中的复制操作。
消息、服务接口
ROS 2使用了新的接口。有关更多信息,请参阅ROS接口定义文章。
DDS通信简介
DDS(Data Distribution Service)即数据分发服务。它是一个专门为实时系统设计的数据分发/订阅标准,目前已成为分布式实时系统中数据发布/订阅的标准解决方案。
DDS的技术核心是以数据为核心的发布订阅模型(Data-CentricPublish-Subscribe ,DCPS),DCPS模型创建了一个“全局数据空间“的概念,所有独立的应用都可以去访问。在DDS中,每一个发布者或者订阅者都成为参与者,类似于ROS中节点的概念。每一个参与者都可以使用某种定义好的数据类型来读写全局数据空间。
上图展示了ROS 1的master机制与ROS 2的DDS机制原理图。
DDS中的模型相比于master主节点就人性化多了:
参与者(Domain Participant):一个参与者Participant就是一个容器,对应于一个使用DDS的用户,任何DDS的用户都必须通过Participant来访问全局数据空间。
发布者(Publisher):数据发布的执行者,支持多种数据类型的发布,可以与多个数据写入器(DataWriter)相联,发布一种或多种主题(Topic)的消息。
订阅者(Subscriber):数据订阅的执行者,支持多种数据类型的订阅,可以与多个数据读取器(DataReader)相联,订阅一种或多种主题(Topic)的消息。
数据写入器(DataWriter):应用向发布者更新数据的对象,每个数据写入器对应一个特定的Topic,类似于ROS1中的一个消息发布者。
数据读取器(DataReader):应用从订阅者读取数据的对象,每个数据读取器对应一个特定的Topic,类似于ROS1中的一个消息订阅者。
主题(Topic):这个和ROS1中的Topic概念一致,一个Topic包含一个名称和一种数据结构。
从上边DDS的几个重要概念中,我们就可以看到ROS2相比于ROS1,在以下方面有所提升:
实时性增强:数据必须在deadline之前完成更新。
持续性增强:ROS1尽管存在数据队列的概念,但是还有很大的局限,订阅者无法接收到加入网络之前的数据;DDS可以为ROS提供数据历史的服务,就算新加入的节点,也可以获取发布的所有历史数据。
可靠性增强:通过DDS配置可靠性原则,用户可以根据需求选择性能模式(BEST_EFFORT)或者稳定模式(RELIABLE)。
下一个版本
ROS 2 目前还在积极的开发完善中之中。下一个正式版本将在2018年夏天发布。届时会继续有一些出现新特性,例如将会进一步完善C++和Python的API,开发通用构建工具,发布Windows和Mac OS软件包,使用FastRTPS增强实时安全等。
期待更好、更强大的ROS 2 土鳖出现!