Questa sezione descrive gli assi dei sensori, i sensori di base e i sensori compositi (attività, assetto, non calibrato e interazione).
Assi del sensore
I valori degli eventi del sensore provenienti da molti sensori sono espressi in un frame specifico statico rispetto al dispositivo.
Assi dei dispositivi mobili
L'API Sensor è relativa solo all'orientamento naturale dello schermo (gli assi non vengono scambiati quando cambia l'orientamento dello schermo del dispositivo.
![Sistema di coordinate di API di sensori per dispositivi mobili](https://developer.android.com/images/axis_device.png?authuser=0&hl=it)
Figura 1. Sistema di coordinate (relativo a un dispositivo mobile) utilizzato dall'API Sensor
Assi automobilistici
Nelle implementazioni Android Automotive, gli assi sono definiti rispetto al telaio della carrozzeria del veicolo. L'origine del sistema di riferimento del veicolo è il centro dell'asse posteriore. Il sistema di riferimento del veicolo è orientato in modo che:
- L'asse X punta a destra e si trova su un piano orizzontale, perpendicolare al piano di simmetria del veicolo.
- L'asse Y punta in avanti e si trova su un piano orizzontale.
![Sistema di coordinate di API di sensori per dispositivi automobilistici](https://source.android.com/static/docs/core/interaction/sensors/images/axis_auto.png?authuser=0&hl=it)
Figura 2. Sistema di coordinate (relativo a un dispositivo automobilistico) utilizzato dall'API Sensor
Il sistema di riferimento del veicolo è un sistema di coordinate destrorso. Pertanto, l'asse Z punta verso l'alto.
L'asse Z del sistema di riferimento è allineato alla gravità, il che significa che l'asse X e l'asse Y sono entrambi orizzontali. Di conseguenza, l'asse Y potrebbe non sempre passare attraverso l'asse anteriore.
Sensori di base
I tipi di sensori di base prendono il nome dai sensori fisici che rappresentano. Questi sensori trasmettono i dati da un singolo sensore fisico (al contrario dei sensori compositi che generano dati da altri sensori). Esempi di tipi di sensori di base includono:
-
SENSOR_TYPE_ACCELEROMETER
-
SENSOR_TYPE_GYROSCOPE
-
SENSOR_TYPE_MAGNETOMETER
Tuttavia, i sensori di base non sono uguali e non devono essere confusi con il sensore fisico sottostante. I dati provenienti da un sensore di base non rappresentano l'output grezzo del sensore fisico perché vengono applicate correzioni (come la compensazione del bias e la compensazione della temperatura).
Ad esempio, le caratteristiche di un sensore di base potrebbero essere diverse dalle caratteristiche del sensore fisico sottostante nei seguenti casi d'uso:
- Un chip giroscopico valutato per avere un intervallo di polarizzazione di 1 grado/sec.
- Dopo la calibrazione di fabbrica, la compensazione della temperatura e la compensazione del bias, il bias effettivo del sensore Android verrà ridotto, fino al punto in cui è garantito che il bias sia inferiore a 0,01 gradi/sec.
- In questa situazione, diciamo che il sensore Android ha un bias inferiore a 0,01 gradi/sec, anche se la scheda tecnica del sensore sottostante diceva 1 grado/sec.
- Un barometro con un consumo energetico di 100 uW.
- Poiché i dati generati devono essere trasportati dal chip al SoC, il costo energetico effettivo per raccogliere i dati dal sensore barometro Android potrebbe essere molto più elevato, ad esempio 1000 uW.
- In questa situazione, diciamo che il sensore Android ha un consumo energetico di 1000 uW, anche se il consumo energetico misurato sui terminali del chip del barometro è di 100uW.
- Un magnetometro che consuma 100uW quando calibrato, ma consuma di più durante la calibrazione.
- La sua routine di calibrazione potrebbe richiedere l'attivazione del giroscopio, consumando 5000 uW, e l'esecuzione di alcuni algoritmi, che costano altri 900 uW.
- In questa situazione, diciamo che il consumo energetico massimo del sensore Android (magnetometro) è di 6000 uW.
- In questo caso, il consumo energetico medio è la misura più utile, ed è quanto riportato nelle caratteristiche statiche del sensore tramite l'HAL.
Accelerometro
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER)
restituisce un sensore di non riattivazione
Un sensore accelerometro segnala l'accelerazione del dispositivo lungo i tre assi del sensore. L'accelerazione misurata comprende sia l'accelerazione fisica (cambio di velocità) che la gravità. La misurazione viene riportata nei campi x, y e z di sensori_event_t.acceleration.
Tutti i valori sono in unità SI (m/s^2) e misurano l'accelerazione del dispositivo meno la forza di gravità lungo i tre assi del sensore.
Ecco alcuni esempi:
- La norma di (x, y, z) dovrebbe essere prossima a 0 in caduta libera.
- Quando il dispositivo è appoggiato su un tavolo e viene spinto dal lato sinistro verso destra, il valore dell'accelerazione x è positivo.
- Quando il dispositivo è appoggiato su un tavolo, il valore di accelerazione lungo z è +9,81 alo, che corrisponde all'accelerazione del dispositivo (0 m/s^2) meno la forza di gravità (-9,81 m/s^2).
- Quando il dispositivo è appoggiato su un tavolo e viene spinto verso il cielo, il valore di accelerazione è maggiore di +9,81, che corrisponde all'accelerazione del dispositivo (+A m/s^2) meno la forza di gravità (-9,81 m /s^2).
Le letture sono calibrate utilizzando:
- Compensazione della temperatura
- Calibrazione del bias online
- Calibrazione della bilancia online
Il bias e la calibrazione della scala devono essere aggiornati solo a sensore disattivato, per evitare di causare salti di valori durante lo streaming.
L'accelerometro segnala anche la precisione che si aspetta che le sue letture siano attraverso sensors_event_t.acceleration.status
. Vedere le costanti SENSOR_STATUS_*
di SensorManager
per ulteriori informazioni sui possibili valori per questo campo.
Temperatura ambiente
Modalità di reporting: in variazione
getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE)
restituisce un sensore di non riattivazione
Questo sensore fornisce la temperatura ambiente (stanza) in gradi Celsius.
Sensore di campo magnetico
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD)
restituisce un sensore di non riattivazione
SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD
Un sensore di campo magnetico (noto anche come magnetometro) segnala il campo magnetico ambientale, misurato lungo i tre assi del sensore.
La misurazione è riportata nei campi x, y e z di sensors_event_t.magnetic
e tutti i valori sono in micro-Tesla (uT).
Il magnetometro segnala anche la precisione che si aspetta che le sue letture siano attraverso sensors_event_t.magnetic.status
. Vedere le costanti SENSOR_STATUS_*
di SensorManager
per ulteriori informazioni sui possibili valori per questo campo.
Le letture sono calibrate utilizzando:
- Compensazione della temperatura
- Calibrazione di fabbrica (o online) del ferro dolce
- Calibrazione online del ferro duro
Giroscopio
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_GYROSCOPE)
restituisce un sensore di non riattivazione
Un sensore giroscopico segnala la velocità di rotazione del dispositivo attorno ai tre assi del sensore.
La rotazione è positiva in senso antiorario (regola della mano destra). Cioè, un osservatore che guarda da una posizione positiva sull'asse x, y o z un dispositivo posizionato sull'origine riporterebbe una rotazione positiva se il dispositivo sembrasse ruotare in senso antiorario. Si noti che questa è la definizione matematica standard di rotazione positiva e non concorda con la definizione aerospaziale di rollio.
La misurazione è riportata nei campi x, y e z di sensors_event_t.gyro
e tutti i valori sono in radianti al secondo (rad/s).
Le letture sono calibrate utilizzando:
- Compensazione della temperatura
- Compensazione su scala di fabbrica (o online).
- Calibrazione del bias online (per rimuovere la deriva)
Il giroscopio segnala anche la precisione che si aspetta che le sue letture siano attraverso sensors_event_t.gyro.status
. Vedere le costanti SENSOR_STATUS_*
di SensorManager
per ulteriori informazioni sui possibili valori per questo campo.
Il giroscopio non può essere emulato sulla base di magnetometri e accelerometri, poiché ciò causerebbe una riduzione della coerenza e della reattività locale. Deve essere basato su un normale chip giroscopico.
Frequenza cardiaca
Modalità di reporting: in variazione
getDefaultSensor(SENSOR_TYPE_HEART_RATE)
restituisce un sensore di non riattivazione
Un sensore di frequenza cardiaca segnala la frequenza cardiaca attuale della persona che tocca il dispositivo.
La frequenza cardiaca attuale in battiti al minuto (BPM) è riportata in sensors_event_t.heart_rate.bpm
e lo stato del sensore è riportato in sensors_event_t.heart_rate.status
. Vedere le costanti SENSOR_STATUS_*
di SensorManager
per ulteriori informazioni sui possibili valori per questo campo. In particolare, alla prima attivazione, a meno che non si sappia che il dispositivo non è sul corpo, il campo stato del primo evento deve essere impostato a SENSOR_STATUS_UNRELIABLE
. Poiché questo sensore è in continuo cambiamento, gli eventi vengono generati quando e solo quando heart_rate.bpm
o heart_rate.status
sono cambiati dall'ultimo evento. Gli eventi vengono generati non più velocemente di ogni sampling_period
.
sensor_t.requiredPermission
è sempre SENSOR_PERMISSION_BODY_SENSORS
.
Leggero
Modalità di reporting: in variazione
getDefaultSensor(SENSOR_TYPE_LIGHT)
restituisce un sensore di non riattivazione
Un sensore di luce segnala l'illuminazione attuale in unità SI lux.
La misurazione è riportata in sensors_event_t.light
.
Prossimità
Modalità di reporting: in variazione
Solitamente definito come sensore di sveglia
getDefaultSensor(SENSOR_TYPE_PROXIMITY)
restituisce un sensore di riattivazione
Un sensore di prossimità segnala la distanza dal sensore alla superficie visibile più vicina.
Fino ad Android 4.4, i sensori di prossimità erano sempre sensori di risveglio, che attivavano il SoC quando rilevava un cambiamento di prossimità. Dopo Android 4.4, consigliamo di implementare prima la versione di risveglio di questo sensore, poiché è quella che serve per accendere e spegnere lo schermo mentre si telefona.
La misura è riportata in centimetri in sensors_event_t.distance
. Tieni presente che alcuni sensori di prossimità supportano solo una misurazione binaria "vicino" o "lontano". In questo caso, il sensore riporta il suo valore sensor_t.maxRange
nello stato "lontano" e un valore inferiore a sensor_t.maxRange
nello stato "vicino".
Pressione
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_PRESSURE)
restituisce un sensore di non riattivazione
Un sensore di pressione (noto anche come barometro) segnala la pressione atmosferica in ettopascal (hPa).
Le letture sono calibrate utilizzando
- Compensazione della temperatura
- Calibrazione del bias di fabbrica
- Calibrazione della bilancia di fabbrica
Il barometro viene spesso utilizzato per stimare i cambiamenti di altitudine. Per stimare l'elevazione assoluta, è necessario utilizzare come riferimento la pressione a livello del mare (che cambia a seconda del tempo).
Umidità relativa
Modalità di reporting: in variazione
getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY)
restituisce un sensore di non riattivazione
Un sensore di umidità relativa misura l'umidità relativa dell'aria ambiente e restituisce un valore in percentuale.
Tipi di sensori compositi
Un sensore composito genera dati elaborando e/o fondendo dati da uno o più sensori fisici. (Qualsiasi sensore che non sia un sensore di base è chiamato sensore composito.) Esempi di sensori compositi includono:
- Rilevatore di passi e movimento significativo , che di solito si basa su un accelerometro, ma potrebbe essere basato anche su altri sensori, se il consumo energetico e la precisione fossero accettabili.
- Vettore di rotazione del gioco , basato su un accelerometro e un giroscopio.
- Giroscopio non calibrato , che è simile al sensore base del giroscopio, ma con la calibrazione del bias riportata separatamente invece di essere corretta nella misurazione.
Come per i sensori di base, le caratteristiche dei sensori compositi derivano dalle caratteristiche dei loro dati finali. Ad esempio, il consumo energetico di un vettore di rotazione di un gioco è probabilmente uguale alla somma dei consumi energetici del chip dell'accelerometro, del chip del giroscopio, del chip che elabora i dati e dei bus che trasportano i dati. Come altro esempio, la deriva di un vettore di rotazione di un gioco dipende tanto dalla qualità dell'algoritmo di calibrazione quanto dalle caratteristiche fisiche del sensore.
La tabella seguente elenca i tipi di sensori compositi disponibili. Ciascun sensore composito si basa sui dati provenienti da uno o più sensori fisici. Evitare di scegliere altri sensori fisici sottostanti per approssimare i risultati poiché forniscono un'esperienza utente scadente.
Tipo di sensore | Categoria | Sensori fisici sottostanti | Modalità di segnalazione |
---|---|---|---|
Atteggiamento | Accelerometro, giroscopio, NON DEVE UTILIZZARE il magnetometro | Continuo | |
Atteggiamento | Accelerometro, magnetometro, NON DEVE UTILIZZARE il giroscopio | Continuo | |
Gesto dello sguardo ![]() | Interazione | Non definito | Un colpo |
Atteggiamento | Accelerometro, giroscopio | Continuo | |
Non calibrato | Giroscopio | Continuo | |
Attività | Accelerometro, giroscopio (se presente) o magnetometro (se giroscopio non presente) | Continuo | |
Non calibrato | Magnetometro | Continuo | |
Orientamento (obsoleto) | Atteggiamento | Accelerometro, magnetometro, giroscopio (se presente) | Continuo |
Interazione | Non definito | Un colpo | |
Atteggiamento | Accelerometro, magnetometro, giroscopio | Continuo | |
Attività | Accelerometro (o altro purché a bassissima potenza) | Un colpo | |
Attività | Accelerometro | In cambiamento | |
Attività | Accelerometro | Speciale | |
Attività | Accelerometro | Speciale | |
Interazione | Non definito | Un colpo |
= Sensore di bassa potenza
Sensori compositi di attività
Accelerazione lineare
Sensori fisici sottostanti: accelerometro e (se presente) giroscopio (o magnetometro se il giroscopio non è presente)
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION)
restituisce un sensore di non riattivazione
Un sensore di accelerazione lineare segnala l'accelerazione lineare del dispositivo nel telaio del sensore, esclusa la gravità.
L'output è concettualmente: output dell'accelerometro meno output del sensore di gravità . È riportato in m/s^2 nei campi x, y e z di sensors_event_t.acceleration
.
Le letture su tutti gli assi dovrebbero essere vicine allo 0 quando il dispositivo è immobile.
Se il dispositivo possiede un giroscopio, il sensore di accelerazione lineare deve utilizzare il giroscopio e l'accelerometro come input.
Se il dispositivo non possiede un giroscopio, il sensore di accelerazione lineare deve utilizzare come input l'accelerometro e il magnetometro.
Movimento significativo
Sensore fisico sottostante: Accelerometro (o altro purché a basso consumo)
Modalità di reporting: One-shot
Bassa potenza
Implementa solo la versione di riattivazione di questo sensore.
getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION)
restituisce un sensore di sveglia
Un rilevatore di movimento significativo si attiva quando rileva un movimento significativo : un movimento che potrebbe portare a un cambiamento nella posizione dell'utente.
Esempi di tali movimenti significativi sono:
- Camminare o andare in bicicletta
- Seduto in un'auto, in un pullman o in un treno in movimento
Esempi di situazioni che non innescano un movimento significativo:
- Telefono in tasca e la persona non si muove
- Il telefono è su un tavolo e il tavolo trema un po' a causa del traffico o della lavatrice nelle vicinanze
Ad alto livello, il rilevatore di movimento significativo viene utilizzato per ridurre il consumo energetico per la determinazione della posizione. Quando gli algoritmi di localizzazione rilevano che il dispositivo è statico, possono passare a una modalità a basso consumo, in cui si affidano a movimenti significativi per riattivare il dispositivo quando l'utente cambia posizione.
Questo sensore deve essere a bassa potenza. Si tratta di un compromesso per il consumo energetico che potrebbe comportare una piccola quantità di falsi negativi. Questo viene fatto per alcuni motivi:
- L'obiettivo di questo sensore è risparmiare energia.
- Attivare un evento quando l'utente non si muove (falso positivo) è costoso in termini di potenza, quindi dovrebbe essere evitato.
- Non attivare un evento quando l'utente si muove (falso negativo) è accettabile purché non venga eseguito ripetutamente. Se l'utente cammina da 10 secondi, non attivare un evento entro quei 10 secondi non è accettabile.
Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Rilevatore di passi
Sensore fisico sottostante: Accelerometro (+ eventualmente altri purché a basso consumo)
Modalità di reporting: Speciale (un evento per passo compiuto)
Bassa potenza
getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR)
restituisce un sensore di non riattivazione
Un rilevatore di passi genera un evento ogni volta che l'utente compie un passo.
Il timestamp dell'evento sensors_event_t.timestamp
corrisponde a quando il piede ha toccato il suolo, generando un'elevata variazione di accelerazione.
Rispetto al contapassi, il rilevatore di passi dovrebbe avere una latenza inferiore (meno di due secondi). Sia il rilevatore di passi che il contapassi rilevano quando l'utente sta camminando, correndo e salendo le scale. Non dovrebbero attivarsi quando l'utente è in bicicletta, alla guida o a bordo di altri veicoli.
Questo sensore deve essere a bassa potenza. Cioè, se il rilevamento dei passi non può essere eseguito nell'hardware, questo sensore non dovrebbe essere definito. In particolare, quando il rilevatore di passi è attivato e l'accelerometro no, solo i passi dovrebbero attivare gli interrupt (non tutte le letture dell'accelerometro).
sampling_period_ns
non ha alcun impatto sui rilevatori di passi.
Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Contapassi
Sensore fisico sottostante: Accelerometro (+ eventualmente altri purché a basso consumo)
Modalità di reporting: in variazione
Bassa potenza
getDefaultSensor(SENSOR_TYPE_STEP_COUNTER)
restituisce un sensore di non riattivazione
Un contapassi segnala il numero di passi effettuati dall'utente dall'ultimo riavvio mentre era attivato.
La misurazione viene segnalata come uint64_t
in sensors_event_t.step_counter
e viene azzerata solo al riavvio del sistema.
Il timestamp dell'evento è impostato sull'ora in cui è stato eseguito l'ultimo passaggio per quell'evento.
Per il significato del tempo di un passo vedere la Tipologia sensore rilevatore di passi.
Rispetto al rilevatore di passi, il contapassi può avere una latenza maggiore (fino a 10 secondi). Grazie a questa latenza, questo sensore ha un'elevata precisione; il conteggio dei passi dopo un'intera giornata di misurazioni dovrebbe essere entro il 10% del conteggio dei passi effettivo. Sia il rilevatore di passi che il contapassi rilevano quando l'utente sta camminando, correndo e salendo le scale. Non dovrebbero attivarsi quando l'utente è in bicicletta, alla guida o a bordo di altri veicoli.
L'hardware deve garantire che il conteggio dei passi interni non superi mai. La dimensione minima del contatore interno dell'hardware sarà di 16 bit. In caso di overflow imminente (al massimo ogni ~2^16 passi), il SoC può essere svegliato in modo che il conducente possa eseguire la manutenzione del contatore.
Come affermato in Interazione , mentre questo sensore è in funzione, non deve disturbare nessun altro sensore, in particolare l'accelerometro, che potrebbe benissimo essere in uso.
Se un particolare dispositivo non supporta queste modalità operative, questo tipo di sensore non deve essere segnalato dall'HAL. Cioè, non è accettabile "emulare" questo sensore nell'HAL.
Questo sensore deve essere a bassa potenza. Cioè, se il rilevamento dei passi non può essere eseguito nell'hardware, questo sensore non dovrebbe essere definito. In particolare, quando il contapassi è attivato e l'accelerometro no, solo i passi dovrebbero attivare gli interrupt (non i dati dell'accelerometro).
Rilevatore di inclinazione
Sensore fisico sottostante: Accelerometro (+ eventualmente altri purché a basso consumo)
Modalità di reporting: speciale
Bassa potenza
Implementa solo la versione di riattivazione di questo sensore.
getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR)
restituisce un sensore di sveglia
Un rilevatore di inclinazione genera un evento ogni volta che viene rilevato un evento di inclinazione.
Un evento di inclinazione è definito dalla direzione della gravità media della finestra di 2 secondi che cambia di almeno 35 gradi dall'attivazione o dall'ultimo evento generato dal sensore. Ecco l'algoritmo:
-
reference_estimated_gravity
= media delle misurazioni dell'accelerometro nel primo secondo dopo l'attivazione o gravità stimata quando è stato generato l'ultimo evento di inclinazione. -
current_estimated_gravity
= media delle misurazioni dell'accelerometro negli ultimi 2 secondi. - Si attiva quando
angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees
Grandi accelerazioni senza un cambiamento nell'orientamento del telefono non dovrebbero innescare un evento di inclinazione. Ad esempio, una brusca svolta o una forte accelerazione durante la guida di un'auto non dovrebbero innescare un evento di inclinazione, anche se l'angolo dell'accelerazione media potrebbe variare di oltre 35 gradi. In genere, questo sensore viene implementato solo con l'aiuto di un accelerometro. È possibile utilizzare anche altri sensori se non aumentano significativamente il consumo energetico. Si tratta di un sensore a basso consumo che dovrebbe consentire al SoC di entrare in modalità di sospensione. Non emulare questo sensore nell'HAL. Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Sensori compositi di atteggiamento
Vettore di rotazione
Sensori fisici sottostanti: accelerometro, magnetometro e giroscopio
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR)
restituisce un sensore di non riattivazione
Un sensore vettoriale di rotazione segnala l'orientamento del dispositivo rispetto al quadro delle coordinate Est-Nord-Su. Di solito si ottiene integrando le letture dell'accelerometro, del giroscopio e del magnetometro. Il sistema di coordinate Est-Nord-Su è definito come una base ortonormale diretta dove:
- La X punta ad est ed è tangente al suolo.
- Y punta a nord ed è tangente al suolo.
- Z punta verso il cielo ed è perpendicolare al suolo.
L'orientamento del telefono è rappresentato dalla rotazione necessaria per allineare le coordinate Est-Nord-Su con le coordinate del telefono. Cioè, applicando la rotazione alla cornice del mondo (X,Y,Z) le allineeresti con le coordinate del telefono (x,y,z).
La rotazione può essere vista come la rotazione del telefono di un angolo theta attorno a un asse rot_axis
per passare dall'orientamento del dispositivo di riferimento (allineato Est-Nord-Su) all'orientamento corrente del dispositivo. La rotazione è codificata come le quattro componenti x, y, z, w senza unità di un quaternione unitario:
-
sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
-
sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
-
sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
-
sensors_event_t.data[3] = cos(theta/2)
Dove:
- I campi x, y e z di
rot_axis
sono le coordinate Est-Nord-Su di un vettore di lunghezza unitaria che rappresenta l'asse di rotazione -
theta
è l'angolo di rotazione
Il quaternione è un quaternione unitario: deve essere di norma 1
. La mancata garanzia di ciò causerà un comportamento irregolare del client.
Inoltre, questo sensore segnala una precisione di rotta stimata:
sensors_event_t.data[4] = estimated_accuracy
(in radianti)
L'errore di rotta deve essere inferiore alla estimated_accuracy
nel 95% dei casi. Questo sensore deve utilizzare un giroscopio come input principale per il cambio di orientamento.
Questo sensore utilizza anche l'ingresso dell'accelerometro e del magnetometro per compensare la deriva del giroscopio e non può essere implementato utilizzando solo l'accelerometro e il magnetometro.
Vettore di rotazione del gioco
Sensori fisici sottostanti: accelerometro e giroscopio (nessun magnetometro)
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR)
restituisce un sensore di non riattivazione
Un sensore vettoriale di rotazione del gioco è simile a un sensore vettoriale di rotazione ma non utilizza il campo geomagnetico. Pertanto l'asse Y non punta verso nord ma verso qualche altro riferimento. A tale riferimento è consentito spostarsi dello stesso ordine di grandezza di quello del giroscopio attorno all'asse Z.
Vedi Sensore vettore di rotazione per dettagli su come impostare sensors_event_t.data[0-3]
. Questo sensore non riporta una precisione di rotta stimata: sensors_event_t.data[4]
è riservato e dovrebbe essere impostato su 0
.
In un caso ideale, un telefono ruotato e riportato allo stesso orientamento del mondo reale dovrebbe riportare lo stesso vettore di rotazione del gioco.
Questo sensore deve essere basato su un giroscopio e un accelerometro. Non può utilizzare il magnetometro come input, se non indirettamente, attraverso la stima del bias del giroscopio.
Gravità
Sensori fisici sottostanti: accelerometro e (se presente) giroscopio (o magnetometro se il giroscopio non è presente)
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_GRAVITY)
restituisce un sensore di non riattivazione
Un sensore di gravità segnala la direzione e l'entità della gravità nelle coordinate del dispositivo.
Le componenti del vettore di gravità sono riportate in m/s^2 nei campi x, y e z di sensors_event_t.acceleration
.
Quando il dispositivo è a riposo, l'uscita del sensore di gravità dovrebbe essere identica a quella dell'accelerometro. Sulla Terra, la magnitudo è di circa 9,8 m/s^2.
Se il dispositivo possiede un giroscopio, il sensore di gravità deve utilizzare il giroscopio e l'accelerometro come input.
Se il dispositivo non possiede un giroscopio, il sensore di gravità deve utilizzare come input l'accelerometro e il magnetometro.
Vettore di rotazione geomagnetica
Sensori fisici sottostanti: accelerometro e magnetometro (senza giroscopio)
Modalità di reporting: continua
Bassa potenza
getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR)
restituisce un sensore di non riattivazione
Un vettore di rotazione geomagnetica è simile a un sensore di vettore di rotazione ma utilizza un magnetometro e nessun giroscopio.
Questo sensore deve essere basato su un magnetometro. Non può essere implementato utilizzando un giroscopio e l'ingresso del giroscopio non può essere utilizzato da questo sensore.
Vedi Sensore vettore di rotazione per dettagli su come impostare sensors_event_t.data[0-4]
.
Proprio come per il sensore del vettore di rotazione, l'errore di rotta deve essere inferiore alla precisione stimata ( sensors_event_t.data[4]
) nel 95% dei casi.
Questo sensore deve essere a basso consumo, quindi deve essere implementato nell'hardware.
Orientamento (obsoleto)
Sensori fisici sottostanti: accelerometro, magnetometro e (se presente) giroscopio
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_ORIENTATION)
restituisce un sensore di non riattivazione
Nota: questo è un tipo di sensore più vecchio che è stato deprecato nell'SDK di Android. È stato sostituito dal sensore del vettore di rotazione, che è più chiaramente definito. Utilizzare il sensore del vettore di rotazione sopra il sensore di orientamento quando possibile.
Un sensore di orientamento segnala l'assetto del dispositivo. Le misurazioni sono riportate in gradi nei campi x, y e z di sensors_event_t.orientation
:
-
sensors_event_t.orientation.x
: azimut, l'angolo tra la direzione del nord magnetico e l'asse Y, attorno all'asse Z (0<=azimuth<360
). 0=Nord, 90=Est, 180=Sud, 270=Ovest. -
sensors_event_t.orientation.y
: passo, rotazione attorno all'asse X (-180<=pitch<=180
), con valori positivi quando l'asse Z si sposta verso l'asse Y. -
sensors_event_t.orientation.z
: roll, rotazione attorno all'asse Y (-90<=roll<=90
), con valori positivi quando l'asse X si sposta verso l'asse Z.
Si prega di notare che, per ragioni storiche, l'angolo di rollio è positivo in senso orario. (Matematicamente parlando, dovrebbe essere positivo in senso antiorario):
![Rappresentazione dell'orientamento rispetto a un dispositivo](https://source.android.com/static/docs/core/interaction/sensors/images/axis_positive_roll.png?authuser=0&hl=it)
Figura 3. Orientamento relativo a un dispositivo
Questa definizione è diversa da imbardata, beccheggio e rollio utilizzati nell'aviazione dove l'asse X si trova lungo il lato lungo dell'aereo (dalla coda al muso).
Il sensore di orientamento segnala anche la precisione prevista per le sue letture tramite sensors_event_t.orientation.status
. Vedere le costanti SENSOR_STATUS_*
di SensorManager
per ulteriori informazioni sui possibili valori per questo campo.
Sensori non calibrati
I sensori non calibrati forniscono risultati più grezzi e possono includere alcune distorsioni ma contenere anche meno "salti" rispetto alle correzioni applicate tramite la calibrazione. Alcune app potrebbero preferire questi risultati non calibrati perché più fluidi e affidabili. Ad esempio, se un'app sta tentando di condurre la propria fusione di sensori, l'introduzione di calibrazioni può effettivamente distorcere i risultati.
Accelerometro non calibrato
Sensore fisico sottostante: accelerometro
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED)
restituisce un sensore di non riattivazione
Un sensore accelerometro non calibrato riporta l'accelerazione del dispositivo lungo i tre assi del sensore senza alcuna correzione del bias (il bias di fabbrica e la compensazione della temperatura vengono applicati alle misurazioni non calibrate), insieme a una stima del bias. Tutti i valori sono in unità SI (m/s^2) e sono riportati nei campi di sensors_event_t.uncalibrated_accelerometer
:
-
x_uncalib
: accelerazione (senza compensazione del bias) lungo l'asse X -
y_uncalib
: accelerazione (senza compensazione del bias) lungo l'asse Y -
z_uncalib
: accelerazione (senza compensazione del bias) lungo l'asse Z -
x_bias
: distorsione stimata lungo l'asse X -
y_bias
: distorsione stimata lungo l'asse Y -
z_bias
: distorsione stimata lungo l'asse Z
Giroscopio non calibrato
Sensore fisico sottostante: giroscopio
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED)
restituisce un sensore non di riattivazione
Un giroscopio non calibrato riporta la velocità di rotazione attorno agli assi del sensore senza applicare loro la compensazione del bias, insieme a una stima del bias. Tutti i valori sono in radianti/secondo e sono riportati nei campi di sensors_event_t.uncalibrated_gyro
:
-
x_uncalib
: velocità angolare (senza compensazione della deriva) attorno all'asse X -
y_uncalib
: velocità angolare (senza compensazione della deriva) attorno all'asse Y -
z_uncalib
: velocità angolare (senza compensazione della deriva) attorno all'asse Z -
x_bias
: deriva stimata attorno all'asse X -
y_bias
: deriva stimata attorno all'asse Y -
z_bias
: deriva stimata attorno all'asse Z
Concettualmente, la misurazione non calibrata è la somma della misurazione calibrata e della stima del bias: _uncalibrated = _calibrated + _bias
.
Si prevede che i valori x_bias
, y_bias
e z_bias
aumentino non appena la stima del bias cambia e dovrebbero rimanere stabili per il resto del tempo.
Vedere la definizione del sensore giroscopico per i dettagli sul sistema di coordinate utilizzato.
Alle misurazioni devono essere applicate la calibrazione di fabbrica e la compensazione della temperatura. Inoltre, la stima della deriva del giroscopio deve essere implementata in modo che stime ragionevoli possano essere riportate in x_bias
, y_bias
e z_bias
. Se l'implementazione non è in grado di stimare la deriva, allora questo sensore non deve essere implementato.
Se questo sensore è presente, deve essere presente anche il sensore giroscopio corrispondente ed entrambi i sensori devono condividere gli stessi valori sensor_t.name
e sensor_t.vendor
.
Campo magnetico non calibrato
Sensore fisico sottostante: magnetometro
Modalità di reporting: continua
getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED)
restituisce un sensore di non riattivazione
Un sensore di campo magnetico non calibrato riporta il campo magnetico ambientale insieme a una stima di calibrazione del ferro duro. Tutti i valori sono in micro-Tesla (uT) e sono riportati nei campi sensors_event_t.uncalibrated_magnetic
:
-
x_uncalib
: campo magnetico (senza compensazione del ferro duro) lungo l'asse X -
y_uncalib
: campo magnetico (senza compensazione del ferro duro) lungo l'asse Y -
z_uncalib
: campo magnetico (senza compensazione del ferro duro) lungo l'asse Z -
x_bias
: stima della distorsione del ferro duro lungo l'asse X -
y_bias
: stima della distorsione del ferro duro lungo l'asse Y -
z_bias
: stima della distorsione del ferro duro lungo l'asse Z
Concettualmente, la misurazione non calibrata è la somma della misurazione calibrata e della stima del bias: _uncalibrated = _calibrated + _bias
.
Il magnetometro non calibrato consente ad algoritmi di livello superiore di gestire stime errate del ferro duro. Si prevede che i valori x_bias
, y_bias
e z_bias
aumentino non appena la stima del ferro duro cambia e dovrebbero rimanere stabili per il resto del tempo.
Alle misurazioni devono essere applicate la calibrazione del ferro dolce e la compensazione della temperatura. Inoltre, è necessario implementare una stima ferrea in modo che stime ragionevoli possano essere riportate in x_bias
, y_bias
e z_bias
. Se l'implementazione non è in grado di stimare il bias, allora questo sensore non deve essere implementato.
Se questo sensore è presente, allora deve essere presente il corrispondente sensore di campo magnetico ed entrambi i sensori devono condividere gli stessi valori sensor_t.name
e sensor_t.vendor
.
Angolo della cerniera
Modalità di reporting: in variazione
getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE)
restituisce un sensore di sveglia
Un sensore dell'angolo cerniera misura l'angolo, in gradi, tra due parti integranti del dispositivo. Si prevede che il movimento di una cerniera misurato da questo tipo di sensore alteri il modo in cui l'utente può interagire con il dispositivo, ad esempio aprendo o rivelando un display.
Sensori compositi di interazione
Alcuni sensori vengono utilizzati principalmente per rilevare le interazioni con l'utente. Non definiamo come devono essere implementati questi sensori, ma devono essere a basso consumo ed è responsabilità del produttore del dispositivo verificarne la qualità in termini di esperienza dell'utente.
Gesto di sveglia
Sensori fisici sottostanti: non definiti (qualsiasi cosa a basso consumo)
Modalità di reporting: One-shot
Bassa potenza
Implementa solo la versione di riattivazione di questo sensore.
getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE)
restituisce un sensore di sveglia
Un sensore dei gesti di riattivazione consente di riattivare il dispositivo in base a un movimento specifico del dispositivo. Quando questo sensore si attiva, il dispositivo si comporta come se fosse stato premuto il pulsante di accensione, accendendo lo schermo. Questo comportamento (accensione dello schermo quando si attiva questo sensore) può essere disattivato dall'utente nelle impostazioni del dispositivo. Le modifiche alle impostazioni non influiscono sul comportamento del sensore: solo se il framework accende lo schermo quando si innesca. Il gesto effettivo da rilevare non è specificato e può essere scelto dal produttore del dispositivo.
Questo sensore deve essere a bassa potenza, poiché è probabile che venga attivato 24/7.
Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Raccogli il gesto
Sensori fisici sottostanti: non definiti (qualsiasi cosa a bassa potenza)
Mode di reporting: un colpo singolo
Bassa potenza
Implementa solo la versione di sveglia di questo sensore.
getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE)
restituisce un sensore di sveglia
Un sensore di gesto di raccolta si innesca quando il dispositivo viene raccolto indipendentemente da dove fosse prima (scrivania, tasca, borsa).
Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Gesto di sguardo
Sensori fisici sottostanti: non definiti (qualsiasi cosa a bassa potenza)
Mode di reporting: un colpo singolo
Bassa potenza
Implementa solo la versione di sveglia di questo sensore.
getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE)
restituisce un sensore di sveglia
Un sensore di gesto di sguardo consente di accendere brevemente lo schermo per consentire all'utente di dare un'occhiata al contenuto sullo schermo in base a un movimento specifico. Quando questo sensore si innesca, il dispositivo accenderà momentaneamente lo schermo per consentire all'utente di dare un'occhiata alle notifiche o di altri contenuti mentre il dispositivo rimane bloccato in uno stato non interattivo (sonnellino), quindi lo schermo si spegne di nuovo. Questo comportamento (attivando brevemente lo schermo quando questo sensore innesca) potrebbe essere disattivato dall'utente nelle impostazioni del dispositivo. Le modifiche alle impostazioni non influiscono sul comportamento del sensore: solo se il framework accende brevemente lo schermo quando si innesca. Il gesto effettivo da rilevare non è specificato e può essere scelto dal produttore del dispositivo.
Questo sensore deve essere a bassa potenza, poiché è probabile che venga attivato 24/7. Ogni evento del sensore riporta 1
in sensors_event_t.data[0]
.
Assi limitati Sensori IMU
Disponibili da Android 13, gli assi limitati i sensori IMU sono sensori che supportano casi d'uso in cui non sono disponibili tutti e tre gli assi (x, y, z). I tipi IMU standard in Android (come SENSOR_TYPE_ACCELEROMETER
e SENSOR_TYPE_GYROSCOPE
) presumono che tutti e tre gli assi siano supportati. Tuttavia, non tutti i fattori di forma e dispositivi supportano gli accelerometri a 3 assi e i giroscopi a 3 assi.
Accelerometro assi limitati
Sensori fisici sottostanti: accelerometro
Mode di reporting: continuo
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES)
restituisce un sensore non sveglia
Un sensore assi limitato dell'accelerometro è equivalente a TYPE_ACCELEROMETER
ma supporta i casi in cui uno o due assi non sono supportati.
Gli ultimi tre valori di eventi del sensore riportati dal sensore rappresentano se il valore di accelerazione per gli assi X, Y e Z è supportato. Un valore di 1.0
indica che l'asse è supportato e un valore di 0
indica che non è supportato. I produttori di dispositivi identificano gli assi supportati al tempo di build e i valori non cambiano durante il runtime.
I produttori di dispositivi devono impostare i valori di accelerazione per gli assi non utilizzati su 0
, anziché avere valori indefiniti.
Assi limitati del giroscopio
Sensori fisici sottostanti: giroscopio
Mode di reporting: continuo
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES)
Restituisce un sensore non sveglia
Un sensore di assi limitati di giroscopio è equivalente a TYPE_GYROSCOPE
ma supporta i casi in cui uno o due assi non sono supportati.
Gli ultimi tre valori di eventi del sensore riportati dal sensore rappresentano se il valore della velocità angolare per gli assi X, Y e Z è supportato. Un valore di 1.0
indica che l'asse è supportato e un valore di 0
indica che non è supportato. I produttori di dispositivi identificano gli assi supportati al tempo di build e i valori non cambiano durante il runtime.
I produttori di dispositivi devono impostare i valori di velocità angolare per gli assi non utilizzati su 0
.
Accelerometro limitato assi non calibrati
Sensori fisici sottostanti: accelerometro
Mode di reporting: continuo
getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED)
restituisce un sensore non sveglia
Un sensore non calibrato degli assi limitati dell'accelerometro è equivalente a TYPE_ACCELEROMETER_UNCALIBRATED
ma supporta i casi in cui uno o due assi non sono supportati.
Gli ultimi tre valori degli eventi del sensore riportati dal sensore rappresentano se i valori di accelerazione e di polarizzazione per gli assi X, Y e Z sono supportati. Un valore di 1.0
indica che l'asse è supportato e un valore di 0
indica che non è supportato. I produttori di dispositivi identificano gli assi supportati al tempo di build e i valori non cambiano durante il runtime.
I produttori di dispositivi devono impostare i valori di accelerazione e bias per assi non utilizzati su 0
.
Assi limitati del giroscopio non calibrato
Sensori fisici sottostanti: giroscopio
Mode di reporting: continuo
getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED)
restituisce un sensore non sveglia
Un sensore non calibrato assi limitati del giroscopio è equivalente a TYPE_GYROSCOPE_UNCALIBRATED
ma supporta i casi in cui uno o due assi non sono supportati.
Gli ultimi tre valori degli eventi del sensore riportati dal sensore rappresentano se sono supportati i valori di velocità angolare e deriva per gli assi X, Y e Z. Un valore di 1.0
indica che l'asse è supportato e un valore di 0
indica che non è supportato. I produttori di dispositivi identificano gli assi supportati al tempo di build e i valori non cambiano durante il runtime.
I produttori di dispositivi devono impostare la velocità angolare e i valori di deriva per gli assi non utilizzati su 0
.
Assi limitati compositi IMU
Sensori fisici sottostanti: qualsiasi combinazione di accelerometro a 3 assi, giroscopio a 3 assi, accelerometro a 3 assi non calibrati e giroscopio a 3 assi.
Mode di reporting: continuo
Un sensore IMU di assi limitati compositi è equivalente a un sensore IMU assi limitato ma invece di essere supportato nell'AL HAL, converte i dati del sensore a 3 assi nelle varianti di assi limitati equivalenti. Questi sensori compositi sono abilitati solo per i dispositivi automobilistici.
La tabella seguente mostra una conversione di esempio da un accelerometro a 3 assi standard in un accelerometro assi limitati compositi.
VALORI SENSOREVENT per sensor_type_ackcelerometro | Esempio Sensore_Type_ACCELERometro Sensorevent | Composito sensor_type_ackcelerometer_limited_axes sensorevent |
---|---|---|
valori [0] | -0,065 | -0,065 |
valori [1] | 0,078 | 0,078 |
valori [2] | 9.808 | 9.808 |
valori [3] | N / A | 1.0 |
valori [4] | N / A | 1.0 |
valori [5] | N / A | 1.0 |
Sensori automobilistici
Sensori per supportare i casi d'uso automobilistici.
Intestazione
Sensori fisici sottostanti: qualsiasi combinazione di GPS, magnetometro, accelerometro e giroscopio.
Mode di reporting: continuo
getDefaultSensor(SENSOR_TYPE_HEADING)
restituisce un sensore non sveglia
Disponibile da Android 13, un sensore di intestazione misura la direzione in cui il dispositivo punta rispetto a True North in gradi. Il sensore di intestazione include due valori SensorEvent
. Uno per l'intestazione del dispositivo misurato e uno per l'accuratezza del valore di intestazione fornito.
I valori di intestazione riportati da questo sensore devono essere compresi tra 0.0
(inclusivi) e 360.0
(esclusivi), con 0
che indica nord, 90
est, 180
a sud e 270
ovest.
L'accuratezza per questo sensore è definita al 68 % di fiducia. Nel caso in cui la distribuzione sottostante sia normale gaussiana, l'accuratezza è una deviazione standard. Ad esempio, se il sensore di intestazione restituisce un valore di intestazione di 60 gradi e un valore di accuratezza di 10 gradi, esiste una probabilità del 68 % che il vero intestazione sia compreso tra 50 gradi e 70 gradi.