Here are three examples of how to use python to get GPS data from a GPS receiver attached to a Raspberry Pi.
- Using GPSD client libraries
- Manually parsing NMEA sentences
- Using pynmea2 to parse NMEA sentences
GPSD client libraries
The gpsd client libraries are based on JSON. The JSON objects have a "class" attribute (E.g. TPV, SKY, DEVICE.etc...) which can be used to filter on different information.
This guide shows how to get gpsd up an running on a Raspberry Pi.
The example python script below filters on the TPV class, which is the Time Position Velocity report and then prints out the relevant information.
#! /usr/bin/python from gps import * import time gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE) print 'latitude\tlongitude\ttime utc\t\t\taltitude\tepv\tept\tspeed\tclimb' # '\t' = TAB to try and output the data in columns. try: while True: report = gpsd.next() # if report['class'] == 'TPV': print getattr(report,'lat',0.0),"\t", print getattr(report,'lon',0.0),"\t", print getattr(report,'time',''),"\t", print getattr(report,'alt','nan'),"\t\t", print getattr(report,'epv','nan'),"\t", print getattr(report,'ept','nan'),"\t", print getattr(report,'speed','nan'),"\t", print getattr(report,'climb','nan'),"\t" time.sleep(1) except (KeyboardInterrupt, SystemExit): #when you press ctrl+c print "Done.\nExiting."
This python script filters on the SKY class and prints out satellite information.
#! /usr/bin/python from gps import * import time import os gpsd = gps(mode=WATCH_ENABLE|WATCH_NEWSTYLE) try: while True: report = gpsd.next() # if report['class'] == 'SKY': os.system('clear') print ' Satellites (total of', len(gpsd.satellites) , ' in view)' for i in gpsd.satellites: print 't', i print '\n\n' print 'PRN = PRN ID of the satellite. 1-63 are GNSS satellites, 64-96 are GLONASS satellites, 100-164 are SBAS satellites' print 'E = Elevation in degrees' print 'As = Azimuth, degrees from true north' print 'ss = Signal stength in dB' print 'used = Used in current solution?' time.sleep(1) except (KeyboardInterrupt, SystemExit): #when you press ctrl+c print "Done.\nExiting."
Manually parsing NMEA sentences
The python script below shows how to access GPS data by connecting directly to the serial interface.
It filters on $GPRMC NMEA sentences and then splits the well know attributes into different variables.
import serial port = "/dev/serial0" def parseGPS(data): # print "raw:", data #prints raw data if data[0:6] == "$GPRMC": sdata = data.split(",") if sdata[2] == 'V': print "no satellite data available" return print "---Parsing GPRMC---", time = sdata[1][0:2] + ":" + sdata[1][2:4] + ":" + sdata[1][4:6] lat = decode(sdata[3]) #latitude dirLat = sdata[4] #latitude direction N/S lon = decode(sdata[5]) #longitute dirLon = sdata[6] #longitude direction E/W speed = sdata[7] #Speed in knots trCourse = sdata[8] #True course date = sdata[9][0:2] + "/" + sdata[9][2:4] + "/" + sdata[9][4:6]#date print "time : %s, latitude : %s(%s), longitude : %s(%s), speed : %s, True Course : %s, Date : %s" % (time,lat,dirLat,lon,dirLon,speed,trCourse,date) def decode(coord): #Converts DDDMM.MMMMM > DD deg MM.MMMMM min x = coord.split(".") head = x[0] tail = x[1] deg = head[0:-2] min = head[-2:] return deg + " deg " + min + "." + tail + " min" print "Receiving GPS data" ser = serial.Serial(port, baudrate = 9600, timeout = 0.5) while True: data = ser.readline() parseGPS(data)
Using pynmea2 to parse NMEA sentences
The python script below shows how to access GPS data by connecting directly to the serial interface.
It filters on $GPGGA NMEA sentences and then uses pynmea2 to parse the data.
Pynmea2 can be installed with;
import serial import pynmea2 port = "/dev/serial0" def parseGPS(str): if str.find('GGA') > 0: msg = pynmea2.parse(str) print "Timestamp: %s -- Lat: %s %s -- Lon: %s %s -- Altitude: %s %s -- Satellites: %s" % (msg.timestamp,msg.lat,msg.lat_dir,msg.lon,msg.lon_dir,msg.altitude,msg.altitude_units,msg.num_sats) serialPort = serial.Serial(port, baudrate = 9600, timeout = 0.5) while True: str = serialPort.readline() parseGPS(str)