見出し画像

Geospatial APIの測位ログを可視化してみたらめちゃくちゃ精度が良かった件

(この記事ではVPSの測位結果のログを可視化する方法をお伝えします~)

Geospatial API?VPS?

ARCore Geospatial APIはGoogleが公開しているVPSのAPIです。
(詳しくは公式ドキュメントをどうぞ)

とりあえず私はこれで屋外ARに革命が起きたと思ってるのですが、
GeoSpatial APIがどれくらいヤバイのかをメモっておきます~
(細かい話すると向いている方位を測位する精度がヤバくて、ARの"モノ"がめっちゃ正確に置きたい場所に置けてヤバいのでとにかくヤバいということです。)

↓ヤバい

VPSの測位ログをテキストファイルに出力する

この記事ではUnityでGeoSpatial APIのサンプルを実機で動かすところまではできているものとします。GeoSpatial APIのサンプルを実行すると画面に緯度(LAT)とか経度(LON)とかがテキスト表示されてると思います。これをテキストファイルとして外部出力することでVPSの位置測位ログを取得します。
ファイル出力できればなんでもよいのですが、サンプル内のGeoSpatialController.csで画面に表示するテキストが作成されているのでこれを参考にするのが手っ取り早いです。
(スマートフォンにおけるテキストファイルの外部出力の説明は、ここでは省略しますので必要なら各自ググってください。)

1. GeospatialControllerというオブジェクトに
2. GeospatialController.csがアタッチされているので開きます。
3. UpdateDebugInfo()という関数で画面に表示されているテキストが作られているのでそれをマネして適当にテキストファイルを出力します。
※テキストファイルに pose.Latitudepose.Longitudepose.Headingあたりが出力できれば、GeospatialController.cs以外のスクリプトでファイル出力しても問題ないです。

GeoSpatialControllerの場所

私は↓のようにテキストファイルに出力してます。

【出力しているテキスト(1行)】
$"{pose.Latitude:F6},{pose.Longitude:F6},{pose.HorizontalAccuracy:F6},{pose.Altitude:F2},{pose.VerticalAccuracy:F2},{pose.Heading:F2},{pose.HeadingAccuracy:F2}"

出力したVPSのログ

測位ログを可視化する

下準備

さて、測位ログの可視化ですが、位置座標はそのままQGISに取り込めば表示できるのですが、向いている方位(Heading)の可視化には少々工夫が必要です。今回は下記の手順でHeadingの可視化を行ってます。

Heading可視化手順】
1. 現在の位置から、向いている方向に少しオフセットした座標を計算する
2. 現在位置とオフセットした座標間に線を引く
3. QGIS上で線を矢印として表示する

上記が実現できれば使うツールはエクセルでもなんでもよいです。
私は手順1,2をpython、QGISで線を表示する方法として、WKTフォーマットのファイルを使用しています。

参考までに上記の手順1,2を行うpythonスクリプトを載せておきます。(私はpython3.8を使ってます。)

# HeadingVisualizer2QGIS.py
import csv
import math

# csv読み込み
file_name = "ここに入力ファイル名"
path = "./" + file_name + ".txt"
with open(path) as f:
    reader = csv.DictReader(f, fieldnames=['LAT', 'LON', 'HAcc', 'ALT', 'VAcc', 'HEADING', 'HEADAcc'], )
    l = [row for row in reader]

offset_length = 0.000001

# csvをWKTに変換する
wkt = ""
for row in l:
    # offset座標計算
    x_offset = float(row["LON"]) + math.sin(math.radians(float(row["HEADING"]))) * offset_length
    y_offset = float(row["LAT"]) + math.cos(math.radians(float(row["HEADING"]))) * offset_length
    # WKTに書き込む
    wkt = wkt + "LINESTRING (" + row["LON"] + " " + row["LAT"] + "," + str(x_offset) + " " + str(y_offset) + ")" + "\n"

with open("log_" + file_name + "_Head.txt", mode='w') as f:
    f.write(wkt)

出力されるWKTファイルの中身は下記のようになっています。

WTKファイル

QGISで可視化する

WTKファイルが用意出来たら、QGISを開いてWKTファイルを読み込みます。
(csvテキストレイヤを追加します。)
下図のオレンジ枠で囲んだ部分を同じように設定してください。

QGISのWKTファイル読み込み設定

WKTファイルが読み込めたら下記の手順で直線を矢印に変更します。

矢印の適用

するとこんな感じで矢印が表示されます。私が車を避けたところまで正確にトレースされていますね。

完成図

まとめ

GeoSpatial APIのログを可視化してみると、VPSがめちゃくちゃ正確に即位されていることがわかると思います~
今後はこれを使った屋外ARがバンバン出てきそうで楽しみですね~

↓ふつーのひとのツイッター
Twitter:@HNohito

↓RAGのTwitterとかYoutubeとか
Twitter:@redastergardens



いいなと思ったら応援しよう!