rosbag2:覆盖 QoS 策略

**目标:**为录制和播放覆盖 Ros2Bag 的 QoS 配置文件设置。

背景

随着DDS在ROS 2中的引入,在记录和回放数据时需要考虑发布者/订阅者节点的服务质量(QoS)兼容性。有关QoS的详细信息可以在 这里 找到。对于本指南而言,只需知道可靠性和持久性策略是否会影响发布者/订阅者是否兼容以及它们是否能够接收彼此的数据。

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]

示例

考虑一个提供``transient_local``持续性策略的主题``/talker``。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

然后从命令行调用它:

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

如果我们想使用不同的可靠性策略回放bag文件,我们可以这样指定;

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

然后从命令行调用它:

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