jueves, 19 de abril de 2012

El acelerómetro de un dispositivo Android

El próximo paso que vamos a dar en nuestro proyecto es la implementación del reconocimiento de gestos mediante el acelerómetro de un dispositivo Android.

Un acelerómetro es un sensor que mide la aceleración relativa, tomando como referencia la de caída libre (es decir, en la Tierra la referencia será g = 9,81 m/s^2). Por lo tanto, la medida que nos dará un acelerómetro será:

Esto quiere decir que, si el móvil se encuentra en reposo sobre la mesa, la medida del acelerómetro será A= 9,81 m/s^2. Sin embargo, si sufre una caída libre, obtendremos como medida A=0.


En los dispositivos Android, el sistema de coordenadas es relativo a la pantalla:

  • Eje x: Es horizontal y apunta a la derecha.
  • Eje y: Es vertical y apunta hacia arriba.
  • Eje z: Es la normal saliente a la pantalla del dispositivo.

Las librerías de Android nos proporcionan varias clases e interfaces que nos permiten trabajar con sus sensores (entre ellos el acelerómetro) y que nosotros usaremos:


Clase Sensor

Como su nombre indica, esta clase representa un sensor.

A través de distintas constantes de tipo int determinamos con qué sensor estamos trabajando: de temperatura, de presión, de humedad relativa, de luz, etc. El acelerómetro lleva asociada la constante TYPE_ACCELEROMETER, que toma el valor 1.

Los métodos que incluye nos permiten conocer el rango máximo del sensor, su resolución, la versión del módulo o la potencia que consume.


Clase SensorEvent

Esta clase representa un evento relacionado con un sensor y contiene información sobre él: de qué tipo es el sensor que ha generado el evento, su precisión, el instante temporal en que se ha producido el evento (en nanosegundos) y un array de valores que depende del sensor que se esté monitorizando.

En el caso del acelerómetro, el array de valores está formado por los siguientes floats:

  • values[0]: aceleración en el eje x
  • values[1]: aceleración en el eje y
  • values[2]: aceleración en el eje z
Todos estos valores son relativos a la aceleración de la gravedad.


Interfaz SensorEventListener

Al implementar esta interfaz, hay que definir dos métodos:

  • public abstract void onSensorChanged(SensorEvent event): se llama a este método cuando los valores de un sensor han cambiado. Por ejemplo, podemos usar este método para almacenar los nuevos valores que ha leído el sensor.

  • public abstract void onAccuracyChanged(Sensor sensor, int accuracy): es llamado si la precisión de un sensor cambia.

Clase SensorManager

Esta clase nos permite acceder a los sensores de los dispositivos. De todos los métodos que presenta, los dos más importantes son:

  • public boolean registerListener (SensorEventListener listener, Sensor sensor, int rate): Asocia un SensorEventListener a un determinado sensor, de forma que podemos detectar si los valores del sensor cambian y leer los nuevos valores. Tenemos que especificar una velocidad a la que los eventos son detectados (por ejemplo, cada cuánto tiempo queremos comprobar las coordenadas de la aceleración del acelerómetro si se está produciendo movimiento). El valor de este parámetro de entrada puede ser: SENSOR_DELAY_NORMAL (recomendado para cambios en la orientación de la pantalla), SENSOR_DELAY_UI (recomendado para la interfaz de usuario), SENSOR_DELAY_GAME (recomendado para juegos), o SENSOR_DELAY_FASTEST (se obtienen las lecturas lo más rápido posible) o el retardo deseado entre eventos en microsegundos. El método devuelve true si el sensor está habilitado.

  • public void unregisterListener (SensorEventListener listener): Elimina la asociación entre el listener y los sensores.

Con todas estas herramientas disponibles, podremos asociar gestos realizados con el móvil con unas determinadas coordenadas de la aceleración sufrida por el acelerómetro durante el gesto. Así almacenaremos en memoria una serie de gestos patrón que irán asociados a comandos del robot (avanzar, retroceder, rotar, parar…). Al realizar un nuevo gesto, compararemos sus coordenadas con las de todos los patrones y calcularemos cuál de ellos se encuentra a la menor distancia. De esta forma, decidiremos cuál es el comando que hay que enviar por Bluetooth al robot Kigo.

No hay comentarios:

Publicar un comentario