その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

『Flying Tokyo #15 Rulr Workshop』受講メモ1日目 #rzmr_ws

Flying Tokyo #15 Rulr Workshop という Rhizomatiks Research 主催の2日間のワークショップを受講しています。本日1日目のメモ。


※アプリケーション自体はまだ公開じゃない気がするので、ダウンロードURL等は控えておきます。写真はOK(NGと明言されたもの以外)とのこと。

ワークショップ概要

http://www.rzm-research.com/rulr/ より)

Elliot氏について

「RULR」の開発者でありアーティストのElliot Woodsが来日し、講師をつとめます。アシスタントは画像認識、画像処理を組み合わせた作品を多く手がけるライゾマティクスリサーチのシニアエンジニア、花井裕也。二日間にわたり、インストールから実際のキャリブレーション、3Dスキャナの創作まで実践的な内容を行います。

RULRとは?

「RULR」は、カメラやキネクトなどのデバイスを用いて、リアルタイムの空間キャリブレーションを可能にする、オープンソースのツールキット。リアルタイムのグラフィックをopenFrameworksやVVVV、Processingなどを用いて生成し、物理空間との融合でインタラクティブなビジュアル体験を生み出すためのものです。例えば、キャリブレーションの結果を動く物体へのハイライトに反映したり、インスタレーションの訪問者の顔の3Dロケーションをカメラによって提供するなどの機能があります。

ちなみに「ルーラー」と発音されていました。

RULRインストール方法

Mac版はライゾマメンバーの方々が今回のワークショップにあたって作成したとのこと。たぶんまだ公開版ではないのでダウンロードリンク掲載は控えておきます。

アプリケーションの操作方法

Patch Panel
  • ノード以外のところをドラッグするとパッチパネルのスクロール
  • ズームは普通のmacの操作
  • ダブルクリックで新規ノード追加
  • ノードを繋ぐときは input pin をドラッグする
  • ノードの接続の解除は、input pin を右クリックする
World Panel
  • 普通にドラッグで回転
  • 右クリックしながらドラッグでズーム
  • Hキーを押しながらドラッグでカメラを上下左右に移動
  • Rキー長押しでリセット

カメラキャリブレーションの手順

準備
  • 1. Item::Camera ノードを追加
    • デバイスは Webcam を選択
    • Inspector Panelの "Clear device" でクリアできる
  • 2. Item::Board ノードを追加
    • 縦横のセル数とサイズを実際に使うボードを合わせる(デフォルト 10x7 0.05m)
  • 3. Procedure::Calibrate::CameraIntrinsics ノードを追加
  • 4. 3の input pin を1,2に繋ぐ
キャリブレーション
  • 5. 3を選択してアクティブにした状態で、カメラにチェッカーボードをかざす(全体が移るように)
  • 6. 認識すると赤線が出るので、スペースキーを押す
    • 「プニョ」的なSEが鳴る
    • →キャリブレーション結果が記録され、画面に粒々が出る
  • 7. 5,6をカメラの画角内のいろんな位置で最低20回ぐらい繰り返す
    • 回数は右のInspector Panelで確認できる
確認
  • 8. Demo::ARCube ノードを追加する
  • 9. 8の input pinを1,2に繋ぐ
  • 10. 8をアクティブにした状態で、カメラにチェッカーボードをかざすと、チェッカーボード上にキューブが表示される(チェッカーボードを動かしても追随する)


Coding基礎編

ここでoF実装の基礎編的な話。Rulr とは直接関係ない、oF/C++の一般的な話なので、割愛します。(個人的には普段oF/C++書いてないので大変ありがたかったです)


サンプルコードが下記にあります。

プロジェクタ & Kinect のキャリブレーション

準備
  • 1. Item::Kinect ノードを追加
  • 2. Item::Projector ノードを追加
  • 3. System::VideoOutput ノードを追加
  • 4. Procedure::Calibrate::ProjectorFromDepthCamera ノードを追加
  • 5. 4のinput pinを1,2,3に繋ぐ
キャリブレーション
  • 6. VideoOutput をアクティブにして、Inspector Panelの Show Window ボタン(or Return キー)を押す
    • → チェッカーボードがプロジェクタから投影される
  • 7. スクリーン(会場では壁)の位置、スクリーンより少し手前でそれぞれ Capture ボタン(or Space キー)を押す
  • 8. 最後に Return キー(キャリブレーション実行)
確認
  • 9. Render::NodeThroughView ノードを追加
  • 10. 9の input pin を1,2,3に繋ぐ
  • 11. 4の input pin と 3 との接続を解除しておく


キャリブレーション情報のエクスポート

Item::Projector を選択した状態で、Inspector Panel の Export ofxRay ボタンをクリック。(デフォルトのファイル名は Projector.ofxRayCamera)

サンプル作成

Elliotさんが基本的にWindowsユーザーで、Macですぐに動くサンプルがなく、かといって全員が一から実装していたらワークショップが終わらないので、以下の手順でサンプルを作成。

  • ofxMultiKinectV2 の example_pointcloud を複製する

- パスの設定がおかしくなるので別フォルダに移動させない

  • ofxRay を追加する

- Elliot さんによるとここの作業で projectGenerator を使わないほうがいい、とのこと
- マニュアル追加してからsrcフォルダ以外をremove

  • [Build Settings] > [Header Search Path] を追加
../../../addons/ofxRay/src
  • ofApp.cpp を改変
#include "ofxRay.h"
ofxRay::Camera projector;
    • setup() の最後に以下を追加
auto result = ofSystemLoadDialog("Select ofxRay::Camera file for this projector");
if (!result.bSuccess) {
    ofExit();
}
ifstream filein(ofToDataPath(result.filePath), ios::binary | ios::in);
filein >> this->projector;
filein.close();
    • draw() の `ecam.begin()` 〜 `ecam.end()` の部分を ofxRay::Camera オブジェクトを使ったものに置き換える。
if (mesh.getVertices().size()) {
    ofPushStyle();
    glPointSize(2);
    
    projector.beginAsCamera();
    {
        ofDrawAxis(100);
        ofPushMatrix();
        ofScale(0.01, 0.01, 0.01);
        mesh.draw();
        ofPopMatrix();
    }
    projector.endAsCamera();
    
    ofPopStyle();
}


所感


とつぶやいた通り、行く前は本当に恐れていたのですが、Elliotさん自身はたぶんそんなに初中級者を振り落とす感じではなく、「oFはさわったことある?」「ポインタは知ってる?」とひとつひとつ丁寧に教えてくれる姿勢だったし、作業に遅れが出る人がいてもライゾマの方々が総出でトラブルシューティングにあたってくれてました(Elliotさん自身も)。


ただ作業自体にはついていけたものの、普段Kinectやプロジェクタとあまり縁がないので、「キャリブレーション」と一口に言っても、もともとどういうズレがどの位あって、どの値を、何を基準に、どのようにキャリブレーションしているのか、といった本質的な部分がパッとイメージできず、そのあたりは結構両隣の受講者の方々に質問させていただきました(助かりました!)。でもこのあたりは一度自分でキャリブレーションなしで試して、キャリブレーションしないとどうにもならないわーということを体感しないとどうにも腹落ちはしないかな・・・とも思います。


個人的には明日の「3Dスキャナの創作」というパートに興味があるので、明日もついていけるようがんばります。