Microsoft Learn 「Azure Digital Twins と Unity を使用して Mixed Reality デジタルツインを構築する」 を試してみた (後編)

# はじめに
本記事は [MSLearn 「Azure Digital Twins と Unity を使用して Mixed Reality デジタルツインを構築する」 を試してみた (前編)](https://qiita.com/Futo_Horio/items/4f28db08a12698248be9) の続編になります。

# 本記事内で紹介するラーニングパス

- __[Azure Digital Twins と Unity を使用して Mixed Reality デジタル ツインを構築する](https://docs.microsoft.com/ja-jp/learn/paths/build-mixed-reality-azure-digital-twins-unity/)__ 
 1. Set up a mixed reality project for Azure Digital Twins in Unity
 2. Build a 3D Scene for mixed reality in unity
 3. Configure 3D assets for mixed reality in Unity
 4. Connect IoT data to HoloLens 2 with Azure Digital Twin and Unity

※ 2021/06/01 現在、これからご紹介する4つ目の学習モジュール「Connect IoT data to HoloLens 2 with Azure Digital Twin and Unity」のみ日本語翻訳ページが公開されています。他のモジュールに関しても近日中に日本語翻訳版が公開される予定となっています。

# 成果物

デバイスシミュレーターからのテストデータを5秒間隔でリアルタイムで受信し、異常値を検出した際は視覚的にユーザーへ知らせ、クライアントアプリ ( HoloLens 2 ) 側から ADT Rest API を叩き、物理世界 ( Phycial World ) へフィードバックを行います。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Azure Digital Twins と Unity を使用してデジタル ツインを構築する (<a href="https://twitter.com/hashtag/MSLearn?src=hash&amp;ref_src=twsrc%5Etfw">#MSLearn</a>) を <a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> にデプロイしてみた。5秒ごとにサンプルデータを受信、タービンから異常値を検出すると、クライアント側 (HL2) から ADT Rest API を叩いて、物理環境へフィードバックできる。<a href="https://t.co/yD4XLyDTbH">https://t.co/yD4XLyDTbH</a> <a href="https://t.co/9c6noeIJFL">pic.twitter.com/9c6noeIJFL</a></p>&mdash; Futo Horio (@Futo_Horio) <a href="https://twitter.com/Futo_Horio/status/1402107189129474063?ref_src=twsrc%5Etfw">June 8, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 本記事で構築するアーキテクチャ

ARM ( Azure Resource Manager ) テンプレートを用いて、
以下リソース群をデプロイします。

> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/fdb283fe-9d63-dcbe-f5ae-51f46f330205.png" width="600">
> [Connect IoT data to HoloLens 2 with Azure Digital Twins and Unity](https://mybuild.microsoft.com/sessions/815a692f-398b-4772-ac18-c021f5116757?source=sessions) | Microsoft Build 2021


# 本記事の検証環境

- __Microsoft HoloLens 2__
 - __OSビルド__ :  20346.1002 (21H1)
- __Windows 10 PC__
 - __OSビルド__ : 19042.985 
 - __Windows 10 SDK__ : 10.0.19041.0
 - __Unity__ : 2020.3.8f1 (LTS) 
 - __Visual Studio 2019__ : Version 16.10.0  
   Universal Windows Platform (UWP) Workload インストール済み
 - __Microsoft Mixed Reality Feature Tool__ : v1.0.2104.3 Beta
 - Mixed Reality Toolkit v2.6.1
- __Microsoft Azure アカウント__
- __Bing Maps 開発者アカウント__
- __Azure CLI インストール済み__


※ このラーニングパスを実行する際の前提条件は、[こちら](https://docs.microsoft.com/ja-jp/learn/paths/build-mixed-reality-azure-digital-twins-unity/) をご確認ください。これ以降の手順は、ソフトウェア、ライブラリのバージョンが MS Learn 公式サイトに記載されているものと異なりますので、ご留意の上、お読みいただけますと幸いです。

## 4. Azure Digital Twins と Unity を使用して IoT データを HoloLens 2 へ接続する (2時間)

### はじめに / Introduction
#### サンプルシナリオ (概要)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f8c85270-0ead-e6c0-8b54-bd4e97400e32.png" width="600">


この学習モジュールでは、風力発電所の各風力タービン (Prefab) に実際のストリームIoTデータを接続する必要があります。各タービンUIパネルがイベントに反応し、操作情報を表示し、シーン内の選択された風力タービンにマップがフォーカスされるようにシーンの構築を行います。

#### やること / What will we be doing？
風力タービン (Prefab) を Azure Digital Twins (ADT) データストリームに接続して、HoloLens 2 での視覚化 (Visualization) と 対話 (Interaction) を行います。これが Digital Twins サービスが真の価値を発揮する場面です。

#### 目標 / What is the mail goal？
実際の運用データ (ライブまたは過去のデータ) をデジタルアセットに接続できるようになること。これにより、以下のことが実現可能です。

- __稼働状況を視覚化する__
- __パフォーマンスまたは機器の正常性/整合性の異常を識別する__
- __時間の経過におけるデータの傾向とパターンを見極める__
- __将来の状況や運用状況をシミュレートする__

---

### 演習 - Unity プロジェクトへ Azure Digital Twin プレハブを追加する

__1. プロジェクトパネルより Assets > Scenes > Supporting Scenes > ModuleStartScenes フォルダを開きます__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/9f6a8873-0fd2-a806-1370-e99fef88892d.png" width="500">

__2. 「2_PlaceDigitalTwinAssets」 シーンを開きます__
このシーンには Bing Maps.prefab が含まれています。

__3.Bing Maps 開発者キーを確認します__

※ まだ Bing Maps account を作成されていない方は [Creating a Bing Maps Account](https://docs.microsoft.com/en-us/bingmaps/getting-started/bing-maps-dev-center-help/creating-a-bing-maps-account) の手順に従って、アカウントの新規作成を行ってください。

__4. ヒエラルキーパネルからゲームオブジェクト[Bing Maps]を選択し、 [Developer Key] の入力 & Map Renderer コンポーネントの設定を以下の値に編集します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/be864eb7-c388-1400-c35a-3ea21f7dc9bc.png" width="500">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/0f9f636b-6a14-6ef1-3585-4559b0b17352.png" width="500">

__5.プロジェクトパネルから Assets > ADTPrefabs > ADTConnection をヒエラルキーパネルに追加します__

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/e9161cf9-9808-8b7d-3042-e1713ce27a2b.png)

---

### 演習 - 演習環境のセットアップ

__1. フォルダ [ARM-Template] 配下にある azuredeploy.bicep スクリプトを確認します__
__2. Windows PowerShell を開きます__

※ Azure CLI をインストール済みでない方は__「[Install Azure CLI on Windows](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?tabs=azure-cli)」__よりインストールを実行してください。

__3. フォルダ [ARM-Template] へ移動します__

```powershell
cd ./ARM-Template
```

__4. PowerShell に コマンド「az login」を入力し、Azure にログインします。__

このコマンドにより、ブラウザーの認証ページが立ち上がり、正常に認証が終了すると、以下のメッセージが返ってきます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/4665b58c-5fe3-0933-9917-594c114141d5.png" width="600">

__5.変数 : projectname を定義します__

この演習で作成される Azure リソースのベースとなる固有名詞です。ランダム文字がプロジェクト名に追加されます。

```powershell
$projectname="myproj"
```

__6.変数 : appreg を定義します__
これは HoloLens アプリのアプリケーション登録の名前になります。

```powershell
$appreg="myappreg"
```

__7.アプリレジストレーションを作成する__

__[az ad sp create-for-rbac](https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az_ad_sp_create_for_rbac)__ :
 Service Principal を作成、Azure リソースへのアクセスを構成します

| オプション | 概要 |
| --- | --- |
|--skip-assignment | 標準の割り当て無しで Service Principal を作成 |

```powershell
az ad sp create-for-rbac --name ${appreg} --skip-assignment > AppCredentials.txt
```

__8. 変数 : objectid を定義します__

__[az ad sp list](https://docs.microsoft.com/en-us/cli/azure/ad/sp?view=azure-cli-latest#az_ad_sp_list)__ : サービスプリンシパル一覧を表示します (JSON)

| オプション | 概要 |
| --- | --- |
| __--display-name__ | 名前もしくは prefix で条件付きで検索 |
| __--query__ | JSON から値を指定 |
| __-o (--output) tsv__ | TSV (タブ区切りフォーマット)で出力 |

```powershell
$objectid=$(az ad sp list --display-name ${appreg} --query [0].objectId --output tsv)
```

__9. 変数 : userid を定義します__

__[az ad signed-in-user show](https://docs.microsoft.com/en-us/cli/azure/ad/signed-in-user?view=azure-cli-latest)__ : 現在ログインしているユーザーの詳細情報を取得します

| オプション | 概要 |
| --- | --- |
|__--query__ | JSON から指定の値を抜き出します |

```powershell
$userid=$(az ad signed-in-user show --query objectId -o tsv)
```

__10. Azure リソースグループを作成する__

__[az group create](https://docs.microsoft.com/en-us/cli/azure/group?view=azure-cli-latest#az_group_create)__ : Azure リソースグループを新規作成します

| オプション | 概要 |
| --- | --- |
|__--name__ | 作成するリソースグループの名前 |
|__--location__ | 作成するリソースグループのロケーション |

```powershell
az group create --name ${projectname}-rg --location eastus
```

__実際の出力 ( PowerShell )__
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/249cced4-2659-5afd-4c1d-0aeafc4d8f34.png" width=" 600">

__実際の出力 ( Azure Portal )__
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/22a8ea37-a50f-f636-4dcb-6f4a4b86d652.png" width=" 600">


__11. 新しく作成した Azure リソースグループに ARM テンプレートをデプロイする__

__[az deployment group create](https://docs.microsoft.com/en-us/cli/azure/deployment/group?view=azure-cli-latest#az_deployment_group_create)__ : リソースグループでデプロイを開始します

| オプション | 概要 |
| --- | --- |
|__-f (--template-file)__ | テンプレート or Bicep ファイルパスを指定 |
|__-g (--resource-group)__ | デプロイ先のリソースグループを指定 |
|__-p (--parameters)__ | デプロイ時のパラメーターを指定 |


```powershell
az deployment group create -f azuredeploy.bicep -g ${projectname}-rg --parameters projectName=${projectname} userId=${userid} appRegObjectId=${objectid} > ARM_deployment_out.txt
```

__Bicep__ は Azure リソースを宣言的にデプロイするための Domain Specific Language ( DSL : ドメイン固有言語 ) です。

<font color="red"> ※ このプロセスが完了するまでに 10 分から 15 分かかる場合があります。</font>


無事デプロイが完了すると、Azure Portal 画面上から 10.で作成したリソースグループ内に必要なリソースが作成されていることを確認できます。

__実際の出力 ( Azure Portal )__ 
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5bd9c861-8e9b-506f-0c5c-3f631610b7e6.png" width="600">

__12. Azure CLI 用の azure-iot 拡張機能をインストールする__

__[az extension add](https://docs.microsoft.com/en-us/cli/azure/extension?view=azure-cli-latest#az_extension_add)__ : エクステンション (拡張機能) を追加する

```powershell
az extension add --name azure-iot
```

__13. 主要な構成パラメーターを取得する__

__[az deployment group show](https://docs.microsoft.com/en-us/cli/azure/deployment/group?view=azure-cli-latest#az_deployment_group_show)__ : リソースグループでのデプロイを表示します。

| オプション | 概要 |
| --- | --- |
| -n (--name) | 表示対象のデプロイ名? |
| -g (--resource-group) | 表示対象のリソースグループ |
| --query properties.outputs.importantInfo.value | 主要な構成の値のみ出力する |

```powershell
az deployment group show -n azuredeploy -g ${projectname}-rg --query properties.outputs.importantInfo.value > Azure_config_settings.txt
```

__14. リソースグループへの接続パラメーターを取得する__

__[az iot hub connection-string show](https://docs.microsoft.com/en-us/cli/azure/iot/hub/connection-string?view=azure-cli-latest#az_iot_hub_connection_string_show)__ : 指定された IoT ハブの接続文字列を表示します。

| オプション | 概要 |
| --- | --- |
| --resource-group | 対象のリソースグループ名を指定 |

```powershell
az iot hub connection-string show --resource-group ${projectname}-rg >> Azure_config_settings.txt
```

__15. 13.14.の手順で出力したファイルの中身を確認する__

__[Get-Content](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-content?view=powershell-7.1)__ (PSコマンド) : 指定された場所にあるコンテンツを取得(出力)します。

```powershell
get-content Azure_config_settings.txt
```

__実際の出力 ( PowerShell )__
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/cbeff9b7-8231-ce42-5f56-6926c8966a02.png" width="600">

---

### 演習 - Azure Digital Twin データを風力タービンアセットに接続してストリーミングする

#### SignalR 概要説明
Azure SignalR サービスは、リアルタイムのWeb機能をHTTP経由でアプリケーションに追加するプロセスを簡略化します。Azure SignalR Service は、リアルタイムでのコンテンツ更新を必要とするあらゆる種類のアプリケーションのために、様々な業界で使用されています。以下、Azure SignalR Service を使用するのに適した例を示します。

- __頻度の高いデータ更新__
- __ダッシュボードと監視__
- __チャット__
- __地図上のリアルタイムの位置__
- __対象を絞ったリアルタイムの広告__
- __コラボレーションアプリ__
- __プッシュ通知__
- __IoT デバイスおよび接続されているデバイス__
- __オートメーション__

etc..

今回の風力タービンのユースケースの場合、Azure Digital Twin 風力タービンデータと HoloLens 2 (クライアント) の間の通信レイヤーは、Azure SignalR Service と HoloLens 2 アプリに埋め込まれた SignalR クライアントを使用します。ADT を介してクライアントアプリにデータを公開するには、Azure SignalR サービスに接続する必要があります。SignalR クライアントと Azure SignalR サービス間の通信を確立するには、クライアントが SignalR サービスで negotiate 関数を呼び出す必要があります。

まず、前章で取得した ADT 接続パラメーターと認証情報を使用して DeviceSimulator を構成します。

__1. Visual Studio で DeviceSimulator.sln を開きます__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/201698cd-495f-654a-2f28-2533fbaf1d6f.png" width="600">


__2. テキストエディタ―で Azure_config_settings.txt を開きます__
__3. Azure_config_settings.txt ファイルから addHostName の値をコピーします__
__4. Visual Studio の DeviceSimulator ソリューションで [ソリューションエクスプローラー] ウィンドウで AzureIoTHub.cs ファイルをダブルクリックし、開きます__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/a2eb2586-8a5e-5950-62b9-19679ca43805.png" width="600">

__6. AzureIoTHub.cs の以下の値を編集します__

__addInstanceUrl__ : Azure_config_settings.txt > addHostName の値をコピー
__iotHubConnectionString__ : zure_config_settings.txt > connectionString の値をコピー

__7. PropUpdate.cs の以下の値を編集します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/d3bce216-099a-d1d3-ec2e-134e857e71e9.png" width="600">

Unity へ戻ります。

__8. ヒエラルキーウィンドウで ADTConnection ゲームオブジェクトを選択します__
__9. Azure_config_settings.txt ファイルから、signalRNegotiatePath の値をコピーし、ADT Data Handler (Script) Url へコピーします__

※ 最後のバックスラッシュと "negotiate" という単語は含めません。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f936fbd2-7a50-b99f-8109-ade8ff59873b.png" width="600">

シーンを保存 ( ショートカット : Ctrl + S ) します。

### 演習 : ユーザーインターフェースを備えた Azure Digital Twin (ADT) を作成する

__1. シーンに Bing Maps プレハブ、または何かしらの風力タービンプレハブがある場合は、ヒエラルキーウィンドウから削除します__

__2. Assets > Art > Prefabs > Bing Maps Operate をヒエラルキーウィンドウに追加します__
__3. Assets > UIPrefabs > Prefabs > OperateSceneUI をヒエラルキーウィンドウに追加します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/11b64b1c-5b50-02e5-b309-9124e710b22a.png" width="600">

この UI パネルには、実行時に風力タービンサイトデータが取り込まれます。

__4. UIのデータ範囲の色をカスタマイズする__

- Assets > ScriptableObjects > Telemetry Range Date へ移動します。
- RangeAmbientTemprature, RangePower, RangeRotorSpeed, RangeWindSeed の4つのテレメトリ範囲のいずれかを指定します。
- [正常性インディケーターグラデーション] で色範囲を指定する。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/092bd3de-c900-487c-648c-0f266adb10fc.png" width="600">

---

### 演習 - SignalR を使用してシミュレートされた操作データを視覚化し、操作する

__1. Visual Studio で DeviceSimulator.sln を開き、実行します__
再生ボタン、または F5キーを押して、DeviceSimulator を実行。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/01975c06-9947-e42b-9673-a55d456bca5d.png" width="600">

コンソールウィンドウが立ち上がり、タービンIDと、接続性やデバイスの取得/作成に関するメッセージが表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5a3b311e-4528-8509-c06a-29f15dbc1139.png" width="600">


__2. 任意のキーを押して、シミュレーションを開始します__

適切に設定され、適切な Azure サービスに接続されている場合、以下のように一連のストリーミングコンソールメッセージ「メッセージを受信しました ( Message received )」が表示されます。これは Azure Digital Twin サービスがシミュレーションされた IoT データを受信したことを意味します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/8a7c2f05-1c6a-cf46-d882-b31419b07d59.png" width="600">


__3. Unity Editor で再生ボタンを押します__

UIパネルのデータに、実行中の DeviceSimulator アプリケーションから生成されるデータが反映されているのが確認できます。

__4. Unity ゲームビューの Site Overview Menu と Turbine panel　に表示されるデータにどのような変化が起きるかを観察してください__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/b60eb5ab-0a98-2991-87fd-534ba6a36e4e.png" width="300"> 
 <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/16e32b51-cefa-62a2-0a41-d24e9ae2e144.png" width="300">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/249846e0-d768-cc04-4f50-3cf838e7c800.png" width="300">



__5. ScriptableObject を選択して、風力タービンのパフォーマンスデータを観察します__

Assets > ScriptableObjects > Turbine Site Data > T103 を選択し、Inspector Panel の Wind Turbine Data セクションで受信データを調べます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/17626ded-3f8f-9fcc-3372-a7b94acf6e78.png" width="600">


__6. DeviceSimulator を停止します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f23facca-a778-ef3f-ce2b-08de1775c948.png" width="600">

<font color="red">__シミュレーターのコンソール画面にカーソルを合わせ、Ctrl+Zを押すか、シミュレーターウィンドウを閉じます。このシミュレーターが動作している状態では大量のデータが Azure Digital Tiwns (ADT) サービスに送信され、課金が行われ続けるので注意してください。__</font>

### 演習 - アラートを解決するために Azure Digital Twins REST API に接続する
実際の状況では、風力発電所は継続的に稼働することはありません。時々、タービンアセットは動作異常の閾値を超える可能性があります。このような状況が発生した場合、オペレーターとエンジニアはタービンアセットからデータを受信し、分析、それに基づいて対応するためのアラート信号を送信します。Azure Digital Tiwns (ADT) のタービンアセットアラートを HoloLens 2 アプリから解決するため、ADT REST API にリクエストを送信します。

ADT REST API へリクエストを送信するためには、最初に認証を行う必要があります。

__1. プロジェクトウィンドウ Assets > ScriptableObjects > AzureDigitalTwin > Credentials フォルダに移動します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/5643e4d0-8a32-3a0c-3490-d130e1fc56b2.png" width="600">


__2. グローバルメニュー Assets > Create > Scriptable Objects > Credentials > ADT Rest API Credentials を選択します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/fc8cd851-682b-a5c7-0cfe-38816de33e49.png" width="600">

__3. 新規作成された ADT Rest API Credentials を開き、パラメーターを入力します__

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/b83fe0be-3014-2e25-a620-2ff64ae7e6b0.png" width="600">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/f458d5a0-7f99-6438-0fe0-65552485a9d7.png" width="600">


__4. ADTTurbineAlertController は、特定のタービンのデジタルツインのアラートプロパティを変更します__

Asssets > ADTPrefabs > ADTTurbineAlertController をヒエラルキーパネルにドラッグ＆ドロップで追加します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/60facae6-2281-74c7-232c-11ab6d8c6883.png" width="600">

ヒエラルキーパネルで ADTTurbineAlertController を選択し、Inspector に移動した後、ADT Turbine Alert Controller (Script) コンポーネントを探します。[Adt Connection Info] という名前のフィールド内にある円形アイコンを選択し、先ほど作成した ADTRestAPICredentials を割り当てます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180432/9d0007fa-96b4-5b2e-8cf2-2c6fff7816a2.png)

シーンを保存します。

### 演習 - HoloLens 2 へデプロイし、テストして、アンインストールする

Visual Studio IDE で DeviceSimulator を起動した後、HoloLens 2 アプリを起動すると、リアルタイムにデータを受信しているデジタルツインを確認することができます。また、DeviceSimulator 側でスペースキーを押下し、異常値を送信することできます。異常値を受け取った HoloLens 2 アプリは、ユーザーに視覚的な気付きを与え、アプリ側から物理世界へフィードバックを送るといったことも可能になります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Azure Digital Twins と Unity を使用してデジタル ツインを構築する (<a href="https://twitter.com/hashtag/MSLearn?src=hash&amp;ref_src=twsrc%5Etfw">#MSLearn</a>) を <a href="https://twitter.com/hashtag/HoloLens2?src=hash&amp;ref_src=twsrc%5Etfw">#HoloLens2</a> にデプロイしてみた。5秒ごとにサンプルデータを受信、タービンから異常値を検出すると、クライアント側 (HL2) から ADT Rest API を叩いて、物理環境へフィードバックできる。<a href="https://t.co/yD4XLyDTbH">https://t.co/yD4XLyDTbH</a> <a href="https://t.co/9c6noeIJFL">pic.twitter.com/9c6noeIJFL</a></p>&mdash; Futo Horio (@Futo_Horio) <a href="https://twitter.com/Futo_Horio/status/1402107189129474063?ref_src=twsrc%5Etfw">June 8, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 終わりに
とりあえず動くところまで。ARMテンプレートでデプロイされたリソースや、各サービスのデータの送受信の仕組み等、まだまだ深掘りできる要素がたくさんあるので、次は各サービスがどういった動作をしているか詳細を調査してみたいと思います。ひとまず #MSLearn の外観ということで、最後までお読みいただき、ありがとうございました。


# 演習を円滑に進めるための補足情報

#### テレメトリーデータを接続する / Connect telemetry data

> __[telemetry (テレメトリ)](https://e-words.jp/w/%E3%83%86%E3%83%AC%E3%83%A1%E3%83%88%E3%83%AA%E3%83%B3%E3%82%B0.html)__  とは、センサーによる計量や測定、機器の状態監視などを、通信回線を介して遠隔地から行うこと。自動販売機の在庫や売上の把握、電気・ガス・水道などのメーターの検針、駐車場の入出庫の把握などに応用されている。
> IT用語辞典 e-Words 「telemetry」ページより引用。

Immersive Experience (没入型体験) でデジタルツインに命を吹き込むためには、その体験をサポートする属性データが必要不可欠です。テレメトリは遠隔地からデータの収集が可能です( 例えば、ストレージ、分析、モデリングなど )。風力発電所の各風力タービンをシミュレートされたデータストリームに接続して、監視制御およびデータ取得 (SCADA)、そして IoTデータなど現実世界と接続性の高い表現が可能にします。3Dアセットをシミュレートされたテレメトリデータに接続することで、体験がより意味のあるものになり、実際の風力発電所の運用を垣間見ることができます。

データはさまざまな方法でデジタルツインに接続できます。この学習モジュールでは、Azure Digital Twins (ADT) を含む一連の Azure サービスを使用して、3Dアセットをよりインテリジェントにします。

デジタルツインアプリは、ScriptableObject ベースのイベントシステムを利用して、Unity シーン内の UIパネルや風力タービンなど、相互に直接認識していないシステム間でメッセージの送受信を行います。

#### Azure Resource Manager (ARM) テンプレート

複数の Azure サービスを連携して使用することで、Unity または HoloLens の両方で、データをデジタルツインに取り込み、Azure と デジタルツイン間の双方向通信を容易にすることができます。

このモジュールで使用される Azure サービスは、以下の通りです。

- __Azure SignalR__
- __Managed Identity__
- __Container instances__
- __Storage account__
- __Event grid topic__
- __Azure Digital Twins__
- __Application insights__
- __Event grid system topic__
- __App Service Plan__
- __Function app__
- __IoT Hub__
- __Deployment Script__

これらの Azure サービスのデプロイと初期設定を簡素化するために、Azure Resouce Manager (ARM) テンプレートを使用することができます。この ARM テンプレートは、Azure サービスのデプロイを自動化するのに役立ちます。ARM テンプレートは、プロジェクトのインフラと設定を定義する Bicep または JavaScript Object Notation (JSON) ファイルのいずれかで定義されます。

ARM テンプレートは、Windows コマンドプロンプトまたは、 PowerShell 内の Azure CLI を使用して実行できます。PowerShell は、Windows コマンドプロンプトからは利用できないいくつかのタブ補完機能を提供しており、この学習モジュールで推奨されるシェルです。