Python GPS-Modul: Lesen der neuesten GPS-Daten

8

Ich habe versucht, mit dem Standardmodul GPS (gps.py) in Python 2.6 zu arbeiten. Dies soll als Client fungieren und GPS-Daten von gpsd in Ubuntu lesen.

Laut der Dokumentation von der Website der GPSD auf Client-Design ( GPSD Client Howto ), sollte ich sein Ich kann den folgenden Code verwenden (leicht modifiziert aus dem Beispiel), um die neuesten GPS-Messungen zu erhalten (lat lang interessiert mich hauptsächlich)

%Vor%

Wenn ich wiederholt next () benutze gibt es gepufferte Werte vom Ende der Warteschlange (seit dem Start der Sitzung) und nicht die LETZTE Gps-Lesung. Gibt es eine Möglichkeit, mit dieser Bibliothek aktuellere Werte zu erhalten? Suchen Sie den Stream in gewisser Weise nach den neuesten Werten?

Hat jemand ein Codebeispiel, das diese Bibliothek verwendet, um die GPS zu pollen und den Wert zu erhalten, nach dem ich suche?

Hier ist, was ich versuche zu tun:

  1. Starten Sie die Sitzung
  2. Warten Sie, bis der Benutzer die Methode gps_poll () in meinem Code
  3. aufruft
  4. Innerhalb dieser Methode lesen Sie den neuesten TPV-Bericht (Time Position Velocity) und geben lat lang
  5. zurück
  6. Gehen Sie zurück zum Warten, bis der Benutzer gps_poll ()
  7. aufruft
TanB 26.05.2011, 23:09
quelle

3 Antworten

16

Was Sie tun müssen, ist regelmäßig "session.next ()" abzufragen - das Problem hier ist, dass Sie es mit einer seriellen Schnittstelle zu tun haben - Sie erhalten Ergebnisse in der Reihenfolge, in der sie empfangen wurden. Es liegt an Ihnen, einen 'aktuellen_Wert' beizubehalten, der den zuletzt abgerufenen Wert hat.

Wenn Sie das Sitzungsobjekt nicht abfragen, wird Ihr UART-FIFO eventuell voll und Sie werden sowieso keine neuen Werte erhalten.

Erwägen Sie, einen Thread dafür zu verwenden, warten Sie nicht, bis der Benutzer gps_poll () aufruft, Sie sollten abfragen, und wenn der Benutzer einen neuen Wert möchte, verwenden Sie 'get_current_value ()', was current_value zurückgibt.

Ganz oben auf meinem Kopf könnte es so einfach sein:

%Vor%     
synthesizerpatel 26.05.2011, 23:49
quelle
2

Hinzufügen meiner zwei Cent.

Aus irgendeinem Grund würde mein Raspberry Pi weiterhin einen Thread ausführen und ich müsste den Pi hart zurücksetzen.

Also habe ich sysnthesizerpatel und eine Antwort, die ich auf Dan Mandels Blog hier gefunden habe, kombiniert .

Meine gps_poller Klasse sieht so aus:

%Vor%

Und der verwendete Code sieht so aus:

%Vor%

Sie finden den Code auch hier: Hier und Hier

    
Tim Reilly 17.03.2016 23:46
quelle
0

Die obigen Antworten sind sehr ineffizient und übermäßig komplex für jeden, der moderne Versionen von gpsd verwendet und Daten nur zu bestimmten Zeiten benötigt, anstatt zu streamen.

Die meisten GPS-Empfänger senden ihre Positionsinformationen mindestens einmal pro Sekunde. Vermutlich, da viele GPS-basierte Anwendungen Echtzeit-Updates wünschen, verwenden die meisten gpsd Client-Beispiele, die ich gesehen habe, die obige Methode, einen Stream von gpsd zu beobachten und Echtzeit-Updates zu empfangen (mehr oder weniger, so oft der GPS sie sendet) .

Wenn Sie jedoch (wie im Fall des OP) keine Streaming-Informationen benötigen, sondern nur die zuletzt gemeldete Position benötigen (z. B. über Benutzerinteraktion oder ein anderes Ereignis), gibt es das eine viel effizientere und einfachere Methode: Lassen Sie Gpsd die neuesten Positionsinformationen zwischenspeichern und bei Bedarf abfragen.

Das gpsd JSON-Protokoll hat eine ?POLL; -Anfrage, die die neuesten GPS-Informationen zurückliefert, die gpsd hat gesehen. Anstatt den Rückstand von gps-Nachrichten zu iterieren und ständig neue Nachrichten zu lesen, um vollständige Puffer zu vermeiden, können Sie am Anfang der gpsd-Sitzung eine ?WATCH={"enable":true} -Nachricht senden und dann die neusten Positionsinformationen abfragen, wann immer Sie sie benötigen %Code%. Die Antwort ist ein einzelnes JSON-Objekt, das die neuesten Informationen enthält, die gpsd vom GPS aus gesehen hat.

Wenn Sie Python3 verwenden, ist der einfachste Weg, den ich gefunden habe, das verfügbare Paket gpsd-py3 zu verwenden auf Pypi. Um sich mit gpsd zu verbinden, besorge dir die letzte Positionsinformation und drucke die aktuelle Position:

%Vor%

Sie können den ?POLL; -Aufruf immer dann wiederholen, wenn Sie neue Positionsinformationen benötigen, und im Hintergrund führt das gpsd-Paket den gpsd.get_current() -Aufruf an gpsd aus und gibt ein Objekt zurück, das die Antwort darstellt.

Dies ist mit dem eingebauten ?POLL; -Modul nicht besonders einfach, aber es gibt eine Reihe anderer Python-Clients, und es ist auch ziemlich trivial mit allem zu tun, was Socket-Kommunikation durchführen kann, einschließlich dieses Beispiels gps :

%Vor%     
Jason Antman 02.03.2018 21:18
quelle

Tags und Links