Comprendre les sujets

Objectif : Utiliser rqt_graph et les outils de ligne de commande pour introspecter les sujets ROS 2.

Niveau du tutoriel : Débutant

Durée : 20 minutes

Arrière-plan

ROS 2 décompose les systèmes complexes en plusieurs nœuds modulaires. Les sujets sont un élément vital du graphe ROS qui agit comme un bus permettant aux nœuds d’échanger des messages.

../../../_images/Topic-SinglePublisherandSingleSubscriber.gif

Un nœud peut publier des données sur n’importe quel nombre de sujets et avoir simultanément des abonnements à n’importe quel nombre de sujets.

../../../_images/Topic-MultiplePublisherandMultipleSubscriber.gif

Les sujets sont l’un des principaux moyens par lesquels les données sont déplacées entre les nœuds et donc entre les différentes parties du système.

Conditions préalables

Le tutoriel précédent fournit des informations générales utiles sur les nœuds qui sont construits ici.

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

Tâches

1 Configuration

À présent, vous devriez être à l’aise pour démarrer turtlesim.

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

Rappelez-vous du tutoriel précédent que les noms de ces nœuds sont /turtlesim et /teleop_turtle par défaut.

2 rqt_graphe

Tout au long de ce didacticiel, nous utiliserons rqt_graph pour visualiser les nœuds et les sujets changeants, ainsi que les connexions entre eux.

Le tutoriel turtlesim vous explique comment installer rqt et tous ses plugins, y compris rqt_graph.

Pour exécuter rqt_graph, ouvrez un nouveau terminal et saisissez la commande :

rqt_graph

Vous pouvez également ouvrir rqt_graph en ouvrant rqt et en sélectionnant Plugins > Introspection > Node Graph.

../../../_images/rqt_graph.png

Vous devriez voir les nœuds et le sujet ci-dessus, ainsi que deux actions autour de la périphérie du graphique (ignorons-les pour l’instant). Si vous passez votre souris sur le sujet au centre, vous verrez la couleur surlignée comme dans l’image ci-dessus.

Le graphique montre comment le nœud /turtlesim et le nœud /teleop_turtle communiquent entre eux sur un sujet. Le nœud /teleop_turtle publie des données (les touches que vous entrez pour déplacer la tortue) dans le sujet /turtle1/cmd_vel, et le nœud /turtlesim est abonné à ce sujet pour recevoir les données.

La fonction de mise en surbrillance de rqt_graph est très utile lors de l’examen de systèmes plus complexes avec de nombreux nœuds et sujets connectés de différentes manières.

rqt_graph est un outil d’introspection graphique. Nous allons maintenant examiner certains outils de ligne de commande pour l’introspection des sujets.

3 liste de sujets ros2

L’exécution de la commande ros2 topic list dans un nouveau terminal renverra une liste de tous les sujets actuellement actifs dans le système :

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

ros2 topic list -t renverra la même liste de sujets, cette fois avec le type de sujet ajouté entre parenthèses :

/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]

Ces attributs, en particulier le type, sont la façon dont les nœuds savent qu’ils parlent de la même information lorsqu’elle se déplace sur les sujets.

Si vous vous demandez où se trouvent tous ces sujets dans rqt_graph, vous pouvez décocher toutes les cases sous Masquer :

../../../_images/unhide.png

Pour l’instant, cependant, laissez ces options cochées pour éviter toute confusion.

4 écho de sujet ros2

Pour voir les données publiées sur un sujet, utilisez :

ros2 topic echo <topic_name>

Puisque nous savons que /teleop_turtle publie des données sur /turtlesim sur le sujet /turtle1/cmd_vel, utilisons echo pour faire une introspection sur ce sujet :

ros2 topic echo /turtle1/cmd_vel

Au début, cette commande ne renverra aucune donnée. C’est parce qu’il attend que /teleop_turtle publie quelque chose.

Retournez au terminal où turtle_teleop_key est en cours d’exécution et utilisez les flèches pour déplacer la tortue. Regardez le terminal sur lequel votre echo fonctionne en même temps, et vous verrez les données de position publiées pour chaque mouvement que vous effectuez :

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

Revenez maintenant à rqt_graph et décochez la case Debug.

../../../_images/debug.png

/_ros2cli_26646 est le nœud créé par le echo que nous venons d’exécuter (le nombre peut être différent). Vous pouvez maintenant voir que l’éditeur publie des données sur le sujet cmd_vel et que deux abonnés sont abonnés.

5 informations sur le sujet ros2

Les sujets ne doivent pas uniquement être une communication point à point; il peut s’agir d’un à plusieurs, de plusieurs à un ou de plusieurs à plusieurs.

