简介

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 和实时性

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

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

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


标签: none

评论已关闭