先日、Mobile World Congress (MWC)でMicrosoftよりいくつかの新発表がありました。
体験でわかった「HoloLens 2」。視野拡大と“両手で操作”が快適 - AV Watch
Introducing Azure’s augmented reality: spatial anchors | InfoWorld
発表の1つに、Azure Spatial Anchorsという仕組みがあります。これは異なるOSのデバイスでARを共有する仕組みです。ただ、セットアップだけでもそれなりに手間がかかるので、ひとまずまとめてみました。なお、以下の環境で確認しています。
クラウド(バージョン表記不明のため記載せず )
Azure Spatial Anchors
Azure Cosmos DB
ハードウェア
Android9.1搭載スマートフォン
iOS 12.1.4搭載のiPhone、iPad
ソフトウェア、ライブラリ
Android Studio 3.3.1
XCode 10.1
Visual Studio 2017 (Azureで動かすAppServiceのビルドのため)
.NET Core SDK 2.2.104
Azure Apatial Anchors Sample code(v1.0.1)
2019/5/4 追記
Azure Spatial Anchorにかかるコスト調査結果を追記しました。
Azure Spatial Anchorsにかかるコストについて - CrossRoad
- 1. Azure Spatial Anchorsとは?
- 2. チュートリアルページのどこを読めば良いか?
- 3. QuickStartをベースにした環境構築
- 4. 動作確認
- 5. トラブルシューティング
- 6. おわりに
1. Azure Spatial Anchorsとは?
異なるOSのデバイス間でAR情報を共有する仕組みです。
引用元:Azure Spatial Anchors overview - Azure Spatial Anchors | Microsoft Docs
イラストのように、HoloLensだけでなく、スマートフォン、タブレットも対応しています。また、Windowsに限定しません。以前紹介したGoogleによるCloud Anchorsと考え方は同じです。
【ARCore1.2.0版】iPhoneとAndroidスマートフォンでCloud Anchorの環境構築をしてみました - CrossRoad
つまり、HoloLens、iOS・Androidデバイスがそれぞれ空間内の特徴点を取得し、その特徴点をクラウド側が解析、共有するというものです。
2. チュートリアルページのどこを読めば良いか?
Spatial Anchors Documentationというページをみると、このような構成になっています。
Quick StartとTutorialには、Azureの初期設定と各OSのサンプルコードビルドの方法が書いてあります。どちらもほほ同じが書いてありますが、QuickStartには、Azureをサーバとして設定する方法が書いてません。
そのため、試すにはTutorialというページをみるのがよいことになります。しかし、Tutorialページに書かれているUnityを使った方法では、iOS、Androidともにアプリの挙動がおかしくて検証できませんでした。 QuickStartには、Azureのサーバとして使う設定手順が書いてありませんが、ソースコードを読んで該当しそうな所に入れたら動きました。
ということで、Quick Startをベースにやり方を解説します。
3. QuickStartをベースにした環境構築
3.1 Azure
3.1.1 Azure Portalとは?
Azure Portalから設定をしていきます。Azure Portalは、Microsoft Azure(クラウドストレージだけでなく、データベース、Webサーバ的なことができます)を使うための設定・管理にデベロッパーごとに用意されたWebサイトです。
Azure Portalはsubscription契約が必要です。アカウント作成や、一定時間までの利用は無料ですが、それを超えた場合や利用データ量によってお金がかかることがあります。
Azure の無料アカウントを今すぐ作成しましょう | Microsoft Azure
私はMVP特典で利用しているので通常時の金額が把握できていません。もし不安な方は別途確認することをお勧めします。
3.1.2 Spatial Anchors resourceの生成
下記のページに書いてある「Create a Spatial Anchors resource」の手順通りに進めます。
Tutorial: Share anchors with Azure Cosmos DB - Azure Spatial Anchors | Microsoft Docs
ここは特に難しいことはないので説明は省略します。
なお、Azure Spatial AnchorsのDocumentationには、Spatial Anchors resourceの説明が複数箇所で書かれています。どこを見てもよいですが、このページには、この後サーバ設定まで書いてあるので、ここを参照するのが効率的です。
3.1.3 Sharing Anchors Serviceのデプロイ
上記で設定したAnchor ServiceをWebサービスとして使えるようにします。
Tutorial: Share anchors across sessions and devices - Azure Spatial Anchors | Microsoft Docs
同じページの「Deploy your Sharing Anchors Service」の手順通りに進めます。 ここではAzure Portalではなく、Visual Studio2017だけですすめます。事前にいくつかインストールが必要です。
(1) .NET Core SDK 2.2.104
ここからダウンロード、画面の指示に沿ってインストールします。
Download .NET (Linux, macOS, and Windows)
(2) Visual Studio 2017の追加コンポーネント
設定 / アプリと機能 / Visual Studio Installer を開いて、「変更」を選択します。追加コンポーネントをインストールできる画面が出るので「個別コンポーネント」を選択して、「ASP.NET and web development」をインストールします。
ここまで終わったら、Githubからサンプルプロジェクト一式(HoloLens、iOS、Androidのプロジェクトも一緒に入ってます)をダウンロードします。
GitHub - Azure/azure-spatial-anchors-samples: Azure Spatial Anchors sample code
Visual Studio2017で「SharingService.sln」を開いて、AppServiceをpublish(発行)します。「発行」のウインドウを出す手順は下記の1,2,を参照ください。
「発行」をクリックして進めていくと、AppServiceを作る画面が出てきます。
数分かかりますが、手順通りに進めるとURLが割り当てられ、自分のブラウザでこのような画面が起動します。
引用元:Tutorial: Share anchors across sessions and devices - Azure Spatial Anchors | Microsoft Docs
割り当てられたURLはこのようになります。
html https://<app_name>.azurewebsites.net
3.2 Android
gitで下記のURLをクローンするか、このページにブラウザからアクセスして、Zipでダウンロードします。
$ git clone https://github.com/Azure/azure-spatial-anchors-samples.git
ここではzip取得した場合で説明します。Android Studioを開き、取得したフォルダの"azure-spatial-anchors-samples / Android "を開きます。
Android Studioで開くと、いくつか警告が出ることがあります。この場合、基本的にYesで大丈夫です。
Unable to get Gradle wrapper properties from のエラーが出た場合
Android Gradle Plugin Update Recommendedが出た場合
また、Android Studioでは、Gradleによって自動ビルドのような動きをします。初回はGradleが完了するまで5分程度かかりました。
Androidの実機にデプロイする前に、いくつかコードを修正します。まず、AzureSpatialAnchorsActivity.javaを開いて、下記の2箇所にAzure PortalのAzure Spatial Anchorsで作ったIDとKeyをいれます。
// Set this string to the account ID provided for the Azure Spatial Service resource. private static final String SpatialAnchorsAccountId = "set me"; // ここにID文字列を入れる // Set this string to the account key provided for the Azure Spatial Service resource. private static final String SpatialAnchorsAccountKey = "set me"; // ここにKey文字列を入れる
続けて、Shared.javaを開いて、下記にAzurePortalにデプロイされたAppServiceのURLをいれます。
// Set this string to the URL created when publishing your Shared anchor service in the Sharing sample. private static final String SharingAnchorsServiceUrl = "https://<myname>.azurewebsites.net/api/anchors";
これができたら、AndroidスマートフォンとPCをUSBケーブルで接続して、アプリを実機にデプロイします。ここの"Deploy the app to your Android device"に書いてある通り、Android Studioの上側のバーに再生ボタンのようなアイコンがあるので、これを選択すると、接続されているデバイスが表示されるのでOKを押せばデプロイできます。
3.3 iOS
Androidのときと同様にgithubに公開されているリポジトリを入手します。
$ git clone https://github.com/Azure/azure-spatial-anchors-samples.git
iOSというフォルダを選択します。Objective-CとSwiftの2種類がありますが、どちらでも変更箇所は同様です。ここではSwiftで説明します。
Android Studioのときと異なり、XCodeを起動する前に、podというフレームワークをインストールする必要があります。
$ cd ./iOS/Swift/ $ pod install --repo-update
pod : command is not foundが出た場合、まずはpodをインストールします。
$ sudo gem install cocoapods
環境によりますが、私の場合は5分程度かかりました。これが完了したらbash $ pod install --repo-update
が使えます。初回は50分ほどかかりましたが、2回目以降(SwiftではなくObjective-Cプロジェクトを開くときなど)は1分もかかりませんでした。
XCodeのプロジェクトの開き方も少し変わっていて、同じディレクトリの中でbash open ./SampleSwift.xcworkspace
を実行するか、SampleSwift.xcworkspaceをダブルクリックして開きます。
ViewController.swiftの下記の2箇所に、Azure PortalのAzure Spatial Anchorsで作ったIDとKeyをいれます。
// Set this to the account ID provided for the Azure Spatial Service resource. let SpatialAnchorsAccountId = "Set me" //ここにIDを入れる // Set this to the account key provided for the Azure Spatial Service resource. let SpatialAnchorsAccountKey = "Set me" //ここにkeyを入れる
Objective-Cの場合、ViewController.mの下記の2箇所についてIDとKeyをいれます。
// Set this to the account ID provided for the Azure Spatial Service resource. NSString *const SpatialAnchorsAccountId = @"Set me"; //ここにIDを入れる // Set this to the account key provided for the Azure Spatial Service resource. NSString *const SpatialAnchorsAccountKey = @"Set me"; //ここにKeyを入れる
XCodeからデプロイすると、iOSアプリが起動します。ここではAndroidのときのようなShared.java相当が見つからず、自分のAppServiceのURLをいれてないのですが、なぜかAzure PortalではiOSアプリ上でアンカーを作るたびにログが増えていました。
4. 動作確認
iOSとAndroidで起動しましたが、それぞれ挙動が異なっていました。色々試しているうちに、このような違いがあることがわかりました。
4.1 iOS
Start Nearby DemoとStart Basic Demoの2種類を選ぶことができますが、なぜかどちらも動きは同じでした。はじめに周辺のスキャンをするようメッセージが出ます。
進捗が100%を越えると、アンカーを設置し、見つけることができるようになります。画面の変化は下記の通りです。
ただし、Android側で設置したAnchorを見つけることはできず、あくまで自分自身で設置したAnchorを見つけるだけでした。
4.2 Android
Local Only DemosはiOSと同様です。Shared Demoを試したいのですが、iOSでは対応していないので、別のAndroid端末かHoloLensが必要になりそうです。
5. トラブルシューティング
5.1 テンプレートのデプロイメントが失敗しました。"Cannot find serverFarm with name " というエラーが出てデプロイができない
同じResourceGroupの中で、AppService、Azure Anchors、(もし使っている場合はCosmosDBも)を作っていないことが原因です。チュートリアル通りに進めるとこのようなことは発生しづらいですが、検討中にAzureAnchorだけ別の名前で作りなおそう、のようなことをしていると発生します。
5.2 iOSアプリを起動すると、Set SpatialAnchorsAccountId and SpatialAnchorsAccountKey in ViewController.swift というメッセージが表示される
下記のどちらかのSet meに、IDとKeyの正しい文字列を入れると発生します。"Set me"と書いているのに、なぜこういう分岐が書かれているかはわかりませんが、ここに書くとその先の処理が進まなくなります。ここは何もいれなければ回避できます。
if (SpatialAnchorsAccountId == "Set me" || SpatialAnchorsAccountKey == "Set me") { _button!.isHidden = true _nearbyChoice!.isHidden = true _errorControl!.isHidden = false showLogMessage(text: "Set SpatialAnchorsAccountId and SpatialAnchorsAccountKey in ViewController.swift", here: _errorControl) }
6. おわりに
XcodeとAndroid Studioだけで作ると、iOSとAndroidアプリの挙動が異なっており、このままでは共有できるかは不明なままです。HoloLensを追加するか、別のAndroid端末を手に入れることができたら、また検証したいと思います。