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:

No hay comentarios:

Publicar un comentario

Debido al aumento de comentarios de spam he moderado todos los comentarios. No se publicará hasta que le dé el visto bueno. Gracias y disculpad las molestias.