RTPS协议之Structure

目录

  • 概览
    • RTPS中的各实体和类
    • RTPS实体和类的属性类型:
    • RTPS Entities属性
  • HistoryCache
  • CacheChange
  • RTPS Entity
  • RTPS Participant
  • RTPS EndPoint
  • RTPS Writer
  • RTPS Reader
  • 和DDS Entities的关联
    • DDS DataWriter
    • DDS DataReader

每个RTPS实体和DDS实体是一对一对应的。HistoryCache充当了DDS Entities和RTPS Entities之间的接口。比如说,DDS DataWriter的写操作会添加一个CacheChange到RTPS Writer的HistoryCache中,RTPS Writer随后将CacheChange发送给所有匹配的RTPS Readers,然后由RTPS Reader通知DDS DataReader新的CacheChange到达。

概览

RTPS中的各实体和类

ClassPurpose
Entity所有RTPS Entities的基类。RTPS Entity代表了网络中其他Etities能够看到的,所以RTPS Entity有一个GUID,并且可以在RTPS 消息中引用这个guid
EndpointRTPS Entity的子类,可以作为通讯端点的对象,即既可以发出RTPS消息,也可以接收RTPS消息的对象。
Participant所有RTPS实体的容器,这些实体共享相同的属性,并位于同一个地址空间中。
WriterRTPS Endpoint的子类,CacheChanges.消息的源端
ReaderRTPS Endpoint的子类,CacheChanges.消息的接收端
HistoryCache用于存储和管理一系列data对象的changes。并不需要保留所有历史changes记录,而只需要保留那些对于当前和未来的RTPS Reader端点所需要的changes。所需的部分历史记录取决于DDS(数据分发服务)的QoS(服务质量)以及与匹配的Reader(读取器)端点的通信状态。在RTPS协议中,QoS策略可以用于指定数据守护进程服务如何处理数据。例如,它可以设置数据是否需要在传输过程中进行加密,是否需要对未传送的数据进行排队等。通信状态则可以反映读取器端点与写入器端点之间的连接状态,比如是否正常通信,是否存在延迟等。因此,所需的部分历史记录会根据这些因素进行动态调整;Reader端只需要保留一部分的历史记录,这些记录是所有匹配的Writer端点对数据对象变更的叠加,而并不需要维护全部的历史记录。这部分历史记录的大小和规则取决于DDS的服务质量需求和与Writer端点的通信状态。
CacheChange代表着对数据对象所做的单个变更。这包括数据对象的创建、修改和删除。
Data用户数据

RTPS实体和类的属性类型:

Attribute typePurpose
GUID_t唯一标识系统中的每个RTPS实体,必须用16个字节,保留值:GUID_UNKNOWN
GuidPrefix_t用于guid中的prefix,同属于一个participant的每个entities的guid的有相同的prefix,必须使用12个字节表示,保留值GUIDPREFIX_UNKNOWN
EntityId_t用于guid中的suffix,participant的中不同entities具有不同的entity_id,必须使用4个字节,保留值:ENTITYID_UNKNOWN
SequenceNumber_tsequence number,用64位表示,保留值:SEQUENCENUMBER_UNKNOWN
Locator_t用于发送到RTPS 对端的地址信息结构,包括三部分:1. 一个区分器:一个唯一的标识符,用于指定传输协议的类型(例如,TCP、UDP等)。这个区分器使用4字节(32比特)进行编码;2. 地址,用16个字节; 3. 端口,用4个字节表示,以下值保留:LOCATOR_INVALID,LOCATOR_KIND_INVALID, LOCATOR_KIND_RESERVED, LOCATOR_KIND_UDPv4, LOCATOR_KIND_UDPv6, LOCATOR_ADDRESS_INVALID, LOCATOR_PORT_INVALID
TopicKind_t用于区分是否一个topic定义了一些字段作为key,这个key用于识别topic中的数据实例;RTPS协议中有两种主题种类:NO_KEY和WITH_KEY。NO_KEY表示主题没有定义键,相当于所有主题实例都是唯一的,不需要关键字段来区分。而WITH_KEY表示主题定义了一些字段作为键,这些键字段将用于识别和区分主题内的不同数据实例。
ChangeKind_t用来区别对数据对象所做的不同种类的变更。这些变更包括对数据本身的改动,或者对数据对象的实例状态的改动。简单来说,这个概念被用来描述或者记录数据对象在时间线上的变化。例如,你可能想知道一个数据对象是被添加、删除、修改,还是下线了,这些信息都可以由"ChangeKind_t"枚举类型来标识,并通过RTPS协议传给订阅者。包含以下值:ALIVE, ALIVE_FILTERED, NOT_ALIVE_DISPOSED, NOT_ALIVE_UNREGISTERED
ReliabilityKind_t用于描述通信的可靠状态,包括:BEST_EFFORT, RELIABLE.
InstanceHandle_t代表数据对象身份的类型。在RTPS协议中,一个数据对象的身份(也就是指数据对象的唯一标识)是由一个特定类型来表示的。这个类型用于在RTPS协议中表示和追踪数据对象,使得数据对象的值的变化能够被有效地监测和沟通。这就意味着,这个特定类型的数据实质上就是数据对象的唯一ID,用来标志、标识一个特定的数据对象,确保信息传输的过程中,接收方可以确切知道每个接收到的变化值应该关联到哪个数据对象上。
ProtocolVersion_tRTPS protocol版本
VendorId_t实现RTPS协议的供应商

