Más reciente

PFC – It’s aliive!!!

 

… Sí, eso es, ¡ESTÁ VIVOOO!  Esta semana he hecho unos cuantos cambios, gracias a los cuales hoy he podido hacer un gran avance.  He traducido a código algunas de las cosas de las cuales hablé con mi tutor la semana pasada, muchas de las cuales tienen que ver con las pestañas que nos indican la información de cada wiimote, aquí está una captura del estado actual de las mismas:

Nueva ventana de información de cada wiimote

El tema de la calibración ha cambiado sustancialmente. Hay 8 cajas de texto en las que hay que introducir las coordenadas de cada uno de los cuatro puntos de calibración.  Dichas coordenadas son referentes a la habitación, en metros, y teniendo presente que el punto de origen (0,0) de la habitación es la esquina superior izquierda de la misma.  En la siguiente imagen se puede ver un poco más claramente:

¿No os encantan los bordes de las hojas de mi nueva libreta? A mi si :3

He hecho lo siguiente:

  • He tomado las medidas de mi habitación, en metros
  • He posicionado un wiimote a una altura y grados con respecto a la vertical y la horizontal determinados
  • He colocado mi plantilla de calibración y he medido a que posición se encontraban cada uno de los cuatro puntos de calibración de la plantilla, obteniendo así cuatro pares de coordenadas, todas ellas en metros

De esta forma tengo  las coordenadas absolutas de cada uno de los cinco elementos que hay arriba, de tal forma que, teniendo las coordenadas de los cuatro puntos de calibración (en metros) puedo ahora hacer un cambio de base directo entre las coordenadas del wiimote y las coordenadas absolutas de la habitación.

No se puede observar, pero cuando se rellenan todas las cajas de texto, aparece en medio de la plantilla en miniatura el botón “Calibrar”, de forma y manera que solo cuando hemos rellenado todos los datos, aunque sea con ceros, sea posible la calibración.

También he añadido dos botones adicionales en la parte superior de la ventana.  Sirven para cargar y guardar los datos de calibración del wiimote al que pertenece la pestaña en la que nos encontremos.  Por el momento tengo montado el asunto de la siguiente forma:

  • Cuando se han rellenado todos los datos y una vez que hemos pulsado el botón “Calibrar” y hemos terminado la calibración, pulsamos el botón “Guardar datos” y nos guardará un archivo que tendrá el siguiente nombre: “calibration_data_”número de wiimote”.dat”.  De tal forma que si calibramos 4 wiimotes, habrá cuatro archivos.
  • Si queremos cargar los datos de calibración que hayamos guardado, pulsamos el botón “Cargar datos” y nos cargará los datos de calibración del wiimote correspondiente a la pestaña activa.  De tal forma que si las condiciones de la instalación no han variado, podemos usar los datos de calibración anteriores.  (Esto lo he acabado de implementar después de haber estado media hora introduciendo los pares de coordenadas a mano @_@ )

De momento el tema del cargado y guardado de datos se queda así.  Si veo que puedo hacerlo de otra forma, con un solo archivo, pues lo haré, pero no voy a perder demasiado tiempo en esto.

Una vez he hecho todos estos cambios y he corregido algunos errores, he podido observar como en efecto funciona, o sea, que, de momento, con un solo mando soy capaz de ver un objeto infrarrojo y además indicar la posición X e Y relativas a la habitación, o sea, casi casi el objetivo de mi proyecto.  Como sabéis tengo un sistema de dibujado del área que teóricamente ve el wiimote, con colorines y tal:  pues bien, he podido comprobar como en cuanto saco el objeto infrarrojo de esos límites, el mando no ve el objeto, lo que quiere decir que las medidas teóricas se corresponden casi al 100% con la realidad, algo que me es encanta, ya que quiere decir que el sistema de dibujado es fiel a la realidad y que por lo tanto es útil.  (Me falta hacer el tema del redibujado de las áreas de visión una vez calibrado cada wiimote)

Con lo cual ahora lo que me falta es probar con dos wiimotes en posiciones distintas.  Voy a probar a poner un wiimote más a la izquierda del que tengo colocado, y lo voy a colocar de tal forma que entre ambos wiimotes compartan una cuarta parte de su área de visión, y haré comprobaciones con la media de la coordenadas que entreguen ambos mandos.  Dependiendo de como salga la prueba podré implementar un pequeño código que determine que coordenadas se utilizarán cuando me lleguen 7 pares de coordenadas, o sea, cuando el programa funcione a un 100% de capacidad.

