10

Python 2.6で標準のGPS (gps.py) モジュールを使用しようとしています。これはクライアントとして機能し、Ubuntu で実行されている gpsd から GPS データを読み取ることになっています。

クライアント設計に関する GPSD Web ページのドキュメント ( GPSD Client Howto ) によると、最新の GPS 測定値を取得するために次のコード (例を少し変更したもの) を使用できるはずです (私が主に興味を持っているのは緯度経度です)。

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() を繰り返し使用すると、LATEST Gps の読み取り値ではなく、キューの一番下 (セッションが開始されたときから) からバッファリングされた値が得られます。このライブラリを使用してより最近の値を取得する方法はありますか? ある意味で、最新の値にストリームを求めますか?

このライブラリを使用して gps をポーリングし、探している値を取得するコード例を持っている人はいますか?

これが私がやろうとしていることです:

  1. セッションを開始する
  2. ユーザーがコードで gps_poll() メソッドを呼び出すのを待ちます
  3. このメソッド内で、最新の TPV (Time Position Velocity) レポートを読み取り、lat long を返します。
  4. ユーザーが gps_poll() を呼び出すのを待つことに戻ります。
4

4 に答える 4

20

あなたがする必要があるのは、定期的に 'session.next()' をポーリングすることです - ここでの問題は、あなたがシリアルインターフェースを扱っているということです - 受け取った順に結果を取得します。最新の取得値を持つ「current_value」を維持するのはあなた次第です。

セッション オブジェクトをポーリングしないと、最終的に UART FIFO がいっぱいになり、新しい値を取得できなくなります。

これにはスレッドの使用を検討してください。ユーザーが gps_poll() を呼び出すのを待たずに、ポーリングする必要があります。ユーザーが新しい値を必要とする場合は、current_value を返す「get_current_value()」を使用します。

私の頭の上では、次のような単純なものになる可能性があります。

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() 
于 2011-05-26T23:49:09.463 に答える
2

私の2セントを追加します。

なんらかの理由で、私のラズベリー pi はスレッドを実行し続け、pi をハード リセットする必要がありました。

そこで、sysnthesizerpatel と Dan Mandel のブログ (こちら) で見つけた回答を組み合わせました。

私の gps_poller クラスは次のようになります。

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

使用中のコードは次のようになります。

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." 

コードはここにもあります:ここここ

于 2016-03-17T23:46:25.723 に答える