Está en la página 1de 46

Universidad de León

Escuela de Ingenierías Industrial, Informática


y Aeronáutica
Máster en Investigación en Cibernética

Trabajo Fin de Máster:

DESARROLLO DE PROGRAMAS DE
CONTROL PARA EL ROBOT
TURTLEBOT SOBRE ROS (Robot
Operating System)

Autor: Fernando Casado García


El presente trabajo “DESARROLLO DE PROGRAMAS DE CONTROL PARA EL ROBOT
TURTLEBOT SOBRE ROS (Robot Operating System)” ha sido realizado por D. FERNANDO
CASADO GARCÍA y presentado para la obtención del título de Master en investigación
en cibernética en la Escuela de Ingenierías Industrial, Informática y Aeronáutica de la
Universidad de León. Ha sido realizado bajo la tutoría del profesor Dr. VICENTE
MATELLÁN OLIVERA.

VºBº Tutor: Autor:

Dr. Vicente Matellán Olivera. D. Fernando Casado García.

León, Julio de 2012


ÍNDICE
CONTENIDO

1 OBJETIVOS, JUSTIFICACIÓN ....................................................................................................... 3

2 ESTADO DEL ARTE ..................................................................................................................... 3

3 HERRAMIENTAS Y METODOLOGÍA UTILIZADA............................................................................ 6

3.1 ROS ................................................................................................................................................. 6


3.1.1 Estructura de archivos y comandos ...................................................................................... 6
3.1.2 Ejecución de programas........................................................................................................ 7
3.1.3 Aplicaciones .......................................................................................................................... 7
3.2 TURTLEBOT ........................................................................................................................................ 7
3.2.1 Hardware .............................................................................................................................. 8
3.2.2 Software ............................................................................................................................... 9
3.3 METODOLOGÍA ................................................................................................................................... 9

4 TRABAJO DESARROLLADO ........................................................................................................10

4.1 PUESTA EN MARCHA DE ROS............................................................................................................... 10


4.1.1 Instalación y configuración ................................................................................................. 10
4.1.2 Creación de un espacio de trabajo y un package................................................................ 14
4.2 PUESTA EN MARCHA DEL TURTLEBOT .................................................................................................... 15
4.3 PROGRAMAS DESARROLLADOS ............................................................................................................. 17
4.3.1 Vuelta al mundo ................................................................................................................. 18
4.3.2 Golpea y escapa .................................................................................................................. 19
4.3.3 Toro loco ............................................................................................................................. 21
4.4 EJECUCIÓN DE PROGRAMAS ................................................................................................................. 28
4.4.1 Simulador Gazebo ............................................................................................................... 28
4.4.2 Turtlebot ............................................................................................................................. 29
4.5 NAVEGACIÓN AUTÓNOMA USANDO LOS PACKAGES DE ROS....................................................................... 30
4.5.1 Calibración de sensores ...................................................................................................... 31
4.5.2 Creación del mapa .............................................................................................................. 32
4.5.3 Navegación por el entorno mapeado ................................................................................. 35

5 DISCUSIÓN DEL RESULTADO .....................................................................................................39

6 CONCLUSIONES Y TRABAJOS FUTUROS .....................................................................................41

7 BIBLIOGRAFÍA ..........................................................................................................................41

ANEXO A. COMANDOS MÁS EMPLEADOS DE ROS .......................................................................43


FIGURAS

FIG. 3.1 PARTES DEL TURTLEBOT .......................................................................................................................... 8


FIG. 4.1 TABLERO DE INSTRUMENTOS (DASHBOARD) DEL TURTLEBOT ........................................................................ 16
FIG. 4.2 MODOS DE OPERACIÓN DEL TURTLEBOT (DASHBOARD) ............................................................................... 17
FIG. 4.3 ENTORNO DE VISUALIZACIÓN E INTERACCIÓN RVIZ. INTERACTIVE MARKERS ...................................................... 17
FIG. 4.4 IMAGEN PROCESADA PROGRAMA TORO LOCO............................................................................................ 28
FIG. 4.5 SIMULADOR GAZEBO CON EL MODELO DEL TURTLEBOT ............................................................................... 29
FIG. 4.6 COLOCACIÓN TURTLEBOT PARA CALIBRACIÓN............................................................................................ 31
FIG. 4.7 MAPA 2D DE OCUPACIÓN DE REJILLA DEL LABORATORIO F6 ......................................................................... 34
FIG. 4.8 ESTRUCTURA DEL PACKAGE MOVE_BASE .................................................................................................. 35
FIG. 4.9 COMPORTAMIENTO RECUPERACIÓN MOVE_BASE....................................................................................... 36
FIG. 4.10 INDICACIÓN INICIAL POSICIÓN ESTIMADA ................................................................................................ 37
FIG. 4.11 TRAYECTORIA SEGUIDA HASTA EL DESTINO .............................................................................................. 38
1 Objetivos, justificación
El objetivo del presente trabajo es conseguir que el robot Turtlebot, robot móvil con
ruedas, navegue de forma autónoma por un entorno acotado y conocido, empleando
el entorno de desarrollo para programas de control de robots ROS. Al igual que un ser
humano cuando se encuentra en una ciudad, busca referencias en el entorno que le
ayuden a localizar su situación en el plano y así planificar la ruta para alcanzar su
destino. El robot tiene que ser capaz de navegar por un entorno de trabajo utilizando
únicamente las señales de sus sensores.

También se han desarrollo una serie de programas de control para el robot


Turtlebot, los cuales siguen una progresión en dificultad, cuyo objetivo ha sido la
inmersión en este entorno de desarrollo. De los cuales destaca el que realiza el
seguimiento de objetos de tonalidad roja.

Se prevé la aparición de robots móviles para la realización de tareas domesticas en


un corto periodo de tiempo, véase como ejemplo de esta tendencia el aspirador
Roomba (1) de iRobot. Al ser dispositivos móviles deben conocer en todo momento su
situación dentro del entorno de trabajo, y detectar rápidamente los cambios en este y
adaptarse, como pueden ser la interacción con seres humanos o animales. Posibles
aplicaciones son la tele asistencia a personas mayores y labores de vigilancia.

ROS es un entorno que agiliza y facilita la tarea de diseño de programas de control


para robots, ya que proporciona una gran cantidad de paquetes que implementan
cada una de las pequeñas tareas como, captación de datos de sensores y
transformación, envió de datos a los actuadores y transformación, comunicaciones,
etc. Esto hace que el diseñador simplemente tenga que preocuparse de programar el
comportamiento del robot, en base a los sensores y actuadores con los que esta
equipado.

2 Estado del arte


La plataforma de desarrollo de software para robots ROS (2) apareció en marzo de
2010, de la mano del equipo de expertos en diseño de robots Willow Garage (3), y se
ha convertido en estos tres años en una de las más populares y empleadas, dando
3
soporte a un gran número de robots. Aunque su gran éxito radica en que se trata de
un software de código abierto con licencia BSD (Berkeley Software Distribution), en el
que participan un gran número de investigadores a través de la plataforma ROS.org.
En la actualidad se encuentra en la versión “Fuerte”, su quinta versión, hasta el
momento sólo con soporte para el desarrollo de programas para el robot PR2
(Desarrollado y comercializado por Willow Garage). Se plantea como un estándar en
programación de robots.

El problema de la localización dentro del entorno de operación es un problema


común a todos los robots móviles. Es necesario indicar que hay dos tipos de
localización, global y local:

 Localización local: la posición inicial es conocida. Es necesario hacer un


seguimiento de los movimientos del robot y modificaciones según las
observaciones del entorno próximo para mantener localizado al robot.
 Localización global: la posición inicial no es conocida. Hay que determinar la
posición inicial del robot dentro del mapa del entorno de trabajo según las
observaciones del entorno próximo. Esta localización también debe incluir la
localización local. El secuestro es una variación de la localización global, que
consiste en mover al robot a otra posición del entorno.

El método de localización de Markov (4) fue uno de los primeros métodos de


localización probabilística. Emplea un filtro de Bayes para estimar la posición del robot,
haciendo uso de los sensores de movimiento y del sensor de obstáculos. Estima la
posición del robot haciendo una distribución de probabilidad entre los puntos
permitidos del mapa. La localización EKF (5) (Extended Kalman Filter) es un caso
especial de la localización de Markov que emplea un filtro de Kalman.

Otra variación de la localización de Markov es empleando el filtro de Bayes discreto


o filtros de partículas sobre un entorno discreto, con un numero de valores finito. La
localización Monte Carlo (6) se ha convertido en uno de los métodos de localización
para robots móviles más empleado en la actualidad que emplea un filtro de partículas.

4
Sus resultados son buenos, en localización global y en localización local, y tiene un
menor coste computacional que los anteriores.

ROS incorpora las soluciones más populares y eficientes actuales para solventar la
localización. El método que se ha empleado es la localización adaptativa Monte Carlo
(7) (conocido por su acrónimo inglés, AMCL), un método probabilístico basado en un
filtro de partículas para la determinación de la posición del robot en el mapa del
entorno de trabajo. El método implementado es de localización local por lo que
requiere de una semilla de inicialización, la posición aproximada del robot en el
entorno de trabajo, para su correcto funcionamiento.

A la problemática de la localización del robot dentro del mapa del entorno de


trabajo, se añade la construcción del mapa. Este procedimiento se conoce como
localización y mapeado simultáneos (conocido por su acrónimo inglés, SLAM). Para la
construcción del mapa se ha empleado el método GMapping (8) que emplea un filtro
de partículas Rao-Blackwellized para reducir la incertidumbre de la localización real de
los puntos mapeados, empleando las lecturas del sensor de obstáculos y el
movimiento descrito por el robot para reducir esa incertidumbre. Permite la creación
de un mapa 2D de ocupación de rejilla, similar a un plano, en el que se incluyen todos
los obstáculos presentes en el entorno mapeado.

Cuando se escucha hablar de robots móviles, influenciados mayormente por el cine