Luego tan solo quedará trastear un poco con todo el programa para ver si encuentro algún que otro bug (ya he visto alguno ¬¬) y pasar a documentar bien las pruebas para poderlas usar en la memoria del proyecto y poder así entregar unos resultados definitivos de mi proyecto.  Así que a ver como se me dan estás dos semanas :D

 

¡Saludos!

PFC – Resumen semana #9 + Bonus

Hola de nuevo!

Ayer me reuní de nuevo con mi tutor de PFC.  Desde el verano (durante el desfallecimiento de nuestro robot sigue-lineas) no habíamos vuelto a coincidir, pese a que más o menos estaba enterado del estado del proyecto.  Pues bien, pensaba que lo que había hecho hasta el momento no estuviera del todo bien, pero bueno al final resultó que hasta el momento le convence el estado del proyecto.

Hemos hablado de lo que falta por terminar del proyecto y de algún concepto que había que tener un poco más claro (si hubiera habido alguien contando palabras, hubiera llenado una hoja con la palabra “calibración” xD).  En resumidas cuentas falta lo siguiente:

  • Ser capaz de obtener las coordenadas del objeto que ve el wiimote, no relativas a la posición del wiimote, sino a la sala, algo que sobre el papel tengo más o menos planteado, pero que falta llevarlo a la práctica.
  • Para realizar lo anterior hay que hacer algunos cambios en el método de la calibración de los mandos.  Además creo que voy a dejar de usar la palabra calibración porque la comparación entre la palabra y lo que intentamos definir con la misma se asemeja a la de las churras y las merinas xD.
  • También, aunque yo doy los datos de cómo estarán colocados los wiimotes, esto son datos teóricos, que puede que no sean 100% reales una vez que se hayan colocado los mandos.  Por lo tanto una vez que estén los mandos colocados y se haga la transformación de coordenadas, se realizaría un re-dibujado de las áreas de visión de los wiimotes, habiendo entonces dos posibles representaciones: la teórica y la real.
  • Comenzar a hacer ya la memoria.  Plantear los capítulos que habrá que hacer y comenzar a hacerlos para poderlos revisar con tiempo.
  • Currar, mucho xD, porque tengo dos meses y medio para acabar el proyecto.
En cuanto a nuevas mejoras hechas durante la semana, han sido pocas, la verdad:
  • Varios retoques en el sistema de representación gráfica de los wiimotes.  He añadido un poco de color al círculo que representa el wiimote para que, visualmente, se pueda saber que área de visión corresponde con qué wiimote.
  • Corregir algunos bugs (errores) que surgían dadas según qué circunstancias cuando trabajas sobre el sistema de representación gráfica de los wiimotes.
  • He añadido una pestaña nueva al programa en la cual, de un vistazo, se pueden ver todos los datos importantes de todos los wiimotes de un vistazo.  Ya pondré alguna captura, pero no tiene mucho misterio.
  • He añadido la posibilidad de guardar y cargar los datos que posibilitan la transformación de las coordenadas del wiimote (a.k.a. calibración), aunque solamente están hechas las funciones; hace falta implementarlas en el programa.
  • También estoy añadiendo los menús del programa, quizás con opciones para cargar y guardar los datos de la transformación de coordenadas junto con alguna otra opción más.
Así que esta es la situación.  Digamos que veo bien el asunto, bastante mejor que hace 3 semanas, y mucho mejor que hace 1, una vez conversado sobre el tema con el tutor, pese a que aun tengo trabajo que hacer.   Pero ya no hay más, hay que acabar para diciembre y a eso vamos.
Nos vemos!

PFC – Pantallazo de la semana #8

Hola!

Esta semana ya empieza el curso de nuevo, y… ¡¡se me olvidó matricularme de las asignaturas de la uni!!  Yo no se que ha pasado esta vez, pero desde que llegó el mail de la matriculación de este año, allá por Julio (o Junio, ya no me acuerdo), no se me ha vuelto a pasar por la mente el hecho de que DEBO matricularme de las asignaturas.  Así que después de pasar la fase ¡OMG, OMG, OMG!, pasé a tranquilizarme (no mucho) y a buscar los mensajes de la uni en el correo y ver la página web, a ver si había más fechas para matricular.  Recordaba que sí, pero no estaba seguro.

