domingo, 18 de abril de 2010

Vff en Cheste

Hemos seguido trabajando en el código de navegación vff para mejorarlo aún más.
  • El calculo del ángulo de la fuerza total (gracias al cual decidimos cuanto debemos girar) lo hemos hecho con la función atan2 de C. Esta función nos devuelve el ángulo formado entre el robot y la fuerza total y nos lo da en el rango (-pi, pi). Antes lo teníamos con la funcion cos, pero esta función devuelve el resultado entre (0,pi) por lo cual pude dar problemas para ciertos ángulos ya que hay un mismo ángulo puede ser dado por distintos vectores, esto con la función atan2 no ocurre.
  • Para el movimiento hemos considerado diferentes rangos y el signo del ángulo devuelto por la función atan2. Para evitar que el robot oscile continuamente cuando tiene que ir de frente hemos decidido que en el rango [-5,5] el robot no gire. Además entre [155,180] y [-180,-155] hemos decidido que el robot solo gire en un sentido, de esta forma cuando encontramos un obstaculo que hace que la fuerza total apunte hacia el opuesto al frontal, el robot no oscilará continuamente y girará hacia un lado esquivando el obstaculo.
  • Hemos aumentado la velocidad lineal maxima hasta 800.
A continuación mostramos una serie de imágenes y videos que ilustran el funcionamiento de nuestro robot.

Recorrido del circuito sin poner obstáculos:
Tarda en dar la vuelta completa más o menos 3'15''




Si no puedes ver el video pincha puedes pinchar aqui
Recorrido del circuito con obstaculos:

Se puede observar en la imagen y en el video que nuestro robot apura bastante para esquivar el robot pero finalmente lo consigue y no se para. Los círculos verdes marcan donde ha sido colocado el obstáculo para ser esquivado.





Si no puedes ver el video pincha aqui

domingo, 11 de abril de 2010

VFF: Mejoras y Cheste

Hemos realizado mejoras en el codigo de nuestro vff . Las mejores han sido las siguientes:
  • Hemos hecho el calculo de las fuerzas repulsivas teniendo en cuenta lo que se ha explicado en el foro. Es decir, hacer los cálculos en el sistema de referencia que es más amigable con el robot. A continuación pondremos la fórmula utilizada:
fRepulsion.x=(cos(auxiliar2)*K)/(dist_Obstaculo);
fRepulsion.y=(sin(auxiliar2)*K)/(dist_Obstaculo);

donde auxiliar2 no es directamente el indice del laser que nos ha dado un posible obstaculo, sino que aplicamos un pequeña modificación para obtener directamente las fuerzas repulsivas en el mismo sistema de referencias que el robot. Esta pequeña modificación del ángulo es: (indice-90+180)*DEGTORAD;

  • Otra modificación que hemos hecho es no considerar todos las zonas del robot iguales a la hora de calcular la fuerza repulsiva. Cuando detectamos un obstáculo en el frontal de robot hacemos que se tenga muy en cuenta, para evitar que nos estrellemos contra él. A estos valores de fuerza de repulsión le damos 5 veces más valor. También consideramos de forma especial a los obstaculos que encontremos a los lados del robot, hacemos algo parecido que con el frontal, pero aumentando la fuerza de repulsión 3 veces
  • Otra cosa que hemos tenido en cuenta es si nos encontramos muy cerca de un obstaculo disminuiremos la velocidad lineal, de esta forma, evitamos que por ir muy rápido no nos de tiempo a esquivar un obstáculo. Lo que hacemos es multiplicar la velocidad lineal por 0.7
  • El algoritmo de movimiento lo seguimos calculando en función del ángulo. Si el frontal del robot está centrado (entre 85º y 95º) nos moveremos recto, sin giros, en otro caso, giraremos más o menos en función del ángulo.

A continuación pondremos dos videos, uno del vff en el circuito simple y otro en el de Cheste.
El tiempo que tardamos en dar la vuelta completa al circuito de Cheste es 3'35''

CIRCUITO SIMPLE:





CIRCUITO CHESTE: