购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 ROS-2基础

在ROS-1中,用户代码将连接到ROS客户端库(例如rospy或roscpp),它们将直接与网络中的其他节点通信;而在ROS-2中,ROS客户端库就像一个抽象层,使用其他节点通过DDS实现连接到网络中进行通信的另一层。ROS-1与ROS-2的简单对比如图2.2所示。

图2.2 ROS-1与ROS-2的简单对比

如图2.2所示,在ROS-2中,操作系统层与底层硬件层的通信是通过DDS实现完成的。图中的DDS组件由相应供应商实现,供应商不同则具体实现不同。

抽象DDS层组件与ROS-2客户端库连接,并通过DDS实现帮助用户连接代码。通过这样的分层抽象,用户无须感知DDS API的存在就可以与操作系统连接。此外,ROS-1和ROS-2的区别还在于ROS-1使用了自定义传输协议以及自定义中心发现机制,因此需要使用master,而ROS-2则具有抽象的DDS层,通过该层可以实现序列化、传输和发现等功能。

2.3.1 什么是DDS

如前所述,DDS是OMG定义的标准。它是一种发布–订阅传输技术,类似于ROS-1中使用的技术。与ROS-1不同,DDS实现了一种分布式发现系统技术,可以帮助两个或多个DDS程序在不使用master的情况下相互通信。发现系统不一定是动态的,实现DDS的供应商提供了静态发现的功能选项。

2.3.2 DDS的实现

由于不同的DDS供应商提供具有不同功能的DDS实现,因此ROS-2支持多种DDS实现。例如,RTI的Connext是专门用于微控制器或需要安全认证的应用程序的DDS实现。所有的DDS实现都是通过一个称为ROS中间件层(rmw)的特殊层实现的,如图2.3所示。

图2.3 ROS-2中间件层

用户代码是最上面的块,包含用户逻辑或算法。在ROS-1中,用户代码通常位于ROS客户端库(如roscpp或rospy)的顶部,这些库帮助用户将其代码与ROS中的其他组件(如节点、话题或服务)连接起来。与ROS-1中的ROS客户端库不同,ROS-2中的ROS客户端库分为两层:

·一是对应于特定编程语言客户端库(如rclcpp、rclpy或rcljava)的功能层,用于处理诸如rosspin之类的线程处理和诸如内存管理之类的进程内通信。

·二是名为rcl的公共层,用C语言实现,用来处理名称、服务、参数、时间和控制台日志记录。

ROS中间件层rmw也是用C语言实现的,它与位于硬件层顶部的DDS实现相连接。该层负责服务调用、节点发现、图形事件和具有 服务质量 (Quality of Services,QoS)的发布/订阅调用。ROS-2中的QoS是网络中跨节点性能的度量。默认情况下,ROS-2遵循eProsima的快速RTPS实现,因为快速RTPS是开源的。

2.3.3 计算图

ROS-2遵循与ROS-1相同的计算图概念,但有一些变化:

· 节点: 在ROS-2中,节点被称为参与者。除了可以像ROS-1一样在计算图中定义节点之外,在ROS-2中一个进程还可以初始化多个节点,它们可能位于同一进程、不同进程或不同机器中。

· 发现 (discovery):ROS-1中有一个master的概念可以帮助节点互相进行通信,而ROS-2中则没有master的概念,而是通过一种称为“发现”的机制实现通信。在默认情况下,ROS-2中的DDS标准实现提供了一种分布式发现方法,节点能够在网络中自动发现彼此。此机制有助于实现不同类型的多个机器人之间的可靠通信。

除此之外,我们在前一章中看到的其他概念,如消息、话题、参数服务器、服务和数据包,对于ROS-2来说都是一样的。

2.3.4 ROS-2社区层级

与ROS-1成熟活跃的社区氛围不同,ROS-2社区目前还在发展之中。一些研究机构和企业都做出了很好的贡献。由于ROS-2在2014年才开始开发,因此关于ROS-2的研究和工具还有很多需要关注的问题,这是因为通过开源社区实现实时系统需要克服巨大的困难。

OSRF与提供DDS实现并为社区做出贡献的供应商进行了很好的沟通。目前ROS-1在其仓库中有2000多个功能包,而ROS-2还只有100多个。最新的ROS-2页面的网址为 https://index.ros.org/doc/ros2/

2.3.5 ROS-2中的通信

如果读者认真地阅读完了前一章的内容,那么一定对ROS-1如何使用一个简单的发布–订阅模型实现通信的过程还很熟悉,其中master用于在节点之间建立连接和实现数据通信。如前所述,ROS-2的工作方式略有不同:采用DDS实现进行通信,因此使用的是 DDS互操作实时发布 订阅协议 (DDS Interoperability Real-Time Publish-Subscribe Protocol,DDSI-RTPS)。其目标是在节点之间建立安全而高效的通信,即使是在异构平台中也能可靠通信。DCPS模型如图2.4所示。

图2.4 DCPS模型

如图2.4所示,此通信模型中还涉及其他的组件。如前所述,节点在ROS-2中被称为参与者。每个参与者可以有一个或多个DDS话题,这些话题与ROS-1中的话题不同,既不是发布者也不是订阅者,而是ROS-2中的代码对象。

这些DDS话题可以在全局数据空间中获取。可以通过这些话题创建DDS发布者和订阅者,但它们不直接发布或订阅话题。发布或订阅话题的功能由被数据写入器和数据读取器完成。数据写入器和数据读取器以特定的消息类型写入或读取数据,这就是在ROS-2中实现通信的方式。设计和构建这些抽象层的目的是确保数据的安全高效传输。用户可以在每个层次上设置QoS配置参数,以提供性能最优的配置粒度。

2.3.6 ROS-2的变化

本节将对ROS-1和ROS-2之间的区别进行详细说明,以便读者了解ROS-2的升级内容目标。为了便于理解,将相关内容罗列于表2.2中。

表2.2 ROS-1和ROS-2之间的区别

除了上述区别之外,ROS-1和ROS-2之间还有其他一些更改,所有这些更改都可以在 http://design.ros2.org/articles/changes.html 上找到。

现在我们已经介绍了ROS-2的基本原理,下面介绍ROS-2的客户端库。 W5oUd6IgRUKLCjokSAkDaBI5Je1Y+JoS9PVBLLc94EZkKQ4Kr7NIjMQWA1qDfqaC

点击中间区域
呼出菜单
上一章
目录
下一章
×