fastdds.type_propagation 详解

fastdds.type_propagation 详解

fastdds.type_propagation 是 Fast DDS 中用于控制类型信息传播的 PropertyPolicyQos 属性,属于 非标准 QoS 策略(Non-consolidated QoS)。该属性决定了 DomainParticipant 如何在网络中传播和接收类型定义信息。

  1. 基本概念
    类型传播(Type Propagation)是 Fast DDS 远程数据类型发现(Remote Data Types Discovery) 机制的核心部分,包括:
    TypeObject 注册:将本地类型信息注册到 TypeObjectRegistry
    EDP 消息传输:在端点发现阶段(EDP)附加类型元信息
    类型查找服务:通过 TypeLookup Service 动态获取远程类型定义
  2. 属性配置
    参数定义
    Table
    Copy
    属性名 取值 默认值 描述
    fastdds.type_propagation "disabled" / "enabled" / "minimal_bandwidth" / "registration_only" "enabled" 控制类型信息的传播方式
    四种模式对比
    Table
    Copy
    模式 TypeObject 注册 EDP 发送类型信息 EDP 接收类型信息 TypeLookup 服务响应
    disabled ❌ 不注册 ❌ 不发送 ❌ 忽略接收 ❌ 禁用
    enabled ✅ COMPLETE 和 MINIMAL ✅ COMPLETE 和 MINIMAL ✅ 处理接收 ✅ 启用
    minimal_bandwidth ✅ 仅 MINIMAL ✅ 仅 MINIMAL ✅ 仅处理 MINIMAL ✅ 启用
    registration_only ✅ COMPLETE 和 MINIMAL ✅ COMPLETE 和 MINIMAL ❌ 忽略接收 ❌ 禁用
  3. 各模式详解
    模式 1:disabled(完全禁用)
    使用场景:类型信息完全预定义,无需动态发现
    cpp
    Copy
    DomainParticipantQos pqos;
    pqos.properties().properties().emplace_back(
    "fastdds.type_propagation",
    "disabled");

// 效果:

// 1. 不注册任何 TypeObject

// 2. 不发送类型信息

// 3. 忽略接收的类型信息

// 4. 禁用 TypeLookup 服务

适用情况:

所有参与者使用相同的 IDL 文件编译

类型信息通过静态配置(如 XML 文件)加载

对带宽要求极高,希望消除类型发现开销

模式 2:enabled(完全启用 - 默认)

使用场景:标准动态类型发现

cpp

Copy

DomainParticipantQos pqos;

pqos.properties().properties().emplace_back(

"fastdds.type_propagation",

"enabled"); // 或不设置(默认)

// 效果:

// 1. 注册 COMPLETE 和 MINIMAL 两种 TypeObject

// 2. EDP 消息包含完整类型信息

// 3. 处理接收的类型信息

// 4. 启用 TypeLookup 服务

特点:

功能最完整:支持所有 X-Types 特性

带宽开销最大:EDP 消息可能较大

兼容性最好:与所有 Fast DDS 版本兼容

模式 3:minimal_bandwidth(最小带宽)

使用场景:类型信息相似但非完全相同

cpp

Copy

DomainParticipantQos pqos;

pqos.properties().properties().emplace_back(

"fastdds.type_propagation",

"minimal_bandwidth");

// 效果:

// 1. 仅注册 MINIMAL TypeObject

// 2. EDP 仅发送 MINIMAL 类型信息

// 3. 仅处理接收的 MINIMAL 信息

// 4. 启用 TypeLookup 服务(按需获取完整类型)

优势:

减少 EDP 带宽:MINIMAL TypeObject 体积更小

按需获取:通过 TypeLookup Service 动态获取完整类型

平衡性能与功能:适合类型差异较小的场景

模式 4:registration_only(仅注册)

使用场景:仅提供类型信息,不关心远程类型

cpp

Copy

DomainParticipantQos pqos;

pqos.properties().properties().emplace_back(

"fastdds.type_propagation",

"registration_only");

// 效果:

// 1. 注册 COMPLETE 和 MINIMAL TypeObject

// 2. EDP 发送完整类型信息

// 3. 忽略接收的类型信息(不处理)

// 4. 禁用 TypeLookup 服务

适用情况:

只发布不订阅:如传感器数据发布节点

类型信息单向流动:中心节点提供类型定义,边缘节点仅接收

  1. XML 配置示例

xml

Copy
<?xml version="1.0" encoding="UTF-8" ?> fastdds.type_propagation disabled

