jueves, 25 de febrero de 2010

Por las calles nocturnas

¡Hola!

En la práctica de esta semana hemos sobrevivido como hemos podido, ya que un servidor ha tenido un accidente esquíando y casi se mata. Hemos hecho la práctica por videoconferencia, y compilando a distancia el código ya que el ordenador de Rui aún no está configurado correctamente para usar Lejos.

Kubus se hace mayor, y le gusta salir por las noches a tomarse unas copas. Ahora es capaz de sortear los obstáculos en la total oscuridad y dirigirse hacia la luz de un sitio bien ambientado.


El video está grabado con la habitación iluminada para que se vea mejor, pero Kubus iba con los ojos cerrados.

Y aquí podemos ver como se encara hacia la luz, usando dos sensores infrarrojos reciclados del RCX con gran maestría.


En esta práctica hemos diseñado "comportamientos" del robot, que se activan cuando se dan ciertas condiciones y en base a algunas prioridades. Gracias a esto, usando los dos anteriores comportamientos, Kubus es capaz de ir hacia una luz sorteando todos los obstáculos del camino. Pero la verdad es que el movimiento no ha quedado fluido del todo (demasiado bien nos ha salido todo dadas las circunstancias), así que ya colgaremos un video la próxima semana cuando el programa completo esté bien pulido.

Mejorándose poco a poco os saluda Ale,
¡nos vemos pronto!

jueves, 18 de febrero de 2010

Perdone, ¿me puede decir dónde estoy?

Filtro de partículas. Me gusta pronunciarlo, aunque la verdad, no entiendo por qué se llama así. Vale, lo del filtro lo pillo, pero ¿por qué llamar partículas a las hipótesis de situación?

Bueno resulta que Kubus le cogió el gusto a eso de salir por las noches, y la última acabó tan mal que no sabía ni volver a casa… Así que le hemos incorporado un programa sencillito que dadas las coordenadas de su casa sea capaz de llegar hasta ella. También le hemos añadido un filtro de partículas y ahora Kubus es capaz de autolocalizarse (¡la última vez, ni sabía dónde estaba!)

La idea del primer ejercicio es que Kubus se mueva describiendo un cuadrado de 40 cm de lado desde la posición (30,30) y que muestre por pantalla dónde cree él que está situado en el mapa.

A ver si consigo explicar esto del filtro de forma simple:

Creamos un mapa (en este caso un cuadrado 1mx1m) y proponemos cien hipótesis de situación, es decir, cien lugares posibles en los que el robot puede estar. Mediante el filtro, se asigna una probabilidad a cada posición y se recogen las más probables. También mediante el filtro, podemos aplicar un movimiento (el del robot) a cada partícula, con el ruido correspondiente, creando así una nueva generación de partículas a partir de las más probables de la generación anterior, que ya no nos sirve puesto que Kubus se ha movido.

Para empezar inicializamos todas las partículas en las coordenadas (30,30), que es dónde Kubus está en principio. No tomamos (0,0) porque si se desviara podría tomar valores negativos y se saldría del mapa. Así pues, al mostrar por pantalla las partículas, solo aparecerá un punto (30,30) en el que están las cien. Kubus empieza a moverse, y el filtro aplica el movimiento a las partículas. De esta manera, cuando haya recorrido toda la trayectoria, en la pantalla debería mostrarse un cuadrado (todas las posiciones en las que ha estado Kubus) y es lo que aparece.

Pero el filtro no le aplica el mismo movimiento exacto a cada partícula, porque tiene en cuenta la imprecisión (ruido) de movimiento de giro y desplazamiento, así que Kubus sabe que puede que no esté de vuelta exactamente en el origen. Aparecen pues los lugares en los que más probablemente esté, quedando como resultado una “mancha” alrededor del destino.

Quizá no sea demasiado vistoso, pero es muy interesante saber dónde esta uno mismo en el mapa para decidir lo próximo que se va a hacer.

En el segundo ejercicio, queremos que, introducidas unas coordenadas y un ángulo mediante los botones de Kubus, éste vaya hacia dicho punto. Para ello, primero rota en dirección al destino y avanza la distancia exacta. Una vez allí, se coloca en la dirección que le hayamos dicho.

Si tomamos (0,0) como la posición de Kubus, el ángulo de la trayectoria es el arco tangente de la coordenada Y entre la coordenada X (trigonometría simple). Y la distancia a recorrer se halla con el teorema de Pitágoras (la raíz cuadrada de la suma de los cuadrados de X e Y).

Aquí, Kubus se coloca en dirección a la tiza (coordenadas 60,40) y va hacia ella. El ángulo introducido es 180º, con lo que termina en dirección opuesta a la original.

Hacer el recorrido mediante curvas no lo hemos conseguido implementar, porque pensábamos que no estaba tan enfocado a la geometría y que había otra forma de hacerlo. Después de las explicaciones en clase hemos visto que no es tan difícil.

Sin más, nos despedimos hasta la próxima práctica, ¡que es la última de Kubus!

