1.2 整体架构与分层框架
章节状态:已完成
更新时间:2026-05-21
一、生活化通俗类比
类比:快递物流系统
想象你要寄一个包裹从北京到上海:
OMG官方视角(标准规范层)
- 就像国家邮政局制定的《快递服务标准》
- 规定:必须有寄件人、收件人、包裹内容、时效承诺
- 不规定:用什么车运输、走哪条高速、仓库怎么建
Fast-DDS实现视角(工程落地层)
- 就像顺丰公司的实际运营系统
- 分拣中心(RTPS层):统一处理所有包裹的路由
- 运输车队(Transport层):公路/航空/铁路多种选择
- 末端配送(API层):快递员上门取件/送件
双视角的关系
- 标准保证:顺丰包裹可以给圆通送( interoperability 互操作)
- 实现优化:顺丰用飞机运急件,用货车运普通件(性能优化)
二、专业化标准定义与技术原理
2.1 OMG官方DDS规范分层(概念视角)
graph TB
subgraph "OMG DDS规范架构"
direction TB
Layer1["Layer 1: Application Layer
应用层"] Layer2["Layer 2: DCPS Layer
以数据为中心的发布订阅层"] Layer3["Layer 3: DLRL Layer(可选)
数据本地重构层"] Layer4["Layer 4: RTPS Layer
实时发布订阅协议层"] Layer5["Layer 5: Transport Layer
传输层"] Layer1 --> Layer2 Layer2 --> Layer4 Layer3 --> Layer2 Layer4 --> Layer5 end style Layer2 fill:#90EE90 style Layer4 fill:#90EE90
应用层"] Layer2["Layer 2: DCPS Layer
以数据为中心的发布订阅层"] Layer3["Layer 3: DLRL Layer(可选)
数据本地重构层"] Layer4["Layer 4: RTPS Layer
实时发布订阅协议层"] Layer5["Layer 5: Transport Layer
传输层"] Layer1 --> Layer2 Layer2 --> Layer4 Layer3 --> Layer2 Layer4 --> Layer5 end style Layer2 fill:#90EE90 style Layer4 fill:#90EE90
各层职责:
| 层级 | 名称 | 职责 | Fast-DDS对应 |
|---|---|---|---|
| L1 | Application | 用户业务逻辑 | 用户代码 |
| L2 | DCPS | Domain/Topic/Participant/Pub/Sub/DW/DR | fastdds::dds 命名空间 |
| L3 | DLRL | 对象到数据的映射(已较少使用) | 不支持 |
| L4 | RTPS | 发现、序列化、可靠传输协议 | fastrtps::rtps 命名空间 |
| L5 | Transport | UDP/TCP/SHM等底层传输 | fastrtps::rtps::transport |
2.2 Fast-DDS工程实现分层(代码视角)
graph TB
subgraph "Fast-DDS源码架构"
direction TB
API["API Layer
fastdds/dds/
用户接口层"] RTPS["RTPS Core Layer
fastrtps/rtps/
协议核心层"] Transport["Transport Layer
rtps/transport/
传输适配层"] Utils["Utils Layer
utils/
工具库层"] API --> RTPS RTPS --> Transport RTPS --> Utils end style API fill:#e1f5ff style RTPS fill:#90EE90 style Transport fill:#ffe1e1
fastdds/dds/
用户接口层"] RTPS["RTPS Core Layer
fastrtps/rtps/
协议核心层"] Transport["Transport Layer
rtps/transport/
传输适配层"] Utils["Utils Layer
utils/
工具库层"] API --> RTPS RTPS --> Transport RTPS --> Utils end style API fill:#e1f5ff style RTPS fill:#90EE90 style Transport fill:#ffe1e1
源码目录映射:
| 架构层 | 源码路径 | 核心类 |
|---|---|---|
| API Layer | /home/my/code/opensource/Fast-DDS/include/fastdds/dds/ |
DomainParticipant, Publisher, Subscriber, DataWriter, DataReader, Topic |
| RTPS Core | /home/my/code/opensource/Fast-DDS/src/cpp/rtps/ |
RTPSParticipant, RTPSWriter, RTPSReader, StatefulReader, WriterHistory, ReaderHistory |
| Transport | /home/my/code/opensource/Fast-DDS/src/cpp/rtps/transport/ |
TransportInterface, UDPv4Transport, UDPv6Transport, TCPv4Transport, SharedMemTransport |
| Utils | /home/my/code/opensource/Fast-DDS/include/fastdds/utils/ |
FixedSizeQueue, TimedMutex, Semaphore |
2.3 双视角对比
graph LR
subgraph "OMG规范视角"
OMG1[Application] --> OMG2[DCPS]
OMG2 --> OMG3[RTPS]
OMG3 --> OMG4[Transport]
end
subgraph "Fast-DDS实现视角"
FD1[fastdds::dds
DDS API] --> FD2[fastrtps::rtps
RTPS实现] FD2 --> FD3[Transport接口
UDP/SHM/TCP] FD2 --> FD4[Utils工具库] end OMG2 -.->|对应| FD1 OMG3 -.->|对应| FD2 OMG4 -.->|对应| FD3
DDS API] --> FD2[fastrtps::rtps
RTPS实现] FD2 --> FD3[Transport接口
UDP/SHM/TCP] FD2 --> FD4[Utils工具库] end OMG2 -.->|对应| FD1 OMG3 -.->|对应| FD2 OMG4 -.->|对应| FD3
关键差异:
| 维度 | OMG规范 | Fast-DDS实现 |
|---|---|---|
| 目的 | 保证互操作性 | 高性能实现 |
| 粒度 | 概念抽象 | 代码实体 |
| 灵活性 | 标准固定 | 可扩展(如自定义Transport) |
| 学习路径 | 理解概念关系 | 跟踪代码调用链 |
三、核心模块协作关系
3.1 发布端流程(Pub)
sequenceDiagram
participant App as 用户应用
participant DDS as DDS API
DataWriter participant RTPS as RTPS Core
RTPSWriter participant Transport as Transport
UDP/SHM participant Network as 网络/共享内存 App->>DDS: write(data) DDS->>DDS: 序列化(Serialize) DDS->>RTPS: 创建RTPS消息 RTPS->>RTPS: 分片(如需要) RTPS->>RTPS: 添加可靠性信息(ACKNACK) RTPS->>Transport: send() Transport->>Network: UDP包/SHM写入 Note over Transport: 当前IDE打开的文件
SharedMemTransportBak.h
就是Transport层实现
DataWriter participant RTPS as RTPS Core
RTPSWriter participant Transport as Transport
UDP/SHM participant Network as 网络/共享内存 App->>DDS: write(data) DDS->>DDS: 序列化(Serialize) DDS->>RTPS: 创建RTPS消息 RTPS->>RTPS: 分片(如需要) RTPS->>RTPS: 添加可靠性信息(ACKNACK) RTPS->>Transport: send() Transport->>Network: UDP包/SHM写入 Note over Transport: 当前IDE打开的文件
SharedMemTransportBak.h
就是Transport层实现
3.2 订阅端流程(Sub)
sequenceDiagram
participant Network as 网络/共享内存
participant Transport as Transport
UDP/SHM participant RTPS as RTPS Core
RTPSReader participant DDS as DDS API
DataReader participant App as 用户应用 Network->>Transport: 接收数据包 Transport->>RTPS: 解析RTPS消息 RTPS->>RTPS: 重组分片/可靠性检查 RTPS->>DDS: 反序列化数据 DDS->>DDS: 存入HistoryCache DDS->>App: take/read()获取数据 Note over App: 用户通过WaitSet/Listener
接收数据到达通知
UDP/SHM participant RTPS as RTPS Core
RTPSReader participant DDS as DDS API
DataReader participant App as 用户应用 Network->>Transport: 接收数据包 Transport->>RTPS: 解析RTPS消息 RTPS->>RTPS: 重组分片/可靠性检查 RTPS->>DDS: 反序列化数据 DDS->>DDS: 存入HistoryCache DDS->>App: take/read()获取数据 Note over App: 用户通过WaitSet/Listener
接收数据到达通知
3.3 完整Pub-Sub交互流程
sequenceDiagram
autonumber
participant PubApp as Pub应用
participant DW as DataWriter
participant RTPSW as RTPSWriter
participant Trans as Transport
participant Net as 网络/SHM
participant TransR as Transport
participant RTPSR as RTPSReader
participant DR as DataReader
participant SubApp as Sub应用
Note over PubApp,SubApp: === Discovery阶段 ===
RTPSW->>Net: 发送Participant Discovery
Net->>RTPSR: 接收Discovery
RTPSR->>RTPSW: 回送Discovery响应
Note over DW,DR: Topic匹配成功
Note over PubApp,SubApp: === 数据传输阶段 ===
PubApp->>DW: write(data)
DW->>DW: 序列化
DW->>RTPSW: 发送数据
RTPSW->>Trans: send()
Trans->>Net: UDP/SHM传输
Net->>TransR: 接收数据
TransR->>RTPSR: 解析RTPS消息
RTPSR->>RTPSW: 发送ACK确认(可靠模式)
RTPSR->>DR: 存入History
DR->>SubApp: take()获取数据
Note over PubApp,SubApp: === 关闭阶段 ===
PubApp->>DW: delete DataWriter
DW->>RTPSW: 发送Unregister
RTPSW->>Net: 通知下线
Net->>RTPSR: 接收Unregister
RTPSR->>DR: 标记Writer离线
3.4 关键类关系图
classDiagram
class DomainParticipant {
+create_publisher()
+create_subscriber()
+create_topic()
}
class Publisher {
+create_datawriter()
}
class DataWriter {
+write()
+wait_for_acknowledgments()
}
class Subscriber {
+create_datareader()
}
class DataReader {
+take()
+read()
}
class RTPSParticipant {
+create_writer()
+create_reader()
}
class RTPSWriter {
+send()
+process_acknack()
}
class RTPSReader {
+receive()
+send_acknack()
}
class TransportInterface {
<>
+send()
+receive()
}
class UDPv4Transport {
+send() UDP实现
}
class SharedMemTransport {
+send() 共享内存实现
}
DomainParticipant --> Publisher
DomainParticipant --> Subscriber
Publisher --> DataWriter
Subscriber --> DataReader
DataWriter --> RTPSWriter
DataReader --> RTPSReader
RTPSWriter --> RTPSParticipant
RTPSReader --> RTPSParticipant
RTPSWriter --> TransportInterface
RTPSReader --> TransportInterface
TransportInterface <|-- UDPv4Transport
TransportInterface <|-- SharedMemTransport
3.5 Fast-DDS可定制扩展点一览
除了 TransportInterface,Fast-DDS 框架还有以下可定制点:
| 定制点 | 接口/基类 | 用途 | 源码路径 |
|---|---|---|---|
| 传输层 | TransportInterface |
自定义网络传输(如RDMA、CAN总线) | include/fastdds/rtps/transport/TransportInterface.hpp |
| 数据类型 | TopicDataType |
自定义序列化/反序列化 | include/fastdds/dds/topic/TopicDataType.hpp |
| 内容过滤 | IContentFilter + IContentFilterFactory |
订阅端数据过滤 | include/fastdds/dds/topic/IContentFilter.hpp |
| 监听器 | DomainParticipantListener PublisherListener DataWriterListener SubscriberListener DataReaderListener |
异步事件回调 | include/fastdds/dds/domain/DomainParticipantListener.hpp include/fastdds/dds/publisher/DataWriterListener.hpp include/fastdds/dds/subscriber/DataReaderListener.hpp |
| 内存池 | IPayloadPool |
自定义内存分配策略 | include/fastdds/rtps/history/IPayloadPool.hpp |
| 安全插件 | Authentication AccessControl Cryptography |
DDS-Security实现 | include/fastdds/rtps/security/ |
| 发现协议 | PDP (Participant Discovery Protocol) |
自定义发现机制 | src/cpp/rtps/builtin/discovery/participant/ |
开源案例与代码路径:
| 定制点 | 官方示例路径 | 关键文件 | 说明 |
|---|---|---|---|
| 传输层 | examples/cpp/delivery_mechanisms/ |
- | 展示SHM/UDP配置切换 |
src/cpp/rtps/transport/shared_mem/ |
SharedMemTransport.h |
共享内存传输实现(当前IDE打开) | |
src/cpp/rtps/transport/ |
UDPv4Transport.h TCPv4Transport.h |
UDP/TCP传输实现 | |
| 内容过滤 | examples/cpp/content_filter/ |
CustomContentFilter.hpp CustomContentFilterFactory.hpp |
自定义过滤器示例:按index范围过滤 |
| 内存池 | examples/cpp/custom_payload_pool/ |
CustomPayloadPool.hpp |
自定义内存池示例:简单new/delete管理 |
| 安全插件 | examples/cpp/security/ |
secure_publisher_profile.xml secure_subscriber_profile.xml |
DDS-Security配置示例 |
| 监听器 | examples/cpp/hello_world/ |
ListenerSubscriberApp.cpp |
Listener模式回调示例 |
examples/cpp/hello_world/ |
WaitsetSubscriberApp.cpp |
WaitSet模式同步等待示例 |
第三方开源方案:
| 方案 | 项目/公司 | 定制点 | 链接 |
|---|---|---|---|
| Zenoh-FastDDS | eclipse-zenoh | TransportInterface | github.com/eclipse-zen... |
| CycloneDDS | Eclipse | 完整DDS实现对比 | github.com/eclipse-cyc... |
| Fast-DDS-Gen | eProsima | TopicDataType代码生成 | github.com/eProsima/Fa... |
定制扩展示例代码片段:
1. 自定义ContentFilter(来自examples/cpp/content_filter/)
cpp
// CustomContentFilter.hpp
class CustomContentFilter : public eprosima::fastdds::dds::IContentFilter
{
bool evaluate(
const SerializedPayload& payload,
const FilterSampleInfo& sample_info,
const GUID_t& reader_guid) const override
{
// 反序列化index字段
uint32_t index = deserialize_index(payload);
// 自定义过滤逻辑:只接收index在[low_mark_, high_mark_]范围外的数据
return (index < low_mark_ || index > high_mark_);
}
};
2. 自定义PayloadPool(来自examples/cpp/custom_payload_pool/)
cpp
// CustomPayloadPool.hpp
class CustomPayloadPool : public eprosima::fastdds::rtps::IPayloadPool
{
bool get_payload(unsigned int size, SerializedPayload_t& payload) override
{
// 自定义内存分配策略(示例使用简单new)
payload.data = new unsigned char[size];
payload.payload_owner = this; // 标记自己为owner
return true;
}
bool release_payload(SerializedPayload_t& payload) override
{
// 自定义内存释放
delete[] payload.data;
return true;
}
};
3. 自定义Transport继承链(来自源码)
scss
TransportInterface (抽象接口)
├── UDPTransportInterface
│ ├── UDPv4Transport
│ └── UDPv6Transport
├── TCPTransportInterface
│ ├── TCPv4Transport
│ └── TCPv6Transport
└── SharedMemTransport (直接继承)
知名开源项目集成Fast-DDS的扩展案例:
| 项目 | 领域 | Fast-DDS使用方式 | 扩展/定制内容 | 相关代码路径 |
|---|---|---|---|---|
| ROS2 (rmw_fastrtps) | 机器人中间件 | 默认DDS中间件 | QoS策略映射、XML配置扩展、传输层配置 | github.com/ros2/rmw_fa... rmw_fastrtps_shared_cpp/src/ |
| PX4 Autopilot | 无人机飞控 | microRTPS Bridge | uORB消息到DDS的桥接、自定义IDL生成 | github.com/PX4/PX4-Aut... msg/目录IDL文件 src/modules/micrortps_bridge/ |
| Autoware | 自动驾驶 | ROS2+Fast-DDS | 激光雷达/摄像头数据零拷贝传输、QoS调优 | github.com/autowarefou... |
| Gazebo Simulator | 仿真器 | ROS2+Fast-DDS | 传感器仿真数据传输、大消息分片 | github.com/gazebosim/g... |
ROS2 (rmw_fastrtps) 扩展点定制详解:
ROS2的Fast-DDS中间件实现是最典型的扩展案例:
| 定制内容 | 实现方式 | 代码位置 | 学习价值 |
|---|---|---|---|
| QoS到DDS QoS映射 | rmw_qos_profile_t → DataWriterQos/DataReaderQos |
rmw_fastrtps_shared_cpp/src/qos.cpp |
学习如何桥接不同QoS模型 |
| 传输层配置 | 通过FASTDDS_BUILTIN_TRANSPORTS环境变量 |
rmw_fastrtps_shared_cpp/src/custom_participant_info.cpp |
动态切换UDP/SHM/TCP |
| XML配置文件 | DEFAULT_FASTDDS_PROFILES.xml加载 |
ROS2文档:docs.ros.org/en/rolling/... | 学习高级配置方式 |
PX4 microRTPS Bridge 扩展点定制详解:
PX4飞控通过microRTPS Bridge将内部uORB消息系统与Fast-DDS打通:
| 定制内容 | 实现方式 | 代码位置 | 学习价值 |
|---|---|---|---|
| IDL代码生成 | uORB msg → IDL → Fast-DDS代码 | msg/tools/uorb_to_idl.py msg/templates/urtps/ |
学习自定义代码生成 |
| TopicDataType定制 | 为每个uORB消息生成序列化代码 | src/modules/micrortps_bridge/micrortps_client/ |
学习TopicDataType实现 |
| 传输层优化 | 针对飞控资源受限优化 | 使用micro XRCE-DDS(Fast-DDS的轻量版) | 嵌入式DDS优化 |
四、推荐材料学习
4.1 架构理解资源
| 类型 | 资源 | 说明 |
|---|---|---|
| 官方文档 | Fast-DDS架构概述 | fast-dds.docs.eprosima.com/en/latest/f... |
| 视频 | B站-ROS2 DDS架构解析 | 搜索"ROS2 DDS架构" |
| 论文 | RTPS Protocol Specification | OMG官方文档第8章架构部分 |
| AI辅助 | 用ChatGPT解释类图 | 将上述Mermaid图粘贴询问 |
4.2 源码阅读工具
| 工具 | 用途 | 命令/链接 |
|---|---|---|
| VS Code + Clangd | 代码跳转 | 安装Clangd插件,自动索引 |
| Sourcetrail | 可视化代码关系 | github.com/CoatiSoftwa... |
| clang-check | 静态分析 | clang-check -analyze src.cpp |
| Doxygen | 生成文档 | doxygen doxyfile.in |
五、数据源标注
5.1 架构相关源码路径
| 路径 | 说明 |
|---|---|
/home/my/code/opensource/Fast-DDS/include/fastdds/dds/domain/DomainParticipant.hpp |
DDS API入口 |
/home/my/code/opensource/Fast-DDS/include/fastdds/dds/publisher/DataWriter.hpp |
DataWriter接口 |
/home/my/code/opensource/Fast-DDS/include/fastdds/dds/subscriber/DataReader.hpp |
DataReader接口 |
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/participant/RTPSParticipant.cpp |
RTPS核心实现 |
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/writer/RTPSWriter.cpp |
RTPSWriter实现 |
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/reader/RTPSReader.cpp |
RTPSReader实现 |
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/transport/ |
Transport层实现 |
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/transport/shared_mem/SharedMemTransport.h |
共享内存传输(当前IDE打开) |
5.2 官方规范章节
| 文档 | 章节 | 内容 |
|---|---|---|
| DDS Spec | 2.2 | DCPS架构概述 |
| RTPS Spec | 8.1 | RTPS架构概述 |
| RTPS Spec | 8.2 | RTPS实体关系 |
5.3 示例代码参考
| 示例 | 文件 | 说明 |
|---|---|---|
| hello_world | PublisherApp.cpp |
发布端完整流程 |
| hello_world | WaitsetSubscriberApp.cpp |
订阅端WaitSet模式 |
| hello_world | ListenerSubscriberApp.cpp |
订阅端Listener模式 |
六、本节小结
核心要点:
- OMG规范定义概念分层(DCPS→RTPS→Transport),保证互操作性
- Fast-DDS实现 将概念映射为代码实体(
fastdds::dds→fastrtps::rtps→transport) - 双视角学习:先理解规范概念,再跟踪代码实现
- Pub-Sub流程:Discovery→数据传输→关闭,双向都有完整生命周期
- 当前IDE文件
SharedMemTransportBak.h属于Transport层实现
七、学习检查清单与解答
| 检查项 | 解答要点 |
|---|---|
| OMG规范有几层? | 5层:Application→DCPS→DLRL(可选)→RTPS→Transport |
| Fast-DDS代码有几层? | 4层:API→RTPS Core→Transport→Utils |
| DataWriter.write()的调用链? | DataWriter → RTPSWriter → Transport::send() → 网络/SHM |
| DataReader.take()的调用链? | 网络/SHM → Transport::receive() → RTPSReader → DataReader → 用户应用 |
| 为什么要分层? | 解耦:上层关注业务,下层关注传输;可替换:可自定义Transport |
| Discovery的作用? | 自动发现Domain内的Participant,匹配Topic,建立连接 |
本章内容按五件套规范编写:生活化类比 → 专业定义 → Mermaid图例 → 推荐材料 → 数据源标注