Up:[[Tutorial]]    Previous:[[距離センサ]]    Next: [[キネクトによるエージェントの操作]]      
#contents

*眼球運動 [#r8deca10]
人間が目玉を動かすサンプルを紹介します。

**コントローラ作成 [#pa99c726]
コントローラを作成します。

 $ emacs moveEye.cpp

#highlight(cpp){{
#include "ControllerEvent.h"
#include "Controller.h"
#include "Logger.h"

#define PI 3.141592
#define DEG2RAD(DEG) ( (PI) * (DEG) / 180.0 )

using namespace std;

class MyController : public Controller {
public:
  void onInit(InitEvent &evt);
  double onAction(ActionEvent&);
  void onRecvMsg(RecvMsgEvent &evt);
  void onCollision(CollisionEvent &evt);
};

void MyController::onInit(InitEvent &evt) {
}

double MyController::onAction(ActionEvent &evt) {
  return 1.0;
}

void MyController::onRecvMsg(RecvMsgEvent &evt) {

  //取得したメッセージを表示します
  string msg = evt.getMsg();
  LOG_MSG(("msg : %s", msg.c_str()));
  SimObj *my = getObj(myname());

  if(strstr(msg.c_str()," "))
    {
      // phi theta に分ける 
      int n = 0;
      n = msg.find(" ");
      string phi_s = msg.substr(0,n);
      string theta_s = msg.substr(n+1);

      double phi = atof(theta_s.c_str());
      double theta = atof(phi_s.c_str());

      // 目玉関節を回転させる
      my->setJointAngle("LEYE_JOINT1",DEG2RAD(phi));
      my->setJointAngle("REYE_JOINT1",DEG2RAD(phi));
      my->setJointAngle("LEYE_JOINT0",DEG2RAD(theta));
      my->setJointAngle("REYE_JOINT0",DEG2RAD(theta));
    }
}
void MyController::onCollision(CollisionEvent &evt) {
}

extern "C" Controller * createController() {
  return new MyController;
}

}}

このコントローラは目玉を動かすサンプルです。
目を動かす方法は普通の関節を動かす方法と同じでsetJointAngleを使います。
横方向の回転角度と縦方向の回転角度をメッセージとして受信すると目玉を動かします。

コンパイルします。
 $ ./sigmake.sh moveEye.cpp

**世界ファイル [#k6e08594]
世界ファイルを作成します。
 $ emacs moveEye.xml

#highlight(cpp){{
<?xml version="1.0" encoding="utf8"?>
 <world name="newworld">

   <gravity x="0.0" y="-980.7" z="0.0"/>

   <instanciate class="Man-nii.xml">
     <set-attr-value name="name" value="man_0"/>
     <set-attr-value name="language" value="c++"/>
     <set-attr-value name="implementation"
                     value="./moveEye.so"/>
     <set-attr-value name="dynamics" value="false"/>
     <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>
}}

人間だけが登場するシンプルな世界ファイルです。

**実行 [#bfeada84]

それでは実行してみましょう。

 $ sigserver.sh -w ./moveEye.xml

ビューワーで接続すると人間が立っています。
例えばメッセージ"20 10"と送信すると人間エージェントは横方向に20°、縦方向に10°目玉を回転させます。

#ref(./moveEye.PNG,40%)

#highlight(end)

*Old Version [#bac32fb8]
-[[眼球運動(v1.4.8)]]

Up:[[Tutorial]]    Previous:[[距離センサ]]    Next: [[キネクトによるエージェントの操作]]         


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