Duré poco buscando en la página web, veía mucha letra y pocas nueces xD, los nervios debieron cegarme porque la página está bien hecha (contraejemplo: Renfe, para cuando queráis una tarde del terror entrad en su página web y buscad, lo que sea, buff que traumas comprando billetes :@).   Así que llamé a la uni, y entre eso e ir recuperando la visión después del “kernel panic” inicial, ya vi que a partir de mañana (¿hoy xD?) hay otra periodo de matriculación, fiuf xD

Así que nada, peripecias de estudiante… trabajador claro, porque si no hubiera sido por estar ocupado este verano, pues me hubiera acordado de matricularme…. cof, bueno, pues eso, que a ver si consigo matricularme que aun no está todo dicho :p.

Y de paso, dejo una captura de pantalla de algunos avances que estoy haciendo con el proyecto.  A finales de esta semana ya daré más detalles de las cosas que he añadido con respecto a la anterior actualización, y también sobre el estado del proyecto en general, ya que tengo que hablar con mi tutor de PFC que, por supuesto, estará leyendo esto :):

 

Colores, colores everywhere!! (Y más cosas eeh, pero no se ven :p)

 

Y esto es todo, ¡saludos!

 

P.D: Por cierto, cuando estaba documentándome para comenzar el PFC, hace meses, encontré un proyecto de unos japoneses que habían conseguido hacer algo muy parecido a lo que pretendo conseguir con mi PFC.  Pues resulta que en el PDF en el que explicaban muy brevemente el proyecto, tenían sus mails, así que pensando que igual podían resolverme algunas dudas decidí escribirles un mail.  ¡¡Y uno de ellos ha respondido!!, eso si, con un inglés muy japonés, pero entendible al fin y al cabo.  Así que igual con alguna explicación que pueda conseguir de ellos puede que resuelva algunas dudas que tengo sobre algunas cosas que me faltan por hacer.  Además es majo el hombre, está contento de que le haga preguntas jeje.

PFC – Resumen semana #6 y #7

Bueno, ya han pasado otras dos semanas, pero estas han sido mejores que las dos anteriores.  Por fin he conseguido calibrar los wiimotes.  Después de dar muchísimas vueltas, de probar el código de la calibración de mil maneras y de compararlo con otros códigos… no llegué a una conclusión clara de por qué no me funcionaba bien :S.

Así que inicié una búsqueda por google sobre el tema de la calibración de los wiimotes, y todo el rato me encontraba el mismo código de calibración, el creado por johnny lee, por lo tanto seguía igual, ya que tanto el cálculo de los puntos de calibración, como la posterior transformación de las coordenadas del punto que ve el wiimote no me funcionaban, ya había perdido suficiente tiempo con esto.  Buscaba pues una librería que se encargara únicamente de la calibración, y tuve la suerte de encontrar una.  Esta librería se compone de 5 o 6 funciones que se encargan tan solo de recoger los puntos de calibración vistos por el wiimote y devolver las coordenadas transformadas.

Después de hacer unos retoques en el código para implementar esta librería, compilé, y probé el programa…

¡Por fin!

El punto rojo que se ve en la zona izquierda de la pantalla es el LED infrarrojo visto por el wiimote.  En la zona superior derecha tenemos dos PictureBox.  La primera dibuja el polígono formado por los cuatro puntos que ve el wiimote en el momento de la calibración.  Y el segundo dibuja esos mismos puntos una vez han sido transformados.

Si os fijáis, en la imagen de la izquierda podemos ver como lo que ve el wiimote está “distorsionado” por lo que expliqué acerca de las perspectivas en la entrada anterior.  Lo que en el mundo real es un rectángulo (formado por cuatro marcas dibujadas en una plantilla), el wiimote lo ve como un trapecio, algo que no nos es útil a la hora de determinar coordenadas.  Sin embargo, en la imagen de la derecha, podemos observar esos mismos cuatro puntos, pero transformados, con lo cual estamos observando, ahora sí, un rectángulo.

He añadido una pequeña caja de selección, con el texto “Ver Calibrado”.  Si no pulso esa casilla, en la picturebox grande de la izquierda observo la coordenadas que recibe el wiimote, sin transformaciones, y por lo tanto distorsionada.  Si la pulso entonces activo la transformación de las coordenadas que recibe el wiimote, y por lo tanto puedo verlas por pantalla.  Hasta aquí todo bien, aunque tengo algunas dudas/problemas que tengo que resolver:

  • Dimensiones de la plantilla

La plantilla que utilizo es así:

Plantilla de calibración

Son cuatro folios pegados con celo, con estas cuatro marcas.  Las dos marcas del lado más largo están separadas 61 cm, y las dos marcas del lado más corto están separadas 34 cm.  Pues bien, al programa hay que decirle cuál es el tamaño de la plantilla de calibración

Si la plantilla está dibujada en una pantalla de ordenador, la dimensiones de esta plantilla no se le da en cm, sino en píxeles.  Por lo tanto en una configuración estándar las distancias que introduciríamos en el programa serían 1024 y 768.  Yo he usado estos datos para mi calibración, porque todavía no se muy bien como darle al ordenador los valores del tamaño de mi plantilla.

  • Area de calibración

En la primera imagen, en la que enseño parte del programa, podeis ver en las picturebox de la parte superior derecha, que el trapecio es más pequeño que el rectángulo transformado.  Esto quiere decir que las nuevas coordenadas máximas pasan a ser las que yo le he dado por programa (1024 y 768) y por lo tanto si el wiimote ve un objeto infrarrojo, previamente se podía observar aunque saliera de la zona del trapecio, ya que todo el cuadrado es el área que ve el wiimote.

Sin embargo ahora cuando el objeto sale mucho de la zona del trapecio, en la picturebox de la derecha, en la de las coordenadas transformadas, ya no se verá el objeto.  Si bien si seguiremos teniendo sus coordenadas, la verdad es que esto supone un problema.  El wiimote sigue teniendo un gran rango de visión, pero el rango que yo puedo reflejar por pantalla será menor, y dependiendo de lo pequeña que se vea la plantilla de calibración, mucho menor.

Además, si suponemos que, como mínimo, dos wiimotes ven el mismo punto infrarrojo, cada uno entregará unas coordenadas relativas a su posición, y no a la absoluta de la habitación donde se encuentren situados los wiimotes y el objeto.  Con lo cual habrá que convertir esas coordenadas; y si además las que recojo del wiimote pueden estar con números negativos, pues se complica más el asunto.

Así que veo una solución posible, un plan B:  Que la plantilla de calibrado no exista.  Esto quiere decir que, por ejemplo, imprimiría en una hoja en blanco una de esas marcas de calibración, pero una marca de calibración enorme.  Movería el punto infrarrojo a lo largo de la habitación para obtener los 4 puntos de calibración, que serían los 4 puntos que me permitieran “dibujar” el rectángulo más grande posible:

Sería algo así.  Tened en cuenta que la plantilla, es el suelo: marcaríamos los puntos con folios con esa señal, y después, en el momento de la calibración, pondríamos el punto infrarrojo encima de cada uno de esos puntos, tal y como si hiciéramos con la plantilla pequeña.  De esta forma el área de visionado que tendríamos, aun después de transformar las coordenadas sería el máximo posible, y solo perderíamos un poco de área de visión que supliríamos con los rangos de visión de los demás wiimotes.  Quizás se podrían mover un poco los cuatro puntos para que no utilizar los extremos del área de visionado del wiimote, de esta forma la posible pérdida de precisión cuando el objeto estuviera en dichas zonas sería menor.

Seguramente se me ocurrirá algún inconveniente más, pero vaya esto es todo por el momento.  También comentar acerca del punto infrarrojo.  Hasta ahora utilizaba uno de los montajes que hice, en concreto el primero que muestro ahí.  Y para alimentar el montaje usaba la fuente de alimentación, con un cable que cruzaba toda la habitación, y con un interruptor en medio para poder hacer los destellos necesarios para el proceso de calibración.  Uno al final se acostumbra, pero bueno decidí hacer un pequeño montaje para usar un apila de 9V y ahorrarme los cables (mi habitación parecía una jungla, ya lo parece, pero con tantas “lianas”, aún mas :p ).  Os enseño el montaje en fotos, y mañana o pasado pondré el esquema (muy simple):

Mi “as” en la manga xD

Punto infrarrojo en la plantilla de calibración

Sí, es una caja de plástico que contenía cartas :p.  La vi y supe que ahí iba a hacer mi montaje.  Tan solo tengo una pila de 9V, un pulsador de tipo boton, y un doble conmutador.  Cuando tengo que realizar la calibración, voy pulsando el botón de la parte superior para ir haciendo destellos infrarrojos en los puntos de calibración.  Pero cuando necesito que le punto esté accionado durante un rato, pues todo el conmutador que se ve en el lateral del a caja de cartas, y de esta forma está encendido de forma permanente, o por lo menos hasta que se acabe la pila.  La verdad es que es bastante más cómodo que lo anterior.

Y esto es todo por estas dos semanas.  Ahora me voy a poner a ver el punto infrarrojo con dos wiimotes, y a transformar las coordenadas relativas de cada uno de ellos, a las coordenadas absolutas de la habitación.  A ver cómo se me da eso ;).

¡Saludos!

PFC – Resumen semana #4 y #5

Como cuesta actualizar esto.  Bueno hago un pequeño resumen de estas dos semanas.  Estas dos semanas han estado llenas de problemas.  Para empezar mi relación odio/odio con Windows.  Después de solucionar este asunto, volví de nuevo a ponerme manos a la obra.

Estaba con el tema del dibujado del área de visión de cada wiimote, pero no acabé de solucionar este problema.  El tema del dibujado es bastante problematico cuando tienes que dibujar capas.  Dibujas todo, y luego cuando el usuario cambia algún dato como alguno de los ángulos o la altura del mando, tiene que volver a redibujarse en base a los nuevos datos de entrada, pero al mismo tiempo borrar lo que había antes.  Y esto lo hacía bien, pero al cambiar luego el código para poder dibujar el área del wiimote diera igual el valor del ángulo alfa, me encontré con problemas que de momento no logré resolver.

Es por ello que decidí cambiar de tarea, lo he dejado aparcado para un tiempo más conveniente.  Me puse directamente con el código de la calibración de los wiimotes.  Para explicar esto de la calibración usaré una imagen que encontré en otro blog y me sirve para explicar brevemente el asunto.

Vision distorsionada de un wiimote. 1

El tema son las perspectivas.  Si os fijáis, cuando el wiimote, en la mayoría de los casos, nunca verá de frente el área donde se encuentra nuestro objeto.  De tal forma que siempre lo verá en perspectiva.  Necesitamos crear un código, en el que marcamos cuatro puntos de calibración.  De forma secuencial, iremos iluminando un led infrarrojo en cada uno de esos puntos de calibración para decirle al programa cuáles son los márgenes del área que queremos visionar.  Una vez hecho esto, tenemos que tener presente que lo que ha visto el wiimote no es un cuadrado, tal y como nosotros le hemos marcado, sino un trapecio, por estar viendo todo en perspectiva.

Es por ello que hay que utilizar una serie de cálculos matemáticos para transformar la perspectiva de la imagen obtenida.  Así obtenemos un cuadrado.  Podemos decir que cada uno de los puntos que existen en el trapecio, tiene un equivalente en el cuadrado, asi que convirtiendo las coordenadas x e y del punto infrarrojo cada vez que el wiimote lo vea, estaremos corrigiendo el problema de la perspectiva. Esto se conoce como Homografía. Quizás con esta imagen se vea mejor.

Matriz de homografía. 2

Pues bien, estos cálculos ya están hechos en el código fuente que compartió Johnny Lee, por lo tanto solo hay que aplicarlos.  El caso es que he tenido problemas, y no por los cálculos, sino por la versión del Visual Studio.  Resulta que en la versión 2005 si accedes a un control desde un hilo distinto al que se creó todo funciona bien.  En cambio en la versión 2008 pues el programa da error.  Hasta que encontré que el fallo se debía a esto, pues tarde varios días, más de los que yo quería.

El caso es que ya lo he resuelto.  Encontré dos formas de solucionarlo, una elegante y otra no.  De momento uso la no elegante, más adelante ya veré como puedo implementar la forma elegante.  Ahora seguiré con el tema del código de calibración y coordenadas.  Claro el mando ve el objeto, y para ese objeto tiene unas coordenadas x e y.  Pero dichas coordenadas son relativas al wiimote.  Lo que tengo que hacer es transformar dicha coordenadas relativas a unas absolutas, que me indiquen las coordenadas x e y del objeto respecto de la sala y no del wiimote.  A ver qué consigo :P

Saludos!

P.D: A ver si logro perder menos tiempos con estos problemas… y despertarme más temprano tambien xD

Fuente imágenes: [1] y [2]