Intel RealSense のデプス (深度) センサ
前回、Intel RealSenseの深度をUnity上で取得する方法を紹介しました。このときは、 Intel RealSense D435 で得られた深度センサの値を Unityのスレッドで取得する方法について述べましたが、Intel RealSense は、 RealSense 自身のスレッドで動いておりUnityのスレッドとは異なります。ここでは、RealSense のスレッドで深度センサの値を取得する方法を紹介します。
関連記事
- Intel RealSense を Unity で使うための導入方法
- Intel RealSenseの深度をUnity上で取得する方法
- Intel RealSenseの深度画像をUnity上に表示する方法
- Intel RealSense D435の距離の誤差について
準備
今回は、前回紹介した 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を用いたセンシングのプロジェクトも可能ですので、もしお困りのときはぜひお声がけください。