Codificación+de+gestos+con+WiiMote

=__Índice de Contenidos__=


 * Resumen y objetivos.


 * Conectando WiiMote.
 * Simulación casera de infrarrojos.


 * Librerías para desarrollo.
 * Instalación.
 * Prueba de ejemplos.


 * Valoración de resultados.


 * Conclusiones.


 * Bibliografía.

= __ Introd ucción __ =

Como podemos comprobar, el mundo tecnológico ha crecido a un ritmo desorbitado hasta nuestros días. Ya no basta con un dispositivo externo como un ratón, un mando de televisión o los teclados para comunicarnos con nuestros dispositivos sino que se buscan elementos que faciliten y hagan atractivo el uso de un determinado objeto al consumidor.

El mercado avanza a pasos agigantados llevándose por su paso medios que se han usado hasta hace muy poco y que fueron creados por las mismas empresas que hoy los eliminan. La estética de los productos actuales obliga a los fabricantes a sustituir medios como los cables por dispositivos en los que el intercambio de información se lleva a cabo por envío de señales ya sean WIFI, Bluetooth, infrarroja, etc. Aquí es donde entra el elemento sobre el que trabajaremos en este trabajo. Si tenemos dispositivos que nos permiten comunicarnos con nuestro ordenador o nuestra televisión, ¿por qué no los usamos para facilitar las tareas que hacemos diariamente?

Con WiiMote tenemos un medio relativamente barato para experimentar en el nuevo mundo de la interacción gestual. Durante el desarrollo de este trabajo comprobaremos que no es fácil trabajar con él debido a que se trata de un dispositivo que carece de un kit de desarrollo público y sólo puede hacerse uso de librerías desarrolladas por programadores externos a la empresa que lo creó, Nintendo.

Aún con esas limitaciones, veremos que determinados usuarios han creado aplicaciones muy interesantes con la funcionalidad que ofrece este control entre las que destacan los proyectos desarrollados por JohnyChung Lee usando la librería WiimoteLib desarrollada por Brian Peek.

Por último y como punto final de esta introducción comentar que los dispositivos como WiiMote, LeapMotion y otros productos similares se están convirtiendo en los predecesores de la tecnología gestual, están creando nuevos paradigmas de interacción hombre-máquina basados en gestos y movimientos que el ser humano está acostumbrado a hacer y que le son naturales y que están facilitando que personas con discapacidad, de avanzada edad o reacios a la tecnología comiencen a entrar en este mundo.



= __Conectando W iiMote __ =

Para probar el funcionamiento del control WiiMote e intentar desarrollar código para que interprete gestos es necesario conectarlo al equipo en el que se va a trabajar con él. WiiMote sólo puede conectarse a un equipo vía Bluetooth, por lo que necesitaremos que el equipo tenga instalado con dispositivo de este tipo o comprar uno. En nuestro caso hemos optado por la segunda opción ya que no son muy caros y pueden aprovecharse para muchas otras tareas como intercambiar archivos entre ordenadores, con dispositivos móviles o consolas.

  o en grandes superficies.
 * <span style="font-family: Arial,Helvetica,sans-serif;">El adaptador que necesitamos puede adquirirse por unos 5€ en comercios de informática
 * <span style="font-family: Arial,Helvetica,sans-serif;">Tiene un alcance máximo de entre 5 y 10 metros.
 * <span style="font-family: Arial,Helvetica,sans-serif;">Funciona tanto en Windows como en Linux.

<span style="font-family: Arial,Helvetica,sans-serif;">Una vez que disponemos de nuestra conexión Bluetooth tendremos que conectar WiiMote al equipo. Esto puede hacerse de varias formas aunque no todas tienen éxito. Nosotros hemos conseguido conectar WiiMote tanto en Windows 7 como en Ubuntu 12.04 siguiendo los siguientes pasos.

= __ Conexión de WiiMote en W indows 7 __ =

<span style="font-family: Arial,Helvetica,sans-serif; line-height: 1.5;">En Windows es sencillo conectar el mando. Basta con tener instalado y funcionando el dispositivo receptor de Bluetooth, hacer click sobre el icono y seleccionar la opción “Agregar nuevo dispositivo”. Una vez dentro es necesario pulsar los botones 1 y 2 del mando al mismo tiempo, esto hará que WiiMote entre en modo visible y pueda ser detectado por el receptor de Bluetooth. Cuando lo haya detectado aparecerá el dispositivo en la ventana de detectados.



<span style="font-family: Arial,Helvetica,sans-serif;">Una vez detectado el dispositivo hacemos doble click sobre el para instalar los drivers y poder usarlo. Aparece una nueva ventana con tres opciones entre las que podemos elegir entre introducir el código de nuestro dispositivo para una conexión total o buscar los drivers en nuestro equipo e instalarlos. Nosotros hemos optado por la segunda opción.



