2011-12-19 15 views
6

Desidero ottenere il vettore di accelerazione di un telefono Android. Il problema è che le coordinate dell'accelerometro sono relative alla rotazione del telefono. Quello che voglio è l'accelerazione "assoluta", vale a dire, dovrebbe restituire gli stessi valori indipendentemente dal modo in cui il telefono è rivolto. (Voglio rilevare se un utente che sta sciando sta scivolando giù per un pendio senza usare il GPS. Devo anche essere in grado di differenziare lo scivolamento e salire la seggiovia.)Android, accelerazione normalizzata

Posso probabilmente ottenere quei valori combinando l'accelerometro con il giroscopio, ma non ho idea di come avrei potuto compensare i valori dell'accelerometro con quelli del giroscopio.

E 'possibile, e se sì, come?

risposta

10

Ciò che si descrive non può essere fatto, a meno che non si ridefinisca il problema un po '. Per aiutarvi a ridefinirlo, illustrerò i principali problemi:

Innanzitutto, suppongo che ciò che intendete per "accelerazione assoluta" sia l'accelerazione rispetto al riferimento geografico. Non può essere fatto solo con l'accelerometro, dato che non ha idea dei riferimenti geografici. Se ti muovi abbastanza lontano per il gps, o usi la bussola, potresti essere in grado di aggirare questo, ma ognuno di questi ha i suoi problemi (anche se almeno il problema è solubile).

Il secondo problema è che la gravità e l'accelerazione sono completamente indistinguibili utilizzando un solo accelerometro (questo è noto come il "principio di equivalenza"). Pertanto, qualsiasi accelerazione misurata sarà sempre la somma vettoriale della gravità e dell'accelerazione, ma ci sono sempre più soluzioni a queste equazioni, e nei casi normali in cui l'accelerazione è inferiore alla gravità, non si può davvero determinare nulla sull'accelerazione . Dato che la gravità è piuttosto costante, ci sono modi per aggirare questo, usando, per esempio, un giroscopio, o forse il tuo utente potrebbe tenere il telefono in un orientamento fisso (ad esempio, osservando segnali esterni come l'orizzonte), e uno di questi gli approcci potrebbero consentire di sottrarre l'influenza della gravità, ma in genere è un problema non banale.

L'ultimo punto da non pensare è che sembra che tu stia pensando in un sistema di coordinate fissato a terra e l'accelerometro del telefono è solo fissato dal telefono. Questo è l'asse z dell'accelerometro, molti non hanno nulla a che fare con l'alto e il basso sulla terra - e la relazione dipenderà dall'orientamento del telefono. In realtà, molte persone preferirebbero un sistema fisso a terra, ma il telefono non lo sa. È possibile utilizzare spunti esterni (GPS, campo magnetico, giroscopio, gravità, orizzonte, ecc.) Per cercare di allinearli, ma dato solo un singolo modulo di lettura arbitrario dell'accelerometro, l'informazione non è proprio lì.

Definizioni:
vettore accelerazione: questo è il x, y, z lettura dall'accelerometro (e ogni lettura dipende dall'orientamento telefoni), talvolta scritto come A = (a x, a y, a z).
accelerazione grandezza: questo è a = sqrt (a x + un y + un z), e questo non dovrebbe dipendere all'orientamento cellulari (se la diversi assi sono calibrati per essere lo stesso). Se il telefono è fermo, questo sarà semplicemente una lettura della gravità. Si noti inoltre che molte delle informazioni nel vettore di accelerazione vengono perse utilizzando questa misura.
accelerazione normalizzato: La direzione di accelerazione, che ha magniture 1, cioè, A/un'accelerazione
in terra coordinate: Credo che questo è ciò che si vuole veramente, non c'è proprio nessun modo semplice per farlo, e davvero anche se tu potessi, non penso che sarebbe così utile come potrebbe sembrare in un primo momento.

Sci:
io pensi di avere un buon tiro a determinare quando qualcuno sta sciando basa sulle misurazioni dall'accelerometro. Cose come urti e svolte dovrebbero essere tutte abbastanza distintive usando l'accelerometro. Per questi vorrei usare il vettore di accelerazione completo. Ad esempio, a turno, la magnitudine dell'accelerazione resterebbe approssimativamente costante e la direzione verrebbe spazzata. Si noti inoltre che caduta libera (cioè, in pratica ogni volta che lo sciatore non ha i propri cieli/piedi/testa/ecc. Sul terreno, se stanno andando verso l'alto quando si lancia un dosso/salto, o cadono dalla seggiovia) , la magnitudine di accelerazione sarà zero in caduta libera. Per la seggiovia, sembra che probabilmente avrà un'inclinazione ritmica distintiva per lo più all'interno di un singolo piano.

