明确概念
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间共享信息。这里有三个实现版本:
- 共享内存传输 Shared Memory Transport (基本本版)
- 数据共享交付 Data Sharing Delivery
- 零拷贝 ZERO-COPY communication
上面的图中可见,通过减低Writer、Reader中对消息的备份减少内存的copy。可预见的,越高共享的内存实现越依赖通信同步机制。最终的zero copy方案直接预设A、B节点能实现完美的读写交错。
实际的自动驾驶场景,zero copy是十分必要的。
下图描述的是FastRTPS中的节点使用zero copy的实现。
RTPS的Qos策略
todo