ここでは物体を落下させる動力学シミュレーションを行う新しい仮想空間を作成します。
インストールしたパッケージのディレクトリ構造は以下のようになります。
sigverse-<version> | |---bin |---include | └----sigverse └---shared └----sigverse |----data | |----xml | └----shape |----etc |----jar └----samples
今回はsigverse-<version>/binを作業場所とします。
簡単なエージェントコントローラを作成します。 エージェントとは仮想世界で自律動作を行う物体のことを言います。 まずSIGVerseの sigverse-<version>/binに移動します。
$ cd ~/sigverse-<version>/bin
ここに新しいディレクトリを作成します。ディレクトリ名は何でも構いません。
$ mkdir NewWorld $ cd NewWorld
emacsまたはviなどのエディタを使ってMoveController.cppファイルを作成します。
$ emacs MoveController.cpp
MoveController.cpp
#include "Controller.h" #include "Logger.h" //Controllerを継承した自作コントローラの定義 class MoveController : public Controller { public: double onAction(ActionEvent&); }; double MoveController::onAction(ActionEvent &evt) { return 5.0; } extern "C" Controller * createController() { return new MoveController; }
これは何もしないコントローラです。5秒ごとに何もしない関数onActionが呼び出されます。
次に作成したコードのコンパイルを行うためのmakefileを作成します。コンパイル時に必要な環境変数をここで設定します。
emacs Makefile
Makefile
#SIGVerseソースの場所指定 SIG_SRC = /home/<username>/sigverse-<version>/include/sigverse #自作コード CPP_SRCS = MoveController.cpp #オブジェクトファイル OBJS = MoveController.so #コンパイルを行います。 $(OBJS): $(CPP_SRCS) g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -I$(SIG_SRC) - I$(SIG_SRC)/comm/controller -fPIC shared -o $@ $<
makeを実行します。
$ make
MoveController.soが作成されていればコンパイル成功です。
仮想世界の設定を記述した世界ファイルを作成します。
世界ファイルはsigverse-<version>/shared/sigverse/xmlに作成します。
$ cd ~/sigverse-<version>/shared/sigverse/xml $ emacs NewWorld.xml
NewWorld.xml
<?xml version="1.0" encoding="utf8"?> <world name="newworld"> <!--重力の設定--> <gravity x="0.0" y="-9.8" z="0.0"/> <!--エージェントToy_Dの設定--> <instanciate class="seToy_D.xml"> <!--エージェント名--> <set-attr-value name="name" value="Toy_D"/> <set-attr-value name="language" value="c++"/> <!--オブジェクトファイルの指定--> <set-attr-value name="implementation" value="./NewWorld/MoveController.so"/> <!--動力学演算フラグ--> <set-attr-value name="dynamics" value="true"/> <!--物体の位置(x,y,z)--> <set-attr-value name="x" value="0.0"/> <set-attr-value name="y" value="18.0"/> <set-attr-value name="z" value="5.0"/> </instanciate>
※ファイル保存時にコードシステムを聞かれたらutf-8を指定してください。
これで準備は完了です。
それではSIGVerseを起動してみます。
$ cd ~/sigverse-<version>/bin $ ./sigserver.sh -w NewWorld.xml -p 9000 : : [SYS] waiting for connection... [SYS] Controller attached to "Toy_D" [SYS] 127.0.0.1 connected [SYS] Toy_D : dataport [SYS] 127.0.0.1 connected
作成した世界ファイルを-wオプションで指定します。(何も指定しないときはMyWorld.xmlが読み込まれます。)
次にSIGViewerを起動してホスト名とポート番号を入力してサーバに接続します。IPフォワーディングによりサーバに接続している場合は、ホスト名をlocalhost、ポート番号は指定したポート番号を入力します。
Connect to SimServerボタンをクリックしてサーバに接続します。
エージェントToy_Dが世界ファイルで記述した位置(0.0, 18.0, 5.0)でスタンバイしている様子が確認できます。SIGVerseではy方向が高さになります。
次にSIM_CTRL_CMDの枠の中がSTARTとなっている状態でSendボタンを押してシミュレーションを開始します。
シミュレーションが開始し、エージェント(toy_D)が地面に落下して弾んでいるのが確認できます。
次にエージェントに力を与えて移動させます。MoveController.cppを修正します。
$ cd NewWorld $ emacs MoveController.cpp
double MoveController::onAction(ActionEvent &evt) { 以降に以下の2行を追加します。
SimObj *obj = getObj(myname()) //自分自身の取得 obj->setForce(0,0,300); //z軸方向に300の力を加える
コンパイルして実行します。
$ make $ cd .. $ ./sigserver.sh -w NewWorld.xml -p 9001
SIGViewerで確認すると、5秒に一回エージェントがz方向に力が加えられて、移動しているのがわかります。