jueves, 20 de mayo de 2010

Sigue Lineas Visual

La práctica del sigue lineas visual, responde a la teoría correspondiente al último tema visto en clase que habla sobre los controladores reactivos.
Notas de clase:
- Controlar un sistema es modificar su comportamiento para que evolucione de una forma determinada
- Controlador, modifica entradas al sistema.
- El error se define como la diferencia del estado deseado y el actual y la meta es minimizar ese error.

Para implementar esta práctica he utilizado un controlador de bucle cerrado, cuya misión es comparar continuamente el estado deseado y el actual del robot (Realimentación). El controlador elegido ha sido el controlador proporcional que responde en proporción al error.
Situándonos en el contexto de la practica, el error para mi consiste en la diferencia de pixeles no amarillos de la izquierda (del primer pixel amarillo), con los encontrados a la derecha (del último pixel amarillo).
Para poder calcular el error me he fijado en una fila y he recorrido todas las columnas con un bucle.
La fila elegida ha sido la 180 ya que esta a una distancia adecuada para poder hacer frente a las diferentes situaciones que me he encontrado posteriormente, como por ejemplo no ver ningún pixel amarillo y conseguir detener el robot sin chocarme, cosa más probable si miramos por ejemplo la fila 239.
La parte más difícil del sigue pasillos es en la cuarta curva, ya que el error es nulo y el robot sigue de frente contra la pared hasta que deja de ver amarillos, este es el momento en el que con un error de 320 y una constante de proporcinalidad de 0.3 a una velocidad de 1000, el robot se vuelve loco tirando todo lo que encuentra a su paso.
La primera solución a este problema que se me ocurrió fue la de girar a la de derecha a una velocidad angular de 30...si un poco chapuza, pero efectiva por lo menos en el caso del departamental.
Tras descartar esta opción, por poco eficiente y no conseguir recorrer la habitación que deja a la izquierda, la siguiente opción que se me vino a la mente fue, para mi la solución más correcta de las que que he pensado, pero que no me ha dado tiempo a refinar, consiste en: Cuando no ves amarillos en la linea 180, miras 20 lineas mas cerca la 200 y bajas la velocidad, si sigues sin ver amarillos, vuelves a mirar 20 lineas más cerca y vuelves a bajar la velocidad, así hasta que llegas a la linea 240, una vez que ves pixeles amarillos haces lo contrario hasta llegar otra vez a la linea 180 a una velocidad de 1000. Está idea no me funcionó, pero creo que estudiándola más detenidamente y experimentando más tiempo con ella, habría llegado a una solución bastante buena.
La solución que adopte y con la que el robot se ha comportado de una forma razonable, fue la de bajar la velocidad a -20 y girar con una constante de proporcionalidad menor a la que llevaba hasta ese momento de no ver amarillos. Los primeros problemas que me encontré con esta solución fueron varios. Al reducir la constante de proporcionalidad a lo que yo creía que era suficiente me dí cuenta que no era así y el robot giraba de forma muy brusca, encontrando amarillos de forma rápida y volviendo a una velocidad de 1000 en la siguiente iteración provocando un desastre de fuerza descontrolada, velocidad y giros sin sentido. Dar con la solución consistió en analizar estos detalles y ver como solucionarlos, primero la constante de proporcionalidad tuvo que ser reducida de una forma mucho mayor, hasta casi ser nula. Segundo la velocidad una vez encontrados amarillos fue aumentada progresivamente y de poco en poco hasta alcanzar su máximo 1000, al igual que la constante, para así controlar mejor el giro y el descontrol mencionados.


Sigue lineas sentido normal.


Sigue lineas sentido contrario.

Navegación VFF - Cheste

Teoría navegación local


Esta práctica trata de poner en práctica lo aprendido en la teoría de navegación local, utilizando la técnica de campos de Potencial VFF.


La teoría en un principio se entiende bastante bien, los conceptos que hay que aplicar y como queremos transmitir al robot las ordenes de navegación son claros. Consiste en calcular la fuerza repulsiva que ejercen los obstáculos sobre nuestro robot, calcular la fuerza atractiva que ejerce el objetivo (destino) al robot, y haciendo la suma ponderada de estas dos fuerzas calcular la fuerza repulsiva.


Lo importante, lo complicado y lo que me ha llevado más tiempo del que en un principio estimé es traducir el vector fuerza resultante obtenido a órdenes para los motores basado en casos, es el hecho de intentar ir rápido sabiendo que la posibilidad de chocar crece.


A lo largo de la práctica me he encontrado con varios problemas, algunos provocados por el hecho de una mala planificación mía y otros simplemente por la dificultad inherente a la práctica. Si este blog es leído por alguien que tenga que hacer alguna práctica parecida o básicamente cualquier práctica hay una cosa que ha de tener en cuenta que le ahorrara mucho trabajo y horas perdidas en vano. ¡NO VALE LA PENA CAMBIAR VELOCIDADES Y VELOCIDADES ANGULARES DE FORMA INTUITIVA O EXPERIMENTAL! Así estuve mucho tiempo yo, cambiando v=1000 por v = 700, y situaciones similares...


Después de perder mucho tiempo, decidí replantear el problema, volver a pensarlo en vez de tirar lineas de código y casos que no llegaban a ninguna parte, calcular bien la fuerza repulsiva lo cual es más complicado de lo que parece a priori y conseguir un buen vector fuerza resultante se antoja determinante a la hora de ganar horas y conseguir unos resultados aceptables. Mi consejo es, quitando la velocidad al robot y utilizando la ayuda de poder arrastrar el robot por el circuito ir viendo como se pinta las fuerzas poco a poco.
Es decir:
1- Como se pintan los vectores si estoy lejos del objetivo y lejos de la pared
2- Como se pintan los vectores si estoy lejos del objetivo y cerca de la pared
3- Como se pintan los vectores si estoy cerca del objetivo y lejos de la pared
4- Como se pintan los vectores si estoy cerca del objetivo y cerca de la pared
5- Como se pintan los vectores si estoy de frente y muy muy cerca de la pared


Una vez comprobado que estos vectores se pintan como tu quieres, como a ti visualmente te parecen acertados, traducir estos a unas velocidades lineales y de giro apropiadas ya no es un factor tan experimental si no que se vuelve mucho más seguro y rápido de corregir.



Vídeo de los vectores.



Una vuelta sin obstáculos y otra con obstáculos.

miércoles, 17 de marzo de 2010

Choca-Gira

La práctica del robot choca-gira consiste en implementar el comportamiento de un robot para que cuando esté lo suficientemente cerca de un obstáculo sea capaz de retroceder, girar y volver a ponerse en marcha. Para programar este comportamiento he definido tres posibles estados.

1-Avanza:
En este estado el robot no ha detectado ningún obstáculo en frente y avanza en linea recta hasta encontrar un obstáculo a una distancia mínima antes del impacto
2-Retroceso:
El robot se ha encontrado un obstáculo y por tanto ha de dar marcha atrás siguiendo la misma dirección de avance.
3-Giro:
Se establece de forma aleatoria una nueva dirección por la que el vuelva a avanzar. El robot girará hasta alcanzar la nueva posición por el lado más corto, y una vez alcanzada el robot volverá a iniciar el avance.