rosbag2:覆盖 QoS 策略

目标: 覆盖 Ros2Bag QoS 配置文件设置以进行录制和播放。

背景

随着 ROS 2 中 DDS 的引入,在记录和播放数据时需要考虑发布者/订阅者节点的服务质量 (QoS) 兼容性。 有关 QoS 工作原理的更多详细信息,请参见:doc:此处。 就本指南而言,只需知道可靠性和耐用性策略会影响发布者/订阅者是否兼容并是否可以从彼此接收数据即可。

Ros2Bag 在记录/播放主题数据时会调整其请求/提供的 QoS 配置文件,以防止丢失消息。 在播放期间,Ros2bag 还会尝试保留主题最初提供的策略。 某些情况下可能需要指定明确的 QoS 配置文件设置,以便 Ros2Bag 可以记录/播放主题。 可以使用 --qos-profile-overrides-path 标志通过 CLI 指定这些 QoS 配置文件覆盖。

使用 QoS 覆盖

配置文件覆盖的 YAML 架构是一个主题名称字典,其中包含每个 QoS 策略的键/值对:

topic_name: str
  qos_policy_name: str
  ...
  qos_duration: object
    sec: int
    nsec: int

如果未指定策略值,则该值将恢复为 Ros2Bag 使用的默认值。 如果您指定基于持续时间的策略(例如“deadline”或“lifespan”),则需要指定秒和纳秒。 策略值由策略的短键确定,可以使用“ros2topic”动词(例如“ros2 topic pub –help”)找到。 所有值均复制如下以供参考。

history: [keep_all, keep_last]
depth: int
reliability: [system_default, reliable, best_effort, unknown]
durability: [system_default, transient_local, volatile, unknown]
deadline:
  sec: int
  nsec: int
lifespan:
  sec: int
  nsec: int
liveliness: [system_default, automatic, manual_by_topic, unknown]
liveliness_lease_duration:
  sec: int
  nsec: int
avoid_ros_namespace_conventions: [true, false]

示例

考虑一个主题“/talker”提供“transient_local”持久性策略。 ROS 2 发布者默认请求“volatile”持久性。

ros2 topic pub -r 0.1 --qos-durability transient_local /talker std_msgs/String "data: Hello World"

为了让 Ros2Bag 记录数据,我们需要覆盖该特定主题的记录策略,如下所示:

# durability_override.yaml
/talker:
  durability: transient_local
  history: keep_all

并从 CLI 调用它:

ros2 bag record -a -o my_bag --qos-profile-overrides-path durability_override.yaml

如果我们想要播放包文件,但使用不同的可靠性策略,我们可以指定一个这样的策略;

# reliability_override.yaml
/talker:
  reliability: best_effort
  history: keep_all

并从 CLI 调用它:

ros2 bag play --qos-profile-overrides-path reliability_override.yaml my_bag

我们可以用“ros2 topic”看到结果

ros2 topic echo --qos-reliability best_effort /talker std_msgs/String