miércoles, 21 de enero de 2009

Gazeboo

Para la realización de esta última práctica he usado algunos métodos de la práctica del VFF para mover el robot mediante una fuerza resultante.

La fuerza resultante la calculo buscando a una cierta distancia del robot una linea roja y dependiendo de donde se encuentra la linea roja la fuerza resultante tendrá una dirección u otra.

Por ejemplo, si la linea roja se encuentra a la izquierda de la zona de visión del robot, la fuerza resultante hará que el robot gira hacia la izquierda hasta que la linea roja se encuentre en el centro de su visión.

Cuando el robot no encuentra ninguna linea roja el robot parará y girará hacia el lado donde vio por ultima vez el color rojo.

El robot seguirá girando hasta que encuentre una linea roja en su centro de visión. Una vez encuentre la linea continuara su marcha como se explico al principio.

Como se puede observar, he resuelto el problema de seguir una línea mediante un grafo de estados, que sería el siguiente:

  1. Seguir la linea roja intentando centrarla en el centro de visión.
  2. Cuando no encuentre la linea parar y girar hacia el lado en el que se vio el color rojo por ultima vez.
  3. Seguir girando hasta encontrar la linea de color rojo en el centro de visión, una vez encontrada dejar de girar y volver al estado 1.



Para ver el video con mayor calidad pulsa aqui


cheste (intento 2)

Tras mejorar el VFF e incorporar el algoritmo al de la practica del circuito de cheste. El robot ya es capaz por si solo de completar una vuelta al circuito de cheste, pero la pega es que tarda mucho, en su mejor vuelta el robot hizo un tiempo de 4 minutos 56 segundos.

Estos tiempos dejaban bastante que desear, así que, tras meditar el problema llegué a la conclusión de que el algoritmo del VFF es bastante apropiado cuando se quiere superar un obstáculo pero para navegar fluidamente por el circuito habrá que desarrollar un algoritmo distinto al del VFF.

  1. El primer algoritmo que se me ocurrió fue que el robot siguiera la pared de su izquierda en el sentido que le indicara la fuerza de atracción, y cuando se encontrara con algún obstáculo lo solventará mediante VFF para mas tarde volver a seguir la pared de la izquierda.

    También el VFF se activará cuando el robot pierda la referencia de la pared izquierda, cosa que suele pasar cuando el robot se encuentra con curvas hacia la izquierda.

    El resultado de este algoritmo fue todo un éxito, el robot acababa el circuito en 2 minutos y pocos segundos. Aunque aún los tiempos eran un poco malos.

    Estos tiempos "altos" se debían a que cuando el robot perdía su referencia con la pared izquierda (generalmente en las curvas hacia la izquierda) se activaba el VFF por lo que se perdía tiempo.


  2. Tras meditar el nuevo problema, le di una vuelta mas de tuerca a la idea de seguir la pared y modifique el algoritmo anterior de forma que cuando perdiera la referencia de la pared de la izquierda siguiera la pared de la derecha hasta volver a encontrar la pared izquierda. De esta forma el VFF solo se activaría cuando tuviera que solventar un obstáculo.

    El resultado de esta nueva idea fue que, como era de esperar, el VFF no se activaba tantas veces por lo que los tiempos bajaron a1 minuto 40 y pocos segundos.

Tras conseguir estos tiempo me centré en intentar mejorar el VFF ya que solventaba obstáculos, pero lo hacía de una forma poco eficiente (a veces tenía un hueco muy grande a la derecha y decidía ir hacia la izquierda).

Así que pensé en otro nuevo algoritmo para solventar obstáculos de manera más eficiente y, si en última instancia, el robot se encuentra muy cerca de un obstáculo se activará el VFF.

Por lo que la idea que tuve fue que cuando el robot se encontrará con un obstáculo buscará cual es el hueco mas grande que hay para seguir con su camino y avanzar hacia él.

Tras implementar mi nueva idea me di cuenta que cuanto más funcionalidades se le dan al robot mas difícil es hacer un gestor de estas funcionalidades. Había veces que ante un obstáculo se activaba el VFF y otras no, o saltaban funcionalidades del robot que no quería que saltarán en ese momento.

Tras este inconveniente, decidí que lo mejor era hacer dos funcionalidades una para hacer la navegación fluida y otra para solventar obstáculos.

Por casualidad se me ocurrió probar mi nueva idea de buscar el hueco mas grande y avanzar hacia él como funcionalidad para hacer la navegación mas fluida. Cual fue mi sorpresa cuando vi que los tiempos habían bajado a 1 minuto y 18 , 19 segundos, y además el algoritmo consumía mucho menos capacidad de procesamiento.


Por ultimo tras realizar algunas modificaciones en el VFF para que fuera más seguro (había veces que se chocaba con las esquinas) el robot completaba el circuito en 1 minuto y 23, 24 segundos de forma totalmente segura.

A continuación se muestran fotos y videos con el robot recorriendo el circuito.




Foto 1: Robot recorriendo el circuito sin obstaculos.




