El sistema operativo de 1K-3A: el problema son las aplicaciones

Introducción

El sistema operativo de 1K-3A será una distribución Linux, actualmente es la versión alpha de OpenQbo, distribución de la que estoy esperando una actualización mayor para poder seguir usándola. Mientras tanto, he elaborado una arquitectura deseable de sistema operativo para 1K-3A que tendría la siguiente arquitectura:

linuxos

 

Arquitectura

Tendríamos varios niveles en el sistema operativo, por un lado el kernel de linux y los drivers de dispositivos. Posteriormente el sistema ROS, del que ya he publicado algún que otro artículo en el blog y después una capa de introspección. La capa de introspección nos permite poder utilizar cualquier lenguaje para acceder a los paquetes disponibles en ROS, este es un trabajo arduo y doloroso pero que tendría la contrapartida y gran ventaja de poder utilizar cualquier lenguaje para el que exista el binding. O mejor dicho, es más fácil crear bindings (adaptaciones) de lenguajes de programación para ROS. Así no nos limitaríamos a C,C++ y Python sino además otros lenguajes soportados por el proyecto Gnome. La capa final es la nube (Cloud), es decir, la conexión permanente de nuestro robot a la nube de servicios disponibles en internet.

ROS/Tutoriales/ComprendiendoLosNodosDeRos

Introducción

Este post es una traducción del original disponible en la web de ROS. Existen una anotación final en la cual hablo sobre la aplicación de la introspección en las librerías roscpp y su uso con otros lenguajes más allá de python y C++. Es una idea sin probar que iré desarrollando a lo largo del desarrollo de mi modelo de R2D2 (1K-3A). La traducción está inacabada.

Introducción a los grafos

Nodos

Un nodo no es más que un ejecutable dentro de un paquete. Los nodos ROS usan a un cliente ROS para comunicarse con otros nodos. Los nodos pueden publicar o suscribirse a un Tema. Los nodos además proporacionar o usar un servicio.

Librerías de Clientes

La liberías de clientes ROS proporcionan nodos escritos en distintos lenguajes para comunicarse:

  • rospy – librería de clientes python
  • roscpp – librería de clientes C++

roscore

roscore es la primera cosa que deberías iniciar cuando uses ROS.

Por favor corre:

$ roscore

Verás algo similar a esto:

... logging to /.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-bvo-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://bvo:33919/

SUMMARY
========

NODES

starting new master (master configured for auto start)
process[master]: started with pid [13054]
ROS_MASTER_URI=http://bvo:11311/

setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf
process[rosout-1]: started with pid [13067]
started core service [/rosout]

Abre un nuevo terminal, usa rosnode para ver que hace roscore en ejecución…

Usando rosnode

rosnode muestra la información de los nodos que están actualmente en ejecución. El comandos rosnode muestra los nodos activos:

$ rosnode list

Verás:

/rosout

Este debería mostrarte unicamente el nodo rosout. Este siempre está ejecutándose.

El comando rosnode info devuelve la información acerca de un determinado nodo.

$ rosnode info /rosout

Este nos devolverá alguna información sobre rosout, como el hecho de que este publica en /rosout_agg.

--------------------------------------------------------------------------------
Node [/rosout]

Publications:
 * /rosout_agg [roslib/Log]

Subscriptions:
 * /clock [unknown type]
 * /rosout [unknown type]

Services:
 * /rosout/set_logger_level
 * /rosout/get_loggers

contacting node http://foo.local:54614/ ...
Pid: 5092

Ahora, vamos a ver más nodos, utilizando el comando rosrun tener otro nodo.

Usando rosrun

rosrun te permite usar el nombre de un paquete para iniciar un nodo con ese paquete (sin necesidad de especificar la ruta).

Usa:

$ rosrun [package_name] [node_name]

Ahora podemos ejecutar turtlesim_node en el paquete turtlesim, en un nuevo terminal:

$ rosrun turtlesim turtlesim_node

Veremos una ventana como la siguiente:

[…]

Resumen

[…]

Fuente: http://www.ros.org/wiki/ROS/Tutorials/UnderstandingNodes

ROS/Tutoriales/NavegandoPorElSistemaDeArchivos

1. Navegando por el sistema de archivos de ROS

