I sensori di posizione in Android

Android mette a disposizione un gran numero di sensori per rilevare la posizione del dispositivo come il sensore del campo magnetico e quello di prossimità

Per determinare la posizione di un dispositivo, alcuni dei sensori messi a disposizione da Android sono:

  • Orientation sensor di tipo software-based e deriva i suoi dati dall’accelerometro e dal sensore di campo geomagnetico. Questo sensore è stato deprecato a partire da Android 2.2 (API Level 8).
  • Proximity sensor di tipo hardware-based e consente di conoscere quanto è vicino un oggetto al dispositivo.
  • Geomagnetic field sensor di tipo hardware-based e misura il campo magnetico della terra.

I sensori di movimento sono utilizzati per determinare la posizione fisica di un dispositivo. Ad esempio, si può utilizzare il campo geomagnetico in combinazione con l’accelerometro per determinare la posizione relativa del dispositivo rispetto al campo magnetico del Polo Nord. Questi tipi di sensori non vengono usati di solito per monitorare i movimento del dispositivo, a differenza dei Motion Sensor.

Il campo geomagnetico e il sensore di orientamento ritornano un array multidimensionale di valori dei sensori per ogni SensorEvent. Ad esempio, il sensore di orientamento fornisce al campo geomagnetico i valori di intensità di campo geomagnetiche per ognuno dei tre assi durante un singolo evento. Solo il sensore di prossimità restituisce un singolo valore per ogni evento.

L’elenco completo dei sensori messi a disposizione da Android per la posizione è:

  • TYPE_GAME_ROTATION_VECTOR
  • TYPE_GEOMAGNETIC_ROTATION_VECTOR
  • TYPE_MAGNETIC_FIELD
  • TYPE_MAGNETIC_FIELD_UNCALIBRATED
  • TYPE_ORIENTATION
  • TYPE_PROXIMITY

Game Rotation Vector Sensor

Il sensore del vettore di rotazione dei giochi, o game rotation vector sensor, è simile al vettore di rotazione semplice ad eccezione che non utilizza il campo geomagnetico (di conseguenza l’asse y non punta obbligatoria a nord). Di conseguenza risulta più preciso e non viene influenzato dalle variazioni del campo magnetico.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);

Geomagnetic Rotation Vector Sensor

Il sensore del vettore di rotazione geomagnetico, o geomagnetic rotation vector sensor, è simile al sensore del vettore di rotazione dei giochi ma utilizza il magnometro al posto del giroscopio. L’accuratezza di questo sensore è più bassa rispetto al rotation vector ma consuma meno energia, di conseguenza è consigliato usare questo sensore solo se si vogliono raccogliere delle informazioni di rotazione in background, senza consumare troppa energia della batteria. Spesso il sensore del vettore di rotazione geomagnetico viene utilizzato in combinazione con il batching.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);

Sensore di orientamento

Il sensore di orientamento, o orientation sensor, consente di monitorare la posizione del dispositivo rispetto alla terra (in particolare, rispetto il campo magnetico del polo nord).

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

Questo sensore ricava i dati usando il sensore del campo geomagnetico del dispositivo in combinazione con l’accelerometro. Usando questi due sensori hardware vengono forniti i seguenti dati:

  • Azimuth (gradi di rotazione attorno all’asse Z). Rappresenta l’angolo tra il campo magnetico del nord e l’asse y del dispositivo. Ad esempio, se l’asse y del dispositivo è allineato con il campo magnetico del nord e il suo valore è 0, e se l’asse y del dispositivo punta a sud questo valore è 180. Analogamente, quando l’asse y punta est questo valore è 90 e quando punta ovest questo valore è 270.
  • Pitch (gradi di rotazione attorno all’asse X). Questo valore è positivo quando l’asse z positivo ruota verso l’asse y positivo, ed è negativo quando l’asse z positivo ruota verso l’asse y negativo. L’intervallo di valori è da 180 gradi a -180 gradi.
  • Roll (gradi di rotazione attorno all’asse y). Questo valore è positivo quando l’asse z positivo ruota verso l’asse x positivo, ed è negativo quando l’asse z positivo ruota verso l’asse x negativo. L’intervallo di valori è da 90 gradi a -90 gradi.

