DDS

DDS采用的通信模型是多对多单向数据交换,其中应用 生成数据,发布到属于应用的订阅者本地缓存中,这些应用正在消耗数据。 信息流由各实体之间建立的服务质量(QoS)政策监管 负责数据交换。
DDS域内信息流动的概念图。 只有属于同一域的实体才能发现每个 其他则通过匹配主题。

DDS Domain

DDS安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mkdir ~/Fast-DDS
cd ~/Fast-DDS
git clone https://github.com/eProsima/foonathan_memory_vendor.git
mkdir foonathan_memory_vendor/build
cd foonathan_memory_vendor/build
cmake .. -DCMAKE_INSTALL_PREFIX=~/Fast-DDS/install -DBUILD_SHARED_LIBS=ON
cmake --build . --target install
cd ~/Fast-DDS
git clone https://github.com/eProsima/Fast-CDR.git
mkdir Fast-CDR/build
cd Fast-CDR/build
cmake .. -DCMAKE_INSTALL_PREFIX=~/Fast-DDS/install
cmake --build . --target install

cd ~/Fast-DDS
git clone https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
###iron###
git fetch --tags
git checkout v2.10.4
##########
mkdir build
cd Fast-DDS/build
cmake .. -DCMAKE_INSTALL_PREFIX=~/Fast-DDS/install
cmake --build . --target install

RTPS(实时发布订阅协议)是其底层实现的核心协议,用于支持分布式系统中的高效数据传输。RTPS通过定义消息格式、行为和发现机制,实现不同DDS产品间的互操作性。

RTPS

RTPS协议的核心模块

RTPS协议主要由以下四个模块组成:

  1. 结构模块:定义了RTPS的核心概念和数据结构,如GUID_t(全局唯一标识符)、Locator_t(通信地址信息)等。这些结构为通信实体提供了唯一标识和数据传输的基础。
  2. 报文模块:定义了RTPS消息的格式,包括消息头和子消息。子消息分为三类: 可靠型:如Heartbeat、AckNack,用于可靠传输。 信息型:如InfoDestination、InfoTimestamp,用于传递元信息。 数据型:如Data、DataFrag,用于传输用户数据。
  3. 行为模块:描述了Writer和Reader的行为。根据可靠性需求,分为Stateless(无状态)和Stateful(有状态)两种模式: StatelessWriter/Reader适用于BEST-EFFORT传输。 StatefulWriter/Reader适用于RELIABLE传输,支持基于序列号的反馈重传机制。
  4. 发现模块:实现通信实体的动态发现,分为两种协议: PDP(参与者发现协议):用于发现域内的参与者。 EDP(端点发现协议):用于发现参与者下的Writer和Reader。

RTPS在非可靠传输层(如UDP)上实现可靠传输,主要流程如下:

  1. Heartbeat子消息:Writer通过Heartbeat告知Reader当前有效的样本序列号范围。
  2. AckNack子消息:Reader对比本地接收的序列号,反馈缺失的序列号。
  3. 数据重传:Writer根据AckNack的反馈,通过Data或Gap子消息重传缺失的数据。

RTPS的动态发现机制是DDS分布式架构的基础。通过SPDP(简单域发现协议)和SEDP(简单端点发现协议),实现参与者和端点的自动发现与匹配。SPDP基于UDP组播,周期性广播参与者信息;SEDP则通过单播交换Writer和Reader的详细信息。

我一定会回来的,未完待续。。。

ROS 2 RMW 实现总览