ROS2进阶——消息服务质量QOS策略

文章目录

灵活使用ROS2的QOS策略,优化节点间通信

消息质量策略

策略 可选值 作用
History KEEP_LAST / KEEP_ALL 缓存多少历史消息
Depth 正整数(如 10) KEEP_LAST 时的队列长度
Reliability RELIABLE / BEST_EFFORT 是否保证消息必达
Durability VOLATILE / TRANSIENT_LOCAL 新订阅者能否收到历史消息
Deadline 时间周期 期望的最小通信频率
Lifespan 时间周期 消息的有效期,过期丢弃
Liveliness AUTOMATIC / MANUAL_BY_TOPIC / MANUAL_BY_NODE 检测发布者是否存活
Ownership SHARED / EXCLUSIVE 多发布者时是否允许竞争

History(历史策略)

  • KEEP_LAST + depth=N:只保留最近的 N 条消息(内存友好,默认)。
cpp 复制代码
qos.history(RMW_QOS_POLICY_HISTORY_KEEP_LAST).depth(10);
  • KEEP_ALL:保留所有消息(直到被消费或内存耗尽)。

Reliability(可靠性)

  • RELIABLE:类似 TCP,发送方重传直到确认收到。适合命令、配置等不能丢的数据。
  • BEST_EFFORT:类似 UDP,不保证到达,延迟更低、吞吐量更高。适合传感器高频数据(如激光雷达、图像)。

Durability(持久性)

决定新订阅者上线时能否收到之前发布的历史消息:

  • VOLATILE(默认):不保留历史,新订阅者只能收到之后的消息。
  • TRANSIENT_LOCAL:发布者在本地保留历史消息,新订阅者上线后立即收到。适合地图、状态、配置等需要同步初始数据的场景。

Deadline(截止时间)

我期望每 X 时间内至少收到/发布一条消息"。如果超时,会触发 Deadline Missed 回调。

c 复制代码
qos.deadline(rclcpp::Duration::from_seconds(0.1)); // 100ms

Lifespan(消息寿命)

消息的有效期。超过该时间后,即使还在队列中也会被丢弃,防止消费过时的数据。

c 复制代码
qos.lifespan(rclcpp::Duration::from_seconds(5.0)); // 5秒

Liveliness(活跃度)

模式 说明
AUTOMATIC 节点存活即自动认为活跃(默认)
MANUAL_BY_TOPIC 需手动调用 assert_liveliness() 声明该 Topic 活跃
MANUAL_BY_NODE 需手动声明整个节点活跃

配合 lease_duration(租约时长):如果在该时间内未收到活跃声明,则认为发布者已失效,触发回调。

Ownership(所有权)

多个发布者向同一 Topic 发布时:

  • SHARED(默认):所有消息混合接收。
  • EXCLUSIVE + ownership_strength:只接收强度最高的发布者的消息,其余忽略。适合主备切换场景。

常用的几种自带QOS策略

c 复制代码
#include "rclcpp/qos.hpp"

// 1. 传感器数据(高频、可丢、低延迟)
rclcpp::SensorDataQoS();  // BEST_EFFORT, VOLATILE, KEEP_LAST(depth=5)

// 2. 参数服务(可靠、持久)
rclcpp::ParametersQoS();  // RELIABLE, VOLATILE

// 3. 默认 QoS
rclcpp::QoS(10);  // KEEP_LAST, depth=10, RELIABLE, VOLATILE

典型场景

场景 推荐配置
激光雷达 / 摄像头图像 SensorDataQoS()(BEST_EFFORT, VOLATILE)
机器人状态 / 里程计 KEEP_LAST(10), RELIABLE, VOLATILE
地图 / 初始配置下发 KEEP_LAST(1), RELIABLE, TRANSIENT_LOCAL
控制指令 / 急停信号 KEEP_ALL, RELIABLE, VOLATILE
心跳检测 / 状态监控 KEEP_LAST(1), BEST_EFFORT, VOLATILE + Liveliness

兼容性

发布者和订阅者的 QoS 必须兼容才能建立通信,并且存在降级兼容的情况

发布者 \ 订阅者 RELIABLE BEST_EFFORT
RELIABLE ✅ 兼容 ❌ 不兼容
BEST **_**EFFORT ✅ 兼容(降级为 BEST_EFFORT) ✅ 兼容
相关推荐
Zwawa20 分钟前
一盏 LED 不够用了:让同一盏灯说出不同的话
c语言·单片机·嵌入式
广州虚拟动力-动捕&虚拟主播1 小时前
如何用一套参数甄别优质Ego第一视角数采设备
机器人
q27551300421 小时前
AS8132 DP转HDMI 4K60(420)被动式 国产性价比AS方案
linux·算法·硬件架构·dash
wjkjpcba1 小时前
割草机器人导航模块PCBA加工厂家怎么选?定位芯片焊接、天线接口与检测要求
机器人·smt贴片加工·pcba贴片加工厂
刚入门的大一新生2 小时前
Linux-进程间通信2
linux·运维·服务器
电科_银尘2 小时前
【深度学习项目实战·02】Linux服务器环境搭建:从SSH登录到稳定运行项目
linux·服务器·深度学习
运维小斌2 小时前
麒麟 V10 部署 OceanBase:故障速查与验收清单
linux·数据库·oceanbase·麒麟
水饺编程3 小时前
第2章:Linux 基础,在 root 中创建用户账号
linux·c语言·汇编·1024程序员节
叼烟扛炮3 小时前
Linux 学习笔记(四):文件检索与管道重定向
linux·笔记·学习
承渊政道4 小时前
HIL-UMI论文解读:用手持示范补齐机器人操作短板——对启元Q1机器人开发的启发
人工智能·深度学习·机器人·论文解读·具身智能·启元q1