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:
- gazebo: Se ocupa de la simulación del mundo.
- introrob: Se ocupa del control remoto del robot simulado.
- El control remoto se lleva a cabo manualmente mediante un joystick visual o automáticamente mediante la llamada recurrente a un subprograma determinado.
- gazeboserver: Se ocupa de conectar a introrob con gazebo.
- Es un servidor ICE que corre dentro del proceso de gazebo y traduce las órdenes que envía introrob en llamadas a la API del simulador.También envía a introrob información de los sensores simulados
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
linker. 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:
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:
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:
- Poder ejecutar nativamente gazeboserver e introrob en un ordenador con arquitectura amd64.
- Confinar la instalación del entorno y así tener mejor control de los paquetes instalados.
- Reusar al máximo los paquetes disponibles en la distribución.