了解FastDDS、FastRTPS 的底层实现原理

3,439 阅读3分钟

ref:fast-dds.docs.eprosima.com/en/latest/f…

明确概念

DDS协议

数据分发服务 (DDS) 是一种用于分布式软件的以数据为中心的通信协议 应用程序通信。 它描述了通信应用程序编程接口 (API) 和通信语义,这些接口使 数据提供者和数据使用者之间的通信。

DCPS模型

DDS是以 数据为中心的发布订阅 (DCPS) 模型,因此在其中定义了三个关键应用程序实体 实现:发布实体,定义信息生成对象及其属性; 订阅实体,定义信息消耗对象及其属性;和配置实体 定义作为主题传输的信息类型,并创建发布者和订阅者 其服务质量 (QoS) 属性,确保上述实体的正确性能。

其具有四个基本元素

  • 发布者 Publisher。DCPS的实体实现。
  • 订阅者 Subscriber。DCPS的实体实现。
  • 话题 Topic。用于绑定Pub和Sub,在DDS Domain中唯一。
  • 域 Domain。具有Domain ID,用于隔离不同的工作空间。

QoS

DDS 使用 QoS 来定义 DDS 实体的行为特征。QoS 由单个 QoS 策略组成 (派生自 QoSPolicy 类型的对象)。

RTPS发布订阅协议

实时发布订阅 (RTPS) 协议,开发用于 支持DDS应用,是发布-订阅通信中间件 通过尽力而为的传输,例如 UDP/IP。此外,快速DDS提供对TCP和 共享内存 (SHM) 传输。(说人话:DDS是数据分发的协议,RTPS是数据传输的协议,DDS基于RTPS来实现数据分发服务)

其包含组成部分

  • RTPSDomain。 它是DDS域对RTPS协议的扩展。
  • RTPSParticipant. 包含其他 RTPS 实体的实体。它允许配置和创建它包含的实体。
  • RTPSWriter。 消息的来源。它读取 DataWriterHistory 中写入的更改,并将它们传输给所有 它之前匹配的 RTPSReaders。
  • RTPSReader。 消息的接收实体。它将RTPSWriter报告的更改写入DataReaderHistory。

(这里的数据历史,需要结合DDS一起理解,见下文

FastDDS整体软件架构

注意:此文的所有代码实现都是 FastDDS-FastRTPS

软件层次

FastDDS整体架构如下,这里可以看到DDS和RTPS的关系。另外缺少一部分IDL(统一描述语言),其应该是Pub、Sub的反序列化、序列化工具。

在RTPS层,主角是Writer&Reader,其接口复杂和灵活。DDS层,主角是Publisher&Subscriber。

执行模型(Runtime)

并行模型

FastDDS中每个节点(也叫 DomainParticipant)具有:

  • 一个 主程序线程(用户持有)
  • 一个 事件和周期性任务的线程
  • 一个 异步发送线程,用于用户完成写入数据后,异步得完成网络通信
  • 多个 接收线程,每个reception channel,取决于传输层的实现方式

RTPS的通信历史

todo

RTPS的通信传输实现

在传输上,Fast-RTPS支持以下五种传输方式:

  • UDPv4
  • UDPv6
  • TCPv4
  • TCPv6
  • SHM(共享内存)

当 Participant 创建时,会自动的配置两个传输通道:

  • SHM:使用同一个机器上的参与者通信
  • UDPv4:同来与跨机器的参与者通信

RTPS的通信SHM实现

在同一Host中,RTPS会采用更高效的SHM(shared memory)方式在participant间共享信息。这里有三个实现版本:

  1. 共享内存传输 Shared Memory Transport (基本本版)
  2. 数据共享交付 Data Sharing Delivery
  3. 零拷贝 ZERO-COPY communication

上面的图中可见,通过减低Writer、Reader中对消息的备份减少内存的copy。可预见的,越高共享的内存实现越依赖通信同步机制。最终的zero copy方案直接预设A、B节点能实现完美的读写交错。

实际的自动驾驶场景,zero copy是十分必要的。

下图描述的是FastRTPS中的节点使用zero copy的实现。

RTPS的Qos策略

todo