video 1: Robot recorriendo el circuito sin obstaculos
Para ver el video con mejor calidad pulsa aqui





Foto 2: Robot recorriendo el circuito con obstaculos.




video 2: Robot recorriendo el circuito con obstaculos
Para ver el video con mejor calidad pulsa aqui



VFF mejorado

Partiendo del VFF anterior se han realizado las siguientes modificaciones:

  • La velocidad lineal ahora es proporcional a las fuerzas de atracción y repulsión, es decir cuando la fuerza de repulsión sea mayor que la fuerza de atracción el robot avanzará a su mínima velocidad, mientras que si la fuerza de repulsión es 0 el robot avanzará a su máxima velocidad, por ultimo si la fuerza de repulsión no es nula y es menor que la fuerza de atracción el robot avanzará a una velocidad que estará comprendida entre su mínima velocidad y su máxima velocidad.
    Con esta mejora conseguimos agregarle seguridad al robot ya que avanzará mas despacio cuando tenga objetos cercanos a él y avanzará mas rápido cuando no haya obstáculos cerca de él.

  • La velocidad angular ahora es proporcional al ángulo formado entre la fuerza resultante y el eje x positivo del robot, es decir cuanto mayor sea el giro que tenga que realizar el robot mayor será su velocidad angular, pero si el ángulo de giro es pequeño la velocidad angular será pequeña.

  • Con esta mejora conseguimos que el robot sea menos nervioso, ya que antes se dirigía hacia su destino vibrando, debido a que cuando el robot intentaba hacer pequeñas correcciones en su rumbo entraba en un bucle infinito porque la velocidad angular era excesiva y se pasaba de giro, por lo que el robot tenia que volver a hacer otra corrección en su rumbo y así indefinidamente.

  • Se añade una nueva variable llamada angulo_oscilacion. Si el ángulo formado por la fuerza resultante y la fuerza resultante de la iteración anterior es menor que el angulo_oscilacion el robot sigue calculando la velocidad lineal y angular con la fuerza resultante de la iteración anterior.

  • Con esta mejora conseguimos que el robot no este haciendo constantemente correcciones en su rumbo, por lo que evitamos posibles oscilaciones innecesarias.

  • Se añade una nueva variable llamada ángulo_bloqueo, cuando el ángulo formado por la fuerza de atracción y la fuerza repulsiva son mayores que el ángulo_bloqueo la fuerza resultante se calcula con el vector perpendicular a la fuerza de repulsión y con el vector perpendicular a la fuerza de atracción.

  • El valor de la variable angulo_bloqueo debe tener un valor superior a 150 para el correcto funcionamiento del algoritmo.

    Con esta mejora conseguimos que cuando el robot encuentre un mínimo local, avance perpendicularmente a la fuerza de atracción y repulsión por lo que generalmente hace que el mínimo local desaparezca y el robot pueda continuar con su misión.

A continuación se puede ver un vídeo en el que se pueden observar como ha mejorado el robot con relación al anterior vídeo de VFF.

Un momento interesante del vídeo es cuando se pone el cursor dentro de uno de los semi-círculos del mapa, se puede observar como el robot da la vuelta al semicirculo, algo impensable con el algoritmo anterior del VFF.





Para ver el video con mayor calidad pulse aqui

Circuito de cheste (intento 1)

Lo primero que he desarrolado para hacer frente a esta practica ha sido una libreria en C ("LeerFichero.c") para leer el archivo "secuencia.txt" y extraer las coordenadas por las que el robot se guiará en el circuito de cheste.

El siguiente paso ha sido hacer uso de esta librería para pasarle las coordenadas pertinentes al algoritmo VFF realizado en la practica anterior.

El resultado de esto, ha sido que el robot sigue las coordenadas de forma ordenada, pero nunca llega a acabar el circuito por si solo, por que se atranca debido a que se producen muchos minimos locales en su recorrido.

Para resover esto, daré un paso atras e intentare mejorar el VFF de forma que pueda solventar el mayor numero de minimos locales.

lunes, 1 de diciembre de 2008

robot corriendo algoritmo VFF




Para ver el video con mayor calidad pulsa aquí


Este robot llega a su destino superando obstaculos mediante fuerzas de atracción y de repulsión.

La linea roja, representa la fuerza de atracción, la azul la fuerza de repulsión y la negra la fuerza resultante de la suma de ambas.

Para hacer mas fluida su trayectoria se le ha dado menos peso a las fuerzas repulsivas que proceden de objetos laterales. De esta forma se atranca menos cuando el robot esta andando cerca de una pared.

Por ultimo, según se vaya acercando el robot al destino, su velocidad irá disminuyendo, para así no pasarse el punto de destino.

domingo, 30 de noviembre de 2008

Mi robot choca-gira



Para ver el video con mayor calidad pulsa aquí

Robot que cuando esta a punto de chocar, anda marcha atras un cierto tiempo y gira durante un tiempo a una velocidad angular aleatoria y en un sentido aleatorio para volver a reanudar su marcha.