はじめに
本記事は MSLearn 「Azure Digital Twins と Unity を使用して Mixed Reality デジタルツインを構築する」 を試してみた (前編) の続編になります。
本記事内で紹介するラーニングパス
- Set up a mixed reality project for Azure Digital Twins in Unity
- Build a 3D Scene for mixed reality in unity
- Configure 3D assets for mixed reality in Unity
- 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 ) へフィードバックを行います。
Azure Digital Twins と Unity を使用してデジタル ツインを構築する (#MSLearn) を #HoloLens2 にデプロイしてみた。5秒ごとにサンプルデータを受信、タービンから異常値を検出すると、クライアント側 (HL2) から ADT Rest API を叩いて、物理環境へフィードバックできる。https://t.co/yD4XLyDTbH pic.twitter.com/9c6noeIJFL
— Futo Horio (@Futo_Horio) June 8, 2021
本記事で構築するアーキテクチャ
ARM ( Azure Resource Manager ) テンプレートを用いて、
以下リソース群をデプロイします。
[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 インストール済み
※ このラーニングパスを実行する際の前提条件は、こちら をご確認ください。これ以降の手順は、ソフトウェア、ライブラリのバージョンが MS Learn 公式サイトに記載されているものと異なりますので、ご留意の上、お読みいただけますと幸いです。
4. Azure Digital Twins と Unity を使用して IoT データを HoloLens 2 へ接続する (2時間)
はじめに / Introduction
サンプルシナリオ (概要)
この学習モジュールでは、風力発電所の各風力タービン (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 フォルダを開きます
2. 「2_PlaceDigitalTwinAssets」 シーンを開きます
このシーンには Bing Maps.prefab が含まれています。
3.Bing Maps 開発者キーを確認します
※ まだ Bing Maps account を作成されていない方は Creating a Bing Maps Account の手順に従って、アカウントの新規作成を行ってください。
4. ヒエラルキーパネルからゲームオブジェクト[Bing Maps]を選択し、 [Developer Key] の入力 & Map Renderer コンポーネントの設定を以下の値に編集します
5.プロジェクトパネルから Assets > ADTPrefabs > ADTConnection をヒエラルキーパネルに追加します
演習 - 演習環境のセットアップ
1. フォルダ [ARM-Template] 配下にある azuredeploy.bicep スクリプトを確認します
2. Windows PowerShell を開きます
※ Azure CLI をインストール済みでない方は__「Install Azure CLI on Windows」__よりインストールを実行してください。
3. フォルダ [ARM-Template] へ移動します
cd ./ARM-Template
4. PowerShell に コマンド「az login」を入力し、Azure にログインします。
このコマンドにより、ブラウザーの認証ページが立ち上がり、正常に認証が終了すると、以下のメッセージが返ってきます。
5.変数 : projectname を定義します
この演習で作成される Azure リソースのベースとなる固有名詞です。ランダム文字がプロジェクト名に追加されます。
$projectname="myproj"
6.変数 : appreg を定義します
これは HoloLens アプリのアプリケーション登録の名前になります。
$appreg="myappreg"
7.アプリレジストレーションを作成する
az ad sp create-for-rbac :
Service Principal を作成、Azure リソースへのアクセスを構成します
オプション | 概要 |
---|---|
--skip-assignment | 標準の割り当て無しで Service Principal を作成 |
az ad sp create-for-rbac --name ${appreg} --skip-assignment > AppCredentials.txt
8. 変数 : objectid を定義します
az ad sp list : サービスプリンシパル一覧を表示します (JSON)
オプション | 概要 |
---|---|
--display-name | 名前もしくは prefix で条件付きで検索 |
--query | JSON から値を指定 |
-o (--output) tsv | TSV (タブ区切りフォーマット)で出力 |
$objectid=$(az ad sp list --display-name ${appreg} --query [0].objectId --output tsv)
9. 変数 : userid を定義します
az ad signed-in-user show : 現在ログインしているユーザーの詳細情報を取得します
オプション | 概要 |
---|---|
--query | JSON から指定の値を抜き出します |
$userid=$(az ad signed-in-user show --query objectId -o tsv)
10. Azure リソースグループを作成する
az group create : Azure リソースグループを新規作成します
オプション | 概要 |
---|---|
--name | 作成するリソースグループの名前 |
--location | 作成するリソースグループのロケーション |
az group create --name ${projectname}-rg --location eastus
実際の出力 ( PowerShell )
実際の出力 ( Azure Portal )
11. 新しく作成した Azure リソースグループに ARM テンプレートをデプロイする
az deployment group create : リソースグループでデプロイを開始します
オプション | 概要 |
---|---|
-f (--template-file) | テンプレート or Bicep ファイルパスを指定 |
-g (--resource-group) | デプロイ先のリソースグループを指定 |
-p (--parameters) | デプロイ時のパラメーターを指定 |
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 : ドメイン固有言語 ) です。
※ このプロセスが完了するまでに 10 分から 15 分かかる場合があります。
無事デプロイが完了すると、Azure Portal 画面上から 10.で作成したリソースグループ内に必要なリソースが作成されていることを確認できます。
実際の出力 ( Azure Portal )
12. Azure CLI 用の azure-iot 拡張機能をインストールする
az extension add : エクステンション (拡張機能) を追加する
az extension add --name azure-iot
13. 主要な構成パラメーターを取得する
az deployment group show : リソースグループでのデプロイを表示します。
オプション | 概要 |
---|---|
-n (--name) | 表示対象のデプロイ名? |
-g (--resource-group) | 表示対象のリソースグループ |
--query properties.outputs.importantInfo.value | 主要な構成の値のみ出力する |
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 : 指定された IoT ハブの接続文字列を表示します。
オプション | 概要 |
---|---|
--resource-group | 対象のリソースグループ名を指定 |
az iot hub connection-string show --resource-group ${projectname}-rg >> Azure_config_settings.txt
15. 13.14.の手順で出力したファイルの中身を確認する
Get-Content (PSコマンド) : 指定された場所にあるコンテンツを取得(出力)します。
get-content Azure_config_settings.txt
実際の出力 ( PowerShell )
演習 - 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 を開きます
2. テキストエディタ―で Azure_config_settings.txt を開きます
3. Azure_config_settings.txt ファイルから addHostName の値をコピーします
4. Visual Studio の DeviceSimulator ソリューションで [ソリューションエクスプローラー] ウィンドウで AzureIoTHub.cs ファイルをダブルクリックし、開きます
6. AzureIoTHub.cs の以下の値を編集します
addInstanceUrl : Azure_config_settings.txt > addHostName の値をコピー
iotHubConnectionString : zure_config_settings.txt > connectionString の値をコピー
7. PropUpdate.cs の以下の値を編集します
Unity へ戻ります。
8. ヒエラルキーウィンドウで ADTConnection ゲームオブジェクトを選択します
9. Azure_config_settings.txt ファイルから、signalRNegotiatePath の値をコピーし、ADT Data Handler (Script) Url へコピーします
※ 最後のバックスラッシュと "negotiate" という単語は含めません。
シーンを保存 ( ショートカット : Ctrl + S ) します。
演習 : ユーザーインターフェースを備えた Azure Digital Twin (ADT) を作成する
1. シーンに Bing Maps プレハブ、または何かしらの風力タービンプレハブがある場合は、ヒエラルキーウィンドウから削除します
2. Assets > Art > Prefabs > Bing Maps Operate をヒエラルキーウィンドウに追加します
3. Assets > UIPrefabs > Prefabs > OperateSceneUI をヒエラルキーウィンドウに追加します
この UI パネルには、実行時に風力タービンサイトデータが取り込まれます。
4. UIのデータ範囲の色をカスタマイズする
- Assets > ScriptableObjects > Telemetry Range Date へ移動します。
- RangeAmbientTemprature, RangePower, RangeRotorSpeed, RangeWindSeed の4つのテレメトリ範囲のいずれかを指定します。
- [正常性インディケーターグラデーション] で色範囲を指定する。
演習 - SignalR を使用してシミュレートされた操作データを視覚化し、操作する
1. Visual Studio で DeviceSimulator.sln を開き、実行します
再生ボタン、または F5キーを押して、DeviceSimulator を実行。
コンソールウィンドウが立ち上がり、タービンIDと、接続性やデバイスの取得/作成に関するメッセージが表示されます。
2. 任意のキーを押して、シミュレーションを開始します
適切に設定され、適切な Azure サービスに接続されている場合、以下のように一連のストリーミングコンソールメッセージ「メッセージを受信しました ( Message received )」が表示されます。これは Azure Digital Twin サービスがシミュレーションされた IoT データを受信したことを意味します。
3. Unity Editor で再生ボタンを押します
UIパネルのデータに、実行中の DeviceSimulator アプリケーションから生成されるデータが反映されているのが確認できます。
4. Unity ゲームビューの Site Overview Menu と Turbine panel に表示されるデータにどのような変化が起きるかを観察してください
5. ScriptableObject を選択して、風力タービンのパフォーマンスデータを観察します
Assets > ScriptableObjects > Turbine Site Data > T103 を選択し、Inspector Panel の Wind Turbine Data セクションで受信データを調べます。
6. DeviceSimulator を停止します
シミュレーターのコンソール画面にカーソルを合わせ、Ctrl+Zを押すか、シミュレーターウィンドウを閉じます。このシミュレーターが動作している状態では大量のデータが Azure Digital Tiwns (ADT) サービスに送信され、課金が行われ続けるので注意してください。
演習 - アラートを解決するために Azure Digital Twins REST API に接続する
実際の状況では、風力発電所は継続的に稼働することはありません。時々、タービンアセットは動作異常の閾値を超える可能性があります。このような状況が発生した場合、オペレーターとエンジニアはタービンアセットからデータを受信し、分析、それに基づいて対応するためのアラート信号を送信します。Azure Digital Tiwns (ADT) のタービンアセットアラートを HoloLens 2 アプリから解決するため、ADT REST API にリクエストを送信します。
ADT REST API へリクエストを送信するためには、最初に認証を行う必要があります。
1. プロジェクトウィンドウ Assets > ScriptableObjects > AzureDigitalTwin > Credentials フォルダに移動します
2. グローバルメニュー Assets > Create > Scriptable Objects > Credentials > ADT Rest API Credentials を選択します
3. 新規作成された ADT Rest API Credentials を開き、パラメーターを入力します
4. ADTTurbineAlertController は、特定のタービンのデジタルツインのアラートプロパティを変更します
Asssets > ADTPrefabs > ADTTurbineAlertController をヒエラルキーパネルにドラッグ&ドロップで追加します。
ヒエラルキーパネルで ADTTurbineAlertController を選択し、Inspector に移動した後、ADT Turbine Alert Controller (Script) コンポーネントを探します。[Adt Connection Info] という名前のフィールド内にある円形アイコンを選択し、先ほど作成した ADTRestAPICredentials を割り当てます。
シーンを保存します。
演習 - HoloLens 2 へデプロイし、テストして、アンインストールする
Visual Studio IDE で DeviceSimulator を起動した後、HoloLens 2 アプリを起動すると、リアルタイムにデータを受信しているデジタルツインを確認することができます。また、DeviceSimulator 側でスペースキーを押下し、異常値を送信することできます。異常値を受け取った HoloLens 2 アプリは、ユーザーに視覚的な気付きを与え、アプリ側から物理世界へフィードバックを送るといったことも可能になります。
Azure Digital Twins と Unity を使用してデジタル ツインを構築する (#MSLearn) を #HoloLens2 にデプロイしてみた。5秒ごとにサンプルデータを受信、タービンから異常値を検出すると、クライアント側 (HL2) から ADT Rest API を叩いて、物理環境へフィードバックできる。https://t.co/yD4XLyDTbH pic.twitter.com/9c6noeIJFL
— Futo Horio (@Futo_Horio) June 8, 2021
終わりに
とりあえず動くところまで。ARMテンプレートでデプロイされたリソースや、各サービスのデータの送受信の仕組み等、まだまだ深掘りできる要素がたくさんあるので、次は各サービスがどういった動作をしているか詳細を調査してみたいと思います。ひとまず #MSLearn の外観ということで、最後までお読みいただき、ありがとうございました。
演習を円滑に進めるための補足情報
テレメトリーデータを接続する / Connect telemetry data
telemetry (テレメトリ) とは、センサーによる計量や測定、機器の状態監視などを、通信回線を介して遠隔地から行うこと。自動販売機の在庫や売上の把握、電気・ガス・水道などのメーターの検針、駐車場の入出庫の把握などに応用されている。
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 コマンドプロンプトからは利用できないいくつかのタブ補完機能を提供しており、この学習モジュールで推奨されるシェルです。