pythongpsgpsd

Python GPS Module: Reading latest GPS Data


I have been trying to work with the standard GPS (gps.py) module in python 2.6. This is supposed to act as a client and read GPS Data from gpsd running in Ubuntu.

According to the documentation from GPSD webpage on client design (GPSD Client Howto), I should be able to use the following code (slightly modified from the example) for getting latest GPS Readings (lat long is what I am mainly interested in)

from gps import *
session = gps() # assuming gpsd running with default options on port 2947
session.stream(WATCH_ENABLE|WATCH_NEWSTYLE)
report = session.next()
print report

If I repeatedly use the next() it gives me buffered values from the bottom of the queue (from when the session was started), and not the LATEST Gps reading. Is there a way to get more recent values using this library? In a Way, seek the Stream to the latest values?

Has anyone got a code example using this library to poll the gps and get the value i am looking for ?

Here is what I am trying to do:

  1. start the session
  2. Wait for user to call the gps_poll() method in my code
  3. Inside this method read the latest TPV (Time Position Velocity) report and return lat long
  4. Go back to waiting for user to call gps_poll()

Solution

  • What you need to do is regularly poll 'session.next()' - the issue here is that you're dealing with a serial interface - you get results in the order they were received. Its up to you to maintain a 'current_value' that has the latest retrieved value.

    If you don't poll the session object, eventually your UART FIFO will fill up and you won't get any new values anyway.

    Consider using a thread for this, don't wait for the user to call gps_poll(), you should be polling and when the user wants a new value they use 'get_current_value()' which returns current_value.

    Off the top of my head it could be something as simple as this:

    import threading
    import time
    from gps import *
    
    class GpsPoller(threading.Thread):
    
       def __init__(self):
           threading.Thread.__init__(self)
           self.session = gps(mode=WATCH_ENABLE)
           self.current_value = None
    
       def get_current_value(self):
           return self.current_value
    
       def run(self):
           try:
                while True:
                    self.current_value = self.session.next()
                    time.sleep(0.2) # tune this, you might not get values that quickly
           except StopIteration:
                pass
    
    if __name__ == '__main__':
    
       gpsp = GpsPoller()
       gpsp.start()
       # gpsp now polls every .2 seconds for new data, storing it in self.current_value
       while 1:
           # In the main thread, every 5 seconds print the current value
           time.sleep(5)
           print gpsp.get_current_value()