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