复制代码
    <!-- 最小带宽模式 -->
    <participant profile_name="minimal_bandwidth">
        <rtps>
            <propertiesPolicy>
                <properties>
                    <property>
                        <name>fastdds.type_propagation</name>
                        <value>minimal_bandwidth</value>
                    </property>
                </properties>
            </propertiesPolicy>
        </rtps>
    </participant>
</profiles>
  1. 实际应用场景 场景 1:带宽受限的物联网设备 cpp Copy // 嵌入式设备仅发送数据,不接收类型 DomainParticipantQos pqos; pqos.properties().properties().emplace_back( "fastdds.type_propagation", "registration_only");

// 节省带宽:不处理接收的类型信息

// 但允许其他参与者发现本设备的类型

场景 2:异构系统类型不兼容

cpp

Copy

// 系统 A 使用旧版 IDL,系统 B 使用新版 IDL

// 禁用类型传播,使用静态类型配置

DomainParticipantQos pqos;

pqos.properties().properties().emplace_back(

"fastdds.type_propagation",

"disabled");

// 手动加载 TypeObject 到 Registry

eprosima::fastdds::dds::TypeObjectRegistry::get_instance()->register_type_object(

"MyType", &type_object);

场景 3:多机器人系统

cpp

Copy

// 机器人集群,类型相似但非完全相同

// 使用 minimal_bandwidth 减少发现流量

DomainParticipantQos pqos;

pqos.properties().properties().emplace_back(

"fastdds.type_propagation",

"minimal_bandwidth");

// 仅在需要时通过 TypeLookup 获取完整类型

  1. 性能影响

Table

Copy

模式 发现阶段带宽 运行时延迟 功能完整性

disabled 最低 最低 受限(无动态类型)

enabled 最高 中等 完整

minimal_bandwidth 中等 较高(首次 TypeLookup) 完整

registration_only 中等 最低 单向类型传播

选择建议:

默认使用 enabled:开发和标准部署场景

嵌入式设备使用 disabled 或 registration_only:节省资源

大规模集群使用 minimal_bandwidth:减少网络负载

  1. 与 TypeLookup Service 的关系

fastdds.type_propagation 直接影响 TypeLookup Service 的行为:

enabled:TypeLookup Service 启用,可响应远程请求

minimal_bandwidth:TypeLookup Service 启用,按需提供完整类型

registration_only:TypeLookup Service 禁用,不响应请求

disabled:TypeLookup Service 禁用,完全不处理类型信息

注意:如果 fastdds.type_propagation 设置为 disabled,客户端无法获取未知类型的动态定义,可能导致匹配失败。

  1. 调试技巧

检查当前 DomainParticipant 的类型传播模式:

cpp

Copy

DomainParticipant* participant = ...;

DomainParticipantQos pqos;

participant->get_qos(pqos);

// 查找属性

for (const auto& prop : pqos.properties().properties()) {

if (prop.name() == "fastdds.type_propagation") {

std::cout << "Type propagation mode: " << prop.value() << std::endl;

break;

}

}

通过 Wireshark 抓包查看 EDP 消息大小:

enabled:EDP 消息较大,包含完整类型信息

minimal_bandwidth:EDP 消息较小,仅包含 MINIMAL 类型

disabled:EDP 消息最小,无类型信息

总结

fastdds.type_propagation 是 Fast DDS 中控制类型发现机制的关键属性,提供了从完全禁用到完全启用的灵活选择。理解各模式的区别和适用场景,可以显著优化 DDS 系统的带宽使用和发现性能。

相关推荐
Front_Yue26 分钟前
深入探究跨域请求及其解决方案
前端·javascript
wordbaby27 分钟前
React Native 进阶实战:基于 Server-Driven UI 的动态表单架构设计
前端·react native·react.js
小年糕是糕手27 分钟前
【C++】类和对象(二) -- 构造函数、析构函数
java·c语言·开发语言·数据结构·c++·算法·leetcode
抱琴_28 分钟前
【Vue3】我用 Vue 封装了个 ECharts Hooks,同事看了直接拿去复用
前端·vue.js
风止何安啊29 分钟前
JS 里的 “变量租房记”:闭包是咋把变量 “扣” 下来的?
前端·javascript·node.js
豐儀麟阁贵30 分钟前
8.2异常的抛出与捕捉
java·开发语言·python
老华带你飞32 分钟前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·社区养老保障
码龄3年 审核中32 分钟前
Linux record 03
java·linux·运维
Danny_FD34 分钟前
用 ECharts markLine 标注节假日
前端·echarts