Instalando el entorno para las prácticas de Robótica

Introducción

El entorno de prácticas de la asignatura Robótica es el siguiente:

Componentes de JDERobot

Tanto introrob como gazeboserver son parte de Jderobot, un framework para la construcción de aplicaciones robótica desarrollado por el Grupo de Robótica de la URJC.

Instalación

TL;DR

La instalación usando paquetes está descartada pues no sólo están disponibles para la arquitectura i386 y me interesa correr nativamente los componentes. Además se han reportado conflictos entre los paquetes de jderobot y aquellos de la distribución.

Creando un chroot

Es conveniente usar un chroot para confinar la instalación del entorno a un directorio particular. Si más adelante se decide llevar el sistema al punto inicial, bastará con borrar este directorio.

Se usará /srv/chroot/precise-jderobot como directorio raíz:

# mkdir -p /srv/chroot/precise-jderobot
# apt-get install debootstrap schroot
# debootstrap --arch=amd64 --include=git,git-svn,python-software-properties,wget precise /srv/chroot/precise-jderobot
# cat >/etc/schroot/chroot.d/precise-jderobot.conf <<EOF
[precise-jderobot]
directory=/srv/chroot/precise-jderobot
description=Ubuntu Precise for jderobot development (amd64)
users=mmoya
root-users=mmoya
type=directory
EOF

Luego para entrar entrar al chroot se usa el siguiente comando:

$ schroot -p -c precise-jderobot

y el sistema indicará que estamos dentro anteponiendo la cadena (precise-jderobot) al prompt. Para salir bastará el comando logout:

(precise-jderobot)$ logout

Ver DebootstrapChroot para más información.

Instalando gazebo

Se ejecutan las instrucciones de instalación dentro del chroot. Previamente hay que habilitar las secciones restricted, universe y multiverse de Ubuntu.

$ schroot -p -c precise-jderobot
(precise-jderobot)$ sudo -i
(precise-jderobot)# echo 'deb http://archive.ubuntu.com/ubuntu precise restricted universe multiverse >>/etc/apt/sources.list
(precise-jderobot)# echo 'deb http://packages.ros.org/ros/ubuntu precise main' >/etc/apt/sources.list.d/ros-latest.list
(precise-jderobot)# echo 'deb http://packages.osrfoundation.org/gazebo/ubuntu precise main' >/etc/apt/sources.list.d/gazebo-latest.list
(precise-jderobot)# wget http://packages.ros.org/ros.key -O - | apt-key add -
(precise-jderobot)# wget http://packages.osrfoundation.org/gazebo.key -O - | apt-key add -
(precise-jderobot)# apt-get update
(precise-jderobot)# apt-get -V --no-install-recommends install gazebo

luego instalamos los modelos:

(precise-jderobot)# logout
(precise-jderobot)$ mkdir -p ~/.gazebo/models
(precise-jderobot)$ wget -t 0 -c http://jderobot.org/store/ahcorde/uploads/teaching/models.tar.gz
(precise-jderobot)$ tar --strip-components=1 -C ~/.gazebo/models -xz -f models.tar.gz

Es importante tener presente que el directorio de usuario (/home/mmoya) no está aislado, es decir, se comparte entre el sistema principal y el chroot.

Instalando las dependencias

Además de las dependencias listadas en el sitio hay otros paquetes que son necesarios para compilar gazeboserver e introrob. Estas son: libtbb-dev, libopencv-core-dev, libopencv-imgproc-dev, libopencv-highgui-dev, libzeroc-ice34-dev, gearbox-dev, libgsl0-dev, libhighgui-dev, ice34-translators, libopencv-gpu-dev y libopencv-contrib-dev.

Para tener aceleración de video por hardware es necesario además el paquete libgl1-mesa-dri.

Todas las dependencias se resuelven con el archivo oficial de Ubuntu excepto el caso de gearbox y opencv. Los paquetes que encontré de éstas son insuficientes ya que gearbox-dev no incluye el fichero gbxsickacfr/gbxiceutilacfr/safethread.h y los paquetes de opencv no incluyen la biblioteca libopencv_ts.so. Regeneré estos paquetes para que incluyeran el soporte necesario y los publiqué en el PPA para jderobot. Entonces:

(precise-jderobot)$ sudo add-apt-repository ppa:mmoyar/jderobot
(precise-jderobot)$ sudo apt-get update
(precise-jderobot)$ sudo apt-get install build-essential cmake libglademm-2.4-dev libgnomecanvas2-dev libgnomecanvasmm-2.6-dev libgtkglextmm-x11-1.2-dev libgtkmm-2.4-dev libgtkgl2.0-dev libgtk2.0-dev freeglut3-dev libtbb-dev libcv-dev libopencv-core-dev libopencv-imgproc-dev libopencv-highgui-dev libzeroc-ice34-dev libgearbox-dev libgsl0-dev libhighgui-dev ice34-translators libopencv-gpu-dev libopencv-contrib-dev libopencv-ts-dev libgl1-mesa-dri

