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

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

前回、Intel RealSenseをUnity上で利用する方法を紹介しました。そして、Intel RealSense D435のサンプルをUnity上で実行しましたが、その多くは深度センサの情報を視覚化したものなどでした。実際に利用するときは、深度センサの値そのものが欲しいときもあります。ここでは、 Unity 上で深度センサの値を取得する方法を紹介します。

関連記事

realsense.unitypackage のインポート

前回紹介(「5. realsense.unitypackageダウンロード」「6. Unity上で実行」参照)したように、 Unity 上で Intel RealSense を扱えるよう、Intel RealSense の Unity Package を追加してください。

RsDevice の修正

なるべく Intel RealSense が用意しているソースコードを修正したくはないですが、 RsDevice を継承した方が使い勝手がいいいため、一部だけ修正します。
修正するのは毎フレームの深度センサの値を保持しているパイプラインのアクセス修飾子です。 RsDevice クラスを継承したクラスからも、 m_pipeline を利用できるようにするため、 アクセス修飾子を private から protected に変更します。

RsDevice.cs 64行目

protected Pipeline m_pipeline;

RsDevice2.cs の追加

次にRsDeviceクラスを継承したクラスを作成します。ここではRsDevice2クラスとします。
そして、このUpdateメソッドにて深度の値を取得するようにします。

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));
        }
    }
}

深度の値はFrameSet (上記の frames 変数) が持っています。その中からDepthFrameよりGetDistanceで位置を指定し値を取得します。深度センサはデフォルトで解像度が 640 x 480 ですので、xには 0 〜 639 、yには 0 〜 479 の値を指定します。上記のソースコードでは、 x: 320 , y: 240 の位置の値を取得するようにしています。

シーンに追加

RsDevice2クラスをシーンに追加します。空のオブジェクトRsDevice2を作成し、AddComponentよりRsDevice2.csを選択します。

RsDevice2オブジェクトを選択して、プロパティよりProcess ModeをUnityThreadに変更します。これでUnityのUpdateメソッドで値を取得することができます。

実行

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

取得できる値はおおよそ距離 (m) の値となっています。実務であれば、取得した値はそのまま利用せず係数を持たせた方がいいでしょう。

まとめ

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

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