また位置ネタです。
今回は、WorldAnchorからHoloLensカメラの相対位置を計算して緯度経度をとってみるといったプチネタになります。
屋内測位というのはIMES、wifi測位など様々な方法がとられていますが一般的にあまりいい精度ではありません。
そこでHoloLensの環境認識能力、自律航法に頼って座標をとってみようという試みです。
載せても大丈夫そうなギリギリの範囲でキャプチャした #HoloLensJP pic.twitter.com/OZDlrzIeWS
— デコ・シ (@Ash_Yin) 2017年9月23日
こちらは東京ゲームショーでの実験。
これだけ人の多い環境で、広範囲を歩き回っても大きなずれもなくUnity空間内を歩き回れているのがマップでもわかります。
まず、相対座標をとるための基準点を設置します。
設置には、空間に位置を固定できるWorldAnchorを利用してみます。
WorldAnchorについて詳しくはこちら。
littlewing.hatenablog.com
blog.d-yama7.com
今回は実装を簡単に済ませたかったので、WorldAnchorManagerとTapToPlaceを使っています。
TapToPlaceにはAnchorをアタッチする機能が組み込まれているため、これで空間内にずれないオブジェクトを簡単に設置することができます。
分かりやすいように座標を表示
次に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; }
結果
位置ネタ。
— デコ・シ (@Ash_Yin) 2017年12月22日
Anchorにマニュアルで位置座標をもたせて、そこからの相対距離を緯度経度に変換して現在の緯度経度を取得してみる。屋内環境でGPSとれないときでもAnchorを置きまくっておけば現在地を取得可能。Anchor置くのはVuforiaと組み合わせておけば、もっと楽になるかも。#HoloLensJP pic.twitter.com/ZsZhUQg6pg
今回やってみて、環境認識を使った位置測位というのに色々可能性を感じたというのが所感です。
駅構内にはポスターや看板など自然にマーカーに使えそうなオブジェクトが多いため、HoloLensに限らずスマホでのナビゲーションにも使えそうですね。