Precisione dell'accelerometro Android (navigazione inerziale)


109

Stavo cercando di implementare un sistema di navigazione inerziale per un telefono Android, che mi rendo conto è difficile data la precisione dell'accelerometro e la fluttuazione costante delle letture.

Per cominciare, ho posizionato il telefono su una superficie piana e ho campionato 1000 letture dell'accelerometro nelle direzioni X e Y (parallelamente al tavolo, quindi nessuna gravità che agisce in queste direzioni). Ho quindi calcolato la media di queste letture e ho utilizzato questo valore per calibrare il telefono (sottraendo questo valore da ogni lettura successiva).

Ho quindi testato il sistema posizionandolo di nuovo sul tavolo e campionando 5000 letture dell'accelerometro nelle direzioni X e Y. Mi aspetterei, data la calibrazione, che queste accelerazioni dovessero sommarsi a 0 (approssimativamente) in ogni direzione. Tuttavia, questo non è il caso e l'accelerazione totale su 5000 iterazioni non è neanche lontanamente vicina a 0 (con una media di circa 10 su ciascun asse).

Mi rendo conto che senza vedere il mio codice potrebbe essere difficile rispondere ma in un senso più generale ...

Questo è semplicemente un esempio di quanto siano imprecise le letture dell'accelerometro su un telefono cellulare (HTC Desire S), o è più probabile che abbia fatto degli errori nella mia codifica?


1
webvr-polyfill è una grande fonte di ispirazione: github.com/borismus/webvr-polyfill/tree/master/src guarda come polyfill un sensore VR utilizzando i dati dell'accelerometro: github.com/borismus/webvr-polyfill/blob/master / src /…
SC

Risposte:


128

Si ottiene la posizione integrando due volte l'accelerazione lineare ma l'errore è orribile. In pratica è inutile.

Ecco una spiegazione del perché (Google Tech Talk) alle 23:20 . Consiglio vivamente questo video.

Non è il rumore dell'accelerometro che causa il problema ma il rumore bianco del giroscopio , vedere la sottosezione 6.2.3 Propagazione degli errori. (A proposito, avrai bisogno anche dei giroscopi.)

Per quanto riguarda il posizionamento in interni, ho trovato utili questi:

Localizzazione e tracciamento indoor basato su RSSI utilizzando Sigma-Point Kalman Smoothers

Tracciamento pedonale con sensori inerziali montati su scarpe

Migliorare le prestazioni dei pedometri utilizzando un singolo accelerometro

Non ho idea di come funzionerebbero questi metodi nelle applicazioni della vita reale o di come trasformarli in una bella app Android.

Una domanda simile è questa .

AGGIORNARE:

Apparentemente esiste una versione più recente della precedente Oliver J. Woodman, "Un'introduzione alla navigazione inerziale", la sua tesi di dottorato:

Localizzazione pedonale per ambienti interni


2
Mi rendo conto che è passato molto tempo, ma ho una domanda di follow-up. La fotocamera in Android JB ha una funzione "panorama", che ti consente di scattare una foto panoramica spostando il telefono, ruotandolo o spostandolo linearmente lungo un asse. Per fare ciò, deve tracciare la posizione del telefono in modo relativamente accurato, almeno meglio dell'errore di 20 cm / s menzionato nel video a cui si collega questa risposta. Come lo fa? Ha qualche modo per migliorare la qualità del tracking inerziale? O utilizza un'elaborazione intelligente delle immagini per farlo utilizzando solo la fotocamera?
Tom

1
@ Tom Credo in quest'ultimo caso, il telefono concatena insieme le immagini esclusivamente tramite algoritmi di elaborazione delle immagini. Cosa ti fa pensare che il telefono debba monitorare la sua posizione per produrre un'immagine panoramica? Era possibile farlo con le normali fotocamere negli anni '90 e chiaramente, allora non avevamo accelerometri nelle fotocamere :) Ovviamente le immagini erano concatenate su un normale PC. Ma non hai bisogno della posizione per questo, gli algoritmi di elaborazione delle immagini sono sufficienti. Spero che questo ti aiuti.
Ali

