Vistas de página en total

jueves, 24 de noviembre de 2011

APRENDIENDO A VIAJAR SOLO!!

Aquí estoy una semana más para mostraros los avances que he realizado en la siguiente práctica. Como recordaréis, en la última entrada vimos la forma de trabajar con los sensores, cómo estos aportaban datos y cómo utilizarlos para realizar ciertos comportamientos (sigue pared, moverse por sonidos, chocar, etc). En esta nueva práctica se da por sentado que hemos adquirido estos conceptos y nos centramos en la navegación, concretamente navegación local, es decir, aquella que se caracteriza por utilizar los sensores para reconocer el entorno y moverse por él, al contrario de la global que hace uso de un mapa.

Bien, siguiendo con la estructura que siempre adopto para explicar cada una de las prácticas pasaré a explicar uno a uno los cuatro apartados que forman ésta:

BUMP & GO CON SENSORES DE CONTACTO

Supongo que este título ya os suena, sin embargo, no es exactamente igual al de la práctica anterior. En esta ocasión no sólo deberemos detectar cuando chocamos con un obstáculo, realizar un giro y continuar hasta chocar con otro, sino que el objetivo de este apartado es conseguir que Manué viaje de una posición a otra salvando los obstáculos que se encuentren a su paso.

Para conseguir este objetivo se ha hecho uso de la clase "Behavior" que ofrece ya el LEGO NXT implementado. La estructura es simple, existen dos comportamientos ("ir hacia la meta" y "chocar") que compiten por "entrar en acción", mientras que un "árbitro" es el que determina (por medio de unas condiciones) cual comportamiento debe ejecutarse en cada momento. El comportamiento "ir hacia la meta" tiene un objetivo bastante intuitivo, conseguir orientar al robot para que avance hacia el punto de destino, mientras que el comportamiento "chocar", determina lo que debe hacer el robot en caso de choque, que no será otra cosa que esquivar dicho obstáculo.

A continuación muestro unos vídeos sobre como Manué consigue realizar esta tarea con los obstáculos colocados de forma diferente y con situaciones distintas:



Aunque parece algo sencillo, hay que recordar que Manué no sabe en un principio donde se encuentran los obstáculos, solo sabe donde en que punto se encuentra la meta, con lo que siempre que esquiva un obstáculo debe orientarse para saber que paso ha hecho y saber donde está la meta en todo momento.

BUMP & GO CON SENSOR DE ULTRASONIDOS

"Sí, ahora hace lo mismo pero con el de ultrasonidos..." estareis pensando. Pues básicamente sí, el objetivo no es otro que el de llegar a un punto evitando los obstáculos que se encuentran en el camino. Pero en este caso tenemos algo más complejo, ya que he hecho uso del algoritmo VFF (o al menos eso he intentado). Este algoritmo se caracteriza por un vector atractivo que nos dirige continuamente hacia la meta, y varios vectores repulsivos, tantos como obstáculos haya en el camino.

Sin embargo, mi versión del programa no es completamente fiel a este algoritmo, ya que pienso (y esto es opinión mía) que la complejidad de realizar este algoritmo con las herramientas de las que disponemos supera con mucho a la eficiencia que éste puede dar, es decir, muy complicado para conseguir un resultado similar a otros más sencillos. El que yo propongo digamos que es una versión mucho más "light" puesto que no tengo en cuenta todos los obstáculos que ejercen fuerza repulsiva, sino que detecto si un objeto se encuentra al frente y, en este caso, giro para esquivarlo (aquí sí sumo del vector repulsivo de ese objeto con el atractivo de la meta), y finalmente vuelvo a orientar a Manué hacia la meta para que continúe su recorrido.

Bueno, mejor vemos el resultado, en este os adjunto un par de vídeos aumentando la distancia de la meta, siendo en uno de 1m y en el otro 2m:




PERSIGUE LA LUZ

PERSIGUE LA LUZ ESQUIVANDO

martes, 8 de noviembre de 2011

PRACTICA 3: Y AHORA...LOS SENSORES!

Bueno gente, aquí estoy una semana más para mostrar los avances que he realizado con Manué.

Antes de nada, voy a mostraros algunas fotos del nuevo diseño de Manué, que como veréis, será necesario para la ejecución de las aplicaciones que posteriormente mostraré:

