AzureSpatialAnchor2.0 と Unity で Hololens、iOS、Android の境界を超えた AR 体験を作る

こちらは AR Advent Calendar 2019 13日目の記事です。

# はじめに
ARKit、ARCore を使ったモバイル端末での AR もさることながら、Hololens、MagicLeap だけでなく、Nreal などメガネ型デバイスも界隈を賑わせているかなと感じています。各デバイスでそれぞれの世界を見ながらも、共通の情報も見るという世界が、すぐ近い未来にきていると思っています。

そこで気が付いたら Azure Spatial Anchor のバージョンが 2.0 に上がっていたので、このサービスとUnityを使い、Hololens、iOS、Android の各端末から、同じ位置に同じオブジェクトを出して表示するという単純なAR体験をやってみようと思います。

# Azure Spatial Anchor 2.0 を使ってみる

* [クイック スタート:Azure Spatial Anchors を使用する iOS アプリを Swift または Objective-C で作成する](https://docs.microsoft.com/ja-jp/azure/spatial-anchors/quickstarts/get-started-unity-hololens)
* [チュートリアル:セッションやデバイス間での Azure Spatial Anchors の共有](https://docs.microsoft.com/ja-jp/azure/spatial-anchors/tutorials/tutorial-share-anchors-across-devices?tabs=VS%2CAndroid)

を参考に、まずは Sample プログラムを動かしてみます。

## 環境
* Azure
  * Spatial Anchors 2.0
  * AppService
* Windows 10
  * Unity 2019.2.15f1
  * Visual Studio Community 2019 Version 16.4.0
* Mac Mojave 10.14.6
  * Xcode 11.1
* 端末
  * Hololens(2ではない) OS Build 10.0.17763.865
  * iPhone X iOS 12.4
  * Pixel XL Android 9.0

## 処理の流れ
こんな感じです。
1. ある端末で、周辺情報を取得
2. ↑ の端末で、オブジェクトを配置
3. ↑ の端末で、Anchor 情報を AppService 経由で Spatial Anchor に保存
4. 他の端末から、3 で保存した情報を取得、復元、そしてオブジェクトを配置

## 実行結果
Hololens から見ている状態を写真にしたものです。①、②、③ それぞれが、Pixel、iPhone、Hololensで配置されているオブジェクトです。
![20191208_175538_HoloLens_kai.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/a736681b-5b53-f51f-9941-4e2dffeed8c7.jpeg)

## 所感
* Android、iOS、Hololens と各端末で共有できるというのは非常に有用なサービスですね。これからはこういうサービスを利用して、端末の壁を越えていくことになると思いました。
* おおむね同じような位置に配置されている気はしますが、ミリ単位と言う精度ではないかなと感じました。割と良い結果のものを撮ったので、センチ単位でずれが発生する感じはしました。こういうものは自ずと精度が上がってくると思うので、大きく気にするところではないと思いながら、今できることも気になるところです。
* デバイスの性能に依存するところが結構ありそうな感じがしました。もう少し新しい機種を利用して、動きのあるオブジェクトをおいかけるみたいなことを今後の課題にやれたら面白いかなと思いました。
* Azure Spatial Anchor が ver2.0 になったことで、GPS、Wifi を利用した位置情報も連携できるようです。こちらもまた今後の課題にしたいところです。
* そして Unity 全部開発できてすごい（語彙力）。ただ各ビルド方法が・・・。

## メモ
参考 URL を見ながら、サンプルプログラムを動かせば大丈夫ですが、情報が古かったりするので、作業時のメモを残します。

### クイック スタート:Azure Spatial Anchors を使用する iOS アプリを Swift または Objective-C で作成する

> Unity 2019.1 以降および Visual Studio 2019 以降がインストールされている Windows コンピューターが必要です。 Visual Studio インストールには、ユニバーサル Windows プラットフォーム開発ワークロードと Windows 10 SDK (10.0.18362.0 以降) コンポーネントが含まれている必要があります。 Git for Windows もインストールする必要があります。

`Windows 10 SDK (10.0.18362.0 以降) コンポーネント` とは、これのことです。
![2019-12-08_13h31_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/a6571fb7-d1bd-9336-c12f-a929dfd95b4a.png)

> アプリで SpatialPerception 機能を有効にする必要があります。 この設定は、 [ビルド設定] > [プレーヤーの設定] > [発行の設定] > [機能] にあります。
アプリで [Virtual Reality Supported](サポートされている仮想現実) を Windows Mixed Reality SDK と共に有効にする必要があります。 この設定は、 [ビルド設定] > [プレーヤーの設定] > [XR Settings](XR 設定) にあります。

すぐにわかるかもしれませんが、 `アプリ` と言うか、Unity です。

> [Project](プロジェクト) ウィンドウで Assets\AzureSpatialAnchors.SDK\Resources に移動します。 [SpatialAnchorConfig] を選択します。 次に、 [Inspector] ウィンドウで、Spatial Anchors Account Key の値として Account Key を、Spatial Anchors Account Id の値として Account ID を入力します。

手順が・・・。
![2019-12-08_12h29_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/fe93f9a1-7ff7-dc74-0167-358ce71fd146.png)

> HoloLens デバイスの電源をオンにしてサインインし、USB ケーブルを使用してデバイスを PC に接続します。
[デバッグ] > [デバッグの開始] を選択して、アプリのデプロイとデバッグを開始します。

休止状態で実行すると、こんな感じのエラーが出ます。かぶって電源入れて再度実行しましょう。
![2019-12-08_13h35_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/d28a3f4f-7535-fc4e-c9fa-613b9ddd1215.png)

### チュートリアル:セッションやデバイス間での Azure Spatial Anchors の共有

> アカウント識別子とキーの構成

場所が間違っているので、以下を参考ください。
![2019-12-08_16h10_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/6975e962-3917-3441-fdad-783add32cf8b.png)