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: [[キネクトによるエージェントの操作]]