デコシノニッキ

ホロレンジャーの戦いの記録

WorldAnchorから位置座標を計算してみる

また位置ネタです。
今回は、WorldAnchorからHoloLensカメラの相対位置を計算して緯度経度をとってみるといったプチネタになります。

f:id:haikage1755:20171222220900p:plain:w300

屋内測位というのはIMES、wifi測位など様々な方法がとられていますが一般的にあまりいい精度ではありません。
そこでHoloLensの環境認識能力、自律航法に頼って座標をとってみようという試みです。

こちらは東京ゲームショーでの実験。
これだけ人の多い環境で、広範囲を歩き回っても大きなずれもなくUnity空間内を歩き回れているのがマップでもわかります。


まず、相対座標をとるための基準点を設置します。
設置には、空間に位置を固定できるWorldAnchorを利用してみます。

WorldAnchorについて詳しくはこちら。
littlewing.hatenablog.com
blog.d-yama7.com

今回は実装を簡単に済ませたかったので、WorldAnchorManagerとTapToPlaceを使っています。
TapToPlaceにはAnchorをアタッチする機能が組み込まれているため、これで空間内にずれないオブジェクトを簡単に設置することができます。

f:id:haikage1755:20171222215231p:plain:w250
分かりやすいように座標を表示

次にAnchorからのカメラの相対位置、Anchorに設定された緯度経度からカメラの緯度経度を算出します。
参考(緯度経度1度の距離 - モノノフ日記)

    /// <param name="diffVec">Anchorからカメラの相対位置</param>
    /// <param name="srcLat">Anchorに設定された緯度</param>
    /// <param name="srcLng">Anchorに設定された経度</param>
    /// <param name="lat">出力用緯度</param>
    /// <param name="lng">出力用経度</param>
public static void ConvertToGPS(Vector2 diffVec, double srcLat, double srcLng, out double lat, out double lng) {
        lat =  diffVec.y / 30.9064676d * 0.00027778d  + srcLat;
        lng = diffVec.x / 25.3219892d    * 0.0002777778d + srcLng; 
    }

結果


今回やってみて、環境認識を使った位置測位というのに色々可能性を感じたというのが所感です。
駅構内にはポスターや看板など自然にマーカーに使えそうなオブジェクトが多いため、HoloLensに限らずスマホでのナビゲーションにも使えそうですね。

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」