Lanzamiento de ORB-SLAM con Pepper

De RoViT
Saltar a: navegación, buscar

Contenido

¿En qué consiste el sistema?

Esta guía pretende aclarar el proceso a seguir para lanzar el algoritmo de SLAM visual ORB SLAM utilizando al robot Pepper como fuente de información para el mapeo y como objeto al localizar en el entorno.

Existen dos opciones para ejecutar ORB SLAM utilizando el hardware del robot Pepper utilizando ROS:

  • Utilizar al robot sólo como fuente de información: El robot sólo proporciona información (imágenes) a una máquina externa donde se realiza todo el procesado
  • Dividir la gestión entre el robot y la máquina externa: Encargar al robot cierta responsabilidad relacionada con la gestión de flujos de información, evitando retrasos en la comunicación de configuraciones del mismo como, por ejemplo, la resolución o FPSs solicitados a la cámara

Ambas consisten en un proceso muy similar que será tratado en la sección ¿Cómo lo pongo en marcha?, desarrollada a continuación.


¿Cómo lo pongo en marcha?

Los pasos a seguir para poner en marcha una ejecución de ORB SLAm que tome los datos de Pepper para realizar el mapeo y cuyo otro objetivo sea localizar dicho dispositivo son los siguientes:

  • Configurar ROS
    • Definir IP y puerto donde buscar al ROS master
  • Configurar y lanzar a Pepper
    • Configurar la cámara a utilizar
      • Resolución
    • Lanzar a Pepper
      • Frames Per Second (FPSs)
  • Ejecutar ORB SLAM
    • Proporcionar la ruta al vocabulario a utilizar
    • Proporcionar la ruta a los ajustes a utilizar
      • Parámetros de calibración de la cámara
      • Parámetros de ORB

Las principales diferencias en el proceso causadas por el uso que se le de a Pepper (si se utiliza como mera fuente de información o como gestor parcial de la misma) residen principalmetne en los dos primeros pasos, especialmente en el segundo. A lo largo de las próximas subsecciones se explica detalladamente en qué consisten.


Configuación de ROS

Esta configuración es necesaria para que este metasistema sea capaz de coordinar sus componentes a través del ROS master[1]. Éste debe estar siendo ejecutado en algún dispositivo que forme parte de la red y este dispositivo debe estar localizado para el resto de dispositivos que quieran interactuar utilizando ROS. Esto se logra asignándole el valor correspondiente a la variable de entorno $ROS_MASATER_URI. Esta variable contendrá la IP y el puerto que deban utilizarse para comunicarse con dicho master. El puerto por defecto para esta comunicación es el 11311, pero la IP dependerá de nuestro setup.

En caso de utilizar a Pepper únicamente como fuente de información, seguramente el ordenador donde se ejecute el ORB SLAM sea el que ejecute roscore, por lo que la IP será localhost (127.0.0.1). De este modo, la instrucción a ejecutar sería:

export ROS_MASTER_URI=http://localhost:11311

Si quisiésemos dotar a Pepper de más responsabilidad de gestión, cosa que ahorra retrasos de comunicación pero que requiere un proceso de instalación definido aquí[2], la instrucción será algo como:

export ROS_MASTER_URI=http://172.18.33.122:11311

Configuación y lanzamiento de Pepper

Configuración

ORB SLAM tanto en su versión original como en la segunda (ORB SLAM 2), toma imágenes de entrada con resolución VGA (640x480), mientras que Pepper, por defecto, las proporciona a qVGA (320x240). Por esto, es necesario editar el archivo de configuración que le hace comportarse de esta manera. Este archivo se leerá de un sitio (PC) u otro (Pepper) según cómo se use el robot.

En caso de utilizarlo como fuente de datos, en un PC con una instalación de ROS normal se encuentra en el paquete naoqi_driver, al que podemos acceder mediante la instrucción:

roscd naoqi_driver

Por otro lado, si optamos por lanzar a Pepper en ROS desde sí mismo, este paquete estará en /home/nao/.ros-root/ros1_inst/share/naoqi_driver/. Esto es causa de la instalación realizada siguiendo este tutorial[3] de instalación de ROS (la versión original, no la 2) en Pepper.