Assi posizione dispositivo Android

Le definizioni appena fornite sono diverse dalle definizione dell’imbardata, dal beccheggio e dal rollio utilizzati in aviazione, in cui l’asse x è lungo il lato lungo del piano (dalla coda al naso). Inoltre, per ragioni storiche l’angolo di rollio è positiva in senso orario (matematicamente parlando, dovrebbe essere positivo in senso antiorario).
Il sensore di orientamento restituisce dei risultati elaborando i dati del sensore dall’accelerometro e dal campo geomagnetico. A causa dei tanti dati coinvolti, l’accuratezza e la precisione del sensore di orientamento sono ridotte (in particolare, questo sensore è affidabile soltanto quando il componente di rollio è 0). Di conseguenza, il sensore di orientamento è stato deprecato da Android 2.2 (API Level 8) e invece di usare i dati grezzi dal sensore di orientamento, si consiglia di utilizzare il metodo getRotationMatrix() in combinazione con il metodo getOrientation() per calcolare i valori di orientamento. È anche possibile utilizzare il metodo remapCoordinateSystem() per tradurre i valori di orientamento alla nostra applicazione di riferimento.

Geomagnetic Field Sensor

Il sensore del campo geomagnetico, o geomagnetic field sensor, consente di monitorare i cambiamenti del campo magnetico della terra. Per utilizzare questo sensore scriveremo:

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);


In genere le applicazioni non utilizzano direttamente questo senso ma si implementano il sensore rotation vector per determinare il movimento rotazionale oppure con l’accelerometro con il metodo getRotationMatrix() per ottenere la matrice di rotazione e di inclinazione. Queste matrici possono essere usate con i metodi getOrientation() e getInclination() per avere rispettivamente l’azimuth e l’inclinazione geomagnetica.

Magnometro non calibrato

Il sensore del magnometro non calibrato, o uncalibrated magnetometer, è molto simile al sensore del campo magnetico ad eccezione del fatto che non viene applicata la calibrazione hard iron al campo magnetico. In questo sensore la calibrazione di fabbrica e la compensazione della temperatura sono ancora applicate al campo magnetico, ciò consente al magnetometro non calibrato di risultare molto utile per gestire le cattive stime dell’hard iron. In generale, avremo che il valore di geomagneticsensor_event.values [0] sarà vicino al valore :

uncalibrated_magnetometer_event.values[0] – uncalibrated_magnetometer_event.values[3]

Ciò significa che:

calibrated_x ~= uncalibrated_x – bias_estimate_x

I Android i sensori non calibrati forniscono più risultati e possono includere polarizzazioni e distorsioni, ma la loro misurazione contengono pochi sbalzi dalle correzioni applicate dalla calibrazione. Alcune applicazioni preferiscono utilizzare dati non calibrati come gli smootheroppure se un’applicazione sta cercando di effettuare una fusione dei dati ricevuti dai sensori, introducendo eventuali calibrazioni si possono falsare i risultati. Infine, il magnometro non calibrato fornisce una stima polarizzazione/distorsione dell’hard iron in ogni asse.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD_UNCALIBRATED);

Sesore di prossimità

Il sensore di prossimità, o proximity sensor, consente di determinare se un oggetto è vicino oppure lontano dal dispositivo.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);


In genere, questo sensore viene utilizzato per disattivare lo schermo del dispositivo quando si avvicina il telefono all’orecchio durante una chiamata per ridurre il consumo della batteria. Molti sensori di prossimità ritornano la distanza in centimetri, altri invece ritornano solo i valori “vicino” o “lontano”.
Avremo:

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

Indice:

  1. I sensori in Android
  2. I sensori di movimento in Android
  3. I sensori ambientali in Android
  4. I sensori di posizione in Android

Per approfondire Android ecco la guida completa completa: Guida Android.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *