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
Contents
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:
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.