HoloLens 2 Emulatorのコマンドライン起動とMixed Reality Toolkit V2 RC1のサンプルを動かす

# HoloLens 2 の実機はまだですが
は公開されているので早速セットアップの起動方法とアプリケーションのデプロイについて調べてみました。
せっかくなのでHoloLens 2の機能が試せるサンプルとしてMixed Reality Toolkit V2 RC1をデプロイして実行するところまで試してみました。

## 開発環境

今回デプロイに使用した環境は以下の通りです。

* Windows 10 Pro (OSビルド：1809)
* Visual Studio 2017 (15.9.11)
* Windows SDK 10.0.18362.0
* Unity 2018.3.9f1
* Mixed Reality Toolkit V2 RC1(2.0.0.0-RC1)

なおハードはこちら(実は重要だったということが判明)
* モバイル機
    * surface pro 6
* カスタム機
    * shuttle XH110G
    * Core i5 - 7600T
    * memory 16GB
    * RTX 2060  
    * SSD ,HDD...

エミュレータについてはHyper-Vの機能を利用しているためWindows 10 Proが必要となります。
また、エミュレータ自体そこそこリソース使うのでホスト自体のスペックもそこそこいると思います。

## セットアップについて

セットアップについては以下のサイトを記載されていますが、まだHoloLens 2に関する詳細はありません。徐々に公開されているような状況なのでしばらく見守っていきましょう。
今回は、ここの手順にあるインストーラ使ってセットアップを行います。

[Installing the HoloLens emulator](https://docs.microsoft.com/en-us/windows/mixed-reality/using-the-hololens-emulator?WT.mc_id=AI-MVP-123445
)

セットアップは以前と同様インストーラでセットアップするだけです。
サイトを開いて以下の「HoloLens 2 emulator and holographic project templates.」のリンクを開くとダウンロードダイアログが表示されるので保存して実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/b95a1d48-a96e-0e61-535c-40da47ba1f55.png)

## 実行方法

実行方法はVisual Studio からの実行または、コマンドラインから行います。

### Visual Studioからの起動
Visual Studio 2017を起動しHoloLens 2にデプロイするUWPアプリケーションのソリューションを開きます。その後アーキテクチャを「x86」「x64」いずれかにして実行先を「HoloeLsn 2 emulator 10.0.18362.1005」を選択して実行するとエミュレータが起動します。

### コマンドラインからの起動
いちいちVisual Studioから起動しないといけないのも面倒なのでコマンドラインから起動する方法も調べました。基本的には依然調べていたHoloLens "1st" emulatorと同じ方法で利用できます（参考:[HololensでSharingするアプリケーションをスタンドアロンで検証する（エミュレータのみ版）](https://qiita.com/miyaura/items/720c16fd93aa9a521073)）。

コマンドの実行方法としては「新規でVMを作成しエミュレータを起動」、「既存のVMを使ってエミュレータを起動」の２つです。基本的には一度新規で作成し、二度目以降は作成済みのを使うといいと思います。

```shell:新規でVMを作成しエミュレータを起動
"C:\Program Files (x86)\Windows Kits\10\Microsoft XDE\10.0.18362.0\xde.exe" /name "Hololens2-1" /createDiffDisk "c:\Emulator\Hololens2_1\Hololens2_1.vhdx" /vhd "C:\Program Files (x86)\Windows Kits\10\Emulation\HoloLens\10.0.18362.1005\flash.vhdx" /video 1968x1280 /memsize 4096 /sku HDE
```

```shell:既存のVMを使ってエミュレータを起動
"C:\Program Files (x86)\Windows Kits\10\Microsoft XDE\10.0.18362.0\xde.exe" /name "Hololens2-1" /video 1968x1280 /memsize 4096 /sku HDE
```

コマンド内のパラメータの一部は以下の通りです。

| 引数 | 説明 |
|:-:|:--|
| /name  | VM名。Hyper-Vの仮想マシン名  |
| /vhd | VMのベースイメージ。エミュレータはこのイメージの差分として構築される。後述の/createDiffDiskとセットで設定。  |
| /createDiffDisk | VMの差分イメージファイル。アプリケーションのインストールなどユーザの変更した情報は/VHDで設定したイメージの差分としてこのオプションで指定したVHDに保存される。  |
|/videos|画面の解像度。Hololens 2の場合は1968x1280で設定。|
|/memsize|VMのメモリサイズ。Visual Studioから起動するHololens Emulatorは4GB???。今回は4GBで起動。|
|/sku|エミュレータの種別。HololensはHDE固定。なお、Windows Phoneの場合はWP8を指定。|
|/noGPU|任意設定。仮想GPUを使用しない場合に指定（理由は後述）|

### 起動時のメッセージ

エミュレータを起動すると以下のようなダイアログが表示される場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/8ece1c44-08fb-3216-db22-d416dfae290f.png)

