Documentos de Académico
Documentos de Profesional
Documentos de Cultura
J UNIO 2016
R ESUMEN
n los últimos años se ha observado una evolución en los dispositivos utilizados para
i
D EDICATORIAS Y RECONOCIMIENTOS
n primer lugar queremos dedicar esta tesis a nuestras familias que nos han acompañado
E en cada uno de los momentos de nuestras vidas, que nos han guiado por un buen camino
y por sobre todo que nos han ayudado a levantarnos en nuestras caídas.
A nuestros amigos, con los cuales hemos compartido momentos desde la niñez y a los que
hemos ido conociendo a lo largo de nuestras vidas.
Agradecemos a nuestros compañeros de trabajo, por su buena disposición a colaborar con el
desarrollo del trabajo. En especial, a los chicos de diseño 3D, sin ellos hubiera sido más largo y
complicado el proceso de llevar a cabo esta tesis.
Agradecemos a nuestro director Cristian y a nuestro co-director Juan que desde un principio
nos han brindado su apoyo, sus conocimiento y nos han sabido guiar a lo largo de este trabajo.
iii
Í NDICE DE C ONTENIDOS
Página
Índice de Figuras ix
1 Introducción 1
1.1 Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Objetivo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Organización del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 Marco Teórico 5
2.1 Nuevos enfoques de interación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2 Tecnología en el deporte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Raqueta de tenis de Babolat . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2.2 Smartball de Adidas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Nintendo Wii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.1 Wii Remote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3.2 Wiimotion Plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.3.3 Reconocimiento de gestos con Wiimote . . . . . . . . . . . . . . . . . . . . . . 12
2.4 Oculus Rift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.5 Motor gráfico: Ogre 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5.1 Conceptos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.6 Motor físico: Bullet Physics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.6.1 Conceptos básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Diseño e Implementación 19
3.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 Vista general del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.2.1 Módulo Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1.1 DeviceManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1.2 DeviceWiimote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.1.3 Device WiiMotionPlus . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2.1.4 Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
v
ÍNDICE DE CONTENIDOS
4 Instanciación 49
4.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2 Aplicación Editor de Perfiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.2.1 Administración de Perfiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2.2 Definición de tipos de golpe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2.3 Captura de un nuevo golpe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.4 Generación de un nuevo Template . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.5 Estrategias de comparación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.2.5.1 Comparación Golpe-Template . . . . . . . . . . . . . . . . . . . . . 57
4.2.5.2 Mejor coincidencia Golpe-Templates . . . . . . . . . . . . . . . . . 61
4.2.6 Configuraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.2.6.1 Configuración de estrategias . . . . . . . . . . . . . . . . . . . . . . 64
4.2.6.2 Configuraciones de dispositivo . . . . . . . . . . . . . . . . . . . . . 65
4.3 Visualizador 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3.1 Carga de escenas 3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
4.3.2 Configuración del escenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
4.3.3 Integración del motor gráfico con el motor físico . . . . . . . . . . . . . . . . 71
4.3.4 Instructor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.3.4.1 Comunicación Instructor-Servidor-Visualizador . . . . . . . . . . 75
vi
ÍNDICE DE CONTENIDOS
4.3.5 Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
4.3.5.1 Configurador de ejercicios . . . . . . . . . . . . . . . . . . . . . . . . 78
4.3.5.2 Ejercicio libre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.3.5.3 Ejercicio de potencia . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
4.3.5.4 Ejercicio de precisión . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
4.3.5.5 Ejecución del ejercicio . . . . . . . . . . . . . . . . . . . . . . . . . . 86
4.3.5.6 Mostrar trayectoria de la pelota . . . . . . . . . . . . . . . . . . . . 88
4.3.5.7 Ojo de halcón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
4.3.6 Visualizador en Oculus Rift . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
4.3.6.1 Proceso de inicialización y configuración de la aplicación con
Oculus Rift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
A Apéndice 97
A.1 Captura de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
A.1.1 Saturación de sensores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
A.2 Biblioteca Wiiyourself . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
A.3 Algoritmo DTW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Bibliografía 103
vii
Í NDICE DE F IGURAS
F IGURAS Página
1.1 Simuladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
ix
Í NDICE DE F IGURAS
x
Í NDICE DE F IGURAS
xi
Í NDICE DE A LGORITMOS
A LGORITMOS Página
3.1 Wiimote::Wiimote . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.2 WiiMotionPlus::WiiMotionPlus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3 Wiimote::CaptureStroke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.4 StrategyInside::Inside . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.5 ResultStrategy::ResultStrategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.6 StrategyInside::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.1 NewProfile::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4.2 EditTypeStroke::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.3 NewStroke::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.4 NewTemplate::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
4.5 ExecuteComparisonInside::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.6 ExecuteComparisonDTW::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
4.7 ExecuteBestAgreementInside::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.8 ExecuteBestAgreementDTW::Execute . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.9 CustomMotionState::SetWorldTransform . . . . . . . . . . . . . . . . . . . . . . . . . 72
4.10 Algoritmo para crear representación visual y física de la pelota . . . . . . . . . . . . 73
4.11 TennisCourt::isContainDestinationSide . . . . . . . . . . . . . . . . . . . . . . . . . . 79
4.12 VisualExercise::startExercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
A.1 Algoritmo DTW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
xiii
CAPÍTULO
1
I NTRODUCCIÓN
n los últimos años se han realizado nuevos avances revolucionarios en tecnología, es-
1
CAPÍTULO 1. INTRODUCCIÓN
Además del nivel de detalle también se ha logrado que el usuario se sienta inmerso en el
entorno tridimensional, el cual se manipula a través de dispositivos como cascos, guantes, entre
otros, que capturan la posición y rotación de las diferentes partes del cuerpo humano.
(a) Simulador de vuelo de pájaro usando Oculus Rift (b) Simulador de Fórmula 1 del equipo Mc Laren
En este caso, el campo que ha incorporado esta tecnología es el de los simuladores, tal como los
2
1.1. MOTIVACIÓN
de vuelo y los de Fórmula 1 entre los más destacados. Muchas otras disciplinas han incorporado
simuladores para realizar sus prácticas ya que el usuario puede aprender sin poner en riesgo su
vida o la de terceros, incluso poder realizar situaciones difíciles de replicar.
1.1 Motivación
Actualmente en muchas aplicaciones la interacción del usuario se está alejando del uso de
mouse, teclado o lápices ópticos, y se está convirtiendo en algo mucho más físico y tangible.
Nuevas tecnologías emergentes, permiten desarrollar y experimentar con nuevos métodos de
interacción para proporcionar una intuitiva comunicación humano-computadora.
Existen diversos trabajos académicos, comerciales y personales centrados en la interacción
del Wiimote-PC y PS3Move. Sin embargo, en el marco de la simulación de deportes como el tenis,
no se registran aplicaciones correspondientes ya que las existentes pertenecen a la categoría de
arcade.
En [7] se desarrolló un prototipo para captura de golpes de tenis. Si bien este sistema integraba
un control Wiimote y utilizaba un entorno 3D con distintos escenarios de prueba, permitiendo
reconocer distintos golpes e interactuar con objetos; el sistema es mejorable. Para ello se propone
continuar la línea iniciada con dicho trabajo buscando mejoras en la precisión de captura de
los movimientos y en la visualización de los escenarios. Además, realizar una plataforma en la
que puedan participar distintos dispositivos para la captura de los movimientos y generar una
abstracción para utilizar distintas estrategias de comparación.
1.2 Objetivo
La meta de este trabajo es diseñar una solución que mejore la detección de movimientos de la
herramienta existente aplicada en golpes de tenis. Para ello se pretende capturar movimientos
del brazo a través de dispositivos de captura [8], tales como Wiimote y PS3Move; recreando luego
el golpe en un escenario 3D virtual [9]. Básicamente la idea es desarrollar una nueva aplicación
que ofrezca más y mejores características de acuerdo a las tecnologías actuales.
Además de realizar la captura de los movimientos, la utilidad fundamental que se ofre-
ce mediante la herramienta es la posibilidad de generar un historial del jugador y realizar
comparaciones a lo largo del tiempo evaluando la evolución propia del jugador [10] o también
comparándolo con otros jugadores de su misma categoría o incluso con jugadores profesionales de
primer nivel.
Para realizar la captura de los movimientos se debieron estudiar los datos que ofrecen los
distintos dispositivos, teniendo en cuenta que difieren entre ellos en la cantidad de valores que
entregan. Cada movimiento del jugador es una lectura del dispositivo que puede ser vista como
un conjunto de puntos que recrea una curva en el espacio como se explica en [11]. Para las
3
CAPÍTULO 1. INTRODUCCIÓN
comparaciones de estas curvas, primero se debe remuestrear el conjunto para obtener datos
uniformes.
Para ello, se estudiaron diversos algoritmos para interpretar los datos y comparar los resulta-
dos obtenidos en casos de uso reales. Para realizar estas comparaciones se utiliza el algoritmo
propuesto en [8] llamado DTW (Dynamic Time Warping), el cual mide las similitudes entre dos
secuencias en las que el tiempo y la velocidad pueden variar. Se evaluaron otras alternativas
donde la precisión tome un lugar más protagónico y comparar los resultados obtenidos con los
diferentes algoritmos.
En cuanto al desarrollo del entorno tridimensional, se estudiarán distintas alternativas de
motores gráficos existentes de manera detallada. Para la simulación de las interacciones físicas
de la aplicación, también se estudiarán distintos motores de simulación de comportamiento físico
como se cita en [12] donde se pueden apreciar distintas alternativas, ya sean privativas o Licencia
Pública General (GPL).
También está la posibilidad de proveer el prototipo a las escuelas locales de tenis, con la
intención de ofrecerles una alternativa para sus entrenamientos y capacitaciones. Además, por
otra parte, podremos obtener resultados cuantitativos y cualitativos, para además saber si los
valores obtenidos de las distintas pruebas mantienen un patrón con el cual se podrán realizar
futuras comparaciones.
4
CAPÍTULO
2
M ARCO T EÓRICO
omo se viene observando en los últimos años, existe en el mercado una gran cantidad de
En los últimos años han surgido diferentes enfoques que utilizan sensores y dispositivos para
capturar los movimientos de los usuarios. Los dispositivos portátiles de mano, como guantes
sensores han sido utilizados, aunque suelen ser caros e intrusivos para los usuarios. Otros
dispositivos inalámbricos no intrusivos, como el controlador de la consola Nintendo Wii han
aparecido para superar estos inconvenientes.
Adicionalmente, otros sensores libres de contacto (es decir, aquellos en los que no es necesario
que el usuario los toque o los tenga en su mano) han aparecido para detectar movimientos, como
el sensor Leap Motion [13] que detecta movimientos de dedos o sensores para detectar gestos
corporales como el sensor Kinect [14].
En la actualidad, los gestos son utilizados en diversas aplicaciones tales como control y
navegación en CAVEs (Cave Automatic Virtual Environments) [15] y otros ambientes virtuales
como habitaciones inteligentes, ambientes virtuales de trabajo y espacios de interpretación y
actuación utilizados para efectos especiales en cine o para brindar más realidad a los personajes
de videojuegos.
5
CAPÍTULO 2. MARCO TEÓRICO
Además, otro dispositivo que está en fases finales de desarrollo es el Oculus Rift [16]. El
Oculus es un casco de realidad virtual que cuenta con una pantalla de gran resolución que se
sitúa muy cerca de los ojos. Además, contiene ciertos sensores que detectan el movimiento de la
cabeza.
Los científicos han creado, por ejemplo, para los nadadores trajes que disminuyen la fuerza de
rozamiento del agua. Otro caso, en el mundo del ciclismo, donde se crean distintos componentes
6
2.2. TECNOLOGÍA EN EL DEPORTE
Es una raqueta de tenis que cuenta con sensores que detectan las vibraciones y movimientos
de las cuerdas. Estos sensores están ubicados en el interior del mango y se pueden obtener los
datos capturados a través de un cable USB o bluetooth.
7
CAPÍTULO 2. MARCO TEÓRICO
Es una pelota de tamaño reglamentario N◦ 5 que tiene integrado unos sensores ubicados y
suspendidos en el centro de la pelota. Permiten analizar las fuerzas ejercidas sobre la pelota
mientras se desplaza.
Mediante los sensores propios de la pelota y una serie de algoritmos, provee la información
de la velocidad, la flexión, la posición del impacto pie-pelota y la trayectoria del disparo. Ésta se
envía por bluetooth a un smartphone que tenga instalada la aplicación que provee la empresa.
Los datos generados por la pelota pueden ser obtenidos únicamente mediante la aplicación,
por lo tanto, no se puede hacer ningún análisis acerca de los mismos.
8
2.3. NINTENDO WII
El sensor Wiimote [17], desarrollado por Nintendo en 2006 para su consola de videojuegos
Nintendo Wii, tiene como característica más destacada la capacidad de detectar movimientos en
tres dimensiones y apuntar a objetos en la pantalla. Tiene la particularidad de ser un dispositivo
de bajo costo.
Y como dato más relevante, este dispositivo puede de usarse con la PC conectándose vía
Bluetooth.
Se diferencia de los mandos tradicionales de consolas anteriores por tener que ser utilizado
con una sola mano.
9
CAPÍTULO 2. MARCO TEÓRICO
El control puede ser tomado de dos formas: vertical (con una mano) y horizontal (con dos
manos). Esta última está diseñada para usarse en juegos de conducción y vuelo, además de ser
usada para algunos juegos de la consola virtual. El diseño del Wiimote es simétrico, por lo que
puede tomarse tanto con la mano derecha como con la izquierda.
La cámara de tracking trabaja conjuntamente con una barra que contiene LEDs infrarrojos
en los extremos. La barra no genera ningún tipo de información hacia la consola, sino que el
dispositivo a través de la cámara de tracking realiza un cálculo trigonométrico, como se ve en la
Figura 2.6 y provee a la consola el punto en donde se encuentra apuntando. Para que esto sea
efectivo es necesario tener el Wiimote apuntando a la barra, por lo que los usuarios la sitúan
debajo o encima de su televisor.
10
2.3. NINTENDO WII
Wii Motion Plus es un accesorio que incorpora tres sensores de movimiento giroscópicos
correspondientes a los ejes vertical, longitudinal y lateral, añadiendo precisión extra al Wiimote.
En 2010 salió a la venta el Wii RemotePlus, una versión del mando que integra la tecnología
del Wii MotionPlus y hereda el tamaño del mando original la compatibilidad con todos los
periféricos de la consola.
11
CAPÍTULO 2. MARCO TEÓRICO
El Oculus Rift es un casco de realidad virtual. Contiene una serie de sensores, tales como
acelerómetros, giroscopios y magnetómetros. A partir de la versión DK2, lanzada en 2015, se
incluyó una cámara externa para trackear la posición de la cabeza del usuario. La información de
cada uno de estos sensores se combina para determinar el movimiento de la cabeza del usuario
en el mundo real y así, sincronizar la vista virtual del usuario en tiempo real.
La orientación del dispositivo se obtiene como una rotación en un sistema de coordenadas de
mano derecha como se ve en la Figura 2.9. Este sistema utiliza las siguientes configuraciones de
ejes:
12
2.4. OCULUS RIFT
• Pitch: rotación alrededor del eje X. Es positivo cuando inclina la cabeza hacia arriba.
• Yaw: rotación alrededor del eje Y. Es positivo cuando gira hacia la izquierda.
• Roll: rotación alrededor del eje Z. Es positivo cuando inclina la cabeza hacia la izquierda,
en el plano XZ.
13
CAPÍTULO 2. MARCO TEÓRICO
La Figura 2.10 muestra también el origen de tracking por defecto y el sistema de coordenadas
asociado. Aunque el eje de la cámara (y por lo tanto el tracking del frustum) se muestran inclinados
ligeramente hacia abajo, el sistema de coordenadas siempre está orientado horizontalmente, de
manera que los ejes X y Z son paralelos al suelo.
Por defecto, el origen del seguimiento de la posición está situado a 1 metro de la cámara en la
dirección del eje óptico, es decir, en el eje Z, pero con la misma altura de la cámara. La orientación
de origen por defecto es el nivel con el suelo en la dirección del eje Z negativo. En otras palabras,
la orientación corresponde con el usuario mirando hacia la cámara, a una distancia de 1 metro y
a la misma altura de la cámara.
14
2.5. MOTOR GRÁFICO: OGRE 3D
Existen una serie de conceptos mínimos que se deben comprender a la hora de trabajar con
OGRE:
• Ventanas: OGRE permite crear y configurar ventanas sobre la que se renderizarán las
imágenes del videojuego o aplicación de desarrollo. Para ello, es necesario la utilización de
una cámara. Este objeto es imprescindible ya que representa un punto de vista desde el
cual será mostrado el escenario.
• Gestor de recursos: permite leer y cargar en memoria los recursos gráficos necesarios,
organizados jerárquicamente por grupos.
• Gestor de escena: se encarga de gestionar todos los objetos que intervienen dentro de la
escena: entidades, luces, sombras, etc.
• Grafo de escena: es la estructura de datos que utiliza el motor de renderizado para gestionar
elementos dentro de la escena. Dicha estructura está formada por nodos, cada uno de
ellos representa un elemento de la escena y se encarga de gestionar las transformaciones
geométricas que sufran dichos elementos. Permite hacer optimizaciones sobre el proceso
de renderizado, de forma que se desestimen determinados nodos que no van a mostrarse
atendiendo a un criterio dado; por ejemplo, que no estén dentro del área que enfoca la
cámara (el frustum).
Un gran punto a favor del motor de renderizado OGRE es la documentación disponible ya que
cuenta con una vasta cantidad de tutoriales, foros de discusión, ejemplos y una gran comunidad
activa de desarrolladores y usuarios que contribuyen al crecimiento y actualización permanente
del motor gráfico. Esto hace que un sistema programado sobre OGRE sobreviva en el tiempo y
pueda ser extendido o modificado en el futuro.
El motor ha sido utilizado en muchos proyectos de manera exitosa, desde simuladores de
entrenamiento, videojuegos hasta aplicaciones de negocios. En la sección de Testimonios del sitio
web se detallan algunos de estos casos.
15
CAPÍTULO 2. MARCO TEÓRICO
• Si no se controlan las colisiones entre los cuerpos, éstos se atravesarían entre sí, restando
realismo.
• Parte de la mecánica de un juego o simulador puede consistir en hacer chocar unos objetos
con otros. Por ejemplo, en nuestra aplicación, la pelota debe chocar contra los ladrillos,
donde éstos deben derribarse en la ejecución del ejercicio de potencia.
• Puede ser necesario modelar propiedades físicas. Por ejemplo, en nuestra aplicación, es
necesario configurar el coeficiente de restitución de la pelota, el cual indica una medida del
grado de conservación de la energía cinética en una colisión.
Existen varios motores físicos disponibles para uso libre o comercial. Entre los más reconocidos
se pueden mencionar a Newton Game Dynamics, Open Dynamics Engine, Bullet Physics Library,
Havok y PhysX. Adicionalmente, Bullet Physics Library[21] es uno de los motores físicos más
reconocidos y ampliamente utilizados en videojuegos comerciales, películas y aplicaciones de
diseño. En el sitio web se muestran muchos casos de uso exitoso del motor.
El elemento más importante en Bullet es el World. El World dentro de Bullet tiene varias
responsabilidades, entre las que se puede destacar:
• Servir como estructura de datos donde almacenar los cuerpos físicos que lo conforman y
aplicar una serie de restricciones a estos cuerpos, como la fuerza de gravedad.
Un cuerpo físico comprende dos categorías. El primero es cuerpo rígido y el segundo, cuerpo
blando. Un cuerpo rígido se caracteriza por tener una forma inmutable. Si se aplica alguna fuerza
16
2.6. MOTOR FÍSICO: BULLET PHYSICS
sobre un cuerpo rígido, su forma no variará. En contrapunto, los cuerpos blandos se caracterizan
por tener formas de colisión que pueden variar cuando se aplica una fuerza sobre éstas. Los
cuerpos rígidos tienen comportamientos menos realistas que los cuerpos blandos; sin embargo,
simular un cuerpo blando es computacionalmente más complejo que simular un cuerpo rígido,
debido a las implicaciones que tiene la variabilidad de su forma física.
Los cuerpos físicos cuentan con una forma de colisión. Típicamente, una forma de colisión suele
ser un cuerpo convexo con unas determinadas propiedades en función de su forma geométrica,
un coeficiente de fricción, de restitución, una inercia, etc. Bullet ofrece unas cuantas formas
primitivas de colisión, que pueden ser simples o complejas. Entre las primitivas simples se
encuentran cajas, planos, cilindros y esferas.
A su vez, ofrece formas de colisión más complejas, pudiendo combinar múltiples formas
convexas en una única. El costo de detección de colisiones para primitivas complejas es mucho
más complejo que para primitivas simples, aunque el grado de realismo alcanzado es mucho
mejor. El usuario es el responsable de establecer la correspondencia entre los objetos 3D y sus
representaciones físicas. Cada objeto visual tendrá su correspondencia en el mundo físico, o no,
según sea necesario para la lógica de la aplicación.
Bullet interpreta que un cuerpo con una masa de 0 kg es un cuerpo que no interacciona con
ninguna fuerza, es decir, permanecerá inamovible en su posición y orientación inicial, por lo que
será un cuerpo estático. De lo contrario, un cuerpo con masa mayor a 0, será un cuerpo dinámico.
Una de las formas de colisión complejas que se utilizará en la aplicación, además de las
primitivas simples, será btBvhTriangleMeshShape. La clase crea una forma de colisión estática a
partir de la geometría de la malla de la entidad de Ogre3D. De esta forma, podemos crear una
representación física donde el volumen de colisión es idéntico al objeto 3D, es decir, el cuerpo
físico comparte la forma geométrica del objeto 3D. Es importante destacar que un cuerpo estático
está pensado para colisionar contra cuerpos dinámicos, y nunca contra otros cuerpos estáticos.
17
CAPÍTULO
3
D ISEÑO E I MPLEMENTACIÓN
3.1 Introducción
19
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
• Devices: En éste se implementó una clase que administra los dispositivos conectados, las
clases de los distintos dispositivos con los respectivos métodos para realizar la conexión/-
desconexión con la PC y la captura de los datos.
• Model: En este módulo se implementaron las clases correspondientes para organizar los
datos capturados.
• Strategies: Aquí se implementan los distintos algoritmos para realizar las comparaciones
de los golpes.
Cada uno de estos módulos se explicarán a lo largo del capítulo. A continuación se muestra en
la Figura 3.2, un diagrama de flujo de los diferentes módulos.
20
3.2. VISTA GENERAL DEL SISTEMA
Tal como se muestra en la Figura, el sistema comienza por el Módulo Devices con la conexión
de los dispositivos con la PC. Una vez establecido el enlace se procede a la captura de los datos
que genera el usuario y se almacenan siguiendo la estructura implementada en el Módulo Model.
Por último, se utiliza el Módulo Strategies para realizar la comparación entre los golpes.
Es importante que la plataforma sea capaz de poder utilizar nuevos dispositivos que asistan
al entrenamiento deportivo, aún cuando éstos puedan ser mejores, peores o diferentes a los ya
utilizados. Lo importante en este módulo es la capacidad de agregar un nuevo dispositivo al
sistema con el menor esfuerzo.
Entonces para realizar la administración de los dispositivos se diseñó e implementó el Módulo
Devices, basándonos en el atributo de calidad Extensibilidad [22]. Como se puede observar en la
Figura 3.3 se implementó una clase abstracta llamada IDevice que provee la extensibilidad de
agregar nuevos dispositivos a la aplicación.
3.2.1.1 DeviceManager
21
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
nos confirma un punto de acceso global a la única instancia de esa clase y por tanto a toda su
funcionalidad.
3.2.1.2 DeviceWiimote
Se creó la clase DeviceWiimote para que la plataforma soporte el dispositivo Wiimote. Esta
clase implementa los métodos que fueron declarados como abstractos en IDevice. Como el disposi-
tivo en cuestión tiene características y comportamientos propios, como es el caso de los sensores,
se tomó la decisión de crear un módulo aparte, llamado Módulo Wiimote, para administrar de
manera más ordenada y eficiente el dispositivo.
22
3.2. VISTA GENERAL DEL SISTEMA
23
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
de ser así, finaliza el método encendiendo las luces led del dispositivo Wiimote. Sino, vuelve a
intentarlo.
A partir de que la conexión del dispositivo está establecida, los sensores se encuentran
funcionando todo el tiempo; por ende, están capturando valores. Entonces, se necesita que cuando
el usuario desee cargar un nuevo golpe se genere un evento donde se identifique el comienzo, y
luego también un evento donde indique la finalización correspondiente.
Para la implementación de la captura de los gestos se ha realizado de una manera similar a
la conexión de los dispositivos. Dicha implementación se ha realizado utilizando la funcionalidad
orientada a eventos. En la Figura 3.7, se muestra particularmente cómo se capturan los gestos
mediante el dispositivo Wiimote.
La captura del gesto comienza mediante un evento, llamado StartAsyncCaptureStroke, que se
invoca desde la interfaz visual al objeto IDevice. Este método es ejecutado dentro de un hilo t1,
que crea un nuevo hilo t2.
Luego, mediante una pre-configuración se selecciona la cantidad de gestos a capturar. Enton-
ces, según esta configuración se invoca esa cantidad de veces al método CaptureStroke propio
del dispositivo que se encuentre conectado, DeviceWiimote en este caso, como se refleja en el
diagrama.
El proceso de captura del gesto comienza y termina mediante un evento que se definió con el
botón B del Wiimote. Éste se inicia cuando se oprime y termina cuando se suelta. Mientras el
botón se encuentre presionado, el dispositivo capturará los valores de cada uno de los sensores.
Cuando se suelta el botón se devuelve un objeto Stroke que contiene los valores capturados de
esa muestra.
24
3.2. VISTA GENERAL DEL SISTEMA
Figura 3.7: Diagrama de secuencia de la captura de los gestos mediante el dispositivo Wiimote
También como hemos hecho en la clase Device Wiimote, se implementaron los métodos que se
encontraban abstractos en la interfaz IDevice. Si bien es una extensión del dispositivo Wiimote
posee ciertas diferencias como, por ejemplo, la conexión del dispositivo con la PC.
Otra de las diferencias es al momento de dar de alta el objeto, donde se deben especificar las
características correspondientes al WiiMotionPlus, que además de tener los sensores aceleró-
metros, cuenta con los sensores giróscopos a los que debe configurarles el nombre, el rango de
valores que aceptan los nuevos sensores y también la agrupación por tipo de sensor. Por lo tanto,
el método de captura deberá considerar también los giróscopos e ir almacenando los valores que
capturen.
Todas estas características se explican mejor en la sección 3.2.1.4 perteneciente a la configu-
ración particular de cada dispositivo.
25
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
El método IsConnected requiere que tanto el dispositivo como su extensión estén conectados,
si al menos alguno de ellos pierde la conexión entonces la función indicará que no está conectado.
3.2.1.4 Properties
Se creó la clase Properties para definir las propiedades de los dispositivos. Esta clase contiene
el nombre del dispositivo, la configuración y la cantidad de sensores que lo componen. A cada uno
de los sensores se le debe definir el rango de valores que es capaz de reconocer.
1 Wiimote : : Wiimote ( void ) : IDevice ( " wiimote " ) {
2 [ ... ]
3 vector < P r o p e r t i e s : : Sensor * > * sensors = new vector < P r o p e r t i e s : : Sensor * >(3) ;
4 sensors −>at ( 0 ) = new P r o p e r t i e s : : Sensor ( " A c e l e r a c i o n en X" , − 6.0 , 6 . 0 ) ;
5 sensors −>at ( 1 ) = new P r o p e r t i e s : : Sensor ( " A c e l e r a c i o n en Y" , − 6.0 , 6 . 0 ) ;
6 sensors −>at ( 2 ) = new P r o p e r t i e s : : Sensor ( " A c e l e r a c i o n en Z" , − 6.0 , 6 . 0 ) ;
7 P r o p e r t i e s : : GroupSensors * groupAccel = new P r o p e r t i e s : : GroupSensors ( ) ;
8 groupAccel −>groupName = " Acelerometros " ;
9 groupAccel −>indexs . push_back ( 0 ) ;
10 groupAccel −>indexs . push_back ( 1 ) ;
11 groupAccel −>indexs . push_back ( 2 ) ;
12 groupAccel −>ponderation = 1 . 0 ;
13
14 vector < P r o p e r t i e s : : GroupSensors * > * groups = new vector < P r o p e r t i e s : : GroupSensors * >(1) ;
15 groups −>at ( 0 ) = groupAccel ;
16 S e t P r o p i e r t e s ( new P r o p e r t i e s ( " Wiimote " , sensors , groups ) ) ;
17 }
26
3.2. VISTA GENERAL DEL SISTEMA
También es posible agruparlos por tipo de sensor, por ejemplo, los sensores acelerómetros estarán
dentro del mismo conjunto y los sensores giróscopos en su grupo correspondiente.
En el Algoritmo 3.1 se puede ver cómo se realiza la configuración de las propiedades para
el dispositivo Wiimote. Primero, se crea cada sensor, se define el nombre correspondiente y el
rango de aceptación para sus valores. Luego, se puede ver cómo se define un grupo llamado
Acelerómetros al que se le asignan los sensores anteriormente declarados.
Por último, se puede observar que al grupo de los acelerómetros se le configura una pondera-
ción en 1 porque es el único grupo que existe. Esta ponderación será utilizada luego para realizar
las comparaciones en el Módulo Strategies.
A continuación, se observa el Algoritmo 3.2 para configurar las propiedades del dispositivo
WiiMotionPlus. A diferencia del algoritmo anterior, en este caso se cuenta con dos grupos de
sensores. Por un lado, están los acelererómetros y por otro, los giróscopos.
En el Algoritmo 3.2 se puede ver antes de la línea 5 se realiza la configuración del dispositivo
Wiimote. Luego, a partir de esa línea se definen los sensores correspondientes al grupo de los
giróscopos, como se hizo el grupo de acelerómetros. Por último, se realiza la ponderación para cada
grupo en 0.5. Por lo tanto, cada grupo tendrá el mismo peso cuando se realicen las comparaciones.
1 WiiMotionPlus ( void ) : IDevice ( " wiimotionplus " ) {
2 [ ... ]
3 vector < P r o p e r t i e s : : Sensor * > * sensors = new vector < P r o p e r t i e s : : Sensor * >(6) ;
4 [ ... ]
5 sensors −>at ( 3 ) = new P r o p e r t i e s : : Sensor ( "Yaw" , − 2050.0 , 2 0 5 0 . 0 ) ;
6 sensors −>at ( 4 ) = new P r o p e r t i e s : : Sensor ( " Pitch " , − 2050.0 , 2 0 5 0 . 0 ) ;
7 sensors −>at ( 5 ) = new P r o p e r t i e s : : Sensor ( " R o l l " , − 2050.0 , 2 0 5 0 . 0 ) ;
8
16 vector < P r o p e r t i e s : : GroupSensors * > * groups = new vector < P r o p e r t i e s : : GroupSensors * >(2) ;
17 groups −>at ( 0 ) = groupAccel ;
18 groups −>at ( 1 ) = groupGyros ;
19
27
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
Para poder administrar los datos que reconocen los dispositivos es necesario encapsularlos de
manera adecuada para que estén ordenados. Se debe considerar la idea que el dispositivo está
compuesto por una cierta cantidad de sensores y que éstos están continuamente captando valores
sin la capacidad de diferenciar el comienzo y el fin de un gesto.
Como se dijo anteriormente, los sensores se encuentran obteniendo valores continuamente;
sin embargo, se quiere capturar desde que el usuario inicia su golpe hasta que lo termina. Por
ello es que la captura del golpe comienza cuando el usuario oprime un botón y cuando lo suelta,
finaliza la captura.
28
3.2. VISTA GENERAL DEL SISTEMA
analizarlos se creó la clase Profile, que contendrá sus Templates, la información personal y la
información física.
3.2.2.1 ValueStroke
Como podemos ver en la Figura 3.11 en el método constructor se debe poner el valor correspon-
diente a la cantidad de sensores del dispositivo. Además, tenemos un método para modificar cada
uno de los valores del ValueStroke llamado SetValue y otro, para obtenerlos mediante GetValue.
También podemos saber de qué tamaño es la estructura a través del método GetAmount.
En el siguiente Algoritmo 3.3 se puede observar cómo la clase Wiimote se encarga de realizar
la captura del golpe. Este método se encarga de capturar todos los valores correspondientes al
golpe mientras el usuario lo desee, por ejemplo, para el caso del dispositivo Wiimote mientras
mantenga apretado el botón B. Mientras tanto, creará un objeto ValueStroke que le asignará los
valores correspondientes de cada sensor en ese momento.
1 Stroke * CaptureStroke ( ) {
2 Stroke * s t r o k e = new Stroke ( ) ;
3 while ( mWiimoteManager−>IsPressedButton ( "BUTTON_B" ) ) {
4 ValueStroke * value = new ValueStroke ( 3 ) ;
5 value −>SetValue ( 0 , mWiimoteManager−>W i i A c c e l e r a t i o n . x ) ;
6 value −>SetValue ( 1 , mWiimoteManager−>W i i A c c e l e r a t i o n . y ) ;
7 value −>SetValue ( 2 , mWiimoteManager−>W i i A c c e l e r a t i o n . z ) ;
8 stroke −>AddStrokeValue ( value ) ;
9 }
10 return s t r o k e ;
11 }
29
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
3.2.2.2 Stroke
Una vez que se haya capturado el golpe, compuesto por una cantidad de muestras, a las que
llamamos anteriormente ValueStroke, se debe almacenar dentro de una estructura que lo soporte.
Esta estructura es una clase a la que llamamos Stroke.
Si bien puede creerse que lo más importante del golpe son sus muestras ya que sin ellas no
existe golpe; también, es importante darle un contexto. Para ello se debe definir un nombre, saber
a partir de qué dispositivo fue capturado, o también decir de qué tipo es.
Por las razones que se explicaron anteriormente se implementó esta funcionalidad dentro de
esta clase.
Cabe destacar que particularmente en el tenis, de un golpe a otro puede variar tanto su
velocidad como su trayectoria. Por ejemplo, comparemos el golpe conocido como smash con un
golpe llamado globo. El primero es un golpe que se inicia colocando la raqueta por encima de
la cabeza de manera vertical para impactar a la pelota y que golpee directamente en el piso
de forma rápida y potente generando una trayectoria lo más recta posible. En cambio, el globo
comienza con la raqueta por debajo de la cintura impactando desde abajo hacia arriba y con una
potencia mucho menor que la del smash.
Otro ejemplo, es comparar un drive con un revés. Entonces los valores obtenidos por los
sensores serán muy distintos entre sí. Por eso es que se debe dar más contexto al golpe que se
realiza.
Como mencionamos anteriormente nuestro objeto Stroke contiene una lista en la que se
guardan las diferentes muestras que fueron capturadas para el golpe. El golpe debe tener
30
3.2. VISTA GENERAL DEL SISTEMA
un nombre, una variable donde se diga la cantidad de muestras que debería tener y con qué
dispositivo fue capturado.
3.2.2.3 Template
A partir del desarrollo que se fue contando hasta el momento, se puede capturar los golpes
con sus respectivas muestras. El objetivo principal de estos golpes capturados es compararlos.
Para ello es que creamos una clase llamada Template que guardará los golpes capturados
por el usuario. Esta clase sirve para generar un patrón a patir de los gestos que componen el
Template; en este caso, como la aplicación se centró en el deporte tenis estos gestos van a ser
golpes propios del deporte.
Además, esta forma de generar templates permite al usuario cargar una cantidad de golpes
significativa, realizados de la misma manera, y si por cierta razón uno de ellos no es efectuado de
forma similar no afectará a la posterior comparación.
Como vemos en la Figura 3.13, también es necesario describir con qué dispositivo se va a
realizar la captura de los diferentes golpes que comprenden el Template. Además, es importante
que el Template tenga su nombre y que éste sea descriptivo para facilitarle al usuario una
búsqueda más rápida. También el Template tiene asignado un perfil, explicado posteriormente.
3.2.2.4 TemplateTools
Como se dijo, la idea es poder comparar un golpe contra otro. Por ello es que se generó una
clase que se llama TemplateTools. Ésta tiene diversos mecanismos para tratar a los templates,
como, por ejemplo, a partir de un template obtener la curva máxima generada a partir los valores
máximos de los golpes para cada instante. También se puede obtener el promedio de un template,
es decir, obtener un golpe que sea el promedio de todos los golpes dentro del template. Se han
implementado los métodos para obtener el desvío estandar, tanto el superior como el inferior.
Uno de las principales funcionalidades implementadas en esta clase es el método llamado
ResamplingStroke, que genera una normalización del golpe dado el número de muestras preten-
31
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
dido. En caso de que el golpe tenga más muestras que el valor sugerido se procede, mediante el
criterio propuesto, a eliminar algunas hasta alcanzar ese valor. Caso contrario, se deben agregar
muestras. Tanto quitar como agregar muestras hace que el golpe no sea exactamente el mismo,
por eso es que se realiza una interpolación lineal para generar una independencia de la cantidad
de muestras, y que quitar o agregar no termine modificando la esencia del golpe. También se ha
implementado el método ResamplingTemplate, que realiza la misma normalización anteriormente
descripta pero aplica a todos los golpes que contiene el Template.
Todas estas funcionalidades descriptas se van a utilizar luego en las diferentes estrategias de
comparación.
3.2.2.5 DataManager
A partir de la generación de diferentes Templates y Strokes, decidimos que sería una buena
decisión proveerle al usuario la posibilidad de poder almacenarlos físicamente mediante archivos.
Esta solución hace que los golpes y templates permanezcan no sólo en la ejecución de la aplicación
sino también poder utilizarlos en otra ejecución, o en otro momento o también, si se copian esos
archivos, hasta en otra computadora.
Mediante archivos de tipo CSV, que se utilizan en diversas áreas para la representación de
tablas de manera sencilla, ya que los separa por fila y para separarlos por columna agrega un
separador que puede ser una coma, o punto y coma.
Entonces, si podemos guardar esos archivos de manera ordenada también podemos leerlos.
Pero, además de guardar los datos que fueron capturados por el dispositivo tenemos que guardar
información del Template o del Golpe, como su nombre, su tipo y demás descripciones que
comentamos en cada una de las secciones correspondientes.
32
3.2. VISTA GENERAL DEL SISTEMA
3.2.2.6 Profile
El tenis es un deporte en el que hay atributos físicos del jugador que influyen de manera
drástica en el desenvolvimiento en el juego. El atributo más significativo es la mano hábil, donde
un jugador la utiliza para tomar la raqueta y realizar los golpes. La raqueta es un objeto que se
puede tomar con cualquiera de las manos, y los golpes se realizan de la misma manera con ambas
manos, diferenciando el perfil. Además existen otros atributos, como la edad del jugador, el peso,
la altura.
A partir de estas características se llevó a cabo la implementación de una clase llamada
Profile, que administrará los Template asociados a cada jugador.
33
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
3.2.2.7 AppManager
Esta clase está implementada utilizando el patrón Singleton ya que sólo existirá una ins-
tancia durante toda la ejecución. Además, debe ser accesible desde diversos procedimientos
pertenecientes a otros objetos.
La clase cargará las distintas configuraciones iniciales que usará la aplicación y se encargará
la administración de los perfiles. Además, proveerá la funcionalidad de obtener los perfiles que
existan dentro del directorio de trabajo como así también agregará y guardará nuevos perfiles.
Además, facilita la administración de los golpes, desde la captura de uno nuevo, el guardado y la
carga de uno anteriormente capturado.
34
3.2. VISTA GENERAL DEL SISTEMA
Comparación de gestos
Para poder evaluar a los jugadores es necesario poder comparar sus golpes. Frente a esta
necesidad se introducen las estrategias de comparación entre golpes y templates.
En este módulo se centralizan las distintas estrategias comparativas. Diseñado e implemen-
tado pensando en la posibilidad de agregar nuevas estrategias a lo largo del desarrollo y en un
futuro también, se realizó una interfaz de la que se extiendan las nuevas estrategias.
La comparación se realiza comparando dos curvas. Estas curvas pueden proceder desde
distintos golpes; donde cada golpe estará representado por curvas generadas por los sensores del
dispositivo de captura. También es posible que una de las curvas, o ambas, procedan a partir de
templates. Como los golpes capturados difieren en la cantidad de muestras según cuánto tiempo
duró la captura, es necesario para realizar la comparación que ambas curvas tengan la misma
cantidad de muestras y estén comprendidas en el mismo espacio temporal, por lo que es necesario
realizar una normalización de alguna de ellas con respecto a la otra.
Las diferentes estrategias implementadas son las siguientes:
• Estrategia DTW
• Estrategia Inside
3.2.3.1 Strategy
Al plantear el uso de, al menos, dos estrategias es necesario proveer una clase abstracta, el
cual tenga métodos pasibles de redefinirlos de acuerdo a las necesidades. Esta clase contiene
atributos que son comunes a las estrategias y existe al menos la implementación de uno de sus
métodos.
En la Figura 3.18 podemos observar que el método Execute se encuentra sin implementar y
las clases que extiendan de IStrategy lo deberán implementar. Sin embargo, el método GetAverage
se encuentra implementado por esta clase.
35
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
También podemos observar que se han declarado unas variables. Éstas pertenecen a valores
que se usan dentro del método de GetAverage, pero que tienen un valor válido cuando se carga un
nuevo template.
3.2.3.2 StrategyDTW
Lo anterior se puede apreciar gráficamente en la Figura 3.19, donde se representan dos series
con la misma forma general. En la parte superior se muestra el alineamiento que produce la
distancia euclidiana, el punto i-ésimo de la primera con el i-ésimo de la segunda. En la parte
36
3.2. VISTA GENERAL DEL SISTEMA
inferior se muesta un alineamiento no lineal, que permite una medida de similaridad más
sofisticada [24].
El algoritmo DTW (Dynamic Time Warping) se utiliza en nuestro sistema para medir la
similitud de los gestos realizados por el usuario, que pueden diferir en tiempo y espacio. Esta
comparación puede ser mediante un gesto que realice (gesto de test) contra otro previamente
almacenado o contra un conjunto de golpes que definimos como template (gesto de referencia).
Para realizar la comparación mediante DTW se analiza cada serie de datos generada por los
sensores del dispositivo. Por ejemplo, para la comparación de un gesto de test contra un gesto de
referencia, ambos capturados con el dispositivo Wiimote, se analizan las curvas que describen
las aceleraciones en el eje X, luego en el eje Y y finalmente en el eje Z. Se utiliza como criterio
cuantitativo para la comparación entre cada par de curvas, la suma de las distancias del camino
óptimo que recorre la matriz de distancias acumuladas de más bajo costo, obtenido al finalizar el
algoritmo DTW implementado en A.1. En resumen, en cada comparación se ejecuta el algoritmo
DTW tantas veces como número de sensores tiene el dispositivo de captura de los gestos.
En la comparación de un golpe (gesto de test) contra un template utilizando DTW, se utiliza
el golpe promedio del template como gesto de referencia. La ejecución del algoritmo retornará la
distancia entre los gestos alineados en el tiempo. Luego para determinar si el gesto de test es
"similar" al gesto de referencia, cada uno de los valores DTW obtenidos deberá estar por debajo
de un valor límite. Ese valor puede ser obtenido de las siguientes maneras:
• A partir de las curvas mínimas y máximas del template, y para las curvas generadas
por cada sensor del dispositivo de captura, se calcula el valor límite utilizando distancia
euclídea o DTW.
• A partir de los desvíos superior e inferior del template, y para las curvas generadas por cada
sensor del dispositivo de captura, se calcula el valor límite utilizando distancia euclídea o
DTW.
37
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
el tipo de curva límite que se usará en la búsqueda del valor límite, ya sea desvío superior y
desvío inferior o máximos y mínimos.
3.2.3.3 StrategyInside
La técnica utilizada en esta ocasión es más sencilla que la anterior en cuanto a su imple-
mentación. Se trata de un algoritmo que fue diseñado e implementado desde cero contemplando
nuevas estrategias y puntos de vista para realizar la comparación.
Se basa en la generación de dos curvas, una a la que llamaremos Inferior y la otra Superior.
La curva Inferior se construye a partir del conjunto de muestras que tiene el template. Para cada
instante de la curva, a partir del subconjunto obtenido de las muestras según un instante de
tiempo, se selecciona el menor de ellos. Para la generación de la curva Superior se mantiene la
misma lógica con la variación de que se busca el mayor valor.
Luego, con estas dos curvas ya calculadas se genera un canal de aceptación, es decir, para
cada instante de la curva existe un intervalo que se encuentra entre la curva Superior e Inferior.
El algoritmo comprobará, para cada instante de tiempo, si el valor de la muestra se encuentra
dentro del canal de aceptación. En este sentido, el porcentaje de similitud estará dado por la
cantidad de muestras incluidas dentro del canal de aceptación, dividido por la cantidad total.
No obstante, también es posible considerar el valor de la muestra como contenido dentro de
estas curvas sin que realmente sea así. Esto es posible dado que existe un margen de error que
hace que este punto sea aún considerado. El margen de error extiende el intervalo de aceptación.
Si el valor de la muestra no se encuentra dentro del canal, entonces mediante la extensión del
valor límite se calculará un porcentaje de alejanía entre la muestra y el límite, teniendo en cuenta
el margen de error establecido. El Algoritmo 3.4 implementa esta lógica.
38
3.2. VISTA GENERAL DEL SISTEMA
6 / / Calculo l a extension d e l i n t e r v a l o
7 double margin = ( upper − lower ) * mMarginOfError ;
8
Figura 3.21: Esquematización del canal de aceptación y los intervalos extendidos para un margen
de error del 50 % de la estrategia Inside
39
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
se encontrará dentro del intervalo de error izquierdo, de acuerdo a la Figura 3.21. El porcentaje
de alejanía es del 66,66 %, por ende el coeficiente de inclusión será 0,33.
Si se modifica el margen de error al 25 %, entonces los rangos de los intervalos laterales del
canal de aceptación serán de 1,5 unidades (Figura 3.22). El valor 1 de la muestra no estará dentro
del intervalo de error izquierdo, a diferencia de la configuración con un margen de error de 50 %.
En tal caso, el coeficiente de inclusión será 0.
Figura 3.22: Esquematización del canal de aceptación y los intervalos extendidos para un margen
de error del 25 % de la estrategia Inside
De esta manera, el porcentaje de similitud estará dado por la suma de los coeficientes de
inclusión de los valores de las muestras en cada instante de tiempo, dividido por la cantidad de
muestras total.
40
3.2. VISTA GENERAL DEL SISTEMA
3.2.4 ResultStrategy
Como cada una de las estrategias maneja diferentes mecanismos de comparación es necesario
mostrar sus resultados aunque difieran en su estructura. Para ello, la forma de mostrar y generar
los resultados de forma ordenada es crear una estructura extensible mediante el uso de una
interfaz. En este caso, la clase ResultStrategy es quien contiene los atributos y métodos comunes
de las clases generadoras de resultados de las estrategias.
Además, este diseño extensible y modificable posibilita en un futuro agregar nuevas es-
trategias con sus resultados acordes a su formato de manera que implique el menor esfuerzo
posible.
Esta clase contiene el Golpe y el Template que se desean comparar y un vector que se
utilizará para ir almacenando los resultados parciales. También contiene los métodos que obtienen
los resultados de las estrategias. Estos últimos serán generados por las clases de estrategias
correspondientes a cada una.
En el Algoritmo 3.5 se puede observar la abstracción que se ha identificado, en la que se
desarrolla operaciones donde intervienen sólo el Golpe y el Template.
41
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
3.2.4.1 ResultStrategyDTW
Como mencionamos anteriormente, cada estrategia tiene su forma de guardar los datos,
por ello es que para la estrategia DTW hay que generar los resultados. Esta clase se encarga,
mediante las configuraciones estipuladas y obtenidas, de generar los resultados para la aplicación.
3.2.4.2 ResultStrategyInside
42
3.2. VISTA GENERAL DEL SISTEMA
Para la estrategia StrategyInside se debe hacer lo mismo con la presentación de los resultados.
En este caso, se declara la variable que guarda la configuración para el margen de error elegido y
la variable que se usó en la ejecución de la estrategia de comparación donde almacena el tipo de
curvas límites.
A continuación en el segmento del Algoritmo 3.6 podemos observar cómo se arma el Resul-
tStrategyInside mientras se va ejecutando la estrategia. Una vez finalizada la comparación que
realiza esta estrategia, el método retorna el objeto con los valores del resultado de la ejecución.
1 ResultStrategy * S t r a t e g y I n s i d e : : Execute ( Template * _template , Stroke * s t r o k e ) {
2 ...
3 R e s u l t S t r a t e g y I n s i d e * r e s u l t = new R e s u l t S t r a t e g y I n s i d e ( _template , strokeToCompare ,
mUseLimitCurve , mMarginOfError ) ;
4
43
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
Con la intención de seguir el patrón Model View Controller, para hacer que la vista sea un
reflejo de lo que el modelo representa se debe administrar mediante el módulo Controller. Este
módulo conecta la vista con el modelo mediante eventos. Este tipo de eventos se realizó por medio
del patrón de diseño Command que se explicará a continuación.
Para conectar la lógica, en donde intervienen los diferentes módulos, con la interfaz se ha
pensado en realizarla mediante el patrón de diseño Command [22]. Este patrón permite:
• Guardar las solicitudes en una cola para ir ejecutándose en orden y sin que se pierda
ninguna
Como en nuestra interfaz de usuario, esperamos que se puedan realizar múltiples acciones
para mantener los atributos de calidad que venimos usando los que hacen que nuestro sistema sea
mantenible y modificable. Para esto se crea una interfaz para que cada comando se reimplemente.
El método execute de la Figura 3.28 es el que se debe implementar en cada una de las clases
que correspondan a comandos.
A continuación enunciaremos algunas de las clases implementadas extendiendo de la interfaz
Commnad:
44
3.2. VISTA GENERAL DEL SISTEMA
Manteniendo los mismos conceptos de diseño que se han utilizado a lo largo del trabajo y
cómo se deben mostrar una cantidad significativa de gráficos, se realizó una estructura que pueda
ser extensible y modificable.
Recordemos que tenemos diferentes configuraciones a las que tenemos que representar, como
son los golpes y los templates. También tenemos que graficar los diferentes resultados de las
distintas estrategias.
Se diseñó e implementó una clase padre en la que se sitúan los comportamientos comunes a
las clases hijas. A continuación en la Figura 3.29 podemos observar la declaración de las variables
y los métodos de la clase padre ChartHandler.
45
CAPÍTULO 3. DISEÑO E IMPLEMENTACIÓN
Como se dijo anteriormente, se deberán mostrar cuatro tipos de gráficos. Estos son:
• Golpe
• Template
Por ello, para cada uno de estos gráficos se debe crear una clase en la que se realicen los
procedimientos de armado y muestreo de los mismos.
En la Figura 3.30 se observa la herencia de las clases ChartHandlerViewStroke, Chart-
HandlerViewTemplate, ChartHandlerViewStrategyDTW y ChartHandlerViewStrategyInside. Se
aprecia también la implementación de los métodos que habían sido declarados como abstractos
en la clase padre tales como CreateSeries, GetNumberOfChartsToDisplay y GetTitle.
46
3.3. DIAGRAMA DE CLASES DEL SISTEMA
47
CAPÍTULO
4
I NSTANCIACIÓN
4.1 Introducción
andil se ha convertido en los últimos años como la principal cuna de tenistas debido
T a exitosos jugadores como Máximo González, Juan Mónaco, Juan Martín del Potro y
Mariano Zabaleta, entre los más destacados. Por esta razón, muchos jóvenes de distintas
partes del país e incluso del extranjero se acercan a tomar clases en la ciudad de Tandil. En base
a esto, surgió la posibilidad de proveer un sistema de asistencia al entrenamiento a las escuelas
locales de tenis.
Se desarrolló un sistema que cuenta con dos módulos principales. El primero es un módulo
llamado Editor de Perfiles, que permite que cada usuario tenga su propio perfil en el que puede
capturar sus golpes, almacenarlos y realizar comparaciones con templates. El segundo módulo
denominado Visualizador 3D, se encarga de recrear escenarios virtuales de entrenamientos,
renderizando las escenas, administrando el manejo del comportamiento físico de los objetos
involucrados, la interacción con los dispositivos, la vinculación con el Editor de Perfiles, etc.
En las siguientes secciones se detallarán las principales funcionalidades de los módulos del
sistema y cómo interactúan entre ellos.
Este componente de software es una aplicación de escritorio que encapsula la lógica referida
a la administración de golpes y perfiles de usuario, incluyendo: definición de tipos de golpes,
generación de nuevos templates con un dispositivo en particular, comparación y reconocimiento
de golpes mediante la utilización de algoritmos específicos. Además, provee la visualización de los
datos capturados y la de los resultados de las comparaciones.
49
CAPÍTULO 4. INSTANCIACIÓN
La Figura 4.1 corresponde a la primer pantalla de la aplicación desde que se inicia. Cuenta
con un menú principal donde se pueden acceder a las diferentes funcionalidades que ofrece la
aplicación. En la parte inferior se encuentra una franja naranja que describe el estado de la
conexión de los dispositivos.
Como se ve en la Figura 4.1, la aplicación está dividida en tres columnas. La columna de
la izquierda mostrará la información correspondiente al perfil seleccionado, tanto información
personal como la de sus templates. En la parte inferior de la columna se puede capturar o
seleccionar un golpe para compararlo o reconocerlo entre los templates del perfil. Tanto los
templates como el golpe tienen un botón en la derecha que permite visualizar los valores de los
sensores del dispositivo de captura, en los gráficos que se encuentran en la columna derecha de la
aplicación.
Una vez seleccionados el template y el golpe es posible realizar la comparación mediante
el algoritmo que se selecciona en la columna central. Luego de ejecutarse esta estrategia, esta
última arroja los resultados correspondientes. A su vez, en la zona baja de la columna central,
la ejecución de la estrategia seleccionada retornará el template de mejor coincidencia con el
golpe seleccionado. De igual manera, los resultados de las ejecuciones se podrán visualizar en los
gráficos de la columna derecha.
50
4.2. APLICACIÓN EDITOR DE PERFILES
La inclusión de perfiles surge ante la necesidad de que cada usuario posea un perfil con su
propia base de golpes, pudiendo definir la cantidad de golpes deseados y, a su vez, la posibilidad
de realizar reconocimientos o comparaciones contra golpes de otros usuarios.
En primer lugar, para cargar un nuevo perfil se implementó un formulario que se corresponde
con las variables que componen la clase Profile. Como se implementó siguiendo el patrón Com-
mand [22], existe un comando que se encarga de dar de alta a un nuevo perfil. Este comando es
NewProfile que implementa la interfaz Command.
Como se ve en el Algoritmo 4.1, desde este comando se crea el formulario NewProfileForm.
Una vez que el usuario presiona el botón Aceptar se procede a obtener los valores de cada
componente del formulario y generar con ellos una instancia de Profile. Luego, la instancia creada
se agrega al administrador de la aplicación AppManager.
1 v i r t u a l void NewProfile : : Execute ( ) o v e r r i d e {
2 NewProfileForm^ mForm = gcnew NewProfileForm ( ) ;
3 DialogResult r e s u l t = mForm−>ShowDialog ( ) ;
4 i f ( r e s u l t == DialogResult : :OK) {
5 ResultNewProfile^ r e s u l t P r o f i l e = mForm−>GetResult ( ) ;
6 AppManager * appManager = AppManager : : GetSingletonPtr ( ) ;
7 s t r i n g firstName = r e s u l t P r o f i l e −>firsName ( ) ;
8 s t r i n g lastName = r e s u l t P r o f i l e −>lastName ( ) ;
9 P r o f i l e : : Sex sex = r e s u l t P r o f i l e −>sex ( ) ;
10 P r o f i l e : : SkillfulHand s k i l l f u l H a n d = r e s u l t P r o f i l e −>s k i l l f u l H a n d ( ) ;
11 P r o f i l e : : Birthdate b i r t h d a t e = r e s u l t −>b i r t h d a t e ( ) ;
12 f l o a t height = r e s u l t P r o f i l e −>height ( ) ;
13 s t r i n g * imageLocationAvatar = r e s u l t P r o f i l e −>imageLocation ( ) ;
14 P r o f i l e * p r o f i l e = new P r o f i l e ( firstName + " " + lastName , birthdate , sex ,
skillfulHand , height , imageLocationAvatar ) ;
15 appManager−>AddProfile ( p r o f i l e ) ;
16 }
17 }
51
CAPÍTULO 4. INSTANCIACIÓN
Para construir un template, el usuario deberá elegir el tipo de golpe. La definición de los
tipos de golpes se implementó en EditTypeStroke. Esta clase implementa el método Execute de la
interfaz padre Command.
A continuación en el Algoritmo 4.2 se puede observar un segmento del código donde se
reimplementa el método Execute.
16 appManager−>removeTypesStrokes ( removes ) ;
17 appManager−>addTypesStrokes ( adds ) ;
18 }
19 }
52
4.2. APLICACIÓN EDITOR DE PERFILES
53
CAPÍTULO 4. INSTANCIACIÓN
La comparación de dos golpes involucra por un lado un golpe de referencia, el cual se encuentra
almacenado en la base de golpes del usuario (templates) y, por otro lado, el golpe a testear, obtenido
con un dispositivo específico. Siguiendo con la implementación mediante el patrón Command,
para realizar la captura de un nuevo golpe se creó la clase CommandNewStroke. El Algoritmo 4.3
corresponde a la implementación del método Execute.
1 v i r t u a l void NewStroke : : Execute ( ) o v e r r i d e {
2 AssistentForm^ mForm = gcnew AssistentForm ( ) ;
3
Una vez que la aplicación detecta que se encuentra un dispositivo conectado habilita la opción
de capturar un nuevo golpe. Como se puede observar en el Algoritmo 4.3 se crea un formulario
asistente. El asistente incluye controles enlazados y guía al usuario a lo largo del proceso de
creación y captura de un nuevo golpe.
Los controles son objetos contenidos dentro de un formulario. Cada tipo de control tiene su
propio conjunto de propiedades, métodos y eventos que lo hacen adecuado para un propósito en
particular. El asistente, implementado en la clase AssistentForm, agregará a la superficie del
formulario el control correspondiente de acuerdo a la secuencia de acciones realizadas por el
usuario.
La Figura 4.4 corresponde al control que muestra la configuración de creación de un nuevo
golpe. Según los dispositivos que estén conectados existirá la posibilidad de cambiar entre ellos
para la captura del mismo. Luego de elegir un dispositivo y asignar un nombre al nuevo golpe, se
visualizará en el asistente el segundo control, encargado de realizar la captura del gesto con el
dispositivo seleccionado.
54
4.2. APLICACIÓN EDITOR DE PERFILES
cantidad finita de veces. Este paso es importante para el sistema porque genera el patrón de un
golpe a partir de un Template. Luego, utiliza este patrón para compararlo con un golpe que realiza
un jugador. Esta sección está relacionada con los Templates explicados en el capítulo anterior.
La generación de un nuevo Template se implementó en la clase CommandNewTemplate, que
implementa Command. A continuación, en el Algoritmo 4.4 se observa la implementación de la
interfaz. Análogamente al comando de captura de un golpe, se crea un asistente para guiar al
usuario durante la creación de un template.
1 v i r t u a l void NewTemplate : : Execute ( ) o v e r r i d e {
2 / / Se crean l o s paneles d e l a s i s t e n t e y se configuran l a s t r a n s i c i o n e s
3 AssistentForm^ mForm = gcnew AssistentForm ( ) ;
4 ...
5 DialogResult r e s u l t = mForm−>ShowDialog ( ) ;
6 i f ( r e s u l t == DialogResult : :OK) {
7 / / Se obtienen l o s templates capturados y se vinculan
8 Template * firstTemplateCaptured = GetFirstTemplateCaptured ( ) ;
9 Template * secondTemplateCaptured = GetSecondTemplateCaptured ( ) ;
10 LinkedTemplates ( firstTemplate , secondTemplate ) ;
11
12 / / Se agregan a l p e r f i l y se almacenan
13 Profile * p r o f i l e = GetSelectedProfile ( ) ;
14 p r o f i l e −>AddTemplate ( mFirstTemplate ) ;
15 p r o f i l e −>AddTemplate ( mSecondTemplate ) ;
16 appManager−>S a v e P r o f i l e ( p r o f i l e ) ;
17 }
18 }
55
CAPÍTULO 4. INSTANCIACIÓN
56
4.2. APLICACIÓN EDITOR DE PERFILES
Figura 4.6: Control del asistente para la creación de un nuevo template capturando golpes
dirigidos a la esquina izquierda del lado destino de la cancha.
conjunto de muestras de cada template estará conformado por golpes del mismo tipo, pero se
diferenciarán el uno del otro por sus orientaciones. Este tipo de restricción tiene sus razones y
serán comentadas y detalladas en el transcurso del capítulo.
Para comenzar con la captura de un golpe, se debe presionar un botón específico del dispositivo.
Los valores de los sensores del dispositivo se irán almacenando mientras el botón esté presionado.
Al soltar el botón, se concluirá con la captura del gesto. El proceso se repite de la misma manera
hasta que se llegue a la cantidad de golpes deseada. Se impuso como requisito que el template
tenga una cantidad mínima de 5 muestras.
En el caso del dispositivo seleccionado de la Figura 4.6, mientras el botón B del WiiMotionPlus
se encuentre presionado, se obtendrán los valores de los sensores y, consecuentemente, se irá
armando el golpe. Cada muestreo de los sensores es guardado en un objeto ValueStroke y, al soltar
el botón B y concluir con la captura del golpe, estarán almacenados en un Stroke. Luego, cada
instancia Stroke creada será agregada a un objeto Template. Estas estructuras corresponden al
modelo de datos que se explicó en el capítulo anterior.
Con el fin de evaluar la capacidad de la plataforma de contar con varios algoritmos de recono-
cimientos de gestos y tener variedad de resultados, fueron desarrolladas diferentes estrategias de
comparación. La aplicación permite comparar un golpe con un template mediante un algoritmo
57
CAPÍTULO 4. INSTANCIACIÓN
específicado por el usuario. Se estableció como restricción que tanto el golpe como el template
debieron ser capturados con el mismo dispositivo.
Siguiendo con la implementación del patrón Command para cada una de las acciones que
puede realizar el usuario, se creó la clase CommandExecuteComparisonInside.
En el segmento mostrado en el Algoritmo 4.5, se puede observar cómo se obtiene el template y
el golpe que fueron seleccionados en la interfaz de usuario. Luego se ejecuta la estrategia Inside,
invocando el método ExecuteStrategy de AppManager, cuyo primer argumento corresponde al
nombre de la estrategia a utilizar para la comparación del golpe con el template.
1 v i r t u a l void ExecuteComparisonInside : : Execute ( ) o v e r r i d e {
2 AppManager * appManager = AppManager : : GetSingletonPtr ( ) ;
3 / / Se o b t i e n e e l template y s t r o k e s e l e c c i o n a d o s en l o s ComboBox c o r r e s p o n d i e n t e s
4 Template * _template = GetSelectedComboBoxTemplates ( ) ;
5 Stroke * s t r o k e = GetSelectedComboBoxStrokes ( ) ;
6 / / Se e j e c u t a l a e s t r a t e g i a I n s i d e
7 Strategy : : R e s u l t S t r a t e g y I n s i d e * r e s u l t = appManager−>ExecuteStrategy (STRATEGY_INSIDE,
_template , s t r o k e ) ;
8 / / Se o b t i e n e e l p o r c e n t a j e de s i m i l i t u d entre e l golpe y e l template
9 double resultValue = r e s u l t −>GetResultComparison ( ) * 100;
10 ...
11 }
58
4.2. APLICACIÓN EDITOR DE PERFILES
Es importante aclarar que tanto el golpe como el template fueron creados con el dispositivo
WiiMotion Plus, utilizando los seis sensores. La estrategia realiza la comparación por cada
sensor de manera independiente, obteniendo un porcentaje. Luego, el porcentaje general de la
comparación estará dado por las ponderaciones impuestas a cada sensor del dispositivo.
59
CAPÍTULO 4. INSTANCIACIÓN
4 / / Se o b t i e n e e l template y s t r o k e s e l e c c i o n a d o s en l o s ComboBox c o r r e s p o n d i e n t e s
5 Template * _template = GetSelectedComboBoxTemplates ( ) ;
6 Stroke * s t r o k e = GetSelectedComboBoxStrokes ( ) ;
7
8 / / Se e j e c u t a l a e s t r a t e g i a DTW
9 Strategy : : ResultStrategyDTW * r e s u l t = appManager−>ExecuteStrategy (STRATEGY_DTW,
_template , s t r o k e ) ;
10
60
4.2. APLICACIÓN EDITOR DE PERFILES
Si bien el objetivo del trabajo no es realizar un análisis comparativo del desempeño de los
diversos algoritmos, un detalle interesante es el tiempo de ejecución de cada estrategia. El
algoritmo Inside tiene una duración de procesamiento de 1 ms, mientras que DTW lo realiza
en 2 ms. Aunque estos tiempos son despreciables, a priori podemos considerar que el segundo
algoritmo es el doble de lento que el primero.
Así como existe la posibilidad de comparar un golpe contra un template específico la aplicación
permite, además, buscar entre todos los templates de un perfil, el template que mejor coincide
con el golpe. El algoritmo para realizar este procedimiento ejecuta una estrategia determinada
utilizando el golpe capturado y cada uno de los templates del perfil activo que fueron creados con
el mismo dispositivo de captura del golpe de test. Luego, compara cada uno de los resultados y el
template de mejor coincidencia será el de mayor porcentaje general de similitud.
Con el propósito de instanciar la búsqueda del template que más parecido sea al golpe, se
implementó la clase ExecuteBestAgreementInside que extiende de Command.
Como se ve en el Algoritmo 4.7, se obtiene el perfil del usuario y el golpe seleccionado en la
interfaz de usuario. Luego se ejecuta la estrategia Inside, invocando el método FindBestAgreement
de AppManager, cuyo primer argumento corresponde al nombre de la estrategia a utilizar para
la búsqueda del template de mejor coincidencia.
4 / / Se o b t i e n e e l p e r f i l y s t r o k e s e l e c c i o n a d o s en l o s ComboBox c o r r e s p o n d i e n t e s
5 P r o f i l e * p r o f i l e = GetSelectedComboBoxProfile ( ) ;
6 Stroke * s t r o k e = GetSelectedComboBoxStrokes ( ) ;
7
La Figura 4.9 muestra los resultados obtenidos de la ejecución de la estrategia Inside para
el reconocimiento del golpe nombrado como "Drive rápido". Para una mejor identificación de los
61
CAPÍTULO 4. INSTANCIACIÓN
gestos de test, las capturas fueron nombradas de acuerdo al tipo y velocidad con la que se realizó
el golpe. Se observa que la estrategia Inside detectó que el template que más parecido es al golpe
es del mismo tipo.
62
4.2. APLICACIÓN EDITOR DE PERFILES
Equivalente al algoritmo 4.7, en 4.8 se ejecuta la estrategia DTW para encontrar el template
del perfil seleccionado que mejor coincide con el golpe realizado. En la Figura 4.10 se observan los
resultados de la ejecución, con los valores de distancia y límites de cada sensor. El porcentaje de
similitud general corresponde a un promedio entre los resultados de los sensores. Estos sensores
están agrupados en dos grupos segmentando los acelerómetros de los giróscopos. Con estos grupos
se puede realizar una ponderación para que un grupo tenga más influencia por sobre el otro en el
resultado general.
Un detalle importante es que la ejecución de este algoritmo tiene una duración de 46 ms, un
tiempo muy superior comparado con la ejecución de la estrategia Inside.
63
CAPÍTULO 4. INSTANCIACIÓN
4.2.6 Configuraciones
Como el sistema está compuesto por muchas funcionalidades, de las cuales el entrenador
puede elegir, se realizó una interfaz para que las pueda administrar.
Ya que la aplicación se ha diseñado e implementado con la intención de proveerle al usuario
que realice las configuraciones que desee, se le tiene que permitir que desde una interfaz amigable
las pueda realizar.
Existen diversas configuraciones que se pueden realizar, ya sea en los dispositivos como en
las estrategias. Por ello, es que a continuación se explicarán en detalle las mismas.
Se han definido varias estrategias con diferentes mecanismos para poder comparar los golpes
y los templates. El usuario puede disponer de estas estrategias a gusto, con el objetivo de probar
distintas alternativas.
Como se han definido en el modelo, las estrategias pueden utilizar diferentes cálculos para
llegar al resultado. Para DTW, existe la variante entre:
64
4.2. APLICACIÓN EDITOR DE PERFILES
• Máximos y mínimos
Estas dos alternativas son con el fin de encontrar la distancia lḿite utilizando las curvas
seleccionadas. Luego, el calculo del valor límite utilizando las curvas seleccionadas para considerar
si un gesto es reconocido o no puede ser mediante:
• Distancia euclídea
Dado que existen ciertos dispositivos que contienen más de un grupo de sensores, se realizó
en la interfaz una configuración para manejar las ponderaciones entre los grupos de sensores
disponibles según el dispositivo. Las ponderaciones de cada grupo de sensores son utilizadas para
65
CAPÍTULO 4. INSTANCIACIÓN
el cálculo del porcentaje general de similitud de un golpe con respecto a un template. De esta
manera, variando las ponderaciones se modificará el peso o relevancia del grupo de sensores en
la obtención del resultado final de la comparación de gestos.
En particular, el dispositivo WiiMotionPlus contiene dos grupos de sensores. A continuación,
en la Figura 4.12 se pueden ver a los sensores acelerómetros y los sensores giróscopos reunidos
en dos grupos.
En la parte inferior de la ventana se puede aumentar o disminuir esa ponderación. Acla-
remos que los grupos de sensores conforman el 100 %. Entonces, si se aumenta alguna de las
ponderaciones de esos grupos, el otro se va a ver afectado directamente disminuyendo su valor.
66
4.3. VISUALIZADOR 3D
4.3 Visualizador 3D
Una escena 3D está compuesta por distintos objetos gráficos, los cuales constituyen el escena-
rio de la aplicación. Estos objetos se definen mediante modelos 3D constituidos por un conjunto
de primitivas geométricas simples, tales como puntos, líneas y triángulos, además de otro tipo de
información necesaria para ser dibujados correctamente por pantalla. Todos estos objetos 3D son
manejados por el administrador de escenas de Ogre, la clase SceneManager, el cual define una
interfaz que permite organizar y gestionar la representación de modelos 3D.
Los objetos están definidos en mallas 3D. Una malla es una serie de triángulos que, por lo
general, contiene una textura. Representa la geometría visible de un objeto en una aplicación
3D. Para cargar una malla en una escena, es necesario crear una entidad. Esto último es una
67
CAPÍTULO 4. INSTANCIACIÓN
instancia de una malla y es el objeto más común en una aplicación de Ogre. Varias entidades
pueden tener diferentes materiales y texturas, aunque compartan la misma malla.
A su vez, es posible crear entidades con diferentes mallas. Una entidad se crea llamando al
método createEntity, dándole un nombre y especificando el nombre de la malla en que se basará.
El SceneManager se asegurará de que la malla se cargue mediante una llamada al gestor de
recursos.
Las entidades no se consideran como parte de una escena hasta que no se conecten a un objeto
SceneNode. Es decir, una entidad no se renderiza en la escena hasta que no sea acoplada a un
SceneNode. Este nodo es un elemento lógico de la jerarquía del escenario gráfico que se puede
utilizar para organizar los objetos de una escena.
Puede tener varios nodos secundarios y entidades (entre otros objetos, como luces y cámaras)
conectados a él. Un SceneNode guarda la posición, orientación y escala de todos los objetos
acoplados. De esta manera, sólo cuando se crea una entidad y se conecta a un SceneNode, ésta
se podrá mostrar en la pantalla. Un concepto mayor a tener en cuenta es que el SceneManager
contiene un nodo raíz, mRootSceneNode, al cual todos los otros nodos están conectados. A partir
del SceneManager se crearán luces, cámaras y se configurará la luz ambiente, sombras y demás
aspectos de la escena.
68
4.3. VISUALIZADOR 3D
fuerzas resultantes luego de colisiones. Para ello, comúnmente se utiliza un motor físico, el cual
se define como un programa o parte de un programa encargado de simular comportamiento físico.
Bullet se encargará de calcular las colisiones y relaciones entre los objetos de la escena.
Simulará los movimientos de los cuerpos rígidos que conforman el mundo físico y sus interacciones
ante la influencia de fuerzas. Para ello, es necesario proporcionar una forma geométrica a cada
cuerpo rígido, a través de primitivas de colisión simples o complejas. Cada objeto visual tendrá su
correspondencia con un cuerpo rígido, representado por una primitiva de colisión, el cual será
cargado y configurado desde el archivo physics.config.
Los límites de la cancha de tenis se cargan desde el archivo court.config. Se establecen los
límites del lado origen y el lado destino en el plano XZ de Ogre, tanto para la cancha singles como
la de dobles. El lado origen de la cancha es donde el jugador realizará los golpes y el lado destino
es donde se dirigirán los golpes. La configuración representa las medidas reales de una cancha de
tenis [25]. La Figura 4.16 muestra a escala las dimensiones de una cancha singles de tenis. Para
abstraernos de las posiciones absolutas de los límites, se implementó un mecanismo para utilizar
posiciones relativas. Entonces, para cada lado de la cancha, la esquina izquierda inferior será la
posición (0, 0) de la cancha y la esquina superior derecha será la posición (1, 1), como se muestra
en la Figura 4.15. La clase TennisCourt implementa esta lógica. Existen métodos que, a partir
de una posición absoluta en el plano XZ de Ogre, retorna la posición relativa en el plano de la
cancha. Y viceversa, a partir de una posición relativa en el plano de la cancha, retorna la posición
absoluta en el plano XZ de Ogre.
69
CAPÍTULO 4. INSTANCIACIÓN
Detalles de la cancha
• El piso de la cancha es un plano, donde en Ogre está representado por el plano XZ, el cual
el valor de la coordenada Y es siempre 0.
• Desde el centro hacia arriba están los valores negativos de la coordenada Z, (X, Y, -) y (X, Y,
+) desde el centro hacia abajo.
El tipo de cancha, single o doble, es configurable. Las dimensiones de estas canchas ya están
cargadas por lo que sólo se debe seleccionar cuál se desea utilizar.
70
4.3. VISUALIZADOR 3D
El estado de cada primitiva física está definido por su posición y orientación en un tiempo
determinado. El motor físico es el encargado de calcular el nuevo estado de los objetos luego de
cada actualización; y el motor gráfico, el de visualizar los objetos en la posición correcta. Entonces,
el motor físico realiza la actualización del estado para un tiempo determinado, el motor gráfico
solicita los datos asociados a cada objeto al motor físico, aplica los nuevos valores de posición y
orientación y los dibuja en pantalla [26]. En la Figura 4.17 se esquematiza la interacción entre
los motores.
4. El motor gráfico aplica los valores de posición y rotación a los objetos 3D.
71
CAPÍTULO 4. INSTANCIACIÓN
Los objetos gráficos de Ogre3D y los cuerpos físicos de Bullet son entidades completamente
distintas y separadas. Si no se implementa algún mecanismo mediante el cual Bullet actualice
la posición y rotación de dicho objeto gráfico, se creará una situación de incoherencia en la
cual la posición del objeto gráfico permanecerá estática, al contrario que la del cuerpo físico
que se verá actualizada. Esto provocará que la simulación no se actualice, ya que Ogre es el
encargado de renderizar los objetos 3D, mientras que Bullet tiene la responsabilidad de modelar
un comportamiento realista sobre los cuerpos.
Para resolver el problema de la integración entre Bullet Physics y Ogre3D, los cuerpos
rígidos de Bullet cuentan con un atributo llamado estado de movimiento MotionState [27]. Este
MotionState abstrae de las operaciones de bajo nivel que se realiza cuando el cuerpo físico recibe la
influencia de alguna fuerza. De esta forma, se puede trabajar directamente con los cuerpos físicos,
sabiendo que las posiciones de los elementos de la escena serán adecuadamente actualizadas en
función del movimiento del cuerpo físico.
En resumen, la clase MotionState nos permite actualizar la posición de los nodos de escena
de Ogre. Para ello, se requiere adoptar una implementación, dado que se trata de una clase
abstracta. Dicha interfaz se encuentra implementada en la clase CustomMotionState.
1 void CustomMotionState : : SetWorldTransform ( const btTransform& worldTrans ) {
2 / / A c t u a l i z o l a o r i e n t a c i o n d e l o b j e t o 3D, a p a r t i r de l a o r i e n t a c i o n d e l cuerpo
fisico
3 btQuaternion r o t = worldTrans . getRotation ( ) ;
4 mSceneNode−>s e t O r i e n t a t i o n ( r o t .w( ) , r o t . x ( ) , r o t . y ( ) , r o t . z ( ) ) ;
5
6 / / A c t u a l i z o l a p o s i c i o n d e l o b j e t o 3D, a p a r t i r de l a p o s i c i o n d e l cuerpo f i s i c o
7 btVector3 pos = worldTrans . getOrigin ( ) ;
8 mSceneNode−>s e t P o s i t i o n ( pos . x ( ) , pos . y ( ) , pos . z ( ) ) ;
9 }
Bullet invoca de forma automática el método SetWorldTransform de cada uno de los cuerpos
físicos que forman el mundo. El método recibe un objeto de tipo btTransform. La clase btTransform
encapsula un cuaternio, que almacena la rotación del cuerpo físico; y un vector, que almacena su
posición. Dado que la clase MotionState almacena un puntero a un nodo de escena de Ogre3D,
en el momento en que Bullet invoque el método SetWorldTransform, se actualizará la rotación y
posición de dicho nodo de escena; es decir, se actualizará la posición y rotación del cuerpo gráfico
a partir de la nueva información recibida.
Por ejemplo, creamos la representación visual y física de la pelota de tenis:
72
4.3. VISUALIZADOR 3D
1 / / Creamos e l o b j e t o 3D de l a p e l o t a de t e n i s
2 Entity * e n t i t y T e n n i s B a l l = mSceneManager−>c r e a t e E n t i t y ( ’ EntityTennisBall ’ , ’ b a l l . mesh ’ ) ;
3 SceneNode * sceneNodeTennisBall = mSceneManager−>createSceneNode ( ’ NodeTennisBall ’ ) ;
4 sceneNodeTennisBall −>attachObject ( e n t i t y T e n n i s B a l l ) ;
5
10 / / btTransform c o n t i e n e l a transformacion i n i c i a l d e l o b j e t o f i s i c o
11 btTransform transform ;
12 transform . s e t I d e n t i t y ( ) ;
13
14 f l o a t mass = 0 . 1 7 ;
15 btVector3 i n e r t i a ( 0 , 0 , 0 ) ;
16 sphere −>C a l c u l a t e L o c a l I n e r t i a ( mass , i n e r t i a ) ;
17
73
CAPÍTULO 4. INSTANCIACIÓN
coordenadas para objetos dinámicos, que significa que tienen un comportamiento físico que al
aplicarle una fuerza cobran movimiento.
Otra observación que se puede hacer con los objetos es comparar una silla con un ladrillo.
Como dijimos anteriormente, el ladrillo es una caja, una primitiva simple del motor físico; en
cambio, la silla está creada a partir de una primitiva compleja llamada btBvhTriangleMeshShape,
donde el cuerpo físico comparte la forma geométrica del objeto 3D.
4.3.4 Instructor
Esta funcionalidad se realiza mediante una comunicación con un servidor que hace de
intermediario. Esto se realizó siguiendo la arquitectura Cliente-Servidor [28].
74
4.3. VISUALIZADOR 3D
Se ha utilizado un servidor que fue realizado por Pladema para distintos proyectos. El servidor
cuenta con librerías que utilizan el protocolo UDP para mayor eficiencia e implementan una capa
de software transparente al usuario para mantener la comunicación activa y detectar si la misma
se ha caído.
El servidor mantiene un diccionario de clave/valor, siendo este último una estructura compleja
donde también tiene una lista de qué clientes están suscriptos a esa clave. Tanto en el Instructor
como en el Visualizador se sitúa el cliente y se incorpora como una biblioteca al proyecto.
Este tipo de comunicación entre el visualizador y el instructor permite que se encuentren en
computadoras distintas. Incluso puede instalarse el servidor en una tercer computadora. Sólo
basta con realizar la configuración de las direcciones IP’s, los puertos y el nombre del host para
establecer la conexión con el servidor.
Luego para el instructor se debe configurar el nombre del receptor, en este caso será el nombre
del host del visualizador y viceversa.
Estados de la aplicación
La aplicación del visualizador atraviesa diferentes estados a lo largo de su ejecución. Por ello,
a través de la Figura 4.19 se observa el flujo que realiza el visualizador.
75
CAPÍTULO 4. INSTANCIACIÓN
1. Conexión Establecida.
3. Simulador Configurado.
4. Dispositivo Conectado.
5. Ejercicio Finalizado.
6. Conexión Perdida.
7. Dispositivo Desconectado.
En la Figura 4.20 se puede ver en el visualizador uno de los estados de la aplicación, particu-
larmente en el estado inicial.
76
4.3. VISUALIZADOR 3D
4.3.5 Ejercicios
Para la implementación de los ejercicios se realizó una interfaz llamada Exercise como se ve
en la Figura 4.21. Esta clase tiene dos métodos. El primero, Start, que se encarga de posicionar
dónde estará la pelota al momento del golpe y de dar inicio al ejercicio. El segundo, Configure,
que realiza la configuración propia de cada tipo de ejercicio.
• Libre
• Potencia
• Precisión
Cuando se inicia un ejercicio, se espera por la captura de un golpe por parte del jugador. Luego
se buscará el template que mejor coincide con el golpe capturado y se aplicará un impulso a la
pelota de tenis a través del motor físico. El impulso estará dado por los valores de un vector de 3
coordenadas (X, Y, Z), donde:
El vector de impulso será calculado a partir del análisis de los valores de los sensores del
dispositivo que se utilizó para capturar el gesto y el análisis de los datos del perfil que realizó el
golpe. En las siguientes secciones, se verá en mayor detalle el cálculo de la dirección y potencia
del golpe, representado por las coordenadas del vector de impulso X y Z respectivamente.
77
CAPÍTULO 4. INSTANCIACIÓN
Estos ejercicios se definen desde el instructor y se ejecutan en el visualizador. Por esto, existe
una interfaz de configuración del ejercicio que le permite al instructor definir el ejercicio a realizar.
En la Figura 4.22 se observa la pantalla de configuración donde se selecciona el perfil del
jugador, el dispositivo con el que se va a realizar, la estrategia de comparación, el golpe a realizar
y el tipo de ejercicio.
Luego de completar la configuración inicial del ejercicio el instructor debe ubicar dónde quiere
colocar la pelota y la altura de la misma como se ve en la Figura 4.23.
78
4.3. VISUALIZADOR 3D
79
CAPÍTULO 4. INSTANCIACIÓN
Para el ejercicio de potencia se ideó tener que derribar algún tipo de obstáculo. Se plantearon
distintas alternativas y se eligió una pared de ladrillos.
En este ejercicio puede cambiarse su dificultad realizando dos cambios. El primero, a medida
que aumenta la dificultad también lo hace el peso del ladrillo. El segundo, a medida que aumenta
la dificultad disminuye el tamaño de la pared.
80
4.3. VISUALIZADOR 3D
81
CAPÍTULO 4. INSTANCIACIÓN
En el ejercicio de precisión se creó un círculo en el piso. La pelota deberá picar dentro del
círculo para establecer como correcto el ejercicio. El diámetro del círculo variará en base a la
dificultad elegida por el instructor en el configurador del ejercicio. El tamaño del círculo es
inversamente proporcional a la dificultad del ejercicio.
82
4.3. VISUALIZADOR 3D
• Realizar golpes dirigidos a la esquina izquierda del lado destino de la cancha (Figura 4.6)
Recordemos que un template está compuesto por un conjunto de golpes. Además, con la
incorporación de la orientación de los golpes del conjunto, el template estará representado por un
vector de dirección [29]. Entonces, como se explicó anteriormente la cancha en coordenadas, para
un determinado tipo de golpe tendremos un template cuyo vector de dirección estará orientado
hacia el X positivo, representado por el conjunto de golpes dirigidos a la esquina derecha del lado
destino de la cancha.
Asimismo, existirá otro template donde su vector de dirección tendrá un sentido hacia el X
negativo, constituido por capturas dirigidas a la esquina izquierda del lado destino de la cancha.
Estos templates los llamaremos complementarios y serán utilizados para el cálculo de la dirección
del golpe en el visualizador 3D. La Figura 4.28 esquematiza los vectores de dirección de los
templates complementarios. La línea punteada verde representa la dirección central, donde el
valor de X es 0.
83
CAPÍTULO 4. INSTANCIACIÓN
(4.1) R n = Comparar(G c , T n )
(4.2) R p = Comparar(G c , T p )
Donde:
• Comparar es una función que retorna la similitud de un golpe con un template, cuyo
valor de retorno estará en el intervalo [0, 1]
Para poder analizar el resultado de la diferencia entre los templates y poder determinar si
es un valor significativo o no, se utiliza un valor de referencia. Ese valor de referencia será
una estimación de la diferencia teórica máxima que puede existir entre los resultados de
las comparaciones del golpe contra los templates complementarios.
Un golpe que coincide plenamente con un template, es el golpe promedio del template. Por
ende, la comparación dará como resultado que son exactamente iguales.
(4.4) Comparar(A n , T n ) = 1
84
4.3. VISUALIZADOR 3D
(4.5) Comparar(A p , T p ) = 1
Donde:
Los resultados de estas comparaciones son utilizados para obtener los valores de referencias.
Entonces, durante el preprocesamiento de los templates del perfil y para todos los templates
complementarios, se obtienen los valores de referencia V R n y V R p para ser utilizados
durante la búsqueda de la dirección de un golpe. Además, se estableció un valor de la
coordenada X del vector de impulso asociado a cada valor de referencia:
85
CAPÍTULO 4. INSTANCIACIÓN
De este modo, la dirección del golpe tendrá el sentido del vector director del template de
mayor coincidencia. Si el valor D (Ecuacion 4.3) es igual al valor de referencia del template
de mayor coincidencia Vr , se aplicará el valor Vx a la coordenada X del vector de impulso. Si
D es 0, entonces el golpe coincide de igual manera con ambos templates complementarios.
En tal caso, el valor de la coordenada X será 0, por lo tanto la dirección de la pelota será
hacia el medio.
En conclusión, para recrear virtualmente la dirección del golpe capturado debemos obtener el
valor de la coordenada X del vector de impulso mediante:
• La diferencia entre los resultados de las comparaciones del golpe contra los templates
complementarios.
• El cálculo del valor de la coordenada X del vector de impulso según el vector director del
template de mayor coincidencia.
86
4.3. VISUALIZADOR 3D
con el objetivo del ejercicio, pero fue identificado como un golpe de tipo Revés. En ese caso, la
columna Resultado ejercicio mostrará un Bien, pero el resultado final será Mal ya que el jugador
realizó un golpe que no debía efectuar.
En la parte inferior izquierda de la Figura, se observan tres botones: una pelota, dos pelotas
y un ojo. El primero de ellos sirve para visualizar en la cancha la trayectoria que realizará la
pelota en el próximo golpe a efectuar. El segundo para visualizar en la cancha las trayectorias y
los piques de todos los golpes realizados, mostrando en verde los resultados finales que fueron
correctos y, en rojo, los incorrectos. Por último, el tercero es para simular el Ojo de Halcón, el
mismo que en los partidos de tenis.
En la parte inferior derecha de la Figura se encuentran los botones para repetir el ejercicio y
el botón para pausar el visualizador.
87
CAPÍTULO 4. INSTANCIACIÓN
Para lograr esto, se creó la clase VisualExercise. La clase implementa la lógica necesaria para
configurar y dibujar la trayectoria de la pelota en el escenario. El método startExercise, que se
muestra en el Algoritmo 4.12, se invoca cuando se inicia un ejercicio. La clase RibbonTrail [30]
de Ogre es utilizada.
Una instancia de la clase dibuja automáticamente el rastro que deja un nodo de escena al
moverse por el escenario, generando la geometría de los elementos que componen la cadena de la
trayectoria. Sólo se debe agregar el nodo de escena a rastrear, que será el nodo de escena que
contiene la pelota de tenis, además de otros parámetros de configuración tales como la distancia
máxima de la trayectoria, la cantidad máxima de elementos de la cadena, el ancho y color de los
elementos, etcétera.
88
4.3. VISUALIZADOR 3D
1 void Vi su al E xercise : : s t a r t E x e r c i s e ( ) {
2 / / Creo un nodo de escena para e l o b j e t o RibbonTrail
3 mSceneNodeTrail = mSceneManager−>getRootSceneNode ( ) −>createChildSceneNode ( ) ;
4 / / Creo y c o n f i g u r o e l RibbonTrail desde e l archivo t r a i l . scene
5 / / El archivo c o n t i e n e l o s parametros de c o n f i g u r a c i o n d e l RibbonTrail
6 DotScene * dotScene = new DotScene ( mSceneManager ) ;
7 dotScene −>parseDotScene ( " t r a i l . scene " , mSceneNodeTrail ) ;
8 d e l e t e dotScene ;
9
Luego, cuando finaliza el ejercicio, la trayectoria que generó la pelota al realizar el golpe es
almacenada y se establece el color en rojo o verde, según el resultado del ejercicio. De esta manera,
estará disponible para visualizarla cuando el instructor presione el botón correspondiente.
Figura 4.31: Visualizador en ejercicio de precisión mostrando las trayectorias de las pelotas
La Figura 4.31 muestra las trayectorias de la pelota en los golpes realizados en la sesión del
ejercicio de precisión. Se puede apreciar que un solo golpe cumplió con el objetivo del ejercicio, el
89
CAPÍTULO 4. INSTANCIACIÓN
El ojo de halcón es un sistema informático usado en tenis y otros deportes para seguir la
trayectoria de la pelota. El sistema genera una imagen de la trayectoria y el pique de la pelota en
el suelo que puede ser utilizado por los jueces para decidir en jugadas dudosas [31].
La tecnología del ojo de halcón fue implementada en el visualizador 3D como una animación
de la cámara, desplazando la misma hacia la posición del pique de la pelota, simulando un pedido
de challenge [32] por parte del jugador. La cámara comienza situada en una posición y una
orientación inicial, del lado de la cancha donde el jugador realizó el golpe. Luego, se dirige hacia
el lugar donde se detectó el pique de la pelota, a una velocidad constante. Por último, la cámara
enfoca el pique de la pelota, como se muestra en la Figura 4.32. Además, el pique es dibujado
dependiendo del ángulo, velocidad y dirección de impacto de la pelota con el suelo de la cancha.
90
4.3. VISUALIZADOR 3D
Para poder adaptar nuestra aplicación, más precisamente el visualizador 3D al Oculus Rift
DK2, la implementación debió ser modificada y diseñada específicamente para que funcione
correctamente con Oculus Rift. Para ello se utilizó el SDK 0.4.4-beta [33].
El SDK funciona en dos modos:
• Modo directo
• Modo extendido
2. Se crean dos cámaras en la escena, una al lado de la otra, mirando en la misma dirección.
Cada cámara se corresponderá con los ojos de una persona. Se crea un nodo de escena
mBodyNode, que representa el cuerpo de la persona. Luego se crea un nodo de escena
mHeadNode, donde se adjuntan las cámaras que representan los ojos de la persona. El
nodo mHeadNode será un nodo hijo de mBodyNode. De esta manera, nuestra aplicación
controlará el cuerpo de la persona (caminar, girar), es decir el nodo mBodyNode, y la clase
Rift manejará el nodo mHeadNode, la cabeza de la persona.
91
CAPÍTULO 4. INSTANCIACIÓN
6. En cada frame, se deberá invocar el metodo Rift::update() para actualizar las transforma-
ciones del dispositivo. Luego, a partir de la orientación y la posición, que se obtienen con los
métodos Rift::getOrientation() y Rift::getPosition() respectivamente, se actualizará el nodo
que contiene las cámaras mHeadNode.
Como se puede ver en la Figura 4.33, el visualizador funciona en Oculus Rift. Como se explicó
anteriormente, cada imagen correspondiente a cada ojo es tomada desde una cámara distinta en
el visualizador. Por ello es que en la imagen que se proyecta en el ojo izquierdo se puede ver más
hacia la izquierda que en la otra imagen. Asimismo se puede observar la perspectiva de la pelota
para un ojo y para otro.
92
CAPÍTULO
5
C ONCLUSIONES Y TRABAJOS FUTUROS
5.1 Conclusiones
Este trabajo incluye el desarrollo de una plataforma que es capaz de realizar captura, analizar
y almacenar los golpes realizados por el jugador. Cada característica de la plataforma fue
implementada siguiendo los atributos de calidad de modificabilidad y extensibilidad para que
tenga la capacidad de adecuarse a nuevos requerimientos.
Dentro del framework existen tres módulos más importantes, tal como el módulo de datos, el
módulo de dispositivos y el módulo de estrategias. Dentro del módulo de las estrategias, se han
implementado diferentes técnicas de comparación para poder analizar los golpes y Templates del
jugador.
El instructor puede configurar el ejercicio desde el Editor de Perfiles para que el alumno lo
realice en el Visualizador 3D. Además, en la aplicación del instructor se puede ver el resultado de
cada uno de los intentos que realizó el jugador en ese ejercicio. El Visualizador 3D contiene una
cancha representando de manera fiel las dimensiones reales de una cancha profesional. Además,
para llevar a cabo el movimiento de la pelota se implementó con un motor físico para interpretar
cada uno de los comportamientos. Asimismo, en el visualizador se pueden ver cada una de las
trayectorias resultantes de los golpes y la animación del ojo de halcón visualizando el último
pique de la pelota.
Por último se implementó el Visualizador 3D para el Oculus Rift añadiendo mayor realidad
ya que contempla el movimiento del jugador que realiza con la cabeza.
93
CAPÍTULO 5. CONCLUSIONES Y TRABAJOS FUTUROS
A lo largo del trabajo nos hemos encontrado con diversos obstáculos. El primero radica en los
sensores que componen el dispositivo Wiimote. Estos sensores, como se explicó en el anexo, tienen
un rango muy limitado para utilizarse en un entorno donde las aceleraciones se dan de manera
brusca. Por lo tanto, se pierde mucha información al tener reducido el rango de los sensores.
Los sensores que más fácil se saturan realizando un golpe de tenis son los giróscopos. Esto es
porque durante un corto lapso del golpe se debe girar la raqueta rápidamente. Por otra parte, los
sensores acelerómetros se saturan en menor medida que los anteriores. Estos sensores han sido
saturados por personas que juegan habitualmente al tenis o deportes similares, ya que tienen la
capacidad de desarrollar una mayor aceleración en su golpe.
No sólo la saturación es un problema en los sensores, sino también la cantidad de valores que
pueden leer por unidad de tiempo. Hay que tener en cuenta el tiempo de duración de un golpe
es menor a 1 segundo. Sería ideal que cada sensor tenga la capacidad de leer por lo menos 1000
valores por segundo.
Además, mediante los giróscopos y acelerómetros no se puede calcular la posición relativa del
dispositivo. Tener la posición relativa nos ayudaría para poder distinguir en qué dirección realizó
el golpe.
Otra de las limitaciones con la que nos hemos encontrado es que en nuestro sistema realizamos
la captura de los datos que el jugador realiza con su brazo. Sin embargo, existen varios puntos
que se deberían evaluar para considerar si un golpe está realizado correctamente. Uno de ellos es
la posición del cuerpo al momento del impacto con la pelota. Además, para cada golpe el cuerpo
debe realizar un movimiento en particular.
Las partes del cuerpo que son analizadas por un instructor son todas. A continuación detalla-
mos las más importantes:
Por ello, analizar un golpe de tenis considerando sólo el movimiento del brazo es insuficiente
si se pretende utilizar el sistema para un uso profesional.
Como no se pudo recrear virtualmente el golpe a partir de los sensores de los dispositivos
utilizados se tuvo que implementar la estrategia para calcular el ángulo de dirección del golpe. Es
muy probable que mediante la posición relativa del dispositivo pueda ser calculada la dirección
del golpe.
94
5.3. TRABAJOS FUTUROS
Entre los trabajos futuros para extender nuestra propuesta, podemos encontrar:
• Agregar un nuevo dispositivo a la plataforma que detecte las extremidades del cuerpo, para
trabajar en conjunto con el Wiimote. Por ejemplo, Kinect.
• Utilizar un dispositivo con sensores de mayor precisión y mayor cantidad de muestras por
unidad de tiempo.
• Utilizar otro dispositivo similar al Wiimote, que sea uno de bajo costo pero que cuente con
la posición en el espacio. Por ejemplo, Ps Move.
• Obtener una mayor cantidad de métricas a partir de los sensores del dispositivo. Por
ejemplo, calcular la velocidad a partir de las aceleraciones.
• Integrar el dispositivo en una raqueta para que el jugador no sienta diferencias al momento
de realizar un golpe. Además, en la punta de la raqueta se podría incorporar otros sensores
acelerómetros y giróscopos para complementar con otro punto de observación.
95
PÉNDICE
A
A
A PÉNDICE
Es importante hacer la aclaración de que si bien fue planteado para utilizarse en aplicaciones
de diversos deportes para reconozcer gestos, fue considerado el tenis como principal deporte para
aplicarlo. Debido a esto, se podrá observar que en ciertas ocasiones llamamos a los gestos como
golpes, o su traducción al inglés Strokes.
Los datos generados por los sensores de los dispositivos están dados en valores pertenecientes
a un rango aceptable. Particularmente en el Wiimote el sensor acelerómetro que se utiliza es el
acelerómetro ADXL330 [35], que registra valores de tres dimensiones y cada una tiene un rango
aceptable de:
±3g
dθ
±2500ω =
dt
donde w representa la velocidad angular caracterizada por la división de una medida angular
sobre el tiempo.
Un golpe de tenis dura aproximadamente 1,3 seg desde que se prepara para realizar el golpe
hasta que logra el impacto con la pelota. Pero el lapso es muchísimo más corto si tomamos en
97
APÉNDICE A. APÉNDICE
cuenta desde que el jugador se encuentra preparado para realizar el golpe hasta el impacto, este
tiempo es aproximadamente de 0,5 seg.
Teniendo en cuenta estos tiempos y sabiendo que el dispositivo Wiimote tiene la capacidad
de tomar hasta 100 muestras por segundo nuestro muestreo de los golpes va a estar limitado a
unos 50 valores por cada uno de los sensores. Si bien esta cantidad parece ser suficiente creemos
que para poder lograr una mayor precisión en los resultados es necesario que esta cantidad de
muestras sea mayor.
Una mayor cantidad de muestras ayuda a ver los cambios de estos sensores a lo largo del
tiempo con mayor precisión, se puede ver cuando se incrementan o decrementan los valores de
manera abrupta, se puede ver cuando el cambio se produce de manera lineal o también cuando se
mantienen estables.
Por lo tanto, tener más información acerca del gesto capturado posibilita realizar un mejor
análisis y también compararlo contra otros gestos simulares o totalmente diferentes.
En la Figura A.1 se puede ver cómo en la parte inferior hay interrupciones en la captura de
los datos, esto es porque esos valores durante ese lapso de tiempo se encuentran fuera del rango
98
A.2. BIBLIOTECA WIIYOURSELF
Cabe destacar que se utilizó una librería del dispositivo Wiimote que se encuentra disponible
en [19]. Si bien nos ayudó en un comienzo a poder interactuar con el dispositivo, fuimos detectando
ciertas falencias, como por ejemplo que los controles no estaban orientados a eventos.
Si bien el paradigma orientado a eventos añade cierta dificultad con respecto a otros para-
digmas de programación, consideramos que es necesario que el sistema actúe de esa manera.
Teniendo en cuenta lo anterior se decidió realizar dicha implementación.
99
APÉNDICE A. APÉNDICE
El algoritmo DTW ha ganado su popularidad por ser extremadamente eficiente como medida
de similitud entre series de tiempo similares. Éste minimiza los efectos de cambio y distorsión
en el tiempo, permitiendo transformaciones elásticas de las series con el fin de detectar "forma"
similares con distintas fases.
Dada dos series de tiempo X = (X 1 , X 2 ...X n ), N ∈ N y Y = (Y1 , Y2 ...Ym ), M ∈ N representada por
las secuencias de valores, DTW produce una solución óptima de orden O(MN) la cual puede ser
aún mejorada a través de diferentes técnicas como por ejemplo multi-scaling. La única restricción
situada en las secuencias de datos es que deben estar muestreadas a puntos equidistantes en el
tiempo [36].
El algoritmo DTW se basa en un algoritmo de programación dinámica, donde es común
utilizar una función de distancia llamada función de costo:
c i, j = distance(X i , Y j )
• Los puntos finales de las dos series corresponden a una y a otra. Es decir, el camino
comienza siempre en (1, 1) y finaliza siempre en la coordenada que se encuentra en el
extremo inferior derecho (n, m) de la matriz.
• El tiempo avanza hacia adelante. Esta condición puede ser satisfecha permitiendo solamen-
te tres tipos de movimiento: abajo, derecha y abajo-y-derecha. Por tanto, siempre se debe
desplazar en una dirección que haga que i y j crezcan, o al menos uno de ellos. Dicho de
otro modo, dado un elemento cualquiera del camino (i, j), el elemento siguiente debe ser (i,
j+1), (i+1, j) o (i+1, j+1).
Para obtener el camino de menor coste, se calcula la matriz de costes totales D, en la que cada
elemento representa el coste del camino de menor coste que llega hasta él. La ventaja de esta
matriz es que cada elemento puede escribirse como el coste local de ese punto, más el menor de
los costes acumulados de los elementos anteriores. Teniendo en cuenta esto y la condición de que
el camino siempre debe avanzar hacia delante, el valor de cada elemento de D se obtiene de la
siguiente manera:
• El primer punto d 1,1 queda igual a c 1,1 , ya que no existe ningún punto anterior cuyo coste
sumarle.
100
A.3. ALGORITMO DTW
j
X
d 1, j = c 1,k
k=1
• De forma análoga al caso anterior, la primera fila presenta un caso similar: el camino sólo
puede desplazarse horizontalmente, por tanto la expresión de sus puntos queda:
i
X
d i,1 = c k,1
k=1
1 double ExecuteDTW ( vector <double > * vectorX , vector <double > * vectorY ) {
2 i n t m = vectorX −>s i z e ( ) ;
3 i n t n = vectorY −>s i z e ( ) ;
4
5 / / Creacion de matriz de c o s t o t o t a l e s
6 vector <vector <double >> c o s t (m, vector <double >(n , 0 . 0 ) ) ;
7 c o s t [ 0 ] [ 0 ] = s q r t ( pow ( ( vectorX −>at ( 0 ) − vectorY −>at ( 0 ) ) , 2 ) ) ;
8
14 / / Calcular c o s t o s de l a primera f i l a
15 f o r ( i n t j = 1 ; j < n ; j ++)
16 {
17 c o s t [ 0 ] [ j ] = c o s t [ 0 ] [ j − 1] + s q r t ( pow ( ( vectorX −>at ( 0 ) − vectorY −>at ( j ) ) , 2 ) ) ;
18 }
19
27 / / Retorna e l c o s t o t o t a l
28 return c o s t [m− 1][n − 1 ] ;
29 }
101
APÉNDICE A. APÉNDICE
Una vez completa la matriz D, en su último elemento D[n, m] se obtiene el coste total de
igualar ambas series (Algoritmo A.1). Evaluando este coste, se podrá determinar si las series son
lo suficientemente parecidas.
102
B IBLIOGRAFÍA
[4] S. S. D. Zulkarnain, “Studying the wiimote ‚Äì exploration to enhance the feeling of interac-
tivity in applications,” 2009.
http://www.few.vu.nl/~eliens/archive/tutorial/wiimote.pdf.
[8] L. J. P. J. P. P. H. J. Leong, T., “Wii want to write: An accelerometer based gesture recognition
system,” Carnegie Mellon University, pp. pp. 4–7., 2009.
International Conference on Recent and Emerging Advanced Technologies in Engineering,.
[9] H. Y. L. Y. C. L. Liu X., Sun J., “Overview of virtual reality apply to sports,” JCIT: Journal of
Convergence Information Technology 6(12), pp. 1–7, 2011.
[10] B. Bideau, R. Kulpa, N. Vignais, S. Brault, F. Multon, and C. Craig, “Using virtual reality to
analyze sports performance,” IEEE Comput. Graph. Appl., vol. 30, pp. 14–21, Mar. 2010.
103
BIBLIOGRAFÍA
[13] L. E. Potter, J. Araullo, and L. Carter, “The leap motion controller: A view on sign language,”
in Proceedings of the 25th Australian Computer-Human Interaction Conference: Aug-
mentation, Application, Innovation, Collaboration, OzCHI ’13, (New York, NY, USA),
pp. 175–178, ACM, 2013.
[14] Z. Zhang, “Microsoft kinect sensor and its effect,” IEEE MultiMedia, vol. 19, pp. 4–10, Apr.
2012.
[15] C. Cruz-Neira, D. J. Sandin, T. A. DeFanti, R. V. Kenyon, and J. C. Hart, “The cave: Audio
visual experience automatic virtual environment,” Commun. ACM, vol. 35, pp. 64–72,
June 1992.
[16] J. Kim, C. Chung, S. Nakamura, S. Palmisano, and S. K. Khuu, “The oculus rift: A cost-
effective tool for studying visual-vestibular interactions in self-motion perception,” Fron-
tiers in Psychology, vol. 6, no. 248, 2015.
[17] J. C. Lee, “Hacking the nintendo wii remote,” IEEE Pervasive Computing, vol. 7, pp. 39–45,
July 2008.
[18] T. Schlömer, B. Poppinga, N. Henze, and S. Boll, “Gesture recognition with a wii controller,” in
Proceedings of the 2Nd International Conference on Tangible and Embedded Interaction,
TEI ’08, (New York, NY, USA), pp. 11–14, ACM, 2008.
[22] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design Patterns: Elements of Reusable
Object-oriented Software.
Boston, MA, USA: Addison-Wesley Longman Publishing Co., Inc., 1995.
[24] A. Roche, Árboles de decisión y series de tiempo. Tesis de Maestría Ingenería Matemática.
Facultad de Ingeniería, UDELAR. Uruguay, 2009.
104
BIBLIOGRAFÍA
[26] L. M. Lazo Marcos., Incorporación de comportamiento físico en motor gráficos. Tesis de grado.
Universidad Nacional del Centro de la Pcia de Buenos Aires, Tandil, Argentina, 2009.
[36] P. Senin, “Dynamic Time Warping Algorithm Review,” Tech. Rep. CSDL-08-04, Department
of Information and Computer Sciences, University of Hawaii, Honolulu, Hawaii 96822,
Dec. 2008.
105