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

4 阅读7分钟

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对应
L1Application用户业务逻辑用户代码
L2DCPSDomain/Topic/Participant/Pub/Sub/DW/DRfastdds::dds 命名空间
L3DLRL对象到数据的映射(已较少使用)不支持
L4RTPS发现、序列化、可靠传输协议fastrtps::rtps 命名空间
L5TransportUDP/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.cppListener模式回调示例
examples/cpp/hello_world/WaitsetSubscriberApp.cppWaitSet模式同步等待示例

第三方开源方案:

方案项目/公司定制点链接
Zenoh-FastDDSeclipse-zenohTransportInterfacegithub.com/eclipse-zen…
CycloneDDSEclipse完整DDS实现对比github.com/eclipse-cyc…
Fast-DDS-GeneProsimaTopicDataType代码生成github.com/eProsima/Fa…

定制扩展示例代码片段:

1. 自定义ContentFilter(来自examples/cpp/content_filter/

// 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/

// 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继承链(来自源码)

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 BridgeuORB消息到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/DataReaderQosrmw_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 SpecificationOMG官方文档第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.hppDDS API入口
/home/my/code/opensource/Fast-DDS/include/fastdds/dds/publisher/DataWriter.hppDataWriter接口
/home/my/code/opensource/Fast-DDS/include/fastdds/dds/subscriber/DataReader.hppDataReader接口
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/participant/RTPSParticipant.cppRTPS核心实现
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/writer/RTPSWriter.cppRTPSWriter实现
/home/my/code/opensource/Fast-DDS/src/cpp/rtps/reader/RTPSReader.cppRTPSReader实现
/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 Spec2.2DCPS架构概述
RTPS Spec8.1RTPS架构概述
RTPS Spec8.2RTPS实体关系

5.3 示例代码参考

示例文件说明
hello_worldPublisherApp.cpp发布端完整流程
hello_worldWaitsetSubscriberApp.cpp订阅端WaitSet模式
hello_worldListenerSubscriberApp.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图例 → 推荐材料 → 数据源标注