Une autre façon de voir cela est de courir:

ros2 topic info /turtle1/cmd_vel

Qui reviendra :

Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 2

6 spectacle d’interface ros2

Les nœuds envoient des données sur des sujets à l’aide de messages. Les éditeurs et les abonnés doivent envoyer et recevoir le même type de message pour communiquer.

Les types de sujets que nous avons vus plus tôt après avoir exécuté ros2 topic list -t nous permettent de savoir quel type de message est utilisé sur chaque sujet. Rappelons que le sujet cmd_vel a le type :

geometry_msgs/msg/Twist

Cela signifie que dans le paquet geometry_msgs il y a un msg appelé Twist.

Nous pouvons maintenant exécuter ros2 interface show <msg type> sur ce type pour connaître ses détails, en particulier la structure de données attendue par le message.

ros2 interface show geometry_msgs/msg/Twist

Pour le type de message ci-dessus, cela donne :

# This expresses velocity in free space broken into its linear and angular parts.

    Vector3  linear
            float64 x
            float64 y
            float64 z
    Vector3  angular
            float64 x
            float64 y
            float64 z

Cela vous indique que le nœud /turtlesim attend un message avec deux vecteurs, linear et angular, de trois éléments chacun. Si vous vous souvenez des données que nous avons vues /teleop_turtle passer à /turtlesim avec la commande echo, elles sont dans la même structure :

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

7 pub de sujet ros2

Maintenant que vous avez la structure du message, vous pouvez publier des données sur un sujet directement à partir de la ligne de commande en utilisant :

ros2 topic pub <topic_name> <msg_type> '<args>'

L’argument '<args>' est les données réelles que vous passerez au sujet, dans la structure que vous venez de découvrir dans la section précédente.

Il est important de noter que cet argument doit être entré dans la syntaxe YAML. Entrez la commande complète comme ceci :

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

--once est un argument facultatif signifiant « publier un message puis quitter ».

Vous recevrez le message suivant dans le terminal :

publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))

Et vous verrez votre tortue bouger comme ça :

../../../_images/pub_once.png

La tortue (et généralement les vrais robots qu’elle est censée imiter) nécessite un flux constant de commandes pour fonctionner en continu. Donc, pour que la tortue continue de bouger, vous pouvez exécuter :

ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"

La différence ici est la suppression de l’option --once et l’ajout de l’option --rate 1, ​​qui indique à ros2 topic pub de publier la commande dans un flux constant à 1 Hz.

../../../_images/pub_stream.png

Vous pouvez actualiser rqt_graph pour voir ce qui se passe graphiquement. Vous verrez que le nœud ros 2 topic pub ... (/_ros2cli_30358) publie sur le sujet /turtle1/cmd_vel, et est reçu par le ros2 topic echo ... (/_ros2cli_26646) et le nœud /turtlesim maintenant.

../../../_images/rqt_graph2.png

Enfin, vous pouvez exécuter echo sur le sujet pose et revérifier rqt_graph :

ros2 topic echo /turtle1/pose
../../../_images/rqt_graph3.png

Vous pouvez voir que le nœud /turtlesim publie également dans le sujet pose, auquel le nouveau nœud echo est abonné.

8 sujet ros2 hz

Pour une dernière introspection sur ce processus, vous pouvez visualiser le rythme auquel les données sont publiées à l’aide de :

ros2 topic hz /turtle1/pose

Il renverra des données sur la vitesse à laquelle le nœud /turtlesim publie des données dans le sujet pose.

average rate: 59.354
  min: 0.005s max: 0.027s std dev: 0.00284s window: 58

Rappelez-vous que vous avez défini le taux de turtle1/cmd_vel pour publier à 1 Hz constant en utilisant ros2 topic pub --rate 1. Si vous exécutez la commande ci-dessus avec turtle1/cmd_vel au lieu de turtle1/pose, vous verrez une moyenne reflétant ce taux.

9 Nettoyer

À ce stade, vous aurez beaucoup de nœuds en cours d’exécution. N’oubliez pas de les arrêter en tapant Ctrl+C dans chaque terminal.

Résumé

Les nœuds publient des informations sur des sujets, ce qui permet à n’importe quel nombre d’autres nœuds de s’abonner et d’accéder à ces informations. Dans ce didacticiel, vous avez examiné les connexions entre plusieurs nœuds sur des sujets à l’aide de rqt_graph et des outils de ligne de commande. Vous devriez maintenant avoir une bonne idée de la façon dont les données se déplacent dans un système ROS 2.

Prochaines étapes

Ensuite, vous découvrirez un autre type de communication dans le graphe ROS avec le tutoriel Comprendre les services