Descripción: este tutorial introduce los conceptos sobre el sistema de archivos de ROS, y cubre el uso de roscd, rosls, y las herramientas de la línea de comandos de rospack.

2. Visión general de los conceptos del sistema de archivos

  1. Packages: son paquetes, es el nivel más bajo de organización del software en ROS. Pueden contener cualquier cosa: herramientas, ejecutables…
  2. Manifest: un manifiesto es una descripción de un paquete. El papel más importante es definir las dependencias entre paquetes.
  3. Stacks: son pilas, una colección de paquetes que forman una librería de alto nivel.
  4. Stack Manifest: son manifiestos como los anteriores pero para pilas.

Cuando observes el sistema de archivos, es fácil diferencias entre paquetes y pilas:

  • Un paquete es un directorio con un archivo manifest.xml.
  • Una pila es un directorio que contiene un archivo stack.xml

filesystem

3. Herramientas del sistema de archivos

Para ROS hay una gran cantidad de código esparcido através de varios paquetes y pilas. Navegando con la línea comandos utilizando comandos como ls o cd resulta tedioso en ROS. Por este motivo ROS dispone de su propias herramientas para ayudarte.

3.1 Usando rospack y rosstack

rospack y rosstack forman parte del juego rospack. Esto te permite obtener información sobre paquetes y pilas. En este tutorial unicamente vamos a ver el uso de la opción find, que devuelve la ruta de un paquete o de una pila.

Uso:

$ rospack find [package_name]
$ rosstack find [stack_name]

Ejemplo:

$ rospack find roscpp

Lo que devolverá:

TU_RUTA_DE_INSTALACION/ros/core/roscpp

3.2.- Usando roscd

roscd es parte del juego rosbash. Este comado permite cambiar de directorio (cd) directamente de un paquete o una pila.

Uso:

$ roscd [locationname[/subdir]]

Ejemplo:

$ roscd roscpp

Para verificar que hemos cambiado al directorio del paquete roscpp, usamos el comando de Unix pwd que nos indica el directorio de trabajo:

$ pwd

Devuelve:

TU_RUTA_DE_INSTALACION/ros/core/roscpp

Puedes comprobar que la ruta TU_RUTA_DE_INSTALACION/ros/core/roscpp es la misma que nos mostró el comando rospack find en el ejemplo anterior.

3.2.1.- Subdirectorios

roscd también permite cambiar de un subdirectorio a una pila o a un paquete.

Intenta:

$ roscd roscpp/include
$ pwd

Lo que devolverá:

YOUR_INSTALL_PATH/ros/core/roscpp/include

3.3.- Casos especiales para roscd

Hay pequeños casos especiales que te queremos contar para continuar que no afecta a los paquetes o a las pilas.

3.3.1.- roscd sin argumentos

roscd sin argumentos te devolverá el valor de la variable $ROS_ROOT. Prueba:

Verás:

Esta ruta es la misma definida en $ROS_ROOT.Prueba:

Verás:

3.3.2.- roscd log

roscd log acudirás al directorio donde están almacenados los archivos de log donde ROS los almacena.Posiblemente no tengas ningún archivo de log todavía.

Prueba:

$ roscd log

3.4.- Usando rosls

rosls forma parte del juego de comandos de rosbash. Permite hacer ls directamente sobre paquetes, pilas o lugares comunes dentro de las rutas de los paquetes de ros.

Formato:

$ rosls [locationname[/subdir]]

Ejemplo:

$ rosls roscpp_tutorials

Te devolverá:

add_two_ints_client         listener_unreliable
  add_two_ints_server         listener_with_tracked_object
  add_two_ints_server_class   listener_with_userdata
  anonymous_listener          Makefile
  babbler                     manifest.xml
  CMakeLists.txt              node_handle_namespaces
  custom_callback_processing  notify_connect
  listener                    srv
  listener_async_spin         talker
  listener_multiple           time_api
  listener_single_message     timers
  listener_threaded_spin

3.5.-  Autocompletado con el tabulador

[…]

4.- Conclusiones

[…]

Original en Inglés: http://www.ros.org/wiki/ROS/Tutorials/NavigatingTheFilesystem

Imagen: http://www.ros.org