RTPS Entities属性

RTPS Eitities的一部分属性是通过DDS的Qos映射来的;一些属性(或者说参数)可以进行调整,以便适应特定的传输环境和部署情况。通过调整这些参数,可以改变协议的行为,使之适合当前的网络环境和应用需求;除了上面的属性之外,RTPS协议还有一些其他的属性,它们不是用来调节协议的行为的,而是用来记录或者表示RTPS实体(例如某个特定的数据对象)当前的状态的。这些状态信息对于理解和跟踪协议的运行过程是很重要的,但它们不影响协议的基本行为。
主要实体类的属性配置UML类图

HistoryCache

HistoryCache用于连接DDS和RTPS,在读端和写端有不同的作用。
读端,包含了所有匹配的RTPSWriter端发送的部分数据。部分是因为,没有必要保持所有变更的完整历史。相反,我们需要的是历史的一个子集,这个子集必须能够满足RTPS协议的行为需求和相关DDS实体的QoS需求。定义这个子集的规则 由RTPS协议规定,既取决于通信协议的状态,也取决于相关DDS实体的QoS。
HistoryCache属性:

attributetypemeaningrelation to DDS
changesCacheChange[*]HistoryCache中包含的CacheChanges的容器History / DataReaderHistory / DataWriterHistory

HistoryCache操作:
P 9.2.2 24页

  • new:创建一个新的RTPS HistoryCache,并初始化一个空的changes的list
  • add_change:将一个新的CacheChange添加到HistoryCache中,这个操作只有在没有足够的资源将变更添加到历史缓存时才会失败。这是DDS服务实现的责任,需要以与DDS实体的 RESOURCE_LIMITS QoS一致的方式配置历史缓存,并按照DDS规范的指定方式向DDS用户传播任何错误。
  • remove_change:将CacheChange对象从HistoryCache中移除
  • get_seq_num_min:获取HistoryCache中CacheChange对象的CacheChange::sequenceNumber 的最小值
  • get_seq_num_max:获取HistoryCache中CacheChange对象的CacheChange::sequenceNumber 的最大值

CacheChange

属性类型含义与DDS的关联对应到Fast DDS中的成员
kindChangeKind_tChangeKind_t 类型DDS instance state kindkind
writerGuidGUID_tRTPS Writer的GUID_twriterGUID
instanceHandleInstanceHandle_t数据实例In DDS, the value of the fields labeled as ‘key’ within the data uniquely identify each data- object.instanceHandle
sequenceNumberSequenceNumber_tRTPS Writer使用Sequence number唯一标识一个change.sequenceNumber
data_valueDataCacheChange是用来追踪数据对象状态变化的。每个CacheChange都有一个与之关联的数据值。这个数据值描述了与变化相关的具体数据内容。但这句话同时也指出,根据CacheChange的种类,可能并没有与之关联的数据。也就是说,并非所有的CacheChange都会改变数据或有新的数据,有些CacheChange只是表示一种状态变化,比如从‘未修改’变为‘已修改’,但并没有具体的修改内容。serializedPayload :SerializedPayload_t
inlineQosParameterListContains QoS that may affect the interpretation of the CacheChange::data_value.DDS-specific information which affects the data.inline_qos:SerializedPayload_t

RTPS Entity

RTPS Entity是所有RTPS实体类的基类。实体属性如下:

attributetypemeaningrelation to DDS
guidGUID_t在DDS domain中全局且唯一标识RTPS 实体

