PFC Carlos Pastor Herran
PFC Carlos Pastor Herran
PFC Carlos Pastor Herran
Autor: Carlos Pastor Herrn Tutor: Juan Gonzlez Gmez Cotutor: Alberto Jardn Huete DEPARTAMENTO DE INGENIERA DE SISTEMAS Y AUTOMTICA
PROYECTO FIN DE CARRERA UNIVERSIDAD CARLOS III DE MADRID INGENIERA TCNICA DE TELECOMUNICACIN: SONIDO E IMAGEN Legans, Octubre de 2010
Agradecimientos
"Mientras el ro corra, los montes hagan sombra y en el cielo haya estrellas, debe durar la memoria del beneficio recibido en la mente del hombre agradecido." (Virgilio)
El proyecto fin de carrera supone el final de un ciclo empezado hace cinco aos. Durante todo este largo tiempo he tenido gente a mi lado que me ha ayudado tanto acadmicamente como personalmente haciendo que llegue hasta donde me encuentro ahora mismo. Con estas lneas intento demostrarles el agradecimiento hacia ellos y hacia lo que han hecho por m. A Juan Gonzlez, mi tutor del proyecto. Ha demostrado una gran calidad docente en sus explicaciones y correcciones de los captulos que integran el proyecto y otros aspectos formativos. Adems, destacar la calidad humana demostrada en su apoyo y paciencia durante el desarrollo del proyecto. A mis compaeros del colegio, a mis recientes compaeros de piso y a todas las personas que me ayudaron y no mencione por olvido o cuestiones de espacio (ruego me perdonen) aceptad mi ms sincero agradecimiento. A mis compaeros de clase. Todos los compaeros de clase nos hemos ayudado en el mbito universitario pero hago especial mi agradecimiento a los que con el paso del tiempo se han convertido en amigos en Madrid. A Lidia, Tania, Marta y Guille, gracias. A mis compaeros en la residencia. Muy especialmente a Santi y Pedrillo, con quien me une una muy buena amistad. Gracias por adoptarme en vuestra habitacin continuamente y hacer que fuera de tres personas en vez de dos.
Hago extensible el agradecimiento a todos aquellos que me han apoyado e interesado por la carrera y el proyecto especialmente en el ltimo ao. A mis otros amigos de la residencia. A Joaqun y Esperanza. Vosotros habis sido algo parecido a mis padres en los cuatro aos que estuve en la residencia. Gracias especialmente a Joaqun por nuestras largas charlas nocturnas y por sus valiosos consejos para la vida. Tambin a Pepi, nuestra madre en la residencia. A Mara Jos. Pese a que la vida nos haya separado, es de justicia dar las gracias a las personas que tanto han hecho por otra. Gracias por tu cario y apoyo en todos los mbitos durante la carrera. Por eso y por todo lo que me ayudaste, muchas gracias. A mis amigos de Len. Para ellos va un muy sentido agradecimiento ya que son los que siempre han estado a mi lado cuando lo he necesitado. Pese a la distancia, vuestra ayuda y apoyo me ha llegado como si estuviramos juntos. Por esos momentos de vacaciones o puentes que pasaba en mi tierra con ellos, siempre cortos, pero muy intensos. A Pablo, Pela y Mara, muchas gracias. Extensible tambin este agradecimiento a Pere, con quien inicie la aventura madrilea tras su estancia en Len. A mi familia. A todos los miembros de mi familia que, de cerca, han seguido mis avances y me han aconsejado. A mis tos, primos y abuela gracias por vuestra compaa y vuestro amor hacia m. Por ltimo y no menos importante, a mis padres. A ellos les debo el poder estar aqu en este momento. Si no fuera por ellos, no sera ingeniero tcnico de telecomunicacin. Debo agradecer todo lo que han hecho por su hijo para que pudiera llegar hasta donde se encuentra. A mi madre, por su preocupacin y cario hacia su hijo, sin los cuales no habra podido avanzar. A mi padre, por sus sabias lecciones para la vida y su sereno apoyo, imprescindible para m en los momentos ms duros. A vosotros, mis mejores amigos y mi mejor modelo vital, MUCHSIMAS GRACIAS.
Dedico este trabajo a mi abuela Carmen y especialmente a mi abuelo Jos. Gracias por estar siempre pendientes del nieto que se fue a Madrid para que sus primos le ayudasen en todo lo que fuera necesario. Pese a que no os pueda ensear el proyecto y deciros que ya soy ingeniero, espero que os sintis orgullosos de vuestro nieto.
ndice general
1. Introduccin1
1.1. 1.2. 1.3. Motivacin..1 Objetivos.2 Organizacin. 3
3. Wii Remote..24
3.1. Introduccin...24 3.2. Descripcin tcnica..25 3.2.1. Diseo..25 3.2.2. Deteccin de movimiento.26 3.2.3. Funcin puntero.... 27 3.2.4. Comunicacin.....27 3.2.5. Funciones adicionales...29 3.2.6. Autonoma...29 3.3. Accesorios.30 3.3.1. Accesorios funcionales.30 3.3.2. Accesorios soporte....32 3.4. API para la programacin....32
Anexo D: Instalacin de la librera para Wii Balance Board...139 Anexo E: Manual de operaciones de Wii Balance Board....141 Bibliografa...143
ndice de figuras
1.1 Robot ASIBOT asistiendo en la accin de beber 2 2.1. Vista del anlisis cinemtico del brazo en la actividad de beber 2.2. Usuario controlando su silla de ruedas con su nariz 2.3. Vista de un paciente haciendo uso de Lokomat 2.4. Zone 40 2.5. Controlador de movimiento de Playstation Move 2.6. Controlador de navegacin de Playstation Move 2.7. Playstation Eye 2.8. Kinect 2.9. Wii 2.10. Usuario con adaptacin en un accesorio del mando de Wii 2.11. Wiimote adaptado 2.12. Wii Balance Board en soporte para realizar actividades de rehabilitacin 17 6 7 7 8 9 10 11 12 14 16 16
3.1. Wiimote en sus diferentes vistas 3.2. Orientacin de los ejes del acelermetro del Wiimote 3.3. Chip ADXL330 integrado en la placa del Wiimote
25 26 26
3.4. Conectividad Bluetooth del Wiimote 3.5. Chip BCM2042 integrado en la placa del Wiimote 3.6. Placa del Wiimote 3.7. Accesorios funcionales para Wii, de izquierda a derecha y de arriba a abajo: Nunchuk, Mando clsico, Wii Guitar y Wii Motion Plus 3.8. Accesorios soporte para Wii: Wii Zapper y Wii Wheel 3.9. Vista del men e imgenes de la aplicacin Wiimote_2D 3.10. Ejejcucin de wiimote_2D controlado mediante movimientos de la cabeza 3.11. Vista de la aplicacin Pong_wiimote
28 28 30
31 32 41
42 42
4.1. Vista frontal del sensor de movimiento 4.2. Esquema de los ngulos de visin mximos de la cmara del Wiimote 4.3. Barra de sensores 4.4. Vista lateral y superior de posible colocacin de barra de sensores y su relacin con el mando 4.5. Vista de los LEDs de la barra sensora mediante cmara convencional 4.6. Vista superior y lateral de la interaccin entre un lpiz emisor de IR y el Wiimote 4.7. Vista esquemtica del seguimiento de un robot mvil 4.8. Esquema elctrico de un emisor de infrarrojo 4.9. Esquema de montaje de lpiz infrarrojo 4.10. Vistas laterales del montaje utilizado en las pruebas de aplicaciones 4.11. Vista de la aplicacin Wii_led 4.12. Esquema de entorno de prueba de la aplicacin Wii_mancuerna 4.13. Vista del entorno de prueba de la aplicacin Wii_mancuerna 4.14. Vista de la aplicacin Wii_Mancuerna
46 46 47
48 49
51 52 53 53 54 56 57 57 58
5.1. Wiimote con Wii Motion Plus 5.2. Vista frontal y trasera del Wii Motion Plus
60 60
5.3. Orientacin del acelermetro del Wiimote y de las magnitudes medidas por el Wii Motion Plus 5.4. Placa del Wii Motion Plus 5.5. Vista de la aplicacin Wii_motionplus con el mando en reposo y con el mando en movimiento 65 61 63
6.1. Vista de la Wii Balance Board 6.2. Vista de los sensores de deformacin utilizados en la Wii Balance Board 6.3. Sincronizacin de la Wii Balance Board y consola Wii 6.4. Movimientos bsicos en Wii Balance Board 6.5. Vista de la aplicacin Grawwity_center 6.6. Vista de las posibles posiciones a adoptar en el uso de la aplicacin Pong_wiiboard 6.7. Vista de la aplicacin Pong_wiiboard
68
69 69 70 72
74 75
A.1. Vista de la aplicacin wmgui interactuando con los botones y con el acelermetro A.2. Vista de la aplicacin wmgui interactuando con la cmara de IR y con el acelermetro 81 80
Captulo 1 Introduccin
1.1. MOTIVACIN
La motivacin principal de este proyecto es mejorar las tcnicas de rehabilitacin y fisioterapia usando las nuevas tecnologas. Las sesiones de rehabilitacin son generalmente repetitivas y aburridas para el paciente, por lo que resultan poco motivadoras. La inclusin de tecnologa en forma de juego en un ordenador o en otro soporte de similar funcin se convierte en una interesante opcin para motivar al paciente. De esta manera puede seguir ejercitndose y mejorar el resultado ya que tendr una mejor disposicin al trabajo. Esta idea es vlida para un proceso rehabilitador o unas sesiones de fisioterapia pero se puede hacer extensible a otros mbitos. El uso de un juego puede resultar ms atractivo para pacientes que se encuentren en el rea de terapia ocupacional o para pacientes que sufran enfermedades neurodegenerativas. Este proyecto adems se engloba dentro del proyecto ASIBOT del RoboticsLab de la Universidad Carlos III de Madrid [1]. ASIBOT es un robot porttil con funciones asistenciales para personas de edad avanzada y enfermos. Se ha probado en entornos reales con usuarios, pudiendo ayudarles en tareas tales como comer, beber, afeitarse, etc. El trabajo con dispositivos inalmbricos nos puede ofrecer una interfaz que podamos adaptar al robot. As, con dispositivos de bajo coste, podremos controlar total o parcialmente el robot
CAPTULO 1: INTRODUCCIN
1.2. OBJETIVOS
Los objetivos del proyecto son: Estudio de los diferentes dispositivos inalmbricos que pueden ser usados en aplicaciones asistenciales para rehabilitacin y fisioterapia. Establecimiento y conocimiento del hardware bsico a usar en el desarrollo de aplicaciones. Desarrollo de plataforma software de base para la creacin rpida de aplicaciones a medida. Desarrollo de aplicaciones Opensource para rehabilitacin y fisioterapia.
La consecucin de estos objetivos nos llevar al logro de un prototipado rpido de aplicaciones Opensource para rehabilitacin usando dispositivos inalmbricos.
CAPTULO 1: INTRODUCCIN
1.3. ORGANIZACIN
Este proyecto se divide en siete captulos, detallados en el ndice. A continuacin, se realiza una breve descripcin de los mismos para una mejor comprensin de la organizacin del documento: En el captulo 2 se realiza un estudio del estado del arte de los dispositivos inalmbricos existentes en el mercado. Adems se presentan las alternativas software para la creacin de aplicaciones y se justifican las elecciones tomadas para el desarrollo de la plataforma software deseada. Los captulos desde el 3 al 6 tienen una estructura similar. Atienden cada uno a un dispositivo hardware diferente o a una funcin diferenciada de ste. En primer lugar, se detallan las caractersticas tcnicas y el modo de funcionamiento. En segundo lugar, se expone el API utilizada para la programacin de aplicaciones con estos dispositivos, incluyendo ejemplos para cada uno de ellos. Y en tercer lugar, se exponen las aplicaciones desarrolladas que persiguen cubrir los objetivos del proyecto. Los dispositivos por orden de captulo son: Captulo 3: Wii Remote Captulo 4: Wii Remote+IR LEDs Captulo 5: Wii Remote+Wii Motion Plus Captulo 6: Wii Balance Board
En el captulo 7 se exponen las conclusiones y se presentan los trabajos futuros que daran continuidad a este proyecto. Por ltimo se incluyen los Anexos y la Bibliografa.
2.2. REHABILITACIN
La rehabilitacin es el diagnstico, evaluacin, prevencin y tratamiento de la incapacidad encaminados a facilitar, mantener o devolver el mayor grado de capacidad funcional e independencia posibles [2]. Incluye todas las medidas destinadas a reducir el impacto de las condiciones de incapacidad y minusvala y hacer posible que las personas incapacitadas y minusvlidas alcancen la integracin social. Los objetivos de la rehabilitacin son los de entrenar a personas incapacitadas y minusvlidas a adaptarse a su entorno y el de intervenir en ste para facilitar la integracin social. La especialidad mdica que coordina el proceso rehabilitador es la medicina fsica y rehabilitacin [3]. Esta especialidad comprende el estudio, deteccin y diagnstico, prevencin y tratamiento clnico o quirrgico de los
enfermos con procesos discapacitantes. Dentro de este proceso rehabilitador cabe destacar dos zonas de accin: Alcance del completo potencial fsico. La fisioterapia es el arte y ciencia del tratamiento por medio de ejercicio teraputico, calor, fro, luz, agua, masaje y electricidad. Se ocupa de la recuperacin fsica y de la prevencin cuando el paciente ha perdido o se encuentra en riesgo de perder o alterar de forma temporal o permanente el adecuado movimiento. Dentro de la fisioterapia podemos encontrar varias tecnologas sanitarias que colaboran con la herramienta principal, la mano. Se pueden citar algunas como electroterapia, hidroterapia, termoterapia o mecanoterapia. sta ltima se define como la utilizacin teraputica e higinica de aparatos mecnicos destinados a provocar y dirigir movimientos corporales regulados en su fuerza, trayectoria y amplitud [4]. Alcance del potencial psicolgico y social. La terapia ocupacional es el arte y ciencia de dirigir la respuesta del hombre a la actividad seleccionada para favorecer y mantener la salud, para prevenir la incapacidad, para valorar la conducta y para tratar o adiestrar a los pacientes con disfunciones fsicas o psicosociales [5]. En terapia ocupacional se abordan las deficiencias en los componentes motores, cognitivos, sensoperceptivos y psicosociales que afectan al desempeo funcional de un individuo en las reas de autovalimiento, productividad y esparcimiento.
movimientos del brazo de un grupo de personas sin patologas con dos grupos de personas con diferentes niveles de lesin medular cervical durante el gesto de coger un vaso y beber. Utilizan un sistema de marcadores activos que envan una seal de posicin que captan dos sensores. Esto permite hacer un modelo digital en el ordenador (vase Figura 1.1) y valorar rangos de movimiento, amplitudes, velocidades y otras variables. Estos datos se podran usar posteriormente para una mejora en las prtesis o en sistemas de terapia con realidad virtual y captura del movimiento. Silla de ruedas que se controla con la nariz para personas severamente discapacitadas [9]. Esta silla de ruedas desarrollada por el instituto Weizmann en Israel se controla mediante el olfato (vase Figura 1.2). Tiene un gran uso prctico en las personas con discapacidades severas ya que este sentido es, generalmente, el nico mecanismo que perdura en la mayora de los pacientes. El control del olfato depende de la posicin del velo del paladar, el cual est enervado por mltiples nervios craneanos. El dispositivo mide la presin nasal y la convierte en seales elctricas. Se permite as que el olfato controle un activador con velocidades similares a la de una mano que utiliza un ratn o una palanca de un joystick.
Figura 2.1. Vista del anlisis cinemtico del brazo en la actividad de beber
Lokomat [10] [11]. Lokomat se trata de una terapia de locomocin mejorada programable a las necesidades de la persona. Se trata de un exoesqueleto que soporta el peso del paciente, el cual queda suspendido sobre una cinta rodante (vase Figura 1.3). Los motores que incorpora mueven las piernas del paciente trazando trayectorias que imitan los patrones de marcha fisiolgicos. Una interfaz de usuario permite al terapeuta manejar el dispositivo de forma sencilla y adaptar los parmetros del entrenamiento. Posteriormente se puede consultar la evaluacin del paciente y documentacin del proceso de terapia.
El componente primario del sistema es el controlador de movimiento. ste es un controlador con forma de tubo que permite al usuario interactuar con la consola a travs del movimiento y la posicin frente a sta. En su interior encontramos dos sensores inerciales: un acelermetro lineal de tres ejes y un sensor de velocidad angular de tres ejes. Estos se utilizan para controlar el movimiento global y la rotacin respectivamente. Tambin se usa un magnetmetro interno para calibrar la orientacin del controlador en relacin al campo magntico de la Tierra y ayudar a corregir el error acumulado (deriva) de los sensores inerciales. Los sensores inerciales pueden ser utilizados para navegacin por estima en los casos en los que el seguimiento por la cmara es insuficiente. Este componente cuenta adems con una esfera en su extremo que puede brillar en varios colores con ayuda de un emisor LED RGB. Sobre la base de colores del entorno de usuario capturado por la cmara, el sistema selecciona un color que sea fcilmente distinguible en el resto de la escena. La luz sirve como marcador activo y cuya posicin puede ser rastreada a lo largo del plano de la imagen por la cmara. La forma esfrica y el tamao uniforme conocido permite al sistema saber a travs de la imagen a tamao de la luz en qu posicin se encuentra el usuario, permitiendo de esta manera un posicionamiento en tres dimensiones con alta precisin y exactitud. El clculo de distancias realizado de esta manera hace que el controlador trabaje con la latencia de procesamiento mnimo en comparacin con otras tcnicas de control basadas en la cmara de Playstation.
EL controlador dispone en su cara anterior de un gran botn primario de forma ovoide, los botones de accin clsicos de Playstation y un botn PS de tamao regular y con una disposicin similar a la que encontramos en un mando de Blu-Ray Disc. En sus laterales izquierdo y derecho encontramos un botn de seleccin y uno de inicio respectivamente. En la parte anterior se sita un disparador analgico o gatillo. En el extremo inferior se encuentra un puerto USB, un puerto de extensin y una correa para la mueca. Incluye una tecnologa de respuesta hptica basada en vibracin. Adems de la referencia para el posicionamiento, la luz de la bola del controlador puede proveer una retroalimentacin visual simulando efectos estticos como puede ser el fogonazo de un arma o un pincel al pintar. El segundo componente del sistema se trata del controlador de navegacin (originalmente conocido como subcontrolador de movimiento). Es un controlador adicional diseado para usarse en conjuncin con el controlador de movimiento sujetndolo a una mano. Replica la funcionalidad principal de la parte izquierda de un mando inalmbrico estndar de Playstation. El controlador de navegacin cuenta con una cruceta analgica, un pad direccional o dos disparadores analgicos o gatillos en la parte posterior. Cuenta adems en su parte frontal con dos botones de accin y un botn PS. Teniendo en cuenta las funciones que desarrolla, un mando Sixaxis o un mando DualShock 3 pueden ser usados en lugar de ste. Ambos controladores usan comunicacin radio valindose del protocolo Bluetooth en su versin 2.0. Incorporan una batera de ion de litio la cual es cargada mediante un puerto USB Mini-B en el controlador.
10
El tercer elemento que completa el sistema es la cmara denominada Playstation Eye [14]. Se trata de un dispositivo webcam desarrollada por Sony para la Playstation 3. Es la sucesora de la Eye Toy, creada para la Playstation 2. La cmara es capaz de capturar video con una resolucin de 640x480 pxeles a una frecuencia de 60 Hz o capturar video a resolucin 320x240 pxeles a una frecuencia de 120 Hz. Estos valores suponen multiplicar por cuatro la resolucin de la Eye Toy y doblar la frecuencia de muestreo de sta. Esta nueva cmara tiene el doble de sensibilidad que la anterior y ofrece una operacin con mayor calidad cuando las condiciones de iluminacin son bajas respecto al modo de uso normal. Incorpora dos lentes para hacer zoom de manera ajustable. Se selecciona manualmente girando el cilindro del objetivo el modo de funcionamiento, siendo de 56 grados de visin para una aplicacin de chat o de 75 grados para el uso en aplicaciones de juegos fsicos interactivos. La Playstation Eye puede dar salida de vdeo sin comprimir o en formato comprimido usando el estndar JPEG. Todo el procesamiento de imagen tiene lugar a cabo en el microprocesador de tres celdas de la Playstation 3. El uso de la biblioteca de seguimiento de movimiento supone un gran impacto en el uso de memoria pero desde Sony afirman que estos efectos se reducirn al mximo. El uso de memoria para estas bibliotecas ser de uno o dos megabytes del total del sistema. La cmara incorpora un micrfono en un array de cuatro cpsulas con el cual puede emplear tecnologas para seguimiento y localizacin de voz de manera multidireccional, cancelacin de eco y supresin de ruido de fondo. Esto permite al perifrico ser usado para reconocimiento de voz y audio en ambientes ruidosos sin uso de un auricular. El micrfono opera en cada canal procesando muestras de 16 bits a una velocidad de 48 KHz y con una relacin seal a ruido de 90 decibelios.
Este sistema se encuentra limitado en cuanto a nmero de jugadores debido a la comunicacin inalmbrica. Solo se pueden usar cuatro controladores de movimientos en cada sesin de juego o dos controladores de movimiento con sus correspondientes controladores de navegacin asociados. Debido sus caractersticas se puede decir que sera un buen dispositivo para usar en ejercicios de rehabilitacin por su deteccin precisa de movimientos. Adems incorpora la posibilidad de reconocimiento tanto visual como de habla logrando as una mayor interactuacin con el usuario. Gracias a estas capacidades sera un accesorio perfecto en rehabilitacin para entrenar ABVD (Actividades Bsicas de la Vida Diaria) [15]. La capacidad de interaccin con todo el cuerpo es muy deseable en rehabilitacin para que de esa manera se puedan entrenar la ingesta de alimento, la bebida, el aseo personal u otras ABVD. En estas aplicaciones el usuario se vera a si mismo de manera similar a como se mira en un espejo pero con la realidad aumentada por objetos y entornos digitales. Este efecto es la denominada Realidad Aumentada y se usa en otros sistemas de rehabilitacin como IREX. Kinect Kinect (antes conocido con el nombre clave Protecto Natal) es un controlador de juego libre y entretenimiento de Microsoft para la videoconsola Xbox 360 [16]. Permite a los usuarios controlar e interactuar con la Xbox 360 sin necesidad de usar mandos tradicionales o una interfaz tctil, solo usando gestos, comandos de voz y el propio cuerpo. Dispone de una cmara web, un escner y un micrfono [17]. El sensor Kinect es una barra horizontal conectada a una pequea base con un eje motor. Est diseado para ser colocado longitudinalmente por debajo de la pantalla de visualizacin. El dispositivo cuenta con una cmara RGB, un sensor de profundidad y un micrfono multi-array, todos ellos ejecutando el software propietario de Microsoft que proporciona una captura de movimiento 3D de todo el cuerpo, reconocimiento facial y capacidad de reconocimiento de voz. El array de micrfonos permite que se lleve a cabo la localizacin de la fuente acstica y supresin del ruido ambiente. La informacin de audio se transportara en cada canal de procesamiento de audio de 16 bits a una velocidad de 16 KHz.
El sensor de profundidad se compone de un proyector de infrarrojos combinado con un sensor CMOS monocromo que permite a Kinect ver en tres dimensiones en cualquier condicin de luz ambiental. El rango de deteccin del sensor de profundidad es ajustable, aunque con el software se calibre automticamente basndose en el juego y en el ambiente fsico del jugador. Kinect se basa en tecnologa de software desarrollada internamente por Microsoft y en tecnologa de cmara desarrollada por PrimeSense. El sistema permite el seguimiento de hasta seis personas, entre ellas dos agentes activos para el anlisis de movimientos con una extraccin de caractersticas de 20 articulaciones por jugador. Kinect ofrece salidas de video a una velocidad de 30 Hz con una resolucin de color de 32 bits VGA (640x480 pxeles) y la secuencia de video monocromo utilizado para deteccin de profundidad usando 16 bits QVGA (320x240 pxeles) y ofreciendo 65536 niveles de sensibilidad. El sensor tiene un lmite prctico que va desde los 1.2 metros hasta los 3.5 metros de distancia. Tiene un campo angular de visin de 57 en horizontal y 43 en vertical. El eje motor es capaz de inclinarse 27 hacia arriba o hacia abajo. Las caractersticas que tiene Kinect le hacen de un muy vlido instrumento para rehabilitacin. Su funcionamiento se basara en el reconocimiento del paciente en 3 dimensiones y en el reconocimiento facial y del lenguaje. Sera de un uso ms fcil ya que este sistema ofrece una interfaz de usuario natural. Estas interfaces son aquellas que no utilizan dispositivos de entrada y en lugar de estos usamos nuestras manos rompiendo el paradigma actual de las metforas visuales [18]. Ofrecera una gran variedad de ejercicios para una persona o varias pudiendo as realizar el ejercicio en grupo, hecho menos tedioso para el paciente. Wii [19] Wii es una videoconsola de sobremesa producida por Nintendo y en cuyo desarrollo colaboraron IBM y ATI. La caracterstica ms distintiva de la consola es su mando inalmbrico, el cual puede usarse como un dispositivo apuntador adems de cmo detector de movimiento en tres dimensiones. Dispone adems de conexin a Internet por la cual puede recibir mensajes y actualizaciones.
13
Figura 2.9. Wii El mando de Wii utiliza incorpora un acelermetro que, en combinacin con unos LEDs infrarrojos situados en la barra de sensores, permiten localizar en un espacio en tres dimensiones al usuario. La interactuacin se produce mediante gestos fsicos y presin sobre los botones. El mando se conecta a la consola de manera inalmbrica mediante el protocolo de comunicacin Bluetooth. Incluye adems un vibrador y un altavoz interno. Se ofrece con una correa de sujecin para evitar posibles lanzamientos de mando accidentales. La consola Wii ofrece un considerable nmero de accesorios. Los ms destacados por tener capacidad propia de toma de datos son el Nunchuk y la Wii Balance Board. El Nunchuk se trata de una extensin al mando original y se compone de un control analgico y dos botones de accin. En su interior cuenta con un acelermetro que le dota de deteccin de movimiento. La Wii Balance Board se trata de una tabla a la cual hay que subirse para interactuar con el juego. Tiene en su interior sensores de presin que la hacen capaz de medir el peso y la posicin del centro de gravedad del usuario. Como en los anteriores sistemas, la capacidad de Wii para detectar movimiento y el apuntado en pantalla la hacen apta para un uso en rehabilitacin. En la actualidad es un sistema que funciona en varios hospitales en las reas de rehabilitacin. Su uso se aplica tanto a lesiones fsicas como mentales, como se explicar ms adelante.
14
15
Trabajar para la mejora de la destreza. Se trabaja en actividades cotidianas para que el paciente sea ms capaz y las ejecute con mayor destreza. Estiramiento antes del uso. Debido a la falta de resistencia a la hora de realizar los movimientos, el usuario es susceptible de lesionarse si antes no ha calentado los msculos. Descanso durante el uso. Se recomienda no excederse en el ejercicio cuando se juega a Wii ya que es probable que aparezcan lesiones debidas al sobreuso del Wiimote.
16
Figura 2.12. Wii Balance Board en soporte para realizar actividades de rehabilitacin
La Wii en terapia se puede utilizar para alcanzar diferentes objetivos [20]: Promover el uso del tren superior Los controladores principales de Wii (Wii Remote y Nunchuk) se utilizan con las manos. Hay varias formas principales de uso del movimiento dentro de los juegos: Actividades deportivas. Dentro de esta categora encontramos al boxeo y al tenis como las actividades ms enrgicas. Sacudida del mando. El movimiento repetitivo trabaja los msculos y contribuye a promover una mayor resistencia. Mini Juegos. Se trata de pequeos juegos que requieren de habilidad y control fino.
La Wii como herramienta dentro de la terapia se puede usar para mejorar las siguientes habilidades motoras de las extremidades superiores: Movimiento fino. Movimiento fuerte. 17
Uso combinado y coordinado de movimientos. Destreza. Control bilateral del movimiento. Velocidad de reaccin. Promover la actividad del tren inferior
Existen dos maneras de ejercitar las piernas mediante el uso de la Wii Balance Board: En posicin erguida sobre la tabla. En posicin sentada. Se pueden realizar los ejercicios estando en una posicin sentada y con los pies sobre la tabla. Este mtodo es ideal para los pacientes con movilidad limitada o impedida por un tiempo.
Se pueden reforzar las extremidades inferiores utilizando los controladores y realizando ejercicios de fitness que incluyen un aumento de fuerza y no se requiere de Wii Balance Board. La terapia se puede centrar en el movimiento y desarrollo de fuerza del tren interior o en el control sobre la transferencia de peso sobre la tabla. Mejora del equilibrio Se puede trabajar para mejorar las habilidades de equilibrio que ayudan a mantener control de la postura y los msculos que ayudan la estabilidad. El equilibrio requiere para el cuerpo trabajar ambos lados por igual y juntos para mantener la postura deseada. La principal forma para trabajar el equilibrio es utilizar la Wii Balance Board. Hay dos modalidades para el trabajo del equilibrio: En posicin erguida sobre la tabla. Se utilizar esta posicin si se tiene un equilibrio razonable. Sentado sobre la tabla. Si no se tiene suficiente equilibrio, los ejercicios pueden ser realizados sentndose sobre la tabla. Se ganar en estabilidad y se trabajarn los msculos del abdomen. Hacer el ejercicio de esta manera es una gran manera de reintroducir el movimiento del cuerpo superior. Mejora de la coordinacin La propia interaccin con la consola mediante el juego provoca la necesidad de una gran coordinacin. Esta es necesaria ya que se presenta informacin y se ha de reaccionar a ella fsicamente con el fin de crear el 18
movimiento deseado y mantener el equilibrio. Se pueden citar algn juego que permita trabajar el control y la coordinacin como son los de esqu, los de ftbol o los que usan planos inclinados. Se logra los mayores niveles de coordinacin con los juegos de yoga o de snowboard. Mejora de la aptitud cardiovascular El juego Wii Fit tiene una opcin para correr. El Wiimote se coloca en el bolsillo del usuario u otro lugar especificado y ste detecta el movimiento. Este juego no utiliza la Wii Balance Board pero es parte de Wii Fit ya que se basa en la capacidad de los miembros inferiores para el trabajo del corazn y de los pulmones. Los juegos que requieren un control poco fino y movimientos repetitivos ofrecen la oportunidad a los usuarios de incrementar el ritmo cardaco y la circulacin. Ejemplos de estos juegos son: Wii Sports Boxing, Wii Fit y los juegos olmpicos de correr y nadar.
Escritura de los registros del Wiimote. Informacin de status del mando. Datos de calibracin.
Los extras de motej, por otra parte, nos ofrecen las siguientes caractersticas: Soporte para controladores de extensiones: Wii Balance Board, mando clsico y Nunchuk. Algunas clases de ayuda o adaptacin que hacen ms fcil el desarrollo con el Wiimote.
WiiRemoteJ [22] WiiRemoteJ es una biblioteca Java desarrollada para permitir el acceso fcil a los desarrolladores de Java el hardware de Wii Remote. WiiRemoteJ se sita encima de la API de Java Bluetooth permitiendo que sea independiente de la plataforma. Soporta todas las funciones principales del mando de Wii incluyendo: infrarrojo, acelermetro, extensiones (mando clsico, Nunchuk, guitarra soportada por defecto y posibles extensiones personalizadas), entrada de botones, LEDs, vibracin, altavoz, datos de lectura/escritura y soporte a mltiples controles remotos. Tambin es compatible con la Wii Balance Board. WiiYourself! [23] WiiYourself! es una librera escrita en C++ para el control total de las caractersticas del Wiimote. Est basada en una versin anterior denominada Managed Wiimote Library, la cual es extendida considerablemente. Tiene la limitacin de que su ejecucin est limitada al sistema operativo Windows. Las caractersticas que nos ofrece son: Soporte a mltiples Wiimotes. Soporte a extensiones. Lectura de batera, botones, acelermetro, infrarrojos. Estimacin de la orientacin. Posibilidad de establecimiento de LEDs y vibrador. Soporta todas las pilas de Bluetooth. Soporte experimental de altavoz. 20
Wiim [24] Wiim es un set simple de clases escritas en C++ que permiten la conexin con el mando Wii Remote a travs de la interfaz HID de Windows para enviar o recibir comandos. Se pueden recibir las pulsaciones de los botones y los datos de la deteccin de movimiento as como establecer el vibrador y los LEDs. No se soportan los dispositivos de infrarrojos o cualquier extensin. wiiuse [25] wiiuse es una librera escrita en lenguaje de programacin C y que conecta con el Wiimote. Soporta deteccin de movimiento, seguimiento de infrarrojo y las extensiones que corresponden al Nunchuk, mando clsico y guitarra. Su caracterstica de no-bloqueo y de uso de un solo hilo la hacen una API limpia y ligera. Se encuentra bajo licencia GNU GPLv3 y GNU LGPLv3. El aspecto ms interesante de esta librera lo ofrece su compatiblidad. Es compatible con Linux y con las versiones 2000, XP y Vista de Windows, lo cual resulta en una mayor facilidad a la hora de portar juegos de una plataforma a otra. libcwiid [26] Cwiid forman una coleccin de herramientas de Linux escritas en C para la conexin al Wiimote. CWiid est formado por los siguientes componentes: libcwiid. Es la librera en la que se incluyen todas las funciones para el manejo del mando. Incluye un mdulo para el desarrollo de aplicaciones en Python. wminput. Es un controlador con arquitectura de complemento al que se le puede dar uso de ratn o joystick. wmgui. Es una interfaz grfica capaz de monitorizar distintos valores del Wiimote y representarlo en pantalla. wmdemo. Es una aplicacin de demostracin y testeo del mando.
21
El sistema operativo en el que se ejecutarn las aplicaciones es Linux. Se elige este sistema operativo por las ventajas que aporta frente a otros, por ejemplo: Robustez, estabilidad y fiabilidad. Capacidad de funcionamiento en equipos que no son excesivamente potentes. Soporte de gran variedad de entornos grficos (KDE, GNOME) Existe gran cantidad de documentacin libre. El sistema operativo es software libre, lo que implica no pagar nada por l. Es un sistema operativo muy seguro. Eficiencia de su cdigo, lo cual hace que la velocidad de las aplicaciones sea superior. 22
El lenguaje de programacin que se usar ser Python, siendo las aplicaciones scripts escritos en este lenguaje. Se trata de un lenguaje de programacin de alto nivel y multiparadigma ya que soporta orientacin a objetos, programacin imperativa y programacin funcional [27]. Es un lenguaje interpretado, usa tipado dinmico, es fuertemente tipado y es multiplataforma. Es administrado por la Python Software Foundation. Posee una licencia de cdigo abierto, denominada Python Software Foundation License, que es compatible con la licencia pblica general de GNU a partir de la versin 2.1.1, e incompatible en ciertas versiones anteriores. La versin que se utiliza para la elaboracin y prueba de los programas es la 2.6.5. Para el desarrollo de la interfaz grfica de usuario se usar Pygame. Pygame es un conjunto de mdulos en lenguaje Python que permite la creacin de videojuegos en dos dimensiones de una manera sencilla [28]. Debido al lenguaje, se puede prototipar y desarrollar rpidamente pudiendo alcanzarse resultados profesionales. Se puede utilizar adems otros programas multimedia o interfaces grficas de usuario, modo que se utilizar en las aplicaciones.
La herramienta elegida para el manejo del hardware es la librera libcwiid. Se elige esta opcin porque en su API encontramos cubiertas, casi en su totalidad, todas las funciones necesarias para el desarrollo. Adems, libcwiid ofrece la capacidad de programar en Python, lo que incrementa la velocidad del proceso de desarrollo de aplicaciones.
2.8. RESUMEN
En este captulo se nos han expuesto ejemplos de sistemas actuales de rehabilitacin y como ayudan a estos procesos de recuperacin. Se han presentado alternativas actuales basadas en perifricos de consolas por su mayor capacidad de atraccin y entretenimiento manteniendo la idea de recuperacin de las condiciones normales del paciente. Un ejemplo de estas alternativas es el uso que se da a Wii. Adems se han presentado diferentes tipos de libreras que nos ayudan en el desarrollo de aplicaciones a medida. Tras estas consideraciones se expone la eleccin tomada para realizar las aplicaciones deseadas en este proyecto. Se toma el hardware ofrecido por los perifricos de Nintendo, el sistema operativo Linux y la librera libcwiid por su capacidad para desarrollo en Python. Estos elementos formarn la base que queremos establecer y sobre ellos profundizaremos en posteriores apartados describiendo el hardware y desarrollando software diseado especficamente.
23
Tpicamente las videoconsolas se controlaban a travs de joysticks o mandos con botones o una combinacin de ambos. El diseo del Wiimote es innovador ya que permite nuevas posibilidades dentro del campo de los mandos. Implementa por primera vez un control gestual inalmbrico de manera que los usuarios pueden interaccionar con los juegos mediante movimientos de los brazos.
25
26
Al margen de especificaciones tcnicas, el funcionamiento de los integrados MEMS (Sistemas micro electro-mecnicos) es similar al de una mquina aunque se trate de un diminuto chip de silicio. Al igual que ste, los dispositivos MEMS ganan gran importancia en montajes de todo tipo y dimensin hoy en da por las caractersticas que presentan. Si se estudia el funcionamiento de acelermetros se puede comprobar que miden la aceleracin y la direccin del movimiento comprobando los cambios en los electrones de su interior. Para una mejor comprensin se puede asimilar a una pareja de placas dentro del sensor, siendo una fija y otra mvil. Los electrones que rodean la placa se mueven con el movimiento de la placa y si medimos la capacitancia seremos capaces de capturar los datos requeridos. El dispositivo puede as enviar datos de movimiento relativos a todos los ejes de coordenadas adems de los datos de aceleracin detectando giros, movimientos en el aire o inclinaciones. Nota histrica: Durante el desarrollo del Wiimote Nintendo invirti en un acuerdo con Gyration, empresa dedicada a los giroscopios. De esta relacin dio lugar a una de las funciones del mando actual. Pese a la investigacin y el trabajo conjunto el componente de Gyration no se incluy en la versin definitiva del mando ya que el acelermetro elegido cumpla con la funcin de deteccin de giros y, para la funcin de apuntado, se opt por el sensor ptico [29].
3.2.4. COMUNICACIN
El Wiimote se conecta de manera inalmbrica a la consola mediante el protocolo Bluetooth, especificado en la norma 802.15.1. Es posible conectarlo tambin a otros dispositivos que se comuniquen con este protocolo. Para la comunicacin se utiliza el chip BCM2042 de Broadcom Technologies (vase Figura 3.5). Toda la informacin enviada por el mando (sensor, botones, cmara) se enva de manera continua al extremo receptor. La comunicacin se realiza en la banda de 2.4 GHz y proporciona una velocidad de transmisin de 2.1 Mbits/s. Esta velocidad es lo suficientemente alta para que la latencia sea comparable a la de los mandos cableados. El protocolo Bluetooth slo permite un servidor y siete clientes por lo que nicamente se podrn usar siete Wiimotes de forma simultnea. En un modo 27
multijugador con cuatro jugadores, stos no podran utilizar cada uno dos mandos debido a la limitacin establecida por el protocolo. Para realizar el emparejamiento entre mando y dispositivo se ha de pulsar el botn SYNCRO situado en el espacio dedicado a las pilas del mando o los botones 1 y 2 al mismo tiempo y, en el dispositivo a conectar, ha de estar operativa la opcin de comunicacin Bluetooth (vase Figura 3.4). En la consola Wii se ha de pulsar el botn SYNCRO situado tras la tapita frontal y, a continuacin, se asigna un canal a cada Wiimote pulsando otro botn. El identificador obtenido se almacenar en la memoria del mando para mantener la asignacin en futuros encendidos.
3.2.6. AUTONOMA
El Wiimote se alimenta con dos pilas AA comunes. La autonoma mxima son 60 horas pero cae hasta las 30 horas si se utiliza constantemente la funcin de puntero. El nivel de batera nos viene indicado por los cuatro LEDs de la parte frontal al encender el sistema. El funcionamiento es como sigue: un LED parpadea si queda menos de un cuarto de la duracin, dos entre el cuarto y la media duracin, tres hasta los tres cuartos de duracin y los cuatro LEDS entre los tres cuartos y la totalidad de la duracin.
29
El sistema de alimentacin cuenta adems con un condensador de 33 mF que proporciona una fuente temporal de energa con movimientos rpidos del Wiimote cuando la conexin a las pilas pudiera ser interrumpida de manera temporal.
3.3. ACCESORIOS
3.3.1. ACCESORIOS FUNCIONALES
Los accesorios funcionales son aquellos que complementan al Wiimote con alguna funcin aadida. Estos accesorios se conectan al mando principal por el puerto de expansin que este incorpora en la parte inferior. Se trata de un puerto propietario de Nintendo el cual manda datos serie de manera sncrona usando una interfaz a dos hilos de manera bidireccional. Utiliza para la transmisin un bus I2C [30]. 30
Figura 3.7. Accesorios funcionales para Wii, de izquierda a derecha y de arriba abajo: Nunchuk, Mando clsico, Wii Guitar y Wii Motion Plus.
Los accesorios funcionales actuales son (vase Figura 3.7): Nunchuk: Es un joystick analgico con dos botones ms. Tiene capacidad para detectar movimientos ya que en su interior se localiza un acelermetro. El chip elegido es el LIS3L02AL de STMicroelectronics. Tiene una sensibilidad de 660 mV/g y presenta un rango de deteccin de 2G. Proporciona gran inmunidad ante vibraciones, golpes y temperaturas extremas. Control clsico: Se trata del mando que se utilizaba en los ttulos de Nintendo. Contiene los mismos botones que estn presentes en el Wiimote. Sirve para jugar a juegos bajados del Canal Tienda Wii y algunos juegos Wii compatibles. Wii Guitar: Es un accesorio con forma de guitarra en el que se inserta el Wiimote. Sirve para el juego Guitar Hero de Wii. Wii Motion Plus: Es un accesorio que aade precisin extra al mando (vase Captulo 5: Wii Remote+Wii Motion Plus).
31
Figura 3.8. Accesorios soporte para Wii: Wii Zapper y Wii Wheel
Descripcin Establece una conexin con el Wiimote. Para conectarse a cualquier Wiimote disponible se ha de pasar *BDADDR_ANY en el campo bdaddr. En este caso, bdaddr se llenar con la direccin del Wiimote conectado.
cwiid_close Sinopsis int cwiid_close(cwiid_wiimote_t *wiimote); Parmetros cwiid_wiimote manejado. Descripcin Desconecta el Wiimote. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error.
cwiid_get_id Sinopsis int cwiid_get_id(cwiid_wiimote_t *wiimote); Parmetros wiimote: cwiid_wiimote manejado. Descripcin Funcin de acceso al identificador del Wiimote, el cual se garantiza que es nico entre todos los Wiimotes en un nico proceso. Valor de retorno Identificador del Wiimote.
33
cwiid_set_data Sinopsis int cwiid_set_data(cwiid_wiimote_t const void *data); Parmetros wiimote: cwiid_wiimote manejado. data: puntero a los datos de usuario. Descripcin Funcin modificadora del campo de datos del usuario. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error. *wiimote,
cwiid_get_data Sinopsis const void *cwiid_get_data(cwiid_wiimote_t *wiimote); Parmetros wiimote: cwiid_wiimote manejado. . Descripcin Funcin de acceso a los datos de usuario. Valor de retorno Puntero a los datos cwiid_set_data. de usuario establecidos por
34
Descripcin Los indicadores de opciones se pueden habilitar con cwiid_connect o con cwiid_enable. Los indicadores de opciones y sus significados son los siguientes: o CWIID_FLAG_MESG_IFC: basadas en mensajes. Habilita las interfaces
los
reportes
CWIID_FLAG_REPEAT_BTN: Entrega un mensaje de botn para cada valor del botn recibido, incluso si no ha cambiado. CWIID_FLAG_NONBLOCK: Hace que cwiid_get_mesg falle en vez de bloquearlo si no hay mensajes listos.
cwiid_disable Sinopsis int cwiid_disable(cwiid_wiimote_t *wiimote, int flags); Parmetros wiimote: cwiid_wiimote manejado. flags: indicadores de opciones a ser habilitadas. Descripcin Deshabilita los indicadores de opciones habilitados por cwiid_connect o cwiid_enable.
35
cwiid_set_mesg_callback Sinopsis typedef void cwiid_mesg_callback_t(cwiid_wiimote_t *, int, union cwiid_mesg []); int cwiid_set_mesg_callback(cwiid_wiimote_t *wiimote, cwiid_mesg_callback_t *callback); Parmetros wiimote: cwiid_wiimote manejado. Descripcin Establece la funcin de retorno, la cual es llamada cuando un conjunto de instrucciones se reciben del Wiimote. La opcin CWIID_FLAG_MESG_IFC ha de estar activada para que la funcin de retorno sea llamada. Pasando NULL a la funcin de retorno se cancela la funcin actual en caso de existir. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error.
cwiid_get_mesg Sinopsis int cwiid_get_mesg(cwiid_wiimote_t *wiimote, int *mesg_count, unin cwiid_mesg *mesg[]); Parmetros wiimote: cwiid_wiimote manejado. mesg_count: puntero al contador de mensajes. mesg: puntero al array de mensajes. Descripcin
36
Devuelve el ltimo conjunto de instrucciones no entregado. Los mensajes son entregados a travs de una funcin de retorno o a cwiid_get_mesg. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error. cwiid_get_state Sinopsis int cwiid_get_state(cwiid_wiimote_t *wiimote, struct cwiid_state *state); Parmetros wiimote: cwiid_wiimote manejado. state: puntero a la estructura de estado del Wiimote. Descripcin Devuelve el estado actual del Wiimote. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error. cwiid_command Sinopsis int cwiid_command(cwiid_wiimote_t *wiimote, enum cwiid_command command, int flags); Parmetros wiimote: cwiid_wiimote manejado. command: orden a ser ejecutada. flags opciones especficas de la orden. Descripcin Emite una orden al Wiimote. Las rdenes disponibles y sus opciones asociadas son las siguientes: 37
o o
CWIID_CMD_STATUS: Pide un mensaje de estado CWIID_CMD_LED: Establece el estado de los LEDs. Los siguientes indicadores pueden ser a nivel de bit: CWIID_LED1_ON CWIID_LED2_ON CWIID_LED3_ON CWIID_LED4_ON
CWIID_CMD_RUMBLE: Establece el estado del vibrador. Se ha de colocar el valor 0 para un estado apagado y otro valor para estar encendido. CWIID_RPT_MODE: Establece el modo de presentacin de informes del Wiimote, el cual determina que perifricos estn activados y que datos son recibidos por el ordenador. Las siguientes opciones se pueden considerar a nivel de bit: CWIID_RPT_STATUS CWIID_RPT_BTN CWIID_RPT_ACC CWIID_RPT_IR CWIID_RPT_NUNCHUK CWIID_RPT_CLASSIC CWIID_RPT_EXT
cwiid_read Sinopsis int cwiid_read(cwiid_wiimote_t *wiimote, unit8_t flags, uint32_t offset, uint16_t len, void *data);
38
Parmetros wiimote: cwiid_wiimote manejado. flags: indicadores para la lectura. offset: direccin de comienzo. len: Nmero de bytes a leer. data: buffer de destino.
Descripcin Lee datos desde el Wiimote. Los indicadores CWWID_RW_EEPROM y CWIID_RW_REG seleccionan el espacio de direccionamiento de manera exclusiva entre ambos. El indicador CWIID_RW_DECODE realiza los algoritmos de decodificacin necesarios para leer los datos desde el espacio de direccionamiento de los registros.
cwiid_write Sinopsis int cwiid_write(cwiid_wiimote_t *wiimote, unit8_t flags, uint32_t offset, uint16_t len, void *data); Parmetros wiimote: cwiid_wiimote manejado. flags: Indicadores para la escritura. offset: direccin de comienzo. len: Nmero de bytes a leer. data: buffer de destino. Descripcin Escribe datos en el Wiimote. Los indicadores CWWID_RW_EEPROM Y CWIID_RW_REG seleccionan el espacio 39
de direccionamiento de manera exclusiva entre ambos. El indicador CWIID_RW_DECODE se ignora. Valor de retorno 0 si ha resultado exitoso o un valor distinto si ha habido un error.
40
Wiimote_2D Wiimote2D se trata de una sencilla aplicacin que traduce los movimientos del mando en un espacio en dos dimensiones. El programa da a elegir entre dos opciones: Mando en mano: Los movimientos detectados son las rotaciones sobre el eje X y las rotaciones sobre el eje Y, correspondientes ambos al movimiento de un punto en la direccin vertical y en la horizontal. Se podra hacer una correspondencia entre pitch y roll y movimiento vertical y horizontal respectivamente. Mando en gorra: Los movimientos que se detectan son los mismos que en la opcin anterior. La diferencia es la correspondencia entre el pitch y roll siendo ahora con movimientos horizontales y verticales respectivamente. Se implement est opcin y se prob en una gorra por las posibilidades que puede ofrecer. Colocando el mando sobre la visera de la gorra o en algn otro soporte similar de manera que la parte ms larga del mando se alinee con la frente del usuario se consigue el mismo efecto que el conseguido con la mano (vase Figura 3.10). Podra ser interesante a la hora de trasladar estos movimientos en los movimientos del cursor en la pantalla para personas con movilidad reducida o movilidad nula en las extremidades u otras aplicaciones que implicarn la intervencin de estos usuarios.
La interfaz de la aplicacin son dos ejes de coordenadas y un punto que se mueve segn los ngulos anteriormente descritos. Se limita la representacin a un intervalo de ngulos que son capaces de generar el movimiento de la mano o la cabeza respectivamente. stos son para la mano (-90,90) y para la cabeza (-22.5,22-5) pudiendo ser modificados por el usuario para lograr una mayor precisin en sus movimientos. La aplicacin comienza pidiendo la sincronizacin con el mando para lo cual se ha de pulsar 1+2 simultneamente. Tras finalizar con xito, surge un men en el que se puede elegir entre las dos opciones. Tras la eleccin surgir la pantalla con los ejes de abcisas y ordenadas y la sensibilidad del mando ajustada a la opcin elegida. Para finalizar la aplicacin bastar con cerrar la ventana (vase Figura 3.9).
41
42
Pong_wiimote Pong_wiimote es una aplicacin que adapta el popular juego del pong [32] para que uno de los jugadores se controle mediante un Wiimote. Presenta una interfaz en la que se presenta el campo en negro y las palas con las que jugar y la bola en blanco. El juego consiste en pasar la bola y que toque el extremo contrario mientras que el jugador contrario intenta la misma accin en sentido contrario (vase Figura 3.10). En esta versin falta la implementacin de un tanto ya que nos centramos en la demostracin de los mdulos de pygame y de la librera que maneja el mando. Permite, sin embargo, el movimiento del jugador izquierdo mediante el Wiimote y el movimiento del jugador derecho mediante el pad direccional del ordenador. El movimiento para el segundo jugador es lineal mientras que en el del primero se ha modificado para que vare con la velocidad. Se obtiene de esta manera un movimiento ms suave y un control ms preciso de la paleta. Para este movimiento vertical hacemos uso del pitch que se obtenga del movimiento del mando ya que se corresponde con la manera ms natural de mover un objeto hacia arriba o abajo. Pong_wiimote es una aplicacin que combina varios elementos que definen perfectamente las aplicaciones objetivo en este proyecto: uso del Wiimote como interfaz de control, entretenimiento durante el uso y posible aplicacin al campo de la fisioterapia o rehabilitacin. Esto se debe a que adems de usarlo con una mano se podra hacer una fcil adaptacin a la cabeza o, incluso a la pierna, sin necesidad apenas de cambios en la implementacin, solo en los parmetros que limiten el movimiento deseado. 43
3.7. RESUMEN
Se puede concluir que el Wiimote es un buen dispositivo para las aplicaciones a desarrollar por sus capacidades de deteccin de movimiento y captacin de fuentes infrarrojas. Adems, es ventajoso por su capacidad inalmbrica y por sus funciones adicionales que le pueden complementar en su uso. Nos encontramos ante un dispositivo que engloba varias tecnologas que nos permiten desarrollar aplicaciones adaptables a nuestras necesidades y sin un alto coste.
44
resolucin de 1024x768 para el seguimiento. La cmara es capaz de seguir hasta cuatro objetos en movimiento [33]. La cmara de infrarrojos tiene un campo de visin efectivo de 33 grados en el plano horizontal y de 23 grados en el plano vertical (vase Figura 4.2). Con el filtro IR intacto, las fuente de 940 nm de longitud de onda se detectan con el doble de intensidad que una fuente equivalente de 850 nm pero no se resuelve tan bien en distancias cercanas. La longitud focal de la cmara es de 1320 [34]. La distancia mnima a la que se detecta una fuente de luz de manera ntida y constante es de 8.5 cm y la distancia mxima depende de la potencia que tenga dicha fuente.
Figura 4.2. Esquema de los ngulos de visin mximos de la cmara del Wiimote
46
El otro elemento que permite el funcionamiento de la funcin de puntero es la barra sensora (vase Figura 4.3). Es un elemento que contiene en cada extremo cinco LEDs infrarrojos y cuyas medidas son 24x1 cm. La distribucin dentro de cada grupo de LEDs es as: El LED situado en el extremo de la barra apunta ligeramente hacia el exterior de la barra. El LED situado en la posicin ms cercana al medio de la barra apunta ligeramente hacia el interior de la barra. Los tres LEDs restantes apuntan de manera perpendicular y se encuentran agrupados.
La barra tiene un cable de 3 m de largo que se conecta a un puerto propietario de la consola, encargado de alimentar y poner en funcionamiento las luces de los extremos.
2.2 cm
24 cm 1 cm
47
El sensor ptico del Wiimote localiza los LEDs conformando los extremos de una pantalla virtual, la cual es un campo de accin relativo generado muy cerca de la pantalla real del televisor o proyector. Debido a este fenmeno, cuando se configura la consola por primera vez, se ha de indicar la posicin de la barra con respecto a la zona de visualizacin para que ese campo se considere aproximadamente donde se encuentra la pantalla real. Si la barra est colocada en la parte superior del televisor, el sensor debe estar alineado con la parte delantera de la televisin y si se coloca en la parte inferior se ha de alinear con la parte delantera de la superficie de sta ltima (vese Figura 4.4). A partir de la pantalla virtual generada se envan al sistema datos de movimiento del puntero en un espacio similar al que ocupa la pantalla real simulando que estamos apuntando directamente hacia ella. Segn sea la relacin de aspecto del televisor, el campo de accin ser ensanchado si nos encontramos con una relacin 16:9 o, por el contrario, permanecer inalterado si la relacin es 4:3. La distancia del mando respecto a la barra se calcula basndose en la recepcin por parte del mando de la luz emitida por la barra, lo que permite el uso coherente independientemente del tipo o tamao del televisor. La luz que se emite desde cada extremo de la barra se centra en el sensor de imagen como dos puntos separados por una distancia di. La segunda distancia d entre los dos grupos de emisores de luz es una distancia fija (vase Figura 4.5). A partir de estas dos distancias el procesador de la consola calcula la distancia entre el Wiimote y la barra de sensores utilizando triangulacin. Adems, la rotacin del mando con respecto al suelo se calcula a partir del ngulo relativo de los dos puntos de luz en el sensor de imagen. Con estos datos (posicin de la barra, relacin de aspecto de la pantalla y distancia del mando respecto a la barra) y basndose en la sensibilidad, el puntero se puede mover con precisin dentro de la pantalla.
Figura 4.4. Vista lateral y superior de posible colocacin de barra de sensores y su relacin con el mando 48
Se plantea la opcin del apuntado directo que fue la que dio vida al perifrico Wii Zapper (apartado 3.3.2.) con el que cualquiera intentar apuntar a travs de la mirilla. Esta posibilidad se mantiene al margen por la complejidad que puede suponer la implementacin ya que se debera conocer a la perfeccin el tamao de la pantalla y mediante una calibracin al inicio el movimiento podra corresponderse con ella. Pero esta solucin plantea el problema de que la distancia entre mando y barra puede variar durante el juego y, por tanto, la perspectiva inicial. Otro aadido al sistema es una pequea amortiguacin del movimiento del puntero realizada por software y que depende de la aplicacin a la que se est dedicando el puntero y de la configuracin. Se incluye ya que no se podra aceptar una total precisin a la hora de acertar en el apuntado a un objeto de pequeas dimensiones. Adems se incluye una compensacin al posible error producido por la falta de lectura de las coordenadas de los LEDs. Si se gira tanto el mando que ste pierde de vista los LEDs de la barra los sensores de aceleracin y giro miden la aceleracin lineal y los rangos de rotacin de manera que se ofrecen valores aproximados de la orientacin y posicin del Wiimote. Estos valores se van descompensando a medida que el mando no ve nuevamente los emisores de luz infrarroja. Una vez entre en su campo de visin, los datos de posicin y rotacin del sensor ptico recalibran automticamente la posicin y orientacin del mando. La distancia mxima de uso de esta funcin es de cinco metros, ya que a partir de ah, el mando no puede distinguir la posicin de los LEDs. La distancia que se ha de guardar a la hora de jugar ser la citada como mximo ya que todos los sistemas de mens de la consola como de los juegos se aprovechan de ella.
di
d Figura 4.5. Vista de los LEDs de la barra sensora mediante una cmara convencional
49
Un problema que puede surgir en el sensor infrarrojo a la hora de detectar posicin es la existencia de otras fuentes de infrarrojos alrededor, tales como velas o bombillas incandescentes. Una solucin para mitigar este efecto es el uso de luces fluorescentes alrededor de la Wii ya que emiten poca o ninguna luz infrarroja. A raz de este problema, usuarios innovadores han utilizado otras fuentes de luz IR como sustitutos de la barra de sensores usando un par de linternas y un par de velas.
multi-touch se ha de instalar un programa desarrollado por el autor y utilizar ms de un lpiz IR. Esta aplicacin se puede utilizar tambin sobre el material que se utiliza en proyecciones. Proyectando la imagen del ordenador en una pared o en una tela se puede proceder de la misma manera que con una pantalla y conseguir idntico resultado. Seguimiento de la cabeza en entornos de realidad virtual Esta aplicacin nos sirve para hacer un seguimiento de la cabeza en un entorno de realidad virtual. El mando se ha de colocar con ngulo suficiente para que sea capaz de captar los movimientos de la cabeza de una persona dentro de su campo de visin. La persona se ha colocar unas gafas que tienen en cada extremo un par de LEDs emisores de infrarrojos u otro objeto similar sujeto a la cabeza y con los diodos instalados. El programa funciona de tal manera que la imagen que se ve en pantalla se adapta a la posicin del usuario. De esta manera se consigue un efecto de realidad virtual ya que segn se acerque o aleje el usuario, la imagen se adaptar para que parezca que se acerque o se aleje a ella. Tambin se mostrarn las partes laterales de una imagen que quedaran ocultas si de una imagen esttica se tratase. Se consigue un efecto parecido al de asomarse a una ventana, siendo su marco el marco de la pantalla de visualizacin.
Figura 4.6. Vista superior y lateral de la interaccin entre un lpiz emisor de IR y el Wiimote 51
Otro posible uso de esta tecnologa sera la del seguimiento de objetos. El objeto ha de tener incorporado un emisor de infrarrojos y se ha de colocar el mando en unas posicin que abarque todo el posible campo de movimiento del objeto. Mediante este montaje y un software podemos seguir la ruta que sigue el objeto mvil en la pantalla del ordenador. Por ejemplo, podemos seguir el recorrido de un robot mvil al que incorporaremos un LED IR en su parte superior.
52
53
Figura 4.10. Vistas laterales del montaje utilizado en las pruebas de aplicaciones Para realizar las pruebas se ha montado un emisor siguiendo el esquema indicado en la Figura 4.9 [35]. En este caso se utiliza como soporte un rotulador. Acoplado a ste hay un portapilas con dos pilas de 1.5V. En el extremo que correspondera a la tinta se encuentra el LED emisor y en un lateral el interruptor que utilizaremos para encender y apagar la emisin (vase Figura 4.10). En el interior se encuentra una resistencia de 23, adems del cableado de conexin necesario.
54
comprobar con esta si todo el movimiento est abarcado en el ngulo de visin. Si esto no es as, se ha de mover el mando hasta una posicin donde se cumpla la condicin de visin. Wii_mancuerna Wii_mancuerna es una aplicacin para la monitorizacin del levantamiento de una mancuerna. El ejercicio al que podra acompaar sera el consistente en levantar una mancuerna u otro objeto similar desde una superficie estable. La aplicacin nos muestra el ngulo que mantiene el brazo respecto a la superficie y una representacin grfica simplificada (vase Figura 4.13). Para su ejecucin se han de seguir estas indicaciones: Colocar el mando de manera adecuada para que el movimiento del objeto sujetado en la mano est dentro de su campo de visin. Para esta calibracin se puede usar la aplicacin desarrollada Wii_led. Montar en la mancuerna u objeto a sujetar un LED infrarrojo para que se pueda realizar el seguimiento de su movimiento. El montaje se ha de realizar segn el esquema visto en la seccin cuatro del captulo adaptndolo a la forma del objeto en cuestin. Calibrar la aplicacin cada vez que se ejecute para que el seguimiento sea lo ms preciso posible. La calibracin consiste en la colocacin del brazo en la posicin inicial y la emisin de luz IR para tomar la referencia inicial del movimiento.
56
La aplicacin se ha desarrollado y probado en un entorno tal y como describe la Figura 4.11. La superficie sobre la que se trabaja es una mesa sobre la cual colocamos unas cajas que nos servirn de soporte al mando en uno de los extremos. El brazo lo hemos de colocar apoyado lo ms cerca del borde de la mesa a la distancia indicada. En la mano sujetaremos el soporte construido (ver apartado 4.4) para la localizacin de la fuente de infrarrojo.
4.8. RESUMEN
La consola Wii y el sistema de apuntado de su mando nos ofrecen una buena solucin para movernos en una pantalla basndonos en la posicin de luz ofrecida por los LEDs. La forma de apuntar no es la misma que utilizaramos con un puntero lser o con un ratn, ya este sistema junto con el acelermetro ofrece mayores posibilidades. Esto combinado con el bajo coste de adquisicin de mandos y LEDs permite ofrecer soluciones econmicas y fciles de usar para cualquiera. Se pueden disear aplicaciones basndonos en esta funcionalidad en las que se interacte con el mando teniendo unas luces fijas o con algn dispositivo en el que integremos diodos luminosos. Esta ltima opcin es muy interesante para pacientes de rehabilitacin con limitacin en los movimientos de las extremidades o prdida de stos ya que se podran adaptar interfaces especficas a su limitacin.
58
3 cm
3 cm
60
El Wii Motion Plus es un pequeo dispositivo rectangular de 3x4x3 cm sin botones. Se conecta por el puerto de expansin que est situado en la parte inferior del Wiimote. Permite la conexin asimismo de otro accesorio de los antes citados como, por ejemplo, el Nunchuk. La unin entre el mando original y el accesorio no es rgida en su totalidad pero cuenta con un sistema de bloqueo para que ste tenga ms seguridad en su insercin o extraccin (vase Figura 5.2). El fundamento fsico del Wii Motion Plus es el funcionamiento de un giroscopio. Este giroscopio est implementado mediante dos sensores giroscpicos: Un giroscopio de dos ejes IDG-600 de InvenSense. Es el encargado de la lectura del pitch y del roll. Un giroscopio de un eje X3500W de EPSON TOYOCOM. Se encarga de la lectura del yaw.
El uso combinado de estos dos giroscopios es el que permite el envo por parte del Motion Plus de la velocidad angular que se experimenta en los tres ejes. El pitch se corresponde con los giros experimentados sobre el eje X (cabeceo), el roll se corresponde con los giros experimentados sobre el eje Y (alabeo) y el yaw mide los giros realizados sobre el eje Z (guiada) (vase Figura 5.3).
Figura 5.3. Orientacin del acelermetro del Wiimote y de las magnitudes medidas por el Wii Motion Plus
61
El sensor detecta los movimientos de giro y rotacin debido a que capta 1600 grados por segundo, lo que equivaldra a cuatro giros y medio de la mano. Esto supone aumentar la sensibilidad del sensor multiplicando por cinco la sensibilidad de sensores giroscpicos habituales en ese tamao. De esta manera se garantiza que se captan los movimientos ms rpidos realizados por los jugadores. El sensor giroscpico del mando est diseado para tener dos modos de funcionamiento: uno para movimientos lentos y otro para movimientos rpidos. De esta manera no perdera sensibilidad a la hora de detectar los movimientos lentos pese a estar diseado para detectar los ms rpidos. Para lograr esto, teniendo en cuenta que los datos se envan de forma inalmbrica y su resolucin est predeterminada, se miden las velocidades en distintas escalas. Para los movimientos lentos se envan datos midiendo hasta una determinada resolucin en el nmero fijo de bandas de transmisin y para los movimientos rpidos se envan los datos midiendo al doble de resolucin en el mismo nmero de bandas [37]. Los giroscopios antes citados se tratan de dos chips que utilizan la tecnologa MEMS. La mayora de estos giroscopios se basan en el efecto Coriolis para su funcionamiento. Para la comprensin de este efecto supondremos el siguiente ejemplo: un nio se encuentra en el centro de un tiovivo y quiere andar hacia su madre que se encuentra fuera del tiovivo. El nio empieza a ir hacia ella pero para poder avanzar en lnea recta adems de seguir su movimiento hacia adelante deber mantener otro tambin de forma lateral para contrarrestar la rotacin del tiovivo. El efecto Coriolis consiste en que la velocidad lateral que deber mantener ser mayor cuanto ms cerca del borde se encuentre. El aumento de velocidad produce una aceleracin y el decremento una deceleracin. Un giroscopio electrnico est formado por dos partes: un elemento de polisilicato resonante que realiza un movimiento de vibracin hacia fuera o hacia dentro respecto al eje de rotacin del giroscopio y otra parte que se encuentra fija y perpendicular al movimiento vibratorio de la primera. Estas dos partes juntas forman una estructura capacitiva que es capaz de contener una carga elctrica. Cuando el giroscopio no est girando la distancia entre todos los elementos se mantiene y por tanto la capacitancia se mantiene constante. Si el giroscopio est girando se produce el siguiente efecto: el elemento resonante se encuentra desplazndose hacia dentro o fuera del eje de rotacin debido a su movimiento de vibracin, experimentando una aceleracin o una deceleracin producida por el efecto Coriolis. Estas aceleraciones se traducirn en fuerzas en sentidos contrarios que afectarn a la masa resonante. Debido al movimiento experimentado por la masa, la capacitancia vara de forma proporcional a la velocidad de rotacin de sta. Estos cambios de capacitancia se detectan por sensores que determinan la velocidad de rotacin del giroscopio y la expresan en un voltaje de salida [38]. 62
El Wiimote con Wii Motion Plus consigue un seguimiento del movimiento 1:1 ya que se alcanzan seis grados de libertad. Se ha de tener en cuenta la limitacin representada por la conversin de aceleraciones y velocidades en posiciones mediante integracin. Adems, en la entrega de la lectura del yaw, los giroscopios permiten al software diferenciar entre orientacin y aceleracin lo cual dificulta la lectura diferenciada respecto al acelermetro que entrega una mezcla de ambas.
Por ltimo se imprimen los valores de velocidad angular en los tres ejes accediendo a su valor mediante vel_ang = wiimote.state[motionplus][angle_rate]
64
Figura 5.5. Vista de la aplicacin Wii_motionPlus con el mando en reposo y con el mando en movimiento
65
5.6. RESUMEN
El Wii Motion Plus es un accesorio que ofrece unas caractersticas que complementan al Wiimote en cuanto a deteccin de movimiento se refiere. Se puede conseguir el seguimiento natural de los movimientos ya que con este accesorio se consiguen unos datos acerca del movimiento lineal y angular. Para las aplicaciones objetivo se trata de un accesorio que mejora la deteccin de movimiento ofrecida por el mando actual pudiendo tener ms precisin en stos. Adems se ofrecen los valores de pitch, roll y yaw los cuales no se podan ofrecer con el mando sin accesorio si no exista una fuerza de gravedad que actuara sobre l.
66
31.6 cm 3.2 cm
51.1 cm
Figura 6.2. Vista de los sensores de deformacin utilizados en la Wii Balance Board
La comunicacin es inalmbrica y se realiza mediante el protocolo Bluetooth. El diseo de la electrnica asociada se realiz de manera modular, pudiendo reutilizar este mdulo de comunicaciones en futuros accesorios. Para su sincronizacin con la consola se ha de pulsar el botn SYNC situado dentro del compartimento dedicado a las pilas (vase Figura 6.3). Solo se puede utilizar una nica WiiBoard con la consola, siendo compatible con el uso simultaneo de 3 Wiimotes. Usa la conexin del cuarto jugador desconectando los posibles Wiimotes que existieran en esa posicin. Para su alimentacin son necesarias cuatro pilas AA. La autonoma media es de 60 horas de duracin, similar a la del Wiimote cuando no se utiliza su funcin de puntero.
69
La mayora de las actividades que se realizan con la WiiBoard se basan en las siguientes cuatro posiciones [41]: Equilibrarse sobre una pierna. Inclinar el cuerpo. Girar las caderas. Mover el cuerpo al ritmo.
El API que se utilizar para la programacin de aplicaciones es el mismo que se utiliza para el Wiimote y sus funcionalidades (apartado 3.4). El objeto que representa a la WiiBoard se trata de igual manera que el que representaba al Wiimote. Para identificar que el dispositivo conectado es la WiiBoard se indicar en el modo de reporte de mensajes. Posteriormente podremos manejar los valores de los sensores de presin accediendo al estado de la WiiBoard y seleccionando el sensor deseado.
Esta aplicacin sirve de calibracin permitiendo ajustar la sensibilidad y la posicin. Estos parmetros varan en funcin de si el usuario se encuentra en posicin erguida sobre la tabla o si se est sentado. El proceso a seguir es el siguiente: 1. Lanzamiento de la aplicacin 2. Sincronizacin con el ordenador. Esta se realiza pulsando el botn de SYNCRO situado tras la tapa para las pilas. 3. Posicionamiento del usuario. 4. Movimiento del usuario. Tras este paso comprobaremos el movimiento del centro de gravedad y ajustaremos nuestra posicin para una correcta utilizacin.
Pong_wiiboard Pong_wiiboard es una aplicacin que adapta el popular juego del pong para ser controlado mediante la WiiBoard (vase Figura 3.7). Presenta la misma interfaz que la mostrada en la aplicacin desarrollada Pong_wiimote (apartado 3.6). Nuevamente falta la implementacin de un tanto ya que nos centramos en la capacidad para manejar las capacidades ofrecidas por el dispositivo. La aplicacin est enteramente controlada por el usuario que se coloca encima de la tabla. El movimiento de la pala que correspondera al jugador 1 se controla 72
situando levemente el centro de gravedad a la izquierda del usuario. Posteriormente el desplazamiento vertical se logra desplazando el centro de gravedad hacia adelante o hacia atrs segn corresponda. Para el movimiento que correspondera al jugador 2, el usuario ha de desplazar levemente su centro de gravedad hacia la derecha. De igual manera que en el caso anterior, los movimientos de su centro de gravedad hacia adelante o hacia atrs se correspondern con movimientos de la pala en sentido ascendente o descendente respectivamente. Pong_wiiboard es una aplicacin que se correspondera con los objetivos fijados para stas: uso de la WiiBoard como control, entretenimiento durante el uso y posibilidad de usos en fisioterapia o rehabilitacin. Esto es as ya que el control de la bola sin que toque las paredes laterales hace moverse al usuario guardando el equilibrio subido en la tabla. Adems se ejercita la capacidad de concentracin al variar continuamente la orientacin y sentido del movimiento dentro de la pantalla. Adicionalmente se puede usar sentado sobre la tabla lo que beneficiara al control del tronco, efecto deseado en varios pacientes de rehabilitacin (vase Figura 6.6).
73
Figura 6.6. Vista de las posibles posiciones a adoptar en el uso de la aplicacin Pong_wiiboard 74
6.6. RESUMEN
La WiiBoard se puede utilizar como dispositivo de control de aplicaciones en el ordenador. La deteccin de presin se puede realizar usando la tabla de pie sobre ella, sentados sobre su superficie o apoyando ambas manos. Adems incluye una mayor versatilidad al disponer de una interfaz Bluetooth que hace que sea posible conectarla a un ordenador con facilidad. Aunque su uso est pensado para que los usuarios se pongan de pie encima de ella, hemos comprobado que tambin funciona cuando los usuarios se sientan encima. Esto nos permite crear aplicaciones para personas que precisen de silla de ruedas o con un cierto grado de deficiencia en el tren inferior.
75
Para comprobar la viabilidad de la plataforma se han programado aplicaciones de demostracin para rehabilitacin para cada uno de los perifricos: adaptacin del juego del Pong para el Wiimote y Wiiboard, monitorizacin del levantamiento de una mancuerna, monitorizacin de velocidades angulares para el Wii Montion Plus y diversas aplicaciones de calibrado. No slo se han alcanzado satisfactoriamente los objetivos fijados inicialmente sino que adems se han conseguido otras aportaciones: Se ha propuesto un interfaz nuevo que permite a los pacientes usar los movimientos del cuello para controlar las aplicaciones. Se usa un Wiimote colocado en una gorra. Es de gran utilidad para personas con discapacidad parcial o total en las manos o brazos. Se ha propuesto otro interfaz novedoso para que los usuarios puedan ejercer el control mediante movimientos del torso en una posicin sentada. Se ha comprobado la viabilidad de utilizar la Wiiboard para que los pacientes se sienten sobre ella. Aunque no es un uso planeado inicialmente por Nintendo, los experimentos demuestran su viabilidad. Es especialmente interesante para personas con prdida de movilidad en el tren inferior.
Control de mviles mediante movimiento del cuerpo. Si adaptamos la salida que nos ofrece la WiiBoard se puede realizar control de elementos mviles que permitan desplazamiento. Una posibilidad sera la implementacin del movimiento de una silla de ruedas mediante el movimiento del usuario sentado encima de ella siguiendo un esquema: silla, Wii Balance Board, usuario.
Otro uso no destinado a rehabilitacin y fisioterapia sera el destinado a robtica asistencial. Se puede adaptar las salidas que nos ofrecen los mandos y sus accesorios para controlar robots asistenciales como ASIBOT. Los trabajos futuros que extiendan a este proyecto irn dirigidos a la creacin de aplicaciones ms complejas. Adems se ha de contar con la ayuda de uno o varios especialistas en fisioterapia o rehabilitacin para que las aplicaciones estn hechas totalmente a la medida de la necesidad. Se recomienda desarrollar las aplicaciones mediante diseo centrado en el usuario y diseo participativo.
78
Adicionalmente se han de instalar en el ordenador tres paquetes correspondientes a los drivers del mando (lswm), a la librera de desarrollo de los programas (libcwiid) y a la interfaz bluetooth (bluez).
sudo apt-get install bluez lswm wmgui wminput libcwiid1-dev
Wmgui Wmgui es una aplicacin implementada por el equipo encargado de la librera de desarrollo Cwiid. Se trata de una aplicacin que nos muestra una interfaz grfica en la que se nos muestran diversas partes del Wiimote o de sus funciones. La parte superior se divide en tres: un rea que muestra los diferentes
botones del Wiimote, un rea que muestra los sensores de movimiento en los tres ejes y un rea en el que se muestra las fuentes de infrarrojo captadas por la cmara del mando en forma de punto o puntos (hasta cuatro). La parte inferior presenta una parte dedicada a los controles del Nunchuk y otra parte dedicada a los controles del mando clsico. Una vez lanzada la aplicacin se ha de conectar el Wiimote a ella pulsando CTRL+C, la cual nos presentar una ventana que nos pedir que pulsemos 1+2 en el mando. Una vez realizado el proceso el mando se encontrar vinculado a la aplicacin y si pulsamos cualquier botn, ste aparecer coloreado en la parte correspondiente a los botones. Para activar el sensor de movimiento se ha de pulsar CTRL+A, el cual mandar las seales que se mostrarn en su espacio dedicado en forma numrica. Para la visualizacin de las fuentes de infrarrojo mediante la cmara se ha de pulsar CTRL+I. Las fuentes aparecern como puntos dentro del rango visible del Wiimote mapeando en dos dimensiones su movimiento y haciendo que el punto sea ms grande o ms pequeo dependiendo de su distancia al mando. Permite adems encender o apagar los LEDs correspondientes a los juagadores pulsando CTRL+1, CTRL+2, CTRL+3 o CTRL+4 respectivamente, y encender o apagar el vibrador interno pulsando CTRL+R. La parte inferior correspondiente a las extensiones se habilita pulsando CTRL+E. Si los perifricos correspondientes estn conectados aparecer en una barra de estado inferior en la que adems se muestra si el Wiimote se encuentra vinculado al programa y el estado de la batera.
Figura A.1. Vista de la aplicacin wmgui interactuando con los botones y con el acelermetro
80
Figura A.2. Vista de la aplicacin wmgui interactuando con la cmara de IR y con el acelermetro
IMPORTANTE: Para la programacin de aplicaciones para la WiiBoard se ha realizar la instalacin de la librera como se detalla en el Anexo D.
81
#Importar modulos import sys import cwiid import time #Variables led=0;
#Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1; #Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote", reintentos sys.exit(-1) #Conexion establecida #Encendemos el led 1 para saber que la conexion esta establecida wiimote.led = cwiid.LED1_ON #Activamos los acelerometros wiimote.rpt_mode = cwiid.RPT_ACC #Bucle principal while 1: # Leer las aceleraciones acc = wiimote.state['acc']
83
# Sacar por pantalla str = "X: %.1f, Y: %.1f, Z: %.1f " % acc[cwiid.X],acc[cwiid.Y],acc[cwiid.Z]) print str #Introducimos una pausa para mejorar la visualizacion time.sleep(0.5)
84
2. COORDENADAS DE LED IR
#----------------------------------------------------------------#-#-ej_posicion_ir.py Ejemplo coordenadas IR LED
#Importar modulos import sys import cwiid import time #Variables led=0; reintentos=0; ok=False; print 'Pulsa las teclas 1+2 en el Wiimote......'
#Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
85
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1) #Conexion establecida #Encender el led 1 del wiimote wiimote.led = cwiid.LED1_ON #Activamos ir wiimote.rpt_mode = cwiid.RPT_IR #Bucle principal while 1: #Acceder al estado del wiimote state = wiimote.state if 'ir_src' in state: for src in state['ir_src']: if src: posicion=src['pos'] print posicion
86
#Importar modulos import sys import cwiid import time #Variables led=0; reintentos=0; ok=False; print 'Pulsa las teclas 1+2 en el Wiimote......' #Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
87
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1) #Conexion establecida #Encendemos el led 1 del wiimote wiimote.led = cwiid.LED1_ON #Activar Wii Motion Plus wiimote.enable(cwiid.FLAG_MOTIONPLUS) wiimote.rpt_mode = cwiid.RPT_MOTIONPLUS #Bucle principal while 1: if wiimote.state.has_key('motionplus'): #Leemos velocidades angulares del estado del wiimote vel_ang=wiimote.state['motionplus']['angle_rate'] print vel_ang #Introducimos una pausa para mejorar la visualizacion time.sleep(0.1)
88
#Importar modulos import sys import cwiid import time #Variables led=0; reintentos=0; ok=False; print 'Pulsa el boton de sync de la wiiboard (donde estan las pilas)...' #Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
89
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote", reintentos sys.exit(-1) #Conexion establecida #Encender el led de la wii-board wiimote.led = cwiid.LED1_ON #Activar la wii-board wiimote.rpt_mode = cwiid.RPT_BALANCE #Bucle principal while 1: #Leer el estado de la wiiboard state = wiimote.state #Leer los 4 sensores de presion a = state['balance']['left_top'] b = state['balance']['right_top'] c = state['balance']['left_bottom'] d = state['balance']['right_bottom'] #Imprimir en pantalla str = "A=%d, B=%d, C=%d, D=%d" % (a,b,c,d) print str #Introducimos una pausa para mejorar la visualizacion time.sleep(0.1)
90
# Importar modulos import sys import cwiid import math import time import decimal
def menu(): print """ Menu de opciones ---------------1.- Opcion 1= Mando en mano 2.- Opcion 2= Mando en gorra SP.- Volver a sacar el menu ESC.- Terminar """
#Calcular las aceleraciones normalizadas a_x = float( acc[cwiid.X] - cal[0][cwiid.X] ) / float( cal[1][cwiid.X] - cal[0][cwiid.X] ) a_y = float( acc[cwiid.Y] - cal[0][cwiid.Y] ) / float( cal[1][cwiid.Y] - cal[0][cwiid.Y] ) a_z = float( acc[cwiid.Z] - cal[0][cwiid.Z] ) / float( cal[1][cwiid.Z] - cal[0][cwiid.Z] )
92
else: roll = math.pi/2; if (a_z<=0.0): if (a_x!=0): signo = (a_x/a_x) roll += math.pi * signo else: roll += math.pi roll *= -1 divisor = a_z*math.cos(roll)
else: pitch=0
#Pasar pitch y roll a grados roll = roll * 180.0/math.pi pitch = pitch * 180.0/math.pi
#Comienzo programa led=0; reintentos=0; ok=False; blue = 0, 0, 255 black = 0, 0, 0 white = 255, 255, 255 red= 255, 0, 0
93
mano=0 gorra=0
#Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
94
c = consola_io.getkey()
#Procesar tecla if c=='1': mano=1 elif c=='2': gorra=1 elif c==' ': menu()
#Configurar pygame pygame.init() size = width, height = 640, 400 screen = pygame.display.set_mode(size) pygame.display.set_caption("Wiimote_2D")
(pitch,roll) = lee_pitch_roll(wiimote)
95
#Limitando accion de pitch y roll a giros de 22.5 if gorra==1: if pitch>22.5: pitch=22.5 if pitch<-22.5: pitch=-22.5 if roll>22.5: roll=22.5 if roll<-22.5: roll=-22.5
#Dibujar ejes y punto pygame.draw.aaline (screen, black, (cox-cox, coy), (cox+cox, coy),5) pygame.draw.aaline (screen, black, (cox, coy-coy), (cox, coy+coy),5)
96
rn=decimal.Decimal(repr(roll)).quantize(TWOPLACES) pn=decimal.Decimal(repr(pitch)).quantize(TWOPLACES)
#Para mando en posicion perpendicular a la pantalla(mano) cox-rn y coy+pn #Para mando en posicion paralela a la pantalla(gorra) cox-pn y coy+rn if mano==1: dox=cox-(rn*width/180) doy=coy+(pn*height/180) if gorra==1: dox=cox-(pn*width/45) doy=coy-(rn*height/45)
97
2. PONG_WIIMOTE
#----------------------------------------------------------------#-pong_wiimote.py
#-- Clasico juego pong adaptado para que el jugador 1 use un wiimote como interfaz de control #----------------------------------------------------------------#-- Carlos Pastor #-----------------------------------------------------------------
#Importar modulos import pygame from pygame.locals import Rect, K_ESCAPE, QUIT, KEYDOWN, KEYUP, K_UP, K_DOWN, K_q, K_a import sys import math import cwiid
#Variables SCREEN_DIMENSIONS = (800, 600) screen = None clock = None paddle1 = None paddle2 = None ball = None
98
while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: print "Error: ",msg reintentos+=1;
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
#Rutina de inicio def main(): global screen global clock global SCREEN_DIMENSIONS
99
#Inicializando todo lo relacionado con Pygame pygame.init() screen = pygame.display.set_mode( SCREEN_DIMENSIONS ) pygame.display.set_caption("Pong_wiimote") clock = pygame.time.Clock() initData() mainLoop()
#Inicializacion de estructuras de datos def initData(): global paddle1 global paddle2 global ball
100
global screen
s = screen s.lock() s.fill(0) s.fill(0xffffff, Rect(ball.left(), ball.top(), ball.width, ball.height)) s.fill(0xccccff, Rect(paddle1.left(), paddle1.top(), paddle1.width, paddle1.height)) s.fill(0xccccff, Rect(paddle2.left(), paddle2.top(), paddle2.width, paddle2.height)) s.unlock() pygame.display.update()
#Lectura de la entrada de teclado y eventos del wiimote def readInput(): global paddle1 global paddle2 global pitchPrev
pitch = lee_pitch_roll(wiimote)
paddle1.dy=0.2*abs(pitch) paddle2.dy=8
for event in pygame.event.get(): if event.type == QUIT: quit() elif event.type == KEYDOWN: if event.key == K_ESCAPE: quit() elif event.key == K_UP:
101
elif event.type == KEYUP: if event.key == K_UP: paddle2.joystick.up = False elif event.key == K_DOWN: paddle2.joystick.down = False
if abs(pitch-pitchPrev)> 0.5: if pitch < 0: paddle1.joystick.up = True else: paddle1.joystick.up= False if pitch > 0: paddle1.joystick.down= True else: paddle1.joystick.down = False else: paddle1.joystick.up= False paddle1.joystick.down= False
pitchPrev=pitch
#Actualizar estado del juego def updateState(): global paddle1 global paddle2 global ball
102
ball.update(paddle1, paddle2)
#Obtener pitch y roll a partir de aceleraciones def lee_pitch_roll(wiimote): # Leer el calibrado ext_type = wiimote.state['ext_type'] cal = wiimote.get_acc_cal(ext_type)
# Calcular las aceleraciones normalizadas a_x = float( acc[cwiid.X] - cal[0][cwiid.X] ) / float( cal[1][cwiid.X] - cal[0][cwiid.X] ) a_y = float( acc[cwiid.Y] - cal[0][cwiid.Y] ) / float( cal[1][cwiid.Y] - cal[0][cwiid.Y] ) a_z = float( acc[cwiid.Z] - cal[0][cwiid.Z] ) / float( cal[1][cwiid.Z] - cal[0][cwiid.Z] )
103
roll = math.pi/2; if (a_z<=0.0): if (a_x!=0): signo = (a_x/a_x) roll += math.pi * signo else: roll += math.pi
return (pitch)
104
dy = 0 width = 10 height = 10
self.dx = dx self.dy = dy
def update(self, paddle1, paddle2): #Actualizo posicion self.x += self.dx self.y += self.dy
#Deteccion de colision con las paletas if paddle1.collides((self.x, self.y)): self.dx = -self.dx if paddle2.collides((self.x, self.y)): self.dx = -self.dx
#Deteccion de colision con los bordes de la ventana if (self.x < 0): self.x = 1
105
self.dx = -self.dx if (self.x > SCREEN_DIMENSIONS[0]): self.x = SCREEN_DIMENSIONS[0]-1 self.dx = -self.dx if (self.y < 0): self.y = 1 self.dy = -self.dy if (self.y > SCREEN_DIMENSIONS[1]): self.y = SCREEN_DIMENSIONS[1]-1 self.dy = -self.dy
def bottom(self):
106
def collides(self, point): return (point[0] >= self.left() and point[0] <= self.right()) and (point[1] >= self.top() and point[1] <= self.bottom())
107
3. WII_LED
#----------------------------------------------------------------#-#-2D wii_led.py Aplicacion de seguimiento de puntero led y representacion en
# Importar modulos import sys import cwiid import math import time import decimal import pygame import wave import os
# Variables led=0; reintentos=0; ok=False; blue = 0, 0, 255 black = 0, 0, 0 white = 255, 255, 255 red= 255, 0, 0
108
try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
#Configurar pygame pygame.init() size = width, height = 512, 384 screen = pygame.display.set_mode(size) pygame.display.set_caption("Wii_led")
109
#Dibujar ejes y punto pygame.draw.aaline (screen, black, (cox-cox, coy), (cox+cox, coy),5) pygame.draw.aaline (screen, black, (cox, coy-coy), (cox, coy+coy),5)
state = wiimote.state
pygame.display.flip()
110
4. WII_MANCUERNA
#----------------------------------------------------------------#-#-wii_mancuerna.py Aplicacion de seguimiento de brazo con mancuerna IR
#Importar modulos import sys import cwiid import math import time import pygame import wave import os
#Variables led=0; reintentos=0; ok=False; blue = 0, 0, 255 black = 0, 0, 0 white = 255, 255, 255 red= 255, 0, 0 ceroX2=0 ceroY2=0
111
#Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
#Configurar pygame pygame.init() size = width, height = 512, 384 screen = pygame.display.set_mode(size) pygame.display.set_caption("Wii_mancuerna")
112
time.sleep( 10 )
state = wiimote.state
ceroX2=posCal2[0] ceroY2=posCal2[1]
time.sleep(5)
113
state = wiimote.state
cx=posicion[0] cy=posicion[1]
xp=1023-cx yp=cy-ceroY2
#Calculo del angulo del brazo respecto a la horizontal angulo=math.atan2(yp,xp) anguloGrados= math.degrees(angulo)
#Representacion en pantalla de valores text_angulo = font.render('Angulo: ', True, black, white) text_anguloN = font.render(repr(anguloGrados), True, black, white) screen.blit(text_angulo, (50, 50))
114
screen.blit(text_anguloN, (100, 50)) pygame.draw.aaline (screen, red, (cox, coy), (cox+xp, coy-yp))
pygame.display.flip()
time.sleep(0.1)
115
5. WII_MOTIONPLUS
#----------------------------------------------------------------#-#-Wii_motionPlus.py Representacion de las velocidades captadas por el WMP
#Importar modulos import cwiid import sys import time import pygame
#Variables size = width, height = 768, 576 reintentos=0 ok=False positivoP, negativoP= False,False positivoR, negativoR= False,False positivoY, negativoY= False,False dP,dR,dY=0,0,0 xP,xR,xY=0,0,0 yaw,pitch,roll=0,0,0 white=255,255,255 red=255,0,0 black=0,0,0 blue=0,0,255 green=0,255,0
116
vel_ang=0
def comprobar_orientacion(yaw,pitch,roll): if yaw>8000: positivoY= True negativoY= False else: negativoY= True positivoY= False if pitch>7860: positivoP= True negativoP= False else: negativoP= True positivoP= False if roll>7980: positivoR= True negativoR= False else: negativoR= True positivoR= False
return (positivoY,negativoY,positivoR,negativoR,positivoP,negativoP)
#Establecer conexion con Wiimote while reintentos<3 and not ok: try: print "Reintento ",reintentos
117
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
#Coordenadas para los centros del control cox = width/2 coyP = height/6 coyR = height/2 coyY = 5*height/6
while 1:
118
(positivoY,negativoY,positivoR,negativoR,positivoP,negativoP )=comprobar_orientacion(yaw,pitch,roll)
if positivoP==True: dP=-(xP-((7860/100)*(width-100)/(16383/100))) else: dP=((7860/100)*(width-100)/(16383/100))-xP if positivoR==True: dR=-(xR-((7980/100)*(width-100)/(16383/100))) else: dR=((7980/100)*(width-100)/(16383/100))-xR if positivoY==True: dY=-(xY-((8000/100)*(width-100)/(16825/100))) else: dY=((8000/100)*(width-100)/(16825/100))-xY
119
screen.fill(white)
#Dibujar elementos graficos text_pitch = font.render('PITCH', True, black, white) text_roll = font.render('ROLL', True, black, white)
text_yaw = font.render('YAW',True,black,white) screen.blit(text_pitch, (50, height/6-40)) screen.blit(text_roll, (50, height/2-40)) screen.blit(text_yaw, (50,5*height/6-40)) pygame.draw.aaline (screen, black, (50, height/6), (width50, height/6),5) pygame.draw.aaline (screen, black, (50, height/2), (width50, height/2),5) pygame.draw.aaline (screen, black, (50, 5*height/6), (width50, 5*height/6),5) pygame.draw.circle(screen, black, (cox,coyP),5,0) pygame.draw.circle(screen, black, (cox,coyR),5,0) pygame.draw.circle(screen, black, (cox,coyY),5,0) pygame.draw.circle(screen, red, (cox+dP,coyP),6,0) pygame.draw.circle(screen, green, (cox+dR,coyR),6,0) pygame.draw.circle(screen, blue, (cox+dY,coyY),6,0) pygame.display.flip() time.sleep(0.1)
120
6. GRAWIITY CENTER
#----------------------------------------------------------------#-grawiity_center.py
#-- Mapeo de los movimientos sobre la tabla(centro de gravedad) en un espacio en 2 dimensiones #----------------------------------------------------------------#-- Carlos Pastor #-----------------------------------------------------------------
#Importar modulos import sys import cwiid import math import time import pygame
#Devolver una cadena con el estado de la bateria def estado_bateria (state): bateria = state['battery'] porcentaje = (100.0 * bateria / cwiid.BATTERY_MAX) return 'Battery: ' + str(int(porcentaje)) + '%'
#Leer los valores normalizados de los 4 sensores def leer_sensores(wiimote,calibration): state = wiimote.state sensor = 'left_top' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1]
121
b = 1700 * float((valor - valor0)) / float((valor1-valor0)) sensor = 'left_bottom' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1]
c = 1700 * float((valor - valor0)) / float((valor1-valor0)) sensor = 'right_bottom' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1]
return (a,b,c,d)
122
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote", reintentos sys.exit(-1)
#Obtener los valores de calibracion, usados para calcular #los valores normalizados de los sensores de presion balance_calibration = wiimote.get_balance_cal()
calibration = {'right_top'
: balance_calibration[0],
'left_bottom' : balance_calibration[3]
123
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Grawiity_center")
time.sleep(0.2)
try: while 1: #Leer los valores nomalizados de los sensores lt,rt,lb,rb = leer_sensores(wiimote,calibration)
#Se usa un umbral de peso para determinar si hay #alguien subido. El peso debe ser mayor de 2Kg if peso>2:
124
#Calcular las posiciones x,y del centro de gravedad try: x_balance = (rt+rb) / (lt+lb) if x_balance > 1: x_balance = -1.0*(lt+lb) / (rt+rb) + 1.0
y_balance = (lb+rb) / (lt+rt) if y_balance > 1: y_balance = -1.0*(lt+rt)/(lb+rb) +1.0 else: y_balance = y_balance -1.0 except: x_balance = 1.0 y_balance = 1.0
#Peso menor de dos kilos: no hay nadie subido else: x_balance=0.0; y_balance=0.0;
#Escalar las coordenadas y establecer el criterio de signos xpos = 400*x_balance + 400 ypos = 248*y_balance + 248
125
#Circulo para indicar la posicion del centro de gravedad pygame.draw.circle(screen, (255,0,0), (int(xpos), int(ypos)), 10)
126
pygame.display.flip()
#Terminar con Control-C except KeyboardInterrupt: wiimote.close() print print "-- FIN --"
127
7. PONG_WIIBOARD
#----------------------------------------------------------------#-pong_wiiboard.py
#-- Clasico juego pong adaptado para que el jugador use la wiiboard como interfaz de control #----------------------------------------------------------------#-- Carlos Pastor #-----------------------------------------------------------------
# Importar modulos import pygame from pygame.locals import Rect, K_ESCAPE, QUIT, KEYDOWN, KEYUP, K_UP, K_DOWN, K_q, K_a import sys import math import cwiid import time
#Variables SCREEN_DIMENSIONS = (800, 600) screen = None clock = None paddle1 = None paddle2 = None ball = None
128
#Establecer conexion con la WiiBoard while reintentos<3 and not ok: try: print "Reintento ",reintentos if len(sys.argv) > 1: wiimote = cwiid.Wiimote(sys.argv[1]) else: wiimote = cwiid.Wiimote() ok=True except RuntimeError, msg: reintentos+=1;
#Si se superan los reintentos, terminar if reintentos==3: print "Sin conexion con wiimote despues de "+repr(reintentos)+" reintentos" sys.exit(1)
#Rutina de inicio def main(): global screen global clock global SCREEN_DIMENSIONS
129
#Inicializando todo lo relacionado con Pygame pygame.init() screen = pygame.display.set_mode( SCREEN_DIMENSIONS ) pygame.display.set_caption("Pong_wiiboard") clock = pygame.time.Clock() initData() mainLoop()
#Inicializacion de estructuras de datos def initData(): global paddle1 global paddle2 global ball
130
global screen
s = screen s.lock() s.fill(0) s.fill(0xffffff, Rect(ball.left(), ball.top(), ball.width, ball.height)) s.fill(0xccccff, Rect(paddle1.left(), paddle1.top(), paddle1.width, paddle1.height)) s.fill(0xccccff, Rect(paddle2.left(), paddle2.top(), paddle2.width, paddle2.height)) s.unlock() pygame.display.update()
#Lectura de la entrada de teclado y eventos del wiiboard def readInput(): global paddle1 global paddle2 global yPrevi global yPrevd
'left_bottom' : balance_calibration[3]
view_peso = True
131
peso = (lt+rt+lb+rb)/100.0
#Se usa un umbral de peso para determinar si hay #alguien subido. El peso debe ser mayor de 2Kg if peso>2: #Calcular las posiciones x,y del centro de gravedad try: x_balance = (rt+rb) / (lt+lb) if x_balance > 1: x_balance = -1.0*(lt+lb) / (rt+rb) + 1.0 else: x_balance = x_balance -1.0
y_balance = (lb+rb) / (lt+rt) if y_balance > 1: y_balance = -1.0*(lt+rt)/(lb+rb) +1.0 else: y_balance = y_balance -1.0 except: x_balance = 1.0 y_balance = 1.0
#Peso menor de dos kilos: no hay nadie subido else: x_balance=0.0; y_balance=0.0;
paddle1.dy=10*abs(y_balance) paddle2.dy=10*abs(y_balance)
132
if event.type == QUIT:
quit()
if y_balance>0: paddle1.joystick.up = False paddle1.joystick.down = True else: paddle1.joystick.up = True paddle1.joystick.down = False
yPrevi=y_balance
if y_balance>0: paddle2.joystick.up = False paddle2.joystick.down = True else: paddle2.joystick.up = True paddle2.joystick.down = False
133
paddle2.joystick.down = False
yPrevid=y_balance
#Actualizar estado del juego def updateState(): global paddle1 global paddle2 global ball
ball.update(paddle1, paddle2)
#Leer los valores normalizados de los 4 sensores def leer_sensores(wiimote,calibration): state = wiimote.state
134
sensor = 'right_top' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1] b = 1700 * float((valor - valor0)) / float((valor1-valor0))
sensor = 'left_bottom' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1] c = 1700 * float((valor - valor0)) / float((valor1-valor0))
sensor = 'right_bottom' valor = state['balance'][sensor] valor0 = calibration[sensor][0] valor1 = calibration[sensor][1] d = 1700 * float((valor - valor0)) / float((valor1-valor0))
return (a,b,c,d)
135
y = 0 dx = 0 dy = 0
width = 10 height = 10
def update(self, paddle1, paddle2): #Actualizo posicion self.x += self.dx self.y += self.dy
136
137
def left(self): return self.x - self.width/2 def right(self): return self.x + self.width/2
def collides(self, point): return (point[0] >= self.left() and point[0] <= self.right()) and (point[1] >= self.top() and point[1] <= self.bottom())
138
2. Descargar las libreras del Wiimote y WiiBoard (revisin 183) de la direccin http://users.prevenciokft.hu/sam/files/libcwiid/libcwiid-0.60.002.tar.gz y descomprimirlo. 3. Descargar el parche para la WiiBoard balance.diff de la direccin http://abstrakraft.org/cwiid/raw-attachment/ticket/63/balance.diff en la ruta ./libcwiid/src.
140
142
Bibliografa
[1] Asibot en RoboticsLab http://roboticslab.uc3m.es/roboticslab/robot.php?id_robot=3 [2] Campo de accin de la rehabilitacin http://www.neurorehabilitacion.com/areascampo.htm [3] Medicina fsica y rehabilitacin http://es.wikipedia.org/wiki/Medicina_f%C3%ADsica_y_rehabilitaci%C3%B3n [4] Mecanoterapia http://www.sld.cu/galerias/pdf/sitios/rehabilitacion/mecanoterapia.pdf [5] Departamento de terapia ocupacional http://www.neurorehabilitacion.com/areasterapiaocupacional.htm [6] Fisioterapia http://es.wikipedia.org/wiki/Fisioterapia [7] Equipa BUAP laboratorios de fisioterapia con tecnologa de punta http://cmas.siu.buap.mx/portal_pprd/wb/comunic/equipa_buap_laboratorios_de_fi sioterapia_con_1318 [8] Un equipo multidisciplinar espaol en el Journal of Neuroengineering and Rehabilitation http://rehabilitacionymedicinafisica.blogspot.com/2010/08/un-equipomultidisciplinar-espanol-en.html
BIBLIOGRAFA
[9] Silla de ruedas que se controla con la nariz para personas severamente discapacitadas http://www.medgadget.com/spanish/2010/07/silla_de_ruedas_que_se_control_1.ht ml [10] Rehabilitacin: Tecnologa robtica vence la parlisis http://axxon.com.ar/not/138/c-1380036.htm [11] Lokomat http://www.samarit.com/pdf/hocoma_lokomat_s.pdf [12] SEGA anuncia Sega Zone su nuevo dispositivo de juegos http://www.3djuegos.com/noticias-ver/109590/sega-anuncia-sega-zone-sunuevo-dispositivo-de-juegos/ [13] Playstation Move http://en.wikipedia.org/wiki/PlayStation_Move [14] Playstation Eye http://en.wikipedia.org/wiki/PlayStation_Eye [15] Playstation move, podra aplicarse a rehabilitacin? http://rehabilitacionymedicinafisica.blogspot.com/2010/06/play-station-movepodra-aplicarse.html [16] Kinect http://es.wikipedia.org/wiki/Kinect [17] Kinect http://en.wikipedia.org/wiki/Kinect [18] Ms All del 2000 Natural User Interface http://expressionlab.net/tag/interfaz-natural-de-usuario/ [19] Wii http://es.wikipedia.org/wiki/Wii [20] Wii-Habilitation http://www.wiihabilitation.co.uk/home.shtml [21] motej http://motej.sourceforge.net/
144
BIBLIOGRAFA
[22] Wiimote libraries http://wiibrew.org/wiki/Wiimote/Library [23] WiiYourself! http://wiiyourself.gl.tter.org/ [24] Wiim http://digitalretrograde.com/projects/wiim/ [25] Wiiuse http://www.wiiuse.net/ [26] Cwiid http://abstrakraft.org/cwiid/ [27] Python http://es.wikipedia.org/wiki/Python [28] Pygame http://www.pygame.org/wiki/about [29] Cmo funciona el Wiimote. http://www.taringa.net/posts/info/1843549/Cmo-funciona-el-Wiimote.html [30] Extension Controllers http://wiibrew.org/wiki/Wiimote/Extension_Controllers [31] API libcwiid http://abstrakraft.org/cwiid/wiki/libcwiid [32] Pong http://es.wikipedia.org/wiki/Pong [33] Wiimote http://wiibrew.org/wiki/Wiimote [34] giimote. A Wii Remote extension for Game Maker and MATLAB http://code.google.com/p/giimote/wiki/Camera [35] Johnny Chung Lee > Projects > Wii http://johnnylee.net/projects/wii/
145
BIBLIOGRAFA
[36] Especial Wii Motion Plus http://www.meristation.com/v3/des_articulo.php?id=cw4a3e9e107070c&pic=GEN # [37] Iwata pregunta: Wii Motion Plus http://es.wii.com/wii/es_ES/software/iwata_pregunta_wii_motionplus_volume_1_2 162.html [38] Como funciona Wii http://laconchadetuhermana.taringa.net/posts/apuntes-ymonografias/4682115/como-funciona-el-wii.html [39] Iwata pregunta: Wii Fit http://latam.wii.com/wii-fit/iwata_asks/vol2_page1.jsp [40] El Step http://www.hispagimnasios.com/a_culturismo/step.php [41] Manual de operaciones Wii Balance Board Anexo E
146