- The added line is THIS COLOR.
- The deleted line is THIS COLOR.
#contents
*新規仮想空間の作成 [#c6d40ee5]
ここではボールが弾むというシミュレーションを行う新しい仮想空間を作成します。
**ツリー構造 [#fea2aba6]
インストールしたパッケージのツリー構造は以下のようになります。
*物体が落下する仮想空間の作成 [#c6d40ee5]
ここでは物体を落下させる動力学シミュレーションを行う新しい仮想空間を作成します。
**ディレクトリ構造 [#fea2aba6]
インストールしたパッケージのディレクトリ構造は以下のようになります。
sigverse-<version>
|
|---bin
|---include
| └----sigverse
└---shared
└----sigverse
|----data
| |----xml
| └----shape
|----etc
|----jar
└----samples
今回はsigverse-<version>/binを作業場所とします。
**エージェントコントローラの作成 [#b9411488]
SIGVerseの sigverse-<version>/binに移動します。
簡単なエージェントコントローラを作成します。
エージェントとは仮想世界で自律動作を行う物体のことを言います。
まずSIGVerseの sigverse-<version>/binに移動します。
$ cd ~/sigverse-<version>/bin
ここに新しいディレクトリを作成します。ディレクトリ名は何でも構いません。
$ mkdir NewWorld
$ cd NewWorld
次に簡単なエージェントコントローラを作成します。emacsまたはviなどのエディタを使って MoveController.cppファイルを作成します。
emacsまたはviなどのエディタを使ってMoveController.cppファイルを作成します。
$ emacs MoveController.cpp
MoveController.cpp
#include "Controller.h"
#include "Logger.h"
class MoveController : public Controller {
public:
double onAction(ActionEvent&);
};
double MoveController::onAction(ActionEvent &evt) {
SimObj *obj = getObj(myname());
obj->fz(1000); //z方向に力1000を設定
return 5.0;
}
extern "C" Controller * createController() {
return new MoveController;
}
これは何もしないコントローラです。5秒ごとに何もしない関数onActionが呼び出されます。
**コンパイル [#hf0f4b09]
次に先ほど作成したコードのコンパイルを行うためのmakefileを作成します。コンパイル時に必要な環境変数をここで設定します。
次に作成したコードのコンパイルを行うためのmakefileを作成します。コンパイル時に必要な環境変数をここで設定します。
// emacs make.sh
//make.sh
// #!/bin/sh
// #SIGVerseソースの場所を指定します。
// export SIG_SRC="/home/<username>/sigverse-201003/include/sigverse"
// #コンパイルを行います。
// make clean
// make
emacs Makefile
Makefile
#SIGVerseソースコードの所在
#SIGVerseソースの場所指定
SIG_SRC = /home/<username>/sigverse-<version>/include/sigverse
#自作コード
CPP_SRCS = MoveController.cpp
#オブジェクトファイル
OBJS = MoveController.o
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が作成されていればコンパイル成功です。
**世界ファイルの作成 [#j3bf1bf8]
仮想世界の設定を記述した世界ファイルを作成します。
世界ファイルは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を指定してください。
これで準備は完了です。
**シミュレーション開始[#i190b28d]
それではSIGVerseを起動してみます。
$ ./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ボタンをクリックしてサーバに接続します。
#ref(toy_1.jpg)
次にエージェントToy_Dが世界ファイルで記述した位置(0.0, 18.0, 5.0)でスタンバイしています。
SIM_CTRL_CMDの枠の中がSTARTとなっている状態でSendボタンを押します。