È molto diverso dal vecchio lavoro che scatta manualmente alcune foto e poi le ricama. In qualche modo tiene traccia della sua posizione in tempo reale. È un po 'difficile da spiegare senza dimostrarlo. Non è necessario scattare foto manualmente: il telefono decide quando ti sei spostato abbastanza lontano per scattarne un'altra. Mentre scatti le foto, ti mostra una piccola barra in basso con un'anteprima del panorama. Se punti la fotocamera troppo in basso (ad esempio), inizia a emettere un segnale acustico e mostra una freccia su per dirti che devi spostarla di nuovo su.
Tom,

2
In realtà sembra che utilizzi l'elaborazione delle immagini: avviare un panorama e poi agitare la mano davanti alla telecamera confonderà abbastanza il suo sistema di tracciamento della posizione!
Tom

@ Tom OK. Penso che utilizzi principalmente l'elaborazione delle immagini (come suggerisce anche il tuo ultimo commento) ma è probabile che sia combinato con il monitoraggio dell'orientamento (ma non della posizione).
Ali

19

Sto solo pensando ad alta voce e non ho ancora giocato con un'API di accelerometro Android, quindi abbi pazienza.

Prima di tutto, tradizionalmente, per ottenere la navigazione dagli accelerometri avresti bisogno di un accelerometro a 6 assi. Sono necessarie accelerazioni in X, Y e Z, ma anche rotazioni Xr, Yr e Zr. Senza i dati di rotazione, non hai dati sufficienti per stabilire un vettore a meno che non presumi che il dispositivo non cambi mai il suo atteggiamento, il che sarebbe piuttosto limitante. Nessuno legge comunque il TOS.

Oh, e sai che l'INS va alla deriva con la rotazione della Terra, giusto? Quindi c'è anche quello. Un'ora dopo e misteriosamente stai salendo su un pendio di 15 ° nello spazio. Questo presuppone che tu abbia un INS in grado di mantenere la posizione così a lungo, cosa che un telefono non può ancora fare.

Un modo migliore per utilizzare gli accelerometri, anche con un accelerometro a 3 assi, per la navigazione sarebbe collegarsi al GPS per calibrare l'INS quando possibile. Dove il GPS non è all'altezza, l'INS si complimenta piacevolmente. Il GPS può improvvisamente spararti a 3 isolati di distanza perché ti sei avvicinato troppo a un albero. L'INS non è eccezionale, ma almeno sa che non sei stato colpito da una meteora.

