ROS实战(八)ROS2初探
摘要:转眼间三年已经过去,而我也开始面临毕业的问题。由于导师放养式的教学,导致我的论文一直没什么长进。抱怨没有用,一切靠自己。还是得把之前丢下的捡起来。
本文主要介绍ROS2.
关键词:ROS2
为什么是ROS2
ROS2是一个全新的机器人操作系统,在借鉴ROS1成功经验的基础上,对系统架构和软件代码全部进行了重新设计和实现。与ROS1相比,体现在以下几点:
系统出现了颠覆性的变化,ROS1的所有节点都需要在节点管理器ROS Master下进行工作,一旦Master出现问题,系统就会宕机。ROS2实现了真正的分布式,不再有Master这个角色,借助全新的通信框架DDS,为所有节点提供了可靠通信保障。
软件API进行了重新设计,ROS1原有的接口无法满足需求,ROS2结合C++最新标准和Python3语言特性,设计了更具通用的API,虽然导致原有ROS1的代码无法直接在ROS2上运行,但是尽量保留了类似的使用方法,同时提供了大量的移植说明。
编译系统进行了升级,ROS1仲使用的rosbuild和catkin问题诸多,尤其是针对代码比较多的项目以及Python编写的项目。编译、连接经常会出错,ROS2对这些进行了优化,重新优化后的编译系统叫做ament和colcon。
以上几点是框架层面的优化,而ROS1和ROS2的明显变化,请看下文:
ROS2 vs ROS1
系统架构
如图所示,可以看出最大的变化就是Master。
ROS1中,应用层里面的Master节点管理器至关重要,所有节点都得听他指挥。ROS2把这个不稳定的角色请走了,节点可以通过自发现机制找到彼此,从而建立稳定的通信连接;
中间层是ROS封装好的标准通信接口,写程序会频繁和这些接口打交道,比如发布一个图像的数据,接受一个雷达的信息,客户端库再调用底层复杂的驱动和通信协议,使得我们的开发变得更加明了。
ROS1中,ROS通信依赖底层的TCP和UDP通信,ROS2中,通信协议换成了更见复杂但更见完善的DDS系统;
如果是进程内需要大量数据的通信,ROS1和ROS2都提供了基于共享内存的通信方法,只不过名字不太一样;
最下面是系统层,也就是ROS可以安装在那些操作系统上,ROS1主要安装在Linux上,ROS2的可选项很多,Linux、Windows、MacOS、RTOS都可以;
DDS通信
ROS1中基于TCP/UDP的通信系统,频繁诟病与延迟、丢数据、无法加密等问题,ROS2中的DDS在通信层面的功能就丰富多了;
DDS是物联网中广泛得到应用的一种通信协议。DDS是一个国际标准,能够实现该标准的软件系统并不是唯一的,可以选择多个厂家提供的DDS系统,比如OpenSplice、FastRTPS,还有更多厂家提供的,每一家的性能不同,适用的场景也不一样;
ROS2设计了个ROS Middleware,RMW,也就是指定一个标准的接口,比如如何发数据、如何收数据,数据的各自属性如何配置,等。如果厂家想要接入DDS社区,需要按照这个标准写一个适配的接口,将自家的DDS移植过来,这样问题交给了熟悉自家的DDS厂家。
当我们在产品开发时,可以先用开源版本的DDS满足业务需求,部署交付的产品时,再更改为商业版本更加稳定的DDS,减少开发成本。
总之,DDS的加入,让ROS2更加稳定,也更加灵活,与之相同的时复杂度也会变高。这样我们不用在纠结ROS的通信系统是否稳定、应该如何优化等问题,更多精力可以放在其他三个部分,专注优化机器人应用功能。
核心概念
ROS1应用以及非常广泛,全球有几百万开发者,大家已经熟悉了ROS1的开发方式和其中很多的概念。ROS2尽量保留了这些概念,以便开发者从ROS1迁移到ROS2。
编码方式
如果各位熟悉ROS1,这里的概念应该并不陌生,在ROS2中,这些概念依然存在,意义也几乎一致,在本课程的第二个部分,我们就会一一讲解这些概念的含义和使用方法,没有学习过ROS的小伙伴也不用担心。
总体而言,ROS2会用到更多面向对象的实现方法和语言特性,从编程语言的角度来讲,难度确实会提高一些,不过当我们迈过这道坎之后,就会发现我们写的程序会更具备可读性和可移植性,也会更接接近真实企业中机器人软件开发的过程。
命令行
最后我们再对比下ROS开发中最为常用的一种工具——命令行。
ROS1中的命令行相对分散,每一个功能都是一个独立的命令,比如rosrun启动某一个节点,rostopic控制话题相关的功能。
ROS2对命令行做了大幅度的集成,所有命令都集成在一个ros2的主命令中,比如ros2 run,表示启动某一个节点,ros2 topic表示话题相关的功能。
总结
ROS2和ROS1相比,总结如下:
- 节点干掉了Master
- 通信换成了DDS
- 核心概念没变化
- 编程难度有上升