ROS2探索(四)DDS与RTPS

2023-10-24 02:32
文章标签 探索 ros2 dds rtps

本文主要是介绍ROS2探索(四)DDS与RTPS,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

朋友们新年好啊,春节假期不讲武德,让人整天想摸鱼,感觉今天才勉强进入工作状态…
前面了解了ROS2的publisher、subscriber以及service,他们在节点中由executor执行且一个进程可以拥有多个节点。ROS2中引入了DDS中间件层(rmw),下面考察一下DDS相关的内容。
本文主要参考DDS-RTPS的2.2版本(?RTPS是啥玩意),详细的协议文档取自OMG官网:http://www.omg.org/spec/DDSI-RTPS/2.2。主要内容分为以下部分:

  • DDS与RTPS简介
  • RTPS的传输构成
  • RTPS的数据格式
  • RTPS通信的过程
  • RTPS的发现机制

DDS与RTPS简介

DDS指数据分发服务(Data-Distribution Service),是由OMG组织定义的一种以数据为中心的通信模型,支持订阅发布模式(Data-Centric Publish-Subscribe)。DDS的协议标准规定了以下内容:

  1. 应用的通信数据模型
  2. 应用与DCPS通信中间件的交互的数据格式,其中包括服务质量要求(QoS)
  3. 数据如何根据QoS进行收发
  4. 应用如何访问通信数据
  5. 通信中间件的状态反馈

RTPS表示实时发布-订阅传输协议(Real-Time Publish Subscribe),该协议已经成为了工业以太网的一个标准(IEC-PAS-62030)。RTPS十分符合DDS模型的要求,于是就被DDS拿去作为它的传输协议了。这里我们就能理解为什么引言里面提到了大量的RTPS。

RTPS的传输构成

RTPS传输由多个Participant实体参与,每个Participant拥有若干Endpoint,Endpoint又分为Reader和Writer两大类型。Endpoint是RTPS最基本的通信单元。在应用程序里用户操作的是DDS实体(DataWriter与DataReader),每个DDS实体对应RTPS的实体,RTPS与DDS实体通过HistoryCache桥梁进行沟通。HistoryCache是一个数组,里面包含若干个CacheChange。当用户要发布某个数据,就把某个CacheChange告诉RTPS实体Writer,Writer把这个CacheChange塞进HistoryCache里然后将CacheChange分发给需要接收数据的Reader们。类似的,Reader的HistoryCache收到CacheChange后用户可以选择从DataReader对应的Reader中读取数据。下图表示了RTPS传输的构成内容:
在这里插入图片描述总结:

  • RTPS传输协议由Entity、Participant、Endpoint、Writer、Reader、HistoryCache以及CacheChange组成
  • 应用通过DDS层实体来访问对应的RTPS实体,HistoryCache是他们之间的桥梁

RTPS的数据格式

Endpoint是RTPS的通信基本单元,他们之间传输固定格式的Message数据,Message整体格式如下图所示:
在这里插入图片描述可以看到一个Message有一个Header,Header包含RTPS的标识、RTPS协议版本、实现版本以及消息的GUID前缀。这里讲一下GUID前缀字段(guidPrefix),RTPS中每个实体拥有一个全局唯一标识符(GUID),GUID由前缀和实体ID两部分构成,其中前缀就在每个消息的Header中,后面的每个Submessage只需要实体ID(EntityID)即可。
在这里插入图片描述

Header后面是Submessage,每个Submessage包含SubmessageHeader和SubmessageElement。SubmessageHeader包含此Submessage的类型,大小端类型以及数据长度等信息。
在这里插入图片描述
SubmessageElement表示各种消息的字段,不同的消息类型具有相应的字段,我们不用关心,以后具体实现再看。下面看一下各种Submessage的作用是什么。
Submessage有多种类型,他们具有不同的作用,总结如下表:

