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)

Front page   New List of pages Search Recent changes   Help   RSS of recent changes