I sensori di movimento in Android

Android mette a disposizione un gran numero di sensori per identificare i movimenti effettuati dal dispositivo, tra questi troviamo l’accelerometro, il giroscopio e il contapassi

In Android i sensori possono essere sia hardware che software, ad esempio sono sensori di tipo hardware-based l’accelerometro e il giroscopio, mentre altri possono essere sia hardware che software-based come il sensore di gravità, l’accelerazione lineare e il sensore del vettore di rotazione. Un sensore di tipo software può ricevere dati dai sensori in base al dispositivo utilizzato, ad esempio se un dispositivo non possiede il giroscopio, l’applicazione può ricavare i dati dall’accelerometro e dal magnetometro, mentre se il giroscopio è supportato verranno presi i dati direttamente da questo sensore.

L’Android Open Source Project (AOSP) mette a disposizione tre sensori di movimento software-based: il sensore di gravità, il sensore di accelerazione lineare, il vettore di rotazione e il giroscopio (aggiunto dalla versione 4.0).

In Android per “movimento del device” si intendono tutti quei movimenti effettuato al dispositivo (inclinazione, scuotimento, rotazione e oscillazione). I movimenti possono essere sia volontari che involontari, ad esempio se ci si trova in macchina le vibrazioni dell’automobile influenzano i movimenti del dispositivo.

Ecco l’elenco dei sensori di movimento che possono essere installati sui dispositivi Android:

  • TYPE_ACCELEROMETER
  • TYPE_GRAVITY
  • TYPE_GYROSCOPE
  • TYPE_GYROSCOPE_UNCALIBRATED
  • TYPE_LINEAR_ACCELERATION
  • TYPE_ROTATION_VECTOR
  • TYPE_SIGNIFICANT_MOTION
  • TYPE_STEP_COUNTER
  • TYPE_STEP_DETECTOR

Tutti i motion sensor ritornano un array multidimensionale di valori per ogni SensorEvent. Ad esempio, l’accelerometro e il giroscopio ritornano i dati, relativi ai 3 assi di coordinate, in un array di tipo float insieme ad altri parametri del SensorEvent.

Per monitorare i movimenti di un dispositivo spesso ci si affida al vettore di rotazione e al sensore di gravità. In particolare, il vettore di rotazione viene utilizzato per calcolare il cambiamento dell’angolo di movimento, rilevare i gesti e monitorare il cambiamento dell’orientamento. Per questi motivi, il vettore di rotazione viene molto utilizzato nei giochi interattivi risultando più affidabile dell’accelerometro e del campo geomagnetico.

Assi posizione dispositivo Android

Accelerometro

Il sensore di accelerazione misura l’accelerazione applicata al dispositivo (inclusa la forza di gravità):

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);


Questo sensore consente di determinare l’accelerazione che è applicata al dispositivo misurando la forza che viene applicata al sensore stesso usando la seguente relazione:
accelerazione = – gravità – (Sommatoria delle forze sul sensore) / massa

Sensore di gravità

Il sensore di gravità fornisce un vettore di tre dimensioni ed indica la direzione e la magnitudine della gravità.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);

Giroscopio

Il giroscopio misura il tasso o rotazione in radianti/secondi intorno all’asse x, y, z di un dispositivo.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);


L’accelerometro utilizzato per misurare l’accelerazione di un corpo lungo una direzione, per poter misurare l’accelerazione in uno spazio 3D occorre un accelerometro per ogni asse. Invece il giroscopio misura la rotazione di un corpo su di un proprio asse, pertanto è possibile ricavare i valori di velocità angolare. In uno spazio a tre dimensioni saranno necessari anche in questo caso tre sensori.

Giroscopio non calibrato

Il giroscopio non calibrato è molto simile al giroscopio ma non applica la compensazione derivata dal giroscopio applicata al tasso di rotazione.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE_UNCALIBRATED);

Accelerazione lineare

Il sensore dell’accelerazione lineare fornisce un vettore tridimensionale rappresentante l’accelerazione su ogni asse del dispositivo (esclusa la gravità).

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);


L’equivalenza corrisponde a:

accelerazione lineare = accelerazione – accelerazione dovuta alla gravità

In genere l’accelerazione lineare viene usata quando si vuole ottenere l’accelerazione senza l’influenza della gravità (ad es. velocità macchina).

Vettore di rotazione

Il vettore di rotazione rappresenta l’orientamento del dispositivo come una combinazione di un angolo ed un asse, nel quale il dispositivo viene ruotato attraverso un angolo intorno ad un asse (x, y o z).

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);


Si tratta di un sensore software, se un’app richiede questo sensore verranno utilizzati l’accelerometro, la bussola e, se disponibile, il giroscopio.

Assi terrestri di posizione dispositivo Android

Sensore di movimento

Il sensore di movimento attiva un evento ogni volta che un movimento importante viene rilevato, dopo il quale si disabilita. Per movimento significativo si intende un movimento che potrebbe portare ad un cambiamento nella posizione dell’utente, per esempio camminare, andare in bicicletta, o stare seduti in un’automobile in movimento. Ecco come ottenere un’istanza del sensore di movimento significativo di default e come registrare un listener di eventi:

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

  TriggerEventListener mTriggerEventListener = new TriggerEventListener() {
        @Override
        public void onTrigger(TriggerEvent event) {
                // Do work
        }
  };

  mSensorManager.requestTriggerSensor(mTriggerEventListener, mSensor);

Contapassi

Il contatore di passi, o Counter Step, fornisce il numero di passi fatti dall’utente dall’ultimo riavvio. Questo sensore ha una grande latenza (più di 10 secondi) ma è molto più accurato rispetto al Step Detector.

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);

Rilevatore di passi

Registrandosi sul sensore per il rilevamento dei passi, o Step Detector, si riceva un evento ogni volta che l’utente effettua un passo (latenza sotto i 2 secondi).

  mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_DETECTOR);


La differenza tra contapassi e il rilevatore di passi è che il primo conta il numero di passi, il secondo invece ci segnala quando viene effettuato un nuovo passo.

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 *