キネクトによるエージェントの操作(v2.0系)
[
Front page
] [
New
|
List of pages
|
Search
|
Recent changes
|
Help
]
Start:
Up:[[Tutorial]] Previous:[[眼球運動]] Next: [...
#contents
*キネクトによるエージェントの操作 [#g847337f]
キネクトを使ってSIGVerseの人間エージェントの体の動きを操...
※すでにOpenNIがクライアントpcにインストールされていて、サ...
**OpenNI動作確認バージョン [#w7344684]
-OpenNI Stable Build for Windows x86 (32-bit) v1.5.2.23 D...
--ダウンロードは[[こちら>http://75.98.78.94/Downloads/Ope...
-PrimeSene NITE Stable Build for Windows x86 (32-bit) v1....
--上と同じページのOpenNI Compliant Middleware Binariesを...
-PrimeSense Sensor Module for OpenNI Version 5.1.0.25
--ダウンロードは[[こちら>https://github.com/avin2/SensorK...
**クライアント側の準備 [#g906fc36]
キネクトにより骨格を抽出するサンプルプログラムを利用し、...
***ダウンロード [#a9563850]
[[KINECTサービス]]からSIGNiUserTracker_<version>.zipをダ...
//#ref(SIGNiUserTracker.sig)
//ソースコードは[[こちら>#j4c23122]]
***インストール [#m9903252]
ダウンロードしたzipファイルを展開しSIGNiUserTracker.sigを...
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",9005);
SimObj *my = getObj(myname());
// 初期位置取得 ...
m_posx = my->x();
m_posy = my->y();
m_posz = my->z();
// 初期姿勢(回転)取得 ...
double qw = my->qw();
double qy = my->qy();
m_yrot = acos(fabs(qw))*2;
if(qw*qy > 0)
m_yrot = -1*m_yrot;
m_range = 0.1;
m_maxsize = 15;
}
double AgentController::onAction(ActionEvent &evt)
{
return 10.0;
}
void AgentController::onRecvMsg(RecvMsgEvent &evt)
{
std::string sender = evt.getSender();
//自分自身の取得 ...
SimObj *my = getObj(myname());
//メッセージ取得 ...
char *all_msg = (char*)evt.getMsg();
char *msg = strtok(all_msg," ");
if(strcmp(msg,"KINECT_DATA") == 0)
{
int i = 0;
while(true)
{
i++;
if(i == m_maxsize+1) break;
char *type = strtok(NULL,":");
//体の位置 ...
if(strcmp(type,"POSITION") == 0)
{
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
//キネクト座標からSIGVerse座標への変換 ...
double gx = cos(m_yrot)*x - sin(m_yrot)*z;
double gz = sin(m_yrot)*x + cos(m_yrot)*z;
my->setPosition(m_posx+gx,m_posy+y,m_posz+g...
continue;
}
//体全体の回転 ...
else if(strcmp(type,"WAIST") == 0)
{
double w = atof(strtok(NULL,","));
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
my->setJointQuaternion("ROOT_JOINT0",w,x,y,...
continue;
}
else if(strcmp(type,"END") == 0) break;
//関節の回転 ...
else
{
double w = atof(strtok(NULL,","));
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
double angle = acos(w)*2;
double tmp = sin(angle/2);
double vx = x/tmp;
double vy = y/tmp;
double vz = z/tmp;
double len = sqrt(vx*vx+vy*vy+vz*vz);
if(len < (1 - m_range) || (1 + m_range) < l...
my->setJointQuaternion(type,w,x,y,z);
continue;
}
}
}
}
extern "C" Controller * createController ()
{
return new AgentController;
}
}}
このコントローラは人間エージェントを操作するためのもので...
このサンプルではサービスプロバイダ用にポート番号9005番を...
SSH接続によりサーバに接続している場合は追加でポートフォワ...
次にMakefileを修正してコンパイルします。
(※動作手順省略)
***他のモデルのコントローラサンプル [#ra789b97]
※準備中
//-[[Robot-nii.xml>キネクトによるエージェントの操作(ロボ...
//-[[Man-nii-v2.xml>キネクトによるエージェントの操作(Man-...
***世界ファイルの作成 [#wd8a8474]
次に世界ファイルを作成します。
$ cd ..
$ emacs xml/kinectWorld.xml
kinectWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld2">
<!--重力の設定-->
<gravity x="0.0" y="-980.7" 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で起動したサーバに接続します。接続すると人間...
***サービスの登録 [#x7693c87]
SIGViewerにサービスを登録します。左上のメニューのService...
#ref(SIGNi_1.PNG)
すると以下のようなウィンドウが立ち上がるのでAddボタンを押...
#ref(./SIGNi_2.PNG,80%)
Service listにSIGNiUserTracker.sigが登録されたらOKボタン...
次にメニューのService→Startをクリックし、先ほど登録したSI...
''このとき必ず"START"ボタンを押す前にサービスを起動してく...
キネクトの深度画像ウィンドウが立ち上がり、サーバ側で
[SYS] Service: "SIGKINECT" is available
と表示されればキネクトサービスの立ち上げに成功です。
それでは"START"ボタンを押してシミュレーションを開始してみ...
キネクトの前で体を動かすと骨格が検出され、人間エージェン...
#ref(./SIGNi_3.PNG,40%)
**ソースコードのコンパイル [#rc3b6fdb]
次にクライアント側のソースコードをコンパイルする方法を説...
***ソースコード取得 [#j4c23122]
[[KINECTサービス]]からソースコードを取得します。
//#ref(SIGNiUserTracker_1-0-0.zip)
展開したフォルダの中に入っているSIGNiUserTrackerフォルダ...
C:\Program Files (x86)\OpenNI\Samples
***コンパイル [#j1513ff2]
次にSIGNiUserTrackerフォルダの中のソリューションファイル...
※バージョン1.0.0の場合はコンパイルにはboostライブラリのイ...
boostのインストール方法とVC++の設定方法は省略します。
VC++が起動したらソリューションエクスプローラの中のソリュ...
C:\Program Files (x86)\OpenNI\Samples\Bin\Release
拡張子を.exeから.sigに変えることによりSIGViewerに登録可能...
*Old Version [#g8ea554a]
-[[キネクトによるエージェントの操作(v120330, v1.4.8)]]
Up:[[Tutorial]] Previous:[[眼球運動]] Next: [[...
#highlight(end)
End:
Up:[[Tutorial]] Previous:[[眼球運動]] Next: [...
#contents
*キネクトによるエージェントの操作 [#g847337f]
キネクトを使ってSIGVerseの人間エージェントの体の動きを操...
※すでにOpenNIがクライアントpcにインストールされていて、サ...
**OpenNI動作確認バージョン [#w7344684]
-OpenNI Stable Build for Windows x86 (32-bit) v1.5.2.23 D...
--ダウンロードは[[こちら>http://75.98.78.94/Downloads/Ope...
-PrimeSene NITE Stable Build for Windows x86 (32-bit) v1....
--上と同じページのOpenNI Compliant Middleware Binariesを...
-PrimeSense Sensor Module for OpenNI Version 5.1.0.25
--ダウンロードは[[こちら>https://github.com/avin2/SensorK...
**クライアント側の準備 [#g906fc36]
キネクトにより骨格を抽出するサンプルプログラムを利用し、...
***ダウンロード [#a9563850]
[[KINECTサービス]]からSIGNiUserTracker_<version>.zipをダ...
//#ref(SIGNiUserTracker.sig)
//ソースコードは[[こちら>#j4c23122]]
***インストール [#m9903252]
ダウンロードしたzipファイルを展開しSIGNiUserTracker.sigを...
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",9005);
SimObj *my = getObj(myname());
// 初期位置取得 ...
m_posx = my->x();
m_posy = my->y();
m_posz = my->z();
// 初期姿勢(回転)取得 ...
double qw = my->qw();
double qy = my->qy();
m_yrot = acos(fabs(qw))*2;
if(qw*qy > 0)
m_yrot = -1*m_yrot;
m_range = 0.1;
m_maxsize = 15;
}
double AgentController::onAction(ActionEvent &evt)
{
return 10.0;
}
void AgentController::onRecvMsg(RecvMsgEvent &evt)
{
std::string sender = evt.getSender();
//自分自身の取得 ...
SimObj *my = getObj(myname());
//メッセージ取得 ...
char *all_msg = (char*)evt.getMsg();
char *msg = strtok(all_msg," ");
if(strcmp(msg,"KINECT_DATA") == 0)
{
int i = 0;
while(true)
{
i++;
if(i == m_maxsize+1) break;
char *type = strtok(NULL,":");
//体の位置 ...
if(strcmp(type,"POSITION") == 0)
{
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
//キネクト座標からSIGVerse座標への変換 ...
double gx = cos(m_yrot)*x - sin(m_yrot)*z;
double gz = sin(m_yrot)*x + cos(m_yrot)*z;
my->setPosition(m_posx+gx,m_posy+y,m_posz+g...
continue;
}
//体全体の回転 ...
else if(strcmp(type,"WAIST") == 0)
{
double w = atof(strtok(NULL,","));
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
my->setJointQuaternion("ROOT_JOINT0",w,x,y,...
continue;
}
else if(strcmp(type,"END") == 0) break;
//関節の回転 ...
else
{
double w = atof(strtok(NULL,","));
double x = atof(strtok(NULL,","));
double y = atof(strtok(NULL,","));
double z = atof(strtok(NULL," "));
double angle = acos(w)*2;
double tmp = sin(angle/2);
double vx = x/tmp;
double vy = y/tmp;
double vz = z/tmp;
double len = sqrt(vx*vx+vy*vy+vz*vz);
if(len < (1 - m_range) || (1 + m_range) < l...
my->setJointQuaternion(type,w,x,y,z);
continue;
}
}
}
}
extern "C" Controller * createController ()
{
return new AgentController;
}
}}
このコントローラは人間エージェントを操作するためのもので...
このサンプルではサービスプロバイダ用にポート番号9005番を...
SSH接続によりサーバに接続している場合は追加でポートフォワ...
次にMakefileを修正してコンパイルします。
(※動作手順省略)
***他のモデルのコントローラサンプル [#ra789b97]
※準備中
//-[[Robot-nii.xml>キネクトによるエージェントの操作(ロボ...
//-[[Man-nii-v2.xml>キネクトによるエージェントの操作(Man-...
***世界ファイルの作成 [#wd8a8474]
次に世界ファイルを作成します。
$ cd ..
$ emacs xml/kinectWorld.xml
kinectWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld2">
<!--重力の設定-->
<gravity x="0.0" y="-980.7" 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で起動したサーバに接続します。接続すると人間...
***サービスの登録 [#x7693c87]
SIGViewerにサービスを登録します。左上のメニューのService...
#ref(SIGNi_1.PNG)
すると以下のようなウィンドウが立ち上がるのでAddボタンを押...
#ref(./SIGNi_2.PNG,80%)
Service listにSIGNiUserTracker.sigが登録されたらOKボタン...
次にメニューのService→Startをクリックし、先ほど登録したSI...
''このとき必ず"START"ボタンを押す前にサービスを起動してく...
キネクトの深度画像ウィンドウが立ち上がり、サーバ側で
[SYS] Service: "SIGKINECT" is available
と表示されればキネクトサービスの立ち上げに成功です。
それでは"START"ボタンを押してシミュレーションを開始してみ...
キネクトの前で体を動かすと骨格が検出され、人間エージェン...
#ref(./SIGNi_3.PNG,40%)
**ソースコードのコンパイル [#rc3b6fdb]
次にクライアント側のソースコードをコンパイルする方法を説...
***ソースコード取得 [#j4c23122]
[[KINECTサービス]]からソースコードを取得します。
//#ref(SIGNiUserTracker_1-0-0.zip)
展開したフォルダの中に入っているSIGNiUserTrackerフォルダ...
C:\Program Files (x86)\OpenNI\Samples
***コンパイル [#j1513ff2]
次にSIGNiUserTrackerフォルダの中のソリューションファイル...
※バージョン1.0.0の場合はコンパイルにはboostライブラリのイ...
boostのインストール方法とVC++の設定方法は省略します。
VC++が起動したらソリューションエクスプローラの中のソリュ...
C:\Program Files (x86)\OpenNI\Samples\Bin\Release
拡張子を.exeから.sigに変えることによりSIGViewerに登録可能...
*Old Version [#g8ea554a]
-[[キネクトによるエージェントの操作(v120330, v1.4.8)]]
Up:[[Tutorial]] Previous:[[眼球運動]] Next: [[...
#highlight(end)
Page: