Tutorial ROS2

por Juan Felipe Martinez Bedoya

En este tutorial se hablará acerca de las bases de ROS2, basándose en el curso de ROS2 basics with Python de The Construct. En un futuro se tratará deañadir también la creación de paquetes pero utilizando C++.

ROS2 es la versión mejorada y la última versión de ROS, la cual nace para mejorar todas las limitaciones de su predecesor. Algunas de las ventajas que se presentan comunicaciones en tiempo real, seguridad embedida, comunicaciones DDS (comunicación para datos distribuidos, muy usado para enjambres) y mayores aplicaciones para la industria.

Es importante leerse primero

Correr un programa

Preparar el ambiente

Antes de empezar a correr se debe escribir el siguiente comando para que podamos usar los comandos de ROS2, sino se hace el computador no reconocerá ros2.

source /opt/ros/foxy/setup.bash

Falta hacer la aclaración que el comando puede variar dependiendo de la versión de ROS2 que se esté trabajando, tocaría cambiar el foxy con el nombre dela publicación (e.j la última versión humble).

Correr programas

Una de las grandes diferencias de ROS2 es como se corre un programa, ya que anteriormente tocaba modificar el comando principal dependiendo de la dependencia que se deseaba llamar, ahora todo se puede llamar utilizando el comando de ros2.

Para llamar programas se puede utilizar dos métodos diferentes: - Lanzar un programa directamente usando un archivo ejecutable. - Lanzar un programa utilizando un archivo launch.

Para utilizar archivos ejecutables:

ros2 run <nombrePaquete> <archivoEjecutable>

Donde el primer parámetro run especifíca que se va a correr un archivo, el segundo es el nombre del paquete que contiene el archivo ejecutbale y el tercero es el archivo que se va a ejecutar.

Para correr archivos launch

ros2 launch <nombrePaquete> <archivoLaunch>

Donde el primer parámetro launch especifíca que se utilizará un archivo launch, el segundo es el nombre del paquete que contiene el archivo ejecutbale y el tercero es el archivo que se va a ejecutar.

Se debe tener en cuenta que cuando se cree un archivo launch se debe tener permisos de ejecutable para todos, por lo que es importante correr el comando de:

chmod +x my_package_launch_file.launch.py

Estructura de ROS2

Workspace

Un workspace es un directorio en donde se almacenan los paquetes y la información necesaria para correrlos.

En este se tiene una estructura predefinida y se pueden encontrar las carpetas: - /build - /install - /log - /src- En este se contiene todos los paquetes.

Paquetes

Anteriormente se mencionaron los paquetes, sin embargo nunca se especificó que eran ni se ha explicado la estructura de archivos que se debe tener para poder correr un programa de ROS2.

Para empezar un paquete es una carpeta que conteiene todos los archivos necesarios para que un programa de ROS2 pueda correr, en esto se incluye: - Programas, ya sean .cpp para C++ o .py para Python. - Archivos de configuración. - Archivos de compilación. - Archivos launch. (lanzamiento) - Archivos de parámetros.

Compilar un Workspace

Cuando se haya creado un ambiente de trabajo apto para trabajar, antes de ejecutar cualquier cosa se necesita utilizar el comando de colcon build

colcon build

Si se desea compilar solo un paquete en específico se utiliza el parámetro de --packages-select. La estructura quedaría de la siguiente manera:

colcon build --package-select <nombrePaquete>

Donde el nombre del paquete es aquel que queramos compilar.

Cada que se compile es importante volver a instanciar el ambiente utilizando el comando de:

source ~/ros2_ws/install/setup.bash

Nodos

Los nodos son responsables de los módulos del robot, ya sean para controlar las ruedas, otros para controlar sensores laser, otro para los ultra sonido, etc. Los nodos se comunican entre sí por diferentes métodos:

  • Un TOPIC, para llamar este tipo se monta un Publisher que se encarga de enviar valores por medio de un tópico /nombre que luego este se encarga de enviarle mensajes al robot. Hasta cuando se tumbe el publicador, este seguirá escuchando el último mensaje que se haya enviado.
  • Un SERVICE, sirve para programar una función en específico que puede ser escuchada por cualquier robot que lo llame. Para esto toca montar un server y para crear la petición se necesita un client. Al llamar un servive toca esperar a que este termine para poder ejecutar otro comando.
  • Un ACTION, es un término parecido al Service, con la diferencia de que si se llama se pueden ejecutar otros comando mientras se ejecuta la acción. Otra diferencia es que este tipo de acción puede dar feedback mientras es ejecutada.

Un ejemplo de como se ven los nodos es:

modelo

Un sistema robótico está comprometido por varios nodos trabajando entre ellos y en ROS2 un simple ejecutabl epuede contener yno o más nodos.

Para ver todos los nodos se usa el comando:

ros2 node list

Para ver la información en específico de un nodo se usa la función:

ros2 node info /<nombreNodo>

Se debe poner el nombre del nodo como aparece cuando se usa bash ros2 node list node list ```.

Interfaces

Las interfaces son como se comunican los nodos internamente, para esto se usa un lenguaje estandar conocido como IDL (interface definition lenguage). Normalmente ya existen una serie de interfaces predefinidas por ROS que se pueden utilizar.

Para ver todas interfaces activas se usa el comando de:

ros2 interface list

Si se desea averiguar la infromación en específico de una interfaz se utiliza el comando de

ros2 interface show <nombreInterfaz>

Donde el nombre de la interfaz debe aparecer como cuando se utiliza el comando de ros2 interface list.

De la misma manera se puede utilizar un comando de las interfaces que se llama proto, si se usa este comando se entrega un prototipo de mensaje que se enviaría al utilizar algún tipo de interfaz.

ros2 interface proto <nombreInterfaz>

Mensajes

Ahora una mirada más profunda

Topics

Para ver todos los tópicos activos en el momento se usa el comando de:

ros2 topics list

Para ver un tópico en específico se puede utilizar el comando de:

ros2 topic info /<tópico>

Donde el tópico se pone como aparece cuando se usa el topic info.

En este se pueden ver 3 mensajes:

  • El primero muestra el tipo, que se refiere a la interfaz de ROS2 asociado con el tópico con el que se necesita trabajar.
  • El segundo muestra el publisher count, que se refiere al número de publicadores activos conectados con el tópico.
  • Por último se tiene el subscription count, que cuent el número de subscriptores activos conectados con el tópico.

Hay otro comando muy importante que es el echo que sirve para subscribirse a un tópico, este se usa:

ros2 topic echo /<tópico>

Se puede enviar mensajes a un tópico sin la necesidad de crear un programa, esto se logra con el comando de pub. Para utilizar este comando se puede averiguar como se envían los mensajes con el comando mencionado anteriormente de proto. La estructura del comando es la siguiente:

ros2 topic pub <nombreTopico> <nombreInterfaz> <mensaje>

En este caso el nombreTopico es el nombre del tópico al que se desea enviar la información, el nombreInterfaz es el tipo de