Note: This tutorial assumes that you have completed the previous tutorials: construyendo paquetes ROS.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Comprendiendo Nodos ROS

Description: Este tutorial introduce conceptualmente a ROS graph y desarrolla el uso de las herramientas de línea de comando roscore, rosnode y rosrun.

Tutorial Level: BEGINNER

Next Tutorial: Comprendiendo Tópicos ROS

Prerequicitos

Para este tutorial vamos a usar un sencillo y liviano simulador. Para instalar el mismo ejecutamos el siguiente comando:

$ sudo apt-get install ros-<distro>-ros-tutorials

Reemplace '<distro>' con el nombre de la distribución de ROS que esté usando (e.j. indigo, jade, kinetic)

Revista rápida de los principales conceptos de Graph

  • Nodes (Nodos): Un Nodo es un ejecutables que usa ROS para comunicarse con otros Nodos ROS.

  • Messages: Un tipo de datos ROS data type usado cuando uno se suscribe o publica dentro de un tópico.

  • Topics (Tópicos): Los nodos puede publicar mensajes a un tópico como también subscribirse a un tópico para recibir mensajes.

  • Master: Nombre de servicio para ROS ayudando a que los nodos se encuentren entre ellos.

  • rosout: Equivalente ROS a stdout/stderr

  • roscore: Es la suma de Master, rosout y el servidor de parámetros. Este ultimo (servidor de parámetros) será desarrollado más adelante.

Nodes

Un node (nodo) no es mucho más que un archivo ejecutables dentro de un paquete ROS. Los Nodos ROS usan una librería cliente para comunicarse con otros nodos. Los Nodos pueden publicar o suscribirse o ambos a un Tópico. Los Nodos también puede proveer o usar un servicio (Service).

Client Libraries (Librerías cliente)

Las librerías clientes en ROS permiten a nodos escritos en distintos lenguajes de programación comunicarse. Las principales son:

  • rospy = librería cliente para python
  • roscpp = librería cliente para c++

Aunque también hay otras alternativas y que puedes explorar en este artículo.. http://wiki.ros.org/Client%20Libraries

roscore

roscore Es lo primero que deberías corres cuando usas ROS.

Por favor inicia:

$ roscore

Deberías ver algo similar a esto:

  • ... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log
    Checking log directory for disk usage. This may take awhile.
    Press Ctrl-C to interrupt
    Done checking log file disk usage. Usage is <1GB.
    
    started roslaunch server http://machine_name:33919/
    ros_comm version 1.4.7
    
    SUMMARY
    ======
    
    PARAMETERS
     * /rosversion
     * /rosdistro
    
    NODES
    
    auto-starting new master
    process[master]: started with pid [13054]
    ROS_MASTER_URI=http://machine_name:11311/
    
    setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
    process[rosout-1]: started with pid [13067]
    started core service [/rosout]

Si roscore no comienza, puede que tengas un problema de configuración de red y esto es algo común, para encontrar los posibles errores re recomendamos ver Configurancion de red para maquina unica

Si roscore no comienza y envia mensajes sobre falta de permisos, posiblemente la carpeta ~/.ros este solo en el dominio de root y se deberá cambiar de forma recursiva las propiedades de la carpeta y dentro de ella con:

$ sudo chown -R <your_username> ~/.ros

Usando rosnode

Abra una nueva terminal, y usemos rosnode para ver que sucedio al correrroscore... Tenga en cuenta que debe mantener abierta la terminal anterior mediante no cerrar la misma o el uso de pestañas.

Nota: cuando se abre una nueva terminal su ambiente se reinicia y su ~/.bashrc es nuevamente compilada. Si tienes problemas corriendo comandos como rosnode deberá agregar algunos archivos de configuración a su ~/.bashrc o compilar este manualmente usted mismo.

rosnode muestra información sobre los nodos ROS que se están ejecutando actualmente. El comando rosnode list enumera los nodos activos:

$ rosnode list
  • You will see:
  • /rosout

Esto nos mostró que solo hay un nodo en ejecución: rosout. Esto siempre se está ejecutando, ya que recopila y registra la salida de depuración de todos los nodos.

El comando rosnode info devuelve información sobre un nodo específico.

$ rosnode info /rosout

Esto nos dio más información sobre rosout, como el hecho de que publica /rosout_agg.

  • ------------------------------------------------------------------------
    Node [/rosout]
    Publications:
     * /rosout_agg [rosgraph_msgs/Log]
    
    Subscriptions:
     * /rosout [unknown type]
    
    Services:
     * /rosout/get_loggers
     * /rosout/set_logger_level
    
    contacting node http://machine_name:54614/ ...
    Pid: 5092

Ahora, veamos algunos nodos más. Para esto, usaremos rosrun para abrir otro nodo.

Usando rosrun

rosrun le permite usar el nombre del paquete para ejecutar directamente un nodo dentro de un paquete (sin tener que conocer la ruta del paquete).

Uso:

$ rosrun [package_name] [node_name]

Así que ahora podemos ejecutar turtlesim_node en el paquete turtlesim.

Luego, en una nueva terminal:

$ rosrun turtlesim turtlesim_node

Usted vera la ventana de turtlesim:

  • turtlesim.png

NOTA: La tortuga puede verse diferente en su ventana de turtlesim. No se preocupe, hay muchos tipos de tortugas y la suya es una sorpresa.

En una nueva terminal:

$ rosnode list

Usted vera algo similar a esto:

  • /rosout
    /turtlesim

Una característica poderosa de ROS es que puede reasignar nombres desde la línea de comandos.

Cierre la ventana de turtlesim para detener el nodo (o vuelva a la terminal rosrun turtlesim y use ctrl-C). Ahora volvamos a ejecutarlo, pero esta vez use un Remapeo de argumentos para cambiar el nombre del nodo:

$ rosrun turtlesim turtlesim_node __name:=my_turtle

Ahora, si regresamos y usamos rosnode list:

$ rosnode list
  • Usted vera algo similar a esto:
  • /my_turtle
    /rosout

Nota: Si todavía ve /turtlesim en la lista, puede significar que detuvo el nodo en la terminal usando ctrl-C en lugar de cerrar la ventana, o que no tiene la variable de entorno $ ROS_HOSTNAME definida como se describe en Configuración de red - Configuración de una sola máquina. Puede intentar limpiar la lista rosnode con:

$ rosnode cleanup

Vemos nuestro nuevo nodo / my_turtle. Usemos otro comando rosnode, ping, para probar que está activo:

$ rosnode ping my_turtle
  • rosnode: node is [/my_turtle]
    pinging /my_turtle with a timeout of 3.0s
    xmlrpc reply from http://aqy:42235/     time=1.152992ms
    xmlrpc reply from http://aqy:42235/     time=1.120090ms
    xmlrpc reply from http://aqy:42235/     time=1.700878ms
    xmlrpc reply from http://aqy:42235/     time=1.127958ms

Resumen

Qué se cubrió:

  • roscore = ros + core: master (proporciona servicio de nombres para ROS) + rosout (stdout / stderr) + servidor de parámetros (el servidor de parámetros se presentará más adelante)
  • rosnode = ros + node: herramienta ROS para obtener información sobre un nodo.
  • rosrun = ros + run: ejecuta un nodo de un paquete dado.

Ahora que comprende cómo funcionan los nodos ROS, veamos Comprendiendo Tópicos ROS(ROS Topics). Además, siéntase libre de presionar Ctrl-C para detener turtlesim_node.

Wiki: es/ROS/Tutoriales/ComprendiendoNodosROS (last edited 2021-08-13 10:22:15 by JuanEduardoRiva)