Estás leyendo la documentación para una versión de desarrollo. Para la última versión publicada, por favor revisa Humble.

Crear un fichero de launch

Objetivo: Crear un fichero de launch para ejecutar un sistema complejo de ROS2.

Nivel del tutorial: Intermedio

Tiempo: 10 minutos

Prerequisitos

Este tutorial usa los paquetes rqt_graph y turtlesim.

También deberás utilizar un editor de texto de su preferencia.

Como siempre, no te olvides de sincronizar las fuentes de ROS2 en cada terminal que abra.

Antecedentes

El sistema de launch en ROS2 es responsable de ayudar al usuario en la descripción de la configuración de su sistema y de ejecutarlo como fue descrito. La configuración del sistema incluye que programas se deben de ejecutar, donde ejecutarlos, que argumentos se les deben de asignar, así como convenciones específicas de ROS que hacen más sencillo la reusabilidad de los componentes a través del sistema proporcionándoles una configuración diferente. También es responsable de monitorizar el estado de los procesos ejecutados, y reportar y/o reaccionar a los cambios en los estados de dichos procesos.

Los ficheros de launch escritos en Python, XML, o YAML pueden empezar o parar diferentes nodos, así como también activar y actuar a varios eventos. Vea Using Python, XML, and YAML for ROS 2 Launch Files para una descripción de los diferentes formatos. El paquete proveedor de este framework es launch_ros, el cual usa de fondo el framework no específico de ROS launch.

El documento de diseño detalla el objetivo detrás del diseño del sistema de launch de ROS2 (actualmente no todas las funcionalidades están disponibles).

Tareas

1 Configuración

Cree una nueva carpeta donde guardar sus ficheros de launch:

mkdir launch

2 Escribir un fichero de launch

Vamos a componer un fichero de launch de ROS2 usando el paquete de turtlesim y sus ejecutables. Como fue mencionado anteriormente, este puede ser es Python, XML, o YAML.

Copia y pega el código completo en el fichero 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 Examine el fichero de launch

Todos los ficheros de launch anteriores están ejecutando tres nodos, todos del paquete de turtlesim. El objetivo del sistema es lanzar dos ventanas de turtlesim, y que una tortuga imite los movimientos de la otra.

Al lanzar los dos nodos de turtlesim, la única diferencia entre ellos son sus valores de namespace. Namespaces únicos permite al sistema empezar dos nodos sin tener conflictos de nombres del nodo o conflictos de nombre de los topics. Ambas tortugas en este sistema reciben comandos a través del mismo topic y publican su pose a través del mismo topic.

Con namespaces únicos, se pueden distinguir los mensajes destinados a diferentes tortugas.

El nodo final también es del paquete de turtlesim, pero es un ejecutable diferente mimic. Este nodo ha añadido detalles de configuración en forma de reasignaciones El topic /input/pose de mimic es reasignado a /turtlesim1/turtle1/pose y su topic /output/cmd_vel a /turtlesim2/turtle1/cmd_vel Esto significa que mimic se subscribirá al topic de pose de /turtlesim1/sim y lo republicará al topic de comando de velocidad de /turtlesim2/sim. En otras palabras, turtlesim2 imitará los movimientos de turtlesim1.

Estas declaraciones de importación extraerán algunos modulos launch de Python.

from launch import LaunchDescription
from launch_ros.actions import Node

A continuación, comienza la descripción del launch propiamente dicha:

def generate_launch_description():
   return LaunchDescription([

   ])

Las primeras dos acciones en la descripción de launch, lanza las dos ventanas de turtlesim:

Node(
    package='turtlesim',
    namespace='turtlesim1',
    executable='turtlesim_node',
    name='sim'
),
Node(
    package='turtlesim',
    namespace='turtlesim2',
    executable='turtlesim_node',
    name='sim'
),

La acción final lanza el nodo de imitación con las reasignaciones:

Node(
    package='turtlesim',
    executable='mimic',
    name='mimic',
    remappings=[
      ('/input/pose', '/turtlesim1/turtle1/pose'),
      ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
    ]
)

3 ROS2 launch

Para ejecturar el fichero de launch creado arriba, entre a la carpeta creada anteriormente y ejecuta el siguiente comando:

cd launch
ros2 launch turtlesim_mimic_launch.py

Nota

Es posible lanzar un fichero de launch directamente (como lo hacemos arriba), o proporcionado por un paquete. Cuando es proporcionado por un paquete, la sintaxis es:

ros2 launch <package_name> <launch_file_name>

Aprendiste a crear paquetes en Creating a package.

Nota

Para paquetes con ficheros de launch, es buena idea añadir una dependencia exec_depend del paquete ros2launch en el package.xml de tu paquete.

<exec_depend>ros2launch</exec_depend>

Esto ayuda a asegurar que el comando ros2  launch esta disponible despues de compilar tu paquete. Esto tambien asugura que todos los formatos de ficheros de launch son reconocidos.

Dos ventanas de turtlesim se abrirán, y verás lo siguientes mensajes de [INFO] diciendo cuales nodos fueron inicializados por tu fichero de launch.

[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]

Para ver el sistema en acción, abra una nueva terminal y ejecuta el comando ros2 topic pub en el topic /turtlesim1/turtle1/cmd_vel para ver la primera tortuga moverse:

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

Verás que ambas tortugas seguirán el mismo camino.

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

4 Introspección del sistema con rqt_graph

Mientras el sistema sigue corriendo, abre una nueva terminal y ejecuta rqt_graph para tener una mejor idea de las relaciones entre los nodos en tu fichero de launch.

Ejecuta el comando:

rqt_graph
../../../_images/mimic_graph.png

Un nodo escondido (el comando ros2 topic pub que ejecutaste) esta publicando datos al topic /turtlesim1/turtle1/cmd_vel en la izquierda, al cual el nodo /turtlesim1/sim esta subscrito. El resto del grafo muestra lo que se describió anteriormente: mimic esta subscrito al topic de la pose de /turtlesim1/sim, y publica al topic de comando de velocidad de /turtlesim2/sim.

Resumen

Los ficheros de launch simplifican la ejecución de sistemas complejos con muchos nodos y especifican los detalles de configuración. Tu puedes crear ficheros de launch usando Python, XML, o YAML, y ejecturarlos usando el comando ros2 launch.