jueves, 24 de febrero de 2011

Practica 2 - Obteniendo información sensorial

Aquí estamos de nuevo con un nueva práctica. Para esta práctica hemos incorporado al robot todos lo sensores, aunque el de sensor de luz simplemente lo utilizamos para obtener información en el ejercicio 1.

Obteniendo información:


En este ejercicio nos resulto sencillo obtener la información de los sensores,ya que disponíamos de todos los métodos, sin embargo para obtener el nombre y la memoria tuvimos que buscar bastante en la API de Lejos. Para el nombre: NXTCommDevice.getName(), para la batería nos costo un poco entender el método ya que primero había que llamar al método estatico getRuntime() que es una instancia de sí mismo.


Control del robot por sonido:

Para este ejercicio el mayor problema fue la calibración previa del sensor de sonido. En un principio lo hicimos realizando 100 medidas y quedándonos con el valor más alto, para estimar el valor de referencia del sonido. Pero este valor nos salía siempre demasiado alto incluso en habitaciones sin apenas sonido. Así decidimos realizar una media con estos valores y sumarle un valor fijo. Por lo demás el ejercicio no nos dio muchos problemas, salvo porque tuvimos ponerle un tiempo de espera tras coger la medida del sonido, para que no lo cogiera dos veces.



Bump & Go! usando sensores de contacto:

El único problema que tuvimos fue entender el método Math.random(), en el que teníamos que fijar el valor máximo, y el valor desde el que queríamos que empezaran los números, pusimos un margen de [45º,315º], es decir, Math.random()*316+45.



Bump & Go! usando sensores de ultrasonido:

En este caso, superando el obstáculo anterior del método Math.random(), tuvimos problemas con la primera medida que nos daba el sensor de ultrasonido, que siempre era 255. Pensamos que esto era debido a que el sensor al principio tardaba en reaccionar, miramos la API y con el método getMode()  y comprobamos que al principio nos daba -1. Lo solucionamos poniendo un while que actúa como barrera hasta que el modo del sensor es distinto de -1.



Comportamiento sigue-pared para salir de un laberinto:


En primer lugar, tuvimos que añadirle al robot base giratoria para poder mover la cabeza del robot. Esto era necesario para poder poner el sensor de ultrasonido a unos 45º para que pudiera localizar las esquinas con antelación y así poder girar antes de chocarse. Planteamos el ejercicio, poniendo un rango de error al robot y que cuando superara este error girara a la izquierda o a la derecha según la medición obtenida. Para ello pensamos en el método forward() para que el robot avanzara y el método steer(float turnRate, float angle)  poniendo el valor de turnRate a 100 para que la rueda interior se pare y la exterior gire completamente, este valor lo pusimos en negativo para que girase a la izquierda y positivo para la derecha. El valor de angle lo fijamos en 2 para que realizase pequeños giros. Pero con este método y aun no tenemos explicación tras realizar un giro el código se bloqueaba y o no ejecutaba el método forward o se bloqueaba antes. Esto lo solucionamos cambiando este método por el mismo pero tan sólo con el parámetro turnRate, de esta forma el código no se bloqueaba pero el robot giraba muy bruscamente, así que antes de realizar un giro redujimos la velocidad del motor.



Calibración del sensor de ultrasonidos:







Calibración del sensor de ultrasonidos

viernes, 4 de febrero de 2011

Practica 1 - Primeros pasos con el API e instalacion eclipse (cont)

Seguimos con la continuación de la práctica 1. Esta vez implementamos con la clase TachoPilot los primeros movimiento del robot. Para ello comenzamos con el primer ejemplo, en el que tuvimos que modificar el ancho de vía que debíamos pasar como parámetro al constructor de la clase TachoPilot, para que se ajustara a nuestro diseño.
A continuación mostramos un vídeo, donde podemos observar la navegación en línea recta:


Después realizamos un nuevo código para que el robot dibujase un cuadrado. Con el código no tuvimos ningún problema, pero al realizar las pruebas en el papel comprobamos que el rotulador no estaba colocado en el eje de rotación del robot. De forma que tuvimos que modificar totalmente el diseño del robot y así  modificar el ancho de vía del constructor de la clase.
Mostramos el vídeo en cuestión de la prueba con el diseño modificado:


El rango de error cometido al dibujar el cuadrado ha sido:
ErrorCuadrado


Para el cálculo de la matriz de covarianza utilizamos el ejercicio de la línea recta, los resultados obtenidos fueron los siguientes:

MatrizCovarianza



Por último abordamos el ejercicio de la visualización de la trayectoria en la pantalla. Aquí tuvimos bastantes problemas para comprender debidamente las fórmulas, ya que una vez realizado el movimiento y hacer la rotación no partíamos desde esta última posición. Por lo tanto el resultado en pantalla no era una línea continua. Para solventarlo fuimos sumando la ultima posición (x e y) a la fórmula para que partiera desde el último punto. Otro pequeño problema que tuvimos, fue al transformar el espacio real al espacio de la pantalla, en un principio hicimos la transformación con las medidas que nos da LCD.SCREEN_WIDTH y LCD.SCREEN_HEIGHT. Así en la pantalla se dibujaba un rectángulo en vez de un cuadrado, ya que las medidas de la pantalla forman un rectángulo. Cuando nos dimos cuenta de esto hicimos la transformación del eje x e y con la misma medida, de esta forma queda bien definido el cuadrado en pantalla como mostramos a continuación: