Intel RealSenseの深度をUnity上で取得する方法 その2

Intel RealSense のデプス (深度) センサ

前回、Intel RealSenseの深度をUnity上で取得する方法を紹介しました。このときは、 Intel RealSense D435 で得られた深度センサの値を Unityのスレッドで取得する方法について述べましたが、Intel RealSense は、 RealSense 自身のスレッドで動いておりUnityのスレッドとは異なります。ここでは、RealSense のスレッドで深度センサの値を取得する方法を紹介します。

関連記事

準備

今回は、前回紹介した Intel RealSenseの深度をUnity上で取得する方法の続きとして紹介するため、ソースコードも前回のものが実装されているものとして説明します。

RsDevice の修正

今回も、Intel RealSense で用意されているソースコードの修正は最小限に留めたいと思います。RealSenseのスレッドの場合、 RsDevice 155行目にある WaitForFrames メソッドが呼び出されるため、これをオーバーライドできるようにします。またこのメソッド内で利用されている stopEvent インスタンスを継承先でも利用できるよう、 アクセス修飾子を private から protected に変更します。

RsDevice.cs 63行目

protected readonly AutoResetEvent stopEvent = new AutoResetEvent(false);

RsDevice.cs 155行目

protected virtual void WaitForFrames()

RsDevice2.cs の修正

RsDevice を継承した RsDevice2 クラスでは、 WaitForFrames メソッドをオーバーライドします。 オーバーライドした WaitForFrames メソッドを追加したソースコードは下記のようになります。

RsDevice2.cs

using UnityEngine;

public class RsDevice2 : RsDevice
{
    void Update()
    {
        if (!Streaming)
            return;

        if (processMode != ProcessMode.UnityThread)
            return;

        if (m_pipeline.PollForFrames(out var frames))
        {
            Debug.Log(frames.DepthFrame.GetDistance(320, 240));
        }
    }
    
    protected override void WaitForFrames()
    {
        while (!stopEvent.WaitOne(0))
        {
            using (var frames = m_pipeline.WaitForFrames())
                Debug.Log(frames.DepthFrame.GetDistance(320, 240));
        }
    }
}

上記のソースコードでは、 x: 320 , y: 240 の位置の値を取得するようにしています。

シーンの修正

Hierarchy に追加されている RsDevice2 の設定を変更します。前回のままだと、 Process Mode が Unity Thread になっているので、これを Multithread にします。

実行

それでは実行してみましょう。ログを確認すると、数値が表示されているでしょう。

またリアルタイムに値を取得できることがわかるでしょう。

まとめ

今回はUnity上でRealSenseの深度センサの値を取得する方法を紹介しました。結構簡単に値を取得できることがわかりましたね。

TKS2では、Intel RealSenseを用いたセンシングのプロジェクトも可能ですので、もしお困りのときはぜひお声がけください。