Raspberry Pi: GPS レシーバーを使う

Takami Torao RPi3 Model B+ Raspbian 11 #RaspberryPi
  • このエントリーをはてなブックマークに追加

概要

Raspberry Pi を含む Linux ベースのシステムに USB 接続の GPS レシーバーを接続することで正確な時刻と位置情報を得ることができる。

Table of Contents

  1. 概要
  2. GPS レシーバーを接続する
  3. Python プログラミング
  4. References

GPS レシーバーを接続する

GPS レシーバーを USB に接続し lsusb コマンドを使用するとすぐに認識していることが分かる。U-Blox AG と表示されているデバイスが GPS レシーバーである。

$ lsusb
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 006: ID 30de:6545 KIOXIA TransMemory
Bus 001 Device 008: ID 1546:01a7 U-Blox AG [u-blox 7]
Bus 001 Device 005: ID 0424:7800 Microchip Technology, Inc. (formerly SMSC)
Bus 001 Device 003: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Microchip Technology, Inc. (formerly SMSC) USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

バックグラウンドで GPS デバイスと通信する gpsd とそのクライアントをインストールする。

sudo apt-get install -y gpsd gpsd-clients

gpsd は USB やシリアルポートに接続した GPS デバイスからデータを収集して 2947 TCP ポート経由で複数のアプリケーションから使えるようにするデーモンである。NMEA 0183のようなプロトコルを JSON に変換している。

測位の状況は cgps -s コマンドで確認することができる。ただし、測位を開始しても十分な衛星を補足するまでは Fig 3 のように n/a ばかりになったり、でたらめな位置を示しているだろう。しばらくして測位が可能となると、左側に現在時刻と緯度、経度、標高、速度などが表示され、右側には補足している衛星とその電波状況が表示されるようになる。

Fig 1. cgps コマンドで見る GPS 情報。15 個の衛星を補足していて、そのうちの S/N 比の高い 5 個を使用している。
Fig 2. gpsd の構成。
Fig 3. 十分な衛星を補足していない状態。

衛星の位置情報を全く持たない状態での GPS デバイスの起動をコールドスタートと呼ぶ。これは購入後の初回起動や、飛行機等で長距離を移動した後の起動、長期間の間を空けて起動したような状態が該当する。コールドスタートは十分な数の衛星を捕捉するまで位置を特定できないため測位を開始するまでに非常に時間がかかる (Garmin の GPSMap60CS でも室内では30分~数時間かかることもある)。

これに対して、ある程度正確に衛星の位置情報が分かっている状態での起動をホットスタートと呼び、こちらは数秒程度で測位が可能となる。携帯電話やスマートフォンは通信回線を経由して衛星の位置情報 (A-GPS) をダウンロードするためホットスタートで起動できる[1]。

cgps 以外にも、gpsd を経由せず直接 GPS のパケットを監視する gpsmon コマンドを使うこともできるので、問題の切り分けなどで使い分けるとよいだろう。

Python プログラミング

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

References

  1. 第456回:A-GPS とは - ケータイ Watch