ROS2 QoS 配置策略

简介

QoS(Quality of Service,服务质量)配置策略。这是 ROS 2 相比 ROS 1 的一个重要特性,因为它基于 DDS(Data Distribution Service),通信时可以灵活配置不同的 QoS 策略,适应不同的应用场景(比如机器人控制 vs 传感器数据流)。

ROS 2 常见 QoS 策略

在 ROS 2 里,QoS 策略主要包含以下几个方面:

  1. Reliability(可靠性)

    • RELIABLE: 确保消息一定会送达(适合命令、关键数据)
    • BEST_EFFORT: 尽量传输,不保证(适合高频传感器,如激光雷达点云)
  2. Durability(持久性)

    • VOLATILE: 只接收订阅后发布的新消息
    • TRANSIENT_LOCAL: 订阅者一旦加入,可以收到历史消息(适合参数或状态发布)
  3. History(历史缓存策略)

    • KEEP_LAST(n): 只保留最近 n 条消息
    • KEEP_ALL: 保留所有消息(受限于内存)
  4. Deadline(截止时间)

    指定发布周期约束,订阅者能检测消息是否延迟。

  5. Liveliness(活跃性)

    检测发布者是否仍然活着,可以选择自动或手动信号。

  6. Lifespan(消息寿命)

    消息在网络中存活的时间,超时会丢弃

ROS 2 内置 QoS 配置

在 rclcpp 和 rclpy 中,ROS 2 已经内置了一些常用 QoS profile,方便直接使用:

qos_profile_default:默认设置

qos_profile_sensor_data:高频传感器,BEST_EFFORT + KEEP_LAST(1)

qos_profile_services_default:服务调用用

qos_profile_parameter_events:参数事件

qos_profile_system_default:跟随 DDS 默认配置

示例(C++):

rclcpp::QoS qos(rclcpp::KeepLast(10));
qos.reliability(RMW_QOS_POLICY_RELIABILITY_RELIABLE);
qos.durability(RMW_QOS_POLICY_DURABILITY_VOLATILE);

auto sub = node->create_subscription<std_msgs::msg::String>(
"chatter", qos,
[](std_msgs::msg::String::SharedPtr msg) {
RCLCPP_INFO(node->get_logger(), "I heard: '%s'", msg->data.c_str());
});

不同场景下常用 QoS 配置对照表

场景 推荐 QoS 配置 说明
激光雷达 / 相机图像(高频传感器数据) BEST_EFFORT + KEEP_LAST(1)qos_profile_sensor_data 高频大数据流,丢少量数据不影响整体,减少带宽和延迟
IMU 数据 BEST_EFFORT + KEEP_LAST(5) 高频,但每个数据包较小,允许丢少量数据
机器人控制命令(关节/速度/力矩指令) RELIABLE + KEEP_LAST(1) 必须保证命令送达,但只要最新的,历史没用
状态反馈(关节角度、电流等) RELIABLE + KEEP_LAST(10) 确保可靠传输,可以保留最近一段时间的数据
地图、参数、静态 TF RELIABLE + TRANSIENT_LOCAL + KEEP_LAST(1) 新订阅者加入时也能收到最近的消息(如静态地图、TF 树)
参数事件(Parameter Events) RELIABLE + KEEP_ALLqos_profile_parameter_events 确保不丢失参数变更通知
服务(Service) RELIABLE + KEEP_LAST(1)qos_profile_services_default 请求-应答模式,必须可靠
Action(动作接口) RELIABLE + KEEP_LAST(10) 动作反馈需要可靠传输

小技巧

内置 QoS 配置

ROS 2 已经提供了常见 QoS,例如:

qos_profile_sensor_data → 传感器

qos_profile_services_default → 服务

qos_profile_parameter_events → 参数

调试 QoS 不匹配

发布者和订阅者的 QoS 策略必须“兼容”,否则无法通信。

可以用命令行工具检查:

ros2 topic info /topic_name --verbose

QoS 和实时性

  • 控制指令 → 要求低延迟(只要最新消息)。

  • 感知数据 → 要求高吞吐(丢数据没关系)。

  • 状态/参数 → 要求高可靠性(不能丢)。

CMakeLists Eigen FCPX GNU Gazebo Git Interest KDL Life Linux Matrix ODE QoS ROS Ros UML Ubuntu VcXsrv algorithm algorithms axis-angle bode calibration chrome control cpp dB data_struct dots figure gdb git latex launch life linux mac math matlab memory motor moveit operator optimal algorithm python robot robotics ros ros2 rtb simulation stl thread tools twist urdf velocity vim web work wsl
知识共享许可协议