第二章 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<br/>应用层"] Layer2["Layer 2: DCPS Layer<br/>以数据为中心的发布订阅层"] Layer3["Layer 3: DLRL Layer(可选)<br/>数据本地重构层"] Layer4["Layer 4: RTPS Layer<br/>实时发布订阅协议层"] Layer5["Layer 5: Transport Layer<br/>传输层"] 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<br/>fastdds/dds/<br/>用户接口层"] RTPS["RTPS Core Layer<br/>fastrtps/rtps/<br/>协议核心层"] Transport["Transport Layer<br/>rtps/transport/<br/>传输适配层"] Utils["Utils Layer<br/>utils/<br/>工具库层"] 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<br/>DDS API] --> FD2[fastrtps::rtps<br/>RTPS实现] FD2 --> FD3[Transport接口<br/>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<br/>DataWriter participant RTPS as RTPS Core<br/>RTPSWriter participant Transport as Transport<br/>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打开的文件<br/>SharedMemTransportBak.h<br/>就是Transport层实现

3.2 订阅端流程(Sub)

sequenceDiagram participant Network as 网络/共享内存 participant Transport as Transport<br/>UDP/SHM participant RTPS as RTPS Core<br/>RTPSReader participant DDS as DDS API<br/>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<br/>接收数据到达通知

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 { <<interface>> +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图例 → 推荐材料 → 数据源标注

相关推荐
ltl13 小时前
架构视图与文档:C4 模型从入门到实战
后端
梦梦代码精13 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
杨了个杨898214 小时前
Keepalived + Nginx + HAProxy 高可用架构部署实战案例
java·nginx·架构
56AI15 小时前
360 智语 AI 企业智能体平台深度评测:从 L4 蜂群架构到政企落地实战
人工智能·架构
IT_陈寒16 小时前
Redis持久化这个坑,我爬了一整天才出来
前端·人工智能·后端
无风听海16 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
小小前端仔LC16 小时前
Node.js + LangChain + React:搭建个人知识库(六)- “吃什么”项目实战:从700+菜谱入库到Taro H5端JSON渲染
前端·后端
youngerwang16 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
程序员黑豆17 小时前
AI全栈开发之Java:怎么配置Java环境变量
前端·后端·ai编程
老毛肚17 小时前
JeecgBoot 后端架构与技术栈全景导读 01
架构