vvvv RealSenseプラグイン開発 その1

Pocket

これはvvvv Advent Calendar 2015 19日目の記事です。


Windowsアプリ開発初心者がvvvvのRealSenseプラグイン開発に手を出してみた

そろそろvvvvのプラグイン開発に手を出してみたいなー何かないかなーと思っていたところ、
RealSenseのプラグインが無い(※1)から作ってみては? と@Junky_Incさんから提案されたのでこれは丁度良い、という事で着手しました。
RealSenseのデバイス自体も@Junky_Incさんから貸して頂き準備万端。
という事で今日からは何回かに分けてvvvvのRealSenseプラグイン開発についてお送りします。

RealSenseのプラグインを開発していきますが、他のプラグイン開発でも使えそうな部分を主に書いていきたいと思います。
実際、勉強することや新しい発見が多すぎて書ききれないので細かいここどうやってるの?みたいなところは勉強会とかでいろいろ会話してみたい。

ちなみに自分はWindows上での開発については数年前に数か月やったことがあるだけで素人同然です。
なのでこれが正解!というチュートリアルというよりは、僕はこうやりましたよ~という日記に近い感じで紆余曲折や間違いも多くなるかもしれませんがご了承ください。
このブログのコンセプトは「一緒に育つ。一緒に育てる。」です、笑

(※1) 実は既に無いことも無いんですが、うまく動かないとのこと。
こちら->vvvv | Intel RealSense SDK
ダウンロードして使ってみると確かに動かない。たぶん足りないdllやらパスの設定やらを頑張れば動きそうな気もするが面倒くさい。
あと恐らく表情検出関連のノードしかない。
他にもあるかもしれないけど、二番煎じでもいいからRealSenseプラグイン作ると決めました!笑

RealSenseとは

さて、ではRealSenseとは何か、これで何を作りたいかという目的を決めます。

まずRealSenseとは、Intelが開発している深度情報や骨格情報などが取得できるカメラです。
表情の検出もできるようです。
Intel RealSense
ちっちゃいKinectの様なものです。LeapMotionにも似ています。
PCなどに組み込まれているモデルやLeapMotionの様にカメラ単体のモデルなど様々なモデルがあります。

開発者向けのSDKが公開されており、それらを使用して開発者は自由にアプリケーションを作ることが出来ます。
C++やC#だけではなくJavaScriptやUnity用のAPIもあり色んなプラットフォームで使えそうです。

そして最終的に何を作るかですがこんな感じのデバイスを作ってみたいなと思っております。
33秒あたりからの鏡にかっこいいUIが表示されているやつです。
どこかで展示できるレベルまでいけたらいいな。
(この動画の作品がRealSenseを使っているかどうかはわかりません。)

Future Self Mirror – Experience from CIID IDP on Vimeo.

準備

RealSenseのプラグインを開発するにあたって次のものが必要です。

  1. vvvv 64bit版
  2. vvvv DirectX11 Nodes Alpha
  3. VisualStudio
  4. RealSense SDK

インストールなどの細かい手順は各公式ページに任せます。
RealSenseの開発に関してはこちらの書籍がとても参考になります。

(これも@Junky_Incさんに借りた笑)

vvvv プラグイン開発入門

vvvvのプラグイン開発の導入については@yhy_jpさんがわかりやすい動画を上げてくださっています。

まずは、カメラ映像を表示することを目標にします。

ということで、解説動画の様にTemplateノードをCloneしてプラグイン開発をいざ始めん~。
と、ここでいきなり初心者の最初のつまづくポイント登場です。僕はつまづきました。
パッチ上で右クリック、templateって入力して~、、、さてどれを選べば。。。という、笑

TemplateノードをClone

いろいろ試した結果、Templateで表示されるのはあくまでテンプレートなので間違っていれば後でPluginInfoなどを書き換えればいいんじゃないかな、
という認識に至り適当にTemplate(Node Source)をCloneしました。
(そもそもNode Sourceってなに、Node Sinkってなに。。。?笑)

ここではClone先は
$WORK_SPACE(適当なフォルダ)/RealSense/plugins/にしました。
“$WORK_SPACE(適当なフォルダ)/RealSense/”はパッチ上でAlt+Rをして表示されるRootパッチでパスに追加しておきます。

