ROS实战(八)ROS2初探

摘要:转眼间三年已经过去,而我也开始面临毕业的问题。由于导师放养式的教学,导致我的论文一直没什么长进。抱怨没有用,一切靠自己。还是得把之前丢下的捡起来。

本文主要介绍ROS2.

关键词:ROS2

为什么是ROS2

ROS2是一个全新的机器人操作系统,在借鉴ROS1成功经验的基础上,对系统架构和软件代码全部进行了重新设计和实现。与ROS1相比,体现在以下几点:

image-20220523114359304
  • 系统出现了颠覆性的变化,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

    系统架构

    image26

    如图所示,可以看出最大的变化就是Master。

  • ROS1中,应用层里面的Master节点管理器至关重要,所有节点都得听他指挥。ROS2把这个不稳定的角色请走了,节点可以通过自发现机制找到彼此,从而建立稳定的通信连接;

  • 中间层是ROS封装好的标准通信接口,写程序会频繁和这些接口打交道,比如发布一个图像的数据,接受一个雷达的信息,客户端库再调用底层复杂的驱动和通信协议,使得我们的开发变得更加明了。

  • ROS1中,ROS通信依赖底层的TCP和UDP通信,ROS2中,通信协议换成了更见复杂但更见完善的DDS系统;

  • 如果是进程内需要大量数据的通信,ROS1和ROS2都提供了基于共享内存的通信方法,只不过名字不太一样;

  • 最下面是系统层,也就是ROS可以安装在那些操作系统上,ROS1主要安装在Linux上,ROS2的可选项很多,Linux、Windows、MacOS、RTOS都可以;

DDS通信

image27

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。

image-20220523114814371

编码方式

如果各位熟悉ROS1,这里的概念应该并不陌生,在ROS2中,这些概念依然存在,意义也几乎一致,在本课程的第二个部分,我们就会一一讲解这些概念的含义和使用方法,没有学习过ROS的小伙伴也不用担心。

image-20220523114851763

总体而言,ROS2会用到更多面向对象的实现方法和语言特性,从编程语言的角度来讲,难度确实会提高一些,不过当我们迈过这道坎之后,就会发现我们写的程序会更具备可读性和可移植性,也会更接接近真实企业中机器人软件开发的过程。

命令行

最后我们再对比下ROS开发中最为常用的一种工具——命令行。

image-20220523114915528

ROS1中的命令行相对分散,每一个功能都是一个独立的命令,比如rosrun启动某一个节点,rostopic控制话题相关的功能。

ROS2对命令行做了大幅度的集成,所有命令都集成在一个ros2的主命令中,比如ros2 run,表示启动某一个节点,ros2 topic表示话题相关的功能。

总结

ROS2和ROS1相比,总结如下:

  • 节点干掉了Master
  • 通信换成了DDS
  • 核心概念没变化
  • 编程难度有上升