El valor minimo que mide el robot son 8 cm, aunque la medida que da el robot es de 10 cm. La medida maxima que nos puede dar el robot es de 197cm (1,97m)
El ejercicio consiste en colocar el sensor ultrasonido más o menos unos 40º de la pared, siguiendo así está a la vez que puedes detectar si viene una esquina o un cambio de ángulo en la pared.
Este sin lugar a dudas ha sido el ejercicio que más nos ha costado "terminar" (ya que por falta de tiempo no hemos podido dejarlo como nosotros quisiésemos). A continuación una demostración del robot en funcionamiento:
El mayor problema que tenemos ocurre cuando tenemos 2 giros hacia la derecha seguidos y a continuación uno a la izquierda. Lo que ocurre es que nuestro ladrillo no coge la linea "buena" con la suficiente rapidez como para rehacerse de tres giros tan seguidos, abriéndose demasiado en el segundo giro a la derecha y comiéndose el siguiente a izquierdas.
Individualmente se puede ver que los giros en esquina cerrados (es decir que si no gira se chocaría contra la pared) son los que más "daño" causan a nuestro robot recorriendo una linea extraña, ya que al tener el sensor de ultrasonido en la parte trasera, la distancia a la pared es mayor y la parte delantera puede tocar con la pared arruinando así el camino a seguir por el robot.
Como comentario final a este desquiciante, aunque divertido ejercicio (eso sí, cuando hace lo que debe, la alegría es inmensa =P) se nos sumó un error que no hemos conseguido identificar. Este consistía en que empezaba a girar sobre si mismo (rueda derecha hacia delante, rueda izquierda hacia atrás) quedándose tostado (sin mostrar nada en pantalla ni haciendo caso a los valores recibidos por el sensor ultrasonido) y sin posibilidad de recuperarlo. Al final nos hemos quedado con la incertidumbre de conocer la causa del error pero bueno, seguro que más adelante nos volverá a amargar la tarde...tiempo al tiempo.
Este ejercicio es igual que el anterior pero cambiando el sensor de contacto por el de ultrasonido. La diferencia en nuestra clase "Sao", es que no entraremos en el if cuando se active el sensor, sino cuando la distancia leida por el ultrasonido sea menor o igual a 20 cm.
Este ejercicio consiste en que el robot detecte que se ha chocado con algo, para así dar marcha atrás y girar aleatoriamente un número de grados aleatorio (-360, 360) incluyendo el 0.
El código de nuestra clase es muy sencillo:
loop
si se activa el sensor {
ir hacia atrás
girar grados aleatorios
ir hacia delante
}
end loop
Tanto este ejercicio como el siguiente (utilizando el sensor de ultrasonido) han sido bastante rápidos. El único dato destacable que puede haber, es que hemos utilizado la clase Random para conseguir el número de grados aleatorio de al siguiente forma:
public static int GRADOS = 360; int gradoAleatorio = rand.nextInt(GRADOS-(-GRADOS)) - GRADOS;
Así giraremos un número aleatorio en el rango [-360, 360]. Aunque a lo mejor no deberíamos haberlo hecho, hemos dado como resultado válido el girar 0 grados.
En este ejercicio, nuestro robot debe empezar a andar o pararse si damos una palmada. Nosotros hemos creado un método en nuestra clase ClapControl, que hace una media del valor más alto leído (de la palmada) y el menor, para así detectar mejor la palmada.
Hemos calibrado el sensor de sonido de la siguiente forma. Nuestro programa se queda esperando hasta que presionemos el botón ENTER, mientras lee los valores que recoge el micrófono y guarda tanto mayor valor recogido como el menor para posteriormente cuando hayamos pulsado el botón hacer una media de esos dos valores. En este periodo debemos dar un par de palmadas, para que coja una de ellas sea el valor más alto.
En cuanto salga de ese bucle, entraremos en el ejercicio en si. Cuando demos una palmada (si supera la media obtenida de la forma que hemos contado) el robot empezará a andar, si estaba parado sino se parará.
Como se puede ver en el vídeo no es la mejor solución, ya que hay veces que hace algún inicio-parón inesperado, pero no hemos encontrado una solución mejor : (
En este ejercicio debemos mostrar los siguientes datos:
-Nombre del ladrillo
-Valor del sensor ultrasonido en milímetros
-Valor del sensor de luz configurado en pasivo
-Tensión de la batería en mV
-Memoria libre del ladrillo en Bytes
En este ejercicio tuvimos un problema un poco..."puñetero". Elegimos para el sensor ultrasonido el puerto S4...y en qué momento. Tras mucho trastear (y no probar con otros puertos), buscando por google encontramos un link al foro de lejos donde otro usuario tenia el mismo problema, resuelto de una forma increible...cambiando de puerto !!
Cómo resumen hasta ahora, los primeros ejercicios básicos tanto de los motores como del LCD no han sido gran problema, al igual que el ejercicio de la odometría.
Cuadrado de calibración de movimiento:
Con anterioridad mostramos una prueba que hicimos con nuestro ladrillo para el ejercicio del cuadrado. Tras unos cambios hemos hecho correctamente el ejercicio con los siguientes resultados.
-Una sola vuelta:
Como podemos ver, hay unos 3 centímetros de diferencia entre el punto de inicio y el de llegada
- Varias vueltas con el mismo punto de salida:
Hay diferencias entre unas vueltas y otras, pero en general a una sola
vuelta no se aprecia tanto el error.
Diferencia entre puntos de salida y llegada, unos 33 milímetros
- Diez vueltas seguidas:
Tras diez vueltas (los números indican donde acaba cada vuelta)
se ve claramente la acumulación de los errores.
En este ejercicio no hemos tenido problemas con la programación ya que hemos diseñado un programa muy sencillo, con un bucle que se ejecutaba, 4 * número de vueltas, veces dependiendo de cuantas vueltas queriamos dar
for i = 0 hasta 4 * num_vueltas {
avanzar 40 cm;
rotar 90 grados;
}
Visualizar trayectoria:
Con este ejercicio hemos tenido más problemas, ya que al necesitar actualizar los valores de los ejes x e y por pantalla, el movimiento de los motores debían ser no bloqueantes. Esto entre otros problemas, provocaba que cuando se hiciese la comparación de la condición de nuestro bucle (si la distancia recorrida es igual a la distancia que quiero recorrer) no tuviese el valor deseado provocando un bucle infinito.
Finalmente hemos corregido este y los demás errores y el resultado es el siguiente:
Cálculo de la matriz de covarianza:
Hemos recogido los puntos donde termina cada cuadrado, haciendo 10 iteraciones.
El montaje del ladrillo fue fácil, siguiendo las instrucciones dadas en el manual.
Más tarde, para dibujar el cuadrado, le añadimos una base para apoyar un bolígrafo como se puede ver en el siguiente vídeo. Aunque llegamos a la solución del programa rápidamente, nos estuvimos peleando durante bastante tiempo con las medidas del "TachoPilot". El resultado es este: