Spresense GPS機能初体験

ひとつまえの記事で、Spresenseの初期設定を終えてLチカができるようになりました。
その後の公式チュートリアルでは、まず音楽データを再生したり録音したりする例が最初にありましたが、いやもう私はGPSに直行です!

GPSチュートリアルはこちら:
https://developer.sony.com/spresense/development-guides/arduino_tutorials_ja#_tutorial_gps

まずはそのまま動かしてみる

チュートリアルに従って、メインボード1枚だけでGPS機能を動かしてみます。
この項は基本的にチュートリアルページと同じことを(自分がやったメモとして)書いているだけなので、本家をご覧いただければ。

  • Arduino IDEを起動
  • ファイル - スケッチ例 - (Spresenseのスケッチ例の下にある)GNSS - gnss
  • プログラムが読み込まれるので、左上の「→」を押してコンパイル&ボードに書き込み
  • ツール - シリアルモニタ でシリアルに出力されている内容を確認する。1秒ごとにGPSの測位情報が表示されます。
    • 文字化けしている場合は、ボーレートを115200に設定
    • 衛星から時刻情報を受け取ってから正しい時刻表示になります。それまでは 1980/01/01で。
    • Fix解が求まると、移動経度が表示され始めます。
    • ときどき、衛星情報が表示されます(1分おきらしい)。
衛星情報の例(これは後ほど記述予定の改造を行ったあとのログ)
numSatellites:17
2025/05/15 06:10:00.000674, [ 0] Type:GPS, Id: 4, Elv:25, Azm: 45, CN0:27.879999
2025/05/15 06:10:00.000674, [ 1] Type:GPS, Id: 5, Elv: 6, Azm:252, CN0:17.660000
2025/05/15 06:10:00.000674, [ 2] Type:GPS, Id: 6, Elv:69, Azm: 22, CN0:39.989998
2025/05/15 06:10:00.000674, [ 3] Type:GPS, Id: 7, Elv: 8, Azm:122, CN0:24.320000
2025/05/15 06:10:00.000674, [ 4] Type:GPS, Id: 9, Elv:55, Azm: 71, CN0:30.029999
2025/05/15 06:10:00.000674, [ 5] Type:GPS, Id:11, Elv:47, Azm:317, CN0:35.049999
2025/05/15 06:10:00.000674, [ 6] Type:GPS, Id:12, Elv:12, Azm:284, CN0:30.799999
2025/05/15 06:10:00.000674, [ 7] Type:GPS, Id:17, Elv:29, Azm:165, CN0:43.189999
2025/05/15 06:10:00.000674, [ 8] Type:GPS, Id:19, Elv:53, Azm:179, CN0:36.969997
2025/05/15 06:10:00.000674, [ 9] Type:GPS, Id:20, Elv:35, Azm:272, CN0:32.910000
2025/05/15 06:10:00.000674, [10] Type:GPS, Id:25, Elv: 1, Azm:313, CN0:0.000000
2025/05/15 06:10:00.000674, [11] Type:GPS, Id:30, Elv: 0, Azm:154, CN0:0.000000
2025/05/15 06:10:00.000674, [12] Type:Q1S, Id:186, Elv:65, Azm:180, CN0:40.739998
2025/05/15 06:10:00.000674, [13] Type:QCA, Id:194, Elv:26, Azm:196, CN0:32.680000
2025/05/15 06:10:00.000674, [14] Type:QCA, Id:195, Elv:88, Azm: 53, CN0:34.290001
2025/05/15 06:10:00.000674, [15] Type:QCA, Id:196, Elv:65, Azm:180, CN0:38.419998
2025/05/15 06:10:00.000674, [16] Type:QCA, Id:199, Elv:46, Azm:201, CN0:31.459999
位置情報ログの例(同)
2025/05/15 05:54:22.000689, numSat:14, Fix, Lat=36.135497, Lon=140.079514 
2025/05/15 05:54:23.000699, numSat:14, Fix, Lat=36.135367, Lon=140.079458 
2025/05/15 05:54:24.000678, numSat:14, Fix, Lat=36.135235, Lon=140.079401 
2025/05/15 05:54:25.000690, numSat:14, Fix, Lat=36.135104, Lon=140.079348 
2025/05/15 05:54:26.000698, numSat:14, Fix, Lat=36.134973, Lon=140.079294 
2025/05/15 05:54:27.000678, numSat:14, Fix, Lat=36.134839, Lon=140.079239 
2025/05/15 05:54:28.000687, numSat:14, Fix, Lat=36.134703, Lon=140.079181 
2025/05/15 05:54:29.000697, numSat:14, Fix, Lat=36.134565, Lon=140.079124 
2025/05/15 05:54:30.000678, numSat:14, Fix, Lat=36.134429, Lon=140.079065 

改造

改造1: QZSSも受信するようにする

 もとのプログラムではGPSの電波のみを受信して測位に使っているので、我々日本にいる身としてはみちびき(QZSS)も活用したい。そのための修正です。

