UNIVERSIDAD CATÓLICA DEL NORTE
FACULTAD DE INGENIERÍA Y CIENCIAS GEOLÓGICAS
DEPARTAMENTO DE INGENIERÍA DE SISTEMAS Y COMPUTACIÓN
APLICACIÓN DE ROS PARA LA NAVEGACION REACTIVA DE UN
ROBOT MOVIL MEDIANTE UN ANILLO ULTRASONICO Y UNA
BALIZA LASER: UN ESTUDIO COMPARATIVO
Memoria para optar al Título de Ingeniero de Ejecución en Computación e Informática
JUAN LUIS ERRICKSON VARGAS
Profesor Guía: Dr. José Gallardo
Antofagasta, Chile
2015
José Gallardo� 24-12-15 13:11Eliminado: ENTRE
José Gallardo� 24-12-15 13:13Eliminado: EN UN ROBOT MOVIL UTILIZANDO ROS
2
NO HAY REFERENCIAS FORMALES A LA BIBLIOGRAFIA
AMPLIAR INFORMACION SOBRE EL SENSOR LASER (DETALLES TECNICOS)
DEFINIR DE MEJOR MANERA LAS METRICAS EN ESCENARIOS IDENTICOS
EL INFORME NO ES UN COMPLEMENTO DEL ANTEPROYECTO, POR TANTO NO UTILIZAR VERBOS EN FUTURO, EJ, SE IMPLEMENTARA…., ETC.
José Gallardo� 28-12-15 12:42Eliminado: V
i
TABLA DE CONTENIDO
Página
ÍNDICE DE FIGURAS ......................................................................................... IV
ÍNDICE DE TABLAS ............................................................................................ V
NOMENCLATURA .............................................................................................. VI
GLOSARIO……………………………………………………………………………VII
RESUMEN……………………………………………………………………………..IX
CAPÍTULO I INTRODUCCIÓN ........................................................................ 1
1.1. Justificación ............................................................................................... 1
1.2. Objetivos ................................................................................................... 2 1.2.1. Objetivo general .......................................................................... 2 1.2.2. Objetivos específicos .................................................................. 2
1.3. Descripción ................................................................................................ 3
1.4. Resultados esperados ............................................................................... 4
1.5. Metodología ............................................................................................... 4
1.6. Recursos necesarios ................................................................................. 5 1.6.1. Recursos de hardware ................................................................ 5 1.6.2. Recursos de software ................................................................. 5 1.6.4. Recursos humanos ..................................................................... 6 1.6.5. Recursos de información ............................................................ 6
1.7. Contenido de la memoria .......................................................................... 6
CAPÍTULO II ESTADO DEL ARTE ................................................................... 8
2.1. Marco Teórico ........................................................................................... 8 2.1.1. Robótica Móvil ............................................................................ 8 2.1.2. Navegación reactiva ................................................................... 9
2.2. ROS (Sistema Operativo Robótico) .......................................................... 9 2.2.1. Componentes centrales ............................................................ 10 2.2.1.1. Comunicación e Infraestructura ............................................... 10
UnknownCódigo de campo cambiado ... [1]
UnknownCódigo de campo cambiado ... [2]
UnknownCódigo de campo cambiado ... [3]
UnknownCódigo de campo cambiado ... [4]
UnknownCódigo de campo cambiado ... [5]
UnknownCódigo de campo cambiado ... [6]
UnknownCódigo de campo cambiado ... [7]
José Gallardo� 24-12-15 13:25Eliminado: 2
UnknownCódigo de campo cambiado ... [8]
José Gallardo� 24-12-15 13:25Eliminado: 2
UnknownCódigo de campo cambiado ... [9]
José Gallardo� 24-12-15 13:25Eliminado: 2
UnknownCódigo de campo cambiado ... [10]
José Gallardo� 24-12-15 13:25Eliminado: 3
UnknownCódigo de campo cambiado ... [11]
José Gallardo� 24-12-15 13:25Eliminado: 4
UnknownCódigo de campo cambiado ... [12]
José Gallardo� 24-12-15 13:25Eliminado: 4
UnknownCódigo de campo cambiado ... [13]
José Gallardo� 24-12-15 13:25Eliminado: 4
UnknownCódigo de campo cambiado ... [14]
José Gallardo� 24-12-15 13:25Eliminado: 5
UnknownCódigo de campo cambiado ... [15]
José Gallardo� 24-12-15 13:25Eliminado: 5
UnknownCódigo de campo cambiado ... [16]
José Gallardo� 24-12-15 13:25Eliminado: 6
UnknownCódigo de campo cambiado ... [17]
José Gallardo� 24-12-15 13:25Eliminado: 6
UnknownCódigo de campo cambiado ... [18]
José Gallardo� 24-12-15 13:25Eliminado: 6
UnknownCódigo de campo cambiado ... [19]
José Gallardo� 24-12-15 13:25Eliminado: 8
UnknownCódigo de campo cambiado ... [20]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [21]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [22]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [23]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [24]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [25]
José Gallardo� 24-12-15 13:25
ii
2.2.1.1.1. Traspaso de mensajes anónimos ......................................... 10 2.2.1.1.3. Llamadas a procedimiento remoto ....................................... 11 2.2.1.1.4. Sistema de parámetros distribuidos ..................................... 12 2.2.1.2. Características específicas de los robots ................................ 12 2.2.1.2.1. Formato de mensajes estándar para robots ......................... 12 2.2.1.2.6. Pose, estimación de localización, cartografía y navegación 15 2.2.1.3. Herramientas ........................................................................... 16 2.2.1.3.1. Línea de comandos .............................................................. 16 2.2.1.3.2. RVIZ ...................................................................................... 16 2.2.1.3.3. RQT ...................................................................................... 17
2.4. Turtlebot .................................................................................................. 20 2.4.1. Hardware .................................................................................. 20 2.4.2. Software .................................................................................... 21
2.5. Hokuyo láser ........................................................................................... 21
2.6. Arduino .................................................................................................... 22
CAPÍTULO III DISEÑO DE CONFIGURACIONES DE ROBOT ...................... 23
3.1. Anillo Ultrasónico ..................................................................................... 23
3.2. Baliza laser .............................................................................................. 26
CAPÍTULO IV IMPLEMENTACIÓN DE LOS ALGORITMOS ......................... 27
4.1. Algoritmo de desplazamiento del robot ................................................... 28
4.2. Algoritmo de comunicación Arduino ........................................................ 30
CAPÍTULO V COMPARACIÓN DE LAS CONFIGURACIONES .................... 31
5.1. Métricas ................................................................................................... 31 5.1.1. Cantidad de choques ................................................................ 31 5.1.2. Cantidad de veces que se debió corregir el robot .................... 31
5.2. Obtención de métricas ............................................................................ 32
CAPÍTULO VI CONCLUSIONES .................................................................... 35
6.1. Cumplimiento de los objetivos ................................................................. 35
6.2. Trabajo futuro .......................................................................................... 37
BIBLIOGRAFÍA 38
UnknownCódigo de campo cambiado ... [26]
José Gallardo� 24-12-15 13:25Eliminado: 10
UnknownCódigo de campo cambiado ... [27]
José Gallardo� 24-12-15 13:25Eliminado: 11
UnknownCódigo de campo cambiado ... [28]
José Gallardo� 24-12-15 13:25Eliminado: 12
UnknownCódigo de campo cambiado ... [29]
José Gallardo� 24-12-15 13:25Eliminado: 12
UnknownCódigo de campo cambiado ... [30]
José Gallardo� 24-12-15 13:25Eliminado: 12
UnknownCódigo de campo cambiado ... [31]
José Gallardo� 24-12-15 13:25Eliminado: 15
UnknownCódigo de campo cambiado ... [32]
José Gallardo� 24-12-15 13:25Eliminado: 15
UnknownCódigo de campo cambiado ... [33]
José Gallardo� 24-12-15 13:25Eliminado: 16
UnknownCódigo de campo cambiado ... [34]
José Gallardo� 24-12-15 13:25Eliminado: 16
UnknownCódigo de campo cambiado ... [35]
José Gallardo� 24-12-15 13:25Eliminado: 17
UnknownCódigo de campo cambiado ... [36]
José Gallardo� 24-12-15 13:25Eliminado: 19
UnknownCódigo de campo cambiado ... [37]
José Gallardo� 24-12-15 13:25Eliminado: 19
UnknownCódigo de campo cambiado ... [38]
José Gallardo� 24-12-15 13:25Eliminado: 20
UnknownCódigo de campo cambiado ... [39]
José Gallardo� 24-12-15 13:25Eliminado: 20
UnknownCódigo de campo cambiado ... [40]
José Gallardo� 24-12-15 13:25Eliminado: 21
UnknownCódigo de campo cambiado ... [41]
José Gallardo� 24-12-15 13:25Eliminado: 22
UnknownCódigo de campo cambiado ... [42]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [43]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [44]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [45]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [46]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [47]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [48]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [49]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [50]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [51]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [52]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [53]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [54]
José Gallardo� 24-12-15 13:25
UnknownCódigo de campo cambiado ... [55]
José Gallardo� 24-12-15 13:25
iii
ANEXO A CÓDIGO NAVEGACIÓN CON LASER ............................................. 40
ANEXO B CÓDIGO NAVEGACIÓN ANILLO ULTRASÓNICO .......................... 46
ANEXO C CÓDIGO PROGRAMA ARDUINO .................................................... 52
UnknownCódigo de campo cambiado
José Gallardo� 24-12-15 13:25Eliminado: 38
UnknownCódigo de campo cambiado
José Gallardo� 24-12-15 13:25Eliminado: 44
UnknownCódigo de campo cambiadoJosé Gallardo� 24-12-15 13:25Eliminado: 50
iv
ÍNDICE DE FIGURAS
Figura 1.1 Anillo ultrasónico y baliza laser, respectivamente .............................. 1
Figura 1.2 Actividades del proyecto ..................................................................... 3
Figura 2.1 Diagnósticos para robot .................................................................... 15
Figura 2.2 RQT_GRAPH muestra relaciones de nodos en un programa en
ejecución. ........................................................................................................... 17
Figura 2.3 RQT_PLOT grafica tópicos en directo .............................................. 18
Figura 2.4 abanico de acción de la baliza láser ................................................. 22
Figura 3.1 PING))) de Parallax ........................................................................... 24
Figura 3.2 Soporte protector de PING))) ............................................................ 24
Figura 3.3 Protectores con sensores montados en el robot .............................. 25
Figura 4.1 Vista superior de turtlebot con sensores ultrasónicos ...................... 27
Figura 4.2 Conexión de los sensores con Arduino. ........................................... 28
Figura 5.1 Triángulo formado en la medición laser ............................................ 33
Figura 5.2 Sensor ultrasónico sin detectar objeto. ............................................. 33
UnknownCódigo de campo cambiado ... [56]
José Gallardo� 24-12-15 13:25Eliminado: 3
UnknownCódigo de campo cambiado ... [57]
José Gallardo� 24-12-15 13:25Eliminado: 15
UnknownCódigo de campo cambiado ... [58]
José Gallardo� 24-12-15 13:25Eliminado: 17
UnknownCódigo de campo cambiado ... [59]
José Gallardo� 24-12-15 13:25Eliminado: 18
UnknownCódigo de campo cambiado ... [60]
José Gallardo� 24-12-15 13:25Eliminado: 21
UnknownCódigo de campo cambiado ... [61]
José Gallardo� 24-12-15 13:25Eliminado: 23
UnknownCódigo de campo cambiado ... [62]
José Gallardo� 24-12-15 13:25Eliminado: 23
UnknownCódigo de campo cambiado ... [63]
José Gallardo� 24-12-15 13:25Eliminado: 24
UnknownCódigo de campo cambiado ... [64]
José Gallardo� 24-12-15 13:25Eliminado: 26
UnknownCódigo de campo cambiado ... [65]
José Gallardo� 24-12-15 13:25Eliminado: 27
UnknownCódigo de campo cambiado ... [66]
José Gallardo� 24-12-15 13:25Eliminado: 32
UnknownCódigo de campo cambiado ... [67]
José Gallardo� 24-12-15 13:25Eliminado: 32
v
ÍNDICE DE TABLAS
Tabla 1-1 Recursos Humano del Proyecto .......................................................... 6
Tabla 5-1 Tabla con conteo de métricas ............................................................ 32
José Gallardo� 24-12-15 13:25Eliminado: 6
UnknownCódigo de campo cambiadoJosé Gallardo� 24-12-15 13:25Eliminado: 31
vi
NOMENCLATURA
CDPAS: Catálogo Digital de Patrones de Adquisición de Software.
GUI: Interfaz gráfica de usuario, del inglés, graphical user interface.
HZ: Hertz.
IDE: Ambiente de desarrollo integrado, del inglés, Integrated Development
Environment.
IDL: Lenguaje de descripción de interfaz, del inglés, Interface Description
Language.
IMU: Unidad de Medición Inercial, del inglés, Inertial Measurement Unit.
ROS: Sistema Operativo Robótico, del inglés, Robot Operating System.
SDK: Kit de desarrollo de software, del inglés, software development kit.
URDF: Unified Robot Descripción Format.
XML: Lenguaje de marcas extensible, del inglés, eXtensible Markup Language.
vii
GLOSARIO
Algoritmos: Es un conjunto prescrito de instrucciones o reglas bien definidas,
ordenadas y finitas que permite realizar una actividad mediante pasos
sucesivos que no generen dudas a quien deba realizar dicha actividad.
Arquitectura: Representación ordenada y estructurada de información apoyada
Cinemática: Parte de la mecánica que trata del movimiento en sus condiciones
de espacio y tiempo, sin tener en cuenta las causas que lo producen.
Dinámica: Parte de la mecánica que trata del movimiento en sus condiciones
de espacio y tiempo, sin tener en cuenta las causas que lo producen.
Framework: Es un conjunto estandarizado de conceptos, prácticas y criterios
para enfocar un tipo de problemática particular que sirve como referencia, para
enfrentar y resolver nuevos problemas de índole similar.
Hardware: Conjunto de elementos físicos o materiales que constituyen una
computadora o un sistema informático.
Middleware: Es un software que asiste a una aplicación para interactuar o
comunicarse con otras aplicaciones, o paquetes de programas, redes, hardware
y/o sistemas operativos.
Multiplataforma: Es un atributo conferido a programas informáticos o métodos
y conceptos de cómputo que son implementados e interoperan en múltiples
plataformas informáticas
Open source: Tipo licencia de software sobre la cual el código es distribuido,
modificado, y mejorado libremente.
Sensor: Es un dispositivo capaz de detectar magnitudes físicas o químicas,
llamadas variables de instrumentación, y transformarlas en variables eléctricas.
José Gallardo� 24-12-15 13:15Eliminado: e
José Gallardo� 24-12-15 13:17Eliminado: r
José Gallardo� 24-12-15 13:18Comentario [1]: APOYADA POR QUÉ
José Gallardo� 24-12-15 13:19Comentario [2]: ES LO MISMO DE CINEMÁTICA?, SIN DUDA NO
José Gallardo� 24-12-15 13:19Eliminado: e
José Gallardo� 24-12-15 13:19Eliminado: e
José Gallardo� 24-12-15 13:19Eliminado: e
José Gallardo� 24-12-15 13:20Eliminado: t
José Gallardo� 24-12-15 13:20Eliminado: e
viii
Sistema Operativo: Conjunto de órdenes y programas que controlan los
procesos básicos de una computadora y permiten el funcionamiento de otros
programas.
Software: Conjunto de programas y rutinas que permiten a la computadora
realizar determinadas tareas.
ix
RESUMEN
La robótica móvil actualmente se encuentra presente en la mayor parte de las
industrias, universidades y hasta en los hogares, por esto es que la humanidad
sigue con las investigaciones sobre este tema tan importante. Es por esto que
en la presente tesis, se abordaran temas de la robótica móvil y temas afines al
desarrollo de la misma.
El tema a tratar es la comparación del desempeño de dos configuraciones de
Robot QUE FUNCIONAN UTILIZANDO COMO DISPOSITIVO DE
PERCEPCIÓN DESU MEDIO EXTERNO, un anillo de sensores ultrasónicos Y
una baliza laser, EL RESULTADO DE LA NAVEGACION DEL ROBOT MOVIL
APOYADO POR ESTOS DIFERENTES TIPOS DE DISPOSITIVOS DE
PERSEPCION DEBE SER EVALUADO
Para facilitar el desarrollo de investigaciones se generó ROS, el cual es un
sistema operativo para robots, esto quiere decir que una cantidad elevada de
dispositivos robóticos son compatibles con él, para así poder usar el mismo
programa al cambiar dispositivos de un robot o para agilizar el desarrollo del
mismo ya que no se debe preocupar de los driver y de la comunicación inter
dispositivos, ya que ROS provee esos tópicos.
Actualmente ROS, se encuentra inserto en diversas investigaciones alrededor
del mundo y está en la vanguardia de la investigación universitaria, he allí la
importancia en la profundización en un tema tan importante como este.
jgallardo� 25-12-15 12:34Eliminado: D
José Gallardo� 24-12-15 13:22Eliminado: entre ellas
José Gallardo� 24-12-15 13:22Eliminado: versus
José Gallardo� 24-12-15 13:23Eliminado: entre ellas se deberá comparar los resultados posterior a la ejecución y funcionamiento de las mismas en torno al programa.
jgallardo� 25-12-15 12:35Eliminado: S
jgallardo� 25-12-15 12:37Comentario [3]: NO ES ASI, JUSTAMENTE CUANDO SE DISEÑA UN NOEVO ROBOT, PARA UTILISAR LOS PROGRAMAS DE LAS LIBRERIAS DE ROS, SE DEBEN DESARROLLAR LOS DRIVER QUE PERMITAN A ROS RECONOCERLO COMO DISPOSITIVO COMPATIBLE
1
CAPÍTULO I INTRODUCCIÓN
Las aplicaciones de la robótica móvil se han incrementado en lugares donde
hay necesidad de productividad en masa o donde las tareas necesitan ser
repetitivas y donde el entorno donde el robot desempeñará sus tareas no es
conocido en su totalidad. El uso de este tipo de robots se destaca en la
construcción, la industria nuclear y medicina entre otras.
Actualmente los robots se clasifican en distintos grupos, uno de ellos, es
relevante para el presente trabajo, el uso de robots móviles, principalmente el
robot diferencial. Este robot tan versátil se compone de un cuerpo, donde puede
tener su unidad de procesamiento u otros objetos que pueden facilitar las tareas
que necesita realizar. Además se compone de dos ruedas principales, las
cuales sirven para su desplazamiento y una tercera que se utiliza como pivote,
para tener una base donde puede apoyarse.
La importancia de la presente tesis es de poder comprender cÓmo funciona y
cÓmo desarrollar correctamente UN APLICACIÓN PARA CONTROLAR UN
ROBOT MOVIL UTILIZANDO LOS PROGRAMAS DE la librería ROS, esto para
poder a futuro desarrollar aplicaciones MAS COMPLEJAS, y de mayor aporte a
LA COMUNIDAD CIENTÍFICA.
jgallardo� 25-12-15 12:40Eliminado: o
jgallardo� 25-12-15 12:40Eliminado: o
jgallardo� 25-12-15 12:39Eliminado: con
jgallardo� 25-12-15 12:42Eliminado: mejores
jgallardo� 25-12-15 12:42Eliminado: con mayor dificultad
jgallardo� 25-12-15 12:42Eliminado: la sociedad
1
1.1. Justificación
LA IMPORTANCIA DEL DESARROLLO DEL PRESENTE ESTUDIO, ES LA
UTILIZACION DE ROS PARA EVALUAR DIFERENTES CONFIGURACIONES
DEL ROBOT XXXX, DE MANERA TAL DE PODER EVALUAR LA CALIDAD DE
LA NAVEGACIÓN EN FUNCION DE DOS DISPOSITIVOS DE PERCEPCION
DE DIFERENTES CARACTERISTICAS Y DIFERENTE COSTE, una con un
anillo de sensores ultrasónicos y otra con una baliza laser, como se muestran
en la Figura 1.1. Para realizar esto se deberá profundizar en el uso de ROS
(Robot Operating System), el cual facilita la interacción de bajo nivel con el
hardware y facilita la programación.
Figura 1.1 Anillo ultrasónico y baliza laser, respectivamente
Por lo tanto el objetivo de la presente tesis será de trabajar con ROS, el cual se
instalará en la distribución de Linux, Ubuntu.
He aquí la importancia de la presente tesis ya que los resultados podrían ser
muy distantes a los obtenidos, con tan solo agregar algunas variantes como las
imperfecciones del suelo o la rugosidad de las superficies o en caso contrario
jgallardo� 25-12-15 12:43Eliminado: La realización
jgallardo� 25-12-15 12:48Eliminado: de este proyecto de tesis, es de realizar una comparación en la ejecución de tos configuraciones del robot TurtleBot
jgallardo� 25-12-15 12:49Comentario [4]: CUALES
2
comprobar que la simulación obtuvo los resultados esperados en un ambiente
real.
1.2. Objetivos
A continuación se presenta el objetivo general y aquellos específicos del trabajo
de tesis.
1.2.1. Objetivo general
Realizar una comparación en la navegación reactiva entre una configuración del
robot TurtleBot con un anillo de sensores ultrasónicos y otra con una baliza
laser. Esto se realizará con el uso de ROS, lo que facilitará la implementación
del algoritmo de control.
1.2.2. Objetivos específicos
• Estudiar y profundizar el uso que se le puede dar a ROS junto al robot
TurtleBot.
• Diseñar e implementar las configuraciones de un robot con anillo
ultrasónico y otra con baliza laser.
• Implementar algoritmos haciendo uso de ROS.
• Comparar los resultados de la navegación autónoma reactiva de ambas
configuraciones.
3
1.3. Descripción
Para la realización del trabajo de titulación se han determinado las siguientes
actividades, como se muestran en la Figura 1.2.
Figura 1.2 Actividades del proyecto
A continuación se explica cada una de las actividades de la Figura 1.3:
Investigación sobre ROS: es necesario un estudio previo del funcionamiento
de ROS, de su estructuración y comportamiento.
Diseño e implementación de algoritmos en el robot: se necesita diseñar y
configurar la estructura del robot, situando sensores en lugares específicos de
Éste para que así pueda detectar objetos que no se encontraban a su alcance.
Implementar algoritmos de control: con las configuraciones de las estructuras
de los robots ya desarrolladas, se procede al diseño e implementación del
algoritmo de control, el cual permitirá que el robot pueda eludir objetos de
manera correcta.
Inves'gación sobre ROS
Diseño e implementación de las configuraciones
del robot
Implementar algoritmos de
control
Compara'va en la navegación del
robot
jgallardo� 25-12-15 12:50Eliminado: de
jgallardo� 25-12-15 12:51Eliminado: e
4
Comparativa en la navegación del robot: para realizar la comparación entre
los algoritmos de control, se tomó la cantidad de objetos colisionados con el
robot durante todo su trayecto.
1.4. Resultados esperados
Se espera al finalizar el trabajo de tesis analizar y descubrir cuál de las
configuraciones se desempeña mejor en las mismas condiciones de ambiente y
mismo algoritmo implementado Y ADICIONALMENTE.
• Tener un amplio conocimiento del uso del sistema ROS.
• Poseer una configuración de robot que sea capaz de eludir eficazmente
los obstáculos.
1.5. Metodología
Investigación sobre ROS: se INVESTIGARA la documentación necesaria de
ROS para poder utilizarla de buena manera en el desarrollo de la misma.
Diseño e implementación de algoritmos en el robot: se agregaran los
componentes necesarios a la plataforma TurtleBot y probarlos para su buen
desempeño.
Implementar algoritmos de control: una vez ensamblados, se procederá a
desarrollar los algoritmos de control en el lenguaje c++ e implementarlos en
cada uno de los robots.
Comparativa en la navegación del robot: con los algoritmos implementados y
desarrollados, se evaluará según los parámetros cuál de las dos
configuraciones es más precisa.
jgallardo� 25-12-15 12:52Eliminado: leerá
5
1.6. Recursos necesarios
Se presenta a continuación la clasificación de los recursos estimados que se
utilizarOn durante todo el desarrollo del trabajo de tesis.
1.6.1. Recursos de hardware
Para el desarrollo de las plataformas robóticas se dará uso a dos robot
TurtleBot, los cuales se encuentran disponibles en el departamento, para una
de las configuraciones se usaran siete sensores ultrasónicos PING y conectores
para los mismos, una tarjeta Arduino, la cual se encargara de enviar la
información de los sensores al computador central. Para la plataforma con la
baliza laser solo se usara un láser Hokuyo urg-04lx, que también se encuentra
disponible en el laboratorio.
Para la implementación de algoritmos en el robot, se utilizará un computador
personal provisto por el estudiante, de esta forma se facilitará el uso del mismo
fuera del laboratorio.
1.6.2. Recursos de software
En el desarrollo del trabajo de tesis, se utilizará mayoritariamente software de
código libre, como:
• Sublime text, el cual es un editor de código multiplataforma que puede
soportar múltiples lenguajes.
• ROS el cual es un framework utilizado para el desarrollo de aplicaciones
robóticas, de este modo se libera el uso de licencias especiales.
jgallardo� 25-12-15 12:55Comentario [5]: NO ES UN ANTEPROYECTO, LA TESIS YA TERMINO, NO OUEDE REDACTAR EN FUTURO
jgallardo� 25-12-15 12:53Eliminado: á
jgallardo� 25-12-15 12:53Comentario [6]: NO ES FUTURO, ES PASADO
jgallardo� 25-12-15 12:54Comentario [7]: USARON
jgallardo� 25-12-15 12:54Comentario [8]: PASADO NO FUTURO
jgallardo� 25-12-15 12:55Comentario [9]: IDEM,
6
1.6.4. Recursos humanos
Se muestra en la Tabla 1-1 los recursos humanos asociados al proyecto.
Tabla 1-1 Recursos Humano del Proyecto
Nombre Rol Institución
Juan Errickson Vargas Estudiante Memorista Universidad Católica
del Norte José Gallardo Arancibia Profesor Guía
1.6.5. Recursos de información
Se utilizÓá como base Del estudio la documentación de ROS, la cual se
encuentra disponible en línea, además de los manuales del hardware a utilizar.
1.7. Contenido de la memoria
El documento se estructura en ocho capítulos y cuatro anexos:
• CAPÍTULO I: Introducción. Se presenta el trabajo de tesis a desarrollar,
justificación, objetivos, descripción, resultados esperados, metodología, y
recursos necesarios estimados.
• CAPÍTULO II: Estado del arte. Conceptos asociados a la robótica móvil y
la navegación reactiva, también se comenta sobre los aspectos técnicos
de hardware y software relacionados al trabajo tesis.
• CAPÍTULO III: Diseño de configuraciones de robot. Se exponen las dos
configuraciones propuestas y como deberán componerse para un
adecuado funcionamiento de cada uno de ellos.
• CAPÍTULO IV: Implementación de los algoritmos. Se definen los
algoritmos en la presente tesis, los que incluyen el algoritmo de
jgallardo� 25-12-15 12:56Eliminado: utilizará
7
desplazamiento y el algoritmo del funcionamiento del comunicador
Arduino.
• CAPÍTULO V: Comparación de las configuraciones. En este apartado, se
explican las métricas, se explica su obtención y se realiza la comparación
y el análisis de los datos.
• CAPÍTULO VI: Conclusiones. Síntesis del trabajo realizado, objetivos
alcanzados, aportes generales, y trabajo futuro.
• ANEXO A: Código implementado en el uso de la baliza laser,
comentando los detalles de su funcionamiento.
• ANEXO B: Código implementado en el uso del anillo de sensores
ultrasónicos, comentando los detalles de su funcionamiento.
• ANEXO C: Código utilizado en la comunicación de los sensores a ROS
mediante Arduino, con la documentación necesaria.
8
CAPÍTULO II ESTADO DEL ARTE
2.1. Marco Teórico
La robótica es una ciencia presente en la humanidad desde la antigüedad, la
cual ha evolucionado en el tiempo. En este apartado se profundizará en la
robótica móvil, en la navegación reactiva y el funcionamiento de ROS.
2.1.1. Robótica Móvil
En la actualidad, según su morfología, los robots se pueden clasificar en cuatro
tipos: Robot industrial, Robot móviles, Androides y Zoomórficos. Cuando un
robot puede desplazarse autónomamente o no por cualquier medio, se habla de
robótica móvil, este tipo de robots pueden desplazarse gracias a su morfología
la cual puede poseer, ruedas, patas, propulsores, hélices entre otros, además
de poseer un sistema de suministro energético propio, ya sea por
almacenamiento en baterías o paneles solares. Aunque estas características
les permiten moverse de forma autónoma, esto por sí solo no es suficiente para
desplazarse, requieren poseer sensores externos que les permitan observar su
entorno y algoritmos que conformen su lógica interna (Ruiz de Garibay Pascual,
2007).
Los robots móviles pueden operar en diversos ambientes, algunos peligrosos
para el humano. Realizando tareas repetitivas que requieren precisión y
apoyando las tareas de búsqueda y rescate así como también sirviendo a
personas con capacidades disminuidas (Ruiz de Garibay Pascual, 2007).
Las principales líneas investigativas en robótica móvil se centran en mejorar los
diseños físicos, estudiando los componentes, la cinemática y dinámica para
aprovechar de mejor manera las fuerzas intrínsecas, mejorar la gestión
9
energética, algoritmos que permitan la toma de decisiones inteligentes y
utilización de sensores tanto para la navegación como para la medición de
factores ambientales (Ruiz de Garibay Pascual, 2007).
Como los robots móviles operan en un ambiente de alta complejidad, se ha
recurrido a la utilización de técnicas de control más avanzadas, que le
posibilitan trabajar en condiciones de imprecisión e incertidumbre, reaccionando
de forma rápida frente a los obstáculos, y también poder definir, de manera
autónoma sub tareas que contribuyan a alcanzar su objetivo primario
2.1.2. Navegación reactiva
La navegación reactiva, tiene una relación directa de las entradas de los
sensores con la salida de sus actuadores, sin que exista un bloque de
planificación, este paradigma puede resumirse en una relación bilateral entre
percibir – actuar. La gran ventaja que presenta esta navegación es su rápida
respuesta frente a su entorno y los cambios que hay en él (ambiente dinámico).
2.2. ROS (Sistema Operativo Robótico)
ROS (XXXXXX) el sistema operativo robótico, con sus siglas en inglés, es un
framework muy flexible para el desarrollo de proyectos robóticos, es una
colección de herramientas, bibliotecas y convenciones LAl cual tiene como
objetivo simplificar la tarea de crear comportamientos complejos y robustos para
una amplia gama de plataformas robóticas.
La estructura del sistema ROS fue desarrollada de manera modular y muy
distribuidos todos sus componentes, para así lograr que los usuarios puedan
utilizar tanto o tan poco de ROS como deseen. Esto sirve PARA que los
programas puedan ser más livianos al sacar los componentes que no se utilicen
en un desarrollo.
jgallardo� 25-12-15 13:01Eliminado: e
jgallardo� 25-12-15 13:01Eliminado: a
10
La misma cualidad apoya a que una gran cantidad de usuarios en la comunidad
se conviertan en contribuyentes al sistema, aportando paquetes al ecosistema
de ROS apoyando así tanto proyectos industriales o nuevos algoritmos.
2.2.1. Componentes centrales
Si bien no podemos proporcionar una lista exhaustiva de lo que hay en el
ecosistema ROS, podemos identificar algunas de las partes centrales de ROS y
hablar de su funcionalidad, las especificaciones técnicas y de calidad con el fin
de darle una mejor idea de lo que ROS puede contribuir a su proyecto.
2.2.1.1. Comunicación e Infraestructura
En la capa más baja, ROS ofrece una interfaz de traspaso de mensajes que
proporciona comunicación entre procesos y que comúnmente se conoce como
un middleware.
El middleware ROS ofrece estas instalaciones:
• publicación/suscripción para traspaso de mensajes anónimos
• grabación y reproducción de mensajes
• petición/respuesta de llamadas a procedimiento remoto
• sistema de parámetros distribuidos
2.2.1.1.1. Traspaso de mensajes anónimos
Un sistema de comunicación es a menudo una de las primeras necesidades
que surgen en la aplicación de una nueva aplicación de robot. El sistema de
mensajería construido y testeado de ROS ahorra tiempo mediante la gestión de
los detalles de la comunicación entre nodos distribuidos a través del mecanismo
anónimo de publicación/suscripción. Otra ventaja de utilizar un mensaje del
sistema que pasa, es que obliga a implementar interfaces claras entre los
nodos en el sistema, mejorando así la encapsulación y la promoción de la jgallardo� 25-12-15 13:03Eliminado: te
11
reutilización de código. La estructura de estas interfaces de mensajes se define
en el mensaje de IDL (Interface Description Language).
Los nodos se comunican entre sí mediante la publicación de mensajes a los
tópicos. Un mensaje es una estructura de datos simple, que comprende los
campos con tipo. Se admiten tipos primitivos estándar (enteros, punto flotante,
booleanos, etc.), así como los arreglos de tipos primitivos. Los mensajes
pueden incluir estructuras anidadas arbitrariamente y matrices (muy similar a
las estructuras en C).
2.2.1.1.2. Grabación y reproducción de mensajes
Debido a que el sistema de publicación/suscripción es anónimo y asincrónico,
los datos pueden ser capturados y reproducen fácilmente sin cambios en el
código. Digamos que SE tiene una tarea que lee datos de un sensor, y está
desarrollando Tarea B que procesa los datos producidos por el Grupo A. ROS
hace que sea fácil de capturar los datos publicados por el Grupo A en un
archivo, y luego volver a publicar los datos A presentar en un momento
posterior. La abstracción de paso de mensajes permite LA Tarea B sea
agnósticA con respecto a la fuente de los datos, que podría ser de tareas A o el
archivo de registro. Este es un patrón de diseño de gran alcance que puede
reducir significativamente el esfuerzo de desarrollo y promover la flexibilidad y
modularidad en su sistema.
2.2.1.1.3. Llamadas a procedimiento remoto
La naturaleza asincrónica de la petición y respuesta de mensajería funciona
para muchas necesidades de comunicación en robótica, pero a veces se quiere
interacciones sincrónicas petición y respuesta entre los procesos. El middleware
ROS proporciona esta capacidad usando los servicios. Al igual que los tópicos,
los datos que se envían entre los procesos en una llamada de servicio se
definen con el mismo sencillo mensaje de IDL.
jgallardo� 25-12-15 13:04Eliminado: s
jgallardo� 25-12-15 13:04Eliminado: de la
jgallardo� 25-12-15 13:05Eliminado: o
jgallardo� 25-12-15 13:06Comentario [10]: REDACTAR DE UNA MANERA MAS CLARA Y EXTENSA
12
2.2.1.1.4. Sistema de parámetros distribuidos
El middleware ROS también proporciona una forma en la que las tareas de
compartir información de configuración a través de un almacén global de
valores. Este sistema le permite modificar fácilmente los parámetros de tarea, e
incluso permite que las tareas puedan cambiar la configuración de otras tareas.
2.2.1.2. Características específicas de los robots
Además de los componentes del middleware central, ROS proporciona
bibliotecas para especificaciones de robot comunes y herramientas que harán
que UN robot esté en funcionamiento rápidamente. Éstas son sólo algunas de
las capacidades del robot específico que ROS proporciona:
• Formato de mensajes estándar para robots
• Biblioteca de Geometría para Robot
• Idioma de la Descripción del Robot
• Llamadas apropiadas a procedimientos remotos
• Diagnóstico
• Pose, estimación de localización, cartografía y navegación
2.2.1.2.1. Formato de mensajes estándar para robots
Tras años de distribución y desarrollo de la comunidad SE ha dado lugar a un
conjunto de formatos de mensaje estándar, los cuales cubren la mayor parte de
los casos de uso común en la robótica. Hay definiciones de mensajes para
conceptos geométricos como poses, trasformaciones y vectores; para sensores
cámaras, IMU (Unidad de Medición Inercial del inglés Inertial Measurement
Unit) y el láser: y para los datos de navegación como odometría, rutas y mapas;
entre muchas otras. Mediante el uso de estos mensajes estándar en su
aplicación, el código desarrollado se puede interoperar sin problemas con el
jgallardo� 25-12-15 13:08Eliminado: su
jgallardo� 25-12-15 13:09Eliminado: n
13
resto del ecosistema ROS, desde herramientas de desarrollo para las
bibliotecas de las capacidades de robot.
2.2.1.2.2. Biblioteca de Geometría para Robot
Un reto común en muchos proyectos de robótica es mantener un seguimiento
de dónde están las diferentes partes del robot con respecto a otras. Por
ejemplo, si se necesita combinar los datos de una cámara con los de un láser,
lo que SE necesita saber ES en qué lugar se encuentra cada sensor, en un
marco de referencia común. Este problema es especialmente importante para
robots humanoides con muchas partes móviles. SE Aborda este problema en
ROS con la biblioteca tf, la cual no perderá de vista ninguna parte móvil del
sistema robótico.
Diseñado Y pensando en la eficacia, la biblioteca tf se ha utilizado para la
administración de los datos de transformación de coordenadas para robots con
más de un centenar de grados de libertad y las tasas de actualización de
cientos de hz (Hertz). La biblioteca tf permite definir las transformaciones
estáticas, tales como una cámara que está fijadA a una base móvil y las
transformaciones dinámicas, tales como un conjunto en un brazo robótico. La
biblioteca tf también maneja el hecho de que los productores y consumidores
de esta información se pueden distribuir a través de la red, y el hecho de que la
información se actualiza a diferentes velocidades.
2.2.1.2.3. Idioma de la Descripción del Robot
Otro problema común DE LA robótica QUE ROS soluciona, es cómo describir
UN robot de forma legible por máquina. ROS proporciona un conjunto de
herramientas para describir y modelar UN robot para que pueda ser entendido
por el resto de su sistema ROS, incluyendo la librería tf, robot_state_publisher y
rviz. El formato para la descripción de UN robot en ROS es URDF (Unified
Robot Descripción Format), que consiste en un documento XML en el que EL
jgallardo� 25-12-15 13:10Eliminado: son
jgallardo� 25-12-15 13:10Eliminado: las
jgallardo� 25-12-15 13:11Eliminado: A
jgallardo� 25-12-15 13:11Eliminado: mos
jgallardo� 25-12-15 13:11Eliminado: o
jgallardo� 25-12-15 13:12Eliminado: que la
jgallardo� 25-12-15 13:12Eliminado: su
jgallardo� 25-12-15 13:13Eliminado: tu
jgallardo� 25-12-15 13:13Eliminado: su
jgallardo� 25-12-15 13:14Comentario [11]: DEBE PERSONALIZAR LA DESCRIPCION, Parece una traducción o copia de un manual
jgallardo� 25-12-15 13:14Eliminado: usted
14
USUARIO describe las propiedades físicas de SU robot, de la longitud de las
extremidades y tamaños de ruedas para la ubicación de los sensores y de la
apariencia visual de cada parte del robot.
Una vez definido de esta manera, el robot se puede utilizar fácilmente con la
librería del tf, dictada en tres dimensiones para una buena visualización, y se
utiliza con los simuladores y los planificadores de movimiento.
2.2.1.2.4. Llamadas apropiadas a procedimientos remotos
Mientras que los tópicos (publicación/suscripción anónima de mensajes) y
servicios (llamadas a procedimiento remoto) cubren la mayoría de los casos de
uso de la comunicación en la robótica, a veces se necesita para iniciar un
comportamiento de búsqueda de metas, monitorear su progreso, capaz de
anticiparse a lo largo del camino, y recibir una notificación cuando se ha
completado. ROS proporciona acciones para este propósito. Acciones son
como los servicios, salvo que puedan informar sobre los progresos antes de
devolver la respuesta final, y se puede interrumpir por quien le llama. Así, por
ejemplo, puede instruir a su robot para desplazarse a algún lugar, monitorear su
progreso en su intento de llegar allí, detener o redirigirlo a lo largo del camino, y
que le digan cuando ha tenido éxito (o fracaso). Una acción es un concepto
poderoso que se utiliza en todo el ecosistema de ROS.
2.2.1.2.5. Diagnóstico
ROS proporciona una forma estándar para producir, recopilar y agregados
diagnósticos acerca de su robot de forma que, a simple vista, se puede ver
rápidamente el estado de su robot y determinar la forma de abordar los
problemas que se presenten como se ve en la Figura 2.1.
jgallardo� 25-12-15 13:14Eliminado: su
jgallardo� 25-12-15 13:16Comentario [12]: ¿?
15
Figura 2.1 Diagnósticos para robot
2.2.1.2.6. Pose, estimación de localización, cartografía y navegación
ROS también proporciona algunas "baterías incluidas" las que ayudan a
empezar a trabajar en algunos proyectos de robótica. Hay paquetes de ROS
que resuelven problemas de robótica básicas como la estimación de la pose,
localización en un mapa, la construcción de un mapa, e incluso la navegación
móvil.
Ya sea que un ingeniero busque para hacer una investigación y un desarrollo
rápido, algún investigador de robótica con ganas de conseguir su investigación
realizada en el momento oportuno, o un aficionado que quiera aprender más
acerca de la robótica, estas ayudas facilitaran a hacer más, con menos
esfuerzo.
jgallardo� 25-12-15 13:17Comentario [13]: MEJORAR CALIDAD DE LA IMAGEN
jgallardo� 25-12-15 13:17Comentario [14]: ¿?
16
2.2.1.3. Herramientas
Uno de los rasgos más característicos de ROS es el poderoso conjunto de
herramientas de desarrollo. Estas herramientas apoyan la introspección, la
depuración, el trazado, y visualizar el estado del sistema que se está
desarrollando. El mecanismo de publicación/suscripción subyacente permite
introspección espontáneamente a los datos que fluyen a través del sistema, por
lo que es fácil de comprender y depurar problemas que se produzcan. Las
herramientas de ROS se aprovechan de esta capacidad de introspección a
través de una extensa colección de utilidades de línea de gráficas y de
comandos que simplifican el desarrollo y depuración.
2.2.1.3.1. Línea de comandos
ROS puede utilizar 100% sin la necesidad de una GUI (Interfaz gráfica de
usuario traduciendo sus siglas en ingles). Todas las herramientas de
funcionalidad del núcleo y de introspección, se puede acceder por una las más
de 45 herramientas de línea de comandos. Hay comandos para lanzar grupos
de nodos; introspección tópicos, servicios y acciones; datos de grabación y
reproducción; y una serie de otras situaciones.
2.2.1.3.2. RVIZ
Tal vez ES la herramienta más conocida en ROS, rviz la cual proporciona
propósitos generales, la visualización tridimensional de muchos tipos de datos
del sensor y cualquier robot URDF-descrito.
RVIZ puede visualizar muchos de los tipos de mensajes comunes previstos en
ROS, como escáneres láser, nubes de puntos tridimensionales, y las imágenes
de la cámara. También utiliza la información de la biblioteca tf para mostrar
todos los datos de los sensores en un sistema de coordenadas común de su
elección, junto con una representación tridimensional de su robot. Visualización
jgallardo� 25-12-15 13:19Comentario [15]: ¿?
17
de todos sus datos en la misma aplicación no sólo se ve impresionante, pero
también le permite ver rápidamente lo que ve a su robot, e identificar
problemas, como desajustes de sensores o inexactitudes modelo de robot.
2.2.1.3.3. RQT
ROS ofrece rqt, un marco basado en Qt para el desarrollo de interfaces gráficas
para los robots. SE puede crear interfaces personalizadas ensamblando y
configurando la extensa biblioteca de plugins RQT en pestañas, pantalla
dividida y otros diseños. También puede introducir nuevos componentes de la
interfaz de escribir sus propios plugins RQT.
El rqt_graph plugin proporciona la introspección y la visualización de un sistema
de ROS en directo, que muestran los nodos y las conexiones entre ellos, y lo
que le permite fácilmente depuración y entender su sistema de funcionamiento
y cómo se estructura, tal como muestra la Figura 2.2.
Figura 2.2 RQT_GRAPH muestra relaciones de nodos en un programa en ejecución.
jgallardo� 25-12-15 13:20Comentario [16]: MEJORAR REDACCION
jgallardo� 25-12-15 13:21Eliminado: P
18
Con la rqt_plot plugin, se puede monitorear codificadores, tensiones, o cualquier
cosa que se pueda representar como un número que varía con el tiempo. El
plugin rqt_plot le permite elegir el backend de trazado (por ejemplo, matplotlib,
Qwt, pyqtgraph) que mejor se adapte a sus necesidades, como se ve en la
Figura 2.3.
Figura 2.3 RQT_PLOT grafica tópicos en directo
Para el seguimiento y el uso de tópicos, usted tiene la rqt_topic y rqt_publisher
plugins. El primero le permite supervisar e introspección de cualquier cantidad
de tópicos que se haya publicado dentro del sistema. Este último le permite
publicar sus propios mensajes a cualquier tópico, lo que facilita la
experimentación ad-hoc con el sistema.
Para el registro y reproducción de datos, ROS utiliza el formato bag. Los
archivos bag se pueden crear y acceder de forma gráfica a través del plugin
jgallardo� 25-12-15 13:22Comentario [17]: ADAPTAR LA REDACCION, NO ES UNA VENTA DE PRODUCTO NI COPIA DE UN MANUAL
19
rqt_bag. Este plugin puede registrar los datos de los bag, llevarlo de vuelta a los
tópicos seleccionados de un bag, y visualizar el contenido de un bag,
incluyendo la visualización de imágenes y de trazado de los valores numéricos
en el tiempo.
20
2.4. Turtlebot
¿Qué es un turtlebot? Turtlebot kit de robot personal con el software de código
abierto de bajo costo. Con turtlebot, se es capaz de programar un robot que
puede navegar dentro de su casa, ver en 3D, y tiene suficiente potencia para
crear aplicaciones interesantes.
2.4.1. Hardware
Con respecto a su hardware incluye una base iClebo Kobuki, la cual es una
base de investigación móvil de bajo costo diseñado para la educación y la
investigación sobre el estado del arte de la robótica. Con un funcionamiento
continuo en mente, Kobuki ofrece fuentes de alimentación para un ordenador
externo, así como sensores adicionales y actuadores. Su odometría de alta
precisión, con un giroscopio calibrado de fábrica, permite una navegación
precisa.
Con respecto a su autonomía, cuenta con una batería de entre 4 y 5 horas lo
cual tiene una importancia muy grande, ya que permite trabajar un largo tiempo
sin preocuparse de la carga de la batería.
La base Kobuki no puede hacer nada por sí mismo, para que pueda tan solo
moverse, necesita alguna unidad de procesamiento, esto puede ser un
notebook u otra tarjeta de cómputo.
Esta plataforma también incluye un sensor Kinect de Microsoft, esta es muy
importante para el robot, ya que provee la posibilidad de tener visión en 3D, ya
que este sensor funciona con una cámara normal y sensor de profundidad.
Además este robot incluye una variedad de plataformas donde se montan los
dispositivos externos, las cuales vienen con sus respectivos diseños para su
creación si se necesitasen más.
jgallardo� 25-12-15 13:24Eliminado: de trabajo
21
2.4.2. Software
Para el desarrollo de aplicaciones posee una SDK para el mismo, está
disponible tanto para Windows como para Linux, además posee un nodo en
ROS eL que es capaz de trabajar eficazmente con este robot, especialmente se
tendrá un enfoque importante en ROS, ya que será el utilizado en este trabajo.
El nodo en ROS, además de servir para implementar códigos propios, trae una
variada muestra de ejemplos, donde se puede aprender las cosas que es capaz
de realizar y aprender de las mismas para trabajos futuros
Cabe destacar que el proyecto es de código abierto, por lo tanto cada uno
puede generar sus propios drivers para el desarrollo de cada proyecto con los
dispositivos que se quieran.
2.5. Hokuyo láser
En especial se utilizó el láser modelo URG-04LX el cual es un sensor de
escaneo de área. La fuente de luz del sensor es un láser infrarrojo de 785nm de
longitud de onda con la clase 1 de seguridad láser. El área de exploración es de
240º un semicírculo con una distancia máxima de radio de 4000mm, como se
ve en la Figura 2.4. El ángulo de paso es 0.36º y el sensor calcula la distancia
en todos los puntos (683 pasos). Diámetro del haz láser es inferior a 20 mm en
2000 mm con la máxima 40mm a los 4000mm.
jgallardo� 25-12-15 13:25Eliminado: n
22
Figura 2.4 abanico de acción de la baliza láser
Principalmente de medición de la distancia se basa en el cálculo de la diferencia
de fase del haz, debido a lo cual es posible obtener una medición estable con
influencia mínima de color y reflectancia del objeto.
2.6. Arduino
Arduino es una plataforma de prototipos de código abierto basado en hardware
y software fácil de usar. Las placas Arduino son capaces de leer la luz en un
sensor, un botón presionado, o un mensaje de Twitter y lo convierten en una
salida, la activación de un motor, encender un LED, publicar algo en línea. Para
ello se utiliza el lenguaje de programación de Arduino (basado en Wiring), y el
software de Arduino (IDE), basado en Processing.
23
CAPÍTULO III DISEÑO DE CONFIGURACIONES DE ROBOT
Dentro del trabajo de tesis realizado se ha definido la robótica móvil como “…un
robot puede desplazarse autónomamente o no por cualquier medio…”. Se
considera un robot móvil según esta descripción el robot TurtleBot, ya que
posee ruedas para desplazarse por suelo e indoor.
Cuando se habla del diseño de configuraciones de robot, se tiene en
consideración que una plataforma robótica, para el presente caso el kit de
desarrollo turtlebot, será el seleccionado para el trabajo, esto ya que por su
versatilidad y fácil implementación en la librería ROS, acelera todo trabajo.
Las configuraciones del robot son las siguientes:
• Anillo ultrasónico: anillo de sensores ultrasónicos que rodea el robot
• Baliza laser: sensor laser que gira para realizar mediciones en su
entorno
Arduino
3.1. Anillo Ultrasónico
Como su nombre lo dice es un anillo, pero para el caso actual solo es medio
circulo, en este se situaron 7 sensores PING))). El sensor PING es un sensor
especializado en medir la distancia a los objetos que se encuentran frente a él,
su alcance es entre 2 cm y 3 mt, trabaja realizando mediciones ultrasónicas por
lo tanto funciona bien en cualquier condición lumínica.
Como se puede ver en la Figura 3.1, el sensor posee 3 pines, donde el de la
izquierda se debe conectar a tierra, el del centro se debe conectar a una fuente
de alimentación de +5VDC y el tercer pin es el de señal, es el que recibe la
instrucción de funcionar para medir las distancias.
jgallardo� 25-12-15 13:29Comentario [18]: ¡?
24
Figura 3.1 PING))) de Parallax Para darle soporte al sensor y poder montarlo en el robot, se debió colocar en
un soporte protector como se ve en la Figura 3.2, así impidiendo su movimiento
al momento de desplazar al robot de su posición
Figura 3.2 Soporte protector de PING)))
25
Los sensores se montaron en el robot tal como muestra la Figura 3.3
Figura 3.3 Protectores con sensores montados en el robot
Para que el robot pueda obtener los datos de cada uno de los sensores, se
debió utilizar una placa Arduino, la cual sirvió como medio de comunicación
entre la unidad de procesamiento central y los sensores.
Gracias a que ROS es un sistema de código abierto y Arduino una placa de
código y hardware abierto, existe una librería de desarrollo de ROS orientada a
Arduino, esta se encarga de realizar publicaciones mediante tópicos, los cuales
se pueden leer desde cualquier aplicación corriendo en ROS, en el Anexo C se
encuentra el código documentado para su mejor comprensión.
26
Una vez implementado el programa que publica las mediciones del anillo, se
creó el programa que lee esos datos y genera la respuesta a dichas acciones.
Para esto se debió utilizar un lector de tópicos, el cual se gatilla cada vez que
se publica una lectura de datos, esto ayuda a que el programa corra con fluidez.
3.2. Baliza laser
La baliza es un sensor laser que gira con cierta velocidad y se encarga de
realizar mediciones en su entorno, entregando así un vector con las distancias
de los objetos en su entorno.
Este sensor provee con la detección de objetos que se encuentran de 3cm a
4mt, que es muy similar a las magnitudes entregadas por el sensor ultrasónico.
El vector de respuesta es de 683 valores, cada medición se realiza con un
ángulo de 0,36 grados.
La conexión del láser al computador central se realiza por conexión USB directa
y la alimentación eléctrica, se realiza mediante el cable RS-232C, el cual se
encuentra conectado a la plataforma Kobuki del turtlebot, que lo alimenta con
+5VDC y un máximo de 1A.
Las mediciones las entrega a través de un tipo datos de sensores laser, que
entrega los valores leídos, los ángulos de lectura y otros parámetros no
relevantes para el trabajo.
Como los laser Hokuyo ya poseen su propia SDK dentro de ROS, la publicación
de los datos, se realiza de manera automática, por lo tanto el programa solo
debe leer los datos.
27
CAPÍTULO IV Implementación de los algoritmos
El algoritmo, se basa en la acción reacción, de ahí el nombre reactivo, es decir
para que se mueva deben ocurrir diversas condiciones. El algoritmo es igual
para ambas configuraciones, en el caso de la baliza laser, se dividió en zonas
para simular un anillo laser. La separación de los sensores ultrasónicos se
puede observar en la Figura 4.1, los cuales están enumerados del 1 al 7.
Figura 4.1 Vista superior de turtlebot con sensores ultrasónicos
28
Para la implementación del algoritmo en Arduino, se debió realizar la conexión
entre sensores y Arduino, que se puede evidenciar en la Figura 4.2.
Figura 4.2 Conexión de los sensores con Arduino.
4.1. Algoritmo de desplazamiento del robot
A continuación se detalla el funcionamiento del algoritmo, esto es independiente
del sensor a utilizar:
• Si todos los sensores muestran distancias mayores a 50 cm, se avanza
en línea recta.
• Si se detecta obstáculo con alguno de los 7 sensores y se puede girar
o Si se detecta un obstáculo en el sensor 4 (frente al robot)
29
§ Si la distancia del sensor 5 es mayor al 3, quiere decir que
el objeto se encuentra más cerca del sensor 3, por lo tanto
se avanza girando a la izquierda
§ Si el 3 es mayor al 5, caso contrario se avanza girando a la
derecha.
§ Si resultasen iguales, se repite el proceso pero con los
sensores 6 y 2, pero ahora se gira en la dirección contraria
del objeto más próximo.
o Si el sensor 1 o 2 muestra un objeto, se gira avanzando levemente
a la izquierda.
o Si el sensor 3 muestra un objeto se gira en su propio eje a la
izquierda.
o Si el sensor 5 se encuentra con un objeto, se gira a la derecha.
o Si los sensores 6 o 7 muestran un objeto, se avanza girando a la
derecha.
• En el caso que se detecte el objeto por más de un sensor a la vez
o Si el objeto está a la derecha y se puede girar, se gira a la
izquierda
o Si el objeto está a la izquierda y se puede girar, se gira a la
derecha
o En caso contrario, se verifica para que lugar está la mayor parte
del objeto y se gira en sentido contrario constantemente por unos
segundos.
• Se puede producir un movimiento denominado “pinponeo” que se puede
generar en ciertas instancias por el robot con algunos giros, es decir, si
gira a la derecha y después a la izquierda y lo repite, se queda atrapado
en un ciclo constante y se queda en un pinponeo constante. Para ello se
cuenta cada vez que gira a la derecha o izquierda sin haber avanzado en
30
línea recta, si se pinponea más de 4 veces, se obliga al robot a avanzar
un poco para que pueda salir de ese estado.
• Finalmente se realiza el movimiento solicitado mediante un publicador,
que se encarga de decirle a la base turtlebot, en qué sentido debe girar o
avanzar.
4.2. Algoritmo de comunicación Arduino
Para el programa del Arduino, el cual se encarga de publicar a ROS los datos
de los sensores ultrasónicos, la lógica es la siguiente:
• En primer lugar se inicializan las variables de publicación, donde se
indica que se publicarÁ un arreglo de 7 posiciones.
• Dentro del loop, el que se encarga de funcionar constantemente, SE
almacena EL valor de cada PING en el arreglo, llamando a la función que
calcula la distancia
o Para calcular la distancia, en primer lugar se declara el
TERMINAL del PING como una salida de datos en el que se envía
un pulso bajo para limpiar la señal, 2 milisegundos después se
envía una señal alta posterior a ello se mide el tiempo que demora
en retornar el ultrasonido al sensor y se calcula la distancia a cm.
• Luego de leer los 7 sensores se publica a ROS el arreglo de datos,
donde estará listo para su lectura.
NADA DEL LASER?????????????
jgallardo� 25-12-15 18:48Eliminado: ros
jgallardo� 25-12-15 18:48Eliminado: a
jgallardo� 25-12-15 18:49Eliminado: cada
jgallardo� 25-12-15 18:49Eliminado: pin
31
CAPÍTULO V Comparación de las configuraciones
5.1. Métricas
Para realizar la comparación entre ambas configuraciones hace falta definir
métricas para la decisión de cuál de las configuración de robot es mejor EN
CUANTO A QUÉ, para ello se tendrán en cuenta los siguientes tópicos
• Cantidad de choques
• Cantidad de veces que se debió corregir manualmente el robot
5.1.1. Cantidad de choques
La cantidad de choques se contabilizo manualmente, para cada robot por
separado se contó cuantas veces se interceptó con algún objeto del laboratorio,
esto sirve para saber si el algoritmo funciona mejor evadiendo obstáculos con el
láser o con el anillo de sensores ultrasónicos, ya que en un ambiente real, se
espera que un robot avance fluidamente sin tener que pasar por la colisión con
obstáculos, los cuales podrían dañar física o afectar la navegación autónoma
del mismo.
5.1.2. Cantidad de veces que se debió corregir el robot
Esta métrica sirve para medir la cantidad de veces que el robot se queda
atrapado en algún lugar del laboratorio. Esto es ya que si el robot se llegase a
quedar atrapado en su recorrido, representa que el sensor realizo una mala
medida y no detecto algún objeto. Un ejemplo de esto puede ser una esquina,
en las esquinas si el robot llega, detectara objetos al frente, a la izquierda y a la
derecha, siendo que en la lógica del algoritmo se tienen en cuenta estos casos,
jgallardo� 25-12-15 18:54Comentario [19]: ES EL ESCENARIO EXACTAMENTE EL MISMO?, POR EJEMPLO UN LABERINTO SERÍA EL MISMO ESCENARIO, PERO NO OTRO PUES LOS DESPLAZAMIENTOS PUEDEN SER DIFERENTES
jgallardo� 25-12-15 18:52Comentario [20]: DEFINIR METRICAS MAS ACADÉMICAS
jgallardo� 25-12-15 18:53Comentario [21]: COLICIONES ES UN TERMINO MAS ACADÉMICO
jgallardo� 25-12-15 18:55Comentario [22]: ESTO NO DEPENDE DEL ALGORITMO DE CONTROL???
32
la mala lectura por parte de los sensores, podría provocar que el algoritmo falle
igualmente. Un caso más complejo es encontrarse en un callejón angosto y sin
salida, donde tendría la misma situación pero con menos espacio para
maniobrar.
5.2. Obtención de métricas
Para la medición, se ejecutó el algoritmo en cada robot por 5 minutos y se
observó su funcionamiento, donde se contó la cantidad de choques y la
cantidad de correcciones de recorrido que debió aplicársele a cada uno, en la
tabla 5.1 se puede observar los datos obtenidos en ambos recorridos.
Tabla 5-1 Tabla con conteo de métricas
Robot Choques Corregir
Anillo Ultrasónico 6 3
Baliza laser 1 0
De la tabla, se puede extraer que la baliza laser navegó mejor con el algoritmo,
ya que chocó menos y no se le debió corregir la navegación ya que no se
quedó atrapado en ningún lugar.
Se puede obtener de la tabla 5.1, que ambos sensores al tener funcionamientos
de manera casi igual, siguen siendo distintos y con una precisión distinta, en el
caso de la baliza, al hacer la separación en 7 sensores, se puede deducir que
cada uno de ellos mide las distancias en todo su espectro, es decir que como el
láser tiene un rango de acción de 240° al dividirlo entre 7 se obtiene 34°
aproximadamente, el paso entre lectura y lectura es de 0,36° lo que nos genera
95 lecturas, además se tiene que el algoritmo solo considera a los objetos que
se encuentran a una distancia máxima de 50 centímetros, utilizando el teorema
del coseno al triángulo formado por estos valores tal como se ve en la figura
33
5.1, se obtiene que el objeto más pequeño que se podría observar es de un
grosor de 0,314 centímetros, teniendo en cuenta esto, la mayor parte de las
cosas en el laboratorio, por no decir todo, tiene un grosor mayor a los 3
milímetros, por ende el láser detectara a la gran mayoría de los objetos en el
laboratorio.
Figura 5.1 Triángulo formado en la medición laser
Con respecto al sensor ultrasónico presenta problemas en cierta lectura de
objetos, unO de ellos es que la superficie a medir debe estar en un ángulo no
mayor a 45 grados desde la perpendicular al objeto, por lo tanto podría no
detectar algunos objetos, como se ve en la Figura 5.2.
Figura 5.2 Sensor ultrasónico sin detectar objeto.
jgallardo� 25-12-15 18:57Eliminado: a
35
CAPÍTULO VI CONCLUSIONES
uN robot móvil autónomo hoy en día, se puede utilizar en todo ámbito, desde la
ayuda humanitaria, por ejemplo en el desminado de minas anti personales, o en
la domótica, en este ámbito son robots que ayudan a las tareas domésticas, o
en empresas, donde pueden transportar materiales que sean nocivos para los
seres humanos. Si bien son ámbitos muy distintos, todos se encuentran
centrados en que necesitan robots que sean capaces de desplazarse y Y CON
CAPACIDAD DE detección Y EVASION de objetos en un entorno cerrado de
manera autónoma.
La evasión de obstáculos autónoma no es nada trivial, esto dependerá de la
complejidad del algoritmo de control, esto puede variar de un control reactivo a
algo más complejo como puede ser el control a través de detección de patrones
mediante redes neuronales u otro método más complejo.
La complejidad del desarrollo del trabajo no radicó en la complejidad del
algoritmo, si no en el buen uso de ROS, el cual al ser usado como un
middleware, abstrae todo el código relacionado con el hardware del robot, lo
que facilitó mucho el desarrollo del algoritmo de control.
El autoaprendizaje y autoconocimiento respecto a las fortalezas y habilidades
blandas promovidas por la Universidad en conjunto con la entrega de
conocimientos técnicos, se vieron reflejados durante todo el desarrollo e
implementación del trabajo desarrollado.
6.1. Cumplimiento de los objetivos
En relación al objetivo general del trabajo de tesis, el cuaL indicaba "Realizar
una comparación en la navegación reactiva entre una configuración del robot
TurtleBot con un anillo de sensores ultrasónicos y otra con una baliza laser.
jgallardo� 25-12-15 18:57Eliminado: El uso del
jgallardo� 25-12-15 18:59Con formato: español
jgallardo� 25-12-15 19:00Eliminado: n
36
Esto se realizará con el uso de ROS", se definieron los siguientes objetivos
específicos, detallando el cumplimiento alcanzado en cada uno de ellos.
• Objetivo 1: "Estudiar y profundizar el uso que se le puede dar a ROS
junto al robot TurtleBot". Dentro del marco teórico se realizó un estudio
de la documentación de ROS y TurtleBot, teniendo así un vasto
conocimiento de cómo se comporta el robot y los diversos sensores al
conectarse a ROS.
• Objetivo 2: "Diseñar e implementar las configuraciones de un robot con
anillo ultrasónico y otra con baliza laser". Posterior al estudio dentro del
marco teórico, se presentARON dos diseños de las configuraciones
PARA EL robot, uno con los sensores ultrasónicos en forma de anillo en
torno a la plataforma del robot, para la transmisión de datos a la unidad
de procesamiento se implementó el uso de una tarjeta Arduino para la
adquisición de datos, tal como se expuso en el Capítulo III y el diseño
con láser QUE se instaló en el centro de la plataforma.
• Objetivo 3: "Implementar algoritmos haciendo uso de ROS".
En este punto se detallaron todas las actividades propias del desarrollo
del algoritmo de control, para ello se hizo uso de los conocimientos
adquiridos con el objetivo 1.
• Objetivo 4: “Comparar los resultados de la navegación autónoma
reactiva de ambas configuraciones”
Con los algoritmos ya montados, se procedió a realizar la comparación
entre los resultado, esto mediante las métricas planteadas.
jgallardo� 25-12-15 19:01Eliminado: ó
37
6.2. Trabajo futuro
Como trabajo futuro, se puede generar algoritmos más complejos, de forma que
la navegación sea más eficiente que con una navegación reactiva, esto se
podría realizar mediante algoritmos que utilicen redes neuronales, o control
difuso.
Sin duda, el algoritmo desarrollado ha cumplido con éxito los objetivos
planteados, por lo tanto la base del algoritmo, que es la conexión de sensores a
ROS y la publicación desde ROS al robot, por lo tanto se podría implementar
los algoritmos complejos sobre esa base, lo que facilita el desarrollo del control
eficiente.
38
Bibliografía
[1] ROS.ORG, «ROS,» 2015. [En línea]. Available:
http://www.ros.org/.
[2] Yujinrobot, «KOBUKI | kobuki|waiterbot|shooter,» Yujinrobot,
[En línea]. Available: http://kobuki.yujinrobot.com/. [Último
acceso: 2015].
[3] Open Source Robotics Foundation, Inc., «TurtleBot,» [En
línea]. Available: http://www.turtlebot.com/. [Último acceso:
2015].
[4] HOKUYO AUTOMATIC CO., LTD. All Rights Reserved,
«Scanning range finder URG-04LX | Photo sensor |
PRODUCTS | HOKUYO AUTOMATIC CO.,LTD.,» [En línea].
Available: http://www.hokuyo-
aut.jp/02sensor/07scanner/urg_04lx.html. [Último acceso:
2015].
[5] Parallax Inc., «PING-Sensor-Product-Guide-v2.0.pdf,» [En
línea]. Available:
https://www.parallax.com/sites/default/files/downloads/28015-
PING-Sensor-Product-Guide-v2.0.pdf. [Último acceso: 2015].
[6] A. &. B. I. Gersnoviez, CONTROLADOR PARA
NAVEGACIÓN REACTIVA EVITANDO OBSTÁCULOS
39
MEDIANTE TÉCNICAS NEURO-FUZZY, 2008.
[7] P. R. C. H. &. C. T. E. Medina Varela, OPERACIÓN DE
SISTEMAS AGV (VEHÍCULOS GUIADOS
AUTOMATIZADOS) CON FLUJO ESTATICO, Pereira ,
Colombia, 2009.
[8] A. S. L. C. &. R. M. H. Pedroza Reyes, Control de un
Vehiculo Guiado Automaticamente (AGV)., Aguascalientes,
Mexico., 2007.
[9] J. Ruiz de Garibay Pascual, Robótica: Estado del arte., 2007.
[10] J. &. S. R. Ruiz Del Solar, Introducción a la robótica..
40
ANEXO A Código navegación con laser
#incluye <stdlib.h>
#incluye <time.h> // Librería de ROS #include "ros/ros.h" //Librería para los movimientos de la base Kobuki #include "geometry_msgs/Twist.h" //Clase de mensajes para lectura de laser #include "sensor_msgs/LaserScan.h" //Publicador, encargado de publicar valores de movimiento para el nodo de la base ros::Publisher pub; //Velocidad de desplazamiento de la base float speed = .18; //Velocidad de giro float turn = .5; //Variables para orientación float x = 0; float th = 0; //Variables para movimiento del robot float target_speed = 0; float target_turn = 0; float control_speed = 0; float control_turn = 0; //Movimientos relacionados al robot //la lista siguiente muestra cada uno /* 0: detener 1: avanzar 2: avanzar a la derecha 3: avanzar a la izquierda 4: girar derecha 5: girar izquierda */ int movimiento = 1; int movimientos[6][2] = {{0, 0}, {1, 0}, {1, -1}, {1, 1}, {0, -1}, {0, 1}}; //Flag para saber si el robot debe girar o no bool deboGirar = false; //Contador de giros del robot int giros = 0; //Cuando Gira izquierda o gira derecha, se utilizara para evitar pinponeo del robot
jgallardo� 25-12-15 18:59Eliminado: include
jgallardo� 25-12-15 18:59Eliminado: include
41
int pinPon = 0; /* * Método que a partir del valor de la variable "movimiento", * realiza el movimiento del robot */ static void mover() { x = movimientos[movimiento][0]; th = movimientos[movimiento][1]; target_speed = speed * x; target_turn = turn * th; control_speed = target_speed; control_turn = target_turn; geometry_msgs::Twist twist; //Como el movimiento del robot es solo en 2 dimensiones, se manipulan // la x lineal y z angular. twist.linear.x = control_speed; twist.linear.y = 0; twist.linear.z = 0; twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn; //Se publica en ROS el movimiento del robot pub.publish(twist); } /* * Suma la cantidad de obstaculos en el vector de obstaculos */ int sumaObstaculos(int obs[6]){ int suma = 0; for(int i = 0; i < 6; i++){ suma = suma + obs[i]; } return suma; } /** * Calcula la suma de los 'hexantantes' de la derecha **/ int sumaDerecha(int obs[6]){ int suma = 0; for(int i = 0; i < 3; i++){ suma = suma + obs[i]; } return suma; } /* * Calcula para que dirección debe girar el robot, a partir de los * obstaculos detectados. */
42
void seDebeGirar(int obstaculos[6]) { if(!deboGirar){ pinPon++; if(sumaDerecha(obstaculos)>sumaObstaculos(obstaculos) - sumaDerecha(obstaculos)) { movimiento = 5; deboGirar = true; } else { movimiento = 4; deboGirar = true; } } } /* * Trigger que se ejecuta al recibir una lectura del laser */ void scanValues(const sensor_msgs::LaserScan::ConstPtr& scan_msg)// laser) { int obstaculos [6] = {0,0,0,0,0,0}; //Se pausa la ejecución durante 15 milisegundos ros::Rate loopRate(15); //Es el tamaño del vector de lectura del laser. int tamanio = scan_msg->ranges.size(); //Contador de bloques, los cuales son 6 int bloque = 1; //Se recorre todo el vector de puntos menos la primera lectura y la última for(int i = 1; i < tamanio - 1; i++) { //Si i supera al i hexante if (i >= tamanio / 6 * bloque) { //Se avanza el bloque bloque = bloque + 1; } //Si el valor de lectura es menor a 50 cm y mayor a 25 y si la // medición pertenece al i bloque if(scan_msg->ranges[i] > 0.25 and scan_msg->ranges[i] < 0.5 and i < tamanio / 6 * bloque) { //Se marca que en el bloque existe un obstáculo obstaculos[bloque-1] = 1; } } //Se calcula la cantidad de obstaculos detectados int sumObstaculos = sumaObstaculos(obstaculos);
43
//Si la variable pinpon es mayor a 4, es decir si el robot a girado de // izquierda a derecha o viceversa, sin avanzar. if(pinPon > 4) { //Se setea la variable pinpon a 0 pinPon = 0; //Se cambia el valor de movimiento a 0, para forzar a avanzar al robot movimiento=1; } else { //Si no hay obstaculos se avanza if(sumObstaculos == 0){ movimiento = 1; pinPon = 0; deboGirar = false; } //Si hay 1 obstáculo en algún lugar y no se debe girar. else if(sumObstaculos == 1 && !deboGirar) { //Solo hay un obstáculo en algún 'hexante', se procede con el // movimiento respectivo. if(obstaculos[0] == 1) { movimiento = 3; ROS_INFO("3 del numero 0"); } else if(obstaculos[1] == 1) { movimiento = 3; ROS_INFO("3 del numero 1"); } //Se gira a la derecha y se incrementa en 1 la variable pinpon else if(obstaculos[2] == 1) { movimiento = 4; pinPon++; } //Se gira a la izquierda y se incrementa en 1 la variable pinpon else if(obstaculos[3] == 1) { movimiento = 5; pinPon++; } else if(obstaculos[4] == 1) { movimiento = 2; }
44
else if(obstaculos[5] == 1) { movimiento = 2; } } //Si hay mas de 1 obstáculo else { //Si el total de obstaculos es de la derecha y además no se debe girar if(sumaDerecha(obstaculos) == sumObstaculos && !deboGirar) { movimiento = 5; pinPon++; } //Si el total de obstaculos es de la izquierda y además no se debe girar else if(sumObstaculos - sumaDerecha(obstaculos) == sumObstaculos && !deboGirar) { movimiento = 4; pinPon++; } //Si no se sabe en que sector están la mayor cantidad de obstaculos else { //Se debe girar a la izquierda o derecha seDebeGirar(obstaculos); } } } //Si debe girar, se incrementa la cantidad de giros if(deboGirar) { giros++; } //Si la cantidad de giros es mayor a 15, se da media vuelta if(giros > 15) { deboGirar=false; //Gira en la dirección con mayor cantidad del obstaculos seDebeGirar(obstaculos); //Se setea a 0 la cantidad de giros giros = 0; } //Se llama a la operación mover, la que funciona de acuerdo a las // acciones medidas por el controlador del sensor mover(); //Se llama a dormir el proceso loopRate.sleep(); }
45
//Método inicial del programa int main(int argc, char **argv) { //Se inicia el topico de "mover_laser" ros::init(argc, argv, "mover_laser"); //Mensaje de que inicia el programa std::cout << "Comenzando…" << std::endl; //Se instancia un nodo de ayuda ros::NodeHandle n; //Se llama al publicador del robot Kobuki pub = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop",1); //Espera de 15 milimetros ros::Rate loopRate(15); //Se crea un suscriptor del tópico scan, el cual es publicado por el // nodo Kobuki y llama al metodo scanValues cada 1 publicacion ros::Subscriber subs = n.subscribe("scan", 1, scanValues); //Se mantiene en loop el programa hasta que se cancele por consola ros::spin(); return 0; }
46
ANEXO B Código navegación anillo ultrasónico
#include <stdlib.h> #include <time.h> //Libretita de ROS #include "ros/ros.h" //Librería para los movimientos de la base Kobuki #include "geometry_msgs/Twist.h" //Clase de mensajes para lectura de rango #include "sensor_msgs/Range.h" #include <ros/time.h> //Clase de mensajes para un arreglo de números flotantes #include <std_msgs/Float64MultiArray.h> //Publicador, encargado de publicar valores de movimiento para el nodo de la base ros::Publisher pub; //Velocidad de desplazamiento de la base float speed = .18; //Velocidad de giro float turn = .5; float x = 0; float th = 0; float status = 0; float count = 0; float acc = 0.1; float target_speed = 0; float target_turn = 0; float control_speed = 0; float control_turn = 0; //Movimientos relacionados al robot //la lista siguiente muestra cada uno /* 0: detener 1: avanzar 2: avanzar a la derecha 3: avanzar a la izquierda 4: girar derecha 5: girar izquierda */ int movimiento = 1; int movimientos[6][2] = {{0, 0}, {1, 0}, {1, -1}, {1, 1}, {0, -1}, {0, 1}};
47
//Flag para saber si el robot debe girar o no bool deboGirar = false; //Contador de giros del robot int giros = 0; //Cuando Gira izquierda o gira derecha, se utilizara para evitar pinponeo del robot int pinPon = 0; /* * Método que a partir del valor de la variable "movimiento", * realiza el movimiento del robot */ static void mover() { x = movimientos[movimiento][0]; th = movimientos[movimiento][1]; target_speed = speed * x; target_turn = turn * th; control_speed = target_speed; control_turn = target_turn; geometry_msgs::Twist twist; //Como el movimiento del robot es solo en 2 dimensiones, se manipulan // la x lineal y z angular. twist.linear.x = control_speed; twist.linear.y = 0; twist.linear.z = 0; twist.angular.x = 0; twist.angular.y = 0; twist.angular.z = control_turn; //Se publica en ROS el movimiento del robot pub.publish(twist); } /* * Suma la cantidad de obstaculos en el vector de obstaculos */ int sumaObstaculos(int obs[6]){ int suma = 0; for(int i = 0; i < 6; i++){ suma = suma + obs[i]; } return suma; } /* * Calcula la suma de los 'hexantantes' de la derecha */ int sumaDerecha(int obs[6]){ int suma = 0; for(int i = 0; i < 3; i++){ suma = suma + obs[i]; } return suma;
48
} /* * Calcula para que dirección debe girar el robot, a partir de los * obstaculos detectados. */ void seDebeGirar(int obstaculos[6]) { if(!deboGirar){ pinPon++; if(sumaDerecha(obstaculos)>sumaObstaculos(obstaculos) - sumaDerecha(obstaculos)) { movimiento = 5; deboGirar = true; } else { movimiento = 4; deboGirar = true; } } } /* * Trigger que se ejecuta al recibir una publicación del Arduino */ void scanValues(const std_msgs::Float64MultiArray::ConstPtr& scan_msg) { int obstaculos [7] = {0,0,0,0,0,0,0}; //Se pausa la ejecución durante 15 milisegundos ros::Rate loopRate(15); //Es el tamaño del vector de lectura. int tamanio = 7; //Contador de bloques, los cuales son 7 int bloque = 1; //Se recorre todo el vector de puntos menos la primera lectura y la última for(int i = 0; i < tamanio; i++) { //Si el valor de lectura es menor a 50 cm if(scan_msg->data[i] < 50) { //Se marca que en el bloque existe un obstáculo obstaculos[i] = 1; } } //Se calcula la cantidad de obstaculos detectados int sumObstaculos = sumaObstaculos(obstaculos); //Si la variable pinpon es mayor a 4, es decir si el robot a girado de // izquierda a derecha o viceversa, sin avanzar. if(pinPon > 4)
49
{ //Se setea la variable pinpon a 0 pinPon = 0; //Se cambia el valor de movimiento a 0, para forzar a avanzar al robot movimiento=1; } else { //Si no hay obstaculos se avanza if(sumObstaculos == 0){ movimiento = 1; pinPon = 0; deboGirar = false; } //Si hay 1 obstáculo en algún lugar y no se debe girar. else if(sumObstaculos == 1 && !deboGirar) { //Solo hay un obstáculo en algún 'heptante', se procede con el // movimiento respectivo. if(obstaculos[3] == 1) { if(scan_msg->data[4]>scan_msg->data[2]) { movimiento = 3; } else if(scan_msg->data[4]<scan_msg->data[2]) { movimiento = 2; } else { if(scan_msg->data[5]>scan_msg->data[1]) { movimiento = 3; } else if(scan_msg->data[5]<scan_msg->data[1]) { movimiento = 2; } } } else if(obstaculos[2] == 1) { movimiento = 5; pinPon++; } else if(obstaculos[1] == 1) { movimiento = 3; } else if(obstaculos[0] == 1)
50
{ movimiento = 3; } else if(obstaculos[4] == 1) { movimiento = 4; pinPon++; } else if(obstaculos[5] == 1) { movimiento = 2; } else if(obstaculos[6] == 1) { movimiento = 2; } } //Si hay mas de 1 obstáculo else { //Si el total de obstaculos es de la derecha y además no se debe girar if(sumaDerecha(obstaculos) == sumObstaculos && !deboGirar) { movimiento = 5; pinPon++; } //Si el total de obstaculos es de la izquierda y además no se debe girar else if(sumObstaculos - sumaDerecha(obstaculos) == sumObstaculos && !deboGirar) { movimiento = 4; pinPon++; } //Si no se sabe en que sector están la mayor cantidad de obstaculos else { //Se debe girar a la izquierda o derecha seDebeGirar(obstaculos); } } } //Si debe girar, se incrementa la cantidad de giros if(deboGirar) { giros++; } //Si la cantidad de giros es mayor a 15, se da media vuelta if(giros > 15) { deboGirar=false;
51
//Gira en la dirección con mayor cantidad del obstaculos seDebeGirar(obstaculos); //Se setea a 0 la cantidad de giros giros = 0; } //Se llama a la operación mover, la que funciona de acuerdo a las // acciones medidas por el controlador del sensor mover(); //Se llama a dormir el proceso loopRate.sleep(); } //Método inicial del programa int main(int argc, char **argv) { //Se inicia el topico "ultrasonico" ros::init(argc, argv, "ultrasonico"); //Mensaje de que inicia el programa std::cout << "Comenzando…" << std::endl; //Se instancia un nodo de ayuda ros::NodeHandle n; //Se llama al publicador del robot kobuki pub = n.advertise<geometry_msgs::Twist>("/cmd_vel_mux/input/teleop",1); //Espera de 15 milímetros ros::Rate loopRate(15); //Se crea un suscriptor del tópico rangos, el cual es publicado por el // nodo Arduino y llama al método scanValues cada 1 publicación ros::Subscriber subs = n.subscribe("rangos", 1, scanValues); //Se mantiene en loop el programa hasta que se cancele por consola ros::spin(); return 0; }
52
ANEXO C Código programa Arduino
#include <ros.h>
#include <ros/time.h>
//Clase de mensajes para un arreglo de números flotantes
#include <std_msgs/Float64MultiArray.h>
//Nodo de ayuda
ros::NodeHandle nh;
//Arreglo donde se publicarán los datos de cada sensor
std_msgs::Float64MultiArray rangos;
//Instancia del publicador, con nombre rangos
ros::Publisher rangos_pub("rangos", &rangos);
//Se declara el nombre del publicador
char frameid[] = "/rangos";
long duration;
/*
*Método que obtiene la distancia del sensor al objeto
* recibe el parámetro del pin de Arduino al que se
* conectó el sensor
*/
float getRange_Ultrasound(int pin_num)
53
{
//Se declara el puerto como salida de datos
pinMode(pin_num, OUTPUT);
//Se manda un pulso bajo al pin
digitalWrite(pin_num, LOW);
//Pausa de 2 milisegundos
delayMicroseconds(2);
//Se manda un pulso alto al pin
digitalWrite(pin_num, HIGH);
//Pausa de 10 milisegundos
delayMicroseconds(10);
//Se manda un pulso bajo al pin
digitalWrite(pin_num, LOW);
//Se declara el puerto como entrada de datos
pinMode(pin_num, INPUT);
//Se calcula el tiempo en que demora en llegar el pulso
duration = pulseIn(pin_num, HIGH);
//Se transforma la duración a centímetros
return duration/29/2;
}
//Inicializa el funcionamiento de Arduino
void setup()
54
{
//Inicio del nodo
nh.initNode();
//Nombre del nodo
rangos.layout.dim->label = "rangos";
//Dimensión del arreglo a traspasar
rangos.layout.dim->size = 7;
//Tamaño de los datos a almacenar
rangos.data = (float *)malloc(sizeof(float)*7);
//Dimensión del arreglo
rangos.data_length = 7;
//Se traspasa el nodo al publicador
nh.advertise(rangos_pub);
}
//Variable para comparar el tiempo de ejecución
long range_time;
//Método que se ejecuta siempre
void loop()
{
//Si el tiempo actual es mayor al tiempo almacenado
if ( millis() >= range_time ){
55
//Por cada sensor, se calcula la distancia y se
// guarda en la posición correspondiente
rangos.data[0]= getRange_Ultrasound(2);
rangos.data[1]= getRange_Ultrasound(3);
rangos.data[2]= getRange_Ultrasound(4);
rangos.data[3]= getRange_Ultrasound(5);
rangos.data[4]= getRange_Ultrasound(6);
rangos.data[5]= getRange_Ultrasound(7);
rangos.data[6]= getRange_Ultrasound(8);
//Se publica el arreglo
rangos_pub.publish(&rangos);
//Guarda el tiempo actual más 50 milisegundos
range_time = millis() + 50;
}
//Se avisa su publicacion
nh.spinOnce();
}
Top Related