はじめに
GPS service daemon (通称gpsd) をPC上で動かして、NMEAを解析する方法に関するメモ書きです。GPSの性能を手っ取り早く確認するのに便利です。
gpsdの詳細については本家ホームページを参考にしてください。
NMEA出力についてはSPRESENSEボードを使用しました。
アンテナ含めてGNSS機能を内蔵しているので便利です。
SPRESENSEボードでNMEAを出力する
Spresense Arduino環境でNMEAセンテンスを出力する方法は、公式チュートリアルに載っていました。公式サイトから少しだけ変更しています。
#include <GNSS.h>
#include <GNSSPositionData.h>
#include <gpsutils/cxd56_gnss_nmea.h>
SpGnss Gnss;
char PositionData[sizeof(GnssPositionData)];
/* output NMEA */
static char nmea_buf[NMEA_SENTENCE_MAX_LEN];
static char *reqbuf(uint16_t size)
{
if (size > sizeof(nmea_buf)) {
return NULL;
}
return nmea_buf;
}
static void freebuf(char *buf)
{
return;
}
static int outbin(char *buf, uint32_t len)
{
return len;
}
static int outnmea(char *buf)
{
return printf("%s", buf);
}
void setup()
{
/* Initialize Serial */
Serial.begin(115200);
/* Initialize GNSS */
if (Gnss.begin()) {
Serial.println("begin error!");
}
/* select satellite system */
Gnss.select(GPS);
Gnss.select(QZ_L1CA);
//GLONASS/BEIDOU/GALILEOのどれか一つを有効にする
Gnss.select(GLONASS);
//Gnss.select(BEIDOU);
//Gnss.select(GALILEO);
/* set interval */
Gnss.setInterval(1);
if (Gnss.start(COLD_START)) {
Serial.println("start error!");
}
/* use NMEA library */
NMEA_InitMask();
NMEA_OUTPUT_CB funcs;
funcs.bufReq = reqbuf;
funcs.out = outnmea;
funcs.outBin = outbin;
funcs.bufFree = freebuf;
NMEA_RegistOutputFunc(&funcs);
}
void loop()
{
/* Check update. */
if (Gnss.waitUpdate(1000)) {
/* Output NMEA */
Gnss.getPositionData(PositionData);
NMEA_Output(&(((GnssPositionData*)PositionData)->Data));
}
}
macOS環境でgpsdを使用する
macOS向けにhomebrewでgpsdが提供されているのですが、gpsmon, cgpsなど一部の機能しか使用できないようです。
インストール
Homebrew で gpsd をインストールします
$ brew install gpsd
起動方法
$ GPSD_SOCKET="$(brew --prefix)/var/gpsd.sock" $(brew --prefix)/Cellar/gpsd/3.24/sbin/gpsdctl add /dev/tty.SLAB_USBtoUART
$ brew services restart
gpsmonコマンド
$ gpsmon
結果
GPSとBeiDouを有効にした例です。家の中で動かしているので信号レベル(SN)がいまいちです。
cgpsコマンド
$ cgps
結果
GPSとBeiDouを有効にした例です。DOP値など精度情報が出力されます。
Ubuntu環境でgpsdを使用する
Linux向けのgpsdはフル機能が使用できます。
私はWindows10のWSL2 + VcXsrvを使って動作確認しています。
WSL2 kernelを変更して直接USBポートにアクセスすることもできるようにしています。
詳しくは、WSL2環境からUSBシリアルデバイスを使うを参照してください。
インストール
apt-get で gpsd, gpsd-clients をインストールします
$ sudo apt-get install gpsd gpsd-clients
起動方法
$ gpsd /dev/ttyUSB0
gpsmonコマンド
$ gpsmon
結果
cgpsコマンド
$ cgps
結果
xgpsコマンド
$ xgps
結果
GPSとGLONASSを有効にした例です。衛星配置を確認できます。
gpsplotコマンド
$ gpsplot
結果
GPSとGLONASSを有効にした例です。測位結果のばらつきを確認できます。
gpsprofコマンド
$ gpsprof -T png | gnuplot > image.png