设为首页收藏本站

ROS中国

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 63|回复: 0

上海硅步连载系列第三期——ROS2.0

[复制链接]
发表于 2016-12-26 14:58:19 | 显示全部楼层 |阅读模式


  ROS连载第三期


                                                                                                                                                                                                    ——转自上海硅步公众号“硅步科学”


1 ROS2.0诞生的背景


ROS一开始是针对Willow Garage PR2 机器人开发的,其初衷是为PR2机器人的用户提供一套软件,以进行不同的研究和开发。随后ROS得到了快速的发展,它作为一个开放性的应用平台被逐步推广到商业领域,如工业机器人、农业机器人、商业清洁机器人等等。一些政府机构也开始关注ROS,例如NASA希望在空间机器人Robonaut 2上运行ROS

随着ROS社区的不断扩大,ROS可应用在如下的新领域:多机器人编队:

目前使用ROS可以建立一个多机器人系统,但没有统一的方法;

小的嵌入式平台:小型计算机,包括单片机,都可以运行ROS环境;

实时系统:ROS可直接实现实时控制;

非理想网络:ROS可应用在网络不稳定的场合,例如低质量的WiFi、地面-太空通信链;

产品应用:尽管ROS作为研究性平台很重要,但将基于ROS的实验室原型机发展为基于ROS的产品,以适应实际需要,也是大势所趋。

为了使ROS适应上述应用的要求,需要设计新的API,它采用了DDSDataDistribution Service)通信方式,即ROS2.0,这是ROS1.0ROS2.0的主要区别。下面将具体介绍DDS通信方式。


2 ROS2.0中的DDS


1DDS简介

数据分发服务DDS(Data Distribution Service)是对象管理组织(OMG)HLACORBA等标准的基础上制定的新一代分布式实时通信中间件技术规范。该技术最早应用于美国海军,用于解决舰船复杂网络环境中大量软件升级的兼容性问题,目前已经成为美国国防部的强制标准。DDS 目前已经广泛应用于国防、民航、工业控制等领域,成为分布式实时系统中数据发布/订阅的标准解决方案。DDS 技术是基于以数据为核心的设计思想提出的,定义了描述网络环境下数据内容、交互行为和服务质量要求的标准。

DDS 规范描述了两个层次的接口:

1)可选的高层DLRLData LocalReconstruction Layer)层:允许将服务简单地集成到应用层。


2)底层DCPSData-Centric Publish-Subscribe)层:将正确的信息有效地传递给真正需要的接收者。

DDS 将分布式网络中传输的数据定义为主题(Topic),将数据的产生和接收对象分别定义为发布者(Publisher)和订阅者(Subscriber),从而构成数据的发布/订阅传输模型。各个节点在逻辑上无主从关系,点与点之间都是对等关系,通信方式可以是点对点、点对多、多对多等,在QoS 的控制下建立连接,自动发现和配置网络参数。

2)基于DDSROS系统

DDS技术比较复杂,为方便ROS用户使用,DDS特定的API以及消息定义将被隐藏。DDS仅为ROS提供发现、发布-订阅传输以及潜在的消息序列。使用DDS需要依赖一个额外的功能包,也就是说,用户可查看功能包的依赖项以确定功能包是否使用DDS通信。

1)发布/订阅传输

ROS中原来的通信协议——rostcprosudp协议替换为DDSI-RTPSDDS-Interoperability Real Time Publish Subscribe)协议。

2)发现系统

ROS2.0使用DDS完全替换了ROS MasterROS通过接入DDS API,得到所有节点列表、所有主题列表以及连接关系等信息。获取这些信息的代码被隐藏在ROS定义的API后面,避免用户直接调用DDSDDS发现系统的优势是完全分布式,系统各部分之间相互通信不需要一个中心点(ROS Master),因此具有更高的通信效率。DDS也允许用户在发现系统中定义元数据,这使得ROS在发布-订阅上实现更高水平的概念。

3)有效的传输方案

ROS1.0不存在一个标准的共享内存传输,因为它比本地TCP回送连接快不了很多。大多数DDS开发商将以透明方式使用共享内存优化消息流量(甚至进程之间),仅仅在离开本地主机时使用有线协议和UDP套接字。这大大提高了DDS的性能。对于ROS1.0,发送的过程是:将消息按顺序存入一个大的buffer,调用一次TCPsend函数发送数据。而对于DDS,发送的过程是序列化消息、分解消息到许多潜在的UDP数据包,多次调用UDPsend函数。使用这种方式发送很多UDP数据报文并不比原先的TCP快。因此,很多DDS开发商为了本地主机消息将避开此过程,采用一种黑板形式的共享内存机制以实现进程间的高效通信。

4)消息

ROS2.0保留了ROS1.x中的消息定义,因此将继续使用ROS 1.x中的.msg文件,但需要将.msg文件转换为.idl文件,以便在DDS传输中使用。ROS2.0API仅仅使用.msg类型的消息,并在发布之前将其转换为.idl文件,如图2.1所示:

                                

                                                                 图2.1 ROS2.0中消息转换

5ServiceAction

DDS并没有一个已批准或已应用的标准来实现请求-响应形式的RPCRemote Procedure Call)(可实现ROS中的Service)。现在OMG DDS工作组正在考虑批准一个RPC规范,几个DDS开发商也有了一个初步的RPC API实施方案。然而,还不清楚这个标准是否可以用在ActionROS2.0有两种方式实现ServiceAction:一种方式是在发布-订阅顶层实现ServiceAction,这在DDS中更容易实现,因为发布-订阅QoS设置是可靠的;另一种方式是使用DDS RPC规范。

6)编译系统(ament

ROS1.0中,Groovy以及之后的版本都使用catkin编译系统。该系统相对于rosbuild有很多优点,例如自动生成CMake配置文件、一个安装目标等。然而,随着时间的推移,catkin的一些缺点开始显现出来。此外,一些额外的工具被开发出来,例如catkin_simplecatkin_tools

为了解决catkin的一些问题,开发了catkin的下一代,即amentamentROS2.0所使用的编译系统,它由多个单独的功能包组成,主要包括两部分:

(1)buildsystem:可配置、编译、安装功能包。

(2)tool: 可在功能包的拓扑序列中调用功能包的编译。

7)语言支持

DDS支持CC++Java等语言。ROS2.0的目标之一是提供一个一流的、功能完善的C API。这使得和其他语言绑定变得更容易。PythonRubyLisp等语言可以通过C API使用DDS

8ROS接口类型到DDS IDL类型的映射

原始类型映射:

数组和有界字符串映射:

3)中间件(middleware)接口

ROS客户端库定义了API,它使我们更方便地使用发布/订阅等通信方式。在ROS 1.0中,这些通信方式的实现是建立在传统协议上的(例如,TCPROS)。而对于ROS2.0,它们建立在一个已经存在的中间件(即DDS)的上层,这种方式的主要优点是ROS2.0可以利用DDS很成熟的实现方法。

ROS可以建立在DDS的一个特定实现上。但是,有很多不同的实现方法,根据不同的支持平台、编程语言、性能特点、内存占用、依赖项和许可,每种都有它自己优点和缺点。因此ROS2.0的目标是支持多个DDS实现方法,尽管每种实现在API上有所不同。为了能够使用不同的DDS实现,提出了一种中间件接口(middleware interface),该接口定义了ROS客户端库和任意指定实现之间的API,如图2.2所示:

                                                                              

                                                                              图2.2 中间件接口















回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|ROS中国论坛    

GMT+8, 2017-1-17 18:54 , Processed in 0.300768 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表