デコシノニッキ

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

WorldLockingToolsについて

World Lock Tools とは?

端的にいうと、トラッキングで発生する移動距離の誤差を修正してくれるやつです。

スケール問題

World Lock Tools に触れる前に、HoloLensで起こるスケール問題について整理します。(※ドキュメントでは、バーチャル空間やUnity空間と表現揺れがあるのでここではUnity空間で統一します。)

現実にもUnity空間にも原点から正面の位置に、Cubeがあるとします。これらは、HoloLensから見たときピッタリ同じ位置にあります。

f:id:haikage1755:20200223181219p:plain:w450

この状態で、10m歩いて見ます。

f:id:haikage1755:20200223181547p:plain:w450

移動中は精度が落ちるため、現実では10m歩いてもデバイス側は9m歩いたと認識します。
さらにこの状態から、元の位置まで歩いて見ます。トラッキング精度のため今度はデバイスは10.5m歩いたと認識します。

f:id:haikage1755:20200223182139p:plain:w450

さて、この時2つの空間を頭を中心に合わせてみましょう。

f:id:haikage1755:20200223182542p:plain:w450

トータル1.5mの誤差です。これがスケール問題と言われる現象で、センサーの精度やドリフトによって発生します。ハードウェア仕様では、±10%の距離誤差らしいです。(初耳)

World Anchor

このスケール問題に対する1つの解が World Anchor と呼ばれる仕組みです。HoloLensが認識した特徴点をもとに、場所を記憶するものです。
例えば先ほどのCubeに、特徴点をもとにアンカーを打ち込みます。

f:id:haikage1755:20200223183754p:plain:w450

その後、先ほどと同じように行って帰ってきます。
HoloLensのカメラは先ほどと、同じ場所を見て特徴を認識します。するとアンカーは、頭は元の位置に戻っているのに自分の場所がずれていることを認識して、自分の位置を補正する動きをします。

f:id:haikage1755:20200223184445p:plain:w450

f:id:haikage1755:20200223184621p:plain:w450

これで、元の位置に戻ってもUnityと現実のCubeはどちらもピッタリ合うようになりました!めでたしめでたし。

WorldAnchorが抱える問題

WorldAnchorによってスケール問題は解決したかに見えますが、WorldAnchorには問題があります。WorldAnchorは、各特徴点群に対して独立して動作するということとUnity座標を個別に現実に合わせに行くというところです。
先ほどのWorldAnchorに加え、もう1つWorldAnchorを追加します。

f:id:haikage1755:20200224011538p:plain:w450

特徴点AとアンカーA、特徴点BとアンカーBはそれぞれ対応しているとします。ここで、先ほどのシナリオと同じように行って帰ってきます。

f:id:haikage1755:20200224011658p:plain:w450

この時、特徴点Aを見ることでアンカーAが補正されます。しかし、アンカーBに対してはこの補正が効きません。

f:id:haikage1755:20200224012305p:plain:w450

部分的には、整合性が取れていますがその他の場所についてはこの補正が効きません。となると、Unity空間上の座標も想定したものと違うものになるわけです。これがWorldAnchorの抱える問題です。

World Locking Tools

World Anchor では、個別に頭の座標を正として各々の座標を修正する処理を行っていました。それに対して、World Looking Tools では、頭の座標系を修正します。 頭の座標系が間違っているなら、それを補正すればいいんじゃない!というアプローチです。

World Locking Toolsでは以下の3つの空間の概念を扱います。

  • Sponge Space
  • World Lock Space
  • Frozen Space

Sponge Space と World Lock Space

Sponge Space

World Locking Toolsの中には最適化エンジンがあり、ヘッドトラッキング情報とアクティブな空間アンカーのグラフを入力として受け取ります。 スポンジという名前の通り常に流動的に動くようで、センサーデータの入力値が状態を更新するにつれて、空間アンカーはスポンジ状の座標空間内で、互いの動きに応じて動きます。

f:id:haikage1755:20200224164156p:plain:w250

World Lock Space

World Locking Tools は、このスポンジ状態の空間を現実世界と最適に整合させる安定した空間を計算します。この安定した空間を World Lock Space と呼びます。 Sponge Space から World Lock Space への変換は、新しいセンサー値が処理されると毎フレーム行われます。

