Question

Travailler sur une application de suivi utilisant le GPS. Tout va bien, mais parfois, à cause des zones fermées ou du mauvais temps, j'ai des points inexacts. Lorsque vous les tracez, cela ne semble pas juste, avec beaucoup de sauts / sauts.

Quel algorithme dois-je exécuter pour filtrer les mauvais signaux Cela ressemble à une application d’un algorithme de flou, mais vous en pensez quoi?

Était-ce utile?

La solution

Il y a quelques options:

  1. Jeter les valeurs aberrantes
  2. Filtre
  3. Utilisez un meilleur GPS
  4. Utiliser une source de données externe (capture sur la route)
  5. Combinaison de ce qui précède

J'aime utiliser des filtres - Un filtre de Kalman est la solution typique (et souvent la meilleure) - il utilise une quantité de moyenne prédictive meilleure que celle d'un filtre IIR (Infinite Impulse Response) bon marché:

FilteredValue = FilteredValue * 0.75 + NewValue * 0.25

Vous pouvez obtenir des modules GPS qui vous donnent 4 à 5 corrections par seconde, ce qui vous permettra d’utiliser le filtre "économique" ci-dessus avec des temps de réponse raisonnables.

Vous pouvez également obtenir simplement un meilleur GPS (SiRF III ou supérieur) moins bruyant et offrant une meilleure réception à l'intérieur (dans la mesure du possible).

Unités GPS grand public " se caler sur la route " Dans la mesure du possible, le consommateur ne voit donc pas les erreurs sur les routes, ainsi que quelques-unes des autres techniques.

Un Kalman n’est pas facile à mettre en œuvre, mais sans jeu de données externe ni capteur (comme la vitesse de la route), c’est la meilleure option. Découvrez http://www.google.com/search?q= ouvrez% 20source% 20kalman% 20filter pour obtenir du code et des didacticiels.

-Adam

Autres conseils

re: filtrer en présence de & "; pop &"; bruit -

L’une des manières les plus simples que j’ai trouvée de faire ceci est:

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

où alpha = 1 / tau et tau est la constante de temps du filtre passe-bas en question, exprimée en multiples du temps entre les itérations du code ci-dessus. La valeur LARGEST_SANE_DELTA représente un changement important possible dans newValue et découpe une variation trop importante en entrée. Il existe peut-être de meilleures façons de rejeter ce type de bruit, mais elles sont plus compliquées et celle que j'ai mentionnée est assez simple.

Utilisez le filtre de Kalman .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top