¡Un saludo!

miércoles, 10 de febrero de 2010

Fín de los días

Kubus ha evolucionado, esta vez por última, para convertirse en un viejecito encorvado. Después de esta práctica no lo volveremos a ver, pero esto es despedirse por todo lo alto: ¡Kubus ha quedado campeón! Ha ganado la competición de autolocalización y navegación con amplio margen. Ya dijimos en la primera entrada del blog que los últimos serían los primeros :)

Esta práctica ha sido, sin duda, la más tediosa y desesperante, ya que muchos algoritmos proporcionados por la API no funcionaban en absoluto ¡y no lo sabíamos!. Pero vayamos por partes:


Ejercicio 1: Visualización del mapa y las partículas (2 puntos)

Este es uno de varios ejercicios que construyen la base para el reto final. En concreto este no tiene la menor complicación. Si bien se resuelve en 3 minutos, nosotros tomamos al pie de la letra "distribuir uniformemente las partículas en el mapa" y asi lo hicimos. Repartimos todas las partículas con la misma distancia entre ellas y no de forma aleatoria, así que tuvimos que hacer un buen montón de cuentas.


Ejercicio 2: Diseño del radar (2 puntos)

Lo mismo que el anterior, el radar es clave para tomar las distancias mediante el sensor de ultrasonidos y almacenarlas en unas estructuras de datos (RangeReadings) que usaremos asiduamente en siguientes ejercicios.
Nuestro radar en concreto capturaba la distancia cada 10º, asi que tomaba 36 medidas (0º-350º ambos inclusive).


Ejercicio 3: Reconocimiento de posición y orientación (4 puntos)

Este SÍ es un ejercicio complejo. Se trata de, marcados 5 puntos en un mapa, colocar a Kubus en cualquiera de ellos y con cualquier dirección y conseguir que éste sea capaz de decir en que punto está y en que dirección (con una resolución de 10º).
Para ello, antes Kubus tiene que "aprender" las características de los puntos, así que primero Kubus se coloca en cada uno de ellos y toma medidas usando el radar.


Ahora viene lo interesante. Mediante magia (y algunos cálculos con unas cositas llamadas histogramas) nuestro robot determina con gran precisión en que punto está y que dirección lleva. No explico más porque sería profundizar mucho y la verdad es que os había mentido, no es tan interesante. Quien quiera saber más del tema, aquí viene muy bien explicado:
http://gsyc.escet.urjc.es/moodle/file.php/11/Practicas/09_10/Practica5/p5.pdf

En principio tuvimos muchos problemas con este ejercicio, ya que la idea correcta nos vino tras un buen rato de pensar, tuvimos un error casi insignificante en la implementación que pasó desapercibido y que echaba por tierra todos los cálculos. Pero al final bien, gracias.


Ejercicio 4: Reto de la auto-localización (8 puntos)

Y aquí viene lo gordo. Usando todos los algoritmos anteriores, conseguir que Kubus, colocado en un punto al azar con una dirección también al azar, recorra todo los demas puntos (son 5), intentando corregir la trayectoria en cada uno tomando las medidas adecuadas. Si bien parece que no es muy complejo, la realidad es que el error de cada giro y de cada viaje del robot es BASTANTE alto, y si Kubus no usara la auto-localización y viajara a ciegas, probablemente acabaría en Coria del Río.

Y lo complicado sobre todo viene porque el que hizo los filtros de partículas, los hizo con los pies parece ser, porque no funcionan ni para atrás. Hemos tenido que corregir un montón de código de algoritmos que se suponían funcionales para conseguir un resultado aceptable. No es nada fácil saber que hipótesis de situación es la correcta de entre todas las posibles, ya que tras hacer un recorrido, Kubus tiene en cuenta que hay un posible error, pero no sabe a donde le ha dirigido ese error. Afortunadamente, nuestro profesor Carlos nos echó una mano con una ecuación para asignarle peso (importancia) a las partículas. Aún así ha sido una pelea de muchas horas.

Pero con una gran recompensa, el reto lo hemos convertido una competición, y quien quedara más cerca de los destinos, se llevaría unos puntos extra, que desde aquí decimos que esperamos que sean un montón.


Este video se grabó justo después de la competición (ya están dibujadas las "dianas") por mi querido compañero Rui, que como se ve, es un genio con la cámara. Planos absurdos aparte, Kubus lo clava y es porque mola un huevo. Cabe decir que todo el tiempo que está parado entre punto y punto está calculando los pesos de las partículas, para averiguar cual es el sitio más probable en el que esté, que sería la hipótesis de mayor peso.

Quizá nos veamos en la próxima práctica optativa (la de dominar el mundo), aunque parece que como están las cosas con los exámenes encima, no está el horno pa bollos. Por si acaso, un saludo y muchas gracias por leer nuestro blog.

¡Adiós!


P.D: Próximamente, si obtenemos el permiso de los profesores, subiremos el código de todas las prácticas, para todos aquellos a los que pueda interesar y hacer así de este blog un sitio útil.