仮想と物理とエトセトラ

xRや物理とかごった煮の備忘録的技術ブログ

Holographic Remotingでクライアント(HoloLens2)からサーバ(PC)に向けて接続する

今回はHolographic Remotingの小技をメモします。

Holographic Remotingを使用する場面として、UnityのHolographic Emulationや以前記事にしたUnityアプリケーションでのHolographic Remotingリモートアプリを作成する場合があります。

xr-physics-work-etc.hatenablog.com

これらの場合、どちらもPC側からHoloLens2に接続を行います。
HoloLens2側のアプリである、Holographic Remoting Playerも、普通にアプリを起動すると、接続を待ち受けるモード(Listen)で起動されます。

しかし、下記説明を見るとHoloLens2からPCに接続しに行くこと(Connect)もできるようです。

docs.microsoft.com

今回はHoloLens2からPCに接続しに行く方法についてメモします。

動作確認準備

1. サンプルを取得する

今回は、リモート側アプリとして、Holographic Remotingの公式サンプルを使用します。

github.com

gitを用いて、リポジトリをcloneするか、Download ZIPを選択しZIPファイルをダウンロードします。

f:id:napo909:20210801113331p:plain

HoloLens2側で使用するHolographic Remoting Playerは、公式サンプルのものとMicrosoft Storeにあるものとはほぼ同じため、Microsoft Storeものを使用します。

www.microsoft.com

2. サンプルアプリをビルドする

今回、リモート側アプリはdesktopを使用します。

github.com

MixedReality-HolographicRemoting-Samples/remote/desktop/中のSampleRemote.slnをダブルクリックします。

ビルドの設定をRelease x64に変更します。

f:id:napo909:20210801114416p:plain

上部メニューからビルドデバッグなしで開始を選択しビルドを行います。

f:id:napo909:20210801114510p:plain

なお、私の環境では下記エラーが発生しました。

f:id:napo909:20210801114658p:plain

ソリューションのプロパティからSpectre軽減策を無効化することで解消しました。

f:id:napo909:20210801115106p:plain

ビルドに成功すると、\MixedReality-HolographicRemoting-Samples\remote\desktop\bin\ReleaseSampleRemote.exeが生成されています。
これが、Holographic Remotingのリモート側アプリです。

3. HoloLens2→PCの接続方法を確認する

リモートアプリについて、ソリューションからSampleRemoteApp.cの中身を確認すると、コマンドライン引数から様々な設定ができることがわかります。

github.com

L216から、-listenコマンドライン引数につけるとリモートアプリがHoloLens2からの受信待ちの状態で、アプリが起動することがわかります。

同様にHolographic Remoting Playerアプリ側も確認します。
HolographicRemoting\MixedReality-HolographicRemoting-Samples\player\sampleSamplePlayerMain.cppを確認すると、特にコマンドライン引数などで設定されていない場合は、m_playerOptionsに格納されているデフォルトの設定が適用され、Listenモードで起動します。

HoloLens2の場合は、コマンドライン引数で指定することは(私の知る限りは)できません。
SamplePlayerMain.cppのL650を確認すると、プロトコルを使用して設定できるようです。
HolographicRemoting\MixedReality-HolographicRemoting-Samples\player\samplePackage.appxmanifestから宣言の項目を確認すると、プロトコルの設定がされています。

f:id:napo909:20210801125456p:plain

プロトコルではURIスキームを宣言できます。

www.atmarkit.co.jp

そのため、URIスキームを使用してHolographic Remoting Playerを起動することで、引数を与えた状態で起動をすることができます。

動作確認

まず、リモートアプリを引数を与えて実行します。
Windows Powershell\MixedReality-HolographicRemoting-Samples\remote\desktop\bin\Releaseに移動し、下記のコマンドでリモートアプリを実行します。
.\SampleRemote.exe -listen
特にポート番号を指定していないので、待ち受けているポートは8265です。

実行するとウィンドウが表示されます。
タイトルバーを見るとPress Space To Connectと表示されており、スペースキーを押すと接続が開始されることがわかります。
スペースキーを押下すると、接続対象のIPアドレスが表示されますが、0.0.0.0で表示されているためListen状態で接続待ちしていることがわかります。
f:id:napo909:20210801130328p:plain

そのあと、PC側のIPアドレスをipconfigなどで確認しておきます。

次にHoloLens2側でブラウザを開き、URLを入力する欄に下記URIを設定します。
ms-holographic-remoting://[PCのIPアドレス]:8265

f:id:napo909:20210801135103j:plain

※どうやら2021年8月1日現在、最新のWindowsHolographic バージョン 21H1で使用できるCromium版のEdgeブラウザでは、ブラウザからURIスキームを使用してのアプリ起動ができないようです(私のやり方が悪いだけ?)。この場合は、別途HoloLens2用アプリに組み込んで実行する必要があります。

docs.microsoft.com

IPアドレスが正しく設定されていれば、Holographic Remoting Playerが起動され、PC側のリモート側アプリに接続されます。

f:id:napo909:20210801135205j:plain

通常の方法でHolographic Remoting Playerを起動すると①のような表示になりますが、今回の方法で起動すると②のようになり、HoloLens2側から接続しに行っていることがわかります。
① Waiting for connection on f:id:napo909:20210801135659j:plain

② Connecting to f:id:napo909:20210801135709j:plain

これでHoloLens2からPCに接続する方法でHolographicRemoting接続することができました。
なお、Unityから触れるHolographic RemotingのAPIではリモートアプリから接続しに行くAPIしかないようです。

docs.unity3d.com

UnityからもListenの設定ができればよりHolographic Remotingの用途が広がるような気がします。
何か方法はないものか。。。