GPSレシーバーからのデータ受信

今回は、USB接続のGPSレシーバーからPythonにてデータを受信し、QGISに表示するまでを3回に分けて説明します。
初回となる今回は、GPSレシーバーの仕組みと出力フォーマットであるNMEA0183について説明します。

GPSレシーバーの概要

今回は、2008年頃に購入したGPSレシーバーを使ってNMEA0183の検証を行います。
・製品名:GLOBALSAT社製 BU-353
・GPSチップ:SiRF STAR3
・インタフェース:USB(USBシリアルチップ PL2303を使用)
・出力:NMEA0183(USB COMポートから4,800bpsで出力)
・製品URL:こちらになります。

GPSレシーバー BU-353実物

GPSレシーバーの構造

今回使用するGPSレシーバーは、以下のような構造となっています。

GPSレシーバー(BU-353)の構造

上図を簡単に説明しましょう。

GPS衛星

アメリカが運用している衛星で、2020年現在31基が運用されています。
GPSレシーバーが4基以上の衛星から電波を受信すると正しい位置が求められます。具体的には、衛星を4基以上捕捉することで、4つの未知数(X、Y、Z、時刻)の誤差が相殺され、位置誤差が最小となります。誤差の要因には雲や電離層、ビルによる電波反射、電波を発する機器などのノイズなどがあります。誤差は概ね1メートル程度と考えておけばよいと思います。
カーナビなどの車載装置では、GPSの誤差を埋めるために表示している地図上の道路に(半ば無理やり)紐づける”マップマッチング”という手法がとられています。
日本の衛星”みちびき”は、GPSの精度を上げるための補完を目的とした衛星です。

GPSモジュール(SiRF STAR3)

GPSは、通常”モジュール”と呼ばれるアンテナと位置計算を行うカスタムチップ、出力部が一体となった”モジュール”として提供されます。
今回使用するGPSには、SiRF Technology社が提供していた”SiRF STAR3”というGPSモジュールが組み込まれています。
GPSの測位結果は、”NMEA0183”フォーマット(後述)で出力されます。
なお、SiRF Technology社は2015年Qualcommに買収されており、最新製品はSiRF STAR5eのようです。

NMEA0183の概要

NMEA0183とは、アメリカの海洋電子機器協会(National Marine Electronics Association)が策定した海洋電子機器の通信規格です。以下、Wikipediaから引用します。

NMEA 0183 (略してNMEAとも)は、音波探査機、ソナー、風速計(風向風速計)、ジャイロコンパス、自動操舵装置(オートパイロット)、GPS受信機、その他数々の機器のような海上電子装置における、電気的・データを合わせた仕様である。 これは米国に本拠を置く米国海洋電子機器協会により規定され管理されてきた。

引用元:https://ja.wikipedia.org/wiki/NMEA_0183

NMEAのサイトを確認すると、最新バージョンは4.11、仕様書は有償(10万~75万円程度)で頒布されているようです。

引用元:https://www.nmea.org/content/STANDARDS/NMEA_0183_Standard

今回使用するGPSレシーバーからは、下記4種類の電文が通知されます。(緑網掛けの項目は、今回作成するプログラムで使用予定の項目)

GPSからの電文一覧

電文のシーケンスは、以下のようになっています。RMC、GGA、GSA、GGA×3の組み合わせがひたすら通知されます。

GPSからの電文シーケンス

実際の電文例は以下のようになります。

$GPRMC,034745.000,A,3538.4019,N,13944.8307,E,1.68,158.57,230420,,*02
$GPGGA,034746.000,3538.4009,N,13944.8315,E,1,04,2.7,30.2,M,39.4,M,,0000*64
$GPGSA,A,3,27,08,26,18,,,,,,,,,4.0,2.7,2.9*38
$GPRMC,034746.000,A,3538.4009,N,13944.8315,E,1.52,137.32,230420,,*00
$GPGGA,034747.000,3538.4018,N,13944.8308,E,1,04,2.7,28.3,M,39.4,M,,0000*61
$GPGSA,A,3,27,08,26,18,,,,,,,,,4.0,2.7,2.9*38
$GPRMC,034747.000,A,3538.4018,N,13944.8308,E,0.23,50.61,230420,,*3C
$GPGGA,034748.000,3538.4026,N,13944.8303,E,1,03,4.8,28.1,M,39.4,M,,0000*64
$GPGSA,A,2,27,08,26,,,,,,,,,,4.9,4.8,1.0*3A

”$”がコマンドの開始、”GP”は機種種別(GPS)を意味しています。
”*”以降はチェックサムで、最後は改行コード(CR+LF)で終了します。

PL2303

PL2303は、Prolific社(台湾)製のUSB-シリアル変換チップです。
GPSモジュール(SiRF STAR3)から出力されたNMEA0183形式の測位結果は、このチップによりUSB(シリアルポート)経由でPCに通知されます。
PCに専用のドライバーを導入すると、GPSレシーバーがCOMポートとして認識され、テキストデータが連続して通知されます。

出力の確認

ちょっと前置きが長くなりましたが、PCにGPSレシーバーを接続し、TeraTermを使ってシリアルポートから電文を表示してみましょう。
手順は以下の通りです。
 1.PL2303ドライバーの導入
 2.TeraTermの設定と表示

1.PL2303ドライバーの導入

PC(Windows10 Home)に、PL2303ドライバーを導入します。
今回使用するGPSレシーバーのPL2303は、既にサポート停止になっていて、メーカーのサイトからドライバーが提供されていません。
私は、以下のサイトから古いドライバーを入手し導入しました。(もしかすると、先ほどの東京通商のサイトにて公開しているドライバーでも大丈夫かもしれません。)
http://domoticx.com/pl2303-usb-to-uart-bridge-drivers-windows/
ダウンロードしたファイル名は以下になります。
DriverInstaller v1.0.2.5 – Prolific PL2303 driver v3.3.3.114.7z

適切なドライバーを導入すると、GPSレシーバーがデバイスマネージャーのCOMポート(下図の例ではCOM5)として認識されます。

COM5として認識されたGPSレシーバー
2.TeraTermの設定と表示

最後に、ターミナルソフト(TeraTerm)を使って電文の受信を確認します。
GPSレシーバーを接続した状態でTeraTermを立ち上げ、認識しているCOMポート(COM5)を指定します。

TeraTermからシリアルポートへ接続

接続しても、GPSとTeraTermのビットレートと一致のため文字化けして表示されると思います。

最初は文字化けする

TeraTermのメニューから[設定]、[シリアルポート(E)…]を選択し、表示される設定画面からビットレートを4,800に指定して”OK”ボタンを押下します。

ビットレートをGPSの4,800に合わせる

結果、GPSレシーバーからの電文(NMEA0183)が正しく表示されます。

GPSレシーバーからの電文が正しく表示される

まとめ

今回は、GPSレシーバーの概要とPCへの接続、NMEA0183の電文確認までを行いました。
今回の記事で一番苦しんだのは、PL2303のドライバー探しでした。いくつかのサイトを参考にして、10種類くらいのドライバーを導入し、ようやく動作可能なものを見つけたのですが、それだけで3日使ってしまいました。。

以下の記事では、TeraTermのログとして出力したNMEA0183電文を、Pythonを使ってGeoJSON形式に変換してQGISに表示していますので、よかったら読んでみてください。