Raspberry Pi[63] gpsfake を使ったGPSデバッグの基本まとめ
gpsfakeを使用して、gpsd を使ったプログラムのデバッグをするのは非常に便利と前のブログで書いたけど、ちょっと使い方に癖があるので載せておきます。
🎯 目的:
実際のGPS機器を使わずに、保存済みのNMEAログを gpsd
に流し込んで、
自作のGPSデータ取得プログラムを再現性のある状態でデバッグすること。
🧭 推奨手順(デバッグの流れ):
- 自作プログラム(gpsdを使用するやつ)を停止しておく
gpsd
に自動接続しに行くプログラムが先に動いていると、gpsd
がソケット経由で勝手に起動してしまうので、gpsd を使うデバッグするプログラムは止める。- 実際のGPS受信機は外しておく。
sudo systemctl stop my-gps-program.service
- gpsd と gpsd.socket を停止してクリーンな状態に
sudo systemctl stop gpsd.socket sudo systemctl stop gpsd
gpsfake
をバックグラウンドで起動(仮想GPSデバイスを生成)gpsfake -c 1 -n NMEA/sample.nmea &
起動後に仮想ポート(例/dev/pts/3
)が表示される。- その仮想ポートを指定して
gpsd
を明示的に起動sudo gpsd /dev/pts/3 -n
※仮想ポート番号はgpsfake
起動直後の出力を参照(GPS受信機を外してあれば明示しないでもOK) - 自作の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 で止まっているはずなので、基本、ここはエラーになるはず。あくまでも念のために入れているだけなので。