Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 17. Sensores
Tema 17. Sensores
Tema 17
Sensores
TEMA 17. SENSORES
Introducción
La mayor parte de los dispositivos con Android instalado incluye diversos tipos de sensores que
son capaces de proveer datos de orientación y de movimiento, así como de diferentes
parámetros medioambientales, con una gran precisión y exactitud.
La API de Android no solo provee acceso a sensores basados en hardware, físicos, sino que
también provee acceso a sensores basados únicamente en software. Los sensores basados en
hardware son componentes físicos incluidos en el dispositivo que derivan sus datos de
mediciones directas de ciertas propiedades del entorno, como la aceleración o la fuerza del
campo magnético terrestre. Los sensores basados en software derivan sus datos de uno o más
sensores basados en hardware como, por ejemplo, el sensor de aceleración lineal o el sensor
de gravedad.
Como en general cada dispositivo Android incluye unos u otros tipos de sensores, así como
distinto número de sensores de un mismo tipo, es necesario asegurar la existencia de dichos
sensores antes de intentar utilizarlos.
Tipos de sensores
Framework Sensor
Para obtener los datos de los sensores, se debe acceder al framework que los gestiona. Dicho
framework forma un conjunto de clases contenidas en el paquete android.hardware:
En general, las aplicaciones que utilicen sensores deberán primero identificar qué sensores
están disponibles 1, y cuáles son sus capacidades, para a continuación monitorizar los eventos
enviados desde los sensores.
Cada vez que existe un cambio en uno de los parámetros que esté midiendo un sensor, se
lanzará un evento, el cual proporcionará cuatro bloques de información: nombre del sensor,
momento del evento, precisión del evento y datos en bruto de los parámetros medidos (que
hicieron que se lanzara el evento).
1
El número y tipo de sensores no solo depende del dispositivo sino también de la versión de Android que esté
instalada. En Android 2.3 no existen ni el sensor de temperatura ni el de humedad. En Android 2.2 y versiones
inferiores, no existen, además, los sensores de gravedad, de aceleración lineal, de presión, de rotación, ni el
giróscopo.
Android proporciona un conjunto de clases con métodos que permiten determinar en tiempo
de ejecución qué sensores tiene un dispositivo, y cuáles son sus capacidades, máximo rango,
resolución y requisitos de consumo de energía.
Para identificar qué sensores tiene un dispositivo, será necesario obtener una referencia al
servicio que gestiona los sensores invocando al método de contexto
getSystemService(Context.SENSOR_SERVICE), el cual devolverá una instancia de
SensorManager. Se podrá entonces obtener el listado de sensores invocando
getSensorList(), pasando como parámetro el tipo de listado (todos los sensores o sensores
de un tipo determinado):
sensores miden en intervalos regulares y fueron introducidos en Android 2.3 (nivel de API 9).
Un sensor devuelve cero a través de este método si solo mide cambios de estado en el
parámetro que mide (como por ejemplo en el caso de ciertos sensores de proximidad).
Otros métodos dan más información del sensor como, por ejemplo, su tipo, su nombre o el
fabricante y la versión del mismo. La información del fabricante y versión del sensor es útil
para poder diferenciar funcionalidades en los dispositivos ya que un sensor de un tipo
concreto puede tener mejores capacidades que otro de ese mismo tipo pero de otro
fabricante o versión.
Para monitorizar los datos en bruto de los sensores es necesario implementar dos métodos
callback expuestos en la interfaz SensorEventListener:
El siguiente código muestra cómo obtener datos de un sensor tipo acelerómetro, para
mostrarlos en una TextView.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensor);
mSensorManager =
(SensorManager) getSystemService(Context.SENSOR_SERVICE);
mAccelerometer =
mSensorManager.getDefaultSensor(
Sensor.TYPE_ACCELEROMETER);
mTextViewSensorData =
(TextView) findViewById(R.id.textViewSensorData);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// La precisión del sensor ha cambiado
}
@Override
public void onSensorChanged(SensorEvent event) {
mTextViewSensorData
.setText("(" + x + ", " + y + ", " + z + ")");
}
@Override
protected void onResume() {
super.onResume();
mSensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
mSensorManager.unregisterListener(this);
}
}
Este delay, no obstante, puede ser modificado por el propio sistema o por otras aplicaciones,
las cuales deberán especificar el delay más largo posible (la tasa de muestreo más lenta
posible) que satisfaga sus necesidades, de modo que se minimice la carga de proceso en la
CPU así como el consumo energético global del dispositivo.
Debido a que no hay garantías de que los eventos se envíen a la aplicación exactamente con el
delay especificado, se deberán usar las marcas de tiempo asociadas a cada SensorEvent para
promediar sobre varios eventos la tasa de muestreo real de los datos del sensor. El delay
especificado no puede ser modificado a no ser que se elimine la suscripción del listener para, a
continuación, registrarlo de nuevo.
Como las tasas de muestreo de datos de sensores son elevadas, el sistema invoca el método
onSensorChanged() con bastante frecuencia, por lo que este método deberá consumir la
mínima cantidad de tiempo posible. Cualquier cálculo o filtrado de los datos deberá realizarse
fuera de este método para evitar que sea bloqueado.
En caso de que la aplicación utilice algún sensor específico como funcionalidad opcional, esta
podrá deshabilitarse en tiempo de ejecución si el sensor no existe en dicho dispositivo.
<uses-feature
android:name="android.hardware.sensor.accelerometer"
android:required="true" />
Sistemas de coordenadas
El framework de sensores utiliza un sistema de tres coordenadas que representan los tres ejes
del espacio, (x, y, z), para expresar los valores de los sensores de aceleración, gravedad,
giróscopo, aceleración lineal y campo magnético. Cuando un dispositivo es sostenido en su
posición natural, el eje X será horizontal (sentido creciente hacia la derecha), el eje Y será
vertical (sentido creciente ascendente) y el eje Z será perpendicular a la pantalla (sentido
creciente según aumenta la distancia al dispositivo) 2.
Es importante tener en cuenta que cuando cambia la orientación del dispositivo, la orientación
de los ejes( el sistema de coordenadas), no cambia 3. Es decir, el eje X siempre apunta hacia el
Este, el eje Y hacia el Norte y el eje Z es el azimut.
También es importante cuando se procesen los datos de los sensores no asumir que la
orientación natural de un dispositivo es vertical, como ocurre en el caso de las tablets, donde
la orientación natural es horizontal. Por lo tanto, si la aplicación va a ajustar los datos del
sensor al display de la pantalla, se deberá usar el método Display.getRotation() para
obtener la orientación de la pantalla, y entonces utilizar el método
SensorManager.remapCoordinateSystem() para mapear las coordenadas del sensor con las
de la pantalla. Este proceso deberá realizarse incluso si en el manifiesto de la aplicación se ha
especificado display portrait al añadir, a cada elemento <activity > deseado, el atributo
android:screenOrientation="portrait".
2
Salvo en el caso del sensor de orientación y el sensor de rotación, que utilizan el sistema de referencia mundial.
3
Al igual que ocurre con el sistema de coordenadas de OpenGL.