de ciencia ficción, se asocia a robots bípedos de morfología similar a la humana. Pero
realmente estos humanoides resultan muy costosos, por lo que para investigación en
robots móviles se suelen emplear robots con ruedas, menos costosos y más fáciles de
diseñar. El Turtlebot es un claro ejemplo, se trata de un robot móvil con ruedas
enfocado a la investigación o el uso personal. Está construido a partir de un robot
móvil similar al aspirador Roomba de iRobot, al que se le ha acoplado una estructura
de soporte para una cámara Kinect y un ordenador portátil. Al estar compuesto a base
de elementos aislados de producción en serie tiene un precio bastante asequible.

5
3 Herramientas y metodología utilizada
Las herramientas utilizadas para la realización de este trabajo han sido, el entorno
de desarrollo ROS y el robot Turtlebot, ambos desarrollados por Willow Garage. En
cuanto a la metodología, esta se resume en el desarrollo de programas de control para
el robot Turtlebot, siguiendo una progresión en dificultad, con pruebas previas sobre
un simulador y prueba final sobre el robot.

3.1 ROS
El entorno de desarrollo empleado ha sido ROS, en su versión “Electric”, corriendo
en el sistema operativo Ubuntu, el único con soporte oficial. Este entorno de
desarrollo consiste en un middleware que corre en Ubuntu. Funciona, por así decirlo,
como un mediador entre nuestros programas y el resto de procesos necesarios en su
ejecución, encargándose de las comunicaciones haciendo uso de un tipo de mensaje
concreto para cada tipo de tarea.

El objetivo de este entorno es hacer completamente transparente la programación


del robot, dejando ocultos los controladores hardware, las comunicaciones, sistema de
archivos, etc. El programador solo necesita conocer el tipo de mensaje que envía o
recibe cada sensor o actuador del robot.

3.1.1 Estructura de archivos y comandos

Los programas que podemos utilizar y desarrollar se encuentran en directorios que


ROS llama packages, los cuales a su vez pueden estar agrupados, o no, en directorios
jerárquicamente superiores llamados stacks. Estos directorios contienen los archivos
de información de dependencias con otros packages, y de compilación de los
programas que contienen. Los comandos empleados son también packages del
entorno de desarrollo ROS. Los más empleados se recogen en el anexo A.

6
3.1.2 Ejecución de programas

Para la ejecución de programas1 sobre ROS es necesario tener en marcha un core, o


núcleo del sistema, que es el que gestiona la ejecución y comunicación de los
programas, denominados nodes. Estos nodes pueden publicar o estar suscritos a
mensajes, llamados topics, de otros nodes.

También existen nodes que proporcionan un servicio, y lo que reciben son


argumentos de un node cliente. Los nodes también pueden disponer de parámetros de
configuración que pueden ser modificados.

3.1.3 Aplicaciones
De las aplicaciones gráficas con las que cuenta ROS, las más importantes son el
simulador Gazebo y el entorno de visualización rviz.

Gazebo (9) permite la simulación de los programas de control en un entorno 3D, en


el que interactúa el modelo del robot con los elementos que situemos en el mundo.
Emplea archivos con formato XML para la carga del modelo del robot y del mundo.
Con ayuda de los tutoriales contenidos en el wiki de gazebosim.org se pueden crear
modelos del robot a medida o mundos que imiten el entorno real de aplicación.

El entorno de visualización rviz, permite la visualización de gran número de topics,


además de la interacción entre el robot y el entorno gráfico, como puede ser el caso de
indicar el destino al robot sobre el mapa del entorno de trabajo.

3.2 Turtlebot

El robot empleado ha sido el Turtlebot (10), desarrollado y comercializado por


Willow Garage. Se compone básicamente de, un robot iRobot Create2 que constituye
la base móvil, una cámara Microsoft Kinect, un Laptop ASUS 1215N y una estructura de
soporte y anclaje de los elementos a la base, véase ¡Error! No se encuentra el origen
e la referencia..

1
Los lenguajes de programación soportados por ROS son c++ y python, para los cuales dispone de
librerías. Además de la librería OpenCV para tratamiento de imágenes.
2
Robot dedicado a fines educativos y la investigación, similar al aspirador iRobot Roomba.

7
3.2.1 Hardware
A continuación se describen cada uno de los componentes del robot Turtlebot, los
cuales parecen indicados en la Fig. 3.1.

FIG . 3.1 PARTES DEL TURTLEBOT

A. iRobot Create y placa de alimentación


El iRobot Create esta provisto de una serie de sensores integrados, odómetro,
detectores de caída, detectores de paredes y detectores de golpes. Para la
alimentación de la cámara Kinect se proporciona una placa de alimentación que
se conecta al puerto DB25 del iRobot Create, que además incorpora un
giroscopio de un eje. El conjunto, excepto el computador, se alimenta de una
batería de níquel-hidruro metálico (Ni-MH) de 3000 mAh. Para la comunicación
del iRobot Create con el computador se proporciona un adaptador serie - USB.
B. Microsoft Kinect
La cámara Kinect es el principal sensor del Turtlebot. Dispone de visión simple y
estereoscópica, así como un escáner 3D de infrarrojos. Se proporciona un cable
para su alimentación a través de la placa de alimentación y conexión al
computador.
C. ASUS 1215N Laptop
Es el cerebro del robot, se encarga de las comunicaciones, el procesamiento de
los señales de los sensores y ejecución de los programas. Cuenta con las

8
siguientes características técnicas, las cuales lo hacen un equipo óptimo para
esta aplicación, lo suficientemente pequeño y de rendimiento adecuado:
 Procesador Intel® Atom™ D525 Dual Core
 2 GB de memoria RAM
 Procesador gráfico NVIDIA® ION™
 Disco duro de 250 GB
D. Estructura de soporte de elementos
Para la sujeción del resto de elementos al iRobot Create se dispone de una
estructura de barras y plataformas circulares, similar a una estantería,
atornillada a este. La plataforma superior dispone de un patrón de
perforaciones espaciadas una pulgada para el montaje de accesorios, como un
brazo de manipulación.

3.2.2 Software
El software del que dispone el computador es el estrictamente necesario para hacer
funcionar el entorno de desarrollo ROS. La versión del sistema operativo Ubuntu es la
10.04 e incluye ROS con las herramientas y aplicaciones específicas para el Turtlebot.
La versión incluida de ROS es la “Diamondback”, pero ha sido actualizada a la versión
“Electric”.

3.3 Metodología
Se ha comenzado con una aclimatación al entorno de desarrollo ROS, usando como
apoyo los numerosos tutoriales disponibles en ROS.org. Los tutoriales siguen una
progresión adaptativa, desde un nivel cero hasta las estructuras básicas de programas.
La documentación disponible es de lo más completa y exhaustiva.

Obtenida una mínima soltura en el entorno, se ha procedido con la realización de


programas de control siguiendo una progresión en dificultad y complejidad.
Comenzando por un pequeño programa de bautismo, hacer girar en círculo al
Turtlebot, y acabando con una navegación autónoma.

Gran parte del tiempo empleado en la prueba y modificación de los programas ha


sido sobre el simulador Gazebo, lo que hace el proceso más ágil y dinámico, además se

9
elimina la dependencia energética de las baterías del computador y el iRobot Create.
Lo más recomendable es hacer las primeras pruebas sobre el simulador para evitar
posibles desperfectos al robot.

Testado el programa en el simulador se ha procedido a su ejecución en el robot


Turtlebot. El entorno de pruebas ha sido el laboratorio F6 de la Escuela de Ingenierías
Industrial e Informática de la Universidad de león, emplazamiento habitual del grupo
de robótica de esta universidad.

4 Trabajo desarrollado
Para la correcta documentación del trabajo de laboratorio, se ha realizando de
forma simultánea un artículo (11) en el wiki del grupo de robótica de la Universidad de
León, del cual se han extraído los siguientes puntos.

4.1 Puesta en marcha de ROS


El computador del robot Turtlebot, en adelante PC robot, viene con el software
necesario preinstalado, por lo que se ha centrado esta tarea en el PC estación de
trabajo, es decir, el equipo que se empleará para la simulación de los programas y el
control de ejecución de programas en el PC robot. Aunque el procedimiento sería
análogo para la instalación de ROS en otro ordenador para su uso como PC robot, con
un pequeño añadido que se indica al final de este punto.

4.1.1 Instalación y configuración


Lo primero que se necesita es un computador con el sistema operativo Ubuntu, que
es el único con soporte oficial de ROS, otros sistemas operativos para los que está
disponible sólo son experimentales.

Para instalar el entorno de desarrollo ROS para el robot Turtlebot en el PC estación


de trabajo, se necesita añadir los repositorios de ROS. Se introducirá en un terminal del
PC estación de trabajo el comando que corresponda a la versión instalada de Ubuntu:

 Ubuntu 10.04 (Lucid)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu lucid main" >


/etc/apt/sources.list.d/ros-latest.list'

10
Ubuntu 10.10 (Maverick)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu maverick main" >


/etc/apt/sources.list.d/ros-latest.list'

 Ubuntu 11.04 (Natty)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu natty main" >


/etc/apt/sources.list.d/ros-latest.list'

 Ubuntu 11.10 (Oneiric)

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu oneiric main" >


/etc/apt/sources.list.d/ros-latest.list'

Se necesita añadir las llaves del repositorio para verificar que el software
descargado esta autorizado, ejecutando el siguiente comando en un terminal:

wget http://packages.ros.org/ros.key -O - | sudo apt-key add -

Para completar la instalación de ROS solo queda ejecutar la siguiente secuencia de


comandos en un terminal:

sudo apt-get update


sudo apt-get install ros-electric-turtlebot-desktop

Para poder ejecutar los comandos del entorno ROS en el terminal, se necesita
añadir una línea al archivo de configuración del terminal (~/.bashrc), en la que se
cargue el archivo de variables de entorno de ROS. Para esto se debe ejecutar en un
terminal el siguiente comando:

echo "source /opt/ros/electric/setup.bash" >> ~/.bashrc

