Raspberry Pi 3 とUSBGPSモジュール(u-blox7)でPythonを使ってGPS取得

なんかうまくいったので備忘録的なものもかねて残します(∩´∀`)∩
こんな安価でGPSが取れるなんてすごい…

使ったもの

前提

  • OS(Raspbian)インストール済み、インターネットに接続可能
  • ラズパイでシリアル通信を有効化済み
  • ラズパイしょしんしゃ(重要)

シリアル通信のモジュールをインストール

シリアル通信に必要なpythonのモジュールを入れます。

pip3 install pyserial

GPSライブラリをダウンロード

GPSを扱う上で必要なpythonライブラリをダウンロードします。こちらのGithubからダウンロードだ!
https://github.com/inmcm/micropyGPS

DL&解凍したら、中にある「micropyGPS.py」をこれから書くpythonプログラムと同じフォルダに入れておきます。

Pythonプログラム

99%参考記事のままなので載せていいのか…
と思いつつ変更(削除)したところもあるのでどうぞ

import serial
import micropyGPS
import threading
import time

gps = micropyGPS.MicropyGPS(9, 'dd') # MicroGPSオブジェクトを生成する。
                                     # 引数はタイムゾーンの時差と出力フォーマット

def rungps(): # GPSモジュールを読み、GPSオブジェクトを更新する
    s = serial.Serial('/dev/serial0', 9600, timeout=10)
    s.readline() # 最初の1行は中途半端なデーターが読めることがあるので、捨てる
    while True:
        sentence = s.readline().decode('utf-8') # GPSデーターを読み、文字列に変換する
        if sentence[0] != '$': # 先頭が'$'でなければ捨てる
            continue
        for x in sentence: # 読んだ文字列を解析してGPSオブジェクトにデーターを追加、更新する
            gps.update(x)

gpsthread = threading.Thread(target=rungps, args=()) # 上の関数を実行するスレッドを生成
gpsthread.daemon = True
gpsthread.start() # スレッドを起動

while True:
    if gps.clean_sentences > 20: # ちゃんとしたデーターがある程度たまったら出力する
        h = gps.timestamp[0] if gps.timestamp[0] < 24 else gps.timestamp[0] - 24
        print('%2d:%02d:%04.1f' % (h, gps.timestamp[1], gps.timestamp[2]))
        print('緯度経度: %2.8f, %2.8f' % (gps.latitude[0], gps.longitude[0]))
        print('海抜: %f' % gps.altitude)
        #参考記事だとここに測位利用衛星を出力する記述が入る
        print('衛星番号: (仰角, 方位角, SN比)')
        for k, v in gps.satellite_data.items():
            print('%d: %s' % (k, v))
        print('')
    time.sleep(3.0)

参考記事には測位に使った衛星の番号をリストで出力する記述があったのですが、たまにイテレーションのエラーが出てきたので削除。GPSが取れればいいので今回はヨシ!

まとめ

これだけで取れちゃいました。ただGPSですが窓際やほぼ外に置かないと全く衛星の信号を拾ってくれないのでそこは気を付けたほうがよさそう。他にも安価なUSBGPSはいっぱいあるので検証していきたいと思います。