Saltar al contenido

Nodos, topics y mensajes. Turtlesim


ros_fuerte

Qué son los nodos en ROS? Qué son los topics en ROS? Cual es su estructura? En esta entrada ahondaremos en todos estos temas fundamentales y además veremos como identificar todos estos componentes fundamentales con un ejemplo práctico usando Turtlesim

ruleta 4

Qué son los nodos en ROS?

Los nodos son archivos ejecutables dentro de nuestra aplicación de ROS, estos nodos pueden comunicarse entre ellos.
Los nodos serán los encargados de realizar una acción o un servicio o publicar o subscribirse a alguna información. Existe unas librerías internas encargadas de gestionar los nodos, estas librerías son rospy y roscpp
Rospy es para lenguaje Python y Roscpp para lenguaje C++

Para información más detallada de este tema en este enlace podréis complementar la información.

Como ya hemos comentado en anteriores entrdas, en este tutorial de ROS 100% español nos centraremos en C++.
Este es el inicio del código que nos encontramos en una aplicación típica de ROS en C++

include <ros/ros.h>
ros::init(argc, argv, "nodo_prueba");
ros::NodeHandle nh;

Con #include <ros/ros.h> cargamos la librería interna de ROS para C++.
Con la segunda linea inicializamos el nodo, y le damos el nombre de «nodo_prueba»
Con la tercera linea iniciamos un miembro de clase que permite inicializar el nodo, esta linea es obligatoria para iniciar el nodo.

Existen una serie de comandos que podemos insertar en nuestra consola y que nos proporcionarán cierta información, para ello roscore debe estar activo, si no está activo nos saldrá el error: 

[ERROR] [1595957826.343296740]: [registerPublisher] Failed to contact master at [localhost:11311]. Retrying…

Dichos comandos son:

$rosnode list
$rosnode info [/nombre_del_nodo]
$rosrun [/nombre_del_paquete nombre_del_nodo]

El comando rosnode list nos va a proporcionar una lista de los nodos activos.
El comando rosnode info nos va a proporcionar información del nodo que deseemos.
El comando rosrun va a ejecutar un nodo que se encuentra dentro de un paquete.

Para terminar la ejecución de un nodo, siempre y cuando a nivel de programación no le demos orden de terminar, deberemos pulsar Ctrl+C

Qué son los topics en ROS?

Los topics son la manera que tienen los nodos de comunicarse entre ellos.  A través de estos topics los nodos se pasan mensajes. Estos mensajes pueden tener una estructura predeterminada o bien puede ser creada por nosotros.

topics

Por ejemplo, pensemos que tenemos dos nodos, el primero será el encargado de leer el valor de un sensor láser de distancia, y el segundo nodo se va a encargar de tomar decisiones en función del valor de este sensor. Estos nodos se van a comunicar a través de un topic.
En este caso imaginemos que le llamamos al topic «/distancia_laser». Pues bien, dicho topic estará formado por mensajes que contienen la información del sensor láser de distancia, estos mensajes serán de un tipo, digamos que este tipo se llama laser_msgs.

Como es lógico estos mensajes tendrán una estructura adecuada a dicha tarea, es decir cada mensaje contendrá el valor del sensor en mm por ejemplo, el momento en que ha sido tomada la medida, etc.

Cada topic aceptará sólo un tipo de mensaje, este topic /distancia_laser aceptará sólo mensajes que tengan la estructura adecuada, es decir sólo aceptará mensajes del tipo laser_msgs. Si mandamos un mensaje con otra estructura no será aceptado. Por ejemplo si mandamos un mensaje con estructura de una imagen captada por una cámara, no será aceptado, por lo que no habrá transmisión de datos.

En definitiva, los topics son los canales a través de cuales se comunican los nodos y los mensajes son los contenidos de estos topics.

Al igual que para los nodos existen una serie de comandos que podemos escribir en nuestra consola:

$rostopic list
$rostopic info [/nombre_del_topic]
$rostopic echo[/nombre_del_topic]

El comando rostopic list nos va a proporcionar una lista de los topics activos.
El comando rostopic info nos va a proporcionar información del topic que deseemos.
El comando rostopic echo va a darnos el valor de dicho topic.

Qué son los mensajes en ROS?

Tal y como hemos comentado los nodos se comunican entre sí mediante la publicación de mensajes dentro de los topics. Un mensaje no es más que unos datos con una estructura determinada.

Estos mensajes pueden estar compuestos por integers, floats, strings, booleans, arrays, etc…

Existen también mensajes generados por los servicios, estos tienen una parte llamada request y otra response, pero esto lo veremos cuando tratemos el tema de servicios en ROS.

Un ejemplo de un mensaje del tipo LaserScan.msg sería:

std_msgs/Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment

float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

Como se puede ver, el mensaje está formado por varios elementos, primero va una parte del mensaje llamada header que a su vez es otro tipo de mensaje que suele aparecer incluido en el inicio de muchos mensajes de ROS y que entre otras cosas incluye el timepo (timestamp) en el que se ha creado el mansaje.