Quello che potresti fare è registrare i dati dell'accelerometro del telefono e molti altri. Come settimane che valgono. Confrontalo con dati GPS buoni (intendo davvero buoni) e usa il datamining per stabilire la correlazione delle tendenze tra i dati dell'accelerometro e i dati GPS noti. (Suggerimento: ti consigliamo di controllare l'almanacco GPS per giorni con una buona geometria e molti satelliti. Alcuni giorni potresti avere solo 4 satelliti e non è abbastanza) Quello che potresti essere in grado di fare è scoprirlo quando una persona sta camminando con il telefono in tasca, i dati dell'accelerometro registrano uno schema molto specifico. Sulla base del datamining, stabilisci un profilo per quel dispositivo, con quell'utente, e quale tipo di velocità rappresenta quel modello quando aveva dati GPS per accompagnarlo. Dovresti essere in grado di rilevare svolte, salire le scale, sederti (calibrazione a 0 velocità tempo! ) e varie altre attività. Il modo in cui viene tenuto il telefono dovrebbe essere trattato come input di dati completamente separati. Sento odore di una rete neurale usata per fare il data mining. Qualcosa di cieco a ciò che significano gli input, in altre parole. L'algoritmo cercherà solo le tendenze nei modelli e non presterà realmente attenzione alle misurazioni effettive dell'INS. Tutto quello che saprebbe èhistorically, when this pattern occurs, the device is traveling and 2.72 m/s X, 0.17m/s Y, 0.01m/s Z, so the device must be doing that now.E di conseguenza sposterebbe il pezzo in avanti. È importante che sia completamente cieco, perché il semplice fatto di mettere un telefono in tasca potrebbe essere orientato in uno dei 4 diversi orientamenti e 8 se cambi tasca. E ci sono anche molti modi per tenere il telefono. Stiamo parlando di molti dati qui.

Ovviamente avrai ancora molta deriva, ma penso che avresti più fortuna in questo modo perché il dispositivo saprà quando smetti di camminare e la deriva posizionale non sarà perpetua. Sa che stai fermo in base ai dati storici. I sistemi INS tradizionali non hanno questa caratteristica. La deriva si perpetua in tutte le misurazioni future e si compone in modo esponenziale. Una precisione empia, o avere una navigazione secondaria da controllare a intervalli regolari, è assolutamente vitale con l'INS tradizionale.

Ogni dispositivo e ogni persona dovrebbe avere il proprio profilo. Sono molti dati e molti calcoli. Ognuno cammina a velocità diverse, con passaggi diversi, e mette i propri telefoni in tasche diverse, ecc. Sicuramente per implementare questo nel mondo reale sarebbe necessario gestire il numero di scricchiolii lato server.

Se hai utilizzato il GPS per la linea di base iniziale, parte del problema è che il GPS tende ad avere le proprie migrazioni nel tempo, ma sono errori non perpetui. Posiziona un ricevitore in una posizione e registra i dati. Se non ci sono correzioni WAAS, puoi facilmente ottenere correzioni di posizione che vanno alla deriva in direzioni casuali a 100 piedi intorno a te. Con WAAS, forse fino a 6 piedi. Potresti effettivamente avere più fortuna con un sistema RTK sub-metro su uno zaino per abbattere almeno l'algoritmo dell'ANN.

Avrai ancora una deriva angolare con l'INS usando il mio metodo. Questo è un problema. Ma se sei andato così lontano per costruire una ANN per versare più di settimane di dati GPS e INS tra n utenti, e in realtà hai funzionato fino a questo punto, ovviamente non ti dispiace per i big data finora. Continua su questa strada e utilizza più dati per risolvere la deriva angolare: le persone sono creature abitudinarie. Facciamo più o meno le stesse cose come camminare sui marciapiedi, attraverso le porte, su per le scale e non facciamo cose folli come attraversare autostrade, muri o balconi.

Quindi diciamo che stai prendendo una pagina dal Grande Fratello e inizi a memorizzare i dati su dove stanno andando le persone. Puoi iniziare a mappare dove ci si aspetta che le persone camminino. È una scommessa abbastanza sicura che se l'utente inizia a salire le scale, si trova alla stessa base delle scale su cui è salita la persona prima di lei. Dopo 1000 iterazioni e alcuni aggiustamenti dei minimi quadrati, il database sa praticamente dove si trovano quelle scale con grande precisione. Ora puoi correggere la deriva angolare e la posizione mentre la persona inizia a camminare. Quando colpisce quelle scale, o abbassa il corridoio o percorre un marciapiede, qualsiasi spostamento può essere corretto. Il database conterrebbe settori ponderati in base alla probabilità che una persona ci cammini o che l'utente abbia camminato lì in passato. I database spaziali sono ottimizzati per questo utilizzodivide and conquerper allocare solo i settori significativi. Sarebbe un po 'come quei progetti del MIT in cui il robot equipaggiato con il laser inizia con un'immagine nera e dipinge il labirinto nella memoria prendendo ogni svolta, illuminando dove sono tutti i muri.

Le aree ad alto traffico otterrebbero pesi maggiori e le aree in cui nessuno è mai stato pesato 0. Le aree a traffico elevato hanno una risoluzione maggiore. In sostanza, ti ritroveresti con una mappa di ovunque sia stato qualcuno e la userai come modello di previsione.

Non sarei sorpreso se tu potessi determinare quale posto ha preso una persona in un teatro usando questo metodo. Dato un numero sufficiente di utenti che vanno a teatro e una risoluzione sufficiente, avresti i dati che mappano ogni riga del cinema e la larghezza di ciascuna riga. Più persone visitano un luogo, maggiore è la fedeltà con cui potresti prevedere che quella persona si trova.

Inoltre, ti consiglio vivamente di ottenere un abbonamento (gratuito) alla rivista GPS World se sei interessato alla ricerca attuale su questo genere di cose. Ogni mese ne vado matto.


"sarebbe collegarsi al GPS per calibrare l'INS quando possibile. Dove il GPS non è all'altezza, l'INS si complimenta piacevolmente." Questo è ciò a cui serve il filtro di Kalman, a quanto ho capito. Combina i punti di forza di ciascun metodo per annullare i punti deboli dell'altro
endolith,

8

Non sono sicuro di quanto sia grande il tuo offset, perché hai dimenticato di includere le unità. ("Circa 10 su ogni asse" non dice molto.: P) Detto questo, è ancora probabilmente dovuto a un'imprecisione nell'hardware.

L'accelerometro va bene per cose come determinare l'orientamento del telefono rispetto alla gravità o rilevare gesti (scuotere o urtare il telefono, ecc.)

Tuttavia, provare a fare i conti con l'accelerometro ti sottoporrà a molti errori composti. Altrimenti l'accelerometro dovrebbe essere incredibilmente preciso, e questo non è un caso d'uso comune, quindi dubito che i produttori di hardware stiano ottimizzando per questo.


Grazie per la risposta. Gli accelerometri leggono circa -0,8 ms ^ -2 su entrambi gli assi X e Y quando sono fermi, quindi l'ho usato come offset. Con il bit "Around 10", intendevo che oltre 5000 iterazioni, sommando ciascuna delle accelerazioni su un singolo asse dal sensore, non totalizzavano circa 0 ms ^ -2 (come sarebbe se fluttuasse uniformemente sopra e sotto l'offset value), ma tendeva invece a registrare l'accelerazione più in una direzione, che dopo una doppia integrazione per trovare la posizione, funzionava come il telefono che si muoveva di circa 3 m in un minuto.
woodstock365

