2016-05-20 31 views
7

Sto utilizzando l'ultimo breakout GPS di adafruit con il mio Raspberry Pi 2 usando python2.7.9, GPSD e il pacchetto python-gps. Sto ottenendo con successo aggiornamenti gps a 1Hz sulla porta seriale.modifica della frequenza di aggiornamento con gpsd e python

Questo dispositivo è presumibilmente in grado di aggiornamenti a 10 Hz, che vorrei abilitare. Secondo il foglio dati (vedere lo snippet sotto), questo può essere impostato tramite comando seriale.

enter image description here

Il mio problema è che non riesco a trovare la documentazione sufficiente per il modulo python-GPS o GPSD che mi dica come dovrei inviare comandi al GPS sopra seriale con il mio script python. Qualcuno può indicarmi la giusta direzione?

+0

Forse il modulo [pySerial] (https://pythonhosted.org/pyserial/) potrebbe essere d'aiuto? – mzhaase

+0

Dovrei provarlo. Supponevo che il GPSD prendesse il controllo sulla porta seriale. – kjgregory

risposta

4

Ho appena preso un gps dalla stessa famiglia del tuo. (MTK) Usano le stringhe di controllo $PMTK. Qualsiasi ricerca di PMTK protocol dà risorse infinite. Il limite è il gps stesso.

Per una conversione una tantum, il metodo standard proviene da un terminale root eseguito echo -e "\$PMTK220,200*2C\r\n" > /dev/ttyAMA0 o da qualsiasi dispositivo collegato, per una risposta a 5Hz. La bandiera

  • -e permette l'analisi del backslash (s)
  • $ L'inizio della frase NMEA
  • P messaggio proprietaria tipo
  • MTK NMEA Data
  • 220 tipo di pacchetto
  • 200 Packet dati
  • * Fine dei dati
  • 2C Checksum
  • \r\n La fine della frase NMEA

ci sono scripts e other projects disponibili pure, ma tutti richiedono DSGP di non avere il controllo dei gps. Il gpsd impedirà l'invio di una stringa di controllo al gps.

Inoltre, se si dispone del flag -b in /etc/default/gpsd, gpsd non scrive sul dispositivo quando è collegato. Sceglierà un driver NMEA generico e non scriverà alcuna stringa di controllo sul gps.

È possibile scivolare dietro e manipolare la velocità con le stringhe di controllo dalla shell. I gps genereranno i dati, ma il gpsd non riconoscerà la velocità.

Appare, gpsd preferisce il tempo di 1 secondo. Anche se il GPS è capace di cicli più veloci, anche se hai già usato un altro metodo per reimpostare la velocità, e così facendo, è necessario dire al gpsd che la velocità è cambiata.

Questo è il punto in cui gpsctl -c 0.2 (nessun sudo) entra in gioco. È fornito in bundle nel pacchetto gpsd.

Se c'è un solo dispositivo collegato al gpsd, nell'esempio, gpsctl cambierà quel dispositivo in cicli di temporizzazione di 0,2 secondi e lo trasmetterà al gpsd. Il tempo è in secondi. Sì, può essere impostato piuttosto lento/veloce, ma non c'è capacità di fingere. Se non può farlo, non lo farà, né dirà che non ha/non può, a meno che non ci sia un errore fatale.

La velocità della porta non è un problema, purché ci sia capacità. Qualcuno che ha contato una volta ha detto 4800 baud è sufficiente per una lettura dei dati nell'un secondo necessario per inviare i dati. Dipende dal carico utile, ma funziona per una regola empirica. 10Hz potrebbe rendere il 38400 baud predefinito su molti sistemi. L'ho provato e non è venuto a mancare nulla.

Devi solo assicurarti che gpsd non abbia negoziato fino a 9600 baud prima di poter aumentare la velocità, per ogni evenienza. gpsctl -s XXXX (per impostare la velocità di trasmissione a cui il GPS emette i pacchetti) restituisce un errore per me.

Anche senza la bandiera -b nell'impostazione predefinita DSGP, questo nuove gps miei non rimane agganciato negli aggiornamenti più alta frequenza tra impoverisce. Devo ri-emettere il comando. Potrebbe essere una batteria difettosa, un errore dell'operatore o non capisco che questo difetto è una caratteristica che non consente di bloccare il GPS fuori dalla portata di altri sistemi. (Un motivo per il -b)

Ecco come si modifica la risposta da un gps che utilizza il gpsd o come ho fatto.

Nel rispondere alla tua domanda, però, per cambiare la velocità di una risposta gps attraverso DSGP con Python

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

provare e vedere. Utilizzando gpsctl -c 0.25 rendimenti trimestre letture secondo GPS, ecc ..

Per aiutare sono two Python gpsdclient demonstration scripts a cui ho appena aggiunto un gpsd rapporto dispositivo di aggiornamento battitura, (Hit d per rinfrescare e vedere i numeri dalla nuova impostazione.)

sono per un Python 2.7-3.5 gpsd python client, quando la funzione trova una casa negli script demo che sarà simile a questa:

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]))