A partir de aquí, en ambos casos procederemos igual para la configuración. Una vez dentro del directorio del paquete, podremos encontrar el archivo de configuración en el directorio share. El nombre del archivo es boot_config.json y tendrá un contenido similar al siguiente extracto: {

 "_comment": "QQVGA = 0, QVGA = 1, VGA = 2",
 "converters":
 {
   "front_camera":
   {
     "enabled"       : true,
     "resolution"    : 1,
     "fps"           : 10,
     "recorder_fps"  : 15
   },[...]

Podemos localizar los dispositivos a los que corresponde cada configuración fácilmente. El extracto anterior corresponde a la cámara de la frente, pero también hay para la de la boca (bottom_camera), la de profundidad (depth_camera), etc. Incluso hay configuraciones para las IMUs, odometría y sensores táctiles, entre otras.

Dado que, tal y como se ha mencionado, buscamos una resolución VGA y, asumiendo que queramos usar la cámara de la frente, deberemos cambiar el parámetro resolution correspondiente a dicho dispositivo a 2. También conviene tener la mayor framerate posible, por lo que tratamos de incrementar el valor fps, aunque tan sólo logramos un funcionamiento a 8 FPSs (a 10 en el mejor de los casos con el robot conectado por cable y lanzándolo desde él mismo).

Lanzamiento

Con tal de poder acceder a todos los datos que publica el robot así como darle la capacidad de interpretar la información que mandamos, es necesario incluirle en la red de ROS. Esto puede hacerse desde el PC que ejecutará ORB SLAM o desde el propio Pepper.

Para el primera caso, se utiliza el paquete pepper_bringup[4]. En él se incluye un launchfile: pepper_full.launch, que hace todo el trabajo por nosotros. Asumiendo que la IP del robot sea 172.18.33.122 y que la de la máquina que ejecute el ROS master esté en 172.18.33.87, realizaríamos el lanzamiento de la siguiente manera:

roslaunch pepper_bringup pepper_full.launch nao_ip:="172.18.33.122" roscore_ip:="172.18.33.87"

En el segundo supuesto, nuestro Pepper tiene cargado un shellscript en su directorio home llamado init-driver.sh y es suficiente con ejecutarlo ejecutando (estando en su mismo directorio):

./init-driver.sh

En esta última situación, aunque no es necesario, es una buena práctica definir en ROS la IP de nuestro ordenador para que el ROS mater sea capaz de resolver el hostname. Esto lo hacemos dándole valor a la variable de entorno $ROS_IP de nuestro ordenador. En mi caso, la IP es 172.18.33.87, por lo que la instrucción para darle valor quedaría así:

export ROS_IP=172.18.33.87


En cualquiera de los dos casos, una vez llegados a este punto tendremos a Pepper publicando y recibiendo datos a través de ROS, ya sea con el ROS master en el PC externo o en él mismo. Además, las imágenes que publique, deberían ser recibidas a unos 8 o 10 FPSs con una resolución VGA desde cualquier nodo que se suscriba.

Ejecución de ORB SLAM

Una vez se tiene todo el sistema debidamente configurado, lanzar ORB SLAM no tiene ninguna complicación. Para ello tendremos que ejecutarlo indicando qué modo va a utilizarse (Mono, RGBD o Stereo) así como el path hasta los archivos de vocabulario y configuración de la cámara y del algoritmo que utilizaremos. Un lanzamiento de ORB SLAM 2 monocular se hará ejecutando una orden similar a la siguiente: rosrun ORB_SLAM2 Mono [path_al_vocabulario] [path_a_los_ajustes]

Plantilla:Note

Plantilla:Note Es posible que utilizar rutas relativas de problemas. En caso de que esto suceda, utilizar las absolutas.

Resultados y demos

__EN CONSTRUCCIÓN__

Con tal de medir la calidad de los resultados, existen ciertas herramientas descargables aquí [5] consistentes en scripts de Python que permiten, entre otras cosas, calcular tanto el error absoluto de la trayectoria (ATE) así como el de pose relativa (RPE). Para probar esto, se realizaron pruebas con el dataset freiburg1_desk. Tras realizar cinco ejecuciones en un portátil, se ovtuvieron los siguientes resultados:

Número de ejecución ATE (m) RPE (m)
1 0.313753 0.380932564069
2 0.113226 0.140181702097
3 0.014467 0.0272482118412
4 0.725814 0.879663441121
5 0.049640 0.0633464424336

A continuación se muestra una de las trayectorias obtenidas. En concreto, es la resultante de la quinta ejecución. Se ha escogido esta por ser la segunda mejor, quedando en una posición media entre el mejor y peor de los casos, ilustrando bastante bien los resultados:

Resultado de la prueba número 5

Documentación

__EN CONSTRUCCIÓN__


Publicaciones relacionadas

__EN CONSTRUCCIÓN__

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas