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.

jueves, 24 de febrero de 2011

Práctica 2. Calibrando el ultrasonidos

En esta entrada vamos a responder a las cuestiones que tienen que ver con la calibración de nuestro sensor de ultrasonidos, gracias a esta prueba tendremos un conocimiento más exacto de nuestro sensor, pudiendo actuar en consecuencia sobre las medidas que nos proporcione.


Punto 1.

Distancia mínima = 22cm (20cm reales)
Distancia máxima = 193cm (190cm reales)

Por debajo de los 20cm el sensor ofrece lecturas pero con un error cada vez mas grande, la mínima lectura que observamos fue de 7cm (estando a 4cm reales), como vemos es un error enorme y decidimos que las medidas de las que nos podemos empezar a fiar estan en el rango puesto arriba.

Como veremos a continuación en valores intermedios de este rango el error del sensor baja bastante hasta ser prácticamente cero para distancias medias.


Punto 2

Ahora medimos la sensibilidad del sensor frente a los obstáculos situados en ángulo, realizando las pruebas que se nos indican en el enunciado los resultados fueron los siguientes:

0º − 37cm
10º − 38cm
20º − 38cm
30º − 40cm
40º - 41cm
-10º − 38cm
-20º − 40cm
-30º − 41cm
-40º - 44cm

Para inclinaciones mayores (de 50º en adelante) el sensor se salia de rango mostrando 255 de modo que podemos deducir que nuestro sensor es fiable para ángulos de aproximación menores de 50º.

Se supone que los pares de ángulos (Xº/ -Xº) deberían dar lecturas idénticas, en nuestro caso aunque se aproximan no llegan a serlo, esto puede deberse simplemente a colocaciones ligeramente diferentes en cuanto a los ángulos positivos y negativos, no se puede atinar exactamente con el mismo ángulo siempre.


Punto 3

En esta prueba realizamos medidas a las distancias indicadas en el enunciado y en cada una de ellas el sensor de VivaBender detectaba siempre 1cm por encima de la medida real de modo que según nuestros datos la media de error era igual a 1cm. Si tenemos en cuenta posibles errores mínimos en la posición exacta del robot a la hora de medir llegamos a la conclusión de que para el rango estudiado el sensor de ultrasonidos es muy preciso.


Punto 4

Este punto fue el más tedioso en cuanto a mediciones se refiere, realizamos las múltiples medidas que se nos pedían en el enunciado, no vamos a poner aqui la larga lista de números obtenidos asi que los resumiremos directamente en las ecuaciones de la matriz de covarianza.

Siguiendo la fórmula empleada anteriormente en la práctica 1:


Obtuvimos los siguientes resultados:


Observamos que el error en X es bastante pequeño, no asi como el error en Y, y como hay una relación entre ambos ejes, cuanto mas aumenta X mayor error hay en Y, para observar mejor este aspecto podemos observar la siguiente gráfica.



En ella vemos representado el cono de apertura del sensor (como era de esperar el sonido se expande cuanta más distancia recorre), este cono debe ser simétrico hacia las Y negativas (no representado en la gráfica). No sale un cono suave como cabría esperar pero esto es debido a la dificultad de realizar mediciones precisas que nos hubieran dado un cono mucho mas "continuo".


Hasta aquí la calibración del sensor de ultrasonidos, hemos obtenido resultados algo sorprendentes (no esperabamos tanta precisión en rangos medios) y resultados esperados (como la representación del cono de apertura), en conclusión teniendo en cuenta las limitaciones en distancia y ángulo de nuestro sensor podemos decir que los datos que nos envia son bastante exactos de acuerdo a la realidad.

Práctica 2. Algo más que pintar un cuadrado

Bueno y aquí está la entrada de la prática 2. En esta práctica usaremos por primera vez los sensores de nuestro robot, lo que permitirá a VivaBender realizar tareas un poco más complejas que las realizadas hasta ahora.

Para empezar a familiarizarnos con los sensores hemos tenido que hacer un programa que mostrase por pantalla la información recogida por varios de ellos y a tiempo real.

La información cambia en tiempo real.

Este punto no ha tenido más complicación que encontrar que funciones nos devolvían la información requerida, nada que un paseo por la API de lejOS no pueda solucionar. Con esto hecho podíamos pasar al siguiente punto.


Controlando mediante palmas.

El primer programa a realizar consistía en controlar a VivaBender mediante sonido, cada vez que escuchase una palmada echaría a andar y en caso de ya estar andando se pararía, un comportamiento sencillo que podemos apreciar en el siguiente video.



Como podemos observar en el video se realiza una calibración del nivel de la palmada antes de empezar para así asegurarnos de que el robot reaccionará adecuadamente al sonido. Una vez registrado ese nivel le aplicamos cierto margen de tolerancia en la reacción (por si en la calibración hemos hecho una palmada muy fuerte).


Rebotando contra las paredes

En el siguiente ejercicio usamos el sensor de contacto.

Debajo de ese enorme parachoques está el sensor de contacto.

La tarea consiste en avanzar hasta encontrar un obstáculo, "rebotar" contra él, girar un número aleatorio de grados y volver hacia delante hasta encontrar el siguiente obstáculo y vuelta a empezar.


Podemos ver como realiza giros aleatorios no sólo en ángulo sino también en sentido de giro.



Rebotando... con cuidado

Ahora tenemos que echar mano del sensor de ultrasonidos. El ejercicio es básicamente el mismo que el anterior, sólo que esta vez evitaremos chocar gracias a los ultrasonidos.