enum ParamSat {
  eSatGps,            /**< GPS                     World wide coverage  */
  eSatGlonass,        /**< GLONASS                 World wide coverage  */
  eSatGpsSbas,        /**< GPS+SBAS                North America        */
  eSatGpsGlonass,     /**< GPS+Glonass             World wide coverage  */
  eSatGpsBeidou,      /**< GPS+BeiDou              World wide coverage  */
  eSatGpsGalileo,     /**< GPS+Galileo             World wide coverage  */
  eSatGpsQz1c,        /**< GPS+QZSS_L1CA           East Asia & Oceania  */
  eSatGpsGlonassQz1c, /**< GPS+Glonass+QZSS_L1CA   East Asia & Oceania  */
  eSatGpsBeidouQz1c,  /**< GPS+BeiDou+QZSS_L1CA    East Asia & Oceania  */
  eSatGpsGalileoQz1c, /**< GPS+Galileo+QZSS_L1CA   East Asia & Oceania  */
  eSatGpsQz1cQz1S,    /**< GPS+QZSS_L1CA+QZSS_L1S  Japan                */
};

という定義があり、その下の部分で何を使うかを指定しているようだったので、ここを書き換え。

static enum ParamSat satType =  eSatGpsQz1cQz1S;

この結果が、上で示した衛星情報や位置情報のログです。
Q1Sは みちびきの L1 S を、QCAは L1 C/Aをあらわしているそうです。

ログを取ってみる

指定したCOMポートを監視しているだけでログが流れてくるので、まずはこの状態でログをいくつか取ってみました。
Poderosaというツールでシリアル通信機能があるので、これでノートPCからSpresenseのポートに接続(ボーレートは115200)すると画面表示しつつログファイルに記録してくれるので、この状態で、自宅の窓際(南と東に開けている。西はすぐ壁)に一晩置いておいた記録がこの図。

結構暴れていますね。中心から各方向に30mくらいといったところか。
この後、毎秒のログにも実際に捕まえている衛星のIDを羅列するように改造しました。出力(print_pos())の最後に

  int cnt;
  for (cnt = 0; cnt < pNavData->numSatellites; cnt++){
    Serial.print(" ");
    Serial.print(pNavData->getSatelliteId(cnt));
  } 

を加えただけ。
ログサンプル:

2025/05/15 05:54:22.000689, numSat:14, Fix, Lat=36.135497, Lon=140.079514 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:23.000699, numSat:14, Fix, Lat=36.135367, Lon=140.079458 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:24.000678, numSat:14, Fix, Lat=36.135235, Lon=140.079401 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:25.000690, numSat:14, Fix, Lat=36.135104, Lon=140.079348 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:26.000698, numSat:14, Fix, Lat=36.134973, Lon=140.079294 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:27.000678, numSat:14, Fix, Lat=36.134839, Lon=140.079239 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:28.000687, numSat:14, Fix, Lat=36.134703, Lon=140.079181 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:29.000697, numSat:14, Fix, Lat=36.134565, Lon=140.079124 4 6 9 11 12 17 19 20 22 185 194 195 196 199
2025/05/15 05:54:30.000678, numSat:14, Fix, Lat=36.134429, Lon=140.079065 4 6 9 11 12 17 19 20 22 185 194 195 196 199
移動ログを取ってみる

ちょうどでかける予定があったので、助手席にノートPCを拡げて Spresenseをダッシュボードに置いて(ケーブルを養生テーブルで固定)測定してみました。
ログを加工してCSVにし、kepler.glに描いてもらったのがこれ。

動いていると結構良い感じに連続性を持ったデータが取れました。左下は駐車場でくるんと回っているのですが、かなり正確です。
一方、この図ではところどころ1点飛び出しているように見えるのは、信号待ちなどの停止状態のとき。停止時に誤差が大きくなる事象のように見えます。GPSの原理をそこまで詳しくしらないのだけど、「動いている間は正確で、停まると誤差が出る」みたいなことってあるんですかね。傾向としては

  • 停まると誤差が見えてくる
  • 右折左折などの際に、位置が実際よりも膨らんで曲がったように見える=今までの進行方向を元にした補正のようなものが行われているのでは?と感じる挙動
  • 動いている間は、進行方向に対して点が横にブレたりすることは一切なく、きれいに連続性を持った線を形成している

1秒に1回のロギング(今回はシリアルポートに出力しているだけだけど)というのは私が普段使っているGPSロガーと比べて各段に高頻度なのですが、これでバッテリーどれくらい持つのだろうか。Spresenseを使った自作ロガーでも十分というか、バッテリーが持つならこのほうが良いかも、と思ってしまいました。乾電池3本使うんですよねぇ。。モバイルバッテリーで動かすのがいいのかな。

今後

  • とりあえずファイルに落とすようにしたいですねぇ。ファイルはどうやってPCに転送するんだろうとか、調べることはたくさんありそう
  • サンプルプログラムが他にもいくつかあるので試してみたい
  • 拡張ボードも買ってあるので、そちらをつながて、SDカードの利用や音出し関連のサンプルを動かしてみたい
  • まとめることができそうなら、いったん「自作ロガー」として何度か試験運用してみたい。
  • GPSの拡張ボードも買ってあるので、L1のほかL5も使った測位の精度を見てみたい
  • おはなし相手がほしい