Submessage种类主要字段作用
AckNack+@readerId : EntityId
+@writerId : EntityId
+@readerSNState : SequenceNumberSet
+@count : Count
Reader用这个类型的消息告诉Writer它还没有收到某些消息,这些消息的序列号在readerSNState,用来实现可靠传输
Data+@extraFlags : Flags
+@octetsToInlineQos : short
+@readerId : EntityId
+@writerId : EntityId
+@writerSN : SequenceNumber
+@inlineQos : ParameterList
+@serializedData : SerializedPayload
用来发送数据类型的CacheChange给Reader,可能是数值也可能是某些数据的生命周期变化信息,具体是哪种信息需要根据extraFlags来判断
DataFrag+@extraFlags : Flags
+@octetsToInlineQos : short
+@readerId : EntityId
+@writerId : EntityId
+@writerSN : SequenceNumber
+@inlineQos : ParameterList
+@serializedData : SerializedPayload
+@fragmentStartingNum : FragmentNumber
+@fragmentsInSubmessage : ushort
+@dataSize : unsigned_long
+@fragmentSize : ushort
表示分片的Data数据,由Reader进行拼接
Gap+@readerId : EntityId
+@writerId : EntityId
+@gapStart : SequenceNumber
+@gapList : SequenceNumberSet
通知Reader某些序列号的message不再相关,这个目前我也不清楚是有什么用,后面懂的话回头再详细解释下
Heartbeat+@readerId : EntityId
+@writerId : EntityId
+@firstSN : SequenceNumber
+@lastSN : FragmentNumber
+@count : Count
通过此消息告诉Reader方 Writer那边的HistoryCache中有哪些序列号的消息,如果Reader发现自己缺了可以请求缺少的消息。如果Heartbeat没有设置FinalFlag,那么Reader端必须反馈AckNack来告诉Writer自己还缺少哪些序列号的消息;如果设置了FinalFlag,那么Reader沉默即可
HeartbeatFrag+@readerId : EntityId
+@writerId : EntityId
+@firstSN : SequenceNumber
+@lastSN : SequenceNumber
+@count : Count
当发送分片数据且没全部发完时,使用这个消息;分片发送完毕时用上面的Heartbeat
InfoDestination+@guidPrefix : GuidPrefixWriter发给Reader来修改GUID前缀
InfoReply+@multicastLocatorList : LocatorList
+@unicastLocatorList : LocatorList
Reader反馈Writer自己的地址
InfoSource+@protocolVersion : ProtocolVersion
+@vendorId : VendorId
+@guidPrefix : GuidPrefix
区分Writer所属的Participant
InfoTimestamp+@timestamp : Timestamp时间戳
NackFrag+@readerId : EntityId
+@writerId : EntityId
+@fragmentNumberState : FragmentNumberSet
+@count : Count
+@writerSN : SequenceNumber
分片时,Reader通知Writer缺少哪些序列号
Pad暂时不知道啥用

表中可以看出,通过AckNack、Heartbeat以及NackFrag可以实现可靠传输,接下来看一下数据的通信过程。

RTPS通信的过程

这张图描述了user(比如一个ROS2发布者和订阅者)之间通信的大致过程:
在这里插入图片描述
图中的步骤描述如下

  1. 用户调用DDS中间件DataWriter实体,执行write操作
  2. DataWriter通知RTPS实体Writer创建一个CacheChange
  3. DataWriter调用add_change将该Cachechange放到Writer的HistoryCache中
  4. 用户操作结束
  5. RTPS的Writer将CacheChange发送给RTPS Reader,使用的消息是上一章节的Data类型,并且发送HeartBeat给Reader用来获取Reader接收状态
  6. RTPS reader收到Data消息后,将CacheChange塞到HistoryCache里面
  7. DDS通知用户有新的Cachechange,ROS2里面用DDS的WaitSet接口,然后用户使用take操作来获取数据
  8. DDS DataReader从HistoryCache访问CacheChange
  9. RTPS Reader发送AckNack表明确认收到消息,这和用户的take操作是独立的,可能同时也可能先发生
  10. Writer(stateful)记录下确收的CacheChange
  11. reader这一方的用户调用return_loan操作,表明用户不再使用之前take的该消息
  12. DDS DataReader调用remove_change操作将该CacheChange从Reader的HistoryCache中移除
  13. DDS DataWriter根据is_acked_by_all判断CacheChange是否被所有期望接收的Reader确收,如果是的话就将该序号的CacheChange从Writer的HistoryCache中删除,HistoryCache的保留数量由QoS的DURABILITY确定

Writer在上面的例子中采用的StatefulWriter,实际中还有StatelessWriter,这需要根据具体的网络规模、硬件资源等进行选择。

RTPS的发现机制

DDS的另一个特征就是支持自动发现,协议规定了两种发现协议:

  • Participant发现协议(PDP)
  • Endpoint发现协议(EDP)
    协议要求必须实现基本的两种基本发现协议:SPDP和SEDP,他们适合中小型网络场景。
    RTPS预留了内置DataReaders和DataWriters以及相应的话题和QoS配置,内置话题包括:“DCPSParticipant,” “DCPSSubscription,” “DCPSPublication”和“DCPSTopic”。内置DataWriters用来向网络广播其本地的DDS Participant、Entities以及相关QoS配置;内置的DataReaders则收集远端发来的这些信息并区分那些Entities。