外部dllを使う

次に初心者の僕がつまづいたポイントは自分の作ったノードで外部dllを使うことです。
RealSenseのAPIを使うにはSDKの中にあるlibpxcclr.cs.dllとlibpxccpp2c.dllを使わなければなりません。
また、DX11のAPIも使うのでvvvv DirectX11 Nodes Alphaの中にあるdllも必要です。
パッチ上で自分が作ったノードを右クリックして表示されるエディターだけではこれ以上の開発は出来ないようです。(たぶん。)
パッチ上でCtrl+Jして表示されるProjectExplorerから参照を追加出来る様です。
libpxcclr.cs.dllの方はこの方法で追加することができました。
またlibpxccpp2c.dllはネイティブライブラリ(自分で作成したプログラムではなくlibpxcclr.cs.dllから呼ばれる)なので参照のさせ方が異なります。
VisualStudioだとプロジェクトを右クリックして既存の項目を追加でlibpxccpp2c.dllを追加すればいいのですが、
こちらはProjectExplorerから追加しても見つからないとエラーが出てしまいました。
環境変数にlibpxccpp2c.dllがあるフォルダを追加すればエラーは出なくなりますが…いちいち環境変数設定するのもなぁ。。。

ということで、ここでVisualStudioの登場です。
Clone先にはノード名.csprojというファイルが出来ているはずなのでそれをダブルクリックしてVisualStudioで開きます。
ソリューションエクスプローラーの中にあるプロジェクト-参照設定を右クリックして必要なdllを追加します。
これでRealSenseのAPIを始め自分の使いたいAPIを使えるようになります。

面白いと思ったのが.csprojファイルがパッチ上でノードとして認識されるということ。
また、そのプロジェクトをビルドして出来たdllもノードとして認識されます。

DirectX 11のテクスチャを出力する

RealSenseのカメラ映像はテクスチャとして出力するようにしてみたいと思います。
RGB(Kinect Microsoft)ノードのOutputの様な感じですね。

ここがまたつまづきポイントです。
DirectX 11のテクスチャを出力するにはどうしたらいいのでしょうか。

どうやらvvvv DirectX11 Nodes Alpha内で使われている”VVVV.DX11.IDX11ResourceProvider”インタフェースを実装するのが良さそうです。
IDX11ResourceProviderを継承したらUpdateメソッドとDestroyメソッドを実装する必要があります。
こんな感じで。

// DX11ResourceのOutputを宣言するとDX11のテクスチャを出力するピンを作れる。
[Output("Texture Out")]
protected Pin> FTextureOutput;

...

public class RGBNode : IPluginEvaluate, IDX11ResourceProvider, IDisposable
{
    ...

    public void Update(IPluginIO pin, DX11RenderContext context)
    {
        ...
    }
    public void Destroy(IPluginIO pin, DX11RenderContext context, bool force)
    {
        ...
    }
    ...

UpdateメソッドがEvaluateメソッドとは別で繰り返し呼ばれるのでこのメソッド内でDX11のテクスチャを作成します。
(詳細な仕組みはまだよくわかってない。。。(;’∀’))
実際の実装についてはここでは書きませんがdx11-vvvv (Github)(vvvv DirectX11 Nodes Alphaのソースコード)の中のKinectColorDepthTextureNode.csとかが参考になります。
vvvvのプラグイン開発については導入部分はドキュメントはあるのですが、実際の開発となるとどう書いていいのかわからないことが多いので、
このリポジトリの中の自分のやりたいことに近いソースを見つけて参考にするのが一番良さそうです。

カメラ映像の描画

DX11のテクスチャが出力できるようになれば本日の目標は達成したも同然です。
いつもの様にQuadなどにテクスチャを入力してRendererで描画してやればOK。

ということでやっとカメラ映像が描画できるようになりました。
RGBというノードが今回作ったプラグインです。
get_image1

今回はここまで。
これだとただのWebカメラと同じなので、深度情報や骨格情報をとれるように開発を進めていきます。
最終的には誰でも使える様に公開予定です。地道に頑張る。。。

参考

vvvvでのプラグイン開発について参考になるページのリンク集です。

vvvv | plugins
dx11-vvvv (Github)
vvvv Plugin Specification

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*