Up:[[Tutorial]] Previous:[[眼球運動]] #contents *キネクトによるエージェントの操作 [#g847337f] キネクトを使ってSIGVerseの人間エージェントの体の動きを操作する方法を紹介します。 ※すでにOpenNIがクライアントpcにインストールされていて、サンプルコードNiUserTrackerが動作可能であることを前提条件とします。 **OpenNI動作確認バージョン [#w7344684] -OpenNI Stable Build for Windows x86 (32-bit) v1.5.2.23 Development Edition --ダウンロードは[[こちら>http://75.98.78.94/Downloads/OpenNIModules.aspx]]。 -PrimeSene NITE Stable Build for Windows x86 (32-bit) v1.5.2.21 Development --上と同じページのOpenNI Compliant Middleware Binariesを選択してダウンロード。 -PrimeSense Sensor Module for OpenNI Version 5.1.0.25 --ダウンロードは[[こちら>https://github.com/avin2/SensorKinect]]。 **クライアント側の準備 [#g906fc36] キネクトにより骨格を抽出するサンプルプログラムを利用し、関節の回転データ(クオータニオン)を計算し、SIGVerseサーバにデータを送信します。 ***ダウンロード [#a9563850] まず、以下のファイルをダウロードします。 #ref(SIGNiUserTracker.sig) ソースコードは[[こちら>#j4c23122]] ***インストール [#m9903252] ダウンロードした実行ファイルをOpenNIサンプルの実行ファイルがあるフォルダに置きます。デフォルトでは以下のフォルダです。 C:\Program Files (x86)\OpenNI\Samples\Bin\Release (※Windows7 64bitの場合) この状態でクライアントpcにキネクトを接続しておけば準備完了です。 **サーバ側の準備 [#y2f178b2] コントローラで関節データを受信し、関節を回転させます。 ***コントローラ [#w4aca122] まずコントローラを作成します。 $ cd ~/sigverse-<version>/bin/NewWorld $ emacs kinectController.cpp kinectController.cpp #highlight(cpp){{ include <string> #include "Controller.h" #include "Logger.h" #include "ControllerEvent.h" #define PI 3.141592 #define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 ) using namespace std; class AgentController : public Controller { public: double onAction(ActionEvent &evt); void onRecvMsg(RecvMsgEvent &evt); void onInit(InitEvent &evt); private: //初期位置 double m_posx, m_posy, m_posz; double m_yrot; double m_range; //データ数(関節数)最大値 int m_maxsize; BaseService *m_kinect; }; void AgentController::onInit(InitEvent &evt) { m_kinect = connectToService("SIGKINECT"); SimObj *my = getObj(myname()); // 初期位置取得 m_posx = my->x(); m_posy = my->y(); m_posz = my->z(); include <string> #include "Controller.h" #include "Logger.h" #include "ControllerEvent.h" #define PI 3.141592 #define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 ) using namespace std; class AgentController : public Controller { public: double onAction(ActionEvent &evt); void onRecvMsg(RecvMsgEvent &evt); void onInit(InitEvent &evt); private: //初期位置 double m_posx, m_posy, m_posz; double m_yrot; double m_range; //データ数(関節数)最大値 int m_maxsize; BaseService *m_kinect; }; void AgentController::onInit(InitEvent &evt) { m_kinect = connectToService("SIGKINECT"); SimObj *my = getObj(myname()); // 初期位置取得 m_posx = my->x(); m_posy = my->y(); m_posz = my->z(); }} このコントローラは人間エージェントを操作するためのものです。 次にMakefileを修正してコンパイルします。 (※動作手順省略) ***他のモデルのコントローラサンプル [#ra789b97] 他のモデルを使う場合はこちらを参照してください。 -[[Robot-nii.xml>キネクトによるエージェントの操作(ロボット)]] -[[Man-nii-v2.xml>キネクトによるエージェントの操作(Man-nii-v2.xml)]](エージェントの初期姿勢がz軸方向を向いていない場合に対応) ***世界ファイルの作成 [#wd8a8474] 次に世界ファイルを作成します。 $ cd .. $ emacs xml/kinectWorld.xml kinectWorld.xml #highlight(xml){{ <?xml version="1.0" encoding="utf8"?> <world name="myworld2"> <!--重力の設定--> <gravity x="0.0" y="-9.8" z="0.0"/> <!--エージェントMan-niiの設定--> <instanciate class="Man-nii.xml"> <!--エージェント名--> <set-attr-value name="name" value="kinect_man"/> <!--C++言語の指定--> <set-attr-value name="language" value="c++"/> <!--オブジェクトファイルkinectController.soの指定--> <set-attr-value name="implementation" value="./NewWorld/kinectController.so"/> <!--動力学演算をfalseに設定--> <set-attr-value name="dynamics" value="false"/> <!--エージェントの位置(x,y,z)--> <set-attr-value name="x" value="0.0"/> <set-attr-value name="y" value="60.0"/> <set-attr-value name="z" value="0.0"/> </instanciate> </world> }} 人間のみが登場するシンプルな世界ファイルです。このサンプルではキネクトで操作できるエージェントは人間エージェントのみです。 **実行 [#scf358ac] それでは実行してみましょう。 ***SIGVerse起動 [#rebb6851] まずシグバースサーバを起動します。 $ ./sigserver.sh -p 9001 -w xml/kinectWorld.xml 次にSIGViewerで起動したサーバに接続します。接続すると人間が立っているのが見えます。"Send"ボタンを押しシミュレーションを開始します。 ***関節データの送信 [#x7693c87] 次に先ほどダウンロードしてOpneNIサンプルの実行ファイルフォルダの中に入れたSIGNiUserTrackerをダブルクリックして実行します。 すると以下のようなコンソール画面が立ち上がります。 #ref(SIGNi_1.JPG) 接続するSIGVerseサーバのホスト名、ポート番号、操作するエージェント名の順に入力していきます。 #ref(SIGNi_2.JPG) 深度画像が表示されたらキネクトの前で以下のようなポーズをとると骨格が検出され、人間エージェントを操作することができるようになります。 #ref(./SIGNi_4.png,50%) 一つのキネクトに対して操作できるエージェントは1エージェントのみです。 複数人数の骨格を抽出した場合2人目以降は無視されます。 **ソースコードのコンパイル [#rc3b6fdb] 次にクライアント側のソースコードをコンパイルする方法を説明します。コンパイルする環境はVC++2008を前提としています。 ***ソースコード取得 [#j4c23122] 以下からソースコードを取得します。 #ref(SIGNiUserTracker.zip) (※2012/2/8更新 人間モデルMan-nii-v2.xmlに対応) 展開したフォルダの中に入っているSIGNiUserTrackerフォルダをOpenNIのサンプルコードがおかれた以下のフォルダに移動します。 C:\Program Files (x86)\OpenNI\Samples ***コンパイル [#j1513ff2] 次にSIGNiUserTrackerフォルダの中のソリューションファイルをダブルクリックして起動します。(※このとき必ず管理者権限で実行します) VC++が起動したらソリューションエクスプローラの中のソリューション名を右クリックしてビルドを選択します。ビルドが成功すると以下に実行ファイルSIGNiUserTracker.exeが作成されます。 C:\Program Files (x86)\OpenNI\Samples\Bin\Debug Up:[[Tutorial]] Previous:[[眼球運動]] #highlight(end)