うどんやまでのGPS
今年は位置情報を使うiPadアプリの開発をしていたので、いろいろな所へ端末を持って出かけました。GPSの機能は、トンネルの中などでは全然使えなくなってしまいます。動作確認のため、あえてそうした環境でアプリを操作するようなこともありました。
よく知られる通り、GPSは人工衛星を使った測位技術です。もとは米国の航法衛星システムを指していましたが、最近ではロシア、EU、中国、そして日本も同様のものを持つようになったため、総称してGNSSと呼ばれます。地図アプリやカーナビを始め、私たちの日常にもすっかり欠かせない技術ですね。
冒頭の画像は、ある日のランチに出かけたときの位置情報です。立ち食いうどんの人気店、おにやんままで行ったのですが、会社の五反田オフィスを出て、横断歩道を渡り、目黒川沿いを歩いていった道を正確にトレースできています。
Rawデータを収集
普段アプリ開発で現在地を得たいときには、iOSやAndroidのSDKが提供する位置情報プロバイダを使います。プロバイダを通して利用者の緯度経度が取得できるので、それによってアプリは地図にピンを立てたり投稿にジオタグをつけたりできます。
また最近のAndroid端末では、GNSSのRawデータにアクセスすることができるようになっています。これは緯度経度を算出する際の材料となる、GPS衛星から届いた電波ほぼそのものの情報です。
Googleは、主に研究やハード開発向けだと思いますが、ロガーアプリや解析キットも公開しています。それらを使うと、端末のアンテナに届いた衛星からのデータを収集して、どのように現在地が求められたかを検証していくことができます。
先ほどのうどん屋までの位置情報も、このロガーを使って記録したものです。収集した測定値は、ログに書き出した後、PCなどに読み込ませて分析します。
ロガーのインストールはAndroid7以上の環境ですが、得られるデータ種別は端末によって変わるようです。社内の端末で試してみたところ、Pixel5では一部制限があり、Pixel6では衛星の航法データまで取得することができました。
通信ログ
では、収集したログを見ていきます。先述の解析キットを利用すると、様々なグラフによる可視化もできますが、今回は衛星からの通信メッセージが気になるので、まずはデータそのものに注目してみます。
ログファイルをエディタで開くと、さまざまな測定値の出力が混在していますが、Rawとラベルのついた行を抜き出します。これは各衛星の通信から得られた電波と時間計算まわりのデータになります。
行の2列目が衛星システムの種類、3列目が衛星のidとなります。衛星システム1はGPS、3はロシアのGLONASSです。まず7機のGPS衛星、続いて2機のGLONASS衛星の衛星電波が来ていることがわかります。続く値は周波数と電波強度で、GPSの場合は民間用の電波が1575.42MHzになっています。
この下にはまだまだ他の機体が続きます。5分弱の移動の間に、全部で30台に上る衛星から電波を受信していました。頭上を眺めてももちろん肉眼では見えませんが、空の果ての軌道上には多くの測位衛星が周回しています。受信側は、アンテナに入ってきた電波の中から強度が強くノイズが少ないものを選ぶことになります。
GPSの構成では、31機の衛星が全地球を覆うように、MEO軌道と呼ばれる地上2万キロの高度に配置されています。この時刻では、そのうちid 10、12、25、28、29、31、32の7機が、東京をとりまく天球上にあったわけです。
現在地を求める
GPSで現在地を測定するときに重要なのが、電波の到達時間と衛星の軌道位置です。電波は光速で進むため、発信と受信の時刻が判明すれば衛星との距離が得られます。計測のさいは、4機以上の座標と距離を求め、その交点から現在地を決定することになります。
光速と掛けるとき、0.001秒のずれは300kmの誤差になるので、時間はかなり精密に扱う必要があります。単位はナノ秒というごく細かなものになります。衛星とスマホの時計はずれるので、電波の位相と複数の衛星からのタイムスタンプを使って時刻合わせをしています。
Rawデータの中には、そうして求められた発信と受信の時刻が入っています。到達時刻は、受信時刻(TimeNanos)から時計誤差(FullBiasNanos)を減じたものを週時刻に直し、発信時刻(ReceivedSvTimeNanos)を引くことで求められます。
エクセルで値を計算してみると、およその結果が得られました。衛星id 10から28の搬送時間は、66ミリ秒から74ミリ秒の間、距離は1万9千キロから2万2千キロとなります。
続いて衛星の位置です。
受信した電波をデコードすると、40バイトのデータが得られます。これはサブフレームという単位に分割された衛星の位置情報になります。6秒に1回送られてくるサブフレームを5つ繋ぎ合わせると、ひとつのフレームとなり、軌道位置(エフェメリス)が得られます。12分半かけて25フレーム揃えると、他の衛星の軌道(アルマナック)も把握することができます。これらは航法メッセージと呼ばれます。衛星から送られてきていたのは、機体自身の位置情報でした。
ログの中では別に分けられていて、Navとラベルがついた行になります。2列目が衛星のidで、7列目からがサブフレームのバイト列です。
5つあるサブフレームのうち、2番目と3番目がエフェメリスで、衛星の現在地を知るためのパラメータが入っています。ケプラー軌道要素と呼ばれる、天体の軌道平面と近点角を定める6つの値です。
この軌道パラメータをもとに、衛星の位置を確認してみます。解析キットでも使われているMATLABを開き、スクリプトに必要な値を入力すると、シミュレータが現れて軌道を描画してくれます。今回は、GPS衛星のid 10、12、25、28の軌道を出してみました。
青い線で示された軌道が、うどんやに行ったときの衛星の位置です。4つの衛星からの距離はすでに判明しているので、それらの交点が、五反田駅前を歩いていた自分の現在地になります。
以上ざっとではありますが、GPSが現在地を返す過程を追いかけてみました。考えてみると、わずか数十機の衛星で世界中のスマホが位置を知ることができるわけで、人々の生活に与えた影響ははかり知れない技術といえますね。今回詳しく触れられませんでしたが、データ形式や時刻合わせの仕様もきわめて精巧で興味深かったです。
フェンリルの Advent Calender はまだまだ続きます。明日以降もお楽しみください!
この記事が気に入ったらサポートをしてみませんか?