python3
GPS
Raspberrypi3

Raspberry Pi3でGPSを扱う

はじめに

Raspberry Pi3にGPSデバイスを搭載し、PythonでGPSデータを取得してみます。

環境

以下の環境を使用します。

環境 バージョン
Raspberry Pi3 Model B -
RASPBIAN STRETCH WITH DESKTOP November 2017
Python3 3.6.3
GLOBALSAT BU-353S4 USB GPSレシーバー -

環境構築

GPSデバイスを使用するために必要なソフトウェアのインストール等を行います。

まず、USBポートにGPSデバイスを差し込み、デバイスが認識されたことを確認します。

$ dmesg | grep Prolific
usb 1-1.3: Manufacturer: Prolific Technology Inc.

$ ls /dev/ttyUSB*
/dev/ttyUSB0

続いて、GPSデーモンのgpsdやクライアント等をインストールします。

$ sudo apt-get install gpsd gpsd-clients python-gps
$ sudo apt-get install cu

gpsdの設定を行います。デバイス名やgpsd実行時のオプションを指定します。

$ vi /etc/default/gpsd

# 以下の2行を修正する。
DEVICES="/dev/ttyUSB0"
GPSD_OPTIONS="-n"

gpsdサービスの自動起動設定等を行います。

$ sudo systemctl enable gpsd.socket
$ sudo systemctl start gpsd.socket

ここでRaspberry Piを再起動します。

PythonでGPSのデータを取得してみる

PythonでGPSを使用するために、gpsモジュールをインストールします。

$ pip3.6 install gps3

以下はPythonのソースコードです。
GPSの電波状況が良い場所で実行して下さい。

from gps3 import gps3

gps_socket = gps3.GPSDSocket()
data_stream = gps3.DataStream()
gps_socket.connect()
gps_socket.watch()

for new_data in gps_socket:
  if new_data:
    data_stream.unpack(new_data)
    print('time : ', data_stream.TPV['time'])
    print('lat : ', data_stream.TPV['lat'])
    print('lon : ', data_stream.TPV['lon'])
    print('alt : ', data_stream.TPV['alt'])
    print('speed : ', data_stream.TPV['speed'])

以下のように繰り返し表示されます。

time : 2017-12-11T14:58:33.040Z
lat : xx.xxxxxxxxx
lon : xxx.xxxxxxxxx
alt : 44.832
speed : 0.0
・・・

おわりに

備忘録的にRaspberry PiでGPSモジュールを扱う方法を記しました。

電波状況が良くないとGPSからのデータを取得できず正常に動作しないことが多いです。
設定が間違っているのか、プログラムが間違っているのか、GPSの受信状況が良くないのか、原因の切り分けがやっかいなので、GPSの電波状況が良い場所で動作確認することをお勧めします。