2019年12月17日火曜日

[HoloLens Advent Calendar 2019] 17日目 HoloLen 2で床、壁、天井にPlaneのオブジェクトを作成する Scene understanding SDK のUnity Sampleを実行してみた。

お疲れ様です。ZuQ9->Nnです。
この記事は、HoloLens Advent Calendar 2019、17日目
2019/12/17 の内容です。

HoloToolkit-Unity時代、SurfaceMeshesToPlanes.csという
床、壁、天井にPlaneのオブジェクトを作成するScriptが存在しました。
SurfaceMeshesToPlanes.csについて詳しくは下記の記事が参考になるとおもいます。

壁とか天井とか床とか欲しいな 〜 空間認識 - ウラデブ

ども、ウラさんです。HoloLensなんだから壁や床を利用したいよね?って事で、空間認識ってか部屋認識をやってみましょ。 前回と同じでHoloToolkitを使って空間メッシュが表示されるまで作ります。んで、空のゲームオブジェクトを追加。 自前の スクリプトとして「MakePlanes.cs」を作成&アタッチ。 HoloToolkitから「SurfaceMeshesToPlanes.cs」「RemoveSurfaceVertices.cs」をアタッチ。 んで、MakePlanes.csを編集。 sing System.Collections; using System.Collections.Generic; using UnityEngine; using HoloToolkit.Unity.SpatialMapping; using HoloToolkit.Unity.InputModule; public class MakePlanes : MonoBehaviour, IInputClickHandler { void Start () { InputManager.Instance.PushFallbackInputHandler(gameObject); SurfaceMeshesToPlanes.Instance.MakePlanesComplete += SurfaceMeshesToPlanes_MakePlanesComplete; } void Update () { } public void OnInputClicked(InputClickedEventData eventData) { SpatialMappingManager.Instance.StopObserver(); SurfaceMeshesToPlanes.Instance.MakePlanes(); } private void SurfaceMeshesToPlanes_MakePlanesComplete(object source, System.EventArgs args) { RemoveSurfaceVertices.Instance.RemoveSurfaceVerticesWithinBounds(SurfaceMeshesToPlanes.Instance.

目指せ脱HoloLens初心者!その2(SpatialProcessing)

https://torikasyu.com/?p=927 の続きです。 さて、次は別のサンプルを使ってSpatialMappingを更に調べてみます。 HoloToolkit-UnityのHoloToolkit-Testにある、SpatialProcessingシーンを実行してみます。 (HoloToolkit-1.5.7で試していますので、バージョンが違うと多少違うかもしれません) ...
個人的には、あの機能が好きで、Mixed Realty Tookit Unity v2 ではどうやるんだろうと探していました。
MRTKv2には、SpatialAwarenessSurfaceTypes.csというScriptで
enumの定義で、Floor、Ceiling、Wall、Platformの定義が行われている他、

Enum SpatialAwarenessSurfaceTypes

null
SpatialAwarenessPlanarObject.csのCreateSpatialObjectメソッドというのが存在し、
なんだか出来そうな感じでした。

Class SpatialAwarenessPlanarObject

Inheritance Assembly: cs.temp.dll.dll Syntax public class SpatialAwarenessPlanarObject : BaseSpatialAwarenessObject, IMixedRealitySpatialAwarenessObject SpatialAwarenessPlanarObject() Declaration public SpatialAwarenessPlanarObject() Collider Declaration public BoxCollider Collider { get; set; } Property Value CreateSpatialObject(Vector3, Int32, String, Int32) Declaration public static SpatialAwarenessPlanarObject CreateSpatialObject(Vector3 size, int layer, string name, int planeId) Parameters Returns
残念ながらサンプルが見つけられず、どう使うのかはわからずじまい。
しかし、色々と検索しているうちに、Scene understanding SDKというものが別に存在していることを知りました。

MicrosoftDocs/mixed-reality

The goal of Scene understanding is to transform the un-structured environment sensor data that your Mixed Reality device captures and to convert it into a powerful but abstracted representation that is intuitive and easy to develop for. The SDK acts as the communication layer between your application and the Scene Understanding runtime.
というか、MicrosoftDocs/mixed-realityというリポジトリの存在そのものも、今回初めて知りました。。orz..。

Scene understanding SDKは、どうやら、HoloToolkit-Unity時代のSpatial Understandingと呼ばれた機能のHoloLens 2版のようです。

UnityでのSampleがまた、別のGithubのリポジトリに存在しましたので、
今回は、そちらを確認しました。

sceneunderstanding-microsoft/unitysample

A Unity-based sample application that showcases Scene Understanding on HoloLens 2. When this sample is deployed on a HoloLens, it will show the virtual representation of your real environment. When this sample is deployed on a PC, it will load a serialized scene (included under Resources\SerializedScenesForPCPath) and display it.
Githubに色々注意書きがあるのですが、Unity 2018.4.12以上が必要になる他
Windows SDK version 10.0.18362.0以上も必要です。
また、これは、Mixed Realty Tookit Unity v2 とは全く関係無く。
実機では、HoloLens 2のみで旧型のHoloLensでは動作しないようです。
UnityのSampleはPCでも確認できるようになっていたため、
今回はPCのUnity Editorで確認を行いました

GitHubからプロジェクトをCloneかダウンロードしてプロジェクトを開きます。
Unityで確認する場合は Asset > SceneのSceneUnderstandingSampleを開き
HierarchyからSceneUnderstandingManagerを選択
InspectorのSceneUnderstandingDataProvider > Run On Deviceのチェックを外して実行します。

Unityで実行ボタンを押すと、こんな感じで壁や天井、床といったオブジェクトがせいせいされた部屋のようなものが表示されます。

しつこいようですが、
Mixed Realty Tookit Unity v2 とは全く関係無いため、Mixed Realty Tookit Unity v2 のパッケージインポートをする必要すらありません。
独立した全く別の一つの機能としてとらえた方がよさそうです。

少し、中身を確認したところ
SceneUnderstandingDataProvider.cs、SceneUnderstandingDisplayManager.cs、
SceneUnderstandingUtils.csというScriptが利用されています。
こちらは、Microsoft.MixedReality.SceneUnderstanding.Samples.Unityという
namespace のため、SceneUnderstandingそのもののコードではなく
あくまで、サンプルのために作成されたScriptです。

SceneUnderstandingそのものは、UnityではAsset > Packages > Microsoft.MixedReality.SceneUnderstanding.0.5.2042-rc > Unityの中に
CPU毎のフォルダにMicrosoft.MixedReality.SceneUnderstanding.dllが入っています。
dllなのでコードの中身は見ることができませんでした。

SceneUnderstandingDataProvider.cs、Start()メソッドの中で
var access = await SceneUnderstanding.SceneObserver.RequestAccessAsync();
が呼び出されています。実機ではこちらで、実際の部屋を読み取り、
床、壁、天井にPlaneのオブジェクトを作成するようです。

PCだと、SceneUnderstandingDataProvider.csの SUSerializedScenePath プロパティに
指定されているbyteデータを読み込んで表示しています。

GitHubのサンプルでは、Asset > Resources > SerializedScenesForPCPath > SU_Kitchen.bytesが利用されています。

いかがだったでしょうか?

開発者は、Mixed Realty Tookit Unity v2のリポジトリだけではなく、MicrosoftDocs/mixed-realityのリポジトリのチェックも必要そうです。

あと、やはり、Microsoftの開発ドキュメントはよく読みましょう。。 僕は、今回、何度も、見落としておりましたので。。orz..

0 件のコメント:

コメントを投稿