10
votes

Module GPS Python: Lecture Dernières données GPS

J'ai essayé de travailler avec le module Standard GPS (GPS.PY) dans Python 2.6. Ceci est censé agir en tant que client et lire des données GPS de GPSD fonctionnant à Ubuntu.

Selon la documentation de la page Web GPSD sur la conception du client ( GPSD Client HOWTO ), Je devrais pouvoir utiliser le code suivant (légèrement modifié de l'exemple) pour obtenir les dernières lectures GPS (Lat Long est ce que je suis principalement intéressé par) xxx

si J'utilise à plusieurs reprises le prochain () Cela me donne des valeurs tamponnées du bas de la file d'attente (à partir de la démarrage de la session) et non la dernière lecture GPS. Existe-t-il un moyen d'obtenir des valeurs plus récentes en utilisant cette bibliothèque? D'une certaine manière, recherchez le flux aux dernières valeurs?

a obtenu un exemple de code à l'aide de cette bibliothèque pour interroger le GPS et obtenir la valeur que je recherche?

Voici ce que j'essaie de faire:

  1. Démarrer la session
  2. Attendez que l'utilisateur appelle la méthode GPS_Poll () dans mon code
  3. À l'intérieur de cette méthode, lisez la dernière TPV (Velocity Time Velocity) et retourner Long Long
  4. Retour à l'attente de l'utilisateur appelle GPS_Poll ()

0 commentaires

4 Réponses :


19
votes

Ce que vous devez faire est de sonder régulièrement "session.next ()" - Le problème ici est que vous traitez avec une interface série - vous obtenez des résultats dans l'ordre de réception. C'est à vous de maintenir une "Value actuelle" qui a la dernière valeur récupérée.

Si vous ne sondez pas l'objet de session, votre UART FIFO se remplira et vous n'obtiendrez pas de nouvelles valeurs.

Considérez à l'aide d'un thread pour cela, n'attendez pas que l'utilisateur appelle GPS_Poll (), vous devez interroger et lorsque l'utilisateur veut une nouvelle valeur qu'elles utilisent 'get_current_value ()' qui retourne actuel_value.

éteint le dessus de ma tête, cela pourrait être aussi simple que ceci: xxx


3 commentaires

La réponse a l'air bien, mais le sommeil (0,2) n'est pas nécessaire. SESSION.NEXT () Bloquera, alors l'avoir, alors que la vraie boucle ne surchargera de toute façon pas votre CPU.


sont get_current_value () et session.next () atomique? Vous avez besoin d'une serrure ou d'un mécanisme de synchronisation sinon.


Lecture / remplacement d'une variable d'instance unique est une opération de sécurité du fil automatiquement avec Python.



2
votes

Ajout de mes deux cents.

Pour une raison quelconque, mon PI de framboise continuerait à exécuter un fil et je devrais réinitialiser le PI.

J'ai donc combiné SysnthesizerPatel et une réponse que j'ai trouvée sur le blog de Dan Mandel ici .

Ma classe GPS_Poller ressemble à ceci: xxx

et le code utilisé ressemble à ceci: xxx

Vous pouvez également trouver le code ici: ici et ici


2 commentaires

Mieux que ce que j'ai suggéré!


Ce code est mauvais. Current_Value est écrit chaque fois que GPSD envoie des données. Avec le heure.sleep (.5) , le tandis que true boucle gère pour rater le rapport epx Signaler chaque temps , imprimant ainsi aucune donnée GPS du tout. Notez que c'est très chronométré - pour certaines personnes, elle peut travailler à chaque fois. Ceci sera corrigé si la vérification de epx est déplacée vers la classe gpspoller . Même alors, le verrouillage doit être ajouté.



13
votes

Les réponses ci-dessus sont très inefficaces et trop complexes pour toute personne utilisant des versions modernes de GPSD et nécessitant des données uniquement à des heures spécifiques, au lieu de streaming.

La plupart des GPSVENT envoient leurs informations de position au moins une fois par seconde. Vraisemblablement, depuis de nombreuses applications basées sur GPS désirent des mises à jour en temps réel, la grande majorité des exemples de clients GPSD que j'ai vus utilisent la méthode ci-dessus de regarder un flux à partir de GPSD et de recevoir des mises à jour en temps réel (plus ou moins aussi souvent que le GPS les envoie) .

Cependant, si (comme dans le cas de l'OP), vous ne devez pas besoin d'informations en streaming, mais il suffit de besoin de la dernière position signalée chaque fois qu'il est demandé (c'est-à-dire via une interaction de l'utilisateur ou d'une autre Autre événement), il y a une méthode beaucoup plus efficace et plus simple: laissez GPSD mettant en cache des informations de position les plus récentes et interrogez-la en cas de besoin.

Le protocole GPSD JSON a un ? Sondage; demande, qui renvoie les informations GPS les plus récentes que GPSD a vues. Au lieu de devoir itérer sur l'arriéré des messages GPS et de lire de nouveaux messages pour éviter les tampons complets, vous pouvez envoyer un ? Regarder = {"Activer": true} Message au début de la GPSD Session, puis interroger les dernières informations de position chaque fois que vous en avez besoin avec ? sondage; . La réponse est un seul objet JSON contenant les informations les plus récentes que GPSD a vues du GPS.

Si vous utilisez Python3, la solution la plus simple que j'ai trouvée est d'utiliser Paquet GPSD-PY3 disponible sur PYPI. Pour vous connecter à GPSD, obtenez les informations de position les plus récentes et imprimez la position actuelle: xxx

Vous pouvez répéter le gpsd.get_current () appeler chaque fois que vous voulez de nouvelles informations de position et dans les coulisses, le package GPSD exécutera le ? Sondage; Appelez-vous à GPSD et renvoyer un objet représentant la réponse.

Faire cela avec le Dans GPS n'est pas terriblement simple, mais il existe un certain nombre d'autres clients Python disponibles, et il est également assez trivial de faire avec tout ce qui peut effectuer une communication de socket, y compris cet exemple en utilisant telnet : xxx


2 commentaires

Ceci est à la fois beaucoup plus facile et bien meilleur que la réponse acceptée.


Cette réponse est une excellente explication de l'utilisation de GPSD pour tout client, pas seulement python, juste en utilisant? Regarder = {"Activer": true} et? Sondage. Plus d'infos Ici: gpsd.gitlab.io/gpsd/client-howto.html



0
votes

Je connais sa vieille fil, mais juste pour tout le monde comprendre, vous pouvez également utiliser pyeuddedded python bibliothèque pour cela.

PIP INSTALL INSTALLATION PYMEDDED < Pré> xxx

https://pypi.org/project/pyembedded/


0 commentaires