Ahora ya se pueden ejecutar los comandos del entorno ROS en el terminal, los más
empleados se recogen en el anexo A.

Es importante que el reloj del PC estación de trabajo se encuentre sincronizado con


el reloj del PC robot, para prevenir las posibles perdidas de red inalámbrica. Para
instalar el cliente NTP Chrony se ejecutará el siguiente comando en un terminal:

sudo apt-get install chrony

11
Lo habitual es conectar ambos equipos a una red Wi-Fi, pero puede darse que el PC
estación de trabajo no disponga de un interfaz de red inalámbrica. En este caso es
necesario poder conectarse a un puerto del router que provee la red Wi-Fi, para que
exista una ruta de acceso entre el PC estación de trabajo y el PC robot.

En ambos equipos, PC estación de trabajo y PC robot, se añadirá el


ROS_MASTER_URI en el archivo de configuración del terminal (~/.bashrc), que apunta
a la dirección IP del PC robot, que es el que ejecuta el servicio maestro. Simplemente
se debe escribir el siguiente comando en un terminal, sustituyendo
"IP_OF_TURTLEBOT", por la dirección IP asignada en la red al PC robot:

echo “export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311” >> ~/.bashrc

También se debe asignar un nombre de equipo, tanto al PC estación de trabajo


como al PC robot. Este nombre será la dirección IP de cada equipo, que se almacenará
en el archivo de configuración del terminal (~/.bashrc). En un terminal del PC robot se
ejecutará el siguiente comando, sustituyendo "IP_OF_TURTLEBOT", por la dirección IP
asignada en la red al PC robot:

echo “export ROS_HOSTNAME=IP_OF_TURTLEBOT” >> ~/.bashrc

En un terminal del PC estación de trabajo se ejecutará el siguiente comando,


sustituyendo "IP_OF_WORKSTATION", por la dirección IP asignada en la red al PC
estación de trabajo:

echo “export ROS_HOSTNAME=IP_OF_WORKSTATION” >> ~/.bashrc

Nota: Para conocer la dirección IP, asignada en la red a un equipo, simplemente se


debe ejecutar en un terminal:

ifconfig

Que mostrará una información similar a esta:

eth0 Link encap:Ethernet direcciónHW 00:16:d4:55:85:b4


ACTIVO DIFUSIÓN MULTICAST MTU:1500 Métrica:1
Paquetes RX:0 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:0 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupción:44

12
lo Link encap:Bucle local
Direc. inet:127.0.0.1 Másc:255.0.0.0
Dirección inet6: ::1/128 Alcance:Anfitrión
ACTIVO BUCLE FUNCIONANDO MTU:16436 Métrica:1
Paquetes RX:64 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:64 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:0
Bytes RX:5184 (5.1 KB) TX bytes:5184 (5.1 KB)

wlan0 Link encap:Ethernet direcciónHW 00:18:de:21:4b:ad


Direc. inet:192.168.1.10 Difus.:192.168.1.255 Másc:255.255.255.0
Dirección inet6: fe80::218:deff:fe21:4bad/64 Alcance:Enlace
ACTIVO DIFUSIÓN FUNCIONANDO MULTICAST MTU:1500 Métrica:1
Paquetes RX:130972 errores:0 perdidos:0 overruns:0 frame:0
Paquetes TX:87840 errores:0 perdidos:0 overruns:0 carrier:0
colisiones:0 long.colaTX:1000
Bytes RX:169415208 (169.4 MB) TX bytes:9379691 (9.3 MB)

Nota: Cuando se instale ROS en un equipo destinado a ser el PC robot, a parte de todo
lo anterior, necesitaremos crear un archivo llamado “52-turtlebot.rules” en el
directorio /etc/udev/rules.d/. Con el siguiente contenido:

52-turtlebot.rules

ATTRS{idProduct}=="XXXX",ATTRS{idVendor}=="XXXX",MODE="666",GROUP="turtlebot"

Donde las “XXXX” corresponden a la identificación del producto y del fabricante,


respectivamente, del adaptador USB de conexión con el iRobot Create. Esta
información la obtiene ejecutando el siguiente comando en un terminal, con el
adaptador conectado:

lsusb

Que mostrará una información similar a esta:

Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 045e:0040 Microsoft Corp. Wheel Mouse Optical
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 003: ID 0403:6001 Future Technology Devices International, Ltd
FT232 USB-Serial (UART) IC <--ADAPTADOR USB-->

Donde “6001” corresponde a la identificación del producto y “0403” a la identificación


del fabricante.

También se debe añadir el usuario, con el que hemos instalado ROS, al grupo “dialout”,
para que tenga permisos sobre el puerto que se emplea para la comunicación con el
iRobot Create, ttyUSB0.

13
4.1.2 Creación de un espacio de trabajo y un package
Lo más cómodo para trabajar es crear un directorio propio para stacks y packages
en el PC estación de trabajo, ya que ROS tiene por defecto como directorio para stacks
y packages /opt/ros/electric/stacks. Se pueden crear los nuevos stacks o packages en
este directorio por defecto, haciendo uso de los privilegios de súper usuario, pero
queda más organizado y accesible creando uno particular.

El directorio se puede situar donde y con el nombre que se quiera. Se comenzará


creando un directorio, por ejemplo en la carpeta personal:

mkdir ~/ros_workspace

Para que el sistema también busque stacks y packages en nuestra carpeta, se debe
crear en la carpeta personal un archivo llamado "setup.sh", con el siguiente contenido:

setup.h

#!/bin/sh
source /opt/ros/electric/setup.bash
export ROS_ROOT=/opt/ros/electric/ros
export PATH=$ROS_ROOT/bin:$PATH
export PYTHONPATH=$ROS_ROOT/core/roslib/src:$PYTHONPATH
export ROS_PACKAGE_PATH=~/ros_workspace:/opt/ros/electric/stacks:$ROS_PACKAGE_PATH

Se debe añadir este nuevo archivo creado al archivo de configuración del terminal
(~/.bashrc), para hacer efectiva esta modificación. Para ello se debe ejecutar el
siguiente comando en un terminal:

echo “source ~/setup.sh” >> ~/.bashrc

En el directorio de trabajo creado se creará un package, el cual va a depender de


otros packages de ROS. Las dependencias van en función del tipo de mensajes que
queremos enviar o recibir, y el lenguaje empleado en los programas. Estas
dependencias son las que marcan lo programas que se han desarrollado, por lo que las
añadiremos al crear el package que va a contener los programas. Para esto se
introducirá la siguiente secuencia de comandos en un terminal:

cd ~/ros_workspace
roscreate-pkg NOMBRE_PACKAGE std_msgs turtlebot_node geometry_msgs nav_msgs
sensor_msgs image_transport roscpp

14
También se pueden añadir dependencias a un package ya creado, simplemente se
debe editar el archivo "manifest.xml" que se encuentra dentro de la carpeta del
package creado. El contenido del archivo "manifest.xml" es similar al siguiente, las
dependencias se encuentran al final:

manifest.xml

<package>
<description brief="NOMBRE_PACKAGE">

NOMBRE_PACKAGE

</description>
<author>FeR</author>
<license>BSD</license>
<review status="unreviewed" notes=""/>
<url>http://ros.org/wiki/ NOMBRE_DEL_PACKAGE </url>
<depend package="turtlebot_node"/>
<depend package="geometry_msgs"/>
<depend package="nav_msgs"/>
<depend package="std_msgs"/>
<depend package="sensor_msgs"/>
<depend package="image_transport"/>
<depend package="roscpp"/>

</package>

Una vez creado el package, o modificadas las dependencias de un package


existente, se debe compilar para que se hagan efectivas las dependencias.
Simplemente se debe ejecutar el siguiente comando en el terminal, indicando el
nombre del package:

rosmake NOMBRE_PACKAGE

4.2 Puesta en marcha del Turtlebot


Con la red configurada, ya se puede proceder a la puesta en marcha del Turtlebot.
Se conectarán los cables USB de comunicación del robot al PC robot, se encenderá el
iRobot Create y se arrancará el PC robot.

Las operaciones sobre el PC robot se pueden hacer directamente sobre él, pero no
es la opción recomendable por comodidad de trabajo. Así que se comenzará
conectando por ssh, desde el PC estación de trabajo con el PC robot. Se ejecutará el
siguiente comando en un terminal del PC estación de trabajo, sustituyendo
"IP_OF_TURTLEBOT" por la dirección IP asignada en la red al PC robot:

ssh turtlebot@IP_OF_TURTLEBOT

15
Pedirá la contraseña asignada al PC robot. Cuando se conecte el prompt del terminal
cambiará por el del PC robot. Se puede comprobar el estado del servicio del robot,
tecleando el siguiente comando en el terminal:

sudo service turtlebot status

Devolverá un mensaje diciendo que está iniciado. El servicio se inicia siempre que
encendemos el PC robot, pero se puede detener y poner en marcha desde el terminal
con los siguientes comandos:

sudo service turtlebot stop


sudo service turtlebot start

En un terminal nuevo del PC estación de trabajo se ejecutará la aplicación del


tablero de instrumentos (dashboard) del robot. Simplemente se debe introducir este
comando en el terminal:

rosrun turtlebot_dashboard turtlebot_dashboard&

Aparecerá una pequeña ventana similar a la que aparece en la Fig. 4.1.

FIG. 4.1 TABLERO DE INSTRUMENTOS (DASHBOARD ) DEL TURTLEBOT

La ventana del tablero de instrumentos consta de tres zonas bien diferenciadas:

 Diagnóstico del sistema, mensajes del sistema y modo de operación.


 Interruptores de los circuitos de las tres salidas digitales del iRobot Create.
 Niveles de batería del iRobot Create y del PC robot.

Si todo va bien, como en la Fig. 4.2, estarán en verde los iconos de diagnostico del
sistema (llave inglesa) y mensajes del sistema (nube de llamada). El modo de operación
se debe poner en Full Mode, para poder operar el robot. En los otros modos no está
permitida la operación del robot, son el modo de recarga de la bateria (Passive Mode)
y de espera (Safety Mode).