GUID是一个tuple,tuple <prefix, entityId> 包含一个GuidPrefix_t prefix 和一个EntityId_t entityId
在这里插入图片描述

字段类型含义
prefixGuidPrefix_t在Domain中唯一标识了Participant
entityIdEntityId_t在Participant中唯一标识了Entity
  • GUIDs of RTPS Participants:每个Participant都有一个GUID:<prefix, ENTITYID_PARTICIPANT>,其中ENTITYID_PARTICIPANT是一个常量,依赖平台的定义,prefix的实现只要保证唯一性即可。
  • GUID 为<participantPrefix, ENTITYID_PARTICIPANT>的Participant中的RTPS Endpoints的GUID 为<participantPrefix, entityId>,其中entityId在这个participant中是唯一的:
    • 同一Participant中的Endpoints的GUID有相同的prefix.
    • 只要知道了Endpoint中的GUID,包含该endpoint的Participant的GUID也就知道了
    • 任何端点的GUID都可以从它所属的participant的GUID和它的entity ID中推导出来。每个RTPS实体的实体ID的选择取决于PSM。
  • DDS定义了Publisher和Subscriber实体,这两个实体定义的GUID符合这里的描述;

RTPS Participant

对应于DDS DomainParticipant
TODO 8.2.5 P28

属性类型含义与DDS的关联Fast DDS对应的字段
defaultUnicastLocatorListLocator_t[*]默认单播的locators(transport, address, port)
defaultMulticastLocatorListLocator_t[*]默认多播的locators
protocolVersionProtocolVersion_tRTPS协议版本
vendorIdVendorId_t供应商id

RTPS EndPoint

RTPS Endpoint代表了从RTPS协议的角度来看可能的通信端点。有两种RTPS endpoint实体:Writer和Reader。
RTPS Endpoint属性有以下:

attributetypemeaningrelation to DDS
unicastLocatorListLocator_t[*]用于给endpoint发送消息的unicast locators(transport,address,port的组合),这个列表可能是空的
multicastLocatorListLocator_t[*]用于给endpoint发送消息的unicast locators(transport,address,port的组合),这个列表可能是空的
reliabilityLevelReliabilityKind_tEndpoint.支持的reliabilityRELIABILITY QoS的kind
topicKindTopicKind_t表示是否支持实例生命周期管理操作由与DDS topic关联的Data-type定义,表明与rtps endpoint关联的datatype是否定义了一些包含dds key的字段

RTPS Writer

所有的RTPS Writer属于RTPS Group,用于向已经匹配的RTPS Readers发送CacheChange

RTPS Reader

所有的RTPS Reader属于RTPS Group。用于接收已经匹配的Writer消息。

和DDS Entities的关联

HistoryCache建立了DDS Entities和RTPS Entities之间的关联。但是RTPS协议并未规定DDS如何和HistoryCache交互,只规定了如何从RTPS writer的HistoryCache中传输CacheChange到每个匹配的RTPS reader的HistoryCache。

DDS DataWriter

DDS DataWriter添加CacheChange到与它关联的RTPS Writer的HistoryCache中。所以HistoryCache中保存了写入的CacheChange,具体保存多少由DDS的DataWriter的Qos(如HISTORY 和 RESOURCE_LIMITS)决定。
默认情况下,所有HistoryCache中的CacheChange都会被发送到与其匹配的远端readers中。
CacheChange没有被发送到远端Readers中有两个原因:

  • DDS DataWriter 从HistoryCache移除了,所以不再有效
  • 被认为是与Reader无关

DDS DataWriter从HistoryCache中移除CacheChange的原因有以下几点:

  1. History Qos中设置了限制数量
  2. LIFESPAN Qos中设置了sample的生命周期
  3. 使用reliable通信时,当所有接收到该CacheChange的readders都已经确认,且仍然是active和alive的时,这个CacheChange才会被删除。

并非所有的更改都对每个匹配的远端readers都有关,如TIME_BASED_FILTER Qos,或使用DDS 内容过滤topic,是否一次change具有相关性必须根据每个reader的情况来判断。在可能的情况下,通过在writer端进行过滤,可能能优化带宽或CPU使用。换句话说,只有被认为与特定reader有关的change才会被发送,从而节约资源使用。是否能优化带宽和/或CPU使用取决于实现是否跟踪每个单独的远程reader以及适用于该reader的QoS和过滤器。reader本身总是会过滤的。这意味着如果系统以一种方式实现,使得它能够记住针对每个reader的特定设置和过滤,那就可以在writer端进行优化过滤,而不是全部依赖reader端的过滤。
根据写writer存储的reader的特定信息,DDS_FILTER(reader端过滤change)可能不会进行任何操作。对于基于内容的过滤,RTPS规范允许在每次变更时发送信息,列出已经应用于change的过滤器,以及通过了哪些过滤器。如果有这些信息,那么reader可以在不调用DDS_FILTER的情况下过滤change。这种方法通过在writer端一次过滤样本,而不是在每个reader端过滤,节省了CPU周期。
DataWriter adds a change to HistoryCache

