物体が落下する仮想空間の作成

ここでは物体を落下させる動力学シミュレーションを行う新しい仮想空間を作成します。

ディレクトリ構造

インストールしたパッケージのディレクトリ構造は以下のようになります。

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_1.jpg

エージェントToy_Dが世界ファイルで記述した位置(0.0, 18.0, 5.0)でスタンバイしている様子が確認できます。SIGVerseではy方向が高さになります。

次にSIM_CTRL_CMDの枠の中がSTARTとなっている状態でSendボタンを押してシミュレーションを開始します。

toy_2.jpg

シミュレーションが開始し、エージェント(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方向に力が加えられて、移動しているのがわかります。


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