Algoritmo de planificación de rutas en robótica
Algoritmo de planificación de rutas en robótica
Por:
Edward Andrés González Ríos
Cód: 1088301352
Director:
M.Sc. José Andrés Chaves Osorio
Profesor del Programa Ingeniería Electrónica
Ingeniero Electricista
___________________________________
___________________________________
___________________________________
___________________________________
Director:
___________________________________
Jurado:
___________________________________
Octubre de 2015
Dedicatoria
Son muchas las personas a las que debo agradecer por su ayuda y colaboración durante la ejecución de
este proyecto y de toda mi carrera.
Para empezar un especial agradecimiento al M.Sc. José Andrés Chaves Osorio quien ha sido el director
de este proyecto, porque a pesar de sus múltiples ocupaciones siempre ha tenido tiempo y disposición para
guiar en todo momento el desarrollo y evolución del mismo; al M Sc. Mauricio Fernando Jaramillo Morales
por su respaldo y especialmente por el apoyo en la generación del entorno; al Ph.D Juan Bernardo Gómez
Mendoza por sus aportes y comentarios; al M.Sc. Edwin Andrés Quintero Salazar director del programa de
ingeniería electrónica por su acompañamiento durante toda la carrera.
A mi familia que me ha respaldado en todo momento durante el desarrollo de éste pregrado, mis her-
manas, tíos, tías, primas y especialmente a mis padres quienes siempre han estado presentes sin importar
la dificultad o complejidad de la situación en la que me encuentre; a mi novia por su paciencia, apoyo y
palabras de motivación cuando las he necesitado; a los miembros del grupo de investigación robótica aplicada
que con sus aportes grandes o pequeños han contribuido en el mejoramiento del presente proyecto y a todas
las personas que han aportado para alcanzar los objetivos de éste pregrado.
Por último a mis amigos y compañeros que de una u otra manera han aportado en mi crecimiento personal
y académico .
2. MARCO REFERENCIAL 13
2.1. MARCO CONCEPTUAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.1. Búsqueda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.2. Inteligencia Artificial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.3. Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.1.4. Algoritmos para planificación de rutas . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.5. Agente inteligente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.1.6. Función heurística . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2. MARCO TEÓRICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.1. Búsqueda a ciegas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.1.1. Búsqueda en Amplitud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.2.1.2. Búsqueda en Profundidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.1.3. Búsqueda en Profundidad Progresiva . . . . . . . . . . . . . . . . . . . . . . 18
2.2.1.4. Búsqueda Bidireccional . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2. Búsqueda informada . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2.1. Búsqueda Incremental . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2.2. Búsqueda Heurística . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.2.3. Búsqueda Incremental Heurística . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3. MARCO HISTÓRICO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.1. Algoritmo BFS (Breadth First Search) . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.3.2. Algoritmo DFS (Depth First Search) . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.3. Algoritmo de Dijkstra . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.4. Algoritmo A* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.3.5. Algoritmo LPA* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.3.6. Algoritmo D* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.3.7. Algoritmo D* Lite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
vi
ÍNDICE GENERAL ÍNDICE GENERAL
4. PRUEBAS Y RESULTADOS 45
Bibliografía 58
6. ANEXOS 62
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.1.1. Best-First Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
6.1.2. A* Search . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
6.1.3. Generación del entorno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
vii
Índice de figuras
viii
ÍNDICE DE FIGURAS ÍNDICE DE FIGURAS
ix
Capítulo 1
Sin embargo explorar y planificar un ruta se puede convertir en una tarea de vida o muerte cuando el
terreno donde se debe realizar esta tarea es total o parcialmente desconocido e implica un riesgo vital, éste
es el caso de las personas que pertenecen a organismos de búsqueda y rescate quienes deben encontrar la
manera de desplazarse entre dos puntos y que se pueden encontrar en medio de condiciones de alto riesgo
para la vida de los rescatistas, como cuando se exploran estructuras colapsadas en busca de sobrevivientes;
ya que en éste caso una mala decisión puede acarrear con la pérdida de una o muchas vidas.
Otra situación es la que viven los miembros de las fuerzas armadas de Colombia, especialmente los en-
cargados de inspeccionar terrenos que se sospechan pueden estar minados, donde la tarea de exploración y
planificación de la ruta para atravesar este tipo de terrenos puede suponer la pérdida de extremidades o
incluso la vida. Las personas que realizan esta tarea comúnmente llevan un uniforme especial que trata de
proteger parcialmente su integridad física en caso de una detonación accidental y algún dispositivo detector
el cual no puede garantizar que se detecten el 100 % de las minas enterradas en la zona; también existen otros
sistemas de exploración como es el caso de los sistemas teleoperados, en los cuales un operario entrenado ma-
nipula una plataforma robótica [1](a media o corta distancia) dotada con algún sensor que le permita detectar
los artefactos explosivos, aún así sigue siendo posible que en caso de una detonación accidental las perso-
nas que estén manipulando la plataforma al encontrarse en la zona de la explosión sufran daños físicos graves.
Existen también otros problemas similares como el caso de planificar una evacuación [2], encontrar el
camino en una hora de alta congestión vial a una clínica u hospital cercano y otra serie de problemas de
planificación de rutas.
10
1.2. JUSTIFICACIÓN CAPÍTULO 1. DESCRIPCIÓN DEL PROYECTO
1.2 JUSTIFICACIÓN
La posibilidad de implementar un algoritmo capaz de dotar de inteligencia a un sistema robótico que
pueda desplazarse y percibir su entorno (que de ahora en adelante se conocerá como un agente inteligente),
se convierte en un recurso valioso para la robótica móvil y la sociedad al aplicarse para realizar tareas de
manera autónoma, algunas de las cuales pueden ser demasiado complejas o peligrosas para ser desarrolladas
por un ser vivo.
Otro aspecto relevante a ser considerado, es cuando se realizan actividades que generan situaciones de
alto estrés para los involucrados como es el caso de explorar un estructura colapsada, donde se pierde parte
de la capacidad de razonar de manera rápida y coherente lo que genera nuevos riesgos, al utilizar un sistema
robótico dotado con IA se elimina el error humano causado por el estrés y otros factores emocionales debido a
que no cuentan con emociones ni sentimientos, lo que limita la toma de decisiones únicamente a las variables
físicas que se puedan percibir en el terreno de acuerdo a cada situación, aún cuando el escenario cambie
constantemente .
11
1.3. OBJETIVOS CAPÍTULO 1. DESCRIPCIÓN DEL PROYECTO
1.3 OBJETIVOS
1.3.1. OBJETIVO GENERAL
Desarrollar un algoritmo para la planificación de rutas con capacidad de implementación en diversas
aplicaciones de la robótica móvil.
12
Capítulo 2
MARCO REFERENCIAL
2.1.1. Búsqueda
Según el diccionario de la Real Academia de la Lengua Española [3]:
1. Hacer algo para hallar a alguien o algo.
2. Hacer lo necesario para conseguir algo.
3. Ir por alguien o recogerlo para llevarlo o acompañarlo a alguna parte.
2.1.3. Grafos
Los grafos son una herramienta usada para modelar fenómenos discretos y son fundamentales para la
comprensión y resolución de problemas como también para el análisis de algoritmos; en matemáticas, inge-
nierías y ciencias de la computacion, los grafos son colecciones de objetos llamados vértices (estados o nodos)
conectados por líneas llamas aristas que son el camino establecido para pasar de un vértice a otro [7].
13
2.1. MARCO CONCEPTUAL CAPÍTULO 2. MARCO REFERENCIAL
Dependiendo el tipo de problema que se desee modelar se encuentran diferentes tipos de grafos, a continuación
en la Figura 2.1, se presentan 3 tipos de grafos clasificados según sus aristas.
Grafo bidireccional: En los grafos bidireccionales las aristas que unen los vértices no poseen ninguna
flecha tal como se observa en la Figura 2.1b, el hecho de que la arista no tenga ningún indicador de
sentido, quiere decir que el desplazamiento de un estado a otro se puede realizar en ambos sentidos.
Grafos ponderados: En esta clase de grafo las aristas tienen un valor o una condición, como por ejemplo
las que se muestran en la Figura 2.1c, las cuales se deben satisfacer para que sea posible realizar un
desplazamiento entre estados.
14
2.2. MARCO TEÓRICO CAPÍTULO 2. MARCO REFERENCIAL
15
2.2. MARCO TEÓRICO CAPÍTULO 2. MARCO REFERENCIAL
16
2.2. MARCO TEÓRICO CAPÍTULO 2. MARCO REFERENCIAL
Si se comparan las Figuras 2.4 y 2.5, se puede observar que han sufrido ligeros cambios con respecto a
la Figura 2.3 , esto se debe a que algunos estados no han sido explorados y por esto no aparecen en los
diagramas de estados resultantes después de la exploración, se puede apreciar que los estados no explorados
son pocos, lo que hace a este tipo de búsqueda muy pesada computacionalmente.
2 Este retroceso se conoce comúnmente como Backtracking en Inglés y consiste en un retroceso cronológico ya que el agente
17
2.2. MARCO TEÓRICO CAPÍTULO 2. MARCO REFERENCIAL
18
2.3. MARCO HISTÓRICO CAPÍTULO 2. MARCO REFERENCIAL
Este tipo de búsqueda es muy utilizado ya que permite la exploración de zonas donde los escenarios
cambian constantemente, puede llegar a ser más lento que la búsqueda incremental pero será mas rápido y
eficiente que la búsqueda a ciegas, la ventaja que presenta este tipo de búsqueda con respecto a la incremental,
es que esta se puede implementar desde cero en un entorno totalmente desconocido.
La eficiencia de la búsqueda dependerá principalmente del diseño de la función heurística utilizada en la
solución del problema de búsqueda. Desde luego una “mejor función” permitirá obtener “mejores resultados”;
resultados que podrán ser medidos en términos de conceptos como carga computacional, tiempo de ejecución,
consumo energético; entre otros.
19
2.3. MARCO HISTÓRICO CAPÍTULO 2. MARCO REFERENCIAL
dándole prioridad en la exploración, primero a los estados vecinos (ver sección 2.2.1.1). Este algoritmo es
comúnmente utilizado para realizar búsqueda en grafos.
Al finalizar de explorar todos los estados, el algoritmo calcula entre todas las posibles rutas generadas
durante la exploración la ruta mas corta o de mínimo costo. Es importante tener en cuenta que si en el arbol
de estados cambia el origen o cambia el destino, se hace necesario volver a realizar la tarea de exploración y
planificación de la ruta óptima. Debido a lo anterior el algoritmo resulta muy costoso computacionalmente
porque siempre requiere del calculo y determinación de todos los caminos posibles entre un estado y otro, lo
que genera grandes cantidades de información [14].
La idea de determinar todos los caminos posibles y pagar el costo que ello implica puede no ser lo mejor
cuando solo se desea encontrar un “camino” entre dos estados o cuando el escenario “cambia constantemente”
por lo que en tal caso, el uso del algoritmo de Dijkstra puedo no ser la mejor alternativa a implementar.
El algoritmo de Dijkstra fue utilizado en vídeo juegos para planificar la ruta mas corta en diferentes
escenarios, pero fue reemplazado por algoritmos de búsqueda heurística debido a la alta carga computacional
que generaba a medida que los entornos de los juegos se volvían más extensos y dinámicos. Un vídeo juego
donde se utilizó el algoritmo fue en el famoso juego de Pacman, donde los fantasmas cuando estaban en modo
persecución utilizaban el algoritmo de Dijkstra para hallar el camino más corto hasta el personaje principal
del juego: “Pacman” [15].
2.3.4. Algoritmo A*
El algoritmo A* (pronunciado como A-start o A-asterisco), es un algoritmo de búsqueda heurística el cual
trata de hallar el camino más corto entre dos puntos. Fue descrito en 1968 por Peter E. Hart, Nils J. Nilsson
y Bertram Raphael [16].
En 1964 Nils J. Nilsson [17] desarrolló una función heurística la cual buscaba mejorar la velocidad del
algoritmo de Dijkstra, a la implementación de esta función se le llamó como algoritmo A1; en 1967 Bertram
realizó mejoras sobre el algoritmo A1, llamando a este nuevo algoritmo como A2, sin embargo Bertram no
pudo demostrar cuan óptimo era este nuevo algoritmo; en 1968 Hart demostró que el algoritmo A2 era óptimo
siempre y cuando se cumplieran algunas condiciones determinadas. Debido a que los algoritmos anteriores
(A1 y A2) empezaban con la letra A y teniendo en cuenta que todas las mejoras partían del anterior, se
decidió llamar al algoritmo final como A*, manteniendo así la inicial A y significando con el * que incluía a
todas las versiones anteriores.
El algoritmo A* utiliza una función heurística la cual tiene en cuenta dos distancias que se representan
como:
20
2.3. MARCO HISTÓRICO CAPÍTULO 2. MARCO REFERENCIAL
h(x) la cual es una estimación de la distancia desde el estado actual del explorador o agente inteligente
hasta el estado deseado, esta estimación se hace comúnmente utilizando el concepto de distancia eucli-
diana y distancia de manhattan, dependiendo de la aplicación donde se valla a implementar el algoritmo
A*.
g(x) indica el costo del camino recorrido hasta el estado actual donde se encuentre el agente inteligente.
El juego del 8 Puzzle consiste consiste en organizar las casillas en orden según su numero del 1 al 8 de
arriba abajo y de izquierda a derecha, realizando la menor cantidad de movimientos posibles, teniendo en
cuenta que solo se puede mover una ficha a la vez; en este caso se utiliza la distancia de manhattan para
calcular el siguiente mejor estado para la casilla que queda vacía.
Debido a la importancia que ha tenido el algoritmo A* dentro de los algoritmos de búsqueda heurística,
se han introducido nuevos tipos de búsqueda como la búsqueda centrada en el agente o Agent-Centered
Search [18] en ingles; aunque este nuevo tipo de búsqueda no ha sido completamente aceptado dentro de la
comunidad, se han desarrollado algunos algoritmos como el algoritmo RTA* [19] y el algoritmo LRTA*[20],
los cuales presentan variaciones en el tiempo de ejecución y planificación de la ruta así como también en la
manera en que se almacenan y procesan los datos de los espacios explorados por parte de un agente inteligente;
existen más variaciones del algoritmo A*, sin embargo no se abordaran en el presente documento.
El algoritmo LPA* se presenta como un algoritmo de búsqueda Incremental Heurística (ver sección 2.2.2.3)
el cual busca encontrar el camino mas corto entre un estado inicial y un estado final en el menor tiempo
posible cuando el espacio a explorar es muy grande o cuando se presenta que el espacio cambia continuamente.
21
2.3. MARCO HISTÓRICO CAPÍTULO 2. MARCO REFERENCIAL
Cuando un agente inteligente programado con el algoritmo LPA* inicial el proceso de búsqueda, primero
utiliza la función heurística presentada en el algoritmo A*, con la información que acaba de adquirir descarta
los estados sucesores de menor importancia y calcula el siguiente mejor paso entre los posibles estados
que no fueron descartados haciendo uso de la información que tenga almacenada de búsquedas anteriores
como lo hace la búsqueda incremental; si no se tiene información de búsquedas pasadas, se sigue haciendo
uso únicamente de la función heurística pero se almacena toda la información del recorrido realizado para
utilizarla posteriormente si el entorno llega a cambiar; haciendo así que en un entorno dinámico no se requiera
hacer una exploración total o parcialmente grande cuando existen muchos cambios constantes en el escenario,
para este caso solo seria necesario explorar de nuevo lo estados que hallan cambiando solo si estos influyen
directamente en la ruta.
2.3.6. Algoritmo D*
El algoritmo D* [24] recibe su nombre debido a que este se asemeja al algoritmo A* [16], con la diferencia
de que este se presenta como dinámico en el uso de la función heurística, ya que dependiendo del entorno a
explorar puede calcular de manera diferente las variables h(x) y g(x) presentadas en el algoritmo A*, este
algoritmo también permite que estados ya explorados y con un valor de f (x) definido durante el proceso de
búsqueda, se les asigne un nuevo valor dependiendo de la situación actual en la que se encuentre el agente
inteligente.
El algoritmo D* fue desarrollado por Anthony Stentz en el año de 1993 y publicado en el artículo llamado
Optimal and Efficient Path Planning for Unknown and Dynamic Environments; se realizó con la idea de
que se pudiera implementar en sistemas de robótica móvil, los cuales tendrían la capacidad de ajustar sus
sensores y funciones heurísticas para hallar el mejor camino dependiendo del entorno a explorar. La idea
de utilizar una función heurísticas que pueda cambiar o ser ajustada según las necesidades que presente el
agente inteligente en cada estado, permite que este algoritmo genere trayectorias óptimas en la mayoría de
los casos haciendo uso únicamente de la función heurística.
Como mejora al algoritmo D* se desarrolló el algoritmo D* Lite en el año 2002 por parte de Sven Koenig
y Maxim Likhachev [25], este se presenta como un algoritmo de búsqueda incremental heurística igual que el
algoritmo LPA*, con la diferencia de que utiliza una función heurística dinámica como lo hace el algoritmo D*.
Así el algoritmo D* Lite se establece como un algoritmo para la planificación de rutas eficiente, el cual es
capaz de encontrar la mejor ruta entre dos estados en un tiempo de ejecución mínimo, pero debido a que es un
algoritmo de búsqueda incremental heurística sigue teniendo un costo computacional alto (ver sección 2.2.2.3).
En el año 2011 se implementó el algoritmo en una plataforma móvil con sistema de tracción diferencial y
un juego de 7 sensores infrarrojos, esta plataforma móvil se llamó Khepera II [26], el objetivo era probar el
funcionamiento del algoritmo en un entorno real al planificar una ruta entre dos estados fijos en condiciones
controladas.
22
Capítulo 3
El hecho de que el entorno se presente como un ambiente discretizado en una cantidad de nodos finitos,
permite que su implementación física sea alcanzable ya que cualquier espacio puede ser segmentado en un
conjunto de nodos con un numero igualmente finito de nodos vecinos o adyacentes [27].
En cuanto a los obstáculos, solo se podrán agregar tres (3) objetos con formas geométricas sencillas de
las cuales dos (2) serán cuadrados o rectángulos y el tercer obstáculo será un círculo o elipse, a todos los
objetos se les podrá modificar el tamaño cambiando el valor de sus dimensiones en X y Y respectivamente;
del mismo modo se podrá cambiar la posición y rotación del objeto dentro del entorno.
Es importante tener en cuenta que siempre primero deberá ser generado el entorno y posterior a éste se
podrá iniciar la exploración, esto se debe a que el entorno debe de ser independiente del agente inteligente o
explorador ya que se parte del hecho de que el entorno es totalmente desconocido y ajeno al explorador, el
agente inteligente solo conocerá el tamaño del entorno a explorar, su posición, la posición del nodo destino y
la cantidad de nodos en la que se encuentra segmentado el entorno, garantizando así que la planificación de
la ruta se podrá aplicar a cualquier entorno.
23
3.2. CREACIÓN DEL ENTORNO DE EXPLORACIÓN
CAPÍTULO 3. DESARROLLO DEL PROYECTO
Los nodos de color azul representan nodos por donde el explorador se podrá mover libremente mientras
que los rojos representan posiciones ocupadas por donde el agente no podrá transitar o no podrá atravesar,
además se puede observar que por fuera del contorno de la figura geométrica que representa el obstáculo se
generan nodos ocupados, esto corresponde a un valor de offset que se agrega teniendo en cuenta el tamaño
del explorador[28], en el presente proyecto se considera que el explorador solo ocupa un nodo y se comporta
como una partícula que se mueve en el entorno, si se llegara a pensar en un agente mas grande (es decir que
ocupe mas de un nodo), seria necesario modificar el valor de offset de cada obstáculo con el fin de evitar
colisiones al momento que trate de transitar por espacios muy reducidos.
El entorno presentado anteriormente, corresponde a una matriz binaria como la que se muestra en la
Figura 3.2, donde los valores en 0 representan nodos libres y los valores en 1 los nodos ocupados.
La matriz presentada, será la que realmente recorra el explorador y la cual irá censando durante todo
24
3.2. CREACIÓN DEL ENTORNO DE EXPLORACIÓN
CAPÍTULO 3. DESARROLLO DEL PROYECTO
el proceso de planificación y búsqueda de la ruta. Para crear tanto la matriz como la interfaz gráfica de la
misma, se diseñó en MATLAB una función la cual se encarga de generar el espacio vacío y luego posicionar
los obstáculos.
A continuación en la Figura 3.3, se muestra la función que permite generar el entorno y la matriz de
exploración de la misma.
Donde:
N1 es la matriz binaria que representa el conjunto de nodos libres y ocupados.
E1 es un vector que contiene las dimensiones en X y Y del primer rectángulo.
U1 es un vector que contiene la ubicación en X y Y del primer rectángulo.
R1 es la rotación del primer rectángulo en radianes.
E2, U2 y R2 son los vectores para la generación del segundo rectángulo el cual se forma igual que el
primer rectángulo.
E3 es un vector que contiene el valor del radio en X y Y del círculo.
U3 es la ubicación del círculo donde sus valores en X y Y corresponden al centro.
A es un escalar que representa el tamaño máximo del entorno a generar.
D es la cantidad de nodos en los que se dividirá el entorno.
Un ejemplo de la generación del entorno se presenta en la Figura 3.4, que se puede observar a continuación.
Para crear el entorno completo tal como se ha mostrado hasta el momento, primero se crea un entorno
vació y posteriormente se crean cada uno de los elementos. Todo el escenario y los objetos se genera utilizando
la función linspace() de MATLAB, la cual permite generar vectores lineales con separación uniforme lo que
hace fácil la tarea de construir cuadrados y rectángulos, para el círculo se utiliza la relación de las funciones
trigonométricas seno y coseno.
25
3.3. EL AGENTE INTELIGENTE O EXPLORADOR CAPÍTULO 3. DESARROLLO DEL PROYECTO
Teniendo en cuenta que es un agente de software, lo que percibirán los sensores es el estado de cada nodo
que hace parte de la matriz que conforma el entorno y que se encuentra dentro del alcance de los sensores,
como se mencionó anteriormente los dos estados posibles son 0 y 1 representando si el nodo se encuentra
libre para ser un posible siguiente paso o se encuentra ocupado, lo cual implica que es un obstáculo. Si
se pensara en un sensor real, este devolvería un valor análogo o digital según sea el tipo de sensor que
26
3.3. EL AGENTE INTELIGENTE O EXPLORADOR CAPÍTULO 3. DESARROLLO DEL PROYECTO
correspondería a indicar si el siguiente espacio se encuentra libre u ocupado por un obstáculo, lo cual hace
que la implementación física del sistema de sensores sea viable.
En la Figura 3.7, se presenta un modelo mas completo para un agente, el cual además de poder percibir el
entorno e interactuar con el mismo debe tener la capacidad de aprender sobre lo que ha recorrido y percibido
del entorno hasta el momento.
Para la creación del agente se desarrollo en MATLAB una clase, la cual sirve como base para crear
cualquier agente o explorador, en la Figura 3.8, se observa la clase llamada planificador la cual contiene un
serie de atributos que servirán como la memoria del agente.
1 classdef planificador<handle
2 %UNTITLED3 Summary of this class goes here
3 % Detailed explanation goes here
4
5 properties
6 ini=[]; %vector de inicio
7 fin=[]; %vecto de fin
8 pos=[]; %vector de posicion actual
9 ruta=[]; %ruta recorrida
10 vecinos=[]; %vecinos actuales; con relacion a pos
11 d=[]; %distancia de posicion actual a la meta
12 Mexplorados=[]; %matriz del espacio explorado
13 gx=[] %sumatorio de costos de moverse entre puntos
14 Nopen=[] %lista de nodos abiertos
15 Nclose=[] %lista de nodos cerrados
16
17 end
18
19
20 end
27
3.3. EL AGENTE INTELIGENTE O EXPLORADOR CAPÍTULO 3. DESARROLLO DEL PROYECTO
El agente debe conocer en todo momento la posición donde inicio el recorrido, este dato se almacenará
como un vector el cual contendrá las coordenadas en X y Y de la posición donde el agente inicio la exploración
y se almacenará en el atributo llamado “ini”, el agente también debe recordar cuales son las coordenadas
de el nodo destino las cuales serán almacenadas en “fin”, el atributo “pos” almacenará las coordenadas de
la posición actual del móvil sobre el entorno. Por ejemplo en la Figura 3.9, se muestran los atributos de un
agente llamado “S1” el cual se ha creado partiendo de la clase “planificador” y esta realizando la búsqueda
de una ruta entre dos puntos.
Se puede observar que el agente tiene almacenado como posición inicial ini = [5, 60] que se encuentra
representado en color verde, f in = [85, 10] que se encuentra representado en rojo y la posición actual en
pos = [15, 50] y se encuentra representado por un circulo rojo que demarca la posición actual del agente.
EL atributo “ruta” es un arreglo de tamaño variable, que cambia (aumenta su tamaño) cada ciclo y va
almacenando en orden las coordenadas de los nodos por donde se va desplazando el agente, este atributo
tendrá la siguiente forma:
Xi X1 X2 ... Xn
ruta =
Yi Y1 Y2 ... Yn
Donde el conjunto Xi y Yi corresponden a la abscisa y la ordenada del punto donde inició el agente; Xn
y Yn corresponde a las coordenadas cartesianas del nodo final o nodo objetivo que debe ser el ultimo nodo
visitado; los demás pares ordenados corresponden a todos los nodos visitados por el agente antes de encontrar
el nodo objetivo.
El atributo “vecinos” se muestra en la Figura 3.10, este atributo cambia cada vez que el agente cambia
de posición, aquí es donde se almacena las coordenadas cartesianas y el estado (ocupado o libre) de los nodos
percibidos por los sensores virtuales, esta información que acaba de adquirir el agente se compara con lo
que conoce el agente hasta el momento; si las coordenadas de un nodo se encuentran ya registradas en la
memoria del agente, el atributo “vecinos” se completa con la información que se tiene almacenada de dicho
nodo, si no se encuentra registrado; es decir es la primera vez que el nodo aparece en el proceso de búsqueda
y planificación, se calculan los valores relacionados con la función heurística y se asigna un estado al nodo
según el algoritmo para la planificación de rutas utilizado, con esta información se toma la decisión de cual
es el siguiente nodo donde deberá desplazarse el agente.
28
3.3. EL AGENTE INTELIGENTE O EXPLORADOR CAPÍTULO 3. DESARROLLO DEL PROYECTO
El orden de conformación de este arreglo depende del sentido de exploración de los sensores virtuales,
la exploración del entorno por parte de los sensores se lleva a cabo empezando por el sensor S1 y continua
en sentido horario hasta llegar a S81 (ver Figura 3.6). Los valores asignados en las columnas H(x), G(x) y
estado del nodo se justificaran en secciones posteriores cuando se explique el algoritmo para la búsqueda y
planificación de la ruta.
La información de cada nodo que ha sido explorado o solamente visto durante el proceso de búsqueda
se almacena en el atributo “Mexplorados” el cual es un arreglo de dimensiones N xN x2 donde el valor de
N corresponde a la cantidad de nodos en los que está dividido el entorno a explorar. Este atributo es la
reconstrucción del entorno visto por el agente y es la memoria principal del mismo, cada nodo del entorno
tiene un equivalente en éste atributo; al momento de iniciar el proceso de búsqueda y planificación de la
ruta este arreglo contiene todos los valores en cero ya que el entorno se considera totalmente desconocido,
a medida que el agente avanza por el entorno los valores en cero empiezan a cambiar. En la primera capa
del arreglo, se almacenan los valores calculados al aplicar la función heurística a cada nodo, los nodos que se
encuentren ocupados por un obstáculo no se les aplicara dicho cálculo y se les asignara un valor muy grande
que tienda a infinito2 ; en la segunda capa del arreglo se almacena el estado de cada nodo, los cuales se han
marcado de la siguiente manera:
A continuación en la Figura 3.11, se muestra la primera capa del atributo “Mexplorados”, se pueden observar
los valores asignados por la función heurística para cada nodo y cuales nodos se han descubierto como parte
de un obstáculo, en la Figura 3.12, se muestra la segunda capa del atributo para la misma búsqueda, si se
observan los nodos con valor 2 se puede deducir cual es la ruta que se ha encontrado hasta el momento,
cuantos nodos han sido vistos y cuales hacen parte de los obstáculos del entorno.
1 Es posible dependiendo de la ubicacion del agente, que se cuente con menos de 8 vecinos por ejemplo cuando el agente se
29
3.3. EL AGENTE INTELIGENTE O EXPLORADOR CAPÍTULO 3. DESARROLLO DEL PROYECTO
Figura 3.11: Primera capa del atributo Mexplorados en medio de una búsqueda.
Figura 3.12: Segunda capa del atributo Mexplorados en medio de una búsqueda.
Los atributos “d” y “g(x)” son escalares que cambian cada vez que el agente se mueve, el primero alma-
cena el valor de la distancia euclidiana desde el nodo actual (donde se encuentra el agente) hasta el nodo
objetivo y sirve como condición de parada para el algoritmo de búsqueda, si “d” llega a valer 0 se considera
que el agente ha encontrado el nodo objetivo; el segundo es el costo acumulado del camino recorrido desde el
punto de inicio del agente hasta la posición actual, su valor se calcula utilizando la sumatoria de la distancia
euclidiana entre los nodos que forman parte de la ruta, también hace parte de la función Heurística de algunos
algoritmo para la búsqueda y planificación de rutas.
El Atributo“Nopen” es donde se almacenan las coordenadas de todos los nodos que han sido vistos pero
no visitados, es decir que no hacen parte de la ruta pero son vecinos de algún nodo que sí hace parte y
pueden llegar a ser visitados en algún momento; en el instante que un nodo que se encuentra en el atributo
“Nopen” es visitado por el agente, es eliminado de éste atributo y pasa automáticamente al atributo “Nclose”
que es dónde se almacenan las coordenadas de los nodos que hacen parte de la ruta y las coordenadas del
nodo que fue el predecesor de este último. Todos los nodos antes de pasar atributo “Nclose” deben haber
existido en “Nopen” ya que antes de ser visitados fueros nodos vecinos sin visitar. La información de estos
dos atributos es utilizada para realizar optimización de la ruta encontrada, sin embargado la optimización
excede los ámbitos del presente proyecto por lo cual no fue estudiada.
30
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Nota: Dependiendo del algoritmo de búsqueda utilizado un agente puede requerir menos
atributos de los presentados anteriormente.
Después de escoger los algoritmos de búsqueda informada fue necesario decidir entre los algoritmos de bús-
queda incremental o los algoritmos de búsqueda heurística. Los algoritmo de búsqueda incremental prometen
encontrar la ruta mas corta [29] en el menor tiempo posible para resolver una serie de problemas similares,
lo cual implica tener un conocimiento casi total del entorno [30]. Por otro lado, los algoritmos de búsqueda
heurística tratan de encontrar una ruta en un entorno desconocido de manera mas rápida que los algoritmos
de búsqueda a ciegas haciendo uso de una función heurística para tomar decisiones sobre la ruta [31, 32].
Teniendo en cuenta que la idea principal del proyecto es dotar en un futuro cercano a un sistema robótico
con los algoritmos acá desarrollados y que son varias las aplicaciones en las que un sistema robótico tiene que
interactuar con un entorno desconocido, se escogieron para el desarrollo del proyecto las búsquedas heurísticas.
Las búsquedas heurísticas también conocidas como búsquedas basadas en el agente, tratan de estimar
la distancia entre la posición actual del agente y la meta o nodo objetivo[33] haciendo uso de funciones
matemáticas conocidas como por ejemplo:
Distancia de Manhattan
Distancia de Mahalanobis
Distancia Euclidiana, entre otras.
Para conformar sus funciones heurísticas, que generalmente se denota como f (x), se pueden utilizar una o
varias de estas funciones matemáticas dependiendo del algoritmo, el entorno donde se apliquen y el tipo de
agente[34].
donde h(n) se encuentra definida como la distancia euclidiana, la cual en un espacio bidimensional entre
dos nodos P 1 y P2 con coordenadas cartesianas (X1 , Y1 ) y (X2 , Y2 )respectivamente, es:
q
2 2
dE (P1 , P2 ) = (X2 − X1 ) + (Y2 − Y1 ) (3.2)
Entonces, aplicando la ecuación (3.2) en (3.1) se tiene:
3 También es conocido como greedy search, ha sido llamado de muchas formas por diferentes autores y aun no se encuentra
31
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
q 2
2
h (n) = dE (n’, ng ) = (ngx − n0x ) + ngy − n0y (3.3)
donde:
n0 es un nodo vecino del nodo actual con coordenadas cartesianas n0x , n0y el cual no se encuentra
32
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
En secciones anteriores se mencionó que el agente requiere conocer el tamaño del entorno y la resolución,
es decir en cuantos nodos se dividió el entorno, las coordenadas de inicio que debe ser un nodo libre, las
coordenadas del nodo objetivo y por ultimo la matriz sobre la que el agente va a realizar la búsqueda; si la
búsqueda se realizará en un entorno real, la matriz N1 no sería necesaria. El algoritmo realiza los siguientes
pasos:
1. Crea el agente utilizando la clase planificador.
2. Se cargan con sus respectivos valores los atributos ini, fin y pos que hacen parte de la memoria del
agente.
3. Inicializa el atributo Mexplorados, esto lo hace creando una matriz llena de ceros y de dimensiones
iguales a la cantidad de nodos en los que fue segmentado el entorno.
4. Se actualiza el entorno y se calcula el valor de f (n) para el nodo actual que tiene las coordenadas del
nodo de inicio, a continuación en la Figura 3.15, se muestra un entorno de ejemplo donde el agente
inicia en un nodo con coordenadas cartesianas (10,5) (marca cuadrada de color verde) y tiene como
objetivo el nodo marcado con coordenadas (85,10) (marca cuadrada de color rojo).
Figura 3.15: Entorno de ejemplo para el ejemplo del algoritmo Best-First Search
33
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Figura 3.16: Representación matricial del entorno antes del primer movimiento.
7. Se escoge el nodo con menor valor f (n) como el siguiente paso para el agente; para el presente ejemplo
el siguiente nodo sera aquel que tiene f (n) = 70 y corresponde al nodo con coordenadas (15,10).
El anterior proceso se repite desde el paso 4 hasta el 7, el ciclo termina cuando el valor de f (n) sea igual a
cero; es decir cuando la posición actual del agente sea el nodo objetivo, si el agente explora todos los nodos
libres disponibles y no encuentra el nodo objetivo, se detiene la búsqueda y se concluye que el nodo objetivo
no puede ser alcanzado por el agente.
g(n) estima el costo de desplazarse desde el nodo inicial hasta cualquier otro nodo, tratando que el
camino encontrado tenga el menor costo en desplazamiento
h(n)estima el costo mínimo desde un nodo n hasta el nodo objetivo.
Por lo tanto, si se trata de hallar una ruta con el menor costo posible, es razonable tratar de encontrar
primero el nodo con el g(n)+h(n)[36]. Este algoritmo resulta ser muy valioso dentro de los algoritmos de
búsqueda, ademas siempre y cuando se satisfagan ciertas condiciones la ruta encontrada se puede considerar
casi optima en términos de la menor distancia recorrida.
Como se menciono anteriormente el algoritmo A* comparte el mismo principio que el algoritmo Best-First
Search en cuanto al calculo de la función h(n), por lo que queda definida como:
q 2
2
h (n) = dE (n’, ng ) = (ngx − n0x ) + ngy − n0y
Ahora el nuevo termino g(n) se define como:
(
C(ni , n0 ) P ara i = 1
g(n) =
g(n) + C(ni , n ) ∀ i > 1
0
34
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Donde ni con i = 1 representa que la búsqueda acaba de empezar, es decir el agente se encuentra en el
nodo inicial y ∀ i > 1 representa cualquier otro nodo que hace parte de la ruta; C(n, n0 ) es la función de costo
de desplazar el agente de un nodo actual n a un nodo n0 adyacente.
La función C(ni , n0 ) se puede asignar como un valor constante o como el resultado de una función ma-
temática, para el presente proyecto y considerando que el entorno es un espacio bidimensional se utilizo la
función distancia euclidiana definida para un par de nodos ni = (nx , ny ) y n0 = (n0x , n0y ), entonces:
q 2
2
C (ni , n0 ) = dE (ni , n0 ) = (n0x − nx ) + n0y − ny
La ejecución del algoritmo A* se puede explicar con el siguiente conjunto de pasos5 :
1. Se inicializan en la memoria del agente ini, fin, pos, Nopen, Nclose.
4. Se agregan las coordenadas del nodo actual a Nclose junto con las coordenadas de su predecesor .
5. Si el nodo actual es el nodo objetivo, se sale del Loop y se da por terminada la búsqueda, de lo contrario
continua el ciclo.
6. Se obtienen las coordenadas de cada nodo vecino del nodo actual donde se encuentre el agente.
8. Se escoge el nodo con f (n) mas bajo como el siguiente nodo a visitar.
9. Se realiza el movimiento del agente, se actualiza pos con las coordenadas del nuevo nodo.
en la sección 3.3
35
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Una vez iniciado el proceso de búsqueda, el agente pasa el nodo actual de la lista Nopen a Nclose, y calcula
el valor de f (n) para cada nodo vecino. En la Figura 3.18, se pueden observar los valores de f (n) calculados
para cada uno de los nodos vecinos del nodo actual donde se encuentra el agente, también se observa una
lista con los nodos abiertos y resaltado en azul el nodo con menor valor calculado el cual sera escogido como
siguiente nodo donde el agente se desplazará.
Una vez el agente se desplaza al siguiente nodo, si éste no es el nodo objetivo, se vuelve a iniciar el proceso;
como en este caso no se ha alcanzado el nodo objetivo por parte del agente, se vuelven a realizar un censado
de los nodos vecinos y a calcular sus valores f (n), en la Figura 3.19, se observan los nuevos valores calculados
por el agente.
36
3.4. DESARROLLO DEL ALGORITMO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Se puede observar comparando las Figuras 3.18 y 3.19, el cambio en los valores f (n) calculados para todos
los nodos que se encuentran en la lista Nopen, los nodos que hasta el momento se encuentran en la lista Nclose
se ignoran, esto previene que el agente genere un retroceso innecesario, también se puede apreciar la aparición
de nuevos nodos en la lista Nopen. Es importante tener en cuenta que la componente h(n) permanece igual
, sin embargo g(n) cambia y hace que el valor de la función heurística f (n) cambie.
En la Figura 3.20, se puede apreciar que el agente aun no ha encontrado el nodo objetivo por lo que sigue
el proceso de búsqueda, se ha encontrado con un obstáculo el cual trata de rodear, esto lo hace marcando
los nodos ocupados con valores muy altos lo cual hace que el agente no trate de atravesar los obstáculos. El
agente sigue buscando un camino para solucionar el problema, en la Figura 3.21, se observa la ruta encontrada
por el agente después de ejecutar varias veces el algoritmo; cuando el agente se encuentra en el nodo objetivo
el proceso de búsqueda termina.
37
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
A pesar de que la optimización excede los ámbitos del presente proyecto, es importante recordar el uso
de la relación entre la lista Nopen y Nclose, esta servirá para optimizar en términos de la distancia recorrida
el algoritmo. Después de finalizar la búsqueda se genera un retroceso a través de todos los nodos vistos y
recorridos, es decir a través de todos los nodos que aparecen en las listas Nopen y Nclose; como en este
momento parte del entorno ya es conocido, se puede calcular una mejor ruta con la información almacenada.
En la Figura 3.22, se puede observar una posible optimización de la ruta encontrada, la linea negra marca la
ruta optima.
Para el desarrollo del algoritmo A* se utilizo la misma estructura en MATLAB que la utilizada en el
algoritmo Best-First Search, solo se cambio la sub-funcion llamada heurística.m. En el capitulo 6 ANEXOS,
se encuentran todos los códigos implementados en MATLAB con el fin de que puedan ser validados y utilizados
en futuras investigaciones.
38
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
(a) Diseño agente inteligente robótico (b) Vista explosionada del agente
Los materiales seleccionados para la fabricación del agente fueron acrílico y aluminio, esto con el fin de
que sea resistente y liviano.
El tamaño del agente fue seleccionado teniendo en cuenta que debía ser menor al tamaño promedio de
algunas baldosas el cual oscila alrededor de 30 cm de longitud, esto con el fin de poder realizar pruebas en
entornos controlados sin tener que realizar adecuaciones difíciles o costosas, también se considero el tamaño
de los motores con caja reductora y encoder que se encontraban actualmente en el mercado, para el presente
proyecto se escogió el motor 37Dx54L con encoder de Pololu el cual se muestra a continuación en la Figura
3.24. El cual tiene aproximadamente 8 cm de longitud desde el encoder hasta la salida de la caja reductora.
Teniendo en cuenta lo anterior se estableció una medida de 24 cm de diámetro para el móvil.
39
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
La forma del móvil y la ubicación de los elementos en el la misma se selecciono pensando en la forma en
la que deberían ir ubicados los sensores (aunque los sensores se encuentran ubicados en la tapa y no en la
base, estas dos partes deben guardar relación) y en la ubicación del centro de masa del móvil.
Rueda loca o
Rueda de apoyo
Centro de masa
Centro geométrico
En la Figura 3.25, se puede apreciar la forma y la ubicación de los motores en la base del móvil, se
decidió que tuviera una forma circular con cortes laterales para las llantas, también se agregaron dos ruedas
de apoyo, una en la parte frontal y la otra en la parte trasera del móvil; el objetivo principal de agregar los
elementos a la base con la distribución anteriormente mostrada es el de garantizar que el centro de masa se
ubique exactamente con el centro geométrico del móvil, lo cual al tener un sistema de tracción diferencial
facilita el control del mismo, especialmente cuando este tenga que rotar ya que siempre rotara sobre su centro
geométrico y no generara ningún tipo de desplazamiento; solo rotación.
Estas ruedas al ser de un material poroso garantizan un buen agarre en la mayoría de las superficies lo
que evita las perdidas de tracción, ademas al ser de un material suave estas se deformen un poco al pasar
por superficies que no sean totalmente lisas sin que el móvil sufra grandes perturbaciones6 .
6 Con el fin de evitar la deformación excesiva por el peso del móvil, las ruedas de apoyo se deben tener el tamaño minimo al
40
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Otro aspecto importante a tener en cuenta es la correcta selección o construcción de un circuito que
permita controlar la velocidad y cambio de giro de los motores, en la Figura 3.27a. Se muestra la tarjeta
controladora para motores MC33926, la cual permite el control de dos motores de manera independiente y
requiere conexiones mínimas con un sistema microcontrolado como se observa en la Figura 3.27b.
41
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
También es el encargado de controlar y realizar la tarea de censado y percepción del entorno por parte
del agente, para la tarea de censado se decidió trabajar con sensores ultrasonicos de referencia HC-SR04,
los cuales son de bajo costo, tienen un rango de operación de 2 cm a 400 cm lo que los hace ideales para
la aplicación y ademas tienen un angulo de apertura de 30 grados; en la Figura 3.29a, se presenta el sensor
ultrasonico mencionado. Si se toma en cuenta las consideraciones de poner en sensor cada 45 grados se
obtendría una distribución de sensores tal como se muestra en la Figura 3.29b, la cual es ideal ya que permite
detectar los 8 puntos mas cercanos al agente y deja pocas zonas ciegas.
Por otro lado es importante tener en cuenta que este sistema microcontrolado tiene memoria finita y muy
limitada por tal motivo se piensa en dotar al agente con un sistema de comunicación inalámbrico basado
en el protocolo 802.11b haciendo uso del modulo ESP8266 como el que se muestra en la Figura 3.30. Este
modulo tiene comunicación serial para comunicarse con el Arduino de forma bidireccional y permitirá al
móvil comunicarse con un computador con alta capacidad de memoria para realizar una copia de toda la
información percibida del entorno por parte del agente, también en el computador se realizara toda la tarea de
procesamiento y ejecución del algoritmo de planificación de rutas y se le enviara solo al móvil la información
de cual es el siguiente mejor paso. Utilizar un computador externo hacer que el sistema microcontrolado
funcione mejor y de manera mas eficiente al no tener que utilizar el procesador hasta el limite.
42
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Es necesario utilizar un segundo sistema microcontrolado dedicado exclusivamente a controlar los motores,
esto se debe a que la tarea de desplazarse requiere que se dedique un elemento exclusivamente a realizar el
conteo de pulsos emitidos por el encoder del motor para garantizar el menor error posible en desplazamiento
y posicionamiento del móvil; para esta tarea se escogió un Arduino Nano, el cual es de bajo costo y se puede
comunicar por medio de un puerto serial como el sistema principal (Arduino Mega).
43
3.5. DISEÑO DE UN AGENTE DE ROBÓTICO CAPÍTULO 3. DESARROLLO DEL PROYECTO
Finalmente en la Figura 3.33, se observa finalmente el agente completamente ensamblado siguiendo todas
las condiciones mencionadas durante esta sección.
Nota: Las pruebas realizadas con el agente robótico no se incluyen en el capítulo de pruebas y resultados
debido a que este se encuentra aún en la fase de puesta a punto. Esta sección esta orientada principalmente
al diseño.
44
Capítulo 4
PRUEBAS Y RESULTADOS
En este capitulo se presentan los resultados de las pruebas realizadas sobre cinco (5) entornos diferentes,
los cuales son totalmente desconocidos para el agente que realiza la búsqueda y planificación de la ruta;
para cada entorno se aplicaron dos (2) pruebas, en donde se cambiaron para cada caso las coordenadas del
nodo de inicio y nodo objetivo o destino. En todos los casos se realizaron las pruebas con los dos algoritmos
desarrollados en el presente proyecto, Best-First Search y A* Search.
Con el fin de poder comparar los resultados arrojados por los algoritmos en cada caso, ademas de la
comparación gráfica, se midieron 3 parámetros:
Tiempo de ejecución: El tiempo de ejecución de cada algoritmo desde el inicio del mismo hasta que
finaliza se midió utilizando las funciones tic y toc de MATLAB. Al inicio de la función principal Main.m
empieza el conteo de tiempo con la función tic; al final del algoritmo se ejecuta la función toc, la cual
devuelve el tiempo en segundos que a pasado desde la ultima ejecución de la función tic. Este valor en
segundos se considera como el tiempo de ejecución de cada algoritmo.
Nodos recorridos: Es la cantidad de nodos en unidades que el agente recorrió desde el nodo de inicio
hasta el nodo objetivo, es decir todos los nodos que el agente visitó durante el proceso de búsqueda y
planificación de la ruta.
Distancia recorrida: Es la suma acumulada de la distancia euclidiana entre los nodos que visitó el agente
durante la búsqueda y planificación de la ruta. Este parámetro hace parte del algoritmo A* Search como
parte de su función heurística para tratar de encontrar el camino mas corto; sin embargo el algoritmo
Best-First Search no cuenta con este parámetro.
Con el fin de poder realizar la comparación de la distancia recorrida por el agente con cada algoritmo, se
desarrollo un función para medir la distancia recorrida cuando se utiliza el algoritmo Best-First Search;
es importante aclarar que esta función se ejecuta de manera externa al algoritmo principal una vez que
termina la búsqueda, esto con el fin de evitar que se afecte el tiempo de ejecución del algoritmo por
una función que no es propia de mismo.
45
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(b) A* Search
46
A* Search Best-First Search
Tiempo de ejecución(s) 0,7124 0,7399
Nodos recorridos(unid) 17 17
Distancia recorrida (unid) 104.8528 104.8528
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
A* Search Best-First Search
Tiempo de ejecución(s) 0,7386 0.7133
10
Nodos recorridos(unid) 18 18
Distancia
0 recorrida (unid) 85 85
0 20 40 60 80 100
Nodo inicial (5,50)
Nodo final (b) A* Search. (90,50)
Figura 4.2: Escenario 1 prueba 2
47
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(b) A* Search
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
10
A* Search Best-First Search
Tiempo de ejecución(s) 0,6512 0.6237
0
Nodos recorridos(unid) 19 60 19 100
0 20 40 80
Distancia recorrida (unid) 112.7817 112.7817
(b) A* Search
Nodo inicial (35,5)
Nodo final Figura 4.4: Escenario 2 prueba 2
(80,85)
49
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(b) A* Search
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
A* Search Best-First Search
10
Tiempo de ejecución(s) 0,3598 0.5013
Nodos
0 recorridos(unid) 9 21
0 20 40 60 80 100
Distancia recorrida (unid) 92.4264 237.2792
(b) A* Search
Nodo inicial (0,90)
Nodo final (30,10)
Figura 4.6: Escenario 3 prueba 2
51
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(b) A* Search
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(a) Best-First Search
100
90
80
70
60
50
40
30
20
53
CAPÍTULO 4. PRUEBAS Y RESULTADOS
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(a) Best-First Search
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
(b) A* Search
100
90
80
70
60
50
40
30
20
10
0
0 20 40 60 80 100
100
90
80
70
60
50
40
30
20
55
Capítulo 5
CONCLUSIONES Y FUTUROS
TRABAJOS
5.1 CONCLUSIONES
En este trabajo de grado se han estudiado los conceptos de búsqueda y planificación de rutas, en este
sentido se han manejado muchos algoritmos que facilitan el proceso de búsqueda y planificación realizados
por un agente inteligente; particularmente se ha orientado el presente trabajo a estudiar e implementar dos
algoritmos, uno de ellos el Best-First Search y el otro el A* Search.
Al comparar los dos algoritmos y los resultados después de un proceso de experimentación, se sabe:
Por el estudio del estado del arte el algoritmo Best-First Search aparece entre los primeros algoritmos de
búsqueda heurística y sirve de base al algoritmo A* Search, en ese sentido se podría pensar que éste último
es un algoritmo más evolucionado y debería garantizar siempre mejores resultados que su predecesor; sin
embargo en los experimentos realizados se observa que esto no es así, una de las razones se encuentra relacio-
nada con el tiempo de ejecución de cada uno de los algoritmos. Se puede observar que el algoritmo Best-First
Search es mas rápido en tiempo de ejecución cuando el entorno es simple y se pueda identificar fácilmente
la ruta que una dos nodos, mientras que el A* Search en un entorno simple puede llegar a ser considerado lento.
Por otro lado, una de las ventajas del algoritmo A* Search es que después de realizar un primera búsqueda
se puede realizar una optimización de la ruta encontrada; esto se puede realizar utilizando la información
extra que almacena el algoritmo sobre lo que el agente halla conocido durante el recorrido, ya que se tiene la
capacidad de almacenar en memoria la ruta recorrida y los nodos vecinos de la ruta recorrida.
También es importante tener en cuenta que encontrar la ruta mas corta en términos de distancia recorrida
puede no ser la mejor opción cuando se realiza la implementación de un algoritmo como el A* Search en
un sistemas físico real. Un ejemplo de esto se puede observar en la Figura 4.2b, donde en la búsqueda de
un camino mas corto se realizan varios cambios de dirección, lo que desde el punto de vista de la energía se
puede considerar como un desgaste para el sistema, ya que para realizar los cambios de dirección se requiere
generar un conjunto de aceleraciones y desaceleraciones que en un sistema robótico alimentado por baterías
puede suponer el agotamiento prematuro de la carga de las baterías.
Aunque las búsquedas heurísticas se caracterizan por el uso de información para realizar la búsqueda y la
planificación de la ruta y garantizan siempre encontrar una ruta (mientas exista), se observa que en algunas
ocasiones el agente se queda sin suficiente información o con información que puede ser confusa para tomar
una decisión certera; por ejemplo cuando dos o mas nodos vecinos tienen el mismo valor f (n), se puede pensar
en que existe un factor de aleatoriedad para definir cual de los nodos debe ser “el elegido”; en este caso la
selección del nodo siguiente se da generalmente por el orden en que se programa el uso de los sensores para
56
5.2. FUTUROS TRABAJOS CAPÍTULO 5. CONCLUSIONES Y FUTUROS TRABAJOS
percibir el entorno (esta situación puede generar que el agente se aleje del nodo objetivo).
4. Desarrollar un agente robótico físico e implementar en éste alguno, o los dos algoritmos estudiados en
el proyecto.
5. Implementar el sistema de búsqueda en un entorno de tres dimensiones.
6. Construir un equipo conformado por dos o más agentes inteligentes que trabajen colaborativamente en
la solución de un problema de planificación.
7. Estudiar e implementar sistemas de optimización de variables como: distancia recorrida, esfuerzo de
control, tiempos de búsqueda y ejecución, consumo energético, entre otras.
57
58
Bibliografía
[1] Ángela Bedoya Hernández y Gustavo Guzmán Cadavid y José Chaves Osorio,
“Propuesta de desarrollo robótico para el desminado humanitario,” Scientia et
Technica, vol. 3, no. 49, pp. 239–244, 2011. 1.1
[2] A. KOTT, V. SAKS, and A. MERCER, “A new technique enables dynamic replanning
and rescheduling of aeromedical evacuation: Special articles on innovative
applications,” The AI magazine, vol. 20, no. 1, pp. 43–53, 1999. 1.1
[3] R. A. Española, Diccionario de la Real Academia de la Lengua Española, vol. 22. 2012.
2.1.1
[4] A. M. Turing, “Computing machinery and intelligence,” Mind, pp. 433–460, 1950. 2.1.2
[5] A. Barr, E. Feigenbaum, and C. Roads, The Handbook of Artificial Intelligence,
Volume 1, vol. 1. JSTOR, 1982. 2.1.2
[6] D. A. Waterman and A. Newell, “Protocol analysis as a task for artificial intelligence,”
Artificial Intelligence, vol. 2, no. 3, pp. 285–318, 1972. 2.1.2
[7] C. L. Liu, L. A. D. Torres, and G. T. Castillo, Elementos de matemáticas discretas.
McGraw-Hill, 1995. 2.1.3
[8] J. Roberto, “Inteligencia artificial: Introducción y tareas de búsqueda,” 2010. 2.1.5,
2.2.1.2
[9] J. M. Vargas, C. T. Pinzón, and C. R. Patiño, “Técnicas de inteligencia artificial para
la solución de laberintos de estructura desconocida.,” Scientia et Technica, vol. 2,
no. 39, 2008. 2.2.1.1
[10] A. González Ospina, C. Garzón, and H. Baldomiro, “Diseño, implementación y
aplicación de una estrategia de búsqueda preferente por amplitud, para uso
multidireccional sobre sistemas distribuidos o de procesamiento en paralelo, usando un
simulador de escenarios, construido para el trazado de rutas en robótica móvil,” 2011.
2.2.1.4, 2.3.4
[11] S. Koenig, M. Likhachev, Y. Liu, and D. Furcy, “Incremental heuristic search in ai,” AI
Magazine, vol. 25, no. 2, p. 99, 2004. 2.2.2.1
[12] R. E. Korf, “Depth-first iterative-deepening: An optimal admissible tree search,”
Artificial Intelligence, vol. 27, no. 1, pp. 97 – 109, 1985. 2.3.2
[13] E. Dijkstra, “A note on two problems in connexion with graphs,” Numerische
Mathematik, vol. 1, no. 1, pp. 269–271, 1959. 2.3.3
59
BIBLIOGRAFÍA BIBLIOGRAFÍA
60
BIBLIOGRAFÍA BIBLIOGRAFÍA
61
Capítulo 6
ANEXOS
62
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
2. Funcion Entorno.m
3. Funcion distanp.m
4. Funcion sucesores.m
63
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
27
28 if ( (S(2))-A >= 0 )
29 succ(k,1) = S(1);
30 succ(k,2) = S(2)-A;
31 k=k+1;
32 end
33
34 if ((S(1)-A >= 0 )&(S(2)-A >= 0 ))
35 succ(k,1) = S(1)-A;
36 succ(k,2) = S(2)-A;
37 k=k+1;
38 end
39
40 if ( (S(1))-A >= 0 )
41 succ(k,1) = S(1)-A;
42 succ(k,2) = S(2);
43 k=k+1;
44 end
45
46 if ((S(1)-A >= 0 )&(S(2)+A <= D ))
47 succ(k,1) = S(1)-A;
48 succ(k,2) = S(2)+A;
49 end
50 suce=succ;
51
52 end
5. Funcion Explorar.m
64
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
6. Funcion heurística.m
1 classdef planificador<handle
2 %UNTITLED3 Summary of this class goes here
3 % Detailed explanation goes here
4
5 properties
6 ini=[]; %vector de inicio
7 fin=[]; %vecto de fin
8 pos=[]; %vector de posicion actual
9 ruta=[]; %ruta recorrida
10 vecinos=[]; %vecinos actuales; con relacion a pos
11 d=[]; %distancia de posicion actual a la meta
12 Mexplorados=[]; %matriz del espacio explorado
13 end
14
15
16 end
65
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
6.1.2. A* Search
Teniendo en cuenta que solo se modificaron las funciones Main.m y heuristica.m con respecto a las
funciones presentadas anteriormente, en esta sección solo se presenta las funciones que han tenido cambios,
las demás se conservan igual por lo cual agregarlas seria redundante.
1. Funcion Main.m
2. Funcion heurística.m
66
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
20 while 1
21 S1.ruta=[S1.ruta,S1.pos']; %se carga la posicion actual a la ruta
22 D=Entorno(D,N,S1);
23 S1.d=distanp(S1.pos,S1.fin);
24 if S1.d==0
25 break
26 end
27 S1.vecinos = sucesores(S1.pos,D,div);
28 [S1.vecinos, S1.Mexplorados]=...
29 Explorar(S1.vecinos,S1.Mexplorados,S1.fin,S1.pos,Mocu,div);
30 [S1]=heuristica(S1,div);
31 % pause(0.2)
32 end
33
34 t=toc;
35 end
1 classdef planificador<handle
2 %UNTITLED3 Summary of this class goes here
3 % Detailed explanation goes here
4
5 properties
6 ini=[]; %vector de inicio
7 fin=[]; %vecto de fin
8 pos=[]; %vector de posicion actual
9 ruta=[]; %ruta recorrida
10 vecinos=[]; %vecinos actuales; con relacion a pos
11 d=[]; %distancia de posicion actual a la meta
12 Mexplorados=[]; %matriz del espacio explorado
13 gx=[] %sumatorio de costos de moverse entre puntos
14 Nopen=[] %lista de nodos abiertos
15 Nclose=[] %lista de nodos cerrados
16
17 end
18
19
20 end
1
2 function [N1] = entorno(E1,U1,R1,E2,U2,R2,E3,U3,A,D)
3
4 %% % % FUNCION
% QUE ENTREGA LOS NODOS OCUPADOS EN FORMA DE MATRIZ BINARIA
5
6
7 %Primer elemento. Rectangulo.
8
9 %E1 = Vector de escalamiento en eje X, Y y Z respectivamente.
10 %U1 = Vector de ubicacion coordenado en el eje X y Y respectivamente.
11 %R1 = Rotacion en pi radianes.
12
13 %Segundo elemento. Rectángulo.
14
15 %E2 = Vector de escalamiento en eje X, Y y Z respectivamente.
16 %U2 = Vector de ubicacion coordenado en el eje X y Y respectivamente.
17 %R2 = Rotacion elemento 2 en pi radianes.
18
19 %Tercer elemento. Cilindro.
67
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
2. Funcion geo.m
68
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
26
27 XO22 = linspace(1,0,E1(2)*2)*E1(2); %Escalamiento lado 2
28 YO22 = linspace(0,0,E1(2)*2);
29 [XRA22 YRA22] = rotacion2(XO22,YO22,R1+pi/2); %Rotacion lado 2 (Ancho 1)
30 XRA2 = XRA22 + XRL1(1); %Lado 4 (Ancho 2) y traslado
31 YRA2 = YRA22 + YRL1(1);
32
33
34
35 %Guardamos todos los puntos del rectangulo 1 en los vectores XO1 YO1
36
37 XO1=XRL1;
38 XO1(length(XO1)+1:length(XO1)+length(XRA1))=XRA1;
39 XO1(length(XO1)+1:length(XO1)+length(XRL2))=XRL2;
40 XO1(length(XO1)+1:length(XO1)+length(XRA2))=XRA2;
41
42 YO1=YRL1;
43 YO1(length(YO1)+1:length(YO1)+length(YRA1))=YRA1;
44 YO1(length(YO1)+1:length(YO1)+length(YRL2))=YRL2;
45 YO1(length(YO1)+1:length(YO1)+length(YRA2))=YRA2;
46
47
48 %% % % TRASLADO(
% hacia la ubicacion en el entorno)
49
50 XO1E=XO1+U1(1);
51 YO1E=YO1+U1(2);
52
53 %Inicializacion de matrices
54
55 XO1F = zeros(10,length(XO1));
56 YO1F = zeros(10,length(XO1));
57 ZO1F = zeros(10,length(XO1));
58
59 %ELEMENTO 2 (RECTANGULO 2)
60
61
62 %Generamos vectores de graficacion
63
64
65 XP11 = linspace(0,1,E2(1)*3)*E2(1); %Escalamiento lado 1 (Largo 1)
66 YP11 = linspace(0,0,E2(1)*3);
67 [XPL1 YPL1] = rotacion2(XP11,YP11,R2); %Rotacion lado 1
68
69 XP12 = linspace(0,1,E2(2)*3)*E2(2); %Escalamiento lado 2 (Ancho 1)
70 YP12 = linspace(0,0,E2(2)*3);
71 [XPA1 YPA1] = rotacion2(XP12,YP12,R2+pi/2); %rotacion lado 2
72
73 %Se conforma el rectangulo, trasladando los lados.
74
75 XPL2 = XPL1 + XPA1(length(XPA1)); %Lado 3 (Largo 2) y traslado
76 YPL2 = YPL1 + YPA1(length(YPA1));
77
78 XPA2 = XPA1 + XPL1(length(XPL1)); %Lado 4 (Ancho 2) y traslado
79 YPA2 = YPA1 + YPL1(length(YPL1));
80
81 %% %ESCALAMIENTO
82
83 %Guardamos puntos de rectangulo 2 en los vectores XO1 YO1
84
85 XP1=XPL1;
86 XP1(length(XP1)+1:length(XP1)+length(XPA1))=XPA1;
87 XP1(length(XP1)+1:length(XP1)+length(XPL2))=XPL2;
88 XP1(length(XP1)+1:length(XP1)+length(XPA2))=XPA2;
89
90 YP1=YPL1;
91 YP1(length(YP1)+1:length(YP1)+length(YPA1))=YPA1;
92 YP1(length(YP1)+1:length(YP1)+length(YPL2))=YPL2;
93 YP1(length(YP1)+1:length(YP1)+length(YPA2))=YPA2;
69
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
94
95
96 %% % % TRASLADO
% (Hacia la ubicacion en el entorno)
97
98 XP1E=XP1+U2(1);
99 YP1E=YP1+U2(2);
100
101 %Inicialiacion de matrices
102
103 XP1F = zeros(10,length(XP1));
104 YP1F = zeros(10,length(XP1));
105 ZP1F = zeros(10,length(XP1));
106
107 %ELEMENTO 3 (CILINDRO)
108 %se escala y se ubica en el entrono
109 teta = linspace(0,2*pi,E3(1)*8);
110
111 i=0;
112 for i=1:length(teta)
113 XO3E(i) = cos(teta(i));
114 YO3E(i) = sin(teta(i));
115 end
116
117 XO3E = XO3E*E3(1)+U3(1);
118 YO3E = YO3E*E3(2)+U3(2);
119 i=0;
3. Funcion angulo.m
70
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
38 else
39 con4=0;
40 end
41 if con3+con4==2
42 teta=pi/2;
43 else
44 teta=teta;
45 end
46
47 if x==0 & y==0
48 teta=0;
49 else
50 teta=teta;
51 end
4. Funcion NODOS2.m
1 function[XNn,YNn,XS1,YS1,XS2,YS2,XS3,YS3] = ...
2 NODOS2(E1,U1,R1,E2,U2,R2,E3,U3,A,D)
3
4 %% % XNn YNn = nodos no ocupados.
5 %% % XS1 YS1 = nodos ocupados por el primer elemento.
6 %% % XS2 YS2 = nodos ocupados por el segundo elemento.
7 %% % XS3 YS3 = nodos ocupados por el tercer elemento.
8
9 %GENERACION DE LOS NODOS EN EL ENTORNO
10
11 %Inicializacion de matices
12 Xn = zeros(D+1,D+1); Yn = zeros(D+1,D+1); Zn = zeros(D+1,D+1);
13
14 for i = 1:D+1
15 Xn(i,:) = linspace((i-1)*round(A/D),(i-1)*round(A/D),D+1);
16 Yn(i,:) = linspace(0,A,D+1);
17 Zn(i,:) = linspace(0,0,D+1);
18 end
19
20 %% % % % % % % % % % % % % % % % % %SE
% % GUARDAN
%% NODOS EN VECTORES % % % % % % % % % % % % % % % % % % % %
21 Tam = size(Xn);
22 i=0;j=0; XNn = []; YNn = [];
23 for i=1:Tam(1)
24 for j=1:Tam(2)
25 XNn(length(XNn)+1) = Xn(i,j);
26 YNn(length(YNn)+1) = Yn(i,j);
27 end
28 end
29
30 %
31 % % % % % % % % %SE
% RETIRAN LOS NODOS DEL AREA DE LOS ELEMENTOS % % % % % % % % % % % % % %
32 %
33 % % % % % % % % % % % % % % % % %ELEMENTO
%%%% 1 Y ELEMENTO 2 % % % % % % % % % % % % % % % % % % % % % % % % %
34 %
35 off = 6; %Offset de seguridad
36 %
37 %% %Trasladamos y rotamos nodos segun ubicacion y rotacion de los elementos
38
39 Xnr1 = Xn-U1(1); Ynr1 = Yn-U1(2);
40 [XnR1 YnR1] = rotacion2(Xnr1,Ynr1,-R1);
41
42 Xnr2 = Xn-U2(1); Ynr2 = Yn-U2(2);
43 [XnR2 YnR2] = rotacion2(Xnr2,Ynr2,-R2);
44
45 T1 = size(XnR1);
46
47 %Inicializacon de matrices
48 XS1 = zeros(T1(1),T1(2));
49 XS2 = XS1;
71
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
72
6.1. CÓDIGOS IMPLEMENTADOS EN MATLAB CAPÍTULO 6. ANEXOS
5. Funcion rotacion2.M
73