文章目录消息质量策略History历史策略Reliability可靠性Durability持久性Deadline截止时间Lifespan消息寿命Liveliness活跃度Ownership所有权常用的几种自带QOS策略典型场景兼容性灵活使用ROS2的QOS策略优化节点间通信消息质量策略策略可选值作用HistoryKEEP_LAST/KEEP_ALL缓存多少历史消息Depth正整数如 10KEEP_LAST时的队列长度ReliabilityRELIABLE/BEST_EFFORT是否保证消息必达DurabilityVOLATILE/TRANSIENT_LOCAL新订阅者能否收到历史消息Deadline时间周期期望的最小通信频率Lifespan时间周期消息的有效期过期丢弃LivelinessAUTOMATIC/MANUAL_BY_TOPIC/MANUAL_BY_NODE检测发布者是否存活OwnershipSHARED/EXCLUSIVE多发布者时是否允许竞争History历史策略KEEP_LAST depthN只保留最近的 N 条消息内存友好默认。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 回调。qos.deadline(rclcpp::Duration::from_seconds(0.1));// 100msLifespan消息寿命消息的有效期。超过该时间后即使还在队列中也会被丢弃防止消费过时的数据。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策略#includerclcpp/qos.hpp// 1. 传感器数据高频、可丢、低延迟rclcpp::SensorDataQoS();// BEST_EFFORT, VOLATILE, KEEP_LAST(depth5)// 2. 参数服务可靠、持久rclcpp::ParametersQoS();// RELIABLE, VOLATILE// 3. 默认 QoSrclcpp::QoS(10);// KEEP_LAST, depth10, 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,VOLATILELiveliness兼容性发布者和订阅者的 QoS 必须兼容才能建立通信并且存在降级兼容的情况发布者 \ 订阅者RELIABLEBEST_EFFORTRELIABLE✅ 兼容❌ 不兼容BEST**_**EFFORT✅ 兼容降级为 BEST_EFFORT✅ 兼容