Midiendo constantemente el valor que nos da el sensor podemos saber si nos aproximamos a un obstáculo en cuyo caso podemos reaccionar a tiempo para no chocar contra él. Como se observa en el video hemos dado un margen algo alto cuando el robot se acerca de frente a la pared para así poder tener más seguridad en las aproximaciones a la pared con ángulos más complicados, aun así este sensor falla si a VivaBender le da por acercarse a la pared con un ángulo muy oblicuo (como observaremos en la sección de calibración de este sensor).


Escapando del laberinto

Llegamos al ejercicio más complicado de la práctica, VivaBender tiene que seguir una pared a cierta distancia para poder escapar de un laberinto.

Con el sensor orientado en ángulo podemos percibir los rincones.

En este ejercicio hemos implementado un control basado en casos basándonos únicamente en la información recogida mediante el sensor de ultrasonidos distinguiendo:

- Estás muy cerca.- Giro muy cerrado a la izquierda (el único giro bloqueante, hay que asegurarse de que se aleja lo suficiente).
- Estás cerca.- Giro cerrado hacia la izquierda.
- Te empiezas a acercar desde una distancia aceptable .- Giro muy abierto hacia la izquierda.
--- Distancia aceptable a la pared --- (el robot mantiene el rumbo de la última orden hasta entrar en algún caso concreto)
- Te empiezas a alejar desde una distancia aceptable a la pared.- Giro muy abierto hacia la derecha.
- Pierdes la pared.- Giro cerrado a la derecha.

Observamos el resultado en estos dos videos.







Hasta aquí la primera parte, más tarde publicaremos la entrada dedicada a la calibración del sensor de ultrasonidos.

domingo, 6 de febrero de 2011

Práctica 1. Primeros pasos con Viva Bender

Una vez ya terminado el diseño de nuestro robot seguido del manual que trae nxt, nos disponemos a llevar a cabo una serie de ejercicios básicos.

1.1 El Cuadrado
Después de haber aprendido funciones básicas de los motores, nos disponemos a llevar a cabo un ejercicio que nos dará la diferencia de lo que nosotros queremos y lo que realmente es el resultado.

Lo primero, es buscar un buen sitio para colocar nuestro lápiz, ya que vamos a necesitar que nuestro robot pinte su trayectoria, la mejor posición es la que está en el centro del eje, ya que al girar, si el lápiz está colocado en el centro, este no verá modificada su posición en el plano.
Con la mayor precisión que hemos podido y con la ayuda de nuestro viejo compañero el celo, hemos colocado un lápiz en el eje de esta forma:


Ahora, queremos pintar un cuadrado de 40x40 (linea blanca), pero como podemos observar en la imagen inferior, Viva Bender ha pintado su propio cuadrado de 40x40 (linea roja), muy diferente de la teoría. Esto se debe principalmente a nuestro diseño del robot, distancia entre las ruedas, resistencia con el lápiz al pintar,orientación manual de nuestro robot...etc, una serie de parámetros que dificultan la realización correcta de nuestro objetivo. Cuanto mas preciso sea nuestro robot, mayor aproximación a la teoría, pero en la práctica hay dificultades.


1.2 Calculo Matriz de Covarianza
Como siguiente ejercicio, realizamos el cálculo de la matriz de covarianza, a partir de la siguiente fórmula:

Nos disponemos a recorrer un metro con nuestro robot desde un " mismo punto inicial " (entrecomillado por la inexactitud del mismo). El objetivo es comprobar que a medida que avanzamos el grado de incertidumbre aumenta y su distancia también, ya que cuanto mas pegado al eje x (0) mayor distancia recorre y cuanto mas se aleja de y menos distancia recorre en x. (linea roja, trayectorias del robot)

    Tomamos 10 medidas:     
           X    Y           
      1. (97'9,1'2)         
      2. (97'9,0'4)         
      3. (97'8,-0'2)        
      4. (98'1,-0'2)        
      5. (98'0,-0'4)        
      6. (98'1,-0'6)        
      7. (97'9,-0'7)        
      8. (97'8,-0'8)        
      9. (97'9,-1'9)        
      10.(98'1,-2'6)        
                            
     media(97'95,-0'58)     
                            
Matriz P (0'0125    -0'0388)
         (-0'0388    1'0336)



1.3 Visualización de la trayectoria
Por último, queremos mostrar el recorrido que realiza el robot en la pantalla, para ello solo programamos que hiciera un recorrido (mostrado en el segundo video), y que a su vez fuese dibujando en tiempo real su trayectoria.
Las fórmulas para el cálculo del desplazamiento y el cálculo del ángulo son :
(Desplazamiento)
(ángulo)


(Viva Bender en funcionamiento)
Esta muestra es sencillamente fácil, solo hay que tener en cuenta la posición actual del robot y los ángulos hacia donde gira el mismo.

Limitaciones: (La pantalla no es infinita, nuestro recorrido se ve completamente porque está dentro de los márgenes de la pantalla).
(Trayectoria dibujada por VB)     

1.4 Conclusión:
Aproximar la teoría a la práctica es bastante complicado, lo que para el robot creé ser correcto, en nuestra realidad hay imperfecciones, ya que no realiza la trayectoria con bastante perfección por ejemplo.
La situación en la que se encuentre también es un factor importante, porque la superficie de apoyo afecta directamente al correcto funcionamiento, se producen resbalones en superficies pulidas, no funciona bien en superficies con cierto ángulo etc...
Aún con todo ello, el robot es suficientemente preciso en las tareas que hemos realizado.

jueves, 13 de enero de 2011

Bienvenidos al mundo del mañana!

Hola mundo!

Bienvenidos al blog con motivo de la asignatura de robótica de la Universidad Rey Juan Carlos, donde iremos desarrollando la práctica de la asignatura.
Un saludo!