Pergunta

trabalhando em um aplicativo de rastreamento usando GPS. É tudo muito bem, mas às vezes por causa das áreas fechadas ou mau tempo eu recebo pontos imprecisos. Quando você traça-los, ele simplesmente não parece certo, com muitos saltos / pulos.

O algoritmo deve Eu corro para filtrar os sinais de maus Parece que uma aplicação de um algoritmo de indefinição para mim, mas o que você acha?

Foi útil?

Solução

Existem algumas opções:

  1. Jogue fora os valores atípicos
  2. Filtro
  3. Use um melhor GPS
  4. Use uma fonte de dados externa (tirar a estrada)
  5. combinação dos anteriores

Eu gosto de usar filtros - filtro A Kalman é o típico (e muitas vezes melhor) solução - que utiliza uma quantidade de média preditivo que é melhor do que um IIR barato (Infinito Impulse Response) filtro:

= FilteredValue FilteredValue * 0,75 + 0,25 * NewValue

Você pode obter módulos de GPS que lhe dão 4-5 correções por segundo, o que permitirá que você use o filtro acima 'barata', com tempos de resposta razoáveis.

Você também pode simplesmente obter um melhor GPS (SiRF III ou superior) que não é tão barulhento e tem melhor recepção interior (quando possível).

unidades consumidoras GPS "Snap a estrada", sempre que possível, de modo que os erros fora da estrada não são vistos pelo consumidor, bem como algumas das outras técnicas.

A Kalman não é fácil de implementar, mas sem um conjunto de dados externo ou sensor (tais como velocidade de estrada), é a melhor opção. Confira http://www.google.com/search?q= abrir% 20source% 20kalman% 20filter para código e tutoriais sobre ele.

-Adam

Outras dicas

re: a filtragem na presença de ruído "pop" -

Uma das maneiras mais fáceis que eu encontrei para fazer isso é:

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

em que a = 1 / tau e tau é a constante de tempo do passa-baixo-filtro em questão, expressos em múltiplos do tempo entre repetições do código de cima. O valor LARGEST_SANE_DELTA representa uma grande alteração possível na newValue e clipes excessivamente grande variação na entrada. Há, talvez, melhores formas de rejeitar este tipo de ruído, mas eles são mais complicados, e aquele que eu mencionei é bastante simples.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top