Como se puede ver en las imágenes ha sido necesario añadir tres sensores (y un cuarto que muestro más adelante) .

Está bonico, eh? Bueno, al lío:

En la anterior entrada se vieron las primeras aplicaciones cuyo objetivo era aprender cómo se comportan los diferentes actuadores que posee un robot jugando con sus motores, con la odometría y una pequeña interfaz en el LCD que mostraba la trayectoria que realizaba éste. El objetivo de esta práctica es aprender a saber manejar los sensores, cómo procesan sus datos y cómo podemos usar éstos para definir un comportamiento concreto para nuestro robot. Bien, como es costumbre, explicaré uno a uno los apartados de los que se compone centrándome en aquellos aspectos más interesantes.

OBTENIENDO INFORMACIÓN

Información sensorial
Este primer apartado trata la visualización de cierta información que podemos obtener tanto internos, como de algunos sensores, concretamente lo que se muestra es lo siguiente:

- NOMBRE DEL ROBOT
- VALOR DEL SENSOR DE ULTRASONIDOS
- VALOR DEL SENSOR DE LUZ NORMALIZADO
- TENSIÓN DE LA BATERÍA EXPRESADA EN MILIVOLTIOS
- MEMORIA LIBRE EXPRESADA EN BYTES.
- VALOR DEL SENSOR DE LUZ EN CRUDO

He de comentar aquí, que para hacer este apartado hago uso de dos hilos (threads) por un lado uno que se encarga de mostrar los datos estáticos como son el nombre, la tensión y la memoria, y por  otro lado la visualización de los sensores de ultrasonidos y luz, cuyos valores varían en tiempo de ejecución.


CONTROL DEL ROBOT POR SONIDO

Este es el primer apartado donde ya definimos un comportamiento concreto para el robot utilizando los datos que nos ofrece un sensor, concretamente el de sonido. El objetivo es que el robot comience a moverse al escuchar una palmada y se pare al escuchar de nuevo una palmada.

Antes de realizar el comportamiento dicho es necesario realizar una calibración de sonido para que Manué sea capaz de ignorar el ruido ambiental, y no interprete un mínimo ruido como si de una palmada se tratara. Para ello el programa se inicia en modo calibración y estará tomando valores hasta que se presiona la tecla [ENTER], momento en el cual comienza su comportamiento. A continuación os dejo un vídeo para que veáis que obediente es:




BUM & GO CON SENSORES DE CONTACTO

Hemos visto como avanza Manué por medio del sonido, pero...y si se choca? bien, pues ese es el objetivo de este apartado, saber cuando se choca y tomar una decisión con respecto a ello.

El enunciado de la práctica simplemente pide que sepamos cuando se choca, y cuando lo haga, retroceda y gire un nº aleatorio de grados, pero en este caso he ido un poco más allá, porque no es lo mismo chocar, que chocar y tener una idea de por donde ha chocado. Para ello he incorporado dos botones al robot (en lugar de uno), cada uno orientado en una dirección como muestra la siguiente imagen:



De esta forma sabe por donde ha chocado y hacia que dirección debe girar un número aleatorio de grados, es decir, si se activa el izquierdo girará a la derecha y viceversa. Os muestro el vídeo para que veáis su comportamiento:




BUMP & GO CON SENSOR DE ULTRASONIDOS

Acabamos de ver cómo comandar a Manué qué debe realizar si se choca, pero y si podemos conseguir que esto no llegue a pasar? a nadie le gusta ir dando "trompicones"!

Para conseguir que no se choque vamos a hacer uso del sensor de ultrasonidos, el cual emite una onda de sonido y tras recibir el "rebote" de ésta con un obstáculo obtiene la distancia a la que se encuentra éste. A simple vista el comportamiento es sencillo, Manué irá enviando sonidos y cuando detecte que tiene un objeto a una distancia prudencial girará un número aleatorio de grados, veamos cómo lo consigue:




Pero aún hay más, y es que me he tomado la molestia de programar una segunda aplicación en la que Manué no sólo no se choca, sino que es capaz de determinar en cada momento cual es la mejor dirección que debe tomar ya que está libre de obstáculos (o el obstáculo está más lejos que en otras direcciones). En cuanto a implementación, la cosa se dificulta en relación al anterior, ya que como se puede ver el sensor va girando 180º para conocer el entorno y toma las distancias de los objetos en esas direcciones, luego simplemente toma la dirección adecuada como ya he explicado. Ahí tenéis el vídeo:



COMPORTAMIENTO SIGUE-PARED

Y aquí tenemos "la joya de la corona" y el comportamiento que más quebraderos de cabeza me ha dado...conseguir que Manué salga de un laberinto tomando siempre una pared como referencia, que parece fácil, pero no lo es.

Como de laberintos no dispongo, las pruebas las realizo en casa que paredes sí que tengo. Para la implementación me he basado en un sistema reactivo, concretamente en un módelo clásico PD. Lo que caracteriza a este modelo es que su comportamiento es iterativo y muy rápido, nada de pensar que pasará si... sino que continuamente Manué tomará datos para conocer la distancia de la pared y en relación a ésta hace uso de dos constantes que determinan cuánto debe girar para seguir estando al lado de la misma pared. Una de las constantes (el que le da la Proporcionalidad) simplemente es un número determinado de grados que marcan el ángulo de giro, para su ajuste es necesario realizar una gran cantidad de pruebas. La otra constante es la Derivativa y se encarga de decidir la proporción de P que debe aplicar en cada situación, no es lo mismo si estamos muy lejos de la pared (giro más grande  aplicando todo P), que si estamos en la distancia prudencial (un menor giro aplicando un 15% de P). El resto del comportamiento son ajustes como si Manué pierde de vista la pared, en cuyo caso se detendrá e irá girando poco a poco hasta encontrarla y continuar con su normal comportamiento, o si tiene un obstáculo de frente ya que tendrá que tener autonomía para esquivarlo sin perder nunca la pared.

Veamos el vídeo:



CALIBRACIÓN DEL SENSOR DE ULTRASONIDOS

Y aquí voy con el último apartado, la calibración del sensor de ultrasonidos, ya que siempre es bueno saber como se comporta un sensor ante determinadas situaciones.

Para calibrar el sensor el primer paso que pide la práctica es conocer la distancia mínima y máxima que este abarca, en mi caso estas distancias son:

Distancia mínima = 7cm.
Distancia máxima = 140 cm (a veces alcanzaba más, pero no era del todo regular)

El siguiente paso es conocer el ratio de acción, es decir, cuánto a la izquierda y derecha es capaz de ver:

Izquierda = 45ª
Derecha = 45ª

A continuación, se nos plantea la cuestión de, si a medida que alejamos el sensor de una pared el error (diferencia de la distancia real y obtenida) aumenta. Después de realizar diferentes pruebas se puede decir que sí, sin embargo el error no supera 0.5 cm a una distancia de 140 cm (su máximo alcance) con lo que se podría decir que tiene un error sistemático a medida que aumenta la distancia pero que este es mínimo.

El siguiente paso y último es conocer la incertidumbre del sensor en su eje X e Y.

Eje X: tras realizar las pruebas tal y como determina la práctica, he de decir que el error ha sido nulo, obteniendo siempre las distancias reales.

Eje Y: durante las pruebas he comprobado que el sensor tiene un cono de apertura en cuanto a su visión lateral, concretamente hasta que el objeto está a 80 cm el ángulo de visión va aumentando, cuando sobrepasa esta distancia el sensor sólo ve el objeto si una parte de éste se encuentra justo enfrente a él.

COMPORTAMIENTO SIGUE PARED V2

Dado que la anterior versión del programa sigue-pared era bastante lenta, tanto por la velocidad de navegación como por la manera de ejecutar el algoritmo, voy a mostraros un nuevo vídeo en el que se pueden apreciar algunas mejoras con respecto a la anterior versión para agilizar un poco el comportamiento del robot. Aunque la velocidad sigue siendo un tanto lenta, es el coste que tengo que pagar si quiero mantener la eficiencia que poseía Manué para no perder nunca la pared. Como se verá en el vídeo, el escenario utilizado es bastante "engorroso" ya que tiene numerosas esquinas de diferentes tipos (más anchas o estrechas, más largas, etc) para comprobar como consigue continuamente salir airoso de todas las situaciones: