Domanda

Lavorare su un'applicazione di tracciamento tramite GPS. Va tutto bene, ma a volte a causa delle aree chiuse o del maltempo ottengo punti imprecisi. Quando li traccia, non sembra giusto, con molti salti / salti.

Quale algoritmo dovrei eseguire per filtrare i segnali negativi Mi sembra un'applicazione di un algoritmo di sfocatura, ma cosa ne pensi?

È stato utile?

Soluzione

Ci sono alcune opzioni:

  1. Butta via gli outlier
  2. Filtro
  3. Utilizza un GPS migliore
  4. Utilizza un'origine dati esterna (snap to road)
  5. Combinazione di quanto sopra

Mi piace usare i filtri - Un filtro Kalman è la soluzione tipica (e spesso la migliore) - utilizza una quantità di media predittiva che è migliore di un filtro IIR (Infinite Impulse Response) economico:

FilteredValue = FilteredValue * 0.75 + NewValue * 0.25

Puoi ottenere moduli GPS che ti danno 4-5 correzioni al secondo, che ti permetteranno di usare il filtro 'economico' sopra con tempi di risposta ragionevoli.

Puoi anche semplicemente ottenere un GPS migliore (SiRF III o migliore) che non sia così rumoroso e abbia una migliore ricezione interna (dove possibile).

Unità GPS di consumo " aggancia alla strada " dove possibile, quindi gli errori fuori strada non sono visti dal consumatore, così come alcune delle altre tecniche.

Un Kalman non è facile da implementare, ma senza un set di dati esterno o un sensore (come la velocità della strada), è l'opzione migliore. Consulta http://www.google.com/search?q= apri% 20source% 20kalman% 20filter per il codice e le esercitazioni su di esso.

-Adam

Altri suggerimenti

re: filtraggio in presenza di " pop " rumore -

Uno dei modi più semplici che ho trovato per farlo è:

delta = newValue - filteredValue;
delta = delta > LARGEST_SANE_DELTA ? LARGEST_SANE_DELTA
     : (delta < -LARGEST_SANE_DELTA ? -LARGEST_SANE_DELTA : delta);
filteredValue += alpha*delta;

dove alpha = 1 / tau e tau è la costante di tempo del filtro passa-basso in questione, espressa in multipli del tempo tra le iterazioni del codice precedente. Il valore LARGEST_SANE_DELTA rappresenta una grande modifica possibile in newValue e ritaglia una variazione eccessivamente grande nell'input. Esistono forse modi migliori per rifiutare questo tipo di rumore, ma sono più complicati e quello che ho citato è piuttosto semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top