Raspberry Pi[63]  gpsfake を使ったGPSデバッグの基本まとめ

gpsfakeを使用して、gpsd を使ったプログラムのデバッグをするのは非常に便利と前のブログで書いたけど、ちょっと使い方に癖があるので載せておきます。

🎯 目的:

実際のGPS機器を使わずに、保存済みのNMEAログを gpsd に流し込んで、
自作のGPSデータ取得プログラムを再現性のある状態でデバッグすること。


🧭 推奨手順(デバッグの流れ):

  1. 自作プログラム(gpsdを使用するやつ)を停止しておく
    • gpsd に自動接続しに行くプログラムが先に動いていると、gpsd がソケット経由で勝手に起動してしまうので、gpsd を使うデバッグするプログラムは止める。
    • 実際のGPS受信機は外しておく。
    • sudo systemctl stop my-gps-program.service
  2. gpsd と gpsd.socket を停止してクリーンな状態に sudo systemctl stop gpsd.socket sudo systemctl stop gpsd
  3. gpsfake をバックグラウンドで起動(仮想GPSデバイスを生成) gpsfake -c 1 -n NMEA/sample.nmea & 起動後に仮想ポート(例 /dev/pts/3)が表示される。
  4. その仮想ポートを指定して gpsd を明示的に起動 sudo gpsd /dev/pts/3 -n ※仮想ポート番号は gpsfake 起動直後の出力を参照(GPS受信機を外してあれば明示しないでもOK)
  5. 自作のGPSプログラムを再起動 sudo systemctl start my-gps-program.service

⚠ なぜ実GPSや自作プログラムを事前に止める必要があるの?

  • gpsd.socket により gpsdが勝手に起動してしまう
  • gpsd実GPSと仮想GPSを同時に扱おうとするので、データが混ざる恐れがある
  • gpsfake のテストの再現性がなくなる

🧰 実GPSを無効化したいとき:

  • GPS受信機が外せない場合、/etc/default/gpsd にて DEVICES="" にしておけば、gpsd が実デバイスを無視して起動する

💡 補足オプション:

実際の起動プログラム

#!/bin/sh -e

echo "Stop gpsd"
sudo systemctl stop gpsd
sudo systemctl stop gpsd.socket

echo "stop xing_alart and esp32-com"
sudo systemctl stop xing_alart.service || true
sudo systemctl stop esp32-com.service || true
sudo pkill xing_alart || true
sudo pkill esp32-com || true

echo "start gpsfake"

cd /home/pi/work/XING
/usr/bin/gpsfake -c 1 -n NMEA/$1 &

echo "restart xing_alart and esp32-com"
sudo systemctl restart xing_all.target

exit 0

スクリプトの途中でエラーがあるとそこで止まってしまうので、|| true をつけると止まらず次に行きます。pkill を実行したとき、すでに、stop で止まっているはずなので、基本、ここはエラーになるはず。あくまでも念のために入れているだけなので。