<span style="font-family: Arial,Helvetica,sans-serif;">Ya tenemos el dispositivo instalado en nuestro equipo y listo para usarlo.

= __Conexión de WiiMote en Ubuntu 12.04__ =

<span style="font-family: Arial,Helvetica,sans-serif;">Conectar WiiMote en Linux puede ser un poco más tedioso que hacerlo en Windows pero no resulta muy largo ni muy difícil de hacer. <span style="font-family: Arial,Helvetica,sans-serif;">El primer paso que debemos es el de instalar las librerías de las que depende. Para ello usaremos el siguiente:


 * <span style="font-family: Arial,Helvetica,sans-serif;">apt-get install wmguiwminputlswm

<span style="font-family: Arial,Helvetica,sans-serif;">Una vez instalados actualizamos el registro de programas instalados con:


 * <span style="font-family: Arial,Helvetica,sans-serif;">apt-get update
 * <span style="font-family: Arial,Helvetica,sans-serif;">apt-get upgrade

<span style="font-family: Arial,Helvetica,sans-serif;">Para conectar el mando pulsamos los botones 1 y 2 y lanzamos la siguiente orden para escanear dispositivos Bluetooth:
 * <span style="font-family: Arial,Helvetica,sans-serif;">hcitoolscan

<span style="font-family: Arial,Helvetica,sans-serif;">Si se ha detectado el dispositivo, debe aparecer algo similar a:

<span style="font-family: Arial,Helvetica,sans-serif;"> ü xx:xx:xx:xx:xx:xxNintendo RVL-CNT-01

<span style="font-family: Arial,Helvetica,sans-serif;">Ya tenemos conectado el mando a Ubuntu. En éste sistema operativo puede configurarse el mando para usarlo como mouse, como pizarra o para usar el acelerómetro para cambiar la lista de reproducción (ver enlace [16] si se quiere configurar alguno de estos controles).

= __Simulación casera de infrarrojos__ =

<span style="font-family: Arial,Helvetica,sans-serif;">Para que nuestro equipo detecte el puntero de WiiMote es necesario contar con la barra de leds infrarrojos que se distribuye junto a Wii. Si no se cuenta con ella puede realizarse este método casero para detectar la posición a la que apunta el infrarrojo que WiiMote tiene en su parte superior.

<span style="font-family: Arial,Helvetica,sans-serif;">El único material que necesitaremos para construir nuestro método de posicionamiento son dos velas. La forma con la que funcionan es muy simple, sirven para triangular con el led infrarrojo del mando. Así, si se aumenta la distancia entre las dos velas también se aumenta el rango en el que se detecta la posición del cursor hasta llegar a un cierto límite, claro.



= __<span style="font-family: Arial,Helvetica,sans-serif;">Librerías para desar <span style="font-family: Arial,Helvetica,sans-serif;">rollo __ =

<span style="font-family: Arial,Helvetica,sans-serif;">Una vez detectado el mando podemos probar alguna de las librerías disponibles para interactuar con el mando, recopilar sus datos y comprobar posición y orientación. <span style="font-family: Arial,Helvetica,sans-serif;">Hay multitud de librerías de código abierto, escritas en casi todos los lenguajes de programación y compatibles con algunos entornos como Netbeans o Eclipse. Entre todas ellas hemos probado con las siguientes:
 * <span style="font-family: Arial,Helvetica,sans-serif;">Wiinremote: Programada en Delphi.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiYourself!: Programada en c++.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiimotionLib: Programada en c#, esta librería fue desarrollada por Brian Peek y usada por Johny Lee Chung en sus proyectos (ver enlaces [3] y [18] de la bibliografía).
 * <span style="font-family: Arial,Helvetica,sans-serif;">motej: Librería para el control de WiiMote programada en Java.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiRemoteJ: Librería programada en Java.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiC: Programada en C.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiGee: Librería programada en Java.
 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiUseJ: También en Java.
 * <span style="font-family: Arial,Helvetica,sans-serif;">Cwiid: Programada en C y compatible con muchas funcionalidades de Ubuntu.

= __Instalación de librerías__ =

<span style="font-family: Arial,Helvetica,sans-serif;">Aunque hay muchas librerías, la instalación de cada una de ellas es un mundo. Podemos encontrar librerías que pueden usarse descargando y descomprimiendo los ficheros dentro del proyecto que estemos realizando hasta librerías que requieren un entorno específico y un entrenamiento avanzado para poder configurar los proyectos y, con mucha suerte, poder ejecutarlos.

<span style="font-family: Arial,Helvetica,sans-serif;">De entre todas las librerías que se mencionaron y probaron en la página anterior destacamos tres por tener tutoriales, documentación y por ser “fáciles” de usar. Son las siguientes:


 * <span style="font-family: Arial,Helvetica,sans-serif;">WiimoteLib: La fama que ha tomado JohnyChung Lee (ver su página web -- [] --) con sus aplicaciones hace que esta librería sea la más aconsejable para usarla y desarrollar aplicaciones. Aun así, requiere la instalación de la plataforma Visual Studio 2008 – 2010 y encajar muchas piezas para usar la librería. Además, es necesario aprender C# para usarla, aunque este sea el menos de los problemas.


 * <span style="font-family: Arial,Helvetica,sans-serif;">Cwiid: Existe un tutorial avanzado con ejemplos e instalación paso a paso para esta librería. Además, parece estar actualizada y documentada por lo que es una opción bastante atractiva para desarrollar código. Aun así, presenta los mismos problemas que las demás librerías, no funcionan en todas las plataformas ni en todos los entornos y su instalación y uso no son triviales.


 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiGee: Esta librería tiene la ventaja de que es una de las pocas que se pueden enlazar en Java, además de presentar las ayudas y facilidades de este lenguaje. Aun así, la llamada a muchas funciones provoca errores de enlazado aunque se sigan uno a uno los pasos definidos en su propia web o en los tutoriales que podemos encontrar en la Web.

<span style="font-family: Arial,Helvetica,sans-serif;">Como puede verse, todas las librerías presentan desventajas bastante graves. La gran mayoría no funciona o devuelve errores en la llamada a las funciones de la librería. Tampoco pueden descartarse los fallos que hayamos podido tener a la hora de configurar los entornos o enlazar librerías pero hay algo común a todas las librerías para el control de WiiMote y es que tienen problemas muy similares en la llamada a sus métodos y en las referencias y variables que usan. También nos hemos encontrado con librerías como Motej que parecen ser proyectos abandonados, sin actualizaciones ni revisiones, sin documentación y de los que sólo pueden probarse los ejemplos.

<span style="font-family: Arial,Helvetica,sans-serif;">Otro aspecto muy a tener en cuenta es la librería que hace compatible el uso de un dispositivo Bluetooth con los entornos de programación y con los lenguajes de programación que utilizamos en cada proyecto. La librería que nosotros hemos intentado usar es Bluecove.lib en Windows. También presenta muchos problemas de compatibilidad, sobre todo con los sistemas operativos de 64 bits. En Ubuntu se usa la librería Bluetooth.lib que está instalada por defecto en cada paquete de distribución.

= __Prueba de ejemplos__ =

<span style="font-family: Arial,Helvetica,sans-serif;">Aunque no hemos podido escribir ningún programa propio por errores en las librerías, sí que hemos ejecutado los programas precompilados que incluyen las librerías como ejemplos de uso. Mostraremos los siguientes:


 * <span style="font-family: Arial,Helvetica,sans-serif;">WiiYourself.

<span style="font-family: Arial,Helvetica,sans-serif;">El programa que trae como ejemplo permite observar todos los datos del control; inclinación, orientación, rotación, botones, micrófono y accesorios.

<span style="font-family: Arial,Helvetica,sans-serif;">Conexión.



<span style="font-family: Arial,Helvetica,sans-serif;">Programa y visualización de parámetros.

<span style="font-family: Arial,Helvetica,sans-serif;">En verde aparece la carga de la batería del mando. A su derecha el LED que está encendido (Juagadores 1-4). Abajo el identificador del mando y los botones que se pulsan seguidos de los valores de acelerómetro en X, Y y Z y los valores de la orientación de WiiMote. En la última fila aparecen los datos de precisión del Wii Motion Plus.

<span style="font-family: Arial,Helvetica,sans-serif;">WiimoteLib viene con un ejemplo precompilado para comprobar que funcionan los botones del mando y para visualizar los datos que es capaz de recopilar. Es muy similar al que ofrece Wiiyourself pero con un entorno gráfico que lo hace más vistoso.



<span style="font-family: Arial,Helvetica,sans-serif;">Wii C++: Esta librería también cuenta con un ejemplo para que veamos lo que se puede hacer con ella. Este ejemplo es “wiileds.exe”, que permite encender desde nuestro pc cualquiera de los leds de jugador con los que cuenta el mando.

<span style="font-family: Arial,Helvetica,sans-serif;">

<span style="font-family: Arial,Helvetica,sans-serif;">CWiid: La única librería con la que se podían compilar algunos programas en Linux es Cwiid. Dentro de los directorios incluía ejemplos como el que se muestra en la captura siguiente, en el que puede controlarse cualquier botón o función del WiiMote desde una terminal.



= __Valoración de resultados__ =

