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)
相关推荐
Riemann~~3 小时前
第一个ros2程序
ros2·机器人系统
晓纪同学10 小时前
ROS2 -06-动作
java·数据库·python·算法·机器人·ros·ros2
liu-yonggang2 天前
ROS2 Topic 传输机制:板内 vs 跨板
性能优化·ros2
阿豪只会阿巴3 天前
咱这后续安排
c++·人工智能·算法·leetcode·ros2
G果5 天前
LIO-SAM 学习总结
学习·slam·点云·ros2·导航·nav2·liosam
WWZZ20256 天前
具身智能入门Isaac Sim——机器人设置-初级设计轮式机器人1
机器人·大模型·机械臂·ros2·具身智能·isaac sim
winfreedoms20 天前
ROS2知识大白话
笔记·学习·ros2
LS_learner22 天前
RViz(ROS Visualization)显示传感器数据、机器人状态、路径规划结果等各种信息的强大图形界面
ros2
LS_learner23 天前
ROS2的jazzy版本的机器人3D仿真软件gazebo的安装和使用
ros2