これら2つのスペースの違いは、Sponge Space 内では、入ってくるセンサー値が、頭や空間アンカーを自由に移動しますが、World Lock Space はそのような動きを最小限に抑えられる点です。

f:id:haikage1755:20200224164224p:plain:w450
(こういう解釈であっているのか誰かツッコミ欲しい)

これによって、 World Lock Space に配置されたシーンオブジェクトを、個々の空間アンカーにアタッチせずに現実世界に固定されたように表示できます。

イメージがつきづらいと思うので、実際にUnityのシーンを見ながら整理したいと思います。

Unityのサンプルから理解する

World Locking Basic

最小構成のこのサンプルから入るのがいいでしょう。

f:id:haikage1755:20200224205421p:plain:w450
f:id:haikage1755:20200224205614p:plain:w450

いくつかコンポーネントがありますが、大事なのはAdjustmentの階層とWorldLockingです。CameraがさらにAdjustmentの中にいることに注目です。Cameraは直接動かすことはできないので、更に親の概念によってオフセットや回転を調整するためのAdjustmentが設けられています。

f:id:haikage1755:20200225094814p:plain:w350
World Locking Context から参照されているAdjustment

World Locking Context は、設定のためのユーザーインターフェースとして存在しているだけで、その設定を行っている先のWorldLockingManagerというシングルトンクラスが本体です。

この変換は、シーングラフ内のカメラの親のローカル変換を調整することで、各フレームのシーンに適用されます。カメラは、元のスポンジスペースを定義するため、この「スポンジスペースからワールドロックスペース」への変換を、カメラのヒエラルキーに挿入すると、シーンのルート空間がワールドロックスペースになります。

スペースピン

Unity空間を現実空間に合わせる

World Lock Tool は、位置と回転の変換をかけて空間を作りますが、複数のターゲットに対して整合性をとるように空間を作ろうとすると無数のパターンが生じてしまいます。これに制約を与える機能がSpace Pin (スペースピン)です。スペースピンの近くにいるとき、World Locked 空間にいるスペースピンはUnity空間にあるスペースピンと同じポーズをとるという制約です。

例えば、(0, 0, 1) のグローバル座標でモデル化されたUnityシーンのキューブを考えてみます。シーンがHoloLensに読み込まれると、立方体は最初の頭のポーズの1メートル前に表示されます。最初の頭のポーズに応じて、それは物理的な部屋のどこかにあります。

スペースピンを使用すると、そのキューブを例えば、特定の机の隅といった部屋の現実の特徴にロックできます。 WorldAnchorでキューブをロックするのとは異なり、スペースピンは、キューブが机の角に揃うようにUnityスペース全体を移動します。つまり、個々ではなく全体で動くので他のオブジェクトとの位置や姿勢の関係性はキープされます。

図示すると f:id:haikage1755:20200426233307p:plain
World Anchor を Aだけに与えた場合、補正が行われるのはAのみでBは補正が行われません。 一方スペースピンを"正"の位置に置いた場合、Aが正しい位置に合うように動くのに合わせてBも同じ距離、回転だけ移動します。

スケール問題に対処する

単一のスペースピンでは、Unity座標と実世界との関係の不確定性を取り除きますが、スケール問題には対処しません。

つまり、原点を物理的な世界の位置と方向に合わせて移動した場合でも、実際の世界を10メートル歩いても、仮想空間では9メートルしか移動できない可能性があります。

このため、複数のスペースピンによってこの問題の解決にあたります。 特定のスペースピンの近くにある場合、ワールドはそのスペースピンに従って整列されます。他のスペースピンはずれてしまいますが、遠くにあるためユーザーからは認識できないので許容可能であるとみなします。

ユーザーがスペースピン間を移動すると、スムーズな補間により、空間内の任意のポイントでスケールエラーが最小化されます。基準点として十分な密度のスペースピンを使用することで、実世界とUnity空間の不整合がヘッドトラッキングエラーのオーダーまで減少します。

スペースピンの必要な密度は、環境がサポートするトラッキング品質とアプリケーションの精度要件の両方に依存します。 十分な照明とトラッキング可能な可視機能を備えたオフィス環境では、スペースピン間の間隔が10メートルであれば、10メートルを超える10-20 cmの蓄積によるエラーがミリメートルエラー(最大エラーlt 0.5cm、エンドポイント)まで低下するそうです。

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