Tutte queste cose potrebbero essere comprese. Ti consiglio, se vuoi veramente risolvere questo problema, è quello di registrare i dati dal tuo accelerometro mentre scali, e vedere se è possibile determinare quando si scia in base alle caratteristiche dei dati. (La mia ipotesi è che il tuo ostacolo principale con questo sarà la matematica, perché potrebbe essere un po 'complicato elaborare un algoritmo in grado di distinguere le firme dello sci, quindi sembra che sarebbe una buona idea rivedere il vettore matematica, e cose come prodotti a punti e prodotti trasversali, e anche, sospetto che un po 'su un altro argomento noto come FFT o trasformate di Fourier potrebbe essere utile per mettere in ordine le segnature di tempo e frequenza dello sci vs swinging in seggiovia .)

È inoltre possibile eseguire il piegamento delle misurazioni GPS, che non sarebbero altrettanto affidabili, o fornire una buona risoluzione temporale, ma potrebbe almeno essere utilizzato per ricontrollare l'algoritmo.

+0

Voglio rilevare se un utente che sta sciando sta scivolando giù da una pendenza senza usare il GPS. Pensi sia fattibile? –

+0

In realtà, potrebbe essere. Ci penserò e fare alcuni calcoli. Sembra che tu abbia due cose per te qui: 1) di solito è irregolare, quindi l'accelerometro lo rileverebbe; 2) almeno in caduta libera è l'unica situazione al mondo quando l'accelerazione totale (g + a) è zero, quindi poiché la slitta è un po 'come caduta libera, forse si potrebbe rilevare un'accelerazione inferiore alla gravità, almeno all'inizio. C'è qualche aspetto del tuo problema che escluderebbe l'utilizzo di uno di questi? – tom10

+0

Non penso, ma potrei sbagliarmi. Dobbiamo anche essere in grado di differenziare lo scivolamento e salire la seggiovia ... –

3

È possibile calcolare l'accelerazione indipendentemente dall'orientamento del telefono utilizzando:

a = sqrt(x*x + y*y + z*z) 

Dove a è l'accelerazione assoluta e x, y e z sono valori accelerometro per ciascuno dei 3 assi del telefono.

+0

Ho bisogno dei diversi assi di accelerazione singolarmente (in realtà ho solo bisogno di 'z', ma probabilmente sono tutti simili nel modo in cui li ottieni). –

0

Considerare l'utilizzo del GPS. In un'applicazione di registrazione di volo uso dell'accelerazione (anche se il valore assoluto, non il vettore) per filtrare i dati GPS rumoroso (rimuove località dove l'accelerazione necessaria per il cambiamento di velocità non è plausibile):

/** 
* Remove noise from the measurement of the location. 
* @param loc a location 
* @return Answer <code>false</code> iff the location should not be used. 
*/ 
private boolean filterNoise(final Location loc) { 
    if(! loc.hasSpeed()) 
     return true; 
    if(this.recentSpeeds.isEmpty()) { // rescentSpeeds is a queue of locations 
     this.recentSpeeds.add(loc); 
     return true; 
    } 
    final Location lastFix = this.recentSpeeds.getHead(); 
    final long delta_t = (loc.getTime() - lastFix.getTime())/1000; 
    if(delta_t == 0) 
     return false; 
    final float delta_v = loc.getSpeed() - lastFix.getSpeed(); 
    final float a = delta_v/delta_t; 
    if(Math.abs(a) <= AccelThreshold) { 
     this.recentSpeeds.add(loc); 
     return true; 
    } 
    return false; 
} 

Se calcoli la velocità usando le coordinate dall'ultima correzione e la correzione corrente ottieni l'accelerazione come vettore.

1

Alcuni telefoni hanno un barometro (sensore di pressione dell'aria) integrato. Dopo aver applicato una media mobile, ho trovato che è pronto per stabilire se l'utente sta andando su o giù, forse utile per il tuo problema. Sulla galassia s4 e 5 ottengo una risoluzione abbastanza buona da determinare se il dispositivo si è appena spostato dal tavolo al pavimento.

Nota, le variazioni graduali del tempo influiscono sulle letture, pertanto è necessario considerare il Delta in un intervallo di tempo ragionevole e ignorare le modifiche attorno a una determinata soglia.

+0

Questo è molto interessante! Non sapevo che i nuovi telefoni avessero questo. Il mio non lo farà, ma tornerò sicuramente se mai avrò un nuovo telefono con uno. Grazie per aver risposto ai tuoi risultati! –