Création d’un fichier de lancement
Objectif : Créer un fichier de lancement pour exécuter un système ROS 2 complexe.
Niveau du didacticiel : Intermédiaire
Durée : 10 minutes
Contenu
Conditions préalables
Ce tutoriel utilise les packages rqt_graph et turtlesim.
Vous devrez également utiliser un éditeur de texte de votre choix.
Comme toujours, n’oubliez pas de sourcer ROS 2 dans chaque nouveau terminal que vous ouvrez.
Arrière-plan
Le système de lancement de ROS 2 est chargé d’aider l’utilisateur à décrire la configuration de son système, puis de l’exécuter comme décrit. La configuration du système comprend les programmes à exécuter, où les exécuter, les arguments à transmettre et les conventions spécifiques à ROS qui facilitent la réutilisation des composants dans tout le système en leur donnant à chacun une configuration différente. Il est également chargé de surveiller l’état des processus lancés, de signaler et/ou de réagir aux changements d’état de ces processus.
Les fichiers de lancement écrits en Python, XML ou YAML peuvent démarrer et arrêter différents nœuds ainsi que déclencher et agir sur divers événements. Voir Utilisation de Python, XML et YAML pour les fichiers de lancement ROS 2 pour une description des différents formats. Le package fournissant ce framework est launch_ros
, qui utilise le framework launch
non spécifique à ROS en dessous.
Le document de conception détaille l’objectif de la conception du système de lancement de ROS 2 (toutes les fonctionnalités ne sont pas actuellement disponibles).
Tâches
2 Écrivez le fichier de lancement
Constituons un fichier de lancement ROS 2 en utilisant le package turtlesim
et ses exécutables. Comme mentionné ci-dessus, cela peut être en Python, XML ou YAML.
Copiez et collez le code complet dans le fichier launch/turtlesim_mimic_launch.py
:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
])
Copiez et collez le code complet dans le fichier launch/turtlesim_mimic_launch.xml
:
<launch>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
</launch>
Copiez et collez le code complet dans le fichier launch/turtlesim_mimic_launch.yaml
:
launch:
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
2.1 Examiner le fichier de lancement
Tous les fichiers de lancement ci-dessus lancent un système de trois nœuds, tous issus du package turtlesim
. Le but du système est de lancer deux fenêtres de simulation de tortues et de faire en sorte qu’une tortue imite les mouvements de l’autre.
Lors du lancement des deux nœuds turtlesim, la seule différence entre eux réside dans leurs valeurs d’espace de noms. Les espaces de noms uniques permettent au système de démarrer deux nœuds sans conflit de nom de nœud ou de nom de rubrique. Les deux tortues de ce système reçoivent des commandes sur le même sujet et publient leur pose sur le même sujet. Avec des espaces de noms uniques, les messages destinés à différentes tortues peuvent être distingués.
Le nœud final provient également du package turtlesim
, mais un exécutable différent : mimic
. Ce nœud a ajouté des détails de configuration sous la forme de remappages. Le sujet /input/pose
de mimic
est remappé sur /turtlesim1/turtle1/pose
et c’est le sujet /output/cmd_vel
sur /turtlesim2/turtle1/cmd_vel` `. Cela signifie que ``mimic
s’abonnera au sujet de pose de /turtlesim1/sim
et le republiera pour le sujet de commande de vélocité de /turtlesim2/sim
auquel s’abonner. En d’autres termes, turtlesim2
imitera les mouvements de turtlesim1
.
Ces instructions d’importation récupèrent certains modules Python launch
.
from launch import LaunchDescription
from launch_ros.actions import Node
Ensuite, la description de lancement elle-même commence :
def generate_launch_description():
return LaunchDescription([
])
Les deux premières actions de la description de lancement lancent les deux fenêtres turtlesim :
Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
),
Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim'
),
L’action finale lance le nœud mimique avec les remappages :
Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
Les deux premières actions lancent les deux fenêtres turtlesim :
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2"/>
L’action finale lance le nœud mimique avec les remappages :
<node pkg="turtlesim" exec="mimic" name="mimic">
<remap from="/input/pose" to="/turtlesim1/turtle1/pose"/>
<remap from="/output/cmd_vel" to="/turtlesim2/turtle1/cmd_vel"/>
</node>
Les deux premières actions lancent les deux fenêtres turtlesim :
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
L’action finale lance le nœud mimique avec les remappages :
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
lancement de 3 ros2
Pour exécuter le fichier de lancement créé ci-dessus, entrez dans le répertoire que vous avez créé précédemment et exécutez la commande suivante :
cd launch
ros2 launch turtlesim_mimic_launch.py
cd launch
ros2 launch turtlesim_mimic_launch.xml
cd launch
ros2 launch turtlesim_mimic_launch.yaml
Note
Il est possible de lancer un fichier de lancement directement (comme nous le faisons plus haut), ou fourni par un package. Lorsqu’il est fourni par un package, la syntaxe est :
ros2 launch <package_name> <launch_file_name>
Vous avez appris à créer des packages dans Création d’un paquet.
Note
Pour les paquets avec des fichiers de lancement, c’est une bonne idée d’ajouter une dépendance exec_depend
sur le paquet ros2launch
dans le package.xml
de votre paquet :
<exec_depend>ros2launch</exec_depend>
Cela permet de s’assurer que la commande ros2 launch
est disponible après la construction de votre package. Il garantit également que tous les formats de fichier de lancement sont reconnus.
Deux fenêtres turtlesim s’ouvriront et vous verrez les messages [INFO]
suivants vous indiquant quels nœuds votre fichier de lancement a démarré :
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [turtlesim_node-1]: process started with pid [11714]
[INFO] [turtlesim_node-2]: process started with pid [11715]
[INFO] [mimic-3]: process started with pid [11716]
Pour voir le système en action, ouvrez un nouveau terminal et exécutez la commande ros2 topic pub
sur le sujet /turtlesim1/turtle1/cmd_vel
pour faire bouger la première tortue :
ros2 topic pub -r 1 /turtlesim1/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}}"
Vous verrez les deux tortues suivre le même chemin.

4 Introspecter le système avec rqt_graph
Pendant que le système est toujours en cours d’exécution, ouvrez un nouveau terminal et exécutez rqt_graph
pour avoir une meilleure idée de la relation entre les nœuds dans votre fichier de lancement.
Exécutez la commande :
rqt_graph

Un nœud caché (la commande ros2 topic pub
que vous avez exécutée) publie des données dans le sujet /turtlesim1/turtle1/cmd_vel
à gauche, auquel le nœud /turtlesim1/sim
est abonné. . Le reste du graphique montre ce qui a été décrit précédemment : mimic
est abonné au sujet de pose de /turtlesim1/sim
et publie dans le sujet de commande de vélocité de /turtlesim2/sim
.