Enregistrement et lecture de données

Objectif : Enregistrer les données publiées sur un sujet afin de pouvoir les relire et les examiner à tout moment.

Niveau du tutoriel : Débutant

Durée : 10 minutes

Arrière-plan

ros2 bag est un outil en ligne de commande pour enregistrer les données publiées sur les sujets de votre système. Il accumule les données transmises sur un nombre quelconque de sujets et les enregistre dans une base de données. Vous pouvez ensuite rejouer les données pour reproduire les résultats de vos tests et expériences. L’enregistrement de sujets est également un excellent moyen de partager votre travail et de permettre aux autres de le recréer.

Conditions préalables

Vous devriez avoir ros2 bag installé dans le cadre de votre configuration habituelle de ROS 2.

Si vous avez installé depuis Debians sur Linux et que votre système ne reconnaît pas la commande, installez-la comme suit :

sudo apt-get install ros-rolling-ros2bag \
                     ros-rolling-rosbag2-storage-default-plugins

Ce didacticiel aborde les concepts abordés dans les didacticiels précédents, tels que nodes et topics. Il utilise également le package turtlesim.

Comme toujours, n’oubliez pas de sourcer ROS 2 dans chaque nouveau terminal que vous ouvrez.

Tâches

1 Configuration

Vous enregistrerez votre entrée au clavier dans le système turtlesim pour sauvegarder et rejouer plus tard, alors commencez par démarrer les nœuds /turtlesim et /teleop_turtle.

Ouvrez un nouveau terminal et exécutez :

ros2 run turtlesim turtlesim_node

Ouvrez un autre terminal et exécutez :

ros2 run turtlesim turtle_teleop_key

Créons également un nouveau répertoire pour stocker nos enregistrements sauvegardés, tout comme bonne pratique :

mkdir bag_files
cd bag_files

2 Choisissez un sujet

ros2 bag ne peut enregistrer que les données des sujets publiés. Pour voir une liste des sujets de votre système, ouvrez un nouveau terminal et exécutez la commande :

ros2 topic list

Qui reviendra :

/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

Dans le tutoriel des sujets, vous avez appris que le nœud /turtle_teleop publie des commandes sur le sujet /turtle1/cmd_vel pour faire bouger la tortue dans turtlesim.

Pour voir les données publiées par /turtle1/cmd_vel, exécutez la commande :

ros2 topic echo /turtle1/cmd_vel

Rien ne s’affichera au début car aucune donnée n’est publiée par le téléop. Retournez au terminal où vous avez exécuté le téléop et sélectionnez-le pour qu’il soit actif. Utilisez les touches fléchées pour déplacer la tortue et vous verrez les données publiées sur le terminal exécutant ros2 topic echo.

linear:
  x: 2.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0
  ---

record de sac 3 ros2

Pour enregistrer les données publiées dans un sujet, utilisez la syntaxe de commande :

ros2 bag record <topic_name>

Avant d’exécuter cette commande sur le sujet de votre choix, ouvrez un nouveau terminal et déplacez-vous dans le répertoire bag_files que vous avez créé précédemment, car le fichier rosbag sera enregistré dans le répertoire où vous l’exécutez.

Exécutez la commande :

ros2 bag record /turtle1/cmd_vel

Vous verrez les messages suivants dans le terminal (la date et l’heure seront différentes) :

[INFO] [rosbag2_storage]: Opened database 'rosbag2_2019_10_11-05_18_45'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

Maintenant, ros2 bag enregistre les données publiées sur le sujet /turtle1/cmd_vel. Retournez au terminal téléop et déplacez à nouveau la tortue. Les mouvements n’ont pas d’importance, mais essayez de créer un motif reconnaissable pour voir quand vous rejouerez les données plus tard.

../../../_images/record.png

Appuyez sur Ctrl+C pour arrêter l’enregistrement.

Les données seront accumulées dans un fichier bag avec un nom dans le modèle de rosbag2_year_month_day-hour_minute_second

3.1 Record multiple topics

