Ubuntu 16.04 LTSでGPS レシーバーを接続し、python3言語のスクリプトを使用してGPSデータを取得しました。

GPS レシーバーのインストール

amazonから「GPS レシーバー USB, 内蔵 アンテナ チップ 一体型」を購入しました。届いたGPS レシーバーを確認すると、VFAN社のモデル:UG-353でした。Ubuntu 16.04 LTSでGPS レシーバーを接続して、次のコマンドで接続を確認すると、「U-Blox AG」と認識されました。

$ lsusb
Bus 002 Device 004: ID 1546:01a7 U-Blox AG 
Bus 002 Device 003: ID 046d:c018 Logitech, Inc. Optical Wheel Mouse
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 17ef:480f Lenovo Integrated Webcam [R5U877]
Bus 001 Device 003: ID 0a5c:217f Broadcom Corp. BCM2045B (BDC-2.1)
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Ubuntu 16.04 LTSが動作するThinkPad T410にGPS レシーバーを接続した状態を次に示します。

ThinkPad T410とGPS レシーバーの接続

次のコマンドで、GPSデーモン「gpsd」をインストールします。

$ sudo apt-get install gpsd gpsd-clients

ここで、再起動します。

次のコマンド「gpsmon」を実行するとGPSデータが受信されます。

$ sudo gpsmon

gpsmon

次のコマンド「cgps」を実行するとGPSデータが受信されます。

$ sudo cgps

cgps

GPS受信プログラムの作成

Ubuntu 16.04 LTSにはすでにPython3はインストールされていました。GPSライブラリ「gps3」を次のコマンドでインストールします。

$ sudo apt-get install python3-pip 
$ sudo pip3 install gps3

GPS受信プログラム「gpstest.py」を次に示します。このプログラムでは、変数「gps_socket」により、GPSから入力した緯度、経度、高度、速度をCSV形式でファイル「gps.csv」に保存します。

from gps3 import gps3
import csv

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

with open('gps.csv', 'w') as f:
    writer = csv.writer(f, lineterminator='\n') # 改行コード(\n)を指定しておく

    i=0
    for new_data in gps_socket:
        if new_data:
            data_stream.unpack(new_data)
            list=[data_stream.TPV['time'],
            data_stream.TPV['lat'],
            data_stream.TPV['lon'],
            data_stream.TPV['alt'],
            data_stream.TPV['speed']]
            writer.writerow(list)     # list(1次元配列)の場合
            i += 1
            if i>110:
                break

「sudo apt-get install python3-pip 」を実行したときに次のエラーが発生しました。

[sudo] password for oneiric:
E: ロック /var/lib/apt/lists/lock が取得できませんでした – open (11: リソースが一時的に利用できません)
E: ディレクトリ /var/lib/apt/lists/ をロックできません
E: ロック /var/lib/dpkg/lock が取得できませんでした – open (11: リソースが一時的に利用できません)
E: 管理用ディレクトリ (/var/lib/dpkg/) をロックできません。これを使う別のプロセスが動いていませんか?

次の2行を実行してロックファイルを削除すると、正常に命令が実行できるようになりました。

$ sudo rm /var/lib/apt/lists/lock
$ sudo rm /var/lib/dpkg/lock

GPS受信プログラムの実行

GPS受信プログラムを実行すると、ファイル「gps.csv」にCSV形式で次のようにGPSデータが保存されます。

        ...
2019-09-12T02:25:31.000Z,35.445834167,139.634532333,163.0,0.236
2019-09-12T02:25:33.000Z,35.445830667,139.634535167,162.4,0.093
2019-09-12T02:25:34.000Z,35.445831667,139.634540333,162.2,0.27
2019-09-12T02:25:35.000Z,35.445833,139.634551833,161.9,0.535
2019-09-12T02:25:36.000Z,35.445836333,139.634564667,161.6,0.6
2019-09-12T02:25:37.000Z,35.4458385,139.634574167,161.2,0.543
2019-09-12T02:25:38.000Z,35.44584,139.634584667,160.8,0.645
        ...