2016-05-20 14 views
7

Ich benutze die Adafruit ultimative GPS Breakout mit meinem Raspberry Pi 2 mit Python2.7.9, GPSD und dem Python-GPS-Paket. Ich bekomme erfolgreich GPS-Updates mit 1Hz über den seriellen Port.Ändern Update-Rate mit GPS und Python

Dieses Gerät ist angeblich in der Lage 10Hz Updates, die ich gerne aktivieren würde. Gemäß dem Datenblatt (siehe unten stehendes Schnipsel) kann dies durch einen seriellen Befehl eingestellt werden.

enter image description here

Mein Problem ist, dass ich nicht ausreichende Dokumentation für den Python-GPS-Modul oder RaPS finden kann, die mir würde sagen, wie ich soll Befehle an das GPS über serielle mit meinem Python-Skript senden. Kann mir jemand in die richtige Richtung zeigen?

+0

Vielleicht ist das [pyserial] (https://pythonhosted.org/pyserial/) Modul konnte Hilfe sein? – mzhaase

+0

Ich sollte das versuchen. Ich ging davon aus, dass die GPSD die Kontrolle über die serielle Schnittstelle übernimmt. – kjgregory

Antwort

4

Ich habe gerade ein GPS aus der gleichen Familie wie Ihres aufgenommen. (MTK) Sie verwenden $PMTK Steuerzeichenfolgen. Jede Suche nach PMTK protocol gibt endlose Ressourcen. Die Grenze ist das GPS selbst.

Für eine einmalige Konvertierung ist die Standardmethode von einem Root-Terminal auszuführen echo -e "\$PMTK220,200*2C\r\n" > /dev/ttyAMA0, oder wo auch immer das Gerät angeschlossen ist, für eine 5Hz-Antwort. Die

  • -e Flag ermöglicht Parsen der Backslash (n)
  • $ Der Start des NMEA Satz
  • P Proprietary Nachricht
  • MTK NMEA Datentyp
  • 220 Pakettyp
  • 200 Packet Daten
  • * Datenende
  • 2C Checksum
  • \r\n Das Ende des NMEA Satz

Es gibt scripts und other projects als gut, aber alle erfordern die gpsd nicht von den GPS-Kontrolle zu sein. Die gpsd verhindert das Senden einer Kontrollzeichenfolge an den GPS.

Zusätzlich, wenn Sie die -b Flagge in /etc/default/gpsd haben, wird der GPS nicht auf das Gerät schreiben, wenn es angeschlossen ist. Es wählt einen generischen NMEA Treiber und schreibt keine Kontrollzeichenketten zum gps.

Sie können hinterherschlüpfen und die Rate mit Kontrollzeichenfolgen aus der Shell manipulieren. Der GPS wird die Daten ausgeben, aber der GPS wird die Rate nicht bestätigen.

Es scheint, gpsd bevorzugt die 1 Sekunde Timing. Selbst wenn der GPS schnellere Zyklen ausführen kann, selbst wenn Sie bereits eine andere Methode zum Zurücksetzen/Einstellen der Rate verwendet haben, muss dem gpsd gesagt werden, dass sich die Rate geändert hat.

Hier kommt gpsctl -c 0.2 (kein Sudo) ins Spiel. Es ist im gpsd-Paket enthalten.

Wenn nur ein Gerät mit dem GPS verbunden ist, wird gpsctl dieses Gerät im Beispiel auf 0,2 Sekunden Timing-Zyklen umstellen und das zum gpsd übermitteln. Die Zeit ist in Sekunden. Ja, es kann ziemlich langsam/schnell eingestellt werden, aber es gibt keine Fälschungsfähigkeit. Wenn es das nicht kann, wird es es nicht tun, noch Ihnen sagen, dass es nicht hat/kann, es sei denn, es gibt einen fatalen Fehler.

Portgeschwindigkeit ist kein Problem, solange Kapazität vorhanden ist. Jemand, der einmal gezählt hat, 4800 Baud ist ausreichend für ein Lesen von Daten in der Sekunde, die es braucht, um die Daten zu senden. Es hängt von der Nutzlast ab, aber es funktioniert für eine Faustregel. 10 Hz kann die 38400-Baud-Standard auf vielen Systemen machen. Ich habe es versucht und nichts ist kaputt gegangen.

Sie möchten nur sicherstellen, dass gpsd nicht mit 9600 Baud verhandelt hat, bevor Sie die Geschwindigkeit erhöhen können, nur für den Fall. gpsctl -s XXXX (um die Baudrate einzustellen, mit der das GPS Pakete sendet) gibt es einen Fehler für mich zurück.

Auch ohne die -b Flagge in der gpsd Standardeinstellung diese neuen gps von mir bleibt nicht in die höheren Frequenzaktualisierungen zwischen powerdowns verriegelt. Ich muss den Befehl erneut ausgeben. Es könnte eine schlechte Batterie sein, ein Bedienungsfehler oder ich verstehe nicht, dass dieser Defekt eine Eigenschaft ist, die GPS für andere Systeme nicht unerreichbar zu halten. (Ein Grund für die -b)

So ändern Sie die Antwort von einem GPS, das die GPS verwendet, oder wie ich es getan habe.

In Beantwortung Ihrer Frage jedoch die Geschwindigkeit einer GPS-Antwort durch die gpsd mit Python ändern es

import subprocess 
subprocess.call(['gpsctl', '-c', '0.2']) # Digits are the time in seconds. 

Versuchen Sie und sehen. gpsctl -c 0.25 kehrt Viertelsekunde GPS-Messwerte verwenden, etc ..

Damit ist two Python gpsdclient demonstration scripts, auf die ich habe gerade einen gpsd Gerät Bericht refresh Tastendruck hinzugefügt, (d Hit zu aktualisieren und die Zahlen von der neuen Einstellung zu sehen.)

sie sind für eine Python 2.7-3.5 gpsd python client, wenn die Funktion ein Haus in den Demo-Skripte findet, wird es wie folgt aussehen:

def hertz(hz): 
    """Change or enumerate a Faster/Slower gps refresh rate if device is able""" 
    from subprocess import call 
    inverse = str(1/hz) 
    call((['gpsctl', '-c', inverse]))