2008-10-13 13 views
19

Mi objetivo es reconocer los gestos simples de acelerómetros montados en un punto de sol. Un gesto podría ser tan simple como girar el dispositivo o mover el dispositivo con diferentes movimientos. Actualmente, el dispositivo solo tiene acelerómetros, pero estamos considerando agregar giroscopios si lo hiciera más fácil/más preciso.Cómo hacer reconocimiento de gestos usando acelerómetros

¿Alguien tiene recomendaciones sobre cómo hacer esto? ¿Alguna biblioteca disponible en Java? ¿Proyectos de ejemplo que recomiendas? Papeles que recomiendas

The sun spot es una plataforma Java para ayudarlo a crear prototipos rápidos de sistemas. Está programado usando Java y puede retransmitir comandos a una estación base conectada a una computadora. Si necesito explicar cómo funciona el hardware, déjeme un comentario.

Respuesta

21

Los acelerómetros registrarán una aceleración constante debido a la gravedad, más cualquier aceleración a la que el usuario se someta, más ruido.

Necesitará un filtro de paso bajo para eliminar el ruido irrelevante que pueda. Lo peor del ruido generalmente será una frecuencia más alta que cualquier aceleración inducida por el hombre.

Tenga en cuenta que cuando el dispositivo no está siendo acelerado por el usuario, la única fuerza se debe a la gravedad, y por lo tanto puede deduce its attitude en el espacio. Además, cuando la aceleración total varía mucho de 1g, debe ser debido a que el usuario acelera el dispositivo; al restar la última estimación de gravedad conocida, puede estimar aproximadamente en qué dirección y cuánto está acelerando el usuario el dispositivo, y así obtener datos que puede comenzar a coincidir con una lista de gestos conocidos.

Con un solo acelerómetro de tres ejes, puede detectar el cabeceo y el balanceo actuales, y también la aceleración del dispositivo en línea recta. La integración de la aceleración menos la gravedad te dará una estimación de la velocidad actual, pero la estimación se alejará rápidamente de la realidad debido al ruido; tendrá que hacer suposiciones sobre el comportamiento del usuario antes/durante/durante los gestos, y guiarlos a través de su UI, proporcionar puntos donde el dispositivo no se está acelerando y puede restablecer sus estimaciones y estimar de manera confiable la dirección de la gravedad. Es poco probable que la integración de nuevo para encontrar una posición proporcione resultados utilizables durante un período de tiempo útil.

Si tiene dos acelerómetros de tres ejes separados por distancias, o uno y algunos giroscopios, también puede detectar la rotación del dispositivo (al comparar los vectores de aceleración, o directamente desde los giroscopios); la integración del momento angular en un par de segundos le dará una estimación de la desviación actual con respecto a cuando comenzó a integrarse, pero una vez más esto se desviará de la realidad rápidamente.

+0

Muchas gracias esto fue muy útil. – smaclell

+0

¿Realmente registran una aceleración constante debido a la gravedad? Quiero decir lógicamente que deberían, pero parece contra-intuitivo :-) –

+2

Sí, lo hacen. Piense en ellos como masas en resortes, con la "aceleración" informada de la cantidad de estiramiento/compresión; entonces es bastante intuitivo. – moonshadow

1

Agregando a punto de sombra de la luna por tener que reajustar su línea de base para la gravedad y la rotación ...

menos que se espere que el dispositivo tenga momentos de descanso estables (donde la única fuerza que actúa sobre él es la gravedad) para restablecer su base de medición, su sistema eventualmente desarrollará un equivalente de vértigo.

+0

¿Debido a la deriva del sensor? o simplemente paralizar los valores antiguos? – smaclell

+0

Básicamente, desea que el sistema recorte la deriva del sensor sobre la temperatura y el tiempo. Pero ese recorte no puede ocurrir si no tienes un tiempo tranquilo. – Toybuilder

5

Lo que no se ha mencionado aún es el reconocimiento de gestos real. Esta es la parte difícil. Después de haber limpiado sus datos (filtrado de paso bajo, normalizado, etc.) todavía tiene la mayor parte del trabajo por hacer.

Echa un vistazo a los modelos de Hidden Markov. Este parece ser el enfoque más popular, pero su uso no es trivial. Por lo general, hay un paso de preproceso. Primero, hacer STFT y agrupar el vector resultante en un diccionario, luego alimentarlo en un HMM. Eche un vistazo a jahmm en el código de google para una lib de java.

+5

Gracias por tomar una puñalada. El proyecto fue para la escuela y fue bastante bien. Para el reconocimiento de gestos real, terminamos usando una variante del Reconocedor de $ 1 que no se interesaba por la rotación y tenía una dimensión extra. Es un método basado en plantilla que no realiza ningún entrenamiento real sobre los datos en absoluto. Para simplificarlo, no hicimos ninguna segmentación de gestos y en su lugar utilizamos un "interruptor" para indicar cuándo se inició/detuvo un gesto. Nuestro método tenía muy buena precisión/rendimiento dado que alrededor de 5 plantillas por gesto tenían más del 90% de precisión en el campo con un tiempo de cálculo inferior a milisegundos. – smaclell

+0

@smaclell suena muy interesante. ¿Abriste el código? ¿Conoces algún recurso sobre cómo aplicar el reconocedor 1 $ a los acelerómetros de 3 ejes? – Fgblanch

+0

Como fue para un proyecto escolar, no abrimos la fuente. Cuando estábamos trabajando en eso no había buenos recursos disponibles. Nuestros cambios se describen en mi comentario anterior, pero si tiene problemas, puedo enviarle un mensaje. – smaclell

7

Ya que nadie parece haber mencionado las bibliotecas existentes, conforme a lo solicitado por la OP, aquí va:

http://www.wiigee.org/

diseñado para su uso con el Wiimote, wiigee es una aplicación basada en Java de código abierto para la coincidencia de patrones basado en las lecturas del acelerómetro. Lo logra usando Hidden Markov Models [1].

Al parecer fue utilizado con gran éxito por una empresa, Espina Tecnologías, y han mencionado su experiencia aquí: http://www.thorntech.com/2013/07/mobile-device-3d-accelerometer-based-gesture-recognition/

Alternativamente, usted podría considerar FastDTW (https://code.google.com/p/fastdtw/). Es menos preciso que el DTW [2] normal, pero también es menos costoso desde el punto de vista informático, lo cual es un gran problema cuando se trata de sistemas integrados o dispositivos móviles.

[1] https://en.wikipedia.org/wiki/Hidden_Markov_model
[2] https://en.wikipedia.org/wiki/Dynamic_time_warping

EDIT: El PO ha mencionado en uno de los comentarios que completó su proyecto, con una precisión del 90% en el campo y un tiempo de cómputo sub-milisegundo , usando una variante de $1 Recognizer. También menciona que la rotación no era un criterio en su proyecto.

Cuestiones relacionadas