martes, 8 de mayo de 2012

VFF (Virtual Force Field)

Esta práctica consiste en emplear la técnica de navegación local VFF (Virtual Force Field)  para que el robot navegue por el mundo con el objetivo de alcanzar un destino evitando chocar con obtáculos.
Para ello la única información de la que se dispone es el punto al que debe llegar y las medidas ofrecidas por el láser que lleva incorporado en la parte frontal.

Para resolver el problema empleando VFF podemos distinguir dos fases: una primera fase en la que se obtendrá la fuerza de atracción hacia el punto al que se desea llegar, la fuerza repulsiva a partir de las medidas del láser y la combinación ponderada de ambas fuerzas, y una segunda fase en la que se comandará el robot en base a la fuerza resultante obtenida.

Fase I: composición de fuerzas


Fuerza repulsiva

La fuerza repulsiva se calcula en base a las medidas del láser. Para ello debemos traducir estas medidas en fuerzas respulsivas y representarlas como vectores relativos en el sistema de coordenadas del propio robot.
En la siguiente imagen podemos ver la relación entre las distintas componentes del láser (enumeradas del 0 al 179 en el sentido contrario a las agujas del reloj) y el sistema de coordenadas del robot (el eje X corta longitudinalmente al robot con sentido de atrás hacia adelante, y el eje Y corta transversalmente al robot con sentido de derecha a izquierda).



Atendiendo a esta relación, las distintas componentes del láser se podrían representar en el sistema de coordenadas del robot como vectores con origen en centro del robot (x=0, y=0) y extremo en x=sen(componente_laser)*medida(componente_laser), y=-cos(componente_laser)*medida(componente_laser)

Esta relación es importante para obtener los vectores que representarán las distintas fuerzas repulsivas a partir de las medidas del láser, y que tendrán el sentido contrario a la representación de las medidas del láser en el sistema de coordenas.

Una vez tenemos esto claro, únicamente nos faltaría asignar un módulo correcto a cada fuerza atendiendo a la idea básica que será inversamente proporcional a la medida del láser en la componente correspondiente (cuanto más cerca estemos de un obstáculo, más fuerza de repulsión habrá, y viceversa).
En concreto se ha empleado una función compuesta que da más importancia a unas componentes u otras dependiendo en qué rango se encuentre la medida correspondiente:
adjustDst = laser->distanceData[i];
if (adjustDst <= SECURE_DST)
     adjustDst = 1;
else if (adjustDst <= OBS_NEAR)
     adjustDst = adjustDst;
else if (adjustDst <= OBS_FAR)
     adjustDst = 2*adjustDst;
else
     adjustDst = 4*adjustDst;
force = 1.0 / adjustDst;

La fuerza de repulsión resultante será la suma vectorial de todas las fuerzas calculadas según lo explicado anteriormente.

Fuerza atractiva

Por su parte, la fuerza atractiva estará representada por un vector que apunte al destino donde el robot debe llegar y tendrá un módulo constante hasta que se encuentre lo suficientemente cerca del objetivo, cuyo módulo será proporcional a la distancia a dicho punto.

Fuerza resultante

La fuerza resultante será la suma vectorial de la fuerza repulsiva y atractiva ponderadas adecuadamente para que el robot no tenga demasiada prudencia y le impida avanzar hacia el objetivo ni sea demasiado "valiente" y se choque con cualquier obstáculo.


Fase II: comandar robot

El robot se comandará en base al ángulo que forme la fuerza resultante en el sistema de coordenadas del robot y a la distancia que se encuentre éste del objetivo.
A partir el ángulo que forma el vector asociado a la fuerza resultante se calcula un error que varía entre 0 y 1 según apunte en el mismo sentido que el robot o en sentido contrario, respectivamente, además de calcular en qué sentido tiene que girar el robot para orientarse en el sentido que marca dicho vector.
Dicho esto, en función del error obtenido tendremos dos casos:
  • ALIGN: en el que prima que el robot se alinee con el vector resultante. Para ello se proporcoina un controlador PID que asigna velocidades angulares altas si hay mucho error reduciéndolas según se acerque a lo deseado, y velocidades lineales bajas.
  • RECT: si el robot está prácticamente alineado con el vector resultante se aumentará la velocidad lineal y se mantendrán velocidades angulares para mantenerse alineado con el vector resultante en la medida de lo posible.

No hay comentarios:

Publicar un comentario