HoloLens2でROS2を使う

HoloLens2にてROS2を使う際の手順について記述します。


## はじめに
これまでにHoloLens, HoloLens2にてROS1を利用するためには、[ros-sharp](https://github.com/siemens/ros-sharp)を用いることが一般的だったと思います。
ROS2では、[ros_msft_mrtk](https://github.com/ms-iot/ros_msft_mrtk)を利用することでHoloLens2との通信ができるようなので試してみようと思います。
(2021年12月18日現在、pre-release版0.0.1のみリリースされているのでその部分は注意が必要です。)

## 環境
**実行環境**

- HoloLens2

**開発環境・使用ツール** 

- Unity2020.3.3f1
- Mixed Reality Feature Tool
- Visual Studio 2019

## 事前準備

以下をダウンロード

- `Mixed Reality Feature Tool`  <br> (https://www.microsoft.com/en-us/download/details.aspx?id=102778)

- `com.microsoft.ros_mrtk-0.0.1.tgz` <br> (https://github.com/ms-iot/ros_msft_mrtk/releases/tag/0.0.1)

- `com.microsoft.ros_mrtk_native-0.0.1.tgz` <br> (https://github.com/ms-iot/ros_msft_mrtk_native/releases/tag/0.0.1)

- `NuGetForUnity.3.0.2.unitypackage` <br> (https://github.com/GlitchEnzo/NuGetForUnity/releases)



## 手順

1. **Unityプロジェクトの作成** <br>
Unityで3Dにて新規プロジェクトを作成します。 <br>
この時ファイルパスが長すぎると[WLTのimport時にエラー](https://github.com/microsoft/MixedReality-WorldLockingTools-Unity/issues/161)が発生するため、短くすることをお勧めします。
2. **Mixed Reality Feature Toolの利用**
作成したプロジェクトにMixed Reality Feature Toolを使用して以下をimportします。
  - Azure Spatial Anchors SDK Core
  - Azure Spatial Anchors SDK for iOS
  - Azure Spatial Anchors SDK for Windows
  - Mixed Reality Toolkit Extensions
  - Mixed Reality Toolkit Foundation
  - Mixed Reality Toolkit Standard Assets
  - Mixed Reality Toolkit Tools
  - Mixed Reality OpenXR Plugin
  - Microsoft Spatializer
  - WLT Core
<br>
<img width="700px" alt="MRFeatureTool.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/9fc5c3f2-b9e0-79de-a3dd-39432f4f9f3a.png">


3. **プラグイン設定**
Unity内でプロジェクトのプOpenXR等のラグイン設定を以下のように行います。

<img alt="firstQ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/58e9a07e-b52e-4485-07fa-620b7c9c71e8.png">
表示される警告ウインドウ → 「Yes」
Unity再起動後にMRTK Project Configuratorの設定

<img alt="OpenXRSettings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/6a3bc30b-e065-d9be-241d-4b3cadb47b10.png">
Unity OpenXR pluginを選択

<img alt="MRTKconfig_showPlugin.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/c3d94eb7-a1ed-cd8c-767e-032884effe71.png">
Show XR Plug-in Management Settingsを選択

<img width="390px" alt="MRTKconfig_openxr-desktop.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/71e45c3b-c2d2-d890-fa63-0f201f169717.png"> <img width="450px" alt="MRTKconfig_openxr-windows.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/0155afde-10cd-348a-4326-7886c99b42f3.png">
Desktop, WindowsそれぞれでOpenXRを有効にします。

<img alt="MRTKconfig_ApplySettings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/fbf59641-9e87-9211-948d-2967db94ff42.png">
MRTK Project Configuratorに戻り、Apply Settingsを選択後、Nextを押下します。

<img alt="MRTKconfig_audio.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/7c9dde92-cb64-0e1d-54fa-f179046674f3.png">
Audio spatializerの設定にて「Microsoft Spatializer」を選択し、Applyを押下します。

これで、プラグイン設定は終了です。
<br>
4. **Nugetによるパッケージの追加**
Nugetを利用してパッケージの追加を行います。

<img width="300px" alt="Import_nuget.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/778e8fbb-8318-7e9b-a2d2-19ac032db49d.png">
ダウンロードしてきたnugetのunitypackageをimportします。

<img alt="Nuget_settings.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/2f5640c5-c01f-aa14-7352-71f3dd64b48e.png"> 
<img alt="Nuget_settings-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/725e3b6a-6e4d-1346-a461-beabaa4b172c.png">
import後に追加されたウインドウからManage Nuget Packagesを選択し、「`Microsoft.MixedReality.QR`」をimportします。
<br>
5. **ROS2パッケージの追加** 
UnityのPackage Managerを利用してROS2関連のパッケージを追加します。

<img width="400px" alt="PackageManager_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/d2a8caf0-5a2a-e1dc-004e-4dc1b53c712a.png"> <img width="430px" alt="PackageManager_settings-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/d10d6e83-2f65-945c-80db-5f3ab1894e99.png">
Package Managerを開き、Add package from tarballを選択します。

<img width="300px" alt="ros_mrtk_import.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/98520232-2ed0-decf-0742-6b862b28cd15.png">
事前準備でダウンロードしていた2つのTGZ形式ファイルをimportします。

<img alt="ros_mrtk_native-link.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/19e9daf5-80eb-b574-b892-69ff27a83655.png">
Projectビューにて、Packages > ROS2 and ROS2.net Native Components..内にあるlink.xmlをAssets直下にドラッグ&ドロップします。
<br>
6. **ビルドとプロジェクトの設定**
まず、ビルド設定を行います。
<img width="450px" alt="build_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/6a601a18-be3f-244e-ec45-5f5ef1282331.png">
Build Settingsを開いて、Universal Windows Platformを選択後Switch Plaformを押下します。

次に、プロジェクトの設定を行います。

<img width="300px" alt="project_settings.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/50a490ee-bbaf-9fb8-6cfc-b94969d6af10.png">
<img width="700px" alt="project_settings-02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265916/51e573ec-d407-24c5-8f6b-9f0e9c01069d.png">
Project Settingsを開いて、Player > Capabilities の項目にて以下を有効にします。

- InternetClient
- InternetClientServer
- PrivateNetworkClientServer
- WebCam
- Microphone
- SpatialPerception


これで設定は終了です。
ここまでくれば、ROS2が利用可能になっていると思います。

次回はこの内容を基に、実際にHoloLens2とのROS2 Topicのやり取りを行ってみようと思います。


## 参考・お借りしたもの
https://github.com/siemens/ros-sharp

https://github.com/ms-iot/ros_msft_mrtk

https://github.com/ms-iot/ros_msft_mrtk_native

https://www.microsoft.com/en-us/download/details.aspx?id=102778

https://github.com/GlitchEnzo/NuGetForUnity/releases

https://github.com/microsoft/MixedReality-WorldLockingTools-Unity/issues/161