2012年10月27日土曜日

OpenNIを利用したアプリ:跳ねるボール3

in English

はじめに

以前こんなアプリを作りました。今回はこれにOpenNIのSceneAnalyzerを組み合わせてみたので紹介します。

動画

こんな感じです。
video

開発環境

  1. Mac OS X 10.8.2
  2. プロセッサ:3.06 GHz Intel Core 2 Duo
  3. メモリ:4GB
  4. Xcode4.5.1

主要ライブラリ

  1. boost-1.51.0
  2. pcl-1.6.0
  3. OpenNI-Bin-Dev-MacOSX-v1.5.4.0
  4. ode-0.12

ソース

こちらです。自分のマシーンでしか動作確認していません。

コンパイルオプション

Header Search Path:
パス 目的
/usr/include/ni/ OpenNIヘッダー
/opt/local/include/ boost/odeヘッダー
/usr/local/include/pcl-1.6/ PCLヘッダー
/opt/local/include/eigen3/ eigenヘッダー(PCLがこれに依存している)
/opt/local/include/vtk-5.10/ vtkヘッダー(PCLがこれに依存している)

Library Search Path:
パス 目的
/opt/local/lib boostライブラリ
/usr/local/lib PCLライブラリ

Other Linker Flags:
-lboost_thread-mt -lboost_filesystem-mt -lboost_unit_test_framework-mt -lboost_chrono-mt -lboost_program_options-mt -lboost_system-mt /usr/lib/libOpenNI.dylib -framework OpenGL -framework GLUT -lpcl_filters -lpcl_kdtree -lpcl_segmentation -lpcl_surface -lpcl_search -lpcl_features -lpcl_common -lode -lpcl_io


使い方

実行ファイ名は、InteractiveObjectsです。引数--helpをつけて実行すると以下を出力します。 OpenNIのSceneAnalyzerは640x480をサポートしていないようです。以下のようにSegmentation faultが発生しました。 21,22行目はOpenNIのライブラリが出力した文字列です。私の実装の仕方が悪いのかもしれません。今回は320x240で動作させます。
引数なしで実行すると、Viewerが起動しXtion Pro Liveの映像が流れます。 窓にフォーカスがある状態で、キーボードから「m」を打つと、そのときのフレーム内にあるポイントクラウドから三角メッシュを導出します。これが床や壁などを表現する背景オブジェクトとなります。 続いて「r」を打つと、環境内に剛体(ボールと円柱)が出現します。そして、ボールが背景と円柱に衝突する様子が、実時間で描画されます。剛体の投入は何度でもできます。円柱は背景に固定されています。 「o」を打つと映像内に侵入する人物と剛体の間の衝突が描画されます。 「q」を打つと終了します。

ソースの概要

以前と異なる部分だけ紹介します。

ポイントクラウドへの変換

Device::create_cloudで行います。以下3つのポイントクラウドを生成します。
  1. カラー画像描画のためのポイントクラウド(cloud_
  2. 背景の三角メッシュを算出するためのポイントクラウド(background_cloud_
  3. 人物の三角メッシュを算出するためのポイントクラウド(object_cloud_
object_cloud_を生成するため、OpenNIのSceneAnalyzerを導入しました。それに関連するコードが11行目から13行目、39行目から44行目にあります。SceneAnalyzerが捉えた物体はフレーム単位で三角メッシュに変換され、ODEに登録されます。一方、背景となる三角メッシュは「m」が押された瞬間のフレームから作られ、それ以降は固定されます。

剛体オブジェクト

前回に引き続き、剛体を記述するためにODEを使用しました。ODEオブジェクトを定義している部分を以下に示します。dで始まるクラスは全てODEが提供するクラスです。 ODEでは、剛体運動する物体をdBodyのオブジェクトで記述します。また、衝突検出を必要とする物体を、dGeomのオブジェクトで表現します。今回導入したボールは衝突しながら剛体運動を行います。上記の7、8行目がそれを表しています。ここで、dSpheredGeomの子クラスです。
一方、円柱は背景に固定しているので、ボールと衝突するだけでそれ自身は剛体運動を行いません。従って、dGeomの子クラスdCylinderで定義しました(18行目)。

その他、ポイントクラウドから三角メッシュへの変換、三角メッシュのODEへの登録、衝突の検出などは以前のページ、あるいはソースをご覧ください。

0 件のコメント:

コメントを投稿