はじめに
以前こんなアプリを作りました。今回はこれにOpenNIのSceneAnalyzerを組み合わせてみたので紹介します。動画
こんな感じです。開発環境
- Mac OS X 10.8.2
- プロセッサ:3.06 GHz Intel Core 2 Duo
- メモリ:4GB
- Xcode4.5.1
主要ライブラリ
- boost-1.51.0
- pcl-1.6.0
- OpenNI-Bin-Dev-MacOSX-v1.5.4.0
- 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つのポイントクラウドを生成します。- カラー画像描画のためのポイントクラウド(
cloud_
) - 背景の三角メッシュを算出するためのポイントクラウド(
background_cloud_
) - 人物の三角メッシュを算出するためのポイントクラウド(
object_cloud_
)
object_cloud_
を生成するため、OpenNIのSceneAnalyzerを導入しました。それに関連するコードが11行目から13行目、39行目から44行目にあります。SceneAnalyzerが捉えた物体はフレーム単位で三角メッシュに変換され、ODEに登録されます。一方、背景となる三角メッシュは「m」が押された瞬間のフレームから作られ、それ以降は固定されます。
剛体オブジェクト
前回に引き続き、剛体を記述するためにODEを使用しました。ODEオブジェクトを定義している部分を以下に示します。d
で始まるクラスは全てODEが提供するクラスです。
ODEでは、剛体運動する物体をdBody
のオブジェクトで記述します。また、衝突検出を必要とする物体を、dGeom
のオブジェクトで表現します。今回導入したボールは衝突しながら剛体運動を行います。上記の7、8行目がそれを表しています。ここで、dSphere
はdGeom
の子クラスです。一方、円柱は背景に固定しているので、ボールと衝突するだけでそれ自身は剛体運動を行いません。従って、
dGeom
の子クラスdCylinder
で定義しました(18行目)。
その他、ポイントクラウドから三角メッシュへの変換、三角メッシュのODEへの登録、衝突の検出などは以前のページ、あるいはソースをご覧ください。
0 件のコメント:
コメントを投稿