VHDをマウントするために管理者権限が必要なことを指摘する内容なのでRetryを押下して実行します。しばらくするとHoloLens 2 Emulatorがメニューを開いた状態で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f70bbdd9-a525-9f31-f6dd-a4ff29170980.png)


### <font color="red">ハードスペックによって3Dアプリが動作しない場合があります。</font>

実は色々調べていたところSurface pro6の場合3Dアプリをデプロイ後実行するとエミュレータが再起動するという事態に。
自作のデスクトップの場合グラボの有無関係なく正常に動作していました。
~~今回ハードスペックを書いているのはそのためです。色々調べた結果、surface pro6のGPUが影響している？可能性があることはわかりました（が自分の端末のみの症状なのかは不明）。全く同じソフトウェア構成にしてもSurface pro 6では正しく動作しなかったです。~~

最近エミュレータのサイトが更新されて原因がわかりました。

https://docs.microsoft.com/en-us/windows/mixed-reality/using-the-hololens-emulator?WT.mc_id=AI-MVP-123445#installing-the-hololens-emulator


GPUのスペックを確認するとHoloLens 2 Emulatorの場合はWDDM2.5以降のグラフィックドライバのサポートが必要になります。

* GPU requirements 
   * DirectX 11.0 or later
   * WDDM 1.2 graphics driver or later (1st Gen)
   * <font color="red">WDDM 2.5 graphics driver (HoloLens 2 Emulator)</font>
   * The emulator might work with an unsupported GPU, but will be significantly slower

surface pro6のグラフィックドライバを確認すると「24.20.100.6195」でした。バージョン24は「Windows® 10 April 2018 Update - WDDM 2.4」に対応しているとこのことで要件を満たしていないんですね。。。

https://www.intel.co.jp/content/www/jp/ja/support/articles/000005654/graphics-drivers.html

一応最新のグラフィックドライバーなら問題なさそうなのですが、Surface pro6 的には当てられないのでしばらく様子見ですね。

https://downloadcenter.intel.com/product/96551/Intel-HD-Graphics-620

解決方法としてはVirtual GPU Settingsをオフにすれば一応動作します（激重ですが）。この設定を無効化するには、コマンドラインで「/noGPU」オプションをつけて起動するか、ToolsのOptional Settingsにある、「Use Desktop accelarated graphics」のチェックを外して適用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/f2193eb5-34f0-6052-3e18-8f7d0468b7c3.png)

Virtual GPUが動作しているかは「Tools」-「Diagnostics」の中にある「Virtual GPU Status」で確認可能です。以下の場合は上記のチェックを外して無効化している状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/48bef593-acb3-7dba-1be3-2c1afedad359.png)


## エミュレータへのデプロイ

エミュレータへのデプロイについては「X86」「X64」のいずれかでデプロイします。「HoloLens 2」ってARMじゃない？って話なのですが、これはエミュレータがHyper-Vをベースとしたもので、ハードウェアをARMでエミュレートしているわけではないということからきています。

### Mixed Reality ToolKit V2 RC1のサンプルを動かす

HoloLens 2に対応した機能がMixed Reality Toolkit V2 には既に入っているのでせっかくなのでこれを動かしてみましょう。
ということで、必要なパッケージを以下のサイトからダウンロードします。

https://github.com/Microsoft/MixedRealityToolkit-Unity/releases/tag/v2.0.0-RC1

