TL;DR
- Azure Spatial Anchors の概要をざっくり把握するための覚書
- 関連する技術、話題の概要
- チュートリアルを突破するためのコツ
目次
Azure Spatial Anchors(ASA) とは
3Dコンテンツを現実空間にマッピングし、その情報をグローバルに保存することができる。また、保存した情報はマルチデバイスで共有することができる。
マッピングは、デバイスのネイティブ トラッキング機能から特徴点を抽出して位置を特定する。
MR/AR では位置合わせが必要になってくるが主な方法は以下の通り。
ASA は3つ目の方法。
HoloLens には元々 Spatial Anchor(Unityでは WorldAnchor と呼ばれる)が存在していた。
これは1台の HoloLens がローカル上で現実世界にマッピングをする機能で、複数のアプリ間で情報の共有ができた。
ASA では Azure にデータを保存することで複数のデバイスで情報を共有することができるようになった。また、それぞれのデバイスは非同期に利用することができる。
保存
アンカーが作成または特定されるときは、デバイス上で環境の画像が処理されて派生形式になります。 この派生形式が転送されて、サービスに格納されます。
透明性を提供するため、環境の画像と派生されたまばらな点の集まりを以下に示します。 点の集まりは、サービスに転送されて格納される環境の幾何学的表現を示します。 まばらな点の集まりの各点について、その点の視覚的特徴のハッシュが送信されて格納されます。 ハッシュは任意のピクセル データから派生されますが、そのピクセル データは含みません。
すべてのデータは、Microsoft によって管理されるデータ暗号化キーを使用して暗号化され、格納されます。また、すべてのデータは、リージョンごとにリソース単位で格納されます。
データ
Azure Spatial Anchors は、複合現実/拡張現実トラッカーに依存しています。 これらのトラッカーはカメラで環境を認識し、空間内を移動するデバイスを 6 自由度 (6DoF) で追跡します。
Azure Spatial Anchors では、HoloLens のネイティブ トラッキング機能が利用されます。
ネイティブ トラッキング機能は、MRTK では Spatial Awareness のあたり。(空間認識の概要)
Azure Spatial Anchors SDK 自体は MRTK がなくてもネイティブ トラッキング機能を扱える。
HoloLens は継続的に環境をスキャンしているので、アンカーを作成、登録する際にカメラが向いている方向の位置でなくてもアンカーは作成できる。
HoloLens の空間認識で利用されているセンサー、カメラはこの辺。
- 深度カメラ
- ヘッドトラッキングカメラ
- IMU
アンカーの登録で保存される情報は以下の通り。
- 空間情報
- アンカーの座標
- 任意の辞書データ
- アンカーの有効期限
- センサー情報のタグ(Coarse Relocalization を利用した場合に自動で付与される)
参考
前述センサー、カメラの補足
- HoloLens リサーチ モード - 複合現実 | Microsoft Docs
- HoloLens RS4のResearch modeを使ってみる(サンプル実行編)
- HoloLens 2のResearch modeでセンサ情報を見てみる
- VR・AR機器のトラッキング その4 – ARゴーグルのトラッキング | GoodyPress
有効期限
アンカーを登録する時にのみ設定ができる。後から更新することはできない。
期限が切れたアンカーは取得も更新もできなくなる。(削除していると思われるが何も見えないので分からず)
必要な場合は再度アンカーを登録しなおさなければならない。
設定しなかった場合は手動で削除しない限り有効期限は切れない。
取得
アンカーを検索する方法は以下の通り。
AnchorID を指定する
AnchorID は登録した時に生成される。ID を一覧で取得したり、ポータルで確認したりできないので、この時点で永続化しておかないと Session を跨いだアンカーの共有ができなくなる。
アンカーにリンクしているアンカーを検索する
同一の Session 内で作成されたアンカー同士はリンクされた状態で保存される。Session をまたぐ場合は既存のアンカーを取得した上で新しいアンカーを登録すると既存のリンクに組み入れられる。
Coarse Relocalization を使用する
デバイスのセンサーの情報から近くのアンカーを検索する機能。
参考
正確さ
照明条件、環境内のオブジェクト、さらにはアンカーが配置されている表面など、アンカーの位置の特定の正確さには多くの要因が影響します。
処理時間
アンカーの作成と検索に必要な時間は、ネットワーク接続、デバイスの処理と負荷、特定の環境など、多くの要因に依存します。
認証と承認
認証と承認 - Azure Spatial Anchors | Microsoft Docs
アカウントキーもしくは AAD 認証が利用できる。
価格
Spatial Anchors の価格 | Microsoft Azure
- アンカー検索リクエスト(ALR)
- 10000 ALR/月 まで無料
- 10001 以上から $0.02/ALR/月
注意点
- 特徴点が変化するような環境では使えない
- 複数デバイスでの同時利用では、アンカーはそれぞれ登録できるがコンテンツをどう関連付けるかの整合性を取る必要がある
- 空間アンカーのグリッドを作成しない
ユーザーが動き回る場合、アプリケーションで空間アンカーを規則的に並べたグリッドを作成し、動的なオブジェクトが動くにつれてアンカーからアンカーに移動させたくなるかもしれません。 ただし、これを行う場合、アプリケーションで管理しなければならないことが増加し、システム自体が内部的に保持しているディープ センサーのデータを活用することもできません。
関連する話題
Way finding
アンカーのリレーションシップとウェイファインディング - Azure Spatial Anchors | Microsoft Docs
アンカーを登録する際にリンクが生成されたアンカー同士は検索することができるので、特定のアンカーを指定して周囲のアンカーを検索することで Way finding に利用できる。
参考
Coarse Relocalization
粗い再局在化 - Azure Spatial Anchors | Microsoft Docs
アンカーの登録にセンサーデータを付与することで、アンカーを取得する時に AnchorID ではなくセンサーデータによって付近のアンカー情報を取得できるようになる。
センサーデータのやり取りは Session の設定をするだけ。細かい操作は SDK が自動でやってくる。登録時はアンカーにタグ情報を追加してくれる。
利用できるセンサーは以下の通り。
センサー | 検索空間半径 |
---|---|
GPS | 20~30m |
Wifi | 50~100m |
BLE Beacon | 70m |
テニスコートよりも広いスペースでアンカーを扱う場合に効果的。
粗い再局在化によって可能になるアンカーの高速ルックアップは、地理的に分散された何百万ものアンカーの世界規模のコレクションに支えられたアプリケーションの開発を簡素化するように設計されています。空間インデックス作成の複雑さはすべて隠されているため、アプリケーション ロジックに集中できます。困難な作業はすべて、Azure Spatial Anchors によって舞台裏で行われます。
World Locking Tools
ワールド ロック ツールと Azure Spatial Anchors の組み合わせ | Microsoft Docs World Locking Tools のドキュメント | Microsoft Docs
仮想世界のグローバル座標空間は、ユーザーが動き回ったり離れた距離を移動したりすると、物理世界の距離関係や位置関係とズレが発生する。ドリフトやスベると言った現象。
それぞれの世界は独立しているため、これをリンクさせるための機能として空間アンカーが存在する。
空間アンカーはデバイスの空間認識によって物理世界の位置を判定し、オブジェクトを物理世界の座標系に固定することができる。これは Unity のグローバル座標空間の原点がどこであっても、物理世界の同じ場所にオブジェクトが配置されるため Unity のグローバル座標空間上では全く異なる座標となる。
空間アンカーは、ある位置が Unity 空間内のどこにあるかを常に再定義するので、ヘッドの座標が補正される。 また各空間アンカーは、物理世界での場所に対して個別にこの調整を行い、アンカー同士の相対位置は考慮されない。ある位置に個別に最適化されている状態。
World Locking Tools は、ユーザーが移動する時に空間アンカーを内部提供し続ける。これにより仮想世界のグローバル座標空間全体を補正するよりも、ヘッドの座標を常に補正することになる。これは仮想世界のグローバル座標空間を物理空間にロックさせることを意味する。
ASA を同時に利用することで、Session と複数のデバイスをまたがって共有可能な物理空間にロックした座標空間が得られる。
参考
- World Locking Tools for Unityの安定した空間をAzure Spatial Anchorsを利用してクロスプラットフォームで共有する - Qiita
- World Locking Tools V1.0.0について~ 機能と導入 ~
チュートリアル
Spatial Anchors のチュートリアル
チュートリアル:新しい HoloLens Unity アプリを作成する - Azure Spatial Anchors | Microsoft Docs
Unity 2020 向けのチュートリアル。 OpenXR Plugin を想定しているので Unity 2019 では動かない。
Spatial Anchors のクイックスタート
クイック スタート:Unity を使用して HoloLens アプリを作成する - Azure Spatial Anchors | Microsoft Docs
現在のバージョンは、Unity 2020.3.12f1。 ヘッドゲイズとエアタップで操作する。
Microsoft Lern のチュートリアル
演習 - Azure Spatial Anchors の概要 - Learn | Microsoft Docs
- バージョンの組み合わせで動かないケースがある
- とりあえず HoloLens で保存して取得する最初の所まで
Unity 2020
- MRTK.Tutorials.AzureSpatialAnchors\Plugins\RestSharp.dll の調整が必要
- AnchorModuleScript.CloudManager_AnchorLocated 内を以下に修正
if (currentCloudAnchor != null) { Debug.Log("Local anchor position successfully set to Azure anchor position"); //gameObject.GetComponent<UnityEngine.XR.WSA.WorldAnchor>().SetNativeSpatialAnchorPtr(currentCloudAnchor.LocalAnchor); Pose anchorPose = Pose.identity; anchorPose = currentCloudAnchor.GetPose(); Debug.Log($"Setting object to anchor pose with position '{anchorPose.position}' and rotation '{anchorPose.rotation}'"); transform.position = anchorPose.position; transform.rotation = anchorPose.rotation; // Create a native anchor at the location of the object in question gameObject.CreateNativeAnchor(); // Notify AnchorFeedbackScript OnCreateLocalAnchor?.Invoke(); }
- Unity 2020.2 から WorldAnchor が廃止されている
- 本来ならば WorldAnchor を直接扱わず、CloudNativeAnchor から操作するやり方に変えるべきだが
Unity 2019
- 記事もライブラリもすでに Unity 2020 向けがメインストリームなので混乱しやすい
- MRTK.Tutorials.AzureSpatialAnchors\Plugins\RestSharp.dll の調整が必要
- Player > XR Settings > Virtual Reality Supported の設定も忘れずに
- 成功した組み合わせ
- Tool
- Unity 2019.4.19f1
- Mixed Reality Feature Tool 1.0.2206.1-Preview
- Package
- ケース1
- ケース2
- Azure Spatial Anchors SDK Core 2.7.2
- Azure Spatial Anchors SDK for Windows 2.7.2
- Mixed Reality Toolkit Examples 2.5.4
- Mixed Reality Toolkit Extensions 2.5.4
- Mixed Reality Toolkit Foundation 2.5.4
- Mixed Reality Toolkit Standard Asset 2.5.4
- Mixed Reality Toolkit Tools 2.5.4
- AR Foundation 4.1.3
- Windows Mixed Reality 4.2.3
- unitypackage
- MRTK.HoloLens2.Unity.Tutorials.Assets.GettingStarted.2.4.0.unitypackage
- MRTK.HoloLens2.Unity.Tutorials.Assets.AzureSpatialAnchors.2.4.0.unitypackage
- Capabilities
- InternetClient
- PrivateNetworkClientServer
- SpatialPerception
- Tool
参考
- Azure Spatial Anchorsでの位置固定をHoloLens,iOS,Androidで眺めるところまで一気通貫
- Unity 向けの Azure Spatial Anchors をインストールする - Azure Spatial Anchors | Microsoft Docs
- package置き場:Releases · microsoft/MixedRealityLearning
参考
- Azure Spatial Anchors V2とHoloLens 2のチュートリアルの解説 - Qiita
- Azure Spatial Anchors V2の新機能 - Coarse Relocalizationの実装と利用 - Qiita
- Azure Spatial Anchorsの調査① | NEXTSCAPE with MR
- Azure Spatial Anchorsの調査② | NEXTSCAPE with MR
- Azure Spatial Anchorsの調査③ | NEXTSCAPE with MR
- Azure Spatial Anchors のすぐビルドできるプロジェクト - つくるの大好き。
- よく寄せられる質問 - Azure Spatial Anchors | Microsoft Docs
- 効果的なアンカー エクスペリエンスのためのガイドライン - Azure Spatial Anchors | Microsoft Docs
- 空間アンカー - Mixed Reality | Microsoft Docs
- Unity でアンカーを作成および配置する - Azure Spatial Anchors | Microsoft Docs
- Unity での粗い再局在化 - Azure Spatial Anchors | Microsoft Docs
メモ書き
- Anchorの作成方法が2パターンある
- GameObject.CreateNativeAnchor() は古い方
- CloudNativeAnchor.NativeToCloud() は新しい方
- Getting started with Azure Spatial Anchors: CreateAzureAnchor() crash or taking a long time to load - Microsoft Q&A
- チュートリアルのマルチデバイス共有