rosbag2 : Remplacement des politiques de QoS

Objectif : Remplacer les paramètres du profil QoS Ros2Bag pour l’enregistrement et la lecture.

Fond

Avec l’introduction de DDS dans ROS 2, la compatibilité de la qualité de service (QoS) pour les nœuds éditeur/abonné doit être prise en compte lors de l’enregistrement et de la lecture des données. Vous trouverez plus de détails sur le fonctionnement de QoS ici. Pour les besoins de ce guide, il suffit de savoir que seules les politiques de fiabilité et de durabilité déterminent si les éditeurs/abonnés sont compatibles et peuvent recevoir des données les uns des autres.

Ros2Bag adapte son profil de QoS demandé/offert lors de l’enregistrement/de la lecture des données d’un sujet pour éviter les messages perdus. Pendant la lecture, Ros2bag tente également de préserver la politique proposée à l’origine par le sujet. Certaines situations peuvent nécessiter de spécifier des paramètres de profil QoS explicites afin que Ros2Bag puisse enregistrer/lire des sujets. Ces remplacements de profil QoS peuvent être spécifiés via la CLI en utilisant le drapeau --qos-profile-overrides-path.

Utilisation des remplacements de QoS

Le schéma YAML pour les remplacements de profil est un dictionnaire de noms de sujets avec des paires clé/valeur pour chaque stratégie QoS :

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

Si une valeur de stratégie n’est pas spécifiée, la valeur reviendra à la valeur par défaut utilisée par Ros2Bag. Si vous spécifiez une politique basée sur la durée telle que deadline ou lifespan, vous devrez spécifier à la fois les secondes et les nanosecondes. Les valeurs de la politique sont déterminées par les raccourcis clavier de la politique qui peuvent être trouvés en utilisant des verbes ros2topic tels que ros2 topic pub --help. Toutes les valeurs sont répliquées ci-dessous pour référence.

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]

Exemple

Considérons un sujet /talker proposant une politique de durabilité transient_local. Les éditeurs ROS 2 demandent par défaut la durabilité volatile.

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

Pour que Ros2Bag enregistre les données, nous voudrions remplacer la politique d’enregistrement pour ce sujet spécifique comme ceci :

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

Et appelez-le depuis la CLI :

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

Si nous voulons lire le fichier bag mais avec une politique de fiabilité différente, nous pouvons en spécifier une en tant que telle ;

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

Et appelez-le depuis la CLI :

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

Nous pouvons voir les résultats avec sujet ros2

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