Migration des fichiers de lancement de ROS 1 vers ROS 2

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

nœud

  • Disponible dans ROS 1.

  • Lance un nouveau nœud.

  • Différences avec ROS 1 :

    • L’attribut type est maintenant exec.

    • L’attribut ns est maintenant namespace.

    • 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

  • Disponible dans ROS 1.

  • 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 valeur 1, hébergé par le nœud /an_absolute_ns/my_node.

  • Un group1.another_param de valeur 2 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

  • Disponible dans ROS 1.

  • Charge les paramètres à partir d’un fichier yaml.

  • Il a été remplacé par un attribut from dans les balises param.

Exemple

<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
   <param from="/path/to/file"/>
</node>

remapper

  • Disponible dans ROS 1.

  • 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

  • Disponible dans ROS 1.

  • 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 balise push_ros_namespace pour une solution de contournement.

    • Les balises arg imbriquées dans une balise include ne prennent pas en charge les conditions (if ou unless).

    • Il n’y a pas de support pour les balises env imbriquées. set_env et unset_env peuvent être utilisés à la place.

    • Les attributs clear_params et pass_all_args ne sont pas pris en charge.

argument

  • Disponible dans ROS 1.

  • arg est utilisé pour déclarer un argument de lancement, ou pour passer un argument lors de l’utilisation des balises include.

  • Différences avec ROS 1 :

    • L’attribut value n’est pas autorisé. Utilisez la balise let pour cela.

    • doc est maintenant description.

    • Lorsqu’ils sont imbriqués dans une balise include, les attributs if et unless 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

  • Disponible dans ROS 1.

  • Définit une variable d’environnement.

  • Il a été remplacé par env, set_env et unset_env :

    • env ne peut être utilisé qu’imbriqué dans une balise node ou executable. Les balises if et unless ne sont pas prises en charge.

    • set_env peut être imbriqué dans la balise racine launch ou dans les balises group. Il accepte les mêmes attributs que env, ainsi que les balises if et unless.

    • unset_env supprime une variable d’environnement. Il accepte un attribut name 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

  • Disponible dans ROS 1.

  • Permet de limiter la portée des configurations de lancement. Généralement utilisé avec les balises let, include et push_ros_namespace.

  • Différences avec ROS 1 :

    • Il n’y a pas d’attribut ns. Voir la nouvelle balise push_ros_namespace comme solution de contournement.

    • L’attribut clear_params n’est pas disponible.

    • Il n’accepte pas les balises remap ni param 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

set_env et unset_env

Voir la description de la balise env.

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"/>

exécutable

Il permet d’exécuter n’importe quel exécutable.

Exemple

<executable cmd="ls -las" cwd="/var/log" name="my_exec" launch-prefix="something" output="screen" shell="true">
   <env name="LD_LIBRARY" value="/lib/some.so"/>
</executable>

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 et optenv ont été remplacées par la balise env. $(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é par find-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é par var. Il examine les configurations définies avec la balise arg ou let.

  • Les substitutions eval et dirname 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.