Vous pouvez également enregistrer plusieurs sujets, ainsi que changer le nom du fichier dans lequel ros2 bag enregistre.

Exécutez la commande suivante :

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose

L’option -o vous permet de choisir un nom unique pour votre fichier bag. La chaîne suivante, dans ce cas subset, est le nom du fichier.

Pour enregistrer plus d’un sujet à la fois, listez simplement chaque sujet séparé par un espace.

Vous verrez le message suivant, confirmant que les deux sujets sont en cours d’enregistrement.

[INFO] [rosbag2_storage]: Opened database 'subset'.
[INFO] [rosbag2_transport]: Listening for topics...
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/cmd_vel'
[INFO] [rosbag2_transport]: Subscribed to topic '/turtle1/pose'
[INFO] [rosbag2_transport]: All requested topics are subscribed. Stopping discovery...

Vous pouvez déplacer la tortue et appuyer sur Ctrl+C lorsque vous avez terminé.

Note

Il existe une autre option que vous pouvez ajouter à la commande, -a, qui enregistre tous les sujets de votre système.

Informations sur le sac 4 ros2

Vous pouvez voir les détails de votre enregistrement en exécutant :

ros2 bag info <bag_file_name>

L’exécution de cette commande sur le fichier bag subset renverra une liste d’informations sur le fichier :

ros2 bag info subset
Files:             subset.db3
Bag size:          228.5 KiB
Storage id:        sqlite3
Duration:          48.47s
Start:             Oct 11 2019 06:09:09.12 (1570799349.12)
End                Oct 11 2019 06:09:57.60 (1570799397.60)
Messages:          3013
Topic information: Topic: /turtle1/cmd_vel | Type: geometry_msgs/msg/Twist | Count: 9 | Serialization Format: cdr
                 Topic: /turtle1/pose | Type: turtlesim/msg/Pose | Count: 3004 | Serialization Format: cdr

Pour afficher les messages individuels, vous devez ouvrir la base de données, dans ce cas sqlite3, pour l’examiner, ce qui dépasse le cadre de ROS 2.

5 ros2 jeu de sac

Avant de rejouer le fichier sac, entrez Ctrl+C dans le terminal où le teleop est en cours d’exécution. Assurez-vous ensuite que votre fenêtre turtlesim est visible afin que vous puissiez voir le fichier bag en action.

Entrez la commande :

ros2 bag play subset

Le terminal renverra le message :

[INFO] [rosbag2_storage]: Opened database 'subset'.

Votre tortue suivra le même chemin que vous avez entré lors de l’enregistrement (mais pas exactement à 100 % ; turtlesim est sensible aux petits changements dans la synchronisation du système).

../../../_images/playback.png

Parce que le fichier subset a enregistré le sujet /turtle1/pose, la commande ros2 bag play ne se fermera pas tant que vous aurez turtlesim en cours d’exécution, même si vous ne bougez pas.

En effet, tant que le nœud /turtlesim est actif, il publie des données sur le sujet /turtle1/pose à intervalles réguliers. Vous avez peut-être remarqué dans l’exemple de résultat ros2 bag info ci-dessus que l’information Count du sujet /turtle1/cmd_vel n’était que de 9 ; c’est le nombre de fois que nous avons appuyé sur les touches fléchées pendant l’enregistrement.

Notez que /turtle1/pose a une valeur Count supérieure à 3000 ; pendant que nous enregistrions, des données ont été publiées sur ce sujet 3000 fois.

Pour avoir une idée de la fréquence de publication des données de position, vous pouvez exécuter la commande :

ros2 topic hz /turtle1/pose

Résumé

Vous pouvez enregistrer les données transmises sur les sujets de votre système ROS 2 à l’aide de la commande ros2 bag. Que vous partagiez votre travail avec d’autres ou que vous introspectiez vos propres expériences, c’est un excellent outil à connaître.

Prochaines étapes

Vous avez terminé les didacticiels « Débutant : Outils CLI » ! L’étape suivante consiste à aborder les didacticiels « Débutant : Bibliothèques clientes », en commençant par Créer un espace de travail.