Esta semana nuestro robot ha crecido, ha echado cuerpo y ha aprendido a extraer información del entorno gracias a sus sensores: desde la iluminación de la habitación, hasta la carga de la bateria.
Para ello hemos tenido que implantarle estos sensores y luchar un poco con Cigarro para encontrar la forma de colocarlos todos de la mejor forma posible. La mayoría de ellos no fueron difíciles de ubicar, pero con el de ultrasonidos tuvimos que ejercitar la imaginación para conseguir que pueda apuntar hacia delante o hacia el lado. Tras gastar más de la mitad del celo decidimos optar por crear esa especie de plataforma circular que permite enforcar el sensor hacia donde nosotros queramos.
OBTENIENDO INFORMACIÓN
En este apartado había que sacar por pantalla cierta información como el nombre del robot, los valores del sensor de luz y del de ultrasonido, la memoria RAM disponible y la información de la batería.
Para obtener la información del ultrasonido utilizamos getDistance(), para la luz readValue() y getNormalizedLightValue(), para la batería getVoltageMilliVolt(), y por último para la memoria libre tuvimos que hurgar bastante en la documentación de la API hasta encontrar, bajo la clase Runtime el método freeMemory().
CONTROL DEL ROBOT POR SONIDO
Este apartado trata de hacer ruidos raros y asustar mucho a Cigarro. Para ello hay que elegir el porcentaje de decibelios a partir del cual el robot debía reaccionar.
En principio el robot permanece parado, recogiendo mediciones del micrófono con readValue(). Cuando se de la palmada el microfono la recogerá y el robot empezará a andar. Con la segunda palmada el robot vuelve a su estado inicial de espera (parado). Hemos incluído también un par de sleeps estratégicamente situados para dejar al sensor reestablecer su valor, si no salía de los bucles demasiado rápido y la ejecución tenía muchísimos problemas.
BUMP & GO! USANDO SENSORES DE CONTACTO
Para esta sección hay que poner a andar el robot en cualquier dirección con el sensor de contacto conectado. Cuando el sensor se pulsa ( sensor.isPressed()) el robot se para y ejecuta un método al que hemos llamado pasoAtrás. Como su nombre indica el robot realiza un pequeño movimiento hacia atrás para retirarse del obstáculo que ha detectado, y luego realiza un giro aleatorio gracias a la función random().
BUMP & GO! USANDO SENSORES DE ULTRASONIDO
El código para este apartado es muy similar al anterior, de hecho, se puede usar el mismo procedimiento de pasoAtrás, solo que esta vez usamos el sensor de ultrasonido, y por tanto, evitamos el obstáculo antes de la colisión. De nuevo volvemos a usar getDistance().
COMPORTAMIENTO SIGUE-PARED PARA SALIR DE UN LABERINTO
Como su nombre indica se trata de hacer un programa para el robot con el fin de que este pueda seguir la pared de una habitación sorteando esquinas, objetos apoyados, etc.
Para ello hay que ir tomando mediciones con el sensor de ultrasonido dirigido hacia la pared con un ángulo aproximado de 45º, y ir obteniendo datos del mismo para ir corrigiendo la ruta del robot.
Como podéis ver, el robot campa a sus anchas por nuestras casas como uno más yendo a la cocina a por algo de picoteo.
CALIBRACIÓN DEL SENSOR DE ULTRASONIDOS
Aquí el reto consiste en medir experimentalmente las características de nuestro sensor de ultrasonidos.
Primero comprobamos el rango de distancias para las que el sensor da una señal fiable.
El resultado es [5cm, 240cm]. El rango de ángulos para el que las mediciones son válidas es [-45, 45] aproximadamente.
La siguiente comprobación es saber si el sensor tiene un error sistemático o no. Para ello tomamos medias perpendicularmente a una pared, los resultados son en cm:
| Distancia en X | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | 100 |
| Distancia medida | 23 | 32 | 42 | 52 | 62 | 72 | 81 | 92 | 101 |
Existe un error sistemático de media 1.8cm en las medidas del sensor de ultrasonidos.
El siguiente paso es calcular la incertidumbre de la medida en el eje X y en el eje Y independientemente. Para el eje X colocamos el robot a distintas distancias respecto a la pared y medimos, todas las medidas están en cm:
Distancia X | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | Media del error |
40 | 42 | 42 | 42 | 42 | 42 | 43 | 42 | 42 | 42 | 43 | 2,2 |
50 | 52 | 53 | 52 | 52 | 52 | 52 | 52 | 52 | 52 | 52 | 2,1 |
60 | 62 | 62 | 62 | 62 | 62 | 62 | 62 | 62 | 62 | 62 | 2 |
70 | 72 | 72 | 72 | 72 | 72 | 72 | 73 | 72 | 72 | 72 | 2,1 |
80 | 81 | 81 | 81 | 82 | 81 | 82 | 82 | 82 | 82 | 81 | 1,5 |
90 | 92 | 92 | 92 | 91 | 92 | 92 | 92 | 92 | 91 | 92 | 1,8 |
100 | 102 | 102 | 101 | 102 | 102 | 102 | 102 | 101 | 102 | 102 | 1,8 |
110 | 112 | 112 | 113 | 112 | 112 | 112 | 113 | 112 | 112 | 112 | 2,2 |
120 | 122 | 122 | 123 | 122 | 122 | 122 | 122 | 123 | 122 | 122 | 2,2 |
Podemos deducir que el error no depende de la distancia ya que el error medio no cambia respecto a la misma.
Para la incertidumbre en el eje y colocamos un objeto a distintas distancias en el eje x y lo fuimos desplazando por el eje y hasta que dejabamos de recibir una medida válida. Los resultados han sido:
Distancia X | ||||||||||
40 | 10 | 11 | 11 | 11 | 11 | 13 | 10 | 12 | 12 | 10 |
50 | 13 | 13 | 13 | 13 | 13 | 13 | 12 | 14 | 13 | 13 |
60 | 15 | 16 | 16 | 17 | 15 | 15 | 16 | 16 | 17 | 17 |
70 | 20 | 20 | 20 | 20 | 19 | 20 | 20 | 19 | 20 | 19 |
80 | 12 | 14 | 14 | 14 | 13 | 13 | 13 | 12 | 13 | 13 |
90 | 8 | 8 | 8 | 8 | 9 | 9 | 8 | 9 | 9 | 9 |
100 | 10 | 10 | 10 | 10 | 10 | 10 | 10 | 9 | 10 | 10 |
110 | 7 | 7 | 7 | 8 | 8 | 7 | 8 | 7 | 8 | 7 |
120 | 5 | 6 | 5 | 5 | 5 | 5 | 5 | 5 | 6 | 5 |
En este caso
Matrices de covarianza a distintas distancias del robot:
A 40cm:
5 | 24,5 |
24,5 | 124,1 |
A 50cm:
4,5 | 27,3 |
27,3 | 169,2 |
A 60cm:
4 | 32 |
32 | 256,6 |
A 70cm:
4,5 | 41,4 |
41,4 | 388,3 |
A 80cm:
2,5 | 19,6 |
19,6 | 172,1 |
A 90cm:
3,4 | 15,3 |
15,3 | 72,5 |
A 100cm:
3,4 | 17,9 |
17,9 | 98,1 |
A 110cm:
5 | 16,3 |
16,3 | 55 |
A 120cm:
5 | 11,4 |
11,4 | 27,2 |



