2017-05-05 22 views
0

私はGPS modulePythonMySQL databaseを使ってアプリケーションを作っています。Python GPSデータキャプチャ

GPSからデータをキャプチャしてデータベースに格納しようとすると、コードを記述しました。私は "pynmea2"というプラグインを使用して、データの一部(経度と緯度)を解析しています。しかし、私はそれ以上のデータを必要とするので、私はすでに別のものを試しましたが、私のプログラムはずっとクラッシュし続けています。誰かがこれで私を助けることができますか?

ほとんどの場合、私はシリアル接続からすべてのデータを取得しますが、データをそこから取り除きたいと思っています。ですから、例えば、私は何を得るの:[b'$GPGGA,093512.000,,,,,0,3,,,M,,M,,*47\r\n', b'$GPGLL,,,,,093512.000,V,N*76\r\n', b'$GPGSA,A,1,,,,,,,,,,,,,,,*1E\r\n', b'$GPGSV,3,1,11,15,72,214,,24,52,276,,13,48,141,,17,31,093,29*70\r\n', b'$GPGSV,3,2,11,18,28,292,,28,27,049,25,19,24,120,24,12,23,211,13*7E\r\n', b'$GPGSV,3

まあ、それはそれからデータを抽出することは簡単ではないのですが、それはpynmea2ライブラリとうまくうまくいく(のみライブラリI が使用することを許可されてい

今のところ速度と緯度と経度が必要ですが、速度は今私を悩ましています。データを見つけて「解析」する適切な方法がないため、ValueError: could not convert string to float: "22*49\\r\\n'" が多くあります。

私が現在使用しているコードです。

from model.GPSParser import GPSParser 
from model.DB import DB 
import serial 
import time 
import datetime 
import pynmea2 

######################################### 
# This is the main code to setup the 
# serial connection with the GPS module. 
# it needs to be OR runt as root OR as 
# pi with all the root rights. 
######################################### 
port = "/dev/ttyAMA0" 
ser = serial.Serial(port, 9600, timeout=0) 

######################################### 
# These are all the global variables 
# to be used. All defined and set to 
# zero or their standard 'Null' value. 
######################################### 
lat = 0.0 
lon = 0.0 
cur_speed = 0.0 


while True: 

    try: 
     # Get the data from the serial monitor. 
     data = str(ser.readlines()).lstrip("b'")[:-3] 
     # print(data) 

     ######################################### 
     # Find the speed, to check if we're 
     # standing still or not. Save it in a 
     # @var speed 
     ######################################### 
     if data.find('$GPVTG') != -1: 
      cur_speed = data.split(",")[7] 

     ######################################### 
     # Get the Latitude and Longitude 
     ######################################### 
     if data.find('$GPGGA') != -1: 
      print(data) 
      # Check whether the data strings are empty or not. 
      if GPSParser.parseLatitude(data) != "" and GPSParser.parseLongitude(data) != "": 
       lat = GPSParser.parseLatitude(data) 
       lon = GPSParser.parseLongitude(data) 
       # Debug printing 
       # print("Latitude: " + GPSParser.parseLatitude(data)) 
       # print("Longitude: " + GPSParser.parseLongitude(data)) 
       # print("Speed: " + cur_speed) 

     ######################################### 
     # Insert the coordinates into the database 
     # Be sure to check of we are really driving 
     # So when the speed is higher then 5 km/u 
     # Store everything into the database. 
     ######################################### 
     if float(cur_speed) > 5.0: 
      db = DB() 
      db.insertCoordinates(lat, lon, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")) 

     # Wait a bit to not overload the Serial port 
     time.sleep(0.5) 

    ############################################################ 
    # The error handling 
    ############################################################ 
    except serial.serialutil.SerialException: 
     ser.close() 
     port = "/dev/ttyAMA0" 
     ser = serial.Serial(port, 9600, timeout=0) 
     continue 
    except pynmea2.ParseError: 
     # print("Error on parsing object, continuing...") 
     continue 
    except BlockingIOError: 
     # print("Blocking I/O error, continuing...") 
     continue 
    except TypeError: 
     # print("Type error, continuing...") 
     continue 
    except IndexError: 
     # print("To catch an error...") 
     continue 
    except KeyboardInterrupt: 
     print("\nProgram stopped.") 
     exit() 

モデルからのインポートではあまり効果がないので、データベース接続と "gpsパーサー"のみがデータ文字列を解析してから返すようになっています。


それでは、私がしたいことのようなものです:それは、それは$GP変数で始まるチャックにそれをすべてを分割し、その後、私は検索することができ、それはそれは毎秒1回パルスのすべてのデータを取得します

第2の可変部分については、例えば、VTGまたはGGAである。そして、その文字列を使用して、適切な値に変換して、必要に応じて速度、緯度、経度などのデータを抽出することができます。

皆さん、私をよく理解してくれて、助けてくれることを願っています。

+0

pynmea2におけるシリアル読み出し[例](https://github.com/Knio/pynmea2/blob/master/examples/serial.py)が既に存在しrepo –

+0

これは本当ですが、あなたが質問全体を読んでいた場合を除いて、あなたは速度を解析できないことが分かりました。 – Robin

答えて

1

問題が解決するかどうかはわかりませんが、pynmea2の速度属性はtalker.pyです。

import pynmea2 
for i, line in enumerate(open('/tmp/nmea.txt').readlines()): 
    # parsing via pynmea 
    msg = pynmea2.parse(line.strip()) 
    if msg.sentence_type == 'VTG': 
     print ('parsing line %s with pynmea:' % i, float(msg.spd_over_grnd_kmph)) 

    # parsing via manually 
    if line.startswith('$GPVTG'): 
     cur_speed = line.split(",")[7] 
     print ('parsing line %s manually:' % i, float(cur_speed)) 

戻り値:

parsing line 1 with pynmea: 91.626 
parsing line 1 manually: 91.626 
parsing line 10 with pynmea: 90.842 
parsing line 10 manually: 90.842 
parsing line 19 with pynmea: 89.676 
parsing line 19 manually: 89.676 
+0

私はそれを試して、それが巧妙に動作するかどうかを知らせます。 – Robin

+0

それをテストしましたが、 'data = pynmea2.parse(line.strip())'という行は私に次のエラーを与えます: 'AttributeError: 'list'オブジェクトに属性 'strip''がありません – Robin

+0

元のコードを試してください:cur_speed –

関連する問題