Fast-RTPS QoS 支持详解

1. QoS 策略总览

Fast-RTPS (Fast-DDS) 完全支持 DDS 标准定义的 QoS 策略,并添加了 eProsima 扩展。

1.1 QoS 策略分类



2. 详解每个 QoS 策略

2.1 DURABILITY (持久性)

cpp 复制代码
// 文件: DurabilityQosPolicy
// ID: 2

enum class DurabilityKind
{
    VOLATILE,           // 不持久化 (默认)
    TRANSIENT_LOCAL,    // 本地暂时持久化
    TRANSIENT,          // 跨进程暂时持久化
    PERSISTENT          // 永久持久化
};

// 使用示例
DurabilityQosPolicy durability;
durability.kind = DurabilityKind::TRANSIENT_LOCAL;
Kind 说明 使用场景
VOLATILE 数据不保存,错过则丢失 实时数据
TRANSIENT_LOCAL 本进程内存持久化 单进程
TRANSIENT 跨进程内存持久化 多进程
PERSISTENT 持久化存储 持久化存储

2.2 RELIABILITY (可靠性)

cpp 复制代码
// 文件: ReliabilityQosPolicy
// ID: 11

enum class ReliabilityKind
{
    BEST_EFFORT,   // 尽力而为,不保证送达
    RELIABLE        // 可靠传输,保证送达
};

// 使用示例
ReliabilityQosPolicy reliability;
reliability.kind = ReliabilityKind::RELIABLE;
reliability.max_blocking_time = Duration_t(0, 100000000);  // 100ms

2.3 DEADLINE (截止时间)

cpp 复制代码
// 文件: DeadlineQosPolicy
// ID: 4

// 使用示例
DeadlineQosPolicy deadline;
deadline.period = Duration_t(0, 100000000);  // 100ms

// DataWriter: 每100ms应发送一次数据
// DataReader: 每100ms应收到一次数据
// 否则触发 on_offered_deadline_missed / on_requested_deadline_missed

2.4 HISTORY (历史)

cpp 复制代码
// 文件: HistoryQosPolicy
// ID: 13

enum class HistoryKind
{
    KEEP_LAST,     // 保留最近N个
    KEEP_ALL        // 保留所有
};

// 使用示例
HistoryQosPolicy history;
history.kind = HistoryKind::KEEP_LAST;
history.depth = 10;  // 保留最近10个样本

2.5 RESOURCE_LIMITS (资源限制)

cpp 复制代码
// 文件: ResourceLimitsQosPolicy
// ID: 14

// 使用示例
ResourceLimitsQosPolicy limits;
limits.max_samples = 100;              // 最大样本数
limits.max_instances = 50;             // 最大实例数
limits.max_samples_per_instance = 10;  // 每个实例最大样本数

2.6 LIVELINESS (存活度)

cpp 复制代码
// 文件: LivelinessQosPolicy
// ID: 8

enum class LivelinessKind
{
    AUTOMATIC,         // 自动检测 (默认)
    MANUAL_BY_PARTICIPANT,
    MANUAL_BY_TOPIC
};

enum class LivelinessQosPolicyKind
{
    ACTIVE,
    NOT_ACTIVE,
    ALIVE_UNKNOWN,
    NOT_ALIVE_UNKNOWN
};

// 使用示例
LivelinessQosPolicy liveliness;
liveliness.kind = LivelinessKind::AUTOMATIC;
liveliness.lease_duration = Duration_t(0, 100000000);  // 100ms
liveliness.announcement_period = Duration_t(0, 30000000);  // 30ms

2.7 OWNERSHIP (所有权)

cpp 复制代码
// 文件: OwnershipQosPolicy
// ID: 6

enum class OwnershipKind
{
    SHARED,        // 共享所有权 (默认)
    EXCLUSIVE       // 独占所有权
};

// 使用示例
OwnershipQosPolicy ownership;
ownership.kind = OwnershipKind::EXCLUSIVE;

// 配合 OwnershipStrength 使用
OwnershipStrengthQosPolicy strength;
strength.value = 5;  // 优先级 0-255

2.8 LATENCY_BUDGET (延迟预算)

cpp 复制代码
// 文件: LatencyBudgetQosPolicy
// ID: 5

// 使用示例
LatencyBudgetQosPolicy latency;
latency.duration = Duration_t(0, 50000000);  // 50ms

2.9 DESTINATION_ORDER (目标顺序)

cpp 复制代码
// 文件: DestinationOrderQosPolicy
// ID: 12

enum class DestinationOrderKind
{
    BY_RECEPTION_TIMESTAMP,    // 按接收时间排序
    BY_SOURCE_TIMESTAMP        // 按源时间戳排序
};

2.10 TIME_BASED_FILTER (时间过滤)

cpp 复制代码
// 文件: TimeBasedFilterQosPolicy
// ID: 9