16
FIG. 4.2 MODOS DE OPERACIÓN DEL TURTLEBOT (DASHBOARD )

También se debe activar al menos el interruptor "1", que es el que controla el


circuito de alimentación de la cámara Kinect. Ahora ya esta todo listo para comenzar a
operar con el robot. Para verlo en funcionamiento es recomendable probar alguna de
las aplicaciones de demostración, la cuales encontramos detalladas en ROS.org. En la
Fig. 4.3 se puede ver la ejecución del tele operador del Turtlebot que emplea
interactive markers.

FIG. 4.3 ENTORNO DE VISUALIZACIÓN E INTERACCIÓN RVIZ. INTERACTIVE MARKERS

4.3 Programas desarrollados


Se han desarrollado una serie de programas en lenguaje c++, progresivamente más
complejos, los cuales dejan en relieve el gran potencial de la plataforma ROS, así como

17
su sencillez. Los archivos de los programas creados se guardarán en la carpeta "src" del
package creado.

4.3.1 Vuelta al mundo


Como guiño al primer programa de iniciación a un lenguaje de programación “hola
mundo”, se ha creado “vuelta al mundo”. Este primer programa, simplemente crea el
nodo "gira" y publica el topic "cmd_vel", que hace mover el robot con una velocidad de
avance y de giro (describiendo un círculo), hasta que se reciba la señal de parada
"Ctrl+C". El programa es el siguiente:

gira.cpp

#include "ros/ros.h" //Librería de funciones del sistema ROS


#include "geometry_msgs/Twist.h" //Librería "Twist" del package "geometry_msgs"

int main(int argc, char **argv)


{

ros::init(argc, argv, "gira"); //Creación del nodo "gira"

ros::NodeHandle n;

ros::Publisher vel_pub_=n.advertise<geometry_msgs::Twist>("cmd_vel", 1); //Publicación del


topic "turtlebot_node/cmd_vel"

geometry_msgs::Twist vel;

ros::Rate loop_rate(10); //Frecuencia de realización del bucle (10 Hz)

while (ros::ok()) //Bucle mientras no se reciba "Ctrl+C"


{
vel.linear.x = 0.2; //velocidad de avance
vel.angular.z = 0.4; //velocidad de giro

vel_pub_.publish(vel);

loop_rate.sleep();
}

return 0;
}

Se guardará con el nombre "gira.cpp". Para compilarlo y generar el ejecutable se


debe añadir la siguiente línea de código al archivo "CMakeLists.txt" del package
creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del archivo a
compilar:

rosbuild_add_executable(gira src/gira.cpp)

18
Para compilar el programa hay que situarse en el directorio del package.
Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se
compilará y creará el ejecutable, siempre que no existan errores:

roscd NOMBRE_PACKAGE
make

4.3.2 Golpea y escapa


Este segundo programa añade la suscripción a un topic, además de la publicación. El
funcionamiento es bastante simple, comenzará a avanzar en línea recta hasta que se
detecte el accionamiento del parachoques del iRobot Create, provocado por el choque
con un objeto; en este momento realizará un pequeño retroceso y girará un ángulo, de
sentido y magnitud aleatorios, para intentar evitar el obstáculo. No se detendrá hasta
recibir la señal de parada "Ctrl+C". El código del programa, escrito en lenguaje c++, es
el siguiente:

juguete_golpe.cpp

#include "ros/ros.h" //Librería de funciones del sistema ROS


#include "geometry_msgs/Twist.h" //Librería "Twist" del package "geometry_msgs"
#include "turtlebot_node/TurtlebotSensorState.h" //Librería "TurtlebotSensorState" del package
"turtlebot_node"

geometry_msgs::Twist vel; //Declaración de la variable global vel


double alea; //Declaración de la variable global alea

void callback(const turtlebot_node::TurtlebotSensorState& sen) //Función de llamada con cada


dato recibido
{
ros::NodeHandle n;

ros::Publisher vel_pub_=n.advertise<geometry_msgs::Twist>("cmd_vel", 1); //Publicación del


topic "turtlebot_node/cmd_vel"

ros::Rate loop_rate(10); //Frecuencia de realización del bucle (10 Hz)

ros::Time ahora; //Declaración de variable tipo tiempo, variable ROS

if (sen.bumps_wheeldrops == 0) //Comprobación si ha habido señal del parachoques


{
::vel.linear.x = 0.2;
::vel.angular.z = 0.0;

vel_pub_.publish(::vel);
}
else
{
ahora = ros::Time::now(); //Asignación del tiempo actual a la variable ahora

while (ros::Time::now() < (ahora + ros::Duration(0.5))) //Bucle durante 0,5 segundos,


retroceso después de choque
{
::vel.linear.x = -0.2;
::vel.angular.z = 0.0;

vel_pub_.publish(::vel);

loop_rate.sleep();

19
}

::alea = ((rand() %40) -20)/10; //Asignación de valor aleatorio

while (::alea == 0) //Bucle mientras la variable aleatoria sea cero


{
::alea = ((rand() %40) -20)/10;
}

ahora = ros::Time::now(); //Asignación del tiempo actual a la variable ahora

while (ros::Time::now() < (ahora + ros::Duration(1.5))) //Bucle durante 1,5 segundos,


giro de ángulo aleatorio
{
::vel.linear.x = 0.0;
::vel.angular.z = ::alea;

vel_pub_.publish(::vel);

loop_rate.sleep();
}
}
}

int main(int argc, char **argv)


{

ros::init(argc, argv, "juguete_golpe"); //Creación del nodo "juguete_golpe"

ros::NodeHandle n;

ros::Publisher vel_pub_=n.advertise<geometry_msgs::Twist>("cmd_vel", 1); //Publicación del


topic "turtlebot_node/cmd_vel"

ros::Subscriber odom_sub_= n.subscribe("turtlebot_node/sensor_state", 1, callback);


//Suscripción del topic "turtlebot_node/sensor_state"

ros::spin(); //Mantiene la suscripción al topic hasta que se reciba "Ctrl+C"

return 0;
}

Se guardará con el nombre "juguete_golpe.cpp". Para compilarlo y generar el


ejecutable se debe añadir la siguiente línea de código al archivo "CMakeLists.txt" del
package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del
archivo a compilar:

rosbuild_add_executable(juguete_golpe src/juguete_golpe.cpp)

Para compilar el programa hay que situarse en el directorio del package.


Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se
compilará y creará el ejecutable, siempre que no existan errores:

roscd NOMBRE_PACKAGE
make

Nota: El modelo 3D del Turtlebot empleado en el simulador no implementa este


sensor, por lo que no será posible probar el programa en el simulador.

20
4.3.3 Toro loco
La peculiaridad de este programa es que el topic de suscripción es la imagen
obtenida por la cámara Kinect. La imagen se recibe empaquetada en un array de
"píxeles ancho x píxeles alto x 3 (componentes color RGB)" elementos, por defecto
(640 x 480 x 3) = 921600 elementos. Los píxeles se encuentran representados en sus
componentes RGB, con ese orden, comenzando en el píxel de la esquina superior
izquierda, continuando por filas hasta llegar al último píxel, esquina inferior derecha de
la imagen.

Píxel 1 Píxel 2 Píxel 307200


120 88 15 127 89 11 … 240 150 66
[0] [1] [2] [3] [4] [5] [921597] [921598] [921599]

Este tercer programa realiza el seguimiento de objetos de color rojo. Para ello
analiza cada imagen píxel a píxel, contando los píxeles del lado izquierdo y del lado
derecho. Cuando el número total de píxeles de tonalidades rojas es superior al 0,1 %,
de los píxeles totales de la imagen, e inferior al 5 %, comienza el seguimiento hasta
hacer el número de píxeles totales cercano al 2,5 % e igual a cada lado (estos valores
dependerán del tamaño del objeto). Cuando el objeto se encuentre demasiado lejos o
demasiado cerca se detendrá el seguimiento. Para facilitar la calibración cada vez que
se quiera modificar alguno de los parámetros del programa se creará un archivo .h, en
el que estarán definidas las constantes para cada parámetro, se guardará con el
nombre "param_sigue_rojo.h" y con el siguiente contenido:

param_sigue_rojo.h

#ifndef __PARAM_SIGUE_ROJO_H
#define __PARAM_SIGUE_ROJO_H

#define li_red 100 //Límite inferior para canal rojo


#define ls_red 255 //Límite superior para canal rojo
#define li_green 0 //Límite inferior para canal verde
#define ls_green 30 //Límite superior para canal verde
#define li_blue 0 //Límite inferior para canal azul
#define ls_blue 50 //Límite superior para canal azul

#define tam_min 0.001 //Porcentaje de píxeles de tonalidades rojas mínimo


#define tam_max 0.05 //Porcentaje de píxeles de tonalidades rojas máximo
#define tam_med 0.025 //Porcentaje de píxeles de tonalidades rojas medio

#define Px 0.08 //Ganancia velocidad de avance-retroceso


#define Pz 1.2 //Ganancia velocidad de giro

#endif /*__PARAM_SIGUE_ROJO_H*/

21
El código del programa, escrito en lenguaje c++, es el siguiente:

sigue_rojo.cpp

#include "ros/ros.h" //Librería de funciones del sistema ROS


#include "sensor_msgs/Image.h" //Librería "Image" del package "sensor_msgs"
#include "geometry_msgs/Twist.h" //Librería "Twist" del package "geometry_msgs"
#include "param_sigue_rojo.h" //Parámetros de ajuste

geometry_msgs::Twist vel; //Declaración de la variable global vel


sensor_msgs::Image region; //Declaración de la variable global vel

void callback(const sensor_msgs::Image& ima)


