2013-01-07 7 views
5

Je le code suivant ci-dessous qui semble fonctionner très bien:Android Coordonnées GPS Scattered

// GPS Reader 
    // Criteria 
    Criteria criteria = new Criteria(); 
    //criteria.setAccuracy(Criteria.ACCURACY_COARSE); // Used when we can't get a GPS Fix 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); // Used when we can get a GPS Fix 

    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 

    LocationListener locationListener = new MyLocationListener(); 
    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 0, 0, 
      locationListener); 

Cependant, quand je graphique les données que j'ai recueillies sur les cartes Google, les coordonnées GPS sont très dispersés dans certains cas, ou il se passera le long d'un chemin que je suis juste à pied, puis tout à coup sauter à un mile de distance et puis de retour. Est-ce qu'il y a un moyen de réparer ceci? Une sorte de vérification de précision je suppose?

Mise à jour:

Fondamentalement, mon problème ressemble à ceci comme un exemple - GPS Jitter

Mise à jour 2:

Je considérais pas ce qui en fait une prime, mais je me suis dit que je pourrais aussi bien avoir une compréhension complète de ce qui se passe ici, et voir si peut-être mon approche est terminée tuer. J'ai toujours le même problème que mes coordonnées ont de la gigue en dépit du fait que j'ai des précisions de 3m, etc. Maintenant ça peut être des satellites disponibles, etc. Je ne sais pas, mais au fond j'essaie de comprendre comment sont toutes ces autres applications, en particulier les applications d'exercice, capables d'obtenir de telles lectures lisses dans les mêmes circonstances. Malheureusement, je n'ai pas donné beaucoup d'informations sur mon problème, sauf que vous pouvez utiliser un filtre de Kalman si vous voulez, mais il doit sûrement y avoir des moyens moins complexes, puisque je doute que la plupart des applications implémentent cela.

De toute façon, si un développeur souhaite partager ce qu'ils font avec un pseudo-code qui serait grandement apprécié. Je veux dire si je suis coincé avec Kalman, mais je suis sûr qu'il doit y avoir plus facile de mettre en œuvre des algorithmes, et j'espère apprendre ceux-ci et comment les mettre en œuvre, ce sont des ajustements décents.

Contexte: Il s'agit d'une application mobile pour piétons.

pertinents SO Les questions que j'ai essayé de glaner des informations de Create a smooth curve from a series of GPS coordinates Smooth gps data: Ce fut un bon départ, mais je ne suis pas sûr de ce que pseudocode je besoin de mettre en œuvre pour obtenir correctement les places les moins aptes au travail de manière appropriée afin que je vais avoir un splines données GPS que je peux ensuite voir sur quelque chose comme google maps pour confirmer que je l'ai fait correctement. Je pense que le problème est de savoir s'il s'agissait de données générales X et Y auxquelles je m'occupais, et non de coordonnées GEO, je pourrais écrire quelque chose dans matlab, et continuer.

Mise à jour 3

Une image des données GPS foiré Je RECEVOIR https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png

code https://gist.github.com/4505688

+2

Vos besoins en énergie et votre précision semblent se contredire. Le seul fournisseur qui vous fournit des résultats avec ACCURACY_FINE est LocationManager.GPS_PROVIDER. Pourquoi ne pas l'utiliser directement au lieu de créer une sorte de critère comme ceci: locationManager.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, MyLocationListener)? –

+2

En outre, il pourrait être dispersé parce que l'appareil n'était pas sous ciel ouvert/autres raisons qui conduisent à la réception de réparation retardée. –

+0

Ok, je reviendrai à cela - puisque je l'avais initialement mis en place, mais je pensais que les critères feraient mieux et réessayerons demain. Sur la note du ciel ouvert - j'étais dans une région de ciel ouvert, lors de l'exécution du test - mais quand je cours un programme comme mapmywalk il n'y a pas de dispersion. – eWizardII

Répondre

4

Ce que vous obtenez est parce que vos critères identifie le fournisseur mieux NETWORK_PROVIDER. Ce qui n'identifie pas votre emplacement mais vous donne à la place l'emplacement de la tour cellulaire dont la gamme couvre votre appareil. Ainsi, lorsque vous êtes à l'extérieur de n'importe quel bâtiment, il est préférable d'utiliser GPS_PROVIDER pour obtenir une précision précise des emplacements géographiques.Pourquoi vous obtenez des coordonnées dispersées est parce que votre appareil vient à la portée d'une autre tour de la cellule d'où le saut de lieu se produit. Directement utiliser GPS_PROVIDER est la meilleure solution que vous aurez jamais.

+0

Je devrais ajouter que grâce à des conseils de Nitin j'ai implémenté en utilisant le GPS seulement comme suit : // Lecteur GPS LocationListener locationListener = new MyLocationListener(); LocationManager lm = (LocationManager) getSystemService (Context.LOCATION_SERVICE); lm.requestLocationUpdates (LocationManager.GPS_PROVIDER, 0, 0, locationListener); Mais le problème est toujours présent. – eWizardII

+0

Merci pour la perspicacité, malheureusement, n'était pas au-dessus de mes questions SO en raison des examens, mais essentiellement pris quelques conseils à partir de cela, http://stackoverflow.com/questions/6181704/good-way-of-getting-the- users-location-in-android, et j'ai soigneusement étudié une autre implémentation de programmeshttps: //github.com/marcfasel/LocationMapper. Je crois que le problème était parce que j'utilisais une autre classe pour gérer le gestionnaire de localisation, je l'ai ré-implémenté sans cette classe comme ils le font et tout semble fonctionner correctement. Maintenant, besoin d'optimiser la vie de la batterie. Merci les gars! :) – eWizardII

+0

Merci beaucoup. Explication simple et géniale. Correction de mon problème immédiat. Je commençais à penser à re-filtrer les données entrantes avec Kalman et blahblahblah et enfin, était juste un problème de sélection de fournisseur de données de localisation. Génial! – cedbeu

2

Vérifiez this article de Reto Meier (code inclus). Cela devrait vous donner beaucoup d'informations à penser. Vous devez au moins définir les paramètres de distance et de temps minimum.

lm.requestLocationUpdates(lm.getBestProvider(criteria, true), 5000, 20, 
     locationListener); 

Vous pouvez également combiner plusieurs fournisseurs pour obtenir les meilleures coordonnées que vous pouvez pour le moment. Bonne chance!

+0

Je vais essayer à nouveau la configuration des critères et voir ce que cela donne. – eWizardII

+0

J'ai mis en œuvre vos conseils et je me heurte toujours au problème de diffusion GPS - voir l'image suivante - https://www.dropbox.com/s/ilsf8snao2no65e/gpsdata2.png le chemin bleu est le vrai chemin - mais le rouge est ce que le GPS enregistré. – eWizardII

+0

Et qu'en est-il de l'exactitude de ces coordonnées? Pourriez-vous également le dessiner? Vous pouvez m'envoyer votre skype si vous le souhaitez et je pense que je pourrais vous aider dans cette situation. – Evos

5

Les données GPS elles-mêmes sont sujettes à des erreurs. Même si vous avez défini correctement tous les éléments de LocationManager (et il semble que vous le fassiez), vous verrez parfois une instabilité dans les emplacements.

Précision

Une chose à noter est que la précision GPS vous donne seulement une estimation à quel point le calcul a été donné les signaux GPS reçus. Les erreurs systématiques peuvent vous donner un bon nombre de précision (< 10m) mais représentent toujours une erreur de position importante. C'est pourquoi vous verrez la gigue, même si votre précision est très bonne. Les mesures de précision permettent d'éliminer de très grandes erreurs (> 100 m), mais à un niveau inférieur, elles vous indiquent simplement que les calculs ont convergé.

Filtrage

filtrage, comme beaucoup de choses, est le mieux si vous le faites aussi peu que possible. Un filtre de précision devrait être en mesure d'éliminer les grandes erreurs et si vous vous retrouvez avec un bon seuil, vous pourriez être en mesure d'obtenir des données en douceur.

Vous pouvez également bénéficier de certains avantages si vous définissez un seuil sur les modifications de position pour l'exécution d'applications. Par exemple, un coureur ne peut couvrir qu'une certaine distance au fil du temps et en fixant un seuil supérieur (Usain Bolt Cutoff), vous devriez être capable d'éliminer les mauvais points. Le problème avec cela est que si votre premier point est l'erreur, vous finissez par supprimer tous les autres points.

filtre de Kalman

Le filtre de Kalman est une excellente solution et je l'ai mis en œuvre sur l'application de navigation que je travaille. Les résultats sont très raisonnables et permettent même un comptage à l'estime limité dans les cas où le GPS est mauvais ou indisponible. Malheureusement, je ne peux pas partager le code source, mais je peux vous donner quelques conseils si vous décidez d'aller de l'avant. Les meilleurs résultats proviennent d'un filtre de 6 DoF où vous calculez l'accélération et la vitesse et l'utilisez pour estimer les positions. Ce n'est pas la solution la plus simple, mais nous en avons obtenu de bons résultats.

moindres carrés

Le filtre de Kalman est grande, car il peut être utilisé en temps réel pour filtrer les positions. Il garde la trace de son propre état et vous n'avez pas besoin de stocker les anciens emplacements. Mais d'un autre côté, si vous voulez post-traiter votre itinéraire, l'ajustement des moindres carrés est un moyen optimal. (Kalman est dérivé des formules LSQ). Je ne fais pas beaucoup de post-traitement mais je soupçonne que je peux y trouver de vieux manuels. La théorie devrait être la même cependant.

La plupart des appareils GPS sont assez bons et de tous les tests que j'ai pu voir, je ne vois pas souvent la gigue que vous voyez dans votre exemple.Cependant, un grand avantage et la raison pour laquelle j'ai implémenté le filtre de Kalman est que votre distance parcourue et les calculs de vitesse sont beaucoup plus précis

+0

"Le problème avec cela est que si votre premier point est l'erreur, vous finissez par supprimer tous les autres points." Problème classique, m'a conduit écrous –

2

Une approche simple est de jeter toutes les données anciennes ou inexactes et de garder une moyenne courante de la longitude et latitude.

private static final long WILDLY_OUT = 15; 
private static final long TOO_OLD = 30000; 
private static final long NO_SAMPLES = 5; 

double lastLocationTime; 

double calclongitude(Location location, double oldLongitude) { 
    double newLongitude = oldLongitude; 

    if (location.getAccuracy() < WILDLY_OUT) { 
     newLongitude = (NO_SAMPLES * oldLongitude + location 
       .getLongitude())/(NO_SAMPLES + 1); 
     lastLocationTime = System.currentTimeMillis(); 
    } 

    if (lastLocationTime > TOO_OLD) { 
     newLongitude = location.getLongitude(); 
    } 

    return newLongitude; 
} 

Et faire la même chose pour la latitude.

Questions connexes