RaspberryPi[63] Raspberry Piでgpsfakeを使ったGPSデバッグ方法まとめ
この記事では、Raspberry Piでgpsfakeを使ってGPSデータをシミュレーションし、
gpsdを利用したプログラムを効率的にデバッグする方法を解説します。
実機なしでNMEAログを再現する手順や注意点をまとめました。gpsfakeを使用して、gpsd を使ったプログラムのデバッグをするのは非常に便利と前のブログで書いたけど、ちょっと使い方に癖があるので載せておきます。
gpsd.socket は gpsd を起動するトリガーになっているため、この2つを止める必要があります。下記のスクリプトでは gpsd を先に止めていますが、環境によっては先にソケットを止めないとエラーになることがあるようです。
gpsd を停止すると、それを利用しているプログラムはエラーになります。もしサービスとして動かしている場合は自動的に再起動を繰り返すので、一旦サービス自体を止めておきましょう。
その状態で gpsfake を動かすと、内部で gpsd が起動します。これによりプログラムは正常に動作します。この流れを理解していれば、必ずしもスクリプトは不要です。
なお、gpsfake はプロセスとして残り続けるため、再度起動する場合は前の gpsfake を pkill で終了させてから実行してください。
🎯 目的:
実際の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 で止まっているはずなので、基本、ここはエラーになるはず。あくまでも念のために入れているだけなので。