{
ros::NodeHandle n;

ros::Publisher vel_pub_=n.advertise<geometry_msgs::Twist>("cmd_vel", 1); //Publicación


del topic "/cmd_vel"

uint pix_r; //Declaración de variables de almacenaje valores rgb de cada píxel


uint pix_g;
uint pix_b;
uint ancho = ima.step; //Número de elementos de cada fila de la imagen
uint tam = ima.data.size(); //Número de elementos del array

double cont_izq = 0; //Declaración e inicialización de contadores de píxeles


double cont_der = 0;

::region = ima;
uint up;
uint right;
uint down;
uint left;

for (uint i = 0; i < tam; i = i + ancho) //Filtro de regiones pequeñas o píxeles


aislados
{
for (uint j = 0; j < ancho; j = j + 3)
{
pix_r = ima.data[i + j];
pix_g = ima.data[i + j + 1];
pix_b = ima.data[i + j + 2];

if (pix_r >= li_red && pix_r <= ls_red && pix_g >= li_green && pix_g <=
ls_green && pix_b >= li_blue && pix_b <= ls_blue)
{
up = 12;
if ((i/ancho) < 12)
{
up = (i/ancho);
}
right = 12;
if (((ancho - j)/3) < 12)
{
right = ((ancho - j)/3);
}
down = 12;
if (((tam/ancho) - (i/ancho)) < 12)
{
down = ((tam/ancho) - (i/ancho));
}
left = 12;
if ((j/3) < 12)
{
left = (j/3);
}

uint contr = 0;

for (uint k = i + j - (ancho*up) - (3*left); k <= (i + j +


(ancho*down) - (3*left)); k = k + ancho)
{
for(uint l = 0; l < ((3*left) + (3*right) +3); l = l + 3)
{
pix_r = ima.data[k + l];

22
pix_g = ima.data[k + l + 1];
pix_b = ima.data[k + l + 2];

if (pix_r >= li_red && pix_r <= ls_red && pix_g >= li_green
&& pix_g <= ls_green && pix_b >= li_blue && pix_b <= ls_blue)
{
contr++;
}
}
}
if (contr > (625*0.5))
{
::region.data[i + j] = 1;
::region.data[i + j + 1] = 1;
::region.data[i + j + 2] = 1;
}
}
}
}

for (uint i = 0; i < (tam - (ancho/2)); i = i + ancho) //Contar píxeles tonos rojos
lado izquierdo imagen
{
for (uint j = 0; j < (ancho/2); j = j + 3)
{
pix_r = ::region.data[i + j];
pix_g = ::region.data[i + j + 1];
pix_b = ::region.data[i + j + 2];

if (pix_r == 1 && pix_g == 1 && pix_b == 1)


{
cont_izq++;
}
}
}

for (uint i = (ancho/2); i < tam; i = i + ancho) //Contar píxeles tonos rojos lado
derecho imagen
{
for (uint j = 0; j < (ancho/2); j = j + 3)
{
pix_r = ::region.data[i + j];
pix_g = ::region.data[i + j + 1];
pix_b = ::region.data[i + j + 2];

if (pix_r == 1 && pix_g == 1 && pix_b == 1)


{
cont_der++;
}
}
}

double cont = cont_izq + cont_der;

if (cont > ((tam/3) * tam_min) && cont < ((tam/3) * tam_max)) //Comprobación si se está
dentro del limite inferior y superior de píxeles
{
::vel.angular.z = (cont_izq - cont_der) / (::abs(cont_izq - cont_der) * Pz);
//Velocidad de giro
::vel.linear.x = (((tam/3) * tam_med) - cont) / ((tam/3) * Px); //Velocidad de
avance-retroceso
vel_pub_.publish(vel);
}
}

int main(int argc, char **argv)


{

ros::init(argc, argv, "sigue_rojo"); //Creación del nodo "sigue_rojo"

ros::NodeHandle n;

ros::Publisher vel_pub_=n.advertise<geometry_msgs::Twist>("cmd_vel", 1); //Publicación


del topic "cmd_vel"

ros::Subscriber image_sub_= n.subscribe("camera/rgb/image_color", 1, callback);

23
//Suscripción del topic "camera/rgb/image_color"

ros::spin(); //Mantiene la suscripción al topic hasta que se reciba "Ctrl+C"

return 0;
}

Ya que la tonalidad percibida por la cámara depende de la iluminación del recinto,


es necesaria una calibración de los límites de los canales RGB, para un correcto
funcionamiento.

Se guardará con el nombre "sigue_rojo.cpp". Para compilarlo y generar el


ejecutable se debe añadir la siguiente línea de código al archivo "CMakeLists.txt" del
package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del
archivo a compilar:

rosbuild_add_executable(sigue_rojo src/sigue_rojo.cpp)

Para compilar el programa hay que situarse en el directorio del package.


Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se
compilará y creará el ejecutable, siempre que no existan errores:

roscd NOMBRE_PACKAGE
make

Además para la supervisión de las imágenes procesadas por el programa se ha


realizado otro programa que publica el topic "/camara/rojo" con la imagen modificada,
en la que los píxeles de tonalidad roja se colorean en rojo y el resto se muestra en
escala de grises, con una línea divisoria de color negro en el centro. El código del
programa, escrito en lenguaje c++, es el siguiente:

visulizacion.cpp

#include "ros/ros.h" //Librería de funciones del sistema ROS


#include "sensor_msgs/Image.h" //Librería "Image" del package "sensor_msgs"
#include "param_sigue_rojo.h" //Parámetros de ajuste

sensor_msgs::Image region; //Declaración de la variable global region

void callback(const sensor_msgs::Image& ima)


{
ros::NodeHandle n;

ros::Publisher rojo_pub_=n.advertise<sensor_msgs::Image>("camara/rojo", 1);


//Publicación del topic "camara/rojo"

uint pix_r; //Declaración de variables de almacenaje valores rgb de cada píxel


uint pix_g;
uint pix_b;
uint ancho = ima.step; //Número de elementos de cada fila de la imagen
uint tam = ima.data.size(); //Número de elementos del array

24
::region = ima;
uint up;
uint right;
uint down;
uint left;

for (uint i = 0; i < tam; i = i + ancho) //Filtro de regiones pequeñas o píxeles


aislados
{
for (uint j = 0; j < ancho; j = j + 3)
{
pix_r = ima.data[i + j];
pix_g = ima.data[i + j + 1];
pix_b = ima.data[i + j + 2];

if (pix_r >= li_red && pix_r <= ls_red && pix_g >= li_green && pix_g <=
ls_green && pix_b >= li_blue && pix_b <= ls_blue)
{
up = 12;
if ((i/ancho) < 12)
{
up = (i/ancho);
}
right = 12;
if (((ancho - j)/3) < 12)
{
right = ((ancho - j)/3);
}
down = 12;
if (((tam/ancho) - (i/ancho)) < 12)
{
down = ((tam/ancho) - (i/ancho));
}
left = 12;
if ((j/3) < 12)
{
left = (j/3);
}

uint contr = 0;

for (uint k = i + j - (ancho*up) - (3*left); k <= (i + j +


(ancho*down) - (3*left)); k = k + ancho)
{
for(uint l = 0; l < ((3*left) + (3*right) +3); l = l + 3)
{
pix_r = ima.data[k + l];
pix_g = ima.data[k + l + 1];
pix_b = ima.data[k + l + 2];

if (pix_r >= li_red && pix_r <= ls_red && pix_g >= li_green
&& pix_g <= ls_green && pix_b >= li_blue && pix_b <= ls_blue)
{
contr++;
}
}
}
if (contr > (625*0.5))
{
::region.data[i + j] = 255;
::region.data[i + j + 1] = 0;
::region.data[i + j + 2] = 0;

}
else //Conversión a escala de grises regiones pequeñas o píxeles
aislados
{
if (pix_r > pix_g)
{
::region.data[i + j] = pix_r;
::region.data[i + j + 1] = pix_r;
::region.data[i + j + 2] = pix_r;
}
else if (pix_g > pix_b)
{
::region.data[i + j] = pix_g;

25
::region.data[i + j + 1] = pix_g;
::region.data[i + j + 2] = pix_g;
}
else
{
::region.data[i + j] = pix_b;
::region.data[i + j + 1] = pix_b;
::region.data[i + j + 2] = pix_b;
}
}
}
else //Conversión a escala de grises resto píxeles
{
if (pix_r > pix_g)
{
::region.data[i + j] = pix_r;
::region.data[i + j + 1] = pix_r;
::region.data[i + j + 2] = pix_r;
}
else if (pix_g > pix_b)
{
::region.data[i + j] = pix_g;
::region.data[i + j + 1] = pix_g;
::region.data[i + j + 2] = pix_g;
}
else
{
::region.data[i + j] = pix_b;
::region.data[i + j + 1] = pix_b;
::region.data[i + j + 2] = pix_b;
}
}
}
}

for (uint i = (ancho/2)-3; i < tam; i = i + ancho) //Línea negra divisoria central
{
for (uint j = 0; j < 6; j = j + 3)
{
::region.data[i + j] = 0;
::region.data[i + j + 1] = 0;
::region.data[i + j + 2] = 0;
}
}

rojo_pub_.publish(::region);
}

int main(int argc, char **argv)


{

ros::init(argc, argv, "visualizacion"); //Creación del nodo "visualizacion"

ros::NodeHandle n;

ros::Publisher rojo_pub_=n.advertise<sensor_msgs::Image>("camara/rojo", 1);


//Publicación del topic "camara/rojo"

ros::Subscriber image_sub_= n.subscribe("camera/rgb/image_color", 1, callback);


//Suscripción del topic "camera/rgb/image_color"

ros::spin(); //Mantiene la suscripción al topic hasta que se reciba "Ctrl+C"

return 0;
}

Se guardará con el nombre "visualizacion.cpp". Para compilarlo y generar el


ejecutable se debe añadir la siguiente línea de código al archivo "CMakeLists.txt" del
package creado, donde indicamos el nombre para el ejecutable y la ruta y nombre del
archivo a compilar:

26
rosbuild_add_executable(sigue_rojo src/sigue_rojo.cpp)

Para compilar el programa hay que situarse en el directorio del package.


Simplemente con ejecutar la siguiente secuencia de comandos en un terminal se
compilará y creará el ejecutable:

