rosbag2: 重载QoS策略 [待校准@6323]

Goal目标: Override覆盖用于记录和回放的Ros2Bag QoS配置文件设置。 [待校准@6324]

背景

随着ROS 2中DDS的引入,在记录和回放数据时,需要考虑发布者/订户节点的服务质量 (QoS) 兼容性。关于服务质量如何工作的更多细节可以在 here 找到。就本指南而言,只要知道只有可靠性和耐用性政策会影响出版商/订阅者是否兼容以及是否可以从彼此那里接收数据,就足够了。 [待校准@6326]

当记录/播放来自某个话题的数据时,Ros2Bag会调整其请求/提供的QoS配置文件,以防止信息丢失。在回放过程中,Ros2bag也试图保留话题最初提供的政策。某些情况可能需要指定明确的QoS配置文件设置,以便Ros2Bag可以记录/回放话题。这些QoS配置文件覆盖可以通过CLI使用 --qos-profile-overrides-path 标志指定。 [待校准@6327]

使用QoS覆盖

配置文件替代的YAML模式是针对每个QoS策略的具有键/值对的话题名称的字典: [待校准@6329]

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

如果未指定策略值,该值将回退到Ros2Bag使用的默认值。如果指定基于持续时间的策略,例如 deadlinelifespan ,则需要同时指定秒和纳秒。策略值由策略的短键决定,可以用 ros2topic 动词如 ros2 topic pub --help 找到。下面复制所有值以供参考。 [待校准@6330]

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_node, manual_by_topic, unknown]
liveliness_lease_duration:
  sec: int
  nsec: int
avoid_ros_namespace_conventions: [true, false]

示例

考虑话题 /talker 提供 transient_local 耐久性政策。ROS2出版社默认要求 volatile 耐用性。 [待校准@6331]

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

为了使Ros2Bag记录数据,我们希望覆盖该特定话题的记录策略,如下所示: [待校准@6332]

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

并从CLI调用它: [待校准@6333]

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

如果我们想回放bag文件,但使用不同的可靠性策略,我们可以这样指定一个; [待校准@6334]

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

并从CLI调用它: [待校准@6333]

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

我们可以看到 ros2topic 的结果 [待校准@6335]

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