ROS2与DDS的关系(ROS2 on DDS)

目录

概述

什么是DDS(Data Distribution Service)

基于DDS构建ROS2

DDS的发现机制

发布-订阅通信

高效的通信

消息描述(Messages)

服务&动作(Services&&Actions)

参考文献


概述

         从ROS1到ROS2的升级换代,有一个重要的改变:DDS通信。DDS实际上是一种应用很广泛的通信中间件,在ROS2中话题、服务等底层的通信都是依靠DDS完成。接触ROS2时没有深入过其与DDS中间件的关系,今天结合官方文档浅析两者关系。

什么是DDS(Data Distribution Service)

        结合官方文档,DDS可以凝练成几点:

  • DDS通信和ROS1比较相似,也是发布-订阅的传输模式
  • DDS通信和ROS1又有不同,其节点发现系统遵从分布式,允许多个DDS通信
  • DDS使用OMG定义的接口描述语言进行消息定义和序列化

        总而言之:DDS就是在多个节点中间的通信组件,他的功能就是提供多个节点之间的通信。

基于DDS构建ROS2

        既然要在DDS的底层上构建ROS2,那就要将所有DDS特定的API和消息定义都封装起来。实际底层由DDS为ROS2提供节点发现、消息定义、消息序列化、订阅和发布的功能。如下图虚线指引,通过DDS的API的封装,ROS2隐藏了大量DDS的实现,而暴露给用户的是类似于ROS1的使用界面。但是,ROS2同样为用户提供了某些特定的DDS接口。

        实现DDS的访问依赖于额外软件包。通过查看软件包的依赖关系可以确定软件包是否已经与特定的DDS中间件。基于DDS构建的ROS2的API,是为了满足众多ROS用户的共同需求,使用户能够避开对DDS系统的直接介入。 这里,总结成简单地说法就是:ROS2接入DDS作为中间件,将DDS服务接口进行了一层抽象,从而使ROS2的应用层调用接口高度统一

DDS的发现机制

        DDS完全取代了ROS1中的Master中心节点。ROS2利用DDS API来获取如所有节点的列表、所有话题列表以及它们之间如何连接等信息。对这些信息的访问被封装在ROS定义的API内,因此用户避开了直接调用DDS。这也正是DDS的优势所在,DDS默认情况下是完全分布式的,因此不会因为中心节点故障而导致所有节点的通信出现问题。

发布-订阅通信

        译自官网:DDSI-RTPS(DDS互操作性实时发布-订阅)协议将取代ROS的TCPROS和UDPROS有线协议用于发布/订阅。DDS API为ROS1的典型发布订阅模式提供了更多的参与者。在ROS中,节点的概念与DDS中的图形参与者相似。图形参与者可以有零到多个主题,这些主题与ROS中主题的概念非常相似,但在DDS中表示为单独的代码对象,既不是订阅者也不是发布者。然后,从DDS主题中,可以创建DDS订阅者和发布者,但它们同样用于表示DDS中的订阅者和发布器概念,而不是直接从主题读取数据或向主题写入数据。除了主题、订阅者和发布者之外,DDS还有DataReaders和DataWriters的概念,它们是与订阅者或发布者一起创建的,然后在用于读取和写入主题的数据之前专门用于特定的消息类型。这些额外的抽象层允许DDS具有高级别的配置,因为您可以在发布-订阅堆栈的每个级别设置QoS设置,从而提供尽可能高的配置粒度。这些抽象级别中的大多数都不是满足ROS当前需求所必需的。因此,在更简单的类ROS接口(Node、Publisher和Subscriber)下封装常见的工作流将是ROS 2隐藏DDS复杂性的一种方式,同时暴露其一些功能。

高效的通信

ROS1中未使用zero-copy,其原因是:ROS1是基于TCP的,对于TCP的使用者可以一次性提供一大块需要传输的数据,然后由TCP来负责切分成小的package进行传输。在本地情况下(localhost),TCP自动的会把这一大块数据进行内存共享。所以在效率上,在本地环境下,通过TCP传输和zero-copy方式传输没有太大的效率差异。

但是DDS是基于UDP,DDS会先把数据切成小块后,再给UDP进行传输,这样就和zero-copy的效率有很大的不同了。因此这为DDS提供了可观的性能提升。

另外使用ROS的时候,如果想要得到更快的大数据本地传输效率可以使用nodelets。nodelets把地址通过消息进行共享,是最快的共享方式。

注:该处主要引用了文献2的作者的写法

消息描述(Messages)

        ROS1的消息定义方式结构简单,并且其消息定义经过很长时间的发展已经成为一种约定的定义风格,因此在ROS2中为了继续沿用MSG,采用了图示的方式实现:ROS2仍使用ROS1的.msg文件,并将.msg文件转换成.idl文件以便msg文件能被DDS传输使用。ROS2的API会专门处理内存中的.msg样式消息对象,并在发布消息之前将其转换为.idl对象。

服务&动作(Services&&Actions)

        DDS至今为止目前还未发布正式的请求-响应风格的RPC标准,基于该标准可以在ROS2中实现服务(Service)。ROS2可以基于发布-订阅通信实现服务和动作,或者在DDS RPC规范真正形成后在此基础上构建动作。总之无论哪种方式,ROS2都将完成动作API的开发。

参考文献

1、官方教程:ROS on DDS (ros2.org)

2、http://blog.csdn.net/u011754972/article/details/116304838

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Felier.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值