Setting Information

Motion Capture

optitrackの使い方

このページは,研究室内でモーションキャプチャを使うときのHow toをまとめたものです.
なにか問題がありましたら,コメントにてどうぞ.
 

用意するもの

  • Mac Book Pro (Teriyaki)
  • 再帰性反射材つきマーカー
  • キャリブレーション用の棒
  • 原点マーカー

 

カメラのキャリブレーション,原点の設定

  1. Optitrack の USB2つをMac Book Pro に接続
  2. Tracking Toolsを起動
  3. 上部のメニューバーの[View]→[Camera Calibration]
  4. [Start Wanding]をクリック
  5. 下図のようなWarningが出たら,一番左の[Block Markers]を選択し,もう一度,[Start Wanding]をクリック.
    これにより,キャリブレーション用の棒以外の再帰性反射材を無視(マスク)できる.
  6. キャリブレーション用の棒を振り回し,値を入力する.
    それぞれのカメラからの入力が下に表示されるが,これがなるべく色で埋まるようにする.
  7. 十分に値が取れたら,右のウィンドウの[Calculate]をクリック
  8. 十分な時間待って,[Apply Result]をクリック
  9. 下図のようなCalibration Result Reportが出るので,[Apply]をクリック
  10. 適当な場所に,「キャリブレーション用の棒」を振り回した軌跡(“WandingTimeline … ファイル”)を保存
  11. 「原点マーカー」をモーションキャプチャのカメラから見えるところに置き,
    その再帰性反射材の点群をクリックor左ドラッグで選択
  12. 右のウィンドウの[Set Ground Plane]をクリック
  13. 適当な場所に,キャリブレーションの情報(“Calibration …” ファイル)を保存
    saveGround
  14. 上部メニューの[View]→[trackable properties]をクリック
    Trackable-Properties
  15. 「再帰性反射材つきマーカー」をモーションキャプチャのカメラから見えるところに置き
    その再帰性反射材の点群をクリックor左ドラッグで選択
  16. 右ウィンドウの[Create From Selection]をクリック.
  17. 下図のように,「再帰性反射材つきマーカー」のプロパティが表示され,これを追跡することを確定

    ※赤丸で囲んだ,General Properties中のNameプロパティは,VRPN通信(後述)で使用
  18. 右ウィンドウの上部タブ[Real-Time Info]をクリックすると,「再帰性反射材つきマーカー」の位置と姿勢がわかる.
  19. 右ウィンドウの上部タブ[Orientation]をクリックし,
    [Reset To Current Orientation]をクリックすると,「再帰性反射材つきマーカー」の姿勢(yaw, pitch, roll)を初期化できる.

保存した情報を復元

[File]→[Open…]で,”Calibration …” ファイルを開くことで,カメラのCalibration結果を復元できる.

VRPN通信

Tracking Tools側の設定

  1. 上部メニューの[View]→[streaming pane]をクリック
    Streaming-Pane
  2. [Streamint Properties]というウィンドウ中の,[vrpn streaming Engine] 内の[Broadcast Frame Data]にチェックを入れる.
    vrpnCheck
    ※ここで,[VRPN Broadcast Port]の値を覚えておく.上図でいうと,”3883″.

 

Client(再帰性反射材つきマーカーの情報を取得する側)の設定

Visual Stadio で,以下のcppコードを書く.
//==
//== VRPN Sample Application ==–
//==
//== This application listens for a rigid body named ‘Tracker’ on the local machine
//== and displays it’s position and orientation.
//==
//== You’ll also need to download the VRPN distribution files.
//==
//== Includes ==–
#include “vrpn_Connection.h” // Missing this file? Get the latest VRPN distro at
#include “vrpn_Tracker.h” // ftp://ftp.cs.unc.edu/pub/packages/GRIP/vrpn
#include “conio.h” // for kbhit()
//== Callback prototype ==–
void VRPN_CALLBACK handle_pos (void *, const vrpn_TRACKERCB t);
//== Main entry point ==–
int main(int argc, char* argv[])
{
vrpn_Connection *connection;
char connectionName[128];
int port = 3883; //[VRPN Broadcast Port]の値
//”localhost”となっているところにMacbook ProのIPアドレスを指定する.
//有線:192.168.11.57, 無線:192.168.11.23
sprintf(connectionName,”localhost:%d”, port);
connection = vrpn_get_connection_by_name(connectionName);
//”Tracker”の部分は,追跡している「再帰性反射材つきマーカー」のNameプロパティを入力
vrpn_Tracker_Remote *tracker = new vrpn_Tracker_Remote(“Tracker”, connection);
tracker->register_change_handler(NULL, handle_pos);
 
while(!kbhit())
{
tracker->mainloop();
connection->mainloop();
Sleep(5);
}
return 0;
}
//== Position/Orientation Callback ==–
void VRPN_CALLBACK handle_pos (void *, const vrpn_TRACKERCB t)
{
//Positionの値は,1/1000されて送られてくる.
//Orientationの値は,sin(θ/2)?
printf(“Tracker Position:(%.4f,%.4f,%.4f) Orientation:(%.2f,%.2f,%.2f,%.2f)\n”,
t.pos[0], t.pos[1], t.pos[2],
t.quat[0], t.quat[1], t.quat[2], t.quat[3]);
}
 

