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)
相关推荐
小手智联老徐2 天前
ROS2:与 Gazebo 版本对应关系解析
机器人·ros2·gazebo
rqtz3 天前
【机器人】ROS2配置solidworks模型转换的URDF文件
ros2·urdf·solidworks
小手智联老徐3 天前
ROS2:Humble 安装详解(Ubuntu 22.04)
ros2·humble·colcon
rqtz3 天前
【机器人】ROS2 功能包创建与 CMake 编译链路探秘
机器人·cmake·ros2
maxmaxma4 天前
ROS2机器人少年创客营:Python第三课
开发语言·python·机器人·ros2
小手智联老徐4 天前
ROS2 :Node 与 Topic 初探(Python)
ros2
kyle~6 天前
ROS2 --- WaitSet(等待集) 等待实体就绪,管理执行回调函数
大数据·c++·机器人·ros2
Stack Overflow?Tan906 天前
linux ubuntu22.04安装ROS2humble完整版的流程
linux·docker·ros2
maxmaxma6 天前
ROS2 机器人 少年创客营:Day 9
机器人·ros2
kyle~6 天前
导航---Small-GICP重定位算法
c++·机器人·ros2·导航