* Microsoft.MixedReality.Toolkit.Unity.Examples-v2.0.0-RC1  
MRTKの各種サンプル/デモシーンが入ったパッケージ
* Microsoft.MixedReality.Toolkit.Unity.Foundation-v2.0.0-RC1  
MRTKのメイン機能が入ったパッケージ

通常はFoundationだけ導入して実行する形になります。Unityを起動して新しいプロジェクトを作成し、上記2つのパッケージをインポートします。今回はサンプルとして用意されている「HandTracking」用のシーンを使ってビルドします。シーンは「Assets\MixedRealityToolkit.Examples\Demos\HandTracking\Scenes」の中にある「HandInteractionExamples.unity」を[build settings]-[Scenes In Build]にドラッグ&ドロップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/229866ce-6d1c-0e9e-4924-46611572900c.png)

あとは、ターゲットのSDKを最新の「10.0.18362.0」に変更し、[Scripting Backend]が[IL2CPP]になっていることを確認してUWPのソリューションを出力します。
Visual Studioで出力したソリューションファイルを開き、UWPプロジェクトの[プロパティ]を確認すると以下のようにプラットフォームバージョンが[10.0.18362.0]になっていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/67841305-8169-9b03-5fe4-92160cc724f2.png)

問題がなければ、UWPプロジェクトを選択してメニューから[ストア]-[アプリ パッケージの作成]を選択しします。
アプリケーションの配布方法はサイドローディングにして[次へ]を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c127a2ae-efbc-224e-c638-12775dc84241.png)

[パッケージの選択と構成]でパッケージに含めるアーキテクチャを選択します。HoloLens 2はArmベースなので[Arm][Arm64]のいずれかを選択することになりますが、エミュレータの場合はエミュレータが動く端末のアーキテクチャに合わせます。また、HoloLens(1st Gen)にデプロイしたい場合は[X86]用も用意します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/9abc72d6-36a8-afff-6726-f6495944003c.png)

パッケージが完成したら手順に従い「HoloLens 2 emulator」を起動し、デバイスポータルを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/8cff11a0-9f67-c435-189a-d246b3b2ef70.png)

[Views]-[App]を選択し、アプリのデプロイ画面を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/c50a76bf-ffce-6ffd-0efb-f836f5a90e68.png)

まずは参照を押してファイル選択ダイアログを表示します。[appbundle]または[msix]のファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/1e267e86-727e-d3cc-20a4-0248285a8a10.png)

[Allow me to select framework packages]にチェックを入れて[Next]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e85da861-f734-7389-a75d-fa94fe7b99eb.png)

[Choose any necessary dependencies]が表示されたら[参照]をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/449c9a05-f103-eef9-cdd9-668a086d8f98.png)

[Dependencies]フォルダ内の該当するアーキテクチャーのappxを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/6095728a-cdb9-a535-877a-2a01c490bd07.png)

[インストール]をクリックするをデプロイが開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/e5a77564-2f4e-888d-c788-46ef99026146.png)

正常に完了すると以下のように[Package Successfully Registered]と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/01e26ec4-ae04-42c1-a5be-9dde3004d971.png)

エミュレータからアプリケーションを起動すると以下のようにエミュレータ上でアプリが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152548/89247a47-5a55-8ba7-c182-0b2cfcce9ac3.png)

実際のHoloLens 2で動作させると以下のような感じになります。

https://youtu.be/wogJv5v9x-s

## 注意が必要になると思われること。

現状HoloLens 2向けのアプリケーションを作成することは可能です。エミュレータもあり、MRTK V2もRC1とはいえあるので実機にデプロイする直前までは準備できます。ただし、いくつか注意が必要な問題があると思います。  
  
それは「HoloLens 2はArmベース」ということです。UWPのアプリケーションはArm用も出力できるのですが、使用するライブラリによってArmに対応していないライブラリを使用している場合かなり厄介です。エミュレーター上で動いていて、HoloLens 2にデプロイもできて動かすとライブラリが見つからなくて動かないというパターンが起きるかもしれないです。
実機がない現状では「Lenovo Yoga C630 Windows on snapdragon」がArm版Windows 10なのでこの端末で動作検証可能ですが、素直にHoloLens 2が出てくるのを待つでいいのではと思いますが。。。