roscd NOMBRE_PACKAGE
make

Para poder ejecutar "kinect.launch", "sigue_rojo" y "visualización" de forma


simultánea se creará un launcher. Para ello crearemos dentro de la carpeta de nuestro
package una carpeta llamada "launch", dentro de la cual crearemos un archivo
llamado "rojo.launch" con el siguiente contenido:

rojo.launch

<launch>
<include file="$(find turtlebot_bringup)/kinect.launch" />
<node name="sigue_rojo" pkg="NOMBRE_PACKAGE" type="sigue_rojo" />
<node name="visualizacion" pkg=" NOMBRE_PACKAGE " type="visualizacion" />
</launch>

Para ejecutar el launcher que lanza los dos nodos, "sigue_rojo" y "visualización",
simplemente habrá que ejecutar el siguiente comando en un terminal del PC robot:

roslaunch NOMBRE_PACKAGE rojo.launch

Para poder visualizar la imagen modificada de la cámara Kinect en el PC estación de


trabajo, para la supervisión. Simplemente hay que ejecutar el siguiente comando en un
terminal:

rosrun image_view image_view image:=/camara/rojo

Las imágenes, ver Fig. 4.4, tendrán una tasa de frames baja y un retardo, teniendo
en cuenta que simplemente son para supervisión pueden valer.

27
FIG. 4.4 IMAGEN PROCESADA PROGRAMA TORO LOCO

4.4 Ejecución de programas


Lo recomendables es ejecutar los programas primero en el simulador para
salvaguardar la integridad del robot, además de ganar mucho tiempo en la depuración
del programa.

4.4.1 Simulador Gazebo


Lo primero que se debe hacer para poder arrancar el simulador es comentar las
líneas que se han añadido para la comunicación con el PC robot en el archivo
"~/.bashrc", del PC estación de trabajo, tal y como se muestra, añadiendo el símbolo
"#" al principio de la línea:

# export ROS_MASTER_URI=http://IP_OF_TURTLEBOT:11311
# export ROS_HOSTNAME=IP_OF_WORKSTATION

Se debe reiniciar la sesión de usuario para que surtan efecto los cambios. Para
ejecutar el simulador del Turtlebot simplemente se bebe ejecutar el siguiente
comando en un terminal:

roslaunch turtlebot_gazebo turtlebot_empty_world.launch

Terminada la carga aparecerá una ventana gráfica del simulador Gazebo con un
escenario vacío y el modelo 3D del robot, como se muestra en la Fig. 4.5.

28
FIG. 4.5 SIMULADOR GAZEBO CON EL MODELO DEL T URTLEBOT

Se puede cambiar el punto de vista jugando con la rueda del ratón y el botón
derecho. Además, se pueden añadir objetos 3D, como esferas, prismas y cilindros.

Para ejecutar los programas creados se introducirá el siguiente comando en un


terminal nuevo, indicando el package donde se encuentra y el nombre del ejecutable:

rosrun NOMBRE_PACKAGE NOMBRE_EJECUTABLE

Si todo ha ido bien, el modelo 3D del robot comenzara a comportarse tal y como le
indique el programa que se haya ejecutado.

4.4.2 Turtlebot
Si se han modificado las líneas para comunicación del archivo "~/.bashrc", para
ejecutar el simulador, se deben restaurar y reiniciar la sesión de usuario para que
surtan efecto los cambios.

Conectado el PC estación de trabajo al PC robot por ssh, se debe crear un espacio de


trabajo y un package, al igual que en el PC estación de trabajo. Creado el espacio de
trabajo y el package, se copiará el programa situado en el PC estación de trabajo al PC

29
robot, escribiendo la siguiente secuencia de comandos en un nuevo terminal del PC
estación de trabajo:

roscd NOMBRE_DEL_PACKAGE
cd src
scp PROGRAMA.cpp turtlebot@IP_OF_TURTLEBOT:/RUTA_PACKAGE/src/PROGRAMA.cpp

Una vez copiado el archivo del programa al PC robot, para poder ser ejecutado hay
que compilarlo. Para ejecutar el programa simplemente se debe introducir el siguiente
comando en un terminal del PC robot, tomando la precaución que el robot se
encuentre en un espacio lo bastante diáfano para evitar colisiones:

rosrun NOMBRE_PACKAGE NOMBRE_JECUTABLE

Cuando el programa que se va a ejecutar necesita de la cámara Kinect, se debe


poner en marcha esta previamente. Para poner en marcha la cámara Kinect se debe
lanzar en el PC robot el "kinect.launch", ejecutando el siguiente comando en un
terminal:

roslaunch turtlebot_bringup kinect.launch

Nota: si se encuentra conectada al robot alguna de las fuentes de alimentación, del PC


robot o del iRobot Create, este no se moverá.

4.5 Navegación autónoma usando los packages de ROS


ROS proporciona una serie de packages que nos permiten implementar una
navegación autónoma. Los datos que emplea para esto son los de los sensores
odómetro y giroscopio, para la captura de los movimientos, y la cámara Kinect, para la
detección de obstáculos. El laser es el sensor empleado habitualmente para la
detección de obstáculos. La cámara Kinect no dispone de un láser, pero si de un
escáner 3D de infrarrojos que capta la profundidad, por lo que la nube de puntos
obtenida se transforma en una señal 2D de profundidad.

Para lograr la navegación autónoma primero se debe obtener un mapa 2D de


ocupación de rejilla del entorno de trabajo, empleando un método SLAM, operando el
robot manualmente. Esto requiere la correcta calibración de sensores. Posteriormente
este mapa se emplea para la estimación de la ruta a seguir desde el punto de origen al

30
punto de destino, además de realizar de forma simultánea una localización del robot
dentro del entorno, empleando un método de localización probabilístico. Hacer que el
robot conozca su posición en el mapa es esencial para lograr la autonomía móvil.

4.5.1 Calibración de sensores


Para un correcto seguimiento del movimiento del robot se debe hacer una
calibración de su odómetro y su giroscopio, para corregir el error que puedan cometer.
Para ello colocaremos el robot frente a una pared recta, con al menos 2 metros de
superficie libre, separado unos 30 centímetros de ella, como se muestra en la Fig. 4.6.

FIG. 4.6 COLOCACIÓN TURTLEBOT PARA CALIBRACIÓN

Para ejecutar el programa de calibración simplemente se debe ejecutar el siguiente


comando en un terminal del PC robot:

roslaunch turtlebot_calibration calibrate.launch

Finalizado el proceso de calibración aparecerán los valores de corrección de escala


de los parámetros:

 turtlebot_node/gyro_scale_correction
 turtlebot_node/odom_angular_scale_correction

[INFO] [WallTime: 1299286750.821002] Multiply the


'turtlebot_node/gyro_scale_correction' parameter with VALOR_CALIBRACION
[INFO] [WallTime: 1299286750.822427] Multiply the
'turtlebot_node/odom_angular_scale_correction' parameter with VALOR_CALIBRACION

El nuevo valor a aplicar a los parámetros será el resultado de multiplicar el valor


antiguo, por defecto 1, por el valor obtenido en la calibración. Para aplicar este nuevo
valor a los parámetros de forma permanente se debe editar el archivo

31
"turtlebot.launch", situado en la ruta /etc/ros/electric, tal como se muestra a
continuación:

turtlebot.launch

<launch>

<!-- sample file, copy this to /etc/ros/electric/turtlebot.launch -->

<param name="turtlebot_node/gyro_scale_correction"
value="VALOR_ANTIGUO_x_VALOR_CALIBRACION"/>
<param name="turtlebot_node/odom_angular_scale_correction"
value="VALOR_ANTIGUO_x_VALOR_CALIBRACION"/>

<include file="$(find turtlebot_bringup)/minimal.launch">


<arg name="urdf_file" value="$(find xacro)/xacro.py '$(find
turtlebot_description)/urdf/turtlebot.urdf.xacro'" />
</include>

</launch>

Nota: El parámetro gyro_measurement_range tiene por defecto un valor de 150, el


valor adecuado si el Turtlebot es de Willow Garage, pero debe ser 250 si es de
Clearpath y 300 si es de iHeartEngineering (en este caso el giroscopio tiene un rango
de medida de 300). Para esto será necesario añadir otra línea al archivo
"turtlebot.launch" para establecer el valor adecuado según el modelo.

<param name="turtlebot_node/gyro_measurement_range" value="SEGÚN_MODELO"/>

Para que el cambio de valores de los parámetros sea efectivo deberemos detener, y
poner en marcha de nuevo el servicio del Turtlebot, con los siguientes comandos:

sudo service turtlebot stop


sudo service turtlebot start

Nota: También se puede hacer una modificación dinámica de estos parámetros usando
un interfaz gráfico ejecutando el siguiente comando en un terminal:

rosrun dynamic_reconfigure reconfigure_gui

4.5.2 Creación del mapa


Para la creación del mapa se usará el stack proporcionado por ROS
"slam_gmapping", que contiene el package "gmapping" que implementa un método
para SLAM. El archivo "crear_mapa.launch", que se guardará en la carpeta "launch" de
nuestro package, tendrá el siguiente contenido:

32
crear_mapa.launch

<launch>
<include file="$(find turtlebot_bringup)/kinect.launch" />

<arg name="scan_topic" default="scan" />

<node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen">


<param name="odom_frame" value="odom"/>
<param name="map_update_interval" value="3.0"/>
<param name="maxUrange" value="16.0"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="lskip" value="0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="linearUpdate" value="0.5"/>
<param name="angularUpdate" value="0.436"/>
<param name="temporalUpdate" value="-1.0"/>
<param name="resampleThreshold" value="0.5"/>
<param name="particles" value="80"/>

<param name="xmin" value="-1.0"/>


<param name="ymin" value="-1.0"/>
<param name="xmax" value="1.0"/>
<param name="ymax" value="1.0"/>

<param name="delta" value="0.05"/>


<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">


