RTPS协议概述

一.RTPS协议概述

RTPS协议主要由四个部分组成:

1.发现模块(Discovery)

​ 发现模块是定义了RTPS的参与者(Participant)获取其他RTPS的参与者(Participant),端点(Endpoint)的协议,使得每个参与者(Participant)能够了解到整个网络中其他参与者的存在并且相互匹配。

metatraffic通信使得RTPS的参与者(Participant)可以获取到所有Participant,Reader以及Writer的快照并且让本地Reader和远端Writer以及本地Writer和远端Reader之间通信。

​ RTPS规范将发现模块拆为两个部分:

​ 1.1 参与者发现协议(PDP):指定了参与者如何在网络中发现彼此。

​ 1.2 端点发现协议(EDP):一旦发现彼此,则两个参与者就使用端点发现协议(EDP)交换起包含的端点的信息。

​ 所有RTPS的实现必须提供简单参与者发现协议(Simple PDP)和简单端点发现协议(Simple EDP)。

2.结构(Structor)

​ 结构定义了RTPS的各类实体(Entity)与域(Domain)的关系以及各类实体间的关联:

img

Entity:所有RTPS实体的父类,每个Entity对象拥有Guid,并且对其他Entity对象可见。Guid属性如下:

struct RTPS_DllAPI GUID_t    // 唯一标识一个Entity
{
    //!Guid prefix    每个Participant和其下的Endpoint都拥有相同的Guid Prefix
    GuidPrefix_t guidPrefix;
    //!Entity id    每个实体的EntityID不同
    EntityId_t entityId;
}

Endpoint:特殊的Entity,是RTPS消息的起点或者终点。Endpoint涉及的属性如下:

属性类型含义和DDS的关系
unicastLocatorListLocator_t[*]发送RTPS消息的目标Endpoint的单播地址的列表在Discovery过程中配置
multicastLocatorLi stLocator_t[*]发送RTPS消息的多播地址的列表(可以为空)在Discovery过程中配置
ReliabilityKindReliabilityKind_t可靠性等级(BestEffort / Reliable)Qos中指定的
topicKindTopicKind_t标识当前Endpoint上传输的数据是否有key,key数据的主要类型是InstanceHandle_t,对应了Guid
endpointGroupEntityId_t标记了Endpoint属于哪个RTPSGroup和DDS中的Subscriber/Publisher关联

​ Participant:是所有Endpoint的容器,共享属性。Participant涉及到的属性如下:

属性类型含义和DDS的关系
defaultUnicastLocatorListLocator_t[*]默认的单播地址列表(地址+端口)在Discovery过程中配置
defaultMulticastLocat orListLocator_t[*]默认的组播地址列表(地址+端口)在Discovery过程中配置
ProtocolVersionProtocolVersion_tRTPS协议版本号
VendorIdVendorId_tRTPS中间商代码需要向OMG组织申请

Writer:RTPS消息的起点,发送HistoryChange中的CacheChange消息到匹配的Reader的HistoryChange。

Reader:RTPS消息的终点,接受匹配的Writer发送的CacheChange数据。

RTPSGroup:主要有两种Group(Publisher和Subscriber)

3.消息(Message)

​ 消息模块定义了Reader和Writer之间交换的消息格式,主要有消息头(Header)和一系列子消息(SubMessage组成),每个子消息都由一系列子消息元素组成:

img

Header:

一个消息(Message)中可能包含多个子消息(SubMessage),这些子消息之间可能存在依赖关系/解释关系。

子消息分为实体子消息(Entity SubMessage)和解释子消息(Interpreter SubMessage)。

4.行为(Behavior)

​ 行为定义了Reader和Writer交换RTPS消息的顺序以及消息引起的相关实体(主要是Reader和Writer)状态的变化,RTPS中主要有行为模块的视线(有状态 Stateful 和 无状态 Stateless)。

​ RTPS Writer不控制什么时候从Writer的HistoryCache中删除CacheChange,删除CacheChange的动作是由DDS的Writer来完成的,这个和Qos配置有关,例如如果配置了KEEP_LAST,那么DataWriter只会保留最后一次发送的CacheChange数据,删除之前的Change数据。

