jueves, 12 de mayo de 2011

Depurando y parametrizando la práctica cd VFF

La parametrización es relativamente trabajosa. Los parámetros más importantes son la relación entre fuerza atractiva y repulsiva, así como las distancias a las que la fuerza repulsiva se hace cero y llega a su máximo.

El problema principal que tuve es que tenía un bug en el cálculo de la fuerza repulsiva. Estaba correcta para 0º, 90º y 180º, pero en valores intermedios tenía un error. Y, sobre todo, el problema principal es que el error no era demasiado grande, es decir, el programa medio funcionaba. Así que parametricé y afiné con ese error. Cuando lo descubrí, porque las cosas no acababan de ir bien, quedaba muy poco tiempo para re-parametrizar. Tuve que volver a calcular los parámetros.

El robot, no sé si por él mismo o por artefactos del simulador, tiene mucha inercia. Me gustaría poder probarlo con un robot de verdad, porque tampoco se hace uno una idea por la presentación gráfica...

Finalmente conseguí una parametrización medio buena, parece que la práctica acabó saliendo bien.

viernes, 6 de mayo de 2011

La segunda práctica: navegación local usando campos de potencial

La segunda práctica consiste en hacer bastante más inteligente nuestro robot. En lugar de limitarse a detenerse y girar aleatoriamente cuando va a chocar, ahora queremos que sea capaz de ir hasta un punto destino esquivando obstáculos que pueda haber en el camino. Para ello usaremos un método relativamente simple: el de campos de potencial generalizados.

Se trata de un método de navegación local, es decir, no basada en mapa sino en sensores, que sirve para objetivos cercanos.

El método consiste en considerar que nuestro robot está sometido a una fuerza atractiva, que depende de la distancia al destino, y de un campo de fuerzas repulsivas, que depende de las distancias a cada obstáculo.

Haremos la fuerza atractiva proporcional a la distancia, con un máximo. Es decir, más allá de una determinada distancia la fuerza atractiva es constante.

La fuerza repulsiva de cada obstáculo percibido es inversamente proporcional a la distancia. La fuerza repulsiva total será la suma vectorial de todos los obstáculos. En el caso del robot Pioneer usaremos el sensor detector de distancias laser, que nos proporciona la distancia a obstáculos con resolución de 1º, de en toda la mitad frontal de nuestro horizonte. Es decir, tendremos 180 distancias a obstáculos con las que calcular nuestra fuerza repulsiva.

La fuerza total se calcula combinando la atractiva y la repulsiva con dos parámetros cuya razón da el grado de timidez  o prudencia (avanzamos lentamente hacia el objetivo, nos dan "miedo" los obstáculos) contra temeridad (avnzamos hacia el objetivo ignorando los obstáculos). Una vez calculada la fuerza total, será la que guíe nuestra navegación. Es decir, le daremos órdenes a los sensore en función de su valor y dirección.

Nos recomienda el profesor que primero usemos las rutinas del simulador para dibujar el vector de la fuerza atractiva con origen en el robot. Luego, que pintemos alguna componente repulsiva, luego la suma. Finalmente podemos pintar también la resultante.

Lo hago mientras mantengo las rutinas de navegación choca-gira, y eso me permite familizarizarme y ajustar los parámetros para que las fuerzas tengan un balance razonable.

En la figura se aprecia solo la fuerza atractiva, en rojo, en diagonal hacia el puntero del ratón. Las otras líneas son los ejes de coordenadas del robot.

jueves, 5 de mayo de 2011

Afinando el choca-gira

Una vez programado el comportamiento base del choca-girar, es decir, los tres estados y la transición entre ellos, me encontré con un problema: el robot tiene mucha inercia, y es relativamente fácil tanto chocar con la pared como volcarlo.

El choque con la pared se produce porque la velocidad adelante que le asignamos no la adquiere instantáneamente, por lo que si la distancia a la que comenzamos a dar orden de retroceder es corta, no le dará tiempo a hacerlo y chocará.

El problema del vuelco típicamente pasa cuando para resolverlo hacemos la velocidad de retroceso más alta. Pasar de golpe una velocidad de ~700 mm/s a una velocidad de -500 mm/s, por ejemplo, volcará el robot.

Para estos problemas hay soluciones posibles:
• aumentar la distancia a la que cambiamos de estado hará más difícil el choque
• reducir las velocidades de avance/retroceso también
• algo más sofisticado, se puede hacer que la velocidad adelante dependa de la distancia al obstáculo, siendo menor cuando nos acercamos a la distancia a la que cambiaremos de estado

Presento una imagen de la simulación.