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) |