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 系统的带宽使用和发现性能。

相关推荐
Bigger14 分钟前
Tauri (20)——为什么 NSPanel 窗口不能用官方 API 全屏?
前端·macos·app
bug总结15 分钟前
前端开发中为什么要使用 URL().origin 提取接口根地址
开发语言·前端·javascript·vue.js·html
suzhou_speeder33 分钟前
企业数字化网络稳定运行与智能化管理解决方案
运维·服务器·网络·交换机·poe·poe交换机
北漂IT民工_程序员_ZG40 分钟前
SpringBean生命周期,动态代理
java·spring boot·spring
老华带你飞1 小时前
建筑材料管理|基于springboot 建筑材料管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring
木心爱编程1 小时前
【Qt 5.14.2 新手实战】QTC++入门筑基——按钮与标签联动:QPushButton + QLabel 实现图片切换器
java·c++·qt
一招定胜负1 小时前
网络爬虫(第三部)
前端·javascript·爬虫
RisunJan1 小时前
Linux命令-grpck命令(验证和修复组配置文件(`/etc/group` 和 `/etc/gshadow`)完整性的工具)
linux·运维·服务器
Shaneyxs2 小时前
从 0 到 1 实现CloudBase云开发 + 低代码全栈开发活动管理小程序(13)
前端
半山烟雨半山青2 小时前
微信内容emoji表情包编辑器 + vue3 + ts + WrchatEmogi Editor
前端·javascript·vue.js