<rosparam file="$(find turtlebot_fer)/config/costmap_common_params.yaml"
command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot_fer)/config/costmap_common_params.yaml"
command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot_fer)/config/local_costmap_params.yaml" command="load"
/>
<rosparam file="$(find turtlebot_fer)/config/global_costmap_params.yaml"
command="load" />
<rosparam file="$(find turtlebot_fer)/config/base_local_planner_params.yaml"
command="load" />
</node>
</launch>

Nota: los archivos de configuración del package "move_base" se han obtenido del
package "turtlebot_navigation", carpeta config, y se han situado en nuestro package
en una carpeta llamada, igualmente, "config".

Para ejecutar "crear_mapa.launch", que inicia la Kinect, "slam_gmaping" y


"move_base", se debe introducir el siguiente comando en un terminal del PC robot:

roslaunch NOMBRE_PACKAGE crear_mapa.launch

33
Para el desplazamiento del Turtlebot a través del espacio a mapear se empleará el
teleoperador por teclado, ejecutando en un terminal del PC robot el siguiente
comando:

roslaunch turtlebot_teleop keyboard_teleop.launch

Nota: Para la correcta realización del mapa es necesario dar varias pasadas por el
espacio a mapear, saliendo de un punto de partida y regresando a él para cerrar el
bucle.

Para poder visualizar el proceso de creación del mapa, en un terminal del PC


estación de trabajo se ejecutará el siguiente comando, que lanza el entorno de
visualización "rviz":

rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg

El resultado obtenido después de varias pasadas por el entorno a mapear es el que


se muestra en la Fig. 4.7.

FIG. 4.7 MAPA 2D DE OCUPACIÓN DE REJILLA DEL LABORATORIO F6

34
Se creará una carpeta llamada "mapas" dentro de nuestro package, donde se guardará
el mapa con el nombre "labf6" introduciendo el siguiente comando en un terminal del
PC robot:

rosrun map_server map_saver -f /RUTA_PACKAGE/mapas/labf6

4.5.3 Navegación por el entorno mapeado


Con el mapa ya creado, para que el robot se desplace por él se hará uso del stack
proporcionado por ROS "navigation", que contiene los packages "map_server", "amcl"
(adaptive Monte Carlo localization) y “move_base”. Cada uno de ellos,
respectivamente, carga el mapa creado, ejecuta el método probabilístico de
localización adaptativa Monte Carlo y planifica la ruta para ir del origen al destino
dentro del mapa evitando los obstáculos.

El package “move_base” se encarga de la planificación de rutas, navegación global,


y evitación de obstáculos, navegación local. En la Fig. 4.8 se muestra el diagrama de
bloques de la estructura de este package.

FIG. 4.8 ESTRUCTURA DEL PACKAGE MOVE _BASE

Cuando el robot se encuentra atascado el procedimiento, por defecto, que sigue


“move_base” para intentar recuperarlo es el que se muestra en la Fig. 4.9. Pudiendo
ser modificado este comportamiento en el parámetro “recovery_behaviors”, por otro
de los disponibles.

35
FIG. 4.9 COMPORTAMIENTO RECUPERACIÓN MOVE _BASE

Se creará, en la carpeta "launch" de nuestro package, el archivo


"usar_mapa.launch" con el siguiente contenido:

usar_mapa.launch

<launch>
<include file="$(find turtlebot_bringup)/kinect.launch" />

<arg name="map_file" default="$(find turtlebot_fer)/mapas/labf6.yaml"/>

<node name="map_server" pkg="map_server" type="map_server" args="$(arg map_file)" />

<arg name="use_map_topic" default="false"/>


<arg name="scan_topic" default="scan" />

<node pkg="amcl" type="amcl" name="amcl">


<param name="use_map_topic" value="$(arg use_map_topic)"/>
<!-- Publish scans from best pose at a max of 10 Hz -->
<param name="odom_model_type" value="diff"/>
<param name="odom_alpha5" value="0.1"/>
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="60"/>
<param name="laser_max_range" value="12.0"/>
<param name="min_particles" value="500"/>
<param name="max_particles" value="2000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.2"/>
<param name="odom_alpha2" value="0.2"/>
<!-- translation std dev, m -->
<param name="odom_alpha3" value="0.2"/>
<param name="odom_alpha4" value="0.2"/>
<param name="laser_z_hit" value="0.5"/>
<param name="laser_z_short" value="0.05"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.5"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_model_type" value="likelihood_field"/>
<!-- <param name="laser_model_type" value="beam"/> -->
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.25"/>
<param name="update_min_a" value="0.2"/>
<param name="odom_frame_id" value="odom"/>
<param name="resample_interval" value="1"/>
<!-- Increase tolerance because the computer can get quite busy -->
<param name="transform_tolerance" value="1.0"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
<remap from="scan" to="$(arg scan_topic)"/>
</node>

<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">


<rosparam file="$(find turtlebot_fer)/config/costmap_common_params.yaml"
command="load" ns="global_costmap" />
<rosparam file="$(find turtlebot_fer)/config/costmap_common_params.yaml"

36
command="load" ns="local_costmap" />
<rosparam file="$(find turtlebot_fer)/config/local_costmap_params.yaml" command="load"
/>
<rosparam file="$(find turtlebot_fer)/config/global_costmap_params.yaml"
command="load" />
<rosparam file="$(find turtlebot_fer)/config/base_local_planner_params.yaml"
command="load" />
</node>
</launch>

Para ejecutar "usar_mapa.launch", que inicia la Kinect, "map_server", "amcl" y


"move_base", se debe introducir el siguiente comando en un terminal del PC robot:

Roslaunch NOMBRE_PACKAGE usar_mapa.launch


map_file:=/RUTA_PACKAGE/mapas/labf6.yaml

Para interactuar con el robot se debe iniciar el entrono de visualización "rviz",


ejecutando el siguiente comando en un terminal del PC estación de trabajo:

rosrun rviz rviz -d `rospack find turtlebot_navigation`/nav_rviz.vcg

Primero se deberá indicar la posición y orientación aproximada del robot dentro del
mapa, pulsando en el botón "2D Pose Estimate" y posteriormente pulsando sobre el
mapa en la posición estimada, sin soltar el botón del ratón indicar la orientación
estimada y soltar. El modelo del robot se situará ahora en esta posición, rodeado por
una nube de puntos en color rojo como se muestra en la Fig. 4.10.

FIG. 4.10 INDICACIÓN INICIAL POSICIÓN ESTIMADA


37
Para indicar el punto de destino dentro del mapa, pulsando "2D Nav Goal" y
posteriormente pulsando sobre el mapa en la posición de destino, sin soltar el botón
del ratón se indicara la orientación final. En este momento el robot comenzará a
moverse siguiendo la trayectoria calculada, línea de color verde, hasta alcanzar el
punto de destino, como se muestra en la Fig. 4.11.

FIG. 4.11 TRAYECTORIA SEGUIDA HASTA EL DESTINO

Nota: Para poder probar la navegación autónoma en el simulador es necesario añadir


la siguiente línea de código al archivo "robot.launch", situado en la ruta
opt/ros/electric/stacks/turtlebot_simulator/turtlebot_gazebo/launch:

<param name="output_frame" value="odom"/>

Esta línea deberá añadirse en la ejecución del node "robot_pose_ekf". Quedando el


archivo "robot.launch" con el siguiente contenido:

robot.launch

<launch>
<param name="robot_description" command="$(find xacro)/xacro.py '$(find
turtlebot_description)/urdf/turtlebot.urdf.xacro'" />

<node name="spawn_turtlebot_model" pkg="gazebo" type="spawn_model" args="$(optenv


ROBOT_INITIAL_POSE) -unpause -urdf -param robot_description -model turtlebot" respawn="false"
output="screen"/>

<node pkg="diagnostic_aggregator" type="aggregator_node" name="diagnostic_aggregator" >


<rosparam command="load" file="$(find turtlebot_bringup)/config/diagnostics.yaml" />

38
</node>

<node pkg="robot_state_publisher" type="state_publisher" name="robot_state_publisher"


output="screen">
<param name="publish_frequency" type="double" value="30.0" />
</node>

<!-- The odometry estimator -->


<node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf">
<param name="freq" value="30.0"/>
<param name="sensor_timeout" value="1.0"/>
<param name="publish_tf" value="true"/>
<param name="odom_used" value="true"/>
<param name="imu_used" value="false"/>
<param name="vo_used" value="false"/>
<param name="output_frame" value="odom"/> <!-- NUEVA LINEA -->
</node>

<!-- throttling -->


<node pkg="nodelet" type="nodelet" name="pointcloud_throttle" args="load
pointcloud_to_laserscan/CloudThrottle openni_manager" respawn="true">
<param name="max_rate" value="20.0"/>
<remap from="cloud_in" to="/camera/depth/points"/>
<remap from="cloud_out" to="cloud_throttled"/>
</node>

<!-- Fake Laser -->


<node pkg="nodelet" type="nodelet" name="kinect_laser" args="load
pointcloud_to_laserscan/CloudToScan openni_manager" respawn="true">
<param name="output_frame_id" value="/camera_depth_frame"/>
<!-- heights are in the (optical?) frame of the kinect -->
<param name="min_height" value="-0.15"/>
<param name="max_height" value="0.15"/>
<remap from="cloud" to="/cloud_throttled"/>
</node>

