Intel RealSenseの深度をUnity上で取得する方法 その2
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を用いたセンシングのプロジェクトも可能ですので、もしお困りのときはぜひお声がけください。