エージェントの関節操作方法

人間またはロボットの形をしたエージェントの関節の操作方法を説明します。

手を上げる

人間が手を上げるサンプルコードを紹介します。

ソースコードの作成

NewWorldディレクトリに新しくAgentController.cppを作成します。

$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs AgentController.cpp

AgentController.cpp

#include "Controller.h"
#include "Logger.h"

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

class AgentController : public Controller
{
public:
  double onAction(ActionEvent &evt);
}; 



double AgentController::onAction(ActionEvent &evt)
{
  try {
    // 自分自身を得る
    SimObj *my = getObj(myname());
    if (!my->dynamics()) { 

     // "LARM_JOINT2" を45度に設定する
      my->setJointAngle("LARM_JOINT2", DEG2RAD(45));

   }

 } catch(SimObj::Exception &) {
   ;
 }

 return 5.0;
}


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

my->setJointAngle("LARM_JOINT2", DEG2RAD(45));で左肩を上に45°に上げます。

コンパイル

Makefileの以下の2行を変更します。

変更前

#自作コード
CPP_SRCS = MoveController.cpp

#オブジェクトファイル
OBJS     = MoveController.so

変更後

#自作コード
CPP_SRCS = AgentController.cpp

#オブジェクトファイル
OBJS     = AgentController.so

コンパイルします。

$ make

世界ファイル作成

次に世界ファイルを作成します。SIGVerse起動時にwオプションで毎回世界ファイルを指定するのは面倒なので、MyWorld.xmlに記述します。

$ cd ~/sigverse-<version>/bin
$ ln -s ../share/sigverse/data/xml/ xml

xmlファイルがあるディレクトリまで遠いのでリンクを貼りました。

$ cp xml/MyWorld.xml xml/MyWorld_org.xml

念のためデフォルトのMyWorld.xmlファイルを残しておきました。

$ emacs xml/MyWorld.xml

MyWorld.xml

<?xml version="1.0" encoding="utf8"?>
<world name="newworld">

<!--重力の設定-->
  <gravity x="0.0" y="-9.8" z="0.0"/>  

<!--エージェントMan-niiの設定-->
  <instanciate class="Man-nii.xml"> 

<!--エージェント名-->
        <set-attr-value name="name" value="man_000"/> 

<!--C++言語の指定-->
        <set-attr-value name="language" value="c++"/> 

<!--オブジェクトファイルAgentController.soの指定-->
        <set-attr-value name="implementation"
value="./NewWorld/AgentController.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="50.0"/>
       <set-attr-value name="z" value="0.0"/>

</instanciate>

エージェントとしてMan-nii.xmlを読み込むように設定し、動力学演算をfalseにしました。

SIGVerse起動

それではSIGVerseを起動してみましょう。

$ ./sigserver.sh -p 9001

SIGViewerを起動して見てみると人間のエージェントが手を広げてスタンバイしていると思います。 シミュレーションを開始するとエージェントの左腕が45°上がります。

man_1.jpg

今回setJointAngleという関数を用いて"LARM_JOINT2" を45°にする設定を行いました。"LARM_JOINT2"は左肩のz軸での回転として定義された関節の名前です。同様に"LARM_JOINT0","LARM_JOINT1"はそれぞれ左肩のx軸、y軸の回転として定義されています。これらの関節はsigverse-<version>/share/sigverse/data/shape/にあるx3dファイルで定義されています。


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