<!-- Fake Laser (narrow one, for localization -->


<node pkg="nodelet" type="nodelet" name="kinect_laser_narrow" args="load
pointcloud_to_laserscan/CloudToScan openni_manager" respawn="true">
<param name="output_frame_id" value="/camera_depth_frame"/>
<!-- heights are in the (optical?) frame of the kinect -->
<param name="min_height" value="-0.025"/>
<param name="max_height" value="0.025"/>
<remap from="cloud" to="/cloud_throttled"/>
<remap from="scan" to="/narrow_scan"/>
</node>
</launch>

5 Discusión del resultado


El objetivo inicialmente planteado, la navegación autónoma del robot Turtlebot por
un entorno de trabajo empleando ROS, se ha conseguido de forma satisfactoria. Se ha
notado la gran influencia del error cometido por los sensores de medición de
desplazamiento del robot, odómetro y giroscopio, en la estimación del movimiento
dentro del entorno de trabajo, ya que un pequeño error acumulado causa gran
distorsión en la posición real. Los mecanismos de compensación de errores de los
métodos empleados en la construcción del mapa (GMapping) y en la localización
(AMCL), consiguen reducir el error de localización a unos valores tolerables.

39
Se ha realizado la experiencia de incluir un obstáculo no mapeado en el recorrido
del robot. Se han observando diferentes comportamientos en la realización del mismo
recorrido sin modificar la posición del obstáculo, debido a la estimación de la posición
del robot. La aparición de un obstáculo en la lectura del sensor puede provocar una
estimación errónea de posición, que en el peor de los casos implica el atascamiento
del robot y la ejecución de los procedimientos de recuperación. Esto mismo sucede en
un entorno de trabajo en el que pueda haber modificaciones frecuentes de posiciones
de obstáculos, entornos dinámicos. Por lo que el método empleado, AMCL, tiene la
capacidad de adaptarse a entornos dinámicos. Pero como anteriormente se ha
señalado se trata de un método de localización local, por lo que no soporta el
secuestro.

También se ha probado la navegación con personas dentro del entrono de trabajo.


Cuando estas se mantienen estáticas el comportamiento es similar a cuando se
encuentra otro tipo de obstáculos no mapeados, pero cuando estas se encuentran en
movimiento las reacciones del robot son lentas e imprecisas, pudiendo provocar la
colisión con las personas. Por lo que este método de navegación autónoma no está
adaptado a la interacción con personas.

Además se ha desarrollo un programa de control para el robot que hace el


seguimiento de objetos de una tonalidad, en concreto para su prueba se han usado
tonalidades rojas, aunque podría configurarse para otras. Este programa podría
englobarse en navegación autónoma, ya que presenta un comportamiento de
seguimiento de un objetivo. La iluminación del entorno debe ser uniforme y sin zonas
de sombra para un correcto funcionamiento. Además se debe hacer una calibración
previa de los umbrales de color, para adaptarlos a la iluminación del entorno. También
debe ajustarse el tamaño del objeto a seguir, modificando el porcentaje máximo,
medio y mínimo de píxeles en la imagen. El ajuste de la velocidad de respuesta a
valores elevados provoca la oscilación en torno al punto de equilibrio, por lo que
deberá ajustarse al valor deseado de respuesta.

Los otros dos programas desarrollados, son didácticos, su utilidad es básicamente


inexistente. El primero, simplemente, hace que el robot se desplace describiendo un

40
círculo y el segundo emula el comportamiento de un juguete móvil, se desplaza en
línea recta hasta que impacta con un obstáculo, momento en el que hace un pequeño
retroceso seguido de un giro de magnitud y sentido aleatorios.

La experiencia con el entorno de desarrollo ROS ha sido bastante satisfactoria,


dadas sus grandes posibilidades para el diseño de programas de control de robots.
Destacar además la rápida adaptación al entorno por parte del usuario, incluso si no
cuenta con experiencia previa en programación de robots, simplemente exige de
conocimientos previos de programación en lenguaje c++ o python.

6 Conclusiones y trabajos futuros


El gran problema que muestra la navegación autónoma es la localización del robot
dentro del entrono de trabajo, que con los método empleados, GMapping y AMCL,
está en esencia solventado. Pero otro problema que se observa es la aparición de
nuevos obstáculos dentro del entrono ya mapeado, sobre todo obstáculos móviles
como personas y animales, ya que la adaptación de la trayectoria es bastante lenta e
imprecisa. Además la navegación empleando los métodos citados se limita a entornos
cerrados.

Este trabajo se ha basado en la navegación empleando un mapa de rejilla de


ocupación del entorno en 2D. Una opción de futuro podría ser la creación de mapas 3D
del entorno, que proporcionaran datos más precisos del entorno, que seguramente
reduzca la incertidumbre en la localización, mejore la planificación de rutas y la
evitación de obstáculos no incluidos en el mapa, pero también incremente las
necesidades computacionales.

7 Bibliografía

1. iRobot. Roomba. , 2012 Available


from:http://www.irobot.com/es/roomba_range.aspx.

2. Willow Garage. ROS. , 2012 Available from:http://www.ros.org/wiki/.

3. Willow Garage. Willow Garage. , 2012 Available


from:http://www.willowgarage.com/.

41
4. SIMMONS, R. and KOENIG, S. Probabilistic Robot Navigation in Partially Observable
Environments. LAWRENCE ERLBAUM ASSOCIATES LTD, 1995.

5. THRUN, S., BURGARD, W. and FOX, D. Probabilistic Robotics. MIT Press, 2005.

6. THRUN, S. Monte Carlo Pomdps. Advances in Neural Information Processing


Systems, 2000, vol. 12. pp. 1064-1070.

7. FOX, D. Adapting the Sample Size in Particle Filters through KLD-Sampling. The
International Journal of Robotics Research, 2003, vol. 22, no. 12. pp. 985.

8. G. GRISETTI, C. STACHNISS and W. BURGARD. GMapping. , 2006 Available


from:http://openslam.org/.

9. Gazebo. Gazebo. , 2012 Available from:http://gazebosim.org/.

10. Willow Garage. Turtlebot. , 2012 Available from:http://turtlebot.com/.

11. F. CASADO GARCÍA. Fernando-TFM-ROS02. , 2012 Available


from:http://robotica.unileon.es/mediawiki/index.php/Fernando-TFM-ROS02.

42
Anexo A. Comandos más empleados de ROS
Comando Descripción Uso
Comandos del sistema de archivos
rospack/rosstack Herramienta de inspección de rospack find [package]
packages/stacks
roscd Cambia directorios a un package o stack roscd [package[/subdir]]
rosls Lista el contenido de un package o stack rosls [package[/subdir]]
roscreate-pkg Crea un nuevo package ROS roscreate-pkg [nombre package]
roscreate-stack Crea un nuevo stack ROS roscreate-stack [nombre stack]
rosdep Instala las dependencias de los packages rosmake [package]
ROS
rosmake Compila un package ROS rosdep install [package]
roswtf Muestra errores y avisos de un sistema roswtf o roswtf [archivo]
ROS en marcha o un archivo .launch
rxdeps Muestra la estructura de un package y rxdeps [opciones]
dependencias
Comandos habituales
roscore Ejecuta los nodes master, parameter roscore
server y rosout, necesarios para la
comunicación entre nodos
rosmsg/rossrv
rosmsg show Muestra los campos en el mensaje rosmsg show [tipo mensaje]
rosmsg users Busca archivos que usan el mensaje rosmsg users [tipo mensaje]
rosmsg md5 Muestra el md5sum del mensaje rosmsg md5 [tipo mensaje]
rosmsg package Lista todos los mensajes en un package rosmsg package [package]
rosmsg packages Lista todos los packages con mensajes rosmsg packages

rosrun Inicia un ejecutable de un package rosrun [package] [executable]


rosnode
rosnode ping Prueba la conexión a un node rosnode ping [node]
rosnode list Lista los nodes activos rosnode list
rosnode info Muestra información sobre un node rosnode info [node]
rosnode machine Lista los nodes activos en una máquina rosnode machine [máquina]
rosnode kill Detiene un node activo rosnode kill [node]
roslaunch Ejecuta un archivo .launch roslaunch [package] [archivo]
rostopic
rostopic bw Muestra el ancho de banda usado por el rostopic bw [topic]
topic
rostopic echo Muestra los mensajes del topic en pantalla rostopic echo [topic]
rostopic hz Muestra la velocidad de publicación del rostopic hz [topic]
topic
rostopic list Lista los topics activos rostopic list
rostopic pub Publica datos en un topic rostopic pub [velocidad]
[nombre topic] [tipo mensaje]
[datos]
rostopic type Muestra el tipo de topic rostopic type [topic]
rostopic find Encuentra topics por tipo rostopic find [tipo mensaje]
rosparam
rosparam set Modificar valor de un parámetro rosparam set [parámetro]
[valor]
rosparam get Obtener valor de un parámetro rosparam get [parámetro]
rosparam load Cargar parámetros de un archivo YAML rosparam load [archivo]
rosparam dump Guardar parámetros en un archivo YAML rosparam dump [archivo]
rosparam delete Borrar un parámetro rosparam delete [parámetro]
rosparam list Listar todos los parámetros rosparam list
rosservice

43
Comando Descripción Uso
rosservice list Lista los servicios activos rosservice list
rosservice node Muestra el nodo que dan un servicio rosservice node [servicio]
rosservice call Llama al servicio con los argumentos rosservice call [servicio]
[argumentos]
dados
rosservice args Lista los argumentos del servicio rosservice args [servicio]
rosservice type Muestra el tipo de servicio rosservice type [servicio]
rosservice uri Muestra el servicio ROSRPC uri rosservice uri [servicio]
rosservice find Encuentra servicios por tipo rosservice find [tipo servicio]

Comandos de registro
rosbag
rosbag record Guarda el contenido de uno o todos los rosbag record [topic] o -a
topics
rosbag play Reproduce el contenido de un archivo rosbag play [archivo]
.bag
Comandos gráficos
rxgraph Muestra un grafico con los nodes activos y rxgraph
los topics que los conectan
rxplot Muestra los datos de uno o mas campos rxplot [topic/campo1:campo2]
de los topics gráficamente
rxbag Herramienta para visualización, inspección rxbag [archivo]
y reproducción de archivos .bag
rxconsole Herramienta para visualización y filtrado rxconsole
de mensajes publicados en rosout
Comandos transformaciones frames
tf_echo Muestra la información de transformación rosrun tf tf_echo [frame
origen] [frame destino]
entre un frame origen y un frame destino
view_frames Herramienta de generación del árbol rosrun tf view_frames
completo de transformaciones
coordinadas, en un archivo .pdf

44

También podría gustarte