Transitionstateeventnext state
T1initialnew DDS DataWriteralive
T2aliveDataWriter::writealive
T3aliveDataWriter::disposealive
T4aliveDataWriter::unregisteralive
T5alivedelete DDS DataWriterfinal

DDS DataReader

DatReader从RTPSReader的HistoryCache中获取数据,存储在HistoryCache中的数据由Qos决定(HISTORY,RESOURCE_LIMITS)。
每个匹配的writer都将尝试将其HistoryCache中的所有相关samples传输到reader的HistoryCache中。在DDS DataReader上通过read或take调用获取HistoryCache中的数据。返回给用户的change是通过所有reader的特定filter的HistoryCacahe中的change。

实现可能能够在writer一侧执行大部分过滤。在这种情况下,samples要么从未发送(因此不存在于reader的HistoryCache中),要么包含了应用了哪些过滤器及其相应结果的信息(基于content-based的过滤)

DataReader可以根据Qos如TIME_BASED_FILTER从HistoryCache中移除changes,
DataReader状态图

Transitionstateeventnext state
T1initialnew DDS DataReaderalive
T2aliveDDS DataReader::readalive
T3aliveDDS DataReader::takealive
T4alivedelete DDS DataReaderfinal

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

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

相关文章

Bidirectional Copy-Paste for Semi-Supervised Medical Image Segmentation

文章目录 1. 问题背景2. 本文方法2.1. 模型图2.2. 损失函数 2. 模型的训练流程图3. 实验 1. 问题背景 &#xff08;1&#xff09;在半监督医学图像分割任务中&#xff0c;标签数据和无标签数据之间存在经验失配问题。 &#xff08;2&#xff09;如果采用分隔的方式或者采用不一…

lua vm 二: 查看字节码、看懂字节码

本文讲一讲如何查看 lua 的字节码&#xff08;bytecode&#xff09;&#xff0c;以及如何看懂字节码。 以下分析基于 lua-5.4.6&#xff0c;下载地址&#xff1a;https://lua.org/ftp/ 。 1. 查看字节码 1.1 方法一&#xff1a;使用 luac luac 是 lua 自带的编译程序&#x…

Django的PATH路径转换器

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架中&#xff0c;默认内置了一组PATH路径转换器&#xff0c;具…

Chromebook也可以安装Visual Studio Code

文章目录 ​一、Chromebook也可以安装Visual Studio Code二、chromebook硬件条件三、在chromebook上启用Linux四、安装VS Code推荐阅读 ​一、Chromebook也可以安装Visual Studio Code 在过去几年里&#xff0c;运行谷歌Chrome操作系统的Chromebook一直在作为传统笔记本电脑的…

css 图片上添加模糊背景的文字内容

html部分 <div class"onlogo"> <img src"../assets/img/banner.png" /><div class"imgText"><div class"title">一体化电子印章应用服务</div><div class"content">为企业提供安全可靠…

OverlayFS在嵌入式系统中的应用

文章目录 抛出问题基本概念使用场景OverlayFS的详细介绍框架目录合并修改文件删除文件添加文件小结 OverlayFS在嵌入式系统中的应用内核配置OverlayFS简单应用OverlayFS应用新思路 总结 环境介绍 硬件&#xff1a;T113平台 软件&#xff1a;Tina5.0 SDK&#xff08;使用的build…

RocketMQ中client_log非常大

rocketmq默认不使用logback日志&#xff0c;所以得额外配置&#xff0c;使mq使用logback配置 使用logback中的日志配置 配置MQ 使用logback的配置,具体原理见ClientLogger.java的static代码块 在应用启动函数中添加如下代码 System.*setProperty*(ClientLogger.*CLIENT_LOG_USE…

Coolmuster Android助手评测:简化Android到电脑的联系人传输