​ 必须实现RTPS MessageReceiver接口(因为涉及到解析子消息时上下文的处理和状态机的切换)

​ StatefulWriter和StatefulReader交互数据的流程如下图:
在这里插入图片描述

4.1 通用要求(General Requirement)

​ Writer:

​ RTPSWriter发送HistoryCache中的CacheChange数据时,必须按照SequenceNumber的顺序进行发送。

​ 如果Reader要求inline Qos,则Writer发送数据的时候必须带上Qos数据(in-line Qos)。

​ 对于StatefulWriter,必须定周期发送HeartBeat子消息(如果HistoryCache中还有数据)。如果HistoryCache中没有数据了,那么StatefulWriter就不需要发送HeartBeat子消息了。StatefulWriter必须持续发送HeartBeat消息给StatefulReader(如果Reader返回的时候NACK)直到Reader读取了所有数据。

​ Writer对于Reader的NACK消息进行响应处理(因为这代表Reader有miss的数据需要Writer进行重发)

​ Reader:

​ 因为Stateless的Reader是完全被动的,只接受数据,不发送响应数据。因此,对Reader的通用要求大部分都是针对StatefulReader的。

​ 如果reader收到的HeartBeat包没有设置final flag标志位,则Reader对于这包HeartBeat必须做出响应,回复ACK或者NACK SubMessage。

​ 如果reader有数据没有收到(收到HeartBeat比对seq以后),必须回复Nack包告知Writer有数据包丢失需要重传。这个回复可以延迟以避免网络数据风暴。

4.2 具体实现

Writer:

​ StatelessWriter和StatefulWriter的主要区别在于持有对端Reader的方式和信息有所不同,类结构的区别如下图:
在这里插入图片描述

RTPSWriter的主要属性有下面8种:

属性类型含义和DDS的关系
pushModebool当属性为true时,Writer主动将change数据推送给reader,反之,change数据随着心跳包一起发送,并且是作为对Reader请求的应答N/A
heartbeatPeriodDuration_t周期发送心跳包消息的间隔(心跳包包含可被reader读取的数据的lastchangenumber)N/A
nackResponseDelayDuration_t对于Reader发送的NACK消息,允许Writer进行回复的最大延时N/A
lastChangeSequenceNumberSequenceNumber用于分配给下一个Change数据的内部递增的序列号N/A
writer_cacheHistoryCache包含历史CacheChange的容器,每个Writer内部保存N/A
nackSuppressionDurationDuration_t针对已经发送的CacheChange,如果在nackSuppressionDuration时间内收到了Reader发送的NACK报文,则可以忽略。N/A
dataMaxSize可选属性N/A

RTPSWriter主要提供new构造函数以及new_change函数,new_change函数返回新构造的CacheChange对象。

函数名参数类型
newWriter
attribute_values创建Writer以及其父类Endpoint时需要的属性集合
New_changeCacheChange
kindChangeKind_t
dataData
inlineQosParameterList
handleInstanceHandle_t

new操作大致步骤:

1.给如下成员赋值:

​ GUID:Entity的GUID

​ unicastlocatorlist:数据通信的单播地址列表

​ multicastlocatorlist:数据通信的组播地址列表

​ reliabilityLevel:可靠性等级(Reliable, BestEffort)

​ topicKind: NoKey, WithKey

​ pushMode: 主动推送数据还是跟随HeartBeat一起发送数据

​ heartbeatPeriod:心跳包间隔

​ nackResponseDelay:对于Reader的Nack包的最长回复延时

​ nackSuppressionDuration:发送Change数据多少时间内收到Nack子消息是可以忽略的

​ lastChangeSequenceNumber:数据包的序列号(递增)

  1. 创建writer_cache:Writer的HistoryCache(用于存放要发送的CacheChange)

New_change的操作步骤大致如下:

​ 递增lastChangeSequenceNumber

​ 新建CacheChange对象

​ a_change := new CacheChange(kind, this.guid, this.lastChangeSequenceNumber,

						    data, inlineQos, handle);

​ 返回CacheChange对象

StatelessWriter:

1.StatelessWriter不知道匹配的Reader的数量,也不保存每个匹配的RTPSReader的状态。StatelessWriter只保留要发送数据的Reader的Loator信息以便发送数据。

属性类型含义和DDS的关系
reader_locatorsReaderLocator[*]StatelessWriter保存发送数据的匹配Reader的locator列表,其中包括单播地址和组播地址N/A

StatelessWriter适用于内存较小(HistoryCache可以分配的小一点)或者对传输性能高的场合(例如组播的通信方式就适合数据大的场景)

函数名参数类型
newStatelessWriter
Attribute_values创建Statelesswriter和父类Endpint需要的参数集合
reader_locator_addvoid
a_locatorLocator_t
reader_locator_removevoid
a_locatorLocator_t
Unsent_change_resetVoid

New函数主要是创建了一个内部空的ReaderLocator列表用于后续添加Reader的Locator

reader_locator_add 函数功能是添加一个远端Reader的Locator(单播或者组播)到内部的ReaderLocatorList中

ADD a_locator TO {this.reader_locators};

reader_locator_remove 函数的功能是从内部的ReaderLocatorList中移除一个Locator

REMOVE a_locator FROM {this.reader_locators};

Unsent_change_reset函数的功能是重置内部ReaderLocatorList中每个ReaderLocator中的highestSentChangeSN的值

FOREACH readerLocator in {this.reader_locators} DO

​ readerLocator. highestSentChangeSN := 0

ReaderLocator

ReaderLocator是StatelessWriter用于记录所有匹配的远端Reader位置信息的值类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/519716.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决沁恒ch592单片机在tmos中使用USB总线时,接入USB Hub无法枚举频繁Reset的问题

开发产品时采用了沁恒ch592,做USB开发时遇到了一个奇葩的无法枚举问题。 典型症状 使用USB线直连电脑时没有问题,可以正常使用。 如果接入某些特定方案的USB Hub(例如GL3510、GL3520),可能会出现以下2种情况&#xf…

C# MES通信从入门到精通(9)——c#使用visual studio2019社区版部署webservice服务

前言 在上位机软件开发领域,我们经常使用调用webservice接口来和mes系统进行交互,我们在开发Mes程序之前也可以自己先模拟发布客户的webservice接口进行调用从而加快软件开发进度,本文就是详细介绍如何自己发布webservice接口。 1、创建 参考这篇博文:webservice服务创建…

【MYSQL进阶篇】详细版MYSQL优化

Mysql优化,让你彻底知道优化的各种情况以及解决方案 有一系列的代码和图片让你一步一步走,成为索引的真正实践者 坚持看完这篇文章,会让你功力瞬间提升一个档次 制作不易,觉得不错请点赞收藏 &#xff01…

java——文件上传

一、文件上传——简介 文件上传的简介:文件上传是指将本地计算机中的文件传输到网络上的服务器或另一台计算机上的过程。在 Web 开发中,文件上传通常指的是将用户通过 Web 页面提交的文件(如图像、文档、音频、视频等)传输到服务器…

包子凑数【蓝桥杯】/完全背包

包子凑数 完全背包 完全背包问题和01背包的区别就是,完全背包问题每一个物品能取无限次。 思路:当n个数的最大公约数不为1,即不互质时,有无限多个凑不出来的,即n个数都可以表示成kn,k为常数且不为1。当n个…

DFS序列

什么是DFS序 DFS序是指对一棵树进行DFS时,每个节点被访问到的顺序。DFS序分成两个部分:进入该节点的顺序和退出该节点的顺序。 如何求DFS序 对于DFS中当前节点 1:计数 2:进入当前节点的顺序等于当前计数 3:想所有…

达梦使用disql登录数据库显示“未连接”

