jueves, 29 de abril de 2010

KUBUS, el último robot


¡Saludos!

Somos Alejandro Núñez y Rui Almeida y abrimos nuestro blog con un poco de retraso. Pero ya se sabe, ¡los últimos serán los primeros!

Este blog está dedicado a las prácticas de la asignatura de robótica de la URJC, actualizaremos con lo que vayamos aprendiendo en ella, de la forma más amena posible :D

jueves, 25 de marzo de 2010

Primeros pasitos


Bueno, bueno! Primera práctica a contrarreloj, anoche bien tarde terminamos de configurar todo después de 3 días peleándonos con el Linux.


Afortunadamente nos ha ido bien, hemos tenido tiempo para responder todas las cuestiones que se nos pedían. Y es que esta primera práctica, aunque larga, ha sido sencillita.


Empezamos comentando el segundo apartado, ya que el primero es completamente trivial. La visualización de la odometría del motor, que parecía ser muy sencilla, nos ha traido más problemas de lo que esperábamos. De vez en cuando aparecían datos incoherentes y a veces se salía de los límites (0º-359º). Pero, misterios de la informática, en una de las soluciones que hemos dado que era idéntica a una anterior sí que ha funcionado adecuadamente.


La clase TachoPilot es realmente cómoda. Indicándole el diámetro de las ruedas y la distancia entre sí, esta clase nos da la opción de girar el robot un número de grados (y no los motores, ya que girar 45º una rueda no es lo mismo, ni mucho menos, que girar 45º el robot). Con ella, realizar un cuadrado con el robot no ha sido díficil. Al principio tuvimos problemas ya que el robot giraba demasiado, pero nos dimos cuenta de que las medidas estaban mal (de rueda a rueda), y tras eso, el cuadrado ha sido bastante preciso.




Si hemos tenido algunas variaciones al tomar las medidas ha sido precisamente porque el bolígrafo que pintaba la línea en el papel frenaba el robot y hacía que este patinara ligeramente al girar, haciendo unas curvas menos pronunciadas, como se puede observar en los videos.






La verdad es que no hay mucho más que decir, la matriz de covarianza calculada tiene unos valores aceptable, lo que quiere decir que nuestro robot mola mucho.

¡Nos vemos en la próxima práctica!

jueves, 11 de marzo de 2010

Pubertad


¡Segunda práctica!


Ahí vamos, ¡viento en popa! Kubus se hace mayor, tiene cabeza, bracitos y está más alto y encantador... Un mojón pa Wall-e!


Hemos empezado a trabajar con sensores, con los que Kubus empieza a hacer cosas interesantes. Ha aprendido a echar a andar cuando escucha una palmada, y a pararse cuando escucha otra:



Sí, es cierto, se salta una palmada ¿vamos a pelearnos por eso?

Ya lo corregimos después con un menor valor para "sleep".


También sabe que no es suficientemente fuerte (todavía) para derribar paredes, así que cuando se choca con una ¡retrocede y cambia de dirección!



Breve pero intenso.


Y lo mejor de todo, si alguna vez Kubus acabara encerrado en algún laberinto por alguno de sus muchos enemigos (vease Roxxxy, cigarro o tomatito) sería capaz de salir en unos minutos y reirse de ellos. Porque Kubus es capaz de seguir las paredes, doblando en las esquinas y doblando el cuello con más estilo que Robocop:




Bueno, aquí estaba un poco nervioso.


Aquí Kubus fue directo al servicio de las chicas (qué listo), pero Youtube nos ha censurado el video así que os lo imaginais.



Vale, quizá este tampoco sea un gran ejemplo, pero la verdad es que sí que sale de laberintos y queda muy guapo. Ya colgaremos otro video en el nuevo blog.


En esta práctica también hemos tenido que hacer unos mil doscientos millones de medidas, pero al menos ya entendemos claramente los conceptos de incertidumbre y qué es lo que indican los valores de las matrices de covarianza.



Kubus aprende lentamente y nos quita mucho, mucho tiempo, pero es un tipo divertido.

¡Hasta la próxima!

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.