+1 per l'uso del termine di navigazione aerea, "dead reckoning". Sebbene la resa dei conti si applicherebbe più appropriatamente alla navigazione con una fotocamera rispetto a un INS.
RyanJMcGowan

7

L'accelerometro Android è digitale, campiona l'accelerazione utilizzando lo stesso numero di "bucket", diciamo che ci sono 256 bucket e l'accelerometro è in grado di rilevare da -2g a + 2g. Ciò significa che il tuo output sarebbe quantizzato in termini di questi "bucket" e salterebbe attorno a un insieme di valori.

Per calibrare un accelerometro Android, è necessario campionare più di 1000 punti e trovare la "modalità" attorno alla quale fluttua l'accelerometro. Quindi trova il numero di punti digitali di quanto fluttua l'uscita e usalo per il tuo filtraggio.

Raccomando il filtro di Kalman una volta ottenuta la modalità e la fluttuazione +/-.


1
Stavo cercando metodi di calibrazione. Sembra che il tuo suggerimento sia ciò di cui ho bisogno. Devo solo confermare. Una volta trovata la modalità, dì che è 0,5. Non ho ottenuto il messaggio "Quindi trova il numero di punti digitali in base alla fluttuazione dell'output e usalo per il filtro". Potresti approfondirlo di più.
Nazerke

1
Supponiamo che il tuo accelerometro abbia 256 punti di uscita e fluttui di 0,015 m / s ^ 2 tra le letture. Quando appoggi il dispositivo sul tavolo, la tua uscita potrebbe fluttuare in multipli pari di 0,015 m / s ^ 2. Supponiamo che tu ottenga una lettura di 0 +/- (X * 0,015). Devi trovare X (che sarebbe un numero pari). Ad esempio, la mia X potrebbe essere 3. In questo caso, ignorerei le modifiche nella lettura dell'accelerometro inferiori a 0,045 m / s ^ 2
Alex Stone

quindi gli accelerometri dei telefoni Android non sono ancora così buoni .. corretto?
Techsin

4

Mi rendo conto che questo è piuttosto vecchio, ma il problema in questione non è affrontato in NESSUNA delle risposte fornite.

Quello che vedi è l'accelerazione lineare del dispositivo compreso l'effetto della gravità. Se poggi il telefono su una superficie piana il sensore segnalerà l'accelerazione dovuta alla gravità che è approssimativamente 9.80665 m/s2, dando quindi il 10 che stai vedendo. I sensori sono imprecisi, ma non sono COSÌ imprecisi! Vedi qui per alcuni link utili e informazioni sul sensore che potresti cercare.


17
No - Penso che tu abbia interpretato male la domanda: "... letture nelle direzioni X e Y (parallele al tavolo, quindi nessuna gravità agisce in queste direzioni)". Il 9.8 / s2 sarebbe sull'asse Z.
teiera7

0

Stai supponendo che le letture dell'accelerometro nelle direzioni X e Y, che in questo caso è interamente rumore hardware, formerebbero una distribuzione normale intorno alla tua media. A quanto pare non è così.

Una cosa che puoi provare è tracciare questi valori su un grafico e vedere se emerge uno schema. In caso contrario, il rumore è statisticamente casuale e non può essere calibrato, almeno per l'hardware del tuo telefono.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.