Utilisation de Python, XML et YAML pour les fichiers de lancement ROS 2
Table des matières
Les fichiers de lancement ROS 2 peuvent être écrits en Python, XML et YAML. Ce guide montre comment utiliser ces différents formats pour accomplir la même tâche, ainsi qu’une discussion sur le moment d’utilisation de chaque format.
Exemples de fichiers de lancement
Vous trouverez ci-dessous un fichier de lancement implémenté en Python, XML et YAML. Chaque fichier de lancement effectue les actions suivantes :
Configurer les arguments de ligne de commande avec les valeurs par défaut
Inclure un autre fichier de lancement
Inclure un autre fichier de lancement dans un autre espace de noms
Démarrer un nœud et définir son espace de noms
Démarrez un nœud, définissez son espace de noms et définissez les paramètres de ce nœud (à l’aide des arguments)
Créer un nœud pour remapper les messages d’un sujet à un autre
# example.launch.py
import os
from ament_index_python import get_package_share_directory
from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.actions import IncludeLaunchDescription
from launch.actions import GroupAction
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch.substitutions import LaunchConfiguration
from launch.substitutions import TextSubstitution
from launch_ros.actions import Node
from launch_ros.actions import PushROSNamespace
def generate_launch_description():
# args that can be set from the command line or a default will be used
background_r_launch_arg = DeclareLaunchArgument(
"background_r", default_value=TextSubstitution(text="0")
)
background_g_launch_arg = DeclareLaunchArgument(
"background_g", default_value=TextSubstitution(text="255")
)
background_b_launch_arg = DeclareLaunchArgument(
"background_b", default_value=TextSubstitution(text="0")
)
chatter_ns_launch_arg = DeclareLaunchArgument(
"chatter_ns", default_value=TextSubstitution(text="my/chatter/ns")
)
# include another launch file
launch_include = IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(
get_package_share_directory('demo_nodes_cpp'),
'launch/topics/talker_listener.launch.py'))
)
# include another launch file in the chatter_ns namespace
launch_include_with_namespace = GroupAction(
actions=[
# push_ros_namespace to set namespace of included nodes
PushROSNamespace('chatter_ns'),
IncludeLaunchDescription(
PythonLaunchDescriptionSource(
os.path.join(
get_package_share_directory('demo_nodes_cpp'),
'launch/topics/talker_listener.launch.py'))
),
]
)
# start a turtlesim_node in the turtlesim1 namespace
turtlesim_node = Node(
package='turtlesim',
namespace='turtlesim1',
executable='turtlesim_node',
name='sim'
)
# start another turtlesim_node in the turtlesim2 namespace
# and use args to set parameters
turtlesim_node_with_parameters = Node(
package='turtlesim',
namespace='turtlesim2',
executable='turtlesim_node',
name='sim',
parameters=[{
"background_r": LaunchConfiguration('background_r'),
"background_g": LaunchConfiguration('background_g'),
"background_b": LaunchConfiguration('background_b'),
}]
)
# perform remap so both turtles listen to the same command topic
forward_turtlesim_commands_to_second_turtlesim_node = Node(
package='turtlesim',
executable='mimic',
name='mimic',
remappings=[
('/input/pose', '/turtlesim1/turtle1/pose'),
('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
]
)
return LaunchDescription([
background_r_launch_arg,
background_g_launch_arg,
background_b_launch_arg,
chatter_ns_launch_arg,
launch_include,
launch_include_with_namespace,
turtlesim_node,
turtlesim_node_with_parameters,
forward_turtlesim_commands_to_second_turtlesim_node,
])
<!-- example.launch.xml -->
<launch>
<!-- args that can be set from the command line or a default will be used -->
<arg name="background_r" default="0"/>
<arg name="background_g" default="255"/>
<arg name="background_b" default="0"/>
<arg name="chatter_ns" default="my/chatter/ns"/>
<!-- include another launch file -->
<include file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"/>
<!-- include another launch file in the chatter_ns namespace-->
<group>
<!-- push_ros_namespace to set namespace of included nodes -->
<push_ros_namespace namespace="$(var chatter_ns)"/>
<include file="$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"/>
</group>
<!-- start a turtlesim_node in the turtlesim1 namespace -->
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim1"/>
<!-- start another turtlesim_node in the turtlesim2 namespace
and use args to set parameters -->
<node pkg="turtlesim" exec="turtlesim_node" name="sim" namespace="turtlesim2">
<param name="background_r" value="$(var background_r)"/>
<param name="background_g" value="$(var background_g)"/>
<param name="background_b" value="$(var background_b)"/>
</node>
<!-- perform remap so both turtles listen to the same command topic -->
<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>
# example.launch.yaml
launch:
# args that can be set from the command line or a default will be used
- arg:
name: "background_r"
default: "0"
- arg:
name: "background_g"
default: "255"
- arg:
name: "background_b"
default: "0"
- arg:
name: "chatter_ns"
default: "my/chatter/ns"
# include another launch file
- include:
file: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"
# include another launch file in the chatter_ns namespace
- group:
- push_ros_namespace:
namespace: "$(var chatter_ns)"
- include:
file: "$(find-pkg-share demo_nodes_cpp)/launch/topics/talker_listener.launch.py"
# start a turtlesim_node in the turtlesim1 namespace
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim1"
# start another turtlesim_node in the turtlesim2 namespace and use args to set parameters
- node:
pkg: "turtlesim"
exec: "turtlesim_node"
name: "sim"
namespace: "turtlesim2"
param:
-
name: "background_r"
value: "$(var background_r)"
-
name: "background_g"
value: "$(var background_g)"
-
name: "background_b"
value: "$(var background_b)"
# perform remap so both turtles listen to the same command topic
- node:
pkg: "turtlesim"
exec: "mimic"
name: "mimic"
remap:
-
from: "/input/pose"
to: "/turtlesim1/turtle1/pose"
-
from: "/output/cmd_vel"
to: "/turtlesim2/turtle1/cmd_vel"
Utilisation des fichiers de lancement à partir de la ligne de commande
Lancement
N’importe lequel des fichiers de lancement ci-dessus peut être exécuté avec ros2 launch
. Pour les essayer localement, vous pouvez soit créer un nouveau package et utiliser
ros2 launch <package_name> <launch_file_name>
ou exécutez le fichier directement en spécifiant le chemin vers le fichier de lancement
ros2 launch <path_to_launch_file>
Définition des arguments
Pour définir les arguments passés au fichier de lancement, vous devez utiliser la syntaxe key:=value
. Par exemple, vous pouvez définir la valeur de background_r
de la manière suivante :
ros2 launch <package_name> <launch_file_name> background_r:=255
ou alors
ros2 launch <path_to_launch_file> background_r:=255
Contrôler les tortues
Pour tester que le remappage fonctionne, vous pouvez contrôler les tortues en exécutant la commande suivante dans un autre terminal :
ros2 run turtlesim turtle_teleop_key --ros-args --remap __ns:=/turtlesim1
Python, XML ou YAML : lequel dois-je utiliser ?
Note
Les fichiers de lancement dans ROS 1 ont été écrits en XML, donc XML est peut-être le plus familier aux personnes venant de ROS 1. Pour voir ce qui a changé, vous pouvez visiter Migration des fichiers de lancement de ROS 1 vers ROS 2.
Pour la plupart des applications, le choix du format de lancement de ROS 2 dépend des préférences du développeur. Toutefois, si votre fichier de lancement nécessite une flexibilité que vous ne pouvez pas obtenir avec XML ou YAML, vous pouvez utiliser Python pour écrire votre fichier de lancement. L’utilisation de Python pour le lancement de ROS 2 est plus flexible pour les deux raisons suivantes :
Python est un langage de script, et vous pouvez donc tirer parti du langage et de ses bibliothèques dans vos fichiers de lancement.
ros2/launch (fonctionnalités de lancement générales) et ros2/launch_ros (fonctionnalités de lancement spécifiques à ROS 2 ) sont écrits en Python et vous avez donc un accès de niveau inférieur pour lancer des fonctionnalités qui peuvent ne pas être exposées par XML et YAML.
Cela étant dit, un fichier de lancement écrit en Python peut être plus complexe et verbeux qu’un fichier en XML ou YAML.