Quaternion

//コードの一部抜粋
void    MakeCoordinateOpti( double x, double y, double z, double h,
double p, double b )
{
setIdentityMatrix();
rotateZ( h );
rotateY( p );
rotateX( b );
//translate( x, y, z );
}
//各回転メソッドは右手座標系の行列を使用のこと
void    CoordinateConvert(vrpn_TRACKERCB t, VECTOR<double> *pos,
VECTOR<double> *hpb)
{
double x = t.pos[0];
double y = t.pos[1];
double z = t.pos[2];
double qx = t.quat[0];
double qy  = t.quat[1];
double qz  = t.quat[2];
double qw  = t.quat[3];
pos->setDIMENSION(3);
hpb->setDIMENSION(3);
(*pos)[0] = x*1000;
(*pos)[1] = y*1000;
(*pos)[2] = z*1000;
double sqx = qx*qx;
double sqy = qy*qy;
double sqz = qz*qz;
double sqw = qw*qw;
mtstl::MATRIX<double> R(3,3);
// invs (inverse square length) is only required if quaternion is not
already normalised
double invs = 1 / (sqx + sqy + sqz + sqw);
R.Fill(0.0);
R[0][0] = ( sqx – sqy – sqz + sqw)*invs ; // since sqw + sqx + sqy +
sqz =1/invs*invs
R[1][1] = (-sqx – sqy + sqz + sqw)*invs ;
R[2][2] = (-sqx + sqy – sqz + sqw)*invs ;
double tmp1 = qx * qz;
double tmp2 = qy * qw;
R[1][0] = 2.0 * (tmp1 + tmp2)*invs ;
R[0][1] = 2.0 * (tmp1 – tmp2)*invs ;
tmp1 = qx * qy;
tmp2 = qz * qw;
R[2][0] = 2.0 * (tmp1 – tmp2)*invs ;
R[0][2] = 2.0 * (tmp1 + tmp2)*invs ;
tmp1 = qz * qy;
tmp2 = qx * qw;
R[2][1] = 2.0 * (tmp1 + tmp2)*invs ;
R[1][2] = 2.0 * (tmp1 – tmp2)*invs ;
printf(“%lf, %lf, %lf\n”, R[0][0], R[0][1], R[0][2]);
printf(“%lf, %lf, %lf\n”, R[1][0], R[1][1], R[1][2]);
printf(“%lf, %lf, %lf\n”, R[2][0], R[2][1], R[2][2]);
(*hpb)[0] = atan2(R[1][0], R[0][0]);    // Y
(*hpb)[1] = -asin(R[2][0]);                             // Z
(*hpb)[2] = atan2(R[2][1], R[2][2]);    // X
mtstl::MATRIX<double> T(4,4);
T.MakeCoordinateOpti(x, y, z, (*hpb)[0], (*hpb)[1], (*hpb)[2] );
printf(“%lf, %lf, %lf, %lf\n”, T[0][0], T[0][1], T[0][2], T[0][3]);
printf(“%lf, %lf, %lf, %lf\n”, T[1][0], T[1][1], T[1][2], T[1][3]);
printf(“%lf, %lf, %lf, %lf\n”, T[2][0], T[2][1], T[2][2], T[2][3]);
}
 

※通信できてないよ!!って時

1. 双方のコンピュータからpingを打ってみる.(pingが通らない場合は,ネットワークの問題.他のコンピュータからpingしてどちらに問題があるか確認.)
2. セキュリティソフトの通信フィルタリング切った?
3. ポート解放した?
4. Motion Captureを再起動してみよう!!
5. SugimotolabGの方は調子悪いっぽい?