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

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

1 Configuration

Créez un nouveau répertoire pour stocker vos fichiers de lancement :

mkdir launch

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'),
            ]
        )
    ])

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'),
    ]
)

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

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.

../../../_images/mimic.png

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
../../../_images/mimic_graph.png

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.

Résumé

Les fichiers de lancement simplifient l’exécution de systèmes complexes avec de nombreux nœuds et des détails de configuration spécifiques. Vous pouvez créer des fichiers de lancement à l’aide de Python, XML ou YAML et les exécuter à l’aide de la commande ros2 launch.