// 使用示例
TimeBasedFilterQosPolicy filter;
filter.minimum_separation = Duration_t(0, 10000000);  // 10ms
// 订阅者每10ms最多收到一次数据

2.11 PRESENTATION (展示)

cpp 复制代码
// 文件: PresentationQosPolicy
// ID: 3

enum class PresentationQosPolicyAccessScopeKind
{
    INSTANCE,     // 实例级
    TOPIC,        // 主题级
    GROUP         // 组级
};

// 使用示例
PresentationQosPolicy presentation;
presentation.access_scope = PresentationQosPolicyAccessScopeKind::GROUP;
presentation.coherent_access = true;
presentation.ordered_access = true;

2.12 PARTITION (分区)

cpp 复制代码
// 文件: PartitionQosPolicy
// ID: 10

// 使用示例
PartitionQosPolicy partition;
partition.names = {"partition1", "partition2"};
// 只有匹配相同分区的发布/订阅才能通信

2.13 LIFESPAN (寿命)

cpp 复制代码
// 文件: LifespanQosPolicy
// ID: 21

// 使用示例
LifespanQosPolicy lifespan;
lifespan.duration = Duration_t(10, 0);  // 10秒
// 数据超过10秒后过期

2.14 TRANSPORT_PRIORITY (传输优先级)

cpp 复制代码
// 文件: TransportPriorityQosPolicy
// ID: 20

// 使用示例
TransportPriorityQosPolicy priority;
priority.value = 100;  // 优先级 0-255
// 高优先级数据优先发送

3. eProsima 扩展 QoS

3.1 DISABLE_POSITIVE_ACKS (禁用肯定确认)

cpp 复制代码
// 文件: DisablePositiveACKsQosPolicy
// ID: 25

// 使用示例
DisablePositiveACKsQosPolicy dpa;
dpa.enabled = true;
dpa.duration = Duration_t(0, 100000000);  // 确认超时

// 减少网络流量,适用于高频数据

3.2 PUBLISH_MODE (发布模式)

cpp 复制代码
// 文件: PublishModeQosPolicy
// ID: 28

enum class PublishModeKind
{
    SYNCHRONOUS,      // 同步发送
    ASYNCHRONOUS      // 异步发送 (需配置 FlowController)
};

// 使用示例
PublishModeQosPolicy publish_mode;
publish_mode.kind = PublishModeKind::ASYNCHRONOUS;

3.3 DATA_SHARING (数据共享)

cpp 复制代码
// 文件: DataSharingQosPolicy
// ID: 37

enum class DataSharingKind
{
    AUTO,      // 自动
    ON,        // 启用
    OFF        // 禁用
};

// 使用示例
DataSharingQosPolicy datasharing;
datasharing.kind = DataSharingKind::AUTO;
// 同一机器上的进程可通过共享内存高效共享数据

3.4 RTPS 相关配置

cpp 复制代码
// RTPSReliableReaderQos (ID: 31)
RTPSReliableReaderQos
{
    Time_t ack_request_period;           // ACK 请求周期
    Time_t min_ack_response_time;         // 最小 ACK 响应时间
    uint32_t max_submessages;             // 最大子消息数
    uint32_t max_bytes_per_submessage;    // 每子消息最大字节
};

// RTPSReliableWriterQos (ID: 32)
RTPSReliableWriterQos
{
    Time_t heartbeat_period;              // 心跳周期
    Time_t nack_response_delay;           // NACK 响应延迟
    Time_t nack_suppression_duration;     // NACK 抑制时长
    uint32_t max_submessages;             // 最大子消息数
    uint32_t max_bytes_per_submessage;    // 每子消息最大字节
};

4. QoS 兼容性

4.1 发布者/订阅者 QoS 匹配

复制代码
┌─────────────────────────────────────────────────────────────────────────────┐
│                        QoS 兼容性矩阵                                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  QoS 策略           │ 发布者        │ 订阅者        │ 兼容结果             │
│  ──────────────────┼───────────────┼───────────────┼───────────────       │
│  DURABILITY        │ VOLATILE      │ VOLATILE      │ ✅ 兼容             │
│                    │ TRANSIENT     │ TRANSIENT     │ ✅ 兼容             │
│                    │ PERSISTENT    │ *             │ ❌ 不兼容            │
│  ──────────────────┼───────────────┼───────────────┼───────────────       │
│  RELIABILITY       │ BEST_EFFORT   │ BEST_EFFORT   │ ✅ 兼容             │
│                    │ *             │ RELIABLE      │ ❌ 不兼容            │
│  ──────────────────┼───────────────┼───────────────┼───────────────       │
│  PARTITION         │ {"A","B"}     │ {"B","C"}    │ ✅ 兼容 (交集)      │
│                    │ {"A"}         │ {"B"}        │ ❌ 不兼容 (无交集)  │
│  ──────────────────┼───────────────┼───────────────┼───────────────       │
│  OWNERSHIP         │ SHARED        │ SHARED        │ ✅ 兼容             │
│                    │ EXCLUSIVE     │ EXCLUSIVE     │ ✅ 兼容             │
│                    │ SHARED        │ EXCLUSIVE     │ ❌ 不兼容            │
│  ──────────────────┼───────────────┼───────────────┼───────────────       │
│  DEADLINE          │ 100ms         │ 100ms         │ ✅ 兼容             │
│                    │ 100ms         │ 200ms         │ ✅ 兼容 (发布更快)  │
│                    │ 200ms         │ 100ms         │ ⚠️ 不兼容!          │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

