Skip to content

image.png 1. 概述

概述

RTPS规范,全称为实时发布/订阅协议DDS互操作规范(The Real-Time Publish-Subscribe Protocol (RTPS) DDS Interoperability Wire Protocol Specification),RTPS在某些场景下也被叫做DDSI-RTPS。该协议产生的原因在于:

  • DDS接口(DCPS)规范;
  • 不同厂家实现DDS接口规范形成不同的DDS产品;
  • 使用不同DDS产品的系统需要集成,即对不同厂家的DDS互操作、互联互通提出了新的需求;
  • 提出RTPS规范来定义DDS底层的报文格式、行为等内容。

RTPS规范的内容参见下图,主要分为4个模块:

  • 结构模块,定义概念和数据结构;
  • 报文模块,定义报文格式;
  • 行为模块,定义不同配置下传输的行为,即什么情况下发送什么报文,如何响应接收到的报文;
  • 发现模块,综合使用以上三个模块,定义简单发现协议,用于通信实体之间的自动发现与匹配。

结构模块

描述了作为通信参与者的RTPS实体的结构,如下图所示,RTPS实体是被应用程序可见的DDS实体相互通信而使用的协议级端点。

image.png

概念定义 说明
Entity 实体,包括:参与者以及通信实体(写者、读者)的共用属性,包括:唯一标识;
Participant 参与者,作为通信实体(写者、读者)的父实体,存储协议版本、供应商 ID 以及默认的地址信息;
Endpoint 通信实体,作为写者以及读者的父类抽象,存储两端共有的信息,包括使用的通信地址、可靠性等级一级主题等级;
Writer 写者,用于发送数据,每个写者关联一个 HistoryCache,用于维护发送的数据,并提供接口发送数据;
Reader 读者,用于接收数据,每个读者关联一个 HistoryCache,用于维护接收到的数据列表;
HistoryCache 历史数据缓存队列,提供增、删、查的功能,队列中的元素为 CacheChange;
CacheChange 描述一个样本数据,包括:发送方标识、序列号、所属数据实例以及负载。

报文模块

Messages模块描述了在RTPS Writer端点和RTPS Reader端点之间交换的消息的总体结构和逻辑内容。

报文模块的总体结构如下所示:

  • Message,RTPS 消息,包含一个消息头(Header)以及 1 个到多个子消息(SubMessage);
  • Header,RTPS 消息头;
  • SubMessage,RTPS 子消息,作为不同子消息的抽象结构,包括一个子消息头(SubmessageHeader)以及每种不同子消息包含不同的一个到多个子消息元素(SubmessageElement),子消息根据功能上的不同可以分为三类;
    • 可靠型,包括:Heartbeat、AckNack、NackFrag;
    • 信息型,包括:InfoDestination、InfoTimeStamp、InfoReply 以及 InfoSource;
    • 数据型,包括:Data、Gap、DataFrag;

行为模块

行为模块进一步定义了 Writer/Reader 的接口及其行为,主流开源DDS都基于RTPS协议进行实施,Fast DDS支持直接调用RTPS接口,embeddedRTPS 专注嵌入式场景下的RTPS协议实现,可以“纯RTPS”运行。 行为模块的几种典型的行为:

  • StatelessWriter 对应 BEST-EFFORT 类型的数据写者;

    • IDLE状态,匹配新的远程数据读者后进入IDLE状态;
    • PUSHING状态,当有未发送的样本数据时,进入该状态,在该状态下循环发送未发送的样本数据,直到发送完成后进入IDLE状态,仅涉及到DATA以及GAP两类子消息; image.png
  • StatelessReader 对应 BEST-EFFORT 类型的数据读者;

  • StatefulWriter 对应 RELIABLE 类型的数据写者;

  • StatefulReader 对应 RELIABLE 类型的数据读者;

发现模块

发现模块是DDS“纯分布式架构”的基础,每个应用上的DDS实体能够通过纯分布式的方式获取到系统内其他DDS实体的信息,并根据这些信息进行基于主题的按需分发。发现模块定义了两个协议:参与者发现协议(PDP)端点发现协议(EDP)

  1. 参与者发现阶段(PDP):发现网络中其他 DDS 参与者
  2. 端点发现阶段(EDP):在已发现的参与者之间,发现彼此拥有的、可能匹配的 DataWriter 和 DataReader

1. 参与者发现协议(PDP)

核心功能

  • 创建内置的参与者发现端点(SPDP Writer/Reader)
  • 周期性广播本地参与者信息
  • 接收并处理远程参与者信息
  • 维护参与者代理数据(ParticipantProxyData)
  • 触发端点发现过程

工作流程

  1. 启动阶段:每个 DomainParticipant 启动时,创建一对内置端点(SPDP Writer 和 Reader)
  2. 广播机制:周期性(默认 3 秒)在预定义的多播地址和端口上发送 SPDPdiscoveredParticipantData 消息
  3. 消息内容:包含自身 Participant 的 GUID、QoS、定位信息(Locator - IP/Port)等
  4. 接收与处理:接收其他 Participant 的 SPDP 消息,更新参与者代理数据
  5. 连接建立:收到新 Participant 公告后,尝试建立与对方 Participant 的通信通道
  6. 离开检测:通过停止接收公告或收到明确的 dispose 消息检测 Participant 离开

发现模式

  • 多播发现:节点加入预定义多播组,无需预知其他节点地址,适用于局域网
  • 单播发现:节点需预先配置对端地址,通过点对点通信交换信息,适用于广域网或跨子网场景

2. 端点发现协议(EDP)

核心功能

  • 交换 DataWriter 和 DataReader 的信息
  • 匹配可能通信的端点
  • 确认匹配成功,建立数据传输通道

工作流程

  1. 信息交换:通过 PDP 建立的通信信道,共享 DataWriter 和 DataReader 的信息
  2. 匹配条件:主题(Topic)和数据类型必须一致
  3. 确认机制:通过 heartbeat、acknack 等消息确认数据样本
    • 例如:B 的 SEDPbuiltinSubscriptionWriter 发送 heartbeat 给 A 的 SEDPbuiltinSubscriptionReader
    • A 收到后,若发现缺少样本,会发送 acknack 告知丢失的样本
    • B 发送缺失的样本,更新 heartbeat
  4. 匹配完成:当双方确认数据一致后,DataWriter 和 DataReader 可以开始发送/接收用户数据

3. 其他 DDS 实现的发现机制

Fast DDS 提供了多种发现机制,以适应不同应用场景:

  1. 简单发现(Simple Discovery)

    • 默认机制:支持 PDP 和 EDP 的 RTPS 标准
    • 兼容性:提供与任何其他 DDS 和 RTPS 实现的兼容性
    • 工作方式:使用 SPDP 和 SEDP 协议自动完成发现过程
  2. 静态发现(Static Discovery)

    • 特点:跳过 EDP 阶段,无需自动发现
    • 实现:通过 XML 文件预先配置对端信息
  3. 发现服务器(Discovery Server)

    • 架构:集中式发现体系结构
    • 工作方式:DomainParticipant(称为服务器)充当元流量发现的集线器
    • 优势:适用于大规模分布式系统,减少网络广播流量
  4. 手动发现(Manual Discovery)

    • 特点:禁用 PDP
    • 工作方式:用户使用外部元信息信道手动匹配和取消匹配 RTPS 实体
    • 适用场景:特殊网络环境或需要高度定制化的系统

基于 VitePress 构建