SPDP

SPDP对每个Participant预留两个内置Endpoint:SPDPbuiltinParticipantWriter 和 SPDPbuiltinParticipantReader。
SPDPbuiltinParticipantWriter是一个尽力交付的 StatelessWriter,不进行可靠传输且不维护Reader的接收状态。它周期性地向预先配置好的一系列locators(目标地址)交换其HistoryCache里的SPDPdiscoveredParticipantData数据。locators可以是多播或者单播地址。SPDPdiscoveredParticipantData的定义见下图:
在这里插入图片描述SPDPbuiltinParticipantWriter不断发布自己当前发现了的Participant,然后将自己发现的信息和其他人交换,这样每个Participant逐渐就都知道对方了。
上面提到SPDPbuiltinParticipantWriter往预先配置好的locators(网络地址)分享信息,这些locators其实是一些SPDP保留的熟知端口,根据平台不同定义成了两个宏:SPDP_WELL_KNOWN_UNICAST_PORT和SPDP_WELL_KNOWN_MULTICAST_PORT。

SEDP

一旦通过SPDP发现了另一个Participant,那么就认为对方Participant存在内置Endpoint并与对方的内置Endpoint进行配对即可,SEDP的内置Endpoint配对应当采用的可靠传输了。
在这里插入图片描述SEDP预留的内置Endpoint和数据类型如上图所示,其中TopicWriter和TopicReader是可选的。

移除

SPDPdiscoveredParticipantData中包含leaseDuration字段,这个字段表示一个Participant在这个时间周期内发布一次SPDPdiscoveredParticipantData则认为这个Participant还是或者的,如果超过leaseDuration没发送SPDPdiscoveredParticipantData则认为这个Participant已经下线,相关的资源以及Endpoint可以被释放掉。

总结

以上总结了DDS的传输协议,介绍了RTPS构成、消息、传输以及发现机制,对ROS2中如何与DDS中间件交互应该有了大致的轮廓。后面再深入看一下ROS2具体的eProsimaDDS实现。

这篇关于ROS2探索(四)DDS与RTPS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/272135

相关文章

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦

深入探索嵌入式 Linux

摘要:本文深入探究嵌入式 Linux。首先回顾其发展历程,从早期尝试到克服诸多困难逐渐成熟。接着阐述其体系结构,涵盖硬件、内核、文件系统和应用层。开发环境方面包括交叉编译工具链、调试工具和集成开发环境。在应用领域,广泛应用于消费电子、工业控制、汽车电子和智能家居等领域。关键技术有内核裁剪与优化、设备驱动程序开发、实时性增强和电源管理等。最后展望其未来发展趋势,如与物联网融合、人工智能应用、安全性与

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

多云架构下大模型训练的存储稳定性探索

一、多云架构与大模型训练的融合 (一)多云架构的优势与挑战 多云架构为大模型训练带来了诸多优势。首先,资源灵活性显著提高,不同的云平台可以提供不同类型的计算资源和存储服务,满足大模型训练在不同阶段的需求。例如,某些云平台可能在 GPU 计算资源上具有优势,而另一些则在存储成本或性能上表现出色,企业可以根据实际情况进行选择和组合。其次,扩展性得以增强,当大模型的规模不断扩大时,单一云平

探索Invoke:Python自动化任务的瑞士军刀

文章目录 探索Invoke:Python自动化任务的瑞士军刀背景:为何选择Invoke?`invoke`是什么?如何安装`invoke`?简单的`invoke`库函数使用方法场景应用:`invoke`在实际项目中的使用场景一:自动化测试场景二:代码格式化场景三:部署应用 常见问题与解决方案问题一:命令执行失败问题二:权限不足问题三:并发执行问题 总结 探索Invoke:P

使用亚马逊Bedrock的Stable Diffusion XL模型实现文本到图像生成:探索AI的无限创意

引言 什么是Amazon Bedrock? Amazon Bedrock是亚马逊云服务(AWS)推出的一项旗舰服务,旨在推动生成式人工智能(AI)在各行业的广泛应用。它的核心功能是提供由顶尖AI公司(如AI21 Labs、Anthropic、Cohere、Meta、Mistral AI、Stability AI以及亚马逊自身)开发的多种基础模型(Foundation Models,简称FMs)。

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显