产品概述 Coolmuster Android助手是一款旨在简化Android设备与计算机之间数据管理和传输过程的全面工具。它以用户友好的界面和全面的功能&#xff0c;成为寻求高效数据管理解决方案的Android用户的热门选择。 主要特点和功能Coolmuster Android助手拥有一系列使其成为管理Andr…

TMS FNC WX Pack TMS软件分发的一组应用程序

TMS FNC WX Pack TMS软件分发的一组应用程序 TMS FNC WX Pack是由TMS软件分发的一组应用程序。这些活动是100%的跨平台和跨Frimorc&#xff0c;并在不同的应用程序中得到支持&#xff0c;如Web应用程序、Windows、Linux等。阿拉伯语视觉组件库。安装这些计算机的过程非常简单高…

postman教程-10-使用cookie

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节我们学习了Postman Authorization授权的几种方法&#xff0c;本小节我们讲解一下Postman 使用cookie的方法。 Postman 的 cookie 管理器使您能够查看和编辑与不同域关联的 cookie。您可以为域手动创建 c…

Windows10 设置默认编码为utf-8

Windows10 设置默认编码为utf-8 序言步骤 序言 有一些程序&#xff0c;默认读取出来gbk的会报错&#xff0c;有很多都是&#xff0c;干脆就直接设置电脑为默认utf-8的&#xff0c;这样就不用担心读取成gbk的怎么样了&#xff0c;具体是否需要要看自己的程序 步骤 完成了

高端、大气、很牛B的免费wordpress模板主题

这是一款专为WordPress打造的极简主义风格主题&#xff0c;以白色和黑色为主色调&#xff0c;搭配红色点缀&#xff0c;营造出一种简洁、专业且具有视觉冲击力的效果。 该主题的设计理念是“简单即美”&#xff0c;旨在帮助用户快速搭建一个美观、易用的网站。它提供了丰富的自…

【Java】接口详解

接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含静态常量。 一个简单的接口代码示例 interface IShape { void draw(); } class Cycle implements IShape { Override public void draw() { System.out.println…

如何制作一本温馨的电子相册呢?

随着科技的不断发展&#xff0c;电子相册已经成为了一种流行的方式来记录和分享我们的生活。一张张照片&#xff0c;一段段视频&#xff0c;都能让我们回忆起那些温馨的时光。那么&#xff0c;如何制作一本温馨的电子相册呢&#xff1f; 首先&#xff0c;选择一款合适的电子相册…

绕过WAF(Web应用程序防火墙)--介绍、主要功能、部署模式、分类及注入绕过方式等

网站WAF是一款集网站内容安全防护、网站资源保护及网站流量保护功能为一体的服务器工具。功能涵盖了网马/木马扫描、防SQL注入、防盗链、防CC攻击、网站流量实时监控、网站CPU监控、下载线程保护、IP黑白名单管理、网页防篡改功能等模块。能够为用户提供实时的网站安全防护&…

Docker无法stop或者rm指定容器

Docker无法stop或者rm指定容器 今日准备重启一下docker 容器部署的 Nginx 时&#xff0c;使用的命令是 docker exec -it ir-nginx nginx -s reload 结果发现无法重启报错 然后想着关闭再启动&#xff0c;结果发现 docker restart 、docker stop 、docker kill 、docker exec 都…

STM32-15-DMA

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD 文章目录 STM…

基础—SQL—DQL(数据查询语言)条件查询

一、DQL—语法 SELECT 字段列表 FROM 表名 WHERE 条件列表; 注意&#xff1a;条件列表可以是一个&#xff0c;也可以是多个。 二、条件列表的一些构建形式 注意&#xff1a; 1、BETWEEN ... AND ... &#xff08;between 后面跟最小值&#xff0c;and 后面跟最大值&#xff0…

VxWorks PCI驱动

1 概述 PCI接口是一种DMA接口&#xff0c;通过DMA接口&#xff0c;CPU和外设能够进行内存的共享&#xff0c;这样CPU访问外设时只需要访问计算机系统的内存就可以了&#xff0c;这样做的一个重要的目的就是增加外部设备的自主性&#xff0c;在外部设备工作时可以不需要CPU的参与…

《QT从基础到进阶·四十一》无法解析的外部符号及生成事件加入QT打包命令报错问题

其他无法解析的外部符号&#xff1a; 无法解析的外部符号 "public: virtual struct QMetaObject const * __cdecl ML_AddinManger::metaObject(void)const "… 无法解析的外部符号 “public: virtual void * __cdecl ML_AddinManger::qt_metacast(char const *)” (?…