miércoles, 16 de mayo de 2012

Control por reconocimiento de gestos


Como ya mencionamos al hablar del acelerómetro de un dispositivo Android, hemos decidido implementar como mejora para nuestro proyecto el reconocimiento de gestos mediante este sensor que incorporan todos los móviles Android.

Aunque al diseñar el proyecto y la planificación de los hitos pensamos como mejoras en la integración de Wiimote y Kinect, hemos decidido sustituir Wiimote por el reconocimiento de gestos mediante el acelerómetro del móvil, pues esta es una opción mucho más interesante y que tiene más sentido a la hora de integrarla en la aplicación Android que ya tenemos diseñada. De esta manera, en lugar de tener que manejar otro mando especial para ello, es haciendo gestos con su propio móvil en la mano con lo que el usuario controlará a Kigo.

En esta entrada explicaremos de forma cualitativa el funcionamiento de nuestro sistema de reconocimiento de gestos y todo lo que el usuario necesitaría saber para manejarlo correctamente. Dejaremos para entradas posteriores la explicación de la estructura compleja de Software que hemos desarrollado, las modificaciones introducidas en el software de la aplicación Android y la explicación del Algoritmo de Alineamiento Temporal (DTW-Dynamic Time Warping), gracias al que calculamos distancias entre dos vectores de aceleraciones.


FASES DEL RECONOCIMIENTO DE GESTOS

Podemos dividir el reconocimiento de gestos mediante el acelerómetro de un dispositivo Android en 4 fases distintas:





  1. Fase de entrenamiento  

    Para poder comparar gestos que realicemos con unos patrones, inicialmente tendremos que realizar un entrenamiento de aquellos gestos que queremos que se consideren “patrón”.

    Cada gesto que enseñemos irá asociado mediante un número de identificación a uno de los comandos que puede reconocer el robot Kigo y permanecerá en memoria hasta que se cierre la aplicación Android.

    En la aplicación Android, el entrenamiento se realiza a través del
    menú principal. En primer lugar, tenemos que seleccionar en una lista desplegable a qué comando queremos asociar el nuevo gesto cuyo entrenamiento vamos a realizar. Después, hay que accionar el botón de “Empezar Entrenamiento”.

    El entrenamiento de un gesto patrón se completa cuando hayamos realizado
    3 iteraciones del mismo. Esto nos permitirá almacenar en 3 estructuras de datos distintas las coordenadas de la aceleración sufrida por el dispositivo móvil al realizar ese movimiento. Hemos decidido realizar 3 iteraciones porque, si fuesen menos, sería menos precisa la comparación de gestos y, si fuesen más, la fase de entrenamiento se alargaría demasiado y no obtendríamos mucha más precisión.

    Para completar una iteración, accionamos el botón “
    Empezar gesto”, realizamos el movimiento que queremos y accionamos “Finalizar gesto”. Repetimos este proceso 3 veces y, cuando hayamos terminado, accionamos “Finalizar entrenamiento”.

    Tras esto, podemos entrenar un nuevo gesto cambiando la selección en la lista desplegable, modificar el que ya hemos enseñado o pasar a la fase de realización de gestos.

  2. Fase de realización de gestos   

    Si  ya tenemos algún gesto almacenado en memoria como patrón, podemos empezar a realizar movimientos para dar órdenes al robot Kigo.
    Para ello, nos moveremos a la ventana de “
    Gestos” en la aplicación Android y accionaremos el botón “Iniciar gesto”. Esto hará que se cree un Listener de gestos que continuamente esté comprobando si realizamos algún movimiento.

    Cuando se detecte que la energía de la aceleración sufrida por el dispositivo Android supera ciertos umbrales durante un determinado tiempo, se considerará que estamos realizando un gesto y se empezarán a almacenar coordenadas de esta aceleración. Este proceso será explicado con mucho más detalle cuando hablemos del software de reconocimiento de gestos.

    Esto supone que podemos realizar gestos de una manera continua, pues los umbrales nos permiten distinguir lo que son movimientos hechos a propósito y lo que es estado de reposo.

  3. Fase de comparación con los patrones

    Una vez que se han almacenado las coordenadas del gesto que acabamos de realizar y se detecta que el movimiento ha terminado, se calcula la distancia de este gesto con todos los que tenemos como patrones mediante el algoritmo de alineamiento temporal dinámico (DTW) para saber a cuál se parece más.
    Se le asocia al gesto realizado el número de identificación de aquel patrón respecto al cual su distancia es mínima.

  4. Fase de envío de comandos

    Cuando el gesto que hemos realizado ya tiene asignado un número de identificación, sólo queda enviarle por Bluetooth al robot el comando asociado a ese identificador:



    Es la aplicación Android quien se encarga del envío de los comandos; además, nos muestra en la pantalla del móvil cuál de los comandos es el que se ha reconocido.



Cuando queramos dejar de controlar al robot mediante este sistema de reconocimiento de gestos, tendremos que accionar el botón “Detener gesto” para deshabilitar el Listener de gestos. De lo contrario, el acelerómetro seguirá constantemente detectando los movimientos del dispositivo y estaremos consumiendo recursos del móvil.

Es importante señalar que, con el sistema que hemos implementado, mientras tengamos habilitado el reconocimiento de gestos podemos realizar un gesto detrás de otro y se le irán enviando los comandos al robot de forma secuencial.


No hay comentarios:

Publicar un comentario