首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python GPS模块:读取最新的GPS数据

Python GPS模块:读取最新的GPS数据
EN

Stack Overflow用户
提问于 2011-05-26 23:09:01
回答 4查看 49.1K关注 0票数 11

我一直在尝试使用python 2.6中的标准GPS (gps.py)模块。它应该充当客户端,并从运行在Ubuntu中的gpsd中读取GPS数据。

根据GPSD客户端设计网页(GPSD客户端操作)的文档,我应该能够使用下面的代码(从示例中略作修改)来获取最新的GPS读数( long是我主要感兴趣的)。

代码语言:javascript
复制
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

如果我重复使用next(),它会给出队列底部(会话启动时)的缓冲值,而不是最新的Gps读数。是否有一种方法可以使用这个库获得更多的最近值?在某种程度上,寻找流的最新价值?

有没有人有一个代码示例,使用这个库来轮询gps并得到我正在寻找的值?

这里是我想要做的:

  1. 启动会话
  2. 等待用户在代码中调用gps_poll()方法
  3. 在这个方法中,阅读最新的TPV (时间位置速度)报告并返回lat long。
  4. 返回到等待用户调用gps_poll()
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-26 23:49:09

您需要做的是定期轮询'session.next()‘-这里的问题是您处理的是一个串行接口-您得到的结果的顺序是被接收。由您来维护具有最新检索值的“current_value”。

如果您不轮询会话对象,最终您的UART FIFO将被填满,而且您也不会得到任何新的值。

考虑使用线程,不要等待用户调用gps_poll(),您应该进行轮询,当用户需要一个新的值时,他们使用'get_current_value()‘返回current_value。

从我的头顶上可以是这样简单的东西:

代码语言:javascript
复制
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() 
票数 19
EN

Stack Overflow用户

发布于 2018-03-02 21:18:39

对于任何使用现代版本的gpsd并且只在特定时间需要数据而不是流的人来说,上面的答案都是非常低效率和过于复杂的。

大多数GPSes每秒至少发送一次位置信息。据推测,由于许多基于gps的应用程序都需要实时更新,我看到的绝大多数gpsd客户端示例都使用了上述方法,从gpsd观察流并接收实时更新(大致与gps发送的频率相同)。

但是,如果(与OP的情况一样)您不需要流信息,而是在请求时只需要最后报告的位置(例如,通过用户交互或其他事件),那么有一个更有效和更简单的方法:让gpsd缓存最新的位置信息,并在需要时进行查询。

gpsd JSON协议有一个?POLL;请求,它返回gpsd所看到的最新GPS信息。不必迭代gps消息的积压,并继续读取新消息以避免完全缓冲区,您可以在gpsd会话开始时发送?WATCH={"enable":true}消息,然后在需要时使用?POLL;查询最新的位置信息。响应是一个JSON对象,包含gpsd从GPS中看到的最新信息。

如果您正在使用Python3,我发现的最简单的方法是使用pypi上可用的gpsd-py3包。若要连接到gpsd,请获取最新的位置信息,并打印当前位置:

代码语言:javascript
复制
import gpsd
gpsd.connect()
packet = gpsd.get_current()
print(packet.position())

您可以在需要新的位置信息时重复gpsd.get_current()调用,并且在幕后,gpsd包将执行对gpsd的?POLL;调用,并返回一个表示响应的对象。

使用内置的gps模块进行此操作并不是非常简单,但是还有许多其他的Python客户端可用,而且与任何可以执行套接字通信的操作(包括使用telnet的示例)都有很小的关系。

代码语言:javascript
复制
$ telnet localhost 2947
Trying ::1...
Connected to localhost.
Escape character is '^]'.
{"class":"VERSION","release":"3.16","rev":"3.16","proto_major":3,"proto_minor":11}
?WATCH={"enable":true}
{"class":"DEVICES","devices":[{"class":"DEVICE","path":"/dev/pts/10","driver":"SiRF","activated":"2018-03-02T21:14:52.687Z","flags":1,"native":1,"bps":4800,"parity":"N","stopbits":1,"cycle":1.00}]}
{"class":"WATCH","enable":true,"json":false,"nmea":false,"raw":0,"scaled":false,"timing":false,"split24":false,"pps":false}
?POLL;
{"class":"POLL","time":"2018-03-02T21:14:54.873Z","active":1,"tpv":[{"class":"TPV","device":"/dev/pts/10","mode":3,"time":"2005-06-09T14:34:53.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23}],"gst":[{"class":"GST","device":"/dev/pts/10","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],"sky":[{"class":"SKY","device":"/dev/pts/10","time":"2005-06-09T14:34:53.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}]}
?POLL;
{"class":"POLL","time":"2018-03-02T21:14:58.856Z","active":1,"tpv":[{"class":"TPV","device":"/dev/pts/10","mode":3,"time":"2005-06-09T14:34:53.280Z","ept":0.005,"lat":46.498332203,"lon":7.567403907,"alt":1343.165,"epx":24.829,"epy":25.326,"epv":78.615,"track":10.3788,"speed":0.091,"climb":-0.085,"eps":50.65,"epc":157.23}],"gst":[{"class":"GST","device":"/dev/pts/10","time":"1970-01-01T00:00:00.000Z","rms":0.000,"major":0.000,"minor":0.000,"orient":0.000,"lat":0.000,"lon":0.000,"alt":0.000}],"sky":[{"class":"SKY","device":"/dev/pts/10","time":"2005-06-09T14:34:53.280Z","xdop":1.66,"ydop":1.69,"vdop":3.42,"tdop":3.05,"hdop":2.40,"gdop":5.15,"pdop":4.16,"satellites":[{"PRN":23,"el":6,"az":84,"ss":0,"used":false},{"PRN":28,"el":7,"az":160,"ss":0,"used":false},{"PRN":8,"el":66,"az":189,"ss":45,"used":true},{"PRN":29,"el":13,"az":273,"ss":0,"used":false},{"PRN":10,"el":51,"az":304,"ss":29,"used":true},{"PRN":4,"el":15,"az":199,"ss":36,"used":true},{"PRN":2,"el":34,"az":241,"ss":41,"used":true},{"PRN":27,"el":71,"az":76,"ss":42,"used":true}]}]}
票数 15
EN

Stack Overflow用户

发布于 2016-03-17 23:46:25

加上我的两分钱。

无论出于什么原因,我的覆盆子pi将继续执行线程,我将不得不硬重置pi。

所以我把sysnthesizerpatel和我在Dan的博客这里上找到的答案结合起来。

我的gps_poller类如下所示:

代码语言:javascript
复制
import os 
from gps import *
from time import *
import time 
import threading 

class GpsPoller(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)
        self.session = gps(mode=WATCH_ENABLE)
        self.current_value = None 
        self.running = True 

    def get_current_value(self):
        return self.current_value

    def run(self):
        try:
            while self.running:
                self.current_value = self.session.next() 
        except StopIteration:
            pass

使用中的代码如下:

代码语言:javascript
复制
from gps_poll import *

if __name__ == '__main__':
    gpsp = GpsPoller()
    try: 
        gpsp.start() 
        while True:
            os.system('clear')
            report = gpsp.get_current_value()
            # print report 
            try: 
                if report.keys()[0] == 'epx':
                    print report['lat']
                    print report['lon']           
                time.sleep(.5)
            except(AttributeError, KeyError):
                pass 
            time.sleep(0.5)

    except(KeyboardInterrupt, SystemExit):
        print "\nKilling Thread.."
        gpsp.running = False 
        gpsp.join()

    print "Done.\nExiting." 

您还可以在这里找到代码:这里这里

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6146131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档