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
Contenu
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.

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.

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.

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 :

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.

/_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 :

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.

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.

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

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