<span style="font-family: Arial,Helvetica,sans-serif;">Una vez probadas todas las librerías no hemos podido cumplir nuestro principal objetivo, crear un código para interpretar gestos como:


 * <span style="font-family: Arial,Helvetica,sans-serif;">Usar el acelerómetro y la posición del mando para dibujar una “Z” en el aire y que la dibujase por pantalla.


 * <span style="font-family: Arial,Helvetica,sans-serif;">Usar el acelerómetro para identificar el movimiento correspondiente a un puñetazo y que produjese un sonido de golpeo.

<span style="font-family: Arial,Helvetica,sans-serif;">Lo único que podemos valorar es que usar las librerías para el desarrollo de programas y aplicaciones en cualquier lenguaje es muy tedioso y difícil. Enlazar con las librerías es imposible en la mayoría de los casos y se requieren muchas dependencias para hacer funcionar un código, aunque sea mínimo.

= __Conclusiones__ = <span style="font-family: Arial,Helvetica,sans-serif;">Para finalizar este trabajo creemos conveniente comentar que no todo es malo con respecto al uso de programación con WiiMote. Existen programas como GlovePie que hacen posible la creación de scripts para usar el control de Nintendo como un mando de videojuego. Además, en Ubuntu se permite usar WiiMote como ratón, para cambiar las canciones de la lista de reproducción o para dibujar en GIMP. Por tanto, WiiMote podría ser una herramienta muy útil y divertida para interactuar con medios audiovisuales en Linux, para usarlo como control remoto, etc.

<span style="font-family: Arial,Helvetica,sans-serif;">También es cierto que las librerías que existen se deben al esfuerzo de ciertos usuarios para crear entornos con los que trabajar con WiiMote por lo que también se merecen su reconocimiento.

<span style="font-family: Arial,Helvetica,sans-serif;">Aun así, creemos que otros dispositivos como Leap Motion o Kinect sacan una gran ventaja a WiiMote tanto por disponer de entornos de desarrollo especializado y dedicado como por mostrar características más avanzadas y vistosas. En estos dos dispositivos desaparecen los controles, todo se reduce a los gestos, lo que los hace más intuitivos y fáciles de manejar para las personas.

<span style="font-family: Arial,Helvetica,sans-serif;">Por último comentar que, nuestra experiencia con WiiMote nos ha hecho pensar que puede que no sea el dispositivo más idóneo para desarrollar nuevos paradigmas de interacción en un futuro, que lo que ha de llegar está más relacionado con la interacción gestual y por voz y que las nuevas tecnologías (Smarthphone, Tablets, Smart TV’s, etc) triunfan por el hecho de eliminar en cada paso que dan los dispositivos físicos de interacción y usar cada vez con mayor acierto la interacción directa y sencilla entre hombre y máquina.

= __Bibliografía__ =

http://www.iearobotics.com/wiki/index.php?title=Wiimote_windows [1]

http://blog.jorgeivanmeza.com/tag/wiimotelib/[2]

http://johnnylee.net/[3]

http://channel9.msdn.com/coding4fun/articles/Managed-Library-for-Nintendos-Wiimote[4]

http://motej.sourceforge.net/[5]

http://www.wiigee.org/[6]

http://wiic.sourceforge.net/[7]

http://www.turkeytunnel.com/bluecove-java-bluetooth-library-on-windows-7-64bit-solved/[8]

http://graphics.uni-konstanz.de/publikationen/2008/gesturerecognition/Schloemer%20et%20al.%20--%20Gesture%20Recognition%20with%20a%20Wii%20Controller.pdf[9]

http://geeks.ms/blogs/thempra/archive/2009/02/23/controlar-wiimote-desde-c.aspx[10]

http://ocw.unia.es/ciencias-tecnologicas/tecnologia-del-ocio/materiales-basicos-folder/html/B1_UD07/librera_cwiid.html/skinless_view[11]

http://www.elotrolado.net/hilo_tutorial-usar-el-wiimote-en-linux-con-cwiid-sin-morir-en-el-intento_694072[12]

http://www.ray.lunasexta.org/blog/2010/05/usando-un-wiimote-para-controlar-ubuntu/[13]

http://www.brianhensley.net/2012/08/wii-controller-raspberry-pi-python.html[14]

http://jose-linares.com/tag/cwiid/[15]

http://freefri.wordpress.com/2010/10/06/como-configurar-wii-motion-como-raton-en-ubuntu/[16]

--- Videos ---

http://www.youtube.com/watch?v=KbHIPXkx-NM[17]

http://www.youtube.com/watch?v=MOOCY5Bc_OA[18]

http://www.youtube.com/watch?v=5s5EvhHy7eQ[19]

http://www.youtube.com/watch?v=0awjPUkBXOU[20]

http://www.youtube.com/watch?v=-ybFRlq1hm4[21]

http://www.youtube.com/watch?v=Vb2tOOiwEhY[22]

http://www.youtube.com/watch?v=Q5AzpGHVhPc[23]

http://www.youtube.com/watch?v=KbHIPXkx-NM [24]