domingo, 28 de marzo de 2010

Entrenamientos en el circuito de Cheste

Hoy sólo he hecho una jornada de entrenamiento en el circuito de Cheste para comprobar si mi algoritmo de navegación local VFF es suficiente para recorrer el circuito..

Para recorrer el circuito aumenté un poco el margen desde el cual los obstáculos ejercen fuerzas de repulsión (arco verde) y aumenté la velocidad máxima cuando el destino está entre -30º y 30º. En la penúltima curva se ve claramente que la lógica de decisión necesita unos retoques para evitar comportamientos erráticos, aunque sean breves.

Dejaremos a Fernando Robonso y su fórmula R descansar un poco antes de pensar cómo mejorar la lógica de navegación.

sábado, 27 de marzo de 2010

Navegación local usando VFF (vectores de fuerzas de repulsión)

El algoritmo de vectores de fuerzas de repulsión basa su funcionamiento en fuerzas vectoriales que se oponen al movimiento frontal del robot creados por los obstáculos a su alrededor.

Cuando el robot no tiene ningún obstáculo frente a él la única fuerza que actúa sobre él es la atracción ejercida por el punto de destino (vector dirección).

Sin embargo conforme aparecen obstáculos, éstos ejercen una fuerza con dirección al robot y fuerza inversamente proporcional a su distancia. Eso provoca que los objetos lejanos empiecen a modificar la trayectoria del robot intentando que evite acercarse a ellos, pero conforme el robot se acerca a un obstáculo por estar en medio del camino éste ejerce cada vez más fuerza de repulsión hasta que ésta supera a la fuerza de atracción del destino, provocando que el robot se detenga y busque otro camino.

En la mayoría de los casos, si el objeto se encuentra en la tangente del trayecto, las fuerzas de repulsión modificarán la trayectoria del robot levemente sin hacer que éste se detenga para evitar la colisión.

En el siguiente vídeo se observa una implementación de la navegación local usando fuerzas VFF en el que la lógica de decisión realizará las siguientes acciones dependiendo del ángulo que tenga el vector resultante (la suma del vector de repulsión más el vector de navegación al destino). Hay que tener en cuenta que mientras un obstáculo no se encuentre dentro de la zona delimitada por el arco verde éste no ejercerá fuerzas de repulsión:

  • Si el vector forma menos 30º respecto a la orientación del robot: El robot avanza a máxima velocidad corrigiendo levemente su trayectoria.
  • Si el vector forma un ángulo comprendido entre 30º y 60º respecto al avance del robot: El robot modera su velocidad corrigiendo su trayectoria poco a poco.
  • Si el ángulo que forma con el sentido de avance del robot es superior a 60º: el robot se detiene y gira con más velocidad para corregir el error de dirección.

Para evitar que el robot se comporte de manera errática cuando los vectores de dirección y repulsión se contrarrestan he agregado dos constantes. Una de ellas empuja constantemente al robot hacia delante sumándose al vector resultante anterior. Por otro lado si el módulo del vector resultante no supera una magnitud mínima entonces el robot avanza y gira como si el vector resultante y la trayectoria del robot formasen entre 30 y 60º (avanza con velocidad moderada mientras corrige la dirección).

En el siguiente vídeo puede observarse que la mejora funciona bien sin tener que complicar la lógica de decisión:

Comportamiento choca-gira con decisión de giro mejorada

En la segunda mejora he achatado los umbrales de seguridad (arco rojo) y de velocidad (umbral verde) pero, como modificación más importante, el algoritmo de decisión del sentido de giro ya no es completamente aleatorio.

Para decidir hacia qué sentido girar calculo la suma de distancias a obstáculos a derecha e izquierda del robot haciendo que éste gire hacia el sentido en el que la distancia media sea mayor. De este modo evitamos movimientos inútiles hacia esquinas de la habitación, permitiendo, a su vez, que decida ir en sentido de un pasillo en vez de ir contra las paredes de forma aleatoria.

El arco que recorremos para dicha decisión es el comprendido entre los grados 30 y 90 a ambos lados del robot. El ángulo de giro aleatorio también estará comprendido entre esos ángulos.

El el vídeo podemos observar que ahora el robot ha recorrido una mayor superficie de nuestro mundo virtual gracias a evitar giros muy cortos que apenas mejoran la posición respecto del obstáculo o aquellos que lo llevan frente a un obstáculo, pared o esquina.

Comportamiento choca-gira con velocidad variable

La primera mejora que he implementado es un control de velocidad basado en el entorno que reduce la velocidad en caso de existir un objeto dentro de la zona de seguridad.

Las zonas de seguridad (arco verde) y de evasión de colisión (arco rojo) tienen el centro adelantado para permitir pasar al robot por zonas estrechas a la vez que minimizan la posibilidad de colisión frontal.

La próxima mejora será una búsqueda algo más "inteligente" del sentido de giro. Seguirá siendo aleatorio pero dotaremos de cierta inteligencia al sentido de giro y limitaremos el ángulo para evitar giros casi nulos o giros demasiado amplios.

viernes, 26 de marzo de 2010

Comportamiento choca-gira básico

En este primer intento he implementado una versión muy básica del comportamiento "choca-gira" en el que el robot se mueve por el mundo usando una máquina de estados finitos que tiene los siguientes tres estados:

  1. Estado "avanza": El robot avanza por el mundo en línea recta a velocidad constante. En el momento que se detecta un objeto más cercano de un umbral se pasa al estado "retrocede" para evitar la colisión.
  2. Estado "retrocede": El robot retrocede durante un número definido de iteraciones antes de pasar al estado "gira".
  3. Estado "gira": El robot gira un ángulo aleatorio para tratar de sortear el obstáculo. Una vez girado el ángulo deseado el robot volverá al estado "avanza".

La siguiente ilustración muestra gráficamente la relación entre los estados:

Estados

En el siguiente vídeo puede observarse el comportamiento del robot usando este algoritmo en su versión más básica:

En la siguiente versión trataré de optimizar el algoritmo con algunas mejoras como: velocidad variable dependiendo del entorno y giro hacia el lado con más espacio.

Instalación completada

A día de hoy he completado la instalación del entorno de desarrollo y simulación: player 2.0.5 + stage 2.0.4 + gazebo 0.7.0 + jderobot 4.3.0 y realizada la primera compilación del schema introrob.

A continuación preparo las imágenes y explicaciones del primer ejercicio y las múltiples variantes (o mejoras) implementadas: el comportamiento choca-gira.