夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

HoloLens MovingPlatform SDKを使用してMovingPlatformModeを使用する

本日はMRTK調査枠です。

 先日新しいHoloLensの機能として従来デバイスポータルでのみ設定が可能であったMovingPlatformMode(MPM)がHoloLens実機ないので設定画面から変更可能になったことを紹介しました。

redhologerbera.hatenablog.com

 今回の更新では同時にUnity側のSDKが提供され、アプリ内での設定も可能になりました。

 今回は新しく提供されたMovingPlatformSDKを見ていきます。

〇MovingPlatformModeとは?

MovingPlatformMode(MPM)は昨年夏以降HoloLensに搭載された新しい機能です。

HoloLenssでは加速度センサーとSpatialAwareness(空間認識)による二つの手段を使用して自己位置推定(SLAM)を実現しています。

 通常の静止環境であれば、非常に正確なSLAMを実現していますが、乗り物の中や船の中など動的な環境の場合、SLAMがずれることやトラッキングロストが発生することが多くあります。

 MPMを有効な状態で使用することである程度の動的環境であっても、SLAMをロストすることなくアプリケーションを実行できます。

〇MovingPlatformSDK

MovingPlatform ModeはHoloLensのデバイスの設定でオンオフができます。またUnityでSDKを使用することでアプリケーションごとに設定を行うこともできます。

redhologerbera.hatenablog.com

今回はUnityでのSDKを見ていきます。

MixedReality FeatureToolsを使用してPlatformSurportないのMixedReality Moving Platform SDKを選択しプロジェクトに加えます。

f:id:Holomoto-Sumire:20220309204711p:plain

これによってSDKの導入が完了します。

MovingPlatformModeの機能はMicrosoft.MixedReality.MovingPlatform;のネームスペースで提供されています。

〇現在のモードを取得する

現在MovingPlatformModeが有効かどうかは以下のコードで取得します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Microsoft.MixedReality.MovingPlatform;
using TMPro;

public class MovingPlatformStudy : MonoBehaviour
{
    [SerializeField] private TextMeshPro _text;
    MovingPlatformManager m_movingPlatformManager = new MovingPlatformManager();

    void Start()
    {     
        MovingPlatformMode currentMode = m_movingPlatformManager.Mode;
        _text.text = currentMode.ToString();
    }
}

m_movingPlatformManager.Modeは次のデータを持っています。

public enum MovingPlatformMode
{
    Standard,                // The legacy mode that devices use out-of-the-box.
    MovingPlatformOptimized  // Allows tracking on moving platforms.
}

StandardではVRやHoloLens 1st等MovingPlatformModeがそもそも使用できないデバイスで使用されます。

MovingPlatformModeを任意に切り替えるためには次の処理を行います。

bool success = m_movingPlatformManager.TrySetMode(MovingPlatformMode.MovingPlatformOptimized);

TrySetMode()はモードを要求された値に設定しようとします。すでに要求されたモードになっている場合は、何もしません

        public bool TrySetMode(Microsoft.MixedReality.MovingPlatform.MovingPlatformMode requestedMode)

以上でMovingPlatformSDKを使用して任意にモードを取得、切り替えることができます。