5. 使用示例

5.1 发布者配置

cpp 复制代码
// 创建发布者
DataWriter* writer = publisher->create_datawriter(
    topic,
    DATAWRITER_QOS_DEFAULT,
    nullptr);

DataWriterQos qos = writer->get_qos();

// 设置 QoS
qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL;
qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE;
qos.deadline().period = Duration_t(0, 100000000);  // 100ms
qos.history().kind = HistoryQosPolicyKind::KEEP_LAST;
qos.history().depth = 10;
qos.ownership().kind = OwnershipQosPolicyKind::EXCLUSIVE;
qos.ownership_strength().value = 5;

writer->set_qos(qos);

5.2 订阅者配置

cpp 复制代码
// 创建订阅者
DataReader* reader = subscriber->create_datareader(
    topic,
    DATAREADER_QOS_DEFAULT,
    listener);

DataReaderQos qos = reader->get_qos();

// 设置 QoS
qos.durability().kind = DurabilityQosPolicyKind::TRANSIENT_LOCAL;
qos.reliability().kind = ReliabilityQosPolicyKind::RELIABLE;
qos.deadline().period = Duration_t(0, 150000000);  // 150ms
qos.history().kind = HistoryQosPolicyKind::KEEP_LAST;
qos.history().depth = 20;

reader->set_qos(qos);

6. QoS 策略文件索引

6.1 头文件列表

文件 描述
QosPolicies.hpp QoS 策略基类和枚举定义
DurabilityQosPolicy.hpp 持久性策略
ReliabilityQosPolicy.hpp 可靠性策略
DeadlineQosPolicy.hpp 截止时间策略
LivelinessQosPolicy.hpp 存活度策略
HistoryQosPolicy.hpp 历史策略
ResourceLimitsQosPolicy.hpp 资源限制策略
OwnershipQosPolicy.hpp 所有权策略
PresentationQosPolicy.hpp 展示策略
PartitionQosPolicy.hpp 分区策略
LifespanQosPolicy.hpp 寿命策略
PublishModeQosPolicy.hpp 发布模式策略
DataSharingQosPolicy.hpp 数据共享策略
WriterDataLifecycleQosPolicy.hpp 写入生命周期策略
ReaderDataLifecycleQosPolicy.hpp 读取生命周期策略

7. 总结

7.1 QoS 统计

类别 数量
DDS 标准 QoS 24
eProsima 扩展 12+
总计 36+

7.2 常用 QoS 组合

场景 推荐 QoS
实时数据 RELIABILITY(BEST_EFFORT) + HISTORY(KEEP_LAST)
可靠传输 RELIABILITY(RELIABLE) + DURABILITY(VOLATILE)
进程间共享 DATA_SHARING(ON) + DURABILITY(TRANSIENT_LOCAL)
状态同步 RELIABILITY(RELIABLE) + DURABILITY(TRANSIENT)
相关推荐
某林2122 天前
从 Isaac Lab API 踩坑到硬件 MVP 的全链路实战破局
python·机器人·人机交互·ros2
竹叶青lvye3 天前
ROS2自定义接口消息、参数服务案例
人工智能·ros2·具身智能·接口消息·参数服务
knighthood20014 天前
解决RTPS_TRANSPORT_SHM Error
ros2
kyle~5 天前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
济6175 天前
BMS系统专栏:认知电池管理系统BMS的知识与功能
嵌入式硬件·嵌入式·ros2·机器人开发·机器人方向
kyle~5 天前
机器人日志系统
c++·单片机·嵌入式硬件·机器人·ros2
某林2125 天前
从底层硬件死锁到 QoS 通信底层的全链路复盘
python·ros2·qos
BestOrNothing_20156 天前
ROS2 C++ 小车控制完整实战(二):自定义 msg 消息发布与订阅保姆级教程
c++·ros2·subscriber·publisher·msg·topic通信·自定义接口
BestOrNothing_20156 天前
ROS2 C++ 小车控制完整实战(三):自定义 srv 服务通信保姆级教程
c++·service通信·ros2·client·server·srv
kyle~6 天前
工业机械臂---TCP标定验收
机器人·ros2·标定