基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例问题:达梦数据库在使用disql登录时,显示“未连接”。 指定了IP和端口号还是连接异常。 […

淘宝扭蛋机小程序源码搭建:打造专属电商娱乐新平台

在数字化浪潮的推动下,电商平台不断创新,以满足消费者日益多样化的需求。淘宝扭蛋机小程序作为一种创新的电商娱乐形式,受到了广大用户的热烈追捧。为了满足市场需求,许多企业和开发者开始关注淘宝扭蛋机小程序的源码搭建&#xf…

SAP S/4HANA的常见部署方式

SAP S/4HANA是SAP面向企业数字化转型推出一代商务ERP 套件,与传统的SAP ERP系统相比,它基于内存计算和先进的数据处理技术,提供更快的数据处理速度、实时分析和更好的用户体验。SAP S/4HANA可以根据企业的需求以多种部署方式进行实施&#xf…

【零基础学数据结构】顺序表实现书籍存储

目录 书籍存储的实现规划 ​编辑 前置准备: 书籍结构体: 书籍展示的初始化和文件加载 书籍展示的销毁和文件保存 书籍展示的容量检查 书籍展示的尾插实现 书籍展示的书籍增加 书籍展示的书籍打印 书籍删除展示数据 书籍展示修改数据 在指定位置之前…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用,相较于BPMNJS相对容易一些,更加灵活一些,但是扩展代码可能写得更多一些。 示例展示 使用方式 这个的使用方式就简单很多了,利用cdn把js下载下来,引入到HTML文…

Python爬虫-懂车帝新能源汽车近一年销量榜

前言 本文是该专栏的第24篇,后面会持续分享python爬虫干货知识,记得关注。 笔者在本专栏之前,有详细介绍以“懂车帝平台的新能源汽车销量榜单”为例,获取各车型的销量排行榜单数据。而本文,笔者将单独详细来介绍如何获取“近一年的新能源汽车销量榜单”数据。 具体实现思…

信创(统信)系统上的软件安装及软件使用手册

一.各软件的安装文档 1.达梦数据库在统信系统上的安装 官方手册:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html 1.1下载安装包 官网:https://www.dameng.com/list_103.html 点击”服务与合作”--> “下载中心” 这里选择对应的cpu和操作…

#include<初见c语言之字符函数和字符串函数>

目录 一、字符分类函数 二、字符转换函数 三、strlen的使⽤和模拟实现 1.strlen使用 2.strlen函数的模拟实现 四、 strcpy的使⽤和模拟实现 1.strcpy使用 2.strcpy函数的模拟实现 五、strcat的使用和模拟实现 1.strcat的使用 2.strcat的模拟实现 六、strcmp的使用…

【HTML】CSS样式(二)

上一篇我们学习了CSS基本样式和选择器,相信大家对于样式的使用有了初步认知。 本篇我们继续来学习CSS中的扩展选择器及CSS继承性,如何使用这些扩展选择器更好的帮助我们美化页面。 下一篇我们将会学习CSS中常用的属性。 喜欢的 【点赞】【关注】【收藏】…

214基于matlab的交互多模算法(IMM)机动目标跟踪算法

基于matlab的交互多模算法(IMM)机动目标跟踪算法,完整的15页文档论文。根据二维空间内目标作匀速直线运动和匀速圆周运动的特点,在建立目标运动模型和观测模型的基础上采用基于交互多模算法(IMM)的卡尔曼滤…

MySQL 50 道查询题汇总,足以巩固大部分查询(附带数据准备SQL、题型分析、演示、50道题的完整SQL)

目录 MySQL 50 道查询题,足以巩固大部分查询数据准备:创建表sql添加表数据sql 50道查询题目汇总01 - 05 题:1、查询 “01” 语文成绩比 “02” 数学成绩高的学生的信息及课程分数2、查询 "01语文课程"比"02数学课程"成绩…

ARM架构学习笔记2-汇编

RISC是精简指令集计算机(RISC:Reduced Instruction Set Computing) ARM汇编概述 一开始,ARM公司发布两类指令集: ① ARM指令集,这是32位的,每条指令占据32位,高效,但是太占空间 2…

0基础学习Mybatis系列数据库操作框架——自定义类型处理器

大纲 Java模型类定义类型处理器配置文件和类型绑定和字段绑定resultMap中绑定 Mapper代码测试类型对应关系表总结参考资料 我们有时候会在数据库中放入一个扩展字段,用于保存在表设计时尚未考虑到的、未来会加入的一些信息。这个字段我们一般使用字符串存储&#xf…

短视频素材高清无水印购买要多少钱?

大家好!在制作短视频时,找到短视频素材高清无水印是非常重要的。那么,短视频素材高清无水印在哪里找呢?今天,我要给大家推荐六个主流的视频素材分享网站,帮助你轻松获取高质量的短视频素材高清无水印&#…