Migration des fichiers de lancement de ROS 1 vers ROS 2
Table des matières
Ce guide décrit comment écrire des fichiers de lancement XML pour une migration facile depuis ROS 1.
Fond
Une description du système de lancement de ROS 2 et de son API Python peut être trouvée dans tutoriel du système de lancement.
Migrer des tags de ROS 1 vers ROS 2
lancement
launch
est l’élément racine de tout fichier XML de lancement de ROS 2.
nœud
Lance un nouveau nœud.
Différences avec ROS 1 :
L’attribut
type
est maintenantexec
.L’attribut
ns
est maintenantnamespace
.Les attributs suivants ne sont pas disponibles :
machine
,respawn_delay
,clear_params
.
Exemple
<launch>
<node pkg="demo_nodes_cpp" exec="talker"/>
<node pkg="demo_nodes_cpp" exec="listener"/>
</launch>
paramètre
Utilisé pour passer un paramètre à un nœud.
Il n’y a pas de concept de paramètre global dans ROS 2. Pour cette raison, il ne peut être utilisé qu’imbriqué dans une balise
node
. Certains attributs ne sont pas pris en charge dans ROS 2 :type
,textfile
,binfile
,executable
,command
.
Exemple
<launch>
<node pkg="demo_nodes_cpp" exec="parameter_event">
<param name="foo" value="5"/>
</node>
</launch>
Règles d’inférence de type
Voici quelques exemples d’écriture de paramètres :
<node pkg="my_package" exec="my_executable" name="my_node">
<!--A string parameter with value "1"-->
<param name="a_string" value="'1'"/>
<!--A integer parameter with value 1-->
<param name="an_int" value="1"/>
<!--A float parameter with value 1.0-->
<param name="a_float" value="1.0"/>
<!--A string parameter with value "asd"-->
<param name="another_string" value="asd"/>
<!--Another string parameter, with value "asd"-->
<param name="string_with_same_value_as_above" value="'asd'"/>
<!--Another string parameter, with value "'asd'"-->
<param name="quoted_string" value="\'asd\'"/>
<!--A list of strings, with value ["asd", "bsd", "csd"]-->
<param name="list_of_strings" value="asd, bsd, csd" value-sep=", "/>
<!--A list of ints, with value [1, 2, 3]-->
<param name="list_of_ints" value="1,2,3" value-sep=","/>
<!--Another list of strings, with value ["1", "2", "3"]-->
<param name="another_list_of_strings" value="'1';'2';'3'" value-sep=";"/>
<!--A list of strings using an strange separator, with value ["1", "2", "3"]-->
<param name="strange_separator" value="'1'//'2'//'3'" value-sep="//"/>
</node>
Regroupement de paramètres
Dans ROS 2, les balises param
peuvent être imbriquées. Par example:
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param name="group1">
<param name="group2">
<param name="my_param" value="1"/>
</param>
<param name="another_param" value="2"/>
</param>
</node>
Cela créera deux paramètres :
Un
group1.group2.my_param
de valeur1
, hébergé par le nœud/an_absolute_ns/my_node
.Un
group1.another_param
de valeur2
hébergé par le nœud/an_absolute_ns/my_node
.
Il est également possible d’utiliser des noms de paramètres complets :
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param name="group1.group2.my_param" value="1"/>
<param name="group1.another_param" value="2"/>
</node>
rosparame
Charge les paramètres à partir d’un fichier yaml.
Il a été remplacé par un attribut
from
dans les balisesparam
.
Exemple
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param from="/path/to/file"/>
</node>
remapper
Utilisé pour transmettre des règles de remappage à un nœud.
Il ne peut être utilisé que dans les balises
node
.
Exemple
<launch>
<node pkg="demo_nodes_cpp" exec="talker">
<remap from="chatter" to="my_topic"/>
</node>
<node pkg="demo_nodes_cpp" exec="listener">
<remap from="chatter" to="my_topic"/>
</node>
</launch>
comprendre
Permet d’inclure un autre fichier de lancement.
Différences avec ROS 1 :
Disponible dans ROS 1, le contenu inclus a été délimité. Dans ROS 2, ce n’est pas le cas. Nest inclut dans les balises
group
pour les définir.L’attribut
ns
n’est pas pris en charge. Voir l’exemple de balisepush_ros_namespace
pour une solution de contournement.Les balises
arg
imbriquées dans une baliseinclude
ne prennent pas en charge les conditions (if
ouunless
).Il n’y a pas de support pour les balises
env
imbriquées.set_env
etunset_env
peuvent être utilisés à la place.Les attributs
clear_params
etpass_all_args
ne sont pas pris en charge.
Exemples
argument
arg
est utilisé pour déclarer un argument de lancement, ou pour passer un argument lors de l’utilisation des balisesinclude
.Différences avec ROS 1 :
L’attribut
value
n’est pas autorisé. Utilisez la baliselet
pour cela.doc
est maintenantdescription
.Lorsqu’ils sont imbriqués dans une balise
include
, les attributsif
etunless
ne sont pas autorisés.
Exemple
<launch>
<arg name="topic_name" default="chatter"/>
<node pkg="demo_nodes_cpp" exec="talker">
<remap from="chatter" to="$(var topic_name)"/>
</node>
<node pkg="demo_nodes_cpp" exec="listener">
<remap from="chatter" to="$(var topic_name)"/>
</node>
</launch>
Passer un argument au fichier de lancement
Dans le fichier de lancement XML ci-dessus, le topic_name
prend par défaut le nom chatter
, mais peut être configuré sur la ligne de commande. En supposant que la configuration de lancement ci-dessus se trouve dans un fichier nommé mylaunch.xml
, un nom de sujet différent peut être utilisé en le lançant avec ce qui suit :
ros2 launch mylaunch.xml topic_name:=custom_topic_name
Il existe des informations supplémentaires sur la transmission des arguments de ligne de commande dans Using Substitutions.
env
Définit une variable d’environnement.
Il a été remplacé par
env
,set_env
etunset_env
:env
ne peut être utilisé qu’imbriqué dans une balisenode
ouexecutable
. Les balisesif
etunless
ne sont pas prises en charge.set_env
peut être imbriqué dans la balise racinelaunch
ou dans les balisesgroup
. Il accepte les mêmes attributs queenv
, ainsi que les balisesif
etunless
.unset_env
supprime une variable d’environnement. Il accepte un attributname
et des conditions.
Exemple
<launch>
<set_env name="MY_ENV_VAR" value="MY_VALUE" if="CONDITION_A"/>
<set_env name="ANOTHER_ENV_VAR" value="ANOTHER_VALUE" unless="CONDITION_B"/>
<set_env name="SOME_ENV_VAR" value="SOME_VALUE"/>
<node pkg="MY_PACKAGE" exec="MY_EXECUTABLE" name="MY_NODE">
<env name="NODE_ENV_VAR" value="SOME_VALUE"/>
</node>
<unset_env name="MY_ENV_VAR" if="CONDITION_A"/>
<node pkg="ANOTHER_PACKAGE" exec="ANOTHER_EXECUTABLE" name="ANOTHER_NODE"/>
<unset_env name="ANOTHER_ENV_VAR" unless="CONDITION_B"/>
<unset_env name="SOME_ENV_VAR"/>
</launch>
groupe
Permet de limiter la portée des configurations de lancement. Généralement utilisé avec les balises
let
,include
etpush_ros_namespace
.Différences avec ROS 1 :
Il n’y a pas d’attribut
ns
. Voir la nouvelle balisepush_ros_namespace
comme solution de contournement.L’attribut
clear_params
n’est pas disponible.Il n’accepte pas les balises
remap
niparam
comme enfants.
Exemple
La configuration de launch-prefix
affecte à la fois les actions executable
et node
tags”. Cet exemple utilisera time
comme préfixe si l’argument use_time_prefix_in_talker
est 1
, uniquement pour le locuteur.
<launch>
<arg name="use_time_prefix_in_talker" default="0"/>
<group>
<let name="launch-prefix" value="time" if="$(var use_time_prefix_in_talker)"/>
<node pkg="demo_nodes_cpp" exec="talker"/>
</group>
<node pkg="demo_nodes_cpp" exec="listener"/>
</launch>
machine
Il n’est pas pris en charge pour le moment.
test
Il n’est pas pris en charge pour le moment.
Nouvelles balises dans ROS 2
push_ros_namespace
Les balises include
et group
n’acceptent pas un attribut ns
. Cette action peut être utilisée comme solution de contournement :
<!-Other tags-->
<group>
<push_ros_namespace namespace="my_ns"/>
<!--Nodes here are namespaced with "my_ns".-->
<!--If there is an include action here, its nodes will also be namespaced.-->
<push_ros_namespace namespace="another_ns"/>
<!--Nodes here are namespaced with "another_ns/my_ns".-->
<push_ros_namespace namespace="/absolute_ns"/>
<!--Nodes here are namespaced with "/absolute_ns".-->
<!--The following node receives an absolute namespace, so it will ignore the others previously pushed.-->
<!--The full path of the node will be /asd/my_node.-->
<node pkg="my_pkg" exec="my_executable" name="my_node" ns="/asd"/>
</group>
<!--Nodes outside the group action won't be namespaced.-->
<!-Other tags-->
laisser
C’est un remplacement de la balise arg
par un attribut de valeur.
<let name="foo" value="asd"/>
Remplacer une balise include
Afin d’inclure un fichier de lancement sous un espace de noms comme dans ROS 1, les balises include
doivent être imbriquées dans une balise group
.
<group>
<include file="another_launch_file"/>
</group>
Ensuite, au lieu d’utiliser l’attribut ns
, ajoutez la balise d’action push_ros_namespace
pour spécifier l’espace de noms :
<group>
<push_ros_namespace namespace="my_ns"/>
<include file="another_launch_file"/>
</group>
L’imbrication des balises include
sous une balise group
n’est requise que lors de la spécification d’un espace de noms
Remplacements
La documentation sur les substitutions de ROS 1 peut être trouvée dans roslaunch XML wiki. La syntaxe des substitutions n’a pas changé, c’est-à-dire qu’elle suit toujours le modèle $(substitution-name arg1 arg2 ...)
. Il y a cependant quelques changements w.r.t. ROS 1 :
Les balises
env
etoptenv
ont été remplacées par la baliseenv
.$(env <NAME>)
échouera si la variable d’environnement n’existe pas.$(env <NAME> '')
fait la même chose que$(optenv <NAME>)
de ROS 1.$(env <NAME> <DEFAULT>)
fait la même chose que$(env <NAME> <DEFAULT>)
ou$(optenv <NAME> <DEFAULT>)
de ROS 1.find
a été remplacé parfind-pkg-share
(remplaçant le répertoire de partage d’un paquet installé). Sinon,find-pkg-prefix
renverra la racine d’un paquet installé.Il y a une nouvelle substitution
exec-in-pkg
. par exemple :$(exec-in-pkg <package_name> <exec_name>)
.Il y a une nouvelle substitution
find-exec
.arg
a été remplacé parvar
. Il examine les configurations définies avec la balisearg
oulet
.Les substitutions
eval
etdirname
n’ont pas changé.La substitution
anon
n’est pas prise en charge.
Règles d’inférence de type
Les règles affichées dans la sous-section Règles d'inférence de type
de la balise param
s’appliquent à n’importe quel attribut. Par example:
<!--Setting a string value to an attribute expecting an int will raise an error.-->
<tag1 attr-expecting-an-int="'1'"/>
<!--Correct version.-->
<tag1 attr-expecting-an-int="1"/>
<!--Setting an integer in an attribute expecting a string will raise an error.-->
<tag2 attr-expecting-a-str="1"/>
<!--Correct version.-->
<tag2 attr-expecting-a-str="'1'"/>
<!--Setting a list of strings in an attribute expecting a string will raise an error.-->
<tag3 attr-expecting-a-str="asd, bsd" str-attr-sep=", "/>
<!--Correct version.-->
<tag3 attr-expecting-a-str="don't use a separator"/>
Certains attributs acceptent plusieurs types, par exemple l’attribut value
de la balise param
. Il est courant que les paramètres de type int
(ou float
) acceptent également une str
, qui sera ultérieurement substituée et essayée de se convertir en int
(ou `` float``) par l’action.