Luego se incluyen mensajes del tipo float32 (números decimales), que representan el angulo minimo (angle_min), el angulo maximo (angle_max), etc. Y al final nos encontramos con dos mensajes que son un array de float32, por ejemplo ranges es un array de varios floats32 que corresponden a las medidas de distancia a lo largo de todo el abanico entre angle_min y angle_max.

Al igual que con los nodos y los topics existen comandos para la consola para los mensajes , los más importantes son:

$rosmsg list
$rosmsg show [/tipo_del_mensaje]

El comando rosmsg list nos va a proporcionar una lista de los mensajes activos.
El comando rosmsg show nos va a proporcionar información  de la estructura del mensaje que deseemos.

Aplicacioń práctica. Turtlesim

Usaremos el ejemplo de turtlesim, turtlesim no es más que un paquete que consiste en una pantalla en la que se carga una tortuga, que podemos mover por la pantalla y otras cosas más. Usaremos este ejemplo para poner en practica lo aprendido.

Para ello instalamos turtlesim, escribiendo en nuestra consola:

$sudo apt-get install ros-kinetic-turtlesim

En caso de no tener kinetic como versión de ROS sustituiremos kinetic por la versión que tengamos por ejemplo melodic:
$sudo apt-get install ros-melodic-turtlesim

ahora ejecutaremos el comando rosrun explicado anteriormente, para ello escribimos en la consola:

$rosrun turtlesim turtlesim_node

Este comando ejecutará el nodo tutlesim_node dentro del paquete turtlesim. Recuerda que Roscore debe estar ejecutado. Al ejecutar este comando nos aparecerá una pantalla con na tortuga en medio.

turtlesim

Una vez ejecutado veremos qué nodos están activos, para ello escribimos en la consola:

$rosnode list

Esto nos devolverá:

rosnode list

Es decir, tenemos dos nodos activos, el primero es el /rosout, este nodo es creado automáticamente al ejecutar roscore y el segundo es el nodo /turtlesim

Si queremos información de este nodo escribiremos:

$rosnode info /turtlesim

Esto nos devolverá:

rosnodeinfo

En la parte de Publications vemos qué topics publica este nodo.

En la parte de subscriptions nos dirá a qué topics se subscribe este nodo y en la parte de servicios veremos que servicios pone a a disposición este nodo.

Este comando nos ofrece info del nodo como, qué topics publica el nodo, a que topics se subscribe, que servicios levanta…

Para comprobar que topics crea nuestro paquete turtlesim, escribiremos:

$rostopic list


Vemos los nodos publicados por el paquete turtlesim, que son rosout_agg, /turtle1/color_sensor y /turtle1/pose. Además vemos el topic al que se subscribe el nodo, el topic llamado /turtle1/cmd_vel

Ahora vamos a inspeccionar uno de los topics, por ejemplo el topic /turtle1/pose que nos da la posición de la tortuga en la pantalla, para ello escribimos en la consola:

$rostopic info /turtle1/pose


rostopic_info

Nos va a indicar que tipo de mensaje lleva este topic, en este caso turtlesim/Pose.
Quién publica este topic, en este caso el nodo turtlesim y quién se subscribe a este topic, en este caso nadie

Si ahora queremos ver en detalle que tipo de mensaje lleva y como es sus estructura interna, escribiremos:

$rosmsg show turtlesim/Pose


Si analizamos el mensaje, la primera línea es un numero decimal (float32), que representa los posición de la tortuga en x, la segunda línea representa la posición de la tortuga en y, la siguiente (theta) es un decimal que representa el angulo de la tortuga respecto a la horizontal y las siguientes lineas son decimales que representan la velocidad lineal de la tortuga y la velocidad angular respectivamente.

También podremos hacer esto buscando la definición del tipo mensaje en Internet.

Si ahora queremos ver el último mensaje publicado en este topic, escribiremos:

$rostopic echo /turtle1/Pose -n1


rostopic_echo

Nos devuelve el valor actual del topic solicitado, en este caso representa la posición la posición actual, el -n1 significa solo el útilmo mensaje publicado.
Como vemos el mensaje tiene la estructura que hemos visto antes en el comando rosmsg show, la tortuga esta quieta en la pos x=5,54 y en la pos y=5,54, el resto de valores son 0.

Estos conceptos es fundamental dominarlos, por eso se recomienda repetir estos ejercicios hasta tener clara las ideas.
Estos conceptos son muy recurrentes y son muy muy útiles para entender como funcionan los paquetes de ROS, ya que hay que tener en cuenta que en nuestras aplicaciones de ROS usaremos paquetes de otros como si fuese un puzzle.
Por ello será importante descifrar el funcionamiento de estos paquetes para poder usarlos e incorporarlos a nuestra aplicación.

En la siguiente entrada de nuestro tutorial de ROS 100% en español hablaremos sobre como publicar un topic y como subscribirnos a un topic. Además veremos las herramienta rqt.

Aviso Legal

Política de cookies

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

4 Nodos, Topics y Mensajes. Turtlesim

  • por