Compilando gazeboserver e introrob

Alguien reportó que introrob no compila con gcc-4.6 y la solución es usar la versión 4.4 del compilador. La documentación del proyecto recomienda reescribir un enlace del sistema. Una solución menos intrusa, en mi opinión, es definir mediante variables de entorno cuál compilador usar.

(precise-jderobot)$ cd
(precise-jderobot)$ git svn clone -s http://svn.jderobot.org/jderobot/
(precise-jderobot)$ cd jderobot
(precise-jderobot)$ git checkout -b working 781e2e24
(precise-jderobot)$ cd src/components/gazeboserver/build
(precise-jderobot)$ CXX=/usr/bin/g++-4.4 CC=/usr/bin/gcc-4.4 cmake .
(precise-jderobot)$ VERBOSE=1 make -j2
(precise-jderobot)$ cd ~/jderobot/src/components/introrob/build
(precise-jderobot)$ CXX=/usr/bin/g++-4.4 CC=/usr/bin/gcc-4.4 cmake .
(precise-jderobot)$ VERBOSE=1 make -j2

Al finalizar deben existir en ~/jderobot/src/components/gazeboserver las siguientes bibliotecas: libcamera_dump.so, libencoders.so, liblaser.so, libmotors.so y libpose3dencoders.so; y en ~/jderobot/src/components/introrob el ejecutable introrob.

Ejecutando todo

gazebo

gazebo requiere que se configuren ciertas variables de entorno antes de su ejecución y provee el script /usr/share/gazebo/setup.sh para ello. La recomendación es adicionar este script al .bashrc pero prefiero hacerlo en el momento de lanzar gazebo. La llamada a setup.sh se puede automatizar mediante otro script.

Las bibliotecas que conforman gazeboserver deben poder ser localizadas por el enlazador dinámico. Esto se consigue añadiendo ~/jderobot/src/components/gazeboserver a la variable de entorno LD_LIBRARY_PATH.

Poniéndolo todo en un script:

(precise-jderobot)$ cat >rungazebo <<EOF
#!/bin/sh

source /usr/share/gazebo/setup.sh
export LD_LIBRARY_PATH="\$HOME/jderobot/src/components/gazeboserver:\$LD_LIBRARY_PATH"
exec gazebo "\$@"
EOF
(precise-jderobot)$ chmod +x rungazebo

Sólo resta descargar el archivo del mundo a la carpeta de gazeboserver y ejecutar el simulador:

(precise-jderobot)$ cd ~/jderobot/src/components/gazeboserver
(precise-jderobot)$ wget --no-check-certificate -t 0 -c https://svn.jderobot.org/users/bmenendez/tfm/trunk/src/mundos_ligeros/jaramaSigueLineas.world
(precise-jderobot)$ cp -a ~/.gazebo/models/jarama/images/jaramaCircuitoRetocado.png .
(precise-jderobot)$ ~/rungazebo jaramaSigueLineas.world >gazebo.log 2>&1 &

Debe aparecer una ventana similar a esta:

Gazebo mostrando el robot en el mundo del Jarama

en la que se pueden ver el circuito con la línea azul, el robot Pioneer (similar al Pioneer P3-DX) y el semicírculo azul del sensor láser de distancia.

introrob

El archivo de configuración introrob.cfg que se encuentra en ~/jderobot/src/components/introrob especifica los puertos que debe usar introrob para comunicarse con gazeboserver. Éstos deben cotejar con aquellos especificados en los varios .cfg de la carpeta ~/jderobot/src/components/gazeboserver.

En la versión 781e2e24 no cotejan, por lo tanto hay que editar introrob.cfg para que contenga lo siguiente:

introrob.Motors.Proxy=Motors:tcp -h localhost -p 9999
introrob.Camera1.Proxy=cam_sensor_left:tcp -h localhost -p 9995
introrob.Camera2.Proxy=cam_sensor_right:tcp -h localhost -p 9994
introrob.Encoders.Proxy=Encoders:tcp -h localhost -p 9997
introrob.Laser.Proxy=Laser:tcp -h localhost -p 9996
introrob.Pose3Dencoders2.Proxy=Pose3DEncoders2:tcp -h localhost -p 9992
introrob.Pose3Dencoders1.Proxy=Pose3DEncoders1:tcp -h localhost -p 9993
introrob.Pose3Dmotors2.Proxy=Pose3DMotors2:tcp -h localhost -p 9990
introrob.Pose3Dmotors1.Proxy=Pose3DMotors1:tcp -h localhost -p 9991

y por último ejecutar introrob:

(precise-jderobot)$ cd ~/jderobot/src/components/introrob
(precise-jderobot)$ ./introrob --Ice.Config=introrob.cfg >introrob.log 2>&1 &

Debe aparecer una ventana similar a esta:

Introrob

Mover la esfera en la vertical modifica la velocidad lineal del robot, y en la horizontal, la velocidad angular del robot.

Conclusiones

En mi opinión este procedimiento tiene las siguientes ventajas: