viernes, 26 de marzo de 2010

práctica navegación vff

Hola,
este post describe los pasos realizados para la implementación del algoritmo de navegación vff(virtual force fields). Dicho algoritmo se basa en la utilización de campos virtuales de fuerzas, fuerzas atractivas en dirección al objetivo del robot y fuerzas repulsivas en sentido contrari a los obstáculos, de manera que el robot sea capaz de crear una fuerza resultante que le permita alcanzar el objetivo sorteando todos los obstáculos.

Para facilitar la navegación del robot utilizamos "vectores" de fuerza atractiva máxima que permitan hacer equitativas las fuerzas de atracción y repulsión en cada momento. La intensidad de las fuerzas repulsivas se calcula de manera inversamente proporcional a la cercanía de los obstáculos para que el robot sea capaz de calcular una fuerza resultante que le aleje de dichos obstáculos. Adjunto un vídeo que muestra el funcionamiento del algoritmo:


Los principales componentes del algoritmo de navegación VFF implementado son:
* fuerzas repulsivas inversamente proporcionales a la distancia
* fuerzas atractivas constantes (max_fza = 800) salvo cerca que es proporcional a la distancia
* Suma ponderada de la fuerza resultante:
Fresultante = alpha*Fatractiva + (1-alpha)*Frepulsiva
alpha = se utiliza para dar más peso a Fa ó Fr. En nuestro algoritmo, alpha=0.5, es decir se les da el mismo peso.
* Traducir Fresultante a órdenes para los motores (basado en casos). Casos posibles:
- distancia al objetivo < 300 --> objetivo alcanzado
- distancia al objetivo > 300 y robot girando
- distancia al objetivo > 300 y robot avanzando

Saludos

jueves, 11 de marzo de 2010

práctica choca-gira corregida

En esta nueva versión he realizado las siguientes mejoras:
* añadir distancia_lateral=300 y distancia_frontal=500 para crear un pasillo de visión del robot. El pasillo mejora notablemente el funcionamiento del robot ya que sigue adelante aunque detecte un obstáculo cercano lateralmente.
* implementado un autómata finito de estados para materializar el comportamiento pedido sin perder la ejecución iterativa. Esto ayuda ya que consume menos CPU el robot ahora por cada iteración. Los estados son los siguientes:
avance --> retroceso --> giro --> avance
donde el estado por defecto es avance y cambia al detectar un obstáculo.
* cambiar estado del robot utilizando un cronómetro (gettimeofday)

Adjunto el vídeo actualizado del comportamiento del robot:


Otra de las modificaciones a destacar es el modo de giro. El ángulo de giro debe ser aleatorio pero hay que escoger un rango adecuado. Si escogemos un rango demasiado grande es posible que giremos demasiado. Si escogemos demasiado poco, es posible que el giro sea inútil a la hora de salvar el obstáculo. Finalmente, con esta práctica se comprueba que lo más eficiente para obtener el ángulo es tener un random sobre un rango de 120 grados. Dicho ángulo se aplicará en el sentido contrario al del obstáculo detectado y dichos sentidos se obtienen al dividir las señales del laser entre 2, dos mitades de 90 grados.