3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GPS NMEAセンテンスをgpsdで解析する

Last updated at Posted at 2022-06-06

はじめに

GPS service daemon (通称gpsd) をPC上で動かして、NMEAを解析する方法に関するメモ書きです。GPSの性能を手っ取り早く確認するのに便利です。

gpsdの詳細については本家ホームページを参考にしてください。

NMEA出力についてはSPRESENSEボードを使用しました。

アンテナ含めてGNSS機能を内蔵しているので便利です。

SPRESENSEボードでNMEAを出力する

Spresense Arduino環境でNMEAセンテンスを出力する方法は、公式チュートリアルに載っていました。公式サイトから少しだけ変更しています。

gnss_nmea.ino
#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)がいまいちです。
mac-gpsmon.png

cgpsコマンド

$ cgps

結果

GPSとBeiDouを有効にした例です。DOP値など精度情報が出力されます。
mac-cgps.png

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

結果

GPSとGLONASSを有効にした例です。
ubuntu-gpsmon.png

cgpsコマンド

$ cgps

結果

GPSとGLONASSを有効にした例です。
ubuntu-cgps.png

xgpsコマンド

$ xgps

結果

GPSとGLONASSを有効にした例です。衛星配置を確認できます。
ubuntu-xgps.png

gpsplotコマンド

$ gpsplot

結果

GPSとGLONASSを有効にした例です。測位結果のばらつきを確認できます。
ubuntu-gpsplot.png

gpsprofコマンド

$ gpsprof -T png | gnuplot > image.png

結果

画像に落として表示した結果。デフォルト100サンプル分の統計誤差情報。
image.png

3
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?