martes, 22 de marzo de 2011

Práctica 4. Buscando el equilibrio

Aqui viene la entrada para la práctica 4, en ella hemos tenido que implementar un Segway con nuestros NXT asi que hemos tenido que rediseñar el aspecto de nuestro robot.






Como vemos ahora VivaBender tiene un aspecto mucho mas simple, con dos motores y un sensor de luz que nos serán suficientes para implementar este Segway.

El concepto de la práctica es sencillo, tenemos que equilibrar al robot basándonos en los valores que obtenemos del sensor de luz, si se inclina hacia delante obtendremos más luz y tendremos que corregir moviendo la base hacia delante y en caso de caer hacia atrás percibiremos menos luz y moveremos la base hacia atrás.

¿La manera de conseguir esto? Un controlador PID. Este tipo de controlador es una forma sencilla de mantener un estado concreto en un sistema (en nuestro caso mantenernos en equilibrio), basa su funcionamiento en tres constantes: la proporcional (P) corrige el error de forma proporcional a este; la integral (I) corrige un error prolongado en el tiempo y la derivativa (D) hace que no tratemos igual a un mismo error si este está disminuyendo o si está aumentando.

La fórmula final queda como sigue:

Valor PID = Kp * error + Ki * error_integral + Kd * error_derivativo

En lo referente a código esta práctica apenas tiene nada más que esta fórmula pero donde realmente nos ha hecho pensar es en la correcta elección de cada una de las constantes. Sin duda hay que elegir una constante Kp correcta y en base a esto ir eligiendo las demás, todo se basa en ensayo y error, hemos observado que una vez elegida una constane Kp que creemos adecuada aumentar Ki hace al sistema más reactivo, pero pasarse en esta constante crea grandes oscilaciones, asimismo aumentar Kd proteje al sistema frente a cambios bruscos pero lo hace algo mas lento en su reaccion general.

Tras mucho calibrar y probando distintas atenuaciones y cotas para la componente integral (sin ninguna duda la que más quebraderos de cabeza nos ha dado) llegamos a esto.





Es un comportamiento bastante satisfactorio pero todavía nos quedaba un as en la manga, como se observa en el video el sensor está al descubierto, quedando asi expuesto a la luz ambiental, esto puede alterar las lecturas del sensor de modo que en la siguiente prueba colocamos una "pantalla" a VivaBender, con esto creamos una zona de sombra debajo del sensor y permitimos que este tome medidas mucho mas fiables. He aqui el resultado final.





Ahora si quedamos satisfechos, hemos intentado enfocar desde todos los ángulos para que se observe como en todo momento el robot se mantiene en equilibrio únicamente por acción del controlador PID. Para conseguir un equilibrio lo más exacto posible hemos incluido la posibilidad de un ajuste "al vuelo", es decir, podemos ajustar el punto que el robot cree como su vertical durante la propia ejecución de este modo si al soltar al robot detectamos que tiene tendencia a irse hacia alante o hacia atrás lo podemos corregir.

Y hasta aqui la entrada, quizas la más corta y más aburrida (por lo monotono de los videos) que hemos publicado hasta ahora, pero sin más... esto ha sido todo!


miércoles, 9 de marzo de 2011

Práctica 3. Navegación Local evitando obstáculos

En esta nueva entrada vamos ha demostrar una forma de navegación basada en VFF, en la que tendremos que evitar obstáculos (latas) y en la que haremos uso del sensor de luz para guiar a nuestro robot y los sensores de contacto y el sensor de ultrasonido. Vamos por partes:

Evitando obstáculos con el sensor de contacto

Lo primero, es realizar un buen diseño que se ajuste a nuestros objetivos. En este caso queremos que si detecta un obstáculo por la derecha el robot retroceda y realice un giro por la izquierda sorteando el obstáculo. Igual ocurre con obstáculos que detecte por la izquierda, salvo que en ese caso el giro lo realizará por la derecha. Y por último, si detectamos un objeto bastante centrado se activarán los dos sensores y realizaremos un giro bastante mas pronunciado.
Aquí tenéis un diseño que cumple estos aspectos:



Se ha seguido una técnica basada en casos, avanzar, girar derecha, girar izquierda, y girar_centrado, siendo avanzar el caso con menos relevante y girar_centrado el mas relevante.


Evitando obstáculos con el sensor de US

Primero, antes de nada, debemos construir un buen diseño que se adapte a nuestras necesidades.
En este caso vamos a utilizar el sensor de ultrasonidos, pero de una forma especial. Queremos que recoja datos del entorno, concretamente distancias a obstáculos. Queremos que el sensor vaya girando de un lado para otro, para ello, hemos colocado un tercer motor que manejará el sensor de nuestro robot.
Y lo ultimo, y mas importante, es hacerle una estructura que incline la cabeza ligeramente hacia abajo para que esquive latas por ejemplo.



Este comportamieto calcula el vector resultante a partir del vector atractivo y el vector repulsivo.
Para ello utilizamos el sensor de US para que mida en un array de 10 posiciones (entre -45º y 45º) a que distancia se encuentran los objetos y en función de esto calcularemos los vectores repulsivos.
Una vez que tengamos los vectores repulsivos calculamos el vector resultante sumando el vector repulsivo con el vector atractivo.
Nuestro vector atractivo tiene una magnitud dependiente del vector repulsivo (magnitud_repulsivo - 20) y una dirección contraria al giro del robot (p.ejemplo: Si el robot está girado a -45º el vector atractivo tendrá un ángulo de 45º).



Siguiendo la luz como un mosquito!

Una vez mas, debemos reconstruir nuevo robot, para que el robot recoja intensidades de luz por los lados del robot, hemos creado una estructura para colocar los dos sensores de luz. Algo sencillo.


Este comportamiento realiza una operación bastante sencilla, realiza restas de intensidad lumínica (derecha - izquierda), de tal manera que si la resta es >= 25 gira a la derecha y si es <= -40 gira a la izquierda, estas cifras aparentemente aleatorias corresponden a la diferencia de medidas en cada uno de los sensores, cada uno devuelve valores distintos para la misma intensidad de luz, de ahi ese ajuste de cifras.
La única complicación que tiene, es saber en que modo poner los sensores, ya que como dice en la API,  hay dos modos, Pasivo y Activo, en modo Activo el rango de valores es mucho más pequeño y en modo Pasivo hay mucho más rango de valores, con lo que podemos obtener mas precisión en los sensores.


Evitando obstáculos con el sensor de US y guiando el robot con los sensores de luz

El diseño para este ejercicio, es la combinación de los ejercicios anteriores.


Para evitar obstáculos con el US, no hemos utilizado vectores, hemos hecho una simplificación semejante al ejercicio con el sensor de contacto, si detecta obstáculo por la izquierda el giro se realiza por la derecha, si detecta algo por la derecha el giro se realiza por la izquierda y si detecta algo bastante centrado el giro es mucho mas pronunciado.