第二章 Fast-DDS 整体架构与分层框架

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

各层职责:

层级 名称 职责 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

源码目录映射:

架构层 源码路径 核心类
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

关键差异:

维度 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层实现

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
接收数据到达通知

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_tDataWriterQos/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模式

六、本节小结

核心要点:

  1. OMG规范定义概念分层(DCPS→RTPS→Transport),保证互操作性
  2. Fast-DDS实现 将概念映射为代码实体(fastdds::ddsfastrtps::rtpstransport
  3. 双视角学习:先理解规范概念,再跟踪代码实现
  4. Pub-Sub流程:Discovery→数据传输→关闭,双向都有完整生命周期
  5. 当前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图例 → 推荐材料 → 数据源标注

相关推荐
DolphinDB2 小时前
漫长人工,耗费存储?用 BackupRestore 模块一站式解决跨环境数据同步难题
运维·后端·架构
敖正炀2 小时前
DDD + Kubernetes:领域服务到微服务的部署映射
架构
Sam_Deep_Thinking2 小时前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构
钟智强2 小时前
硬核自研|HunTianDB 混天DB:Rust原生工业级时序安全数据库全技术拆解
后端
敖正炀2 小时前
从代码到架构:编写表达业务意图的陈述式代码
架构
敖正炀2 小时前
聚合设计指南:大小、边界与事务一致性
架构
敖正炀2 小时前
防腐层与接口适配:集成多个限界上下文的策略
架构
_遥远的救世主_3 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
敖正炀3 小时前
CQRS 与 Event Sourcing 深度:Axon Framework 实战
架构