Sensores de posicionamento no Android (Tradução da documentação oficial)

A plataforma Android fornece dois sensores que permitem que você determine a posição de um dispositivo: o sensor de campo geomagnético e o sensor de orientação. A plataforma Android fornece também um sensor que permite que você determine quão próxima face de um dispositivo está de um objeto (conhecido como sensor de proximidade). O sensor de campo geomagnético e o sensor de proximidade são baseados em hardware. A maioria dos dispositivos de mão incluem um sensor geomagnético, assim como um sensor de proximidade, que determina quando o dispositivo está sendo segurado próximo ao rosto do usuário (por exemplo, durante uma chamada telefônica). O sensor de orientação é baseado em software e deriva seus dados do acelerômetro e do sensor de campo geomagnético.

NESSE DOCUMENTO

  1. Usando o Sensor de Orientação
  2. Usando o Sensor de Campo Geomagnético
  3. Usando o Sensor de Proximidade

CLASSES E INTERFACES CHAVES

  1. Sensor
  2. SensorEvent
  3. SensorManager
  4. SensorEventListener

EXEMPLOS RELACIONADOS

  1. Accelerometer Play
  2. API Demos (OS – RotationVectorDemo)
  3. API Demos (OS – Sensors)

VEJA TAMBÉM

  1. Sensors
  2. Sensors Overview
  3. Motion Sensors
  4. Environment Sensors

Nota: O sensor de orientação foi desaprovado no Android 2.2 (API Level 8).

Sensores de posicionamento são úteis para definir a posição física do dispositivo no quadro de referência do mundo real. Por exemplo,m você pode usar o sensor de campo geomagnético em combinação com o acelerômetro para determinar a posição relativa do dispositivo em relação ao Pólo Norte magnético. Pode também usar o sensor de orientação (ou métodos de orientação baseados em sensores similares) para determinar a posição do dispositivo no quadro de referência de sua aplicação. Sensores de posicionamento não são usados tipicamente para monitorar movimento ou posição, como vibração, inclinação, ou empurrão.

Os sensores de campo geomagnético e de orientação retornam um array multi-dimensional de valores para cada SensorEvent. Por exemplo, o sensor de campo magnético fornece valores da força do campo geomagnético para cada um dos três eixos coordenados durante um único evento de sensor. Da mesma forma, o sensor de orientação fornece os valores do azimute, inclinação, e giro durante um único evento do sensor. O sensor de proximidade fornece um único valor para cada evento. A Tabela 1 resume os sensores de posicionamento que são suportados na plataforma Android.

Tabela 1. Sensores de posicionamento que são suportados na plataforma Android

Sensor Sensor event data Description Units of measure
TYPE_MAGNETIC_FIELD SensorEvent.values[0] Geomagnetic field strength along the x axis. μT
SensorEvent.values[1] Geomagnetic field strength along the y axis.
SensorEvent.values[2] Geomagnetic field strength along the z axis.
TYPE_ORIENTATION1 SensorEvent.values[0] Azimuth (angle around the z-axis). Degrees
SensorEvent.values[1] Pitch (angle around the x-axis).
SensorEvent.values[2] Roll (angle around the y-axis).
TYPE_PROXIMITY SensorEvent.values[0] Distance from object.2 cm

Usando o Sensor de Orientação


O sensor de orientação permite que você monitore a posição de um dispositivo em relação ao referencial da Terra (especificamente o Norte magnético). O código a seguir mostra como obter uma instância do sensor de orientação padrão:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

O sensor de orientação deriva seus dados do uso do sensor de campo geomagnético em combinação com o acelerômetro do dispositivo. Usando esses dois sensores de hardware, um sensor de orientação fornece dados para as seguintes dimensões:

  • Azimute (graus de rotação em torno do eixo z). Esse é o ângulo entre o norte magnético e o eixo y do dispositivo. Por exemplo, se o eixo y do dispositivo estiver alinhado com o norte magnético seu valor será 0, e se o ixo y estiver apontando para o sul seu valor será 180. De forma análoga, quando o eixo y estiver apontando para para o leste seu valor será 90 e quando apontar para o oeste seu valor será 270.
  • Inclinação (graus de rotação em torno do eixo x). Esse valor será positivo quando o eixo z positivo rotaciona na direção do eixo y positivo, e será negativo quando o eixo z positivo rotacionar na direção do eixo y negativo. A faixa de valores pode ir de 180 para -180.
  • Giro (graus de rotação em torno do eixo y). Esse valor será positivo quando o eixo z positivo rotacionar na direção do eixo x positivo e será negativo quando o eixo z positivo girar na direção do eixo x negativo. A faixa de valores vai de 90 a -90.

Essaa definições são diferentes das usadas em aviação, onde o eixo x está junto com o lago maior do avião (da cauda ao nariz). Além disso, por razões históricas, o ângulo do giro é positivo na direção horária (matematicamente falando, deveria ser positiva na direção anti-horária).

O sensor de orientação deriva os seus dados do processamento dos dados brutos do acelerômetro e do sensor de campo geomagnético. Por causa da necessidade de processamento pesado envolvido, a acurácia e precisão do sensor de orientação é reduzida (especificamente, esse sensor é confiável apenas quando o componente “giro” é 0). Por causa disso, o sensor de orientação foi descontinuado no Android 2.2 (API Level 8). Ao invés de usar os dados brutos do sensor de orientação, é recomendável usar o método getRotationMatrix() em conjunto com o getOrientation() para computar os valores da orientação. Você pode usar o método remapCoordinateSystem() para traduzir os valores da orientação para o referencial de sua aplicação.

O código a seguir mostra como obter dados de orientação a partir do sensor de orientação. Recomenda-se usar isso apenas se uma dispositivo possuir um giro desprezível.

public class SensorActivity extends Activity implements SensorEventListener {

  private SensorManager mSensorManager;
  private Sensor mOrientation;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
    // You must implement this callback in your code.
  }

  @Override
  protected void onResume() {
    super.onResume();
    mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    super.onPause();
    mSensorManager.unregisterListener(this);
  }

  @Override
  public void onSensorChanged(SensorEvent event) {
    float azimuth_angle = event.values[0];
    float pitch_angle = event.values[1];
    float roll_angle = event.values[2];
    // Do something with these orientation angles.
  }
}

Você normalmente não precisa executar nenhum processamento ou filtro sobre os dados brutos obtido do sensor de orientação, além da tradução do sistema de coordenadas para o referencial de sua aplicação. O exemplo Accelerometer Play mostra como traduzir os dados do sensor para outro referencial; a técnica é similar a que você pode usar com o sensor de orientação.

Usando o Sensor de Campo Geomagnético


O sensor de campo geomagnético permite que você monitore mudanças no campo magnético da terra. O código a seguir mostra como obter uma instância do sensor de campo geomagnético:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

Esse sensor fornece dados brutos da força do campo (em μT) para cada um dos eixos coordenados. Normalmente, você não precisa usar esse sensor diretamente. Ao invés disso, pode usar o sensor de rotação vetorial para determinar o movimento rotacional bruto ou pode usa-lo em conjunto com o acelerômetro com o método getRotationMatrix() para obter a matriz de rotação e de inclinação. Você pode usar esses matrizes com os métodos getOrientation() e getInclination() para obter o azimute e os dados da inclinação geométrica.

Usando o Sensor de Proximidade


O sensor de proximidade permite que você determine quão distante um objeto está do dispositivo. O código a seguir mostra como obter uma instância do sensor de proximidade padrão:

private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

The proximity sensor is usually used to determine how far away a person’s head is from the face of a handset device (for example, when a user is making or receiving a phone call). Most proximity sensors return the absolute distance, in cm, but some return only near and far values. The following code shows you how to use the proximity sensor:

public class SensorActivity extends Activity implements SensorEventListener {
  private SensorManager mSensorManager;
  private Sensor mProximity;

  @Override
  public final void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // Get an instance of the sensor service, and use that to get an instance of
    // a particular sensor.
    mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
  }

  @Override
  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
    // Do something here if sensor accuracy changes.
  }

  @Override
  public final void onSensorChanged(SensorEvent event) {
    float distance = event.values[0];
    // Do something with this sensor data.
  }

  @Override
  protected void onResume() {
    // Register a listener for the sensor.
    super.onResume();
    mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);
  }

  @Override
  protected void onPause() {
    // Be sure to unregister the sensor when the activity pauses.
    super.onPause();
    mSensorManager.unregisterListener(this);
  }
}

Nota: Alguns sensores de proximidade retornam valores binários que representam “perto” ou “longe”. Nesses casos, o sensor normalmente reporta seu valor máximo como o estado longe e um valor menor como o estado perto. Tipicamente, o valor do estado distante está na faixa > 5 cm, mas isso pode varias de sensor para sensor. Você pode determinar o alcance máximo do sensor pelo uso do método getMaximumRange().

 

  • Edilson Junior

    Qual o alcance máximo do sensor de proximidade?