Up:Tutorial?     Previous:テスト実行     Next:人間型エージェントの操作


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

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

ディレクトリ構造

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

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

※ファイル保存時にコードシステムを聞かれたら今後すべてutf-8を指定してください。

これは何もしないコントローラです。5秒ごとに何もしない関数onActionが呼び出されます。

コンパイル

次に作成したコードのコンパイルを行うためのmakefileを作成します。

$ emacs Makefile

Makefile

#SIGVerseヘッダファイルの場所指定
SIG_SRC  = /home/<username>/sigverse-<version>/include/sigverse

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

all: $(OBJS)

#コンパイルを行います。
./%.so: ./%.cpp
        g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I$(SIG_SRC) -I$(SIG_SRC)/comm/controller  -fPIC -shared -o $@   $<

※<username>はユーザー名、<version>はバージョン番号に置き換えます。 コマンド行のg++の前のスペースはTabですので注意してください。

makeを実行します。

$ make

MoveController.soが作成されていればコンパイル成功です。

$ ls
Makefile  MoveController.cpp  MoveController.so

世界ファイルの作成

次に仮想世界の設定を記述した世界ファイルを作成します。世界ファイルでは仮想世界に登場するエージェントの設定を行います。

世界ファイルをsigverse-<version>/share/sigverse/data/xmlに作成します。

$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs NewWorld.xml

NewWorld.xml

ここでは動力学シミュレーションを行うため"dynamics"を"true"に設定しました。また、エージェントとしてseToy_D.xmlというファイルを読み込むように設定しています。さまざまなエージェントやエンティティの形状ファイル(x3d,wrlファイル)やそれに付随したxmlファイルがあらかじめ用意されているので、それを用います。

作成したコントローラの指定は以下のように設定しました。

作成したコントローラのパスを指定するときはシグバースを実行する場所(sigserver.shがある場所)からの相対パス、または絶対パスを指定します。

これで準備は完了です。

シミュレーション開始

それではSIGVerseを起動してみます。 sigverseを起動するにはシグバースインストール先の~/sigverse-<version>/binにある シェルスクリプトsigserver.shを使って実行します。

わざわざディレクトリを移動するのが面倒な場合は

$ export PATH=$PATH:/home/<username>/sigverse-<version>/bin

でシェルスクリプトがあるディレクトリのパスを通しておきます。 また、作業場所にこのファイルをコピーして使用することもできます。

$ cd ~/sigverse-<version>/bin
$ ./sigserver.sh -w NewWorld.xml -p 9001
      :
      :
[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が読み込まれます。)

xmlファイルの中で今回作成したコントローラを指定したので、SIGVerseの起動と同時に自動的にエージェント"Toy_D"にアタッチされました。 次にSIGViewerを起動して接続するホスト名とポート番号を入力し、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

onActionの中に以下のコードを追加します。

MoveController.cpp

     ↓

コンパイルして実行します。

$ make
$ cd ..
$ ./sigserver.sh -w NewWorld.xml -p 9001

SIGViewerで確認すると、5秒に一回エージェントがz方向に力が加えられて、移動しているのがわかります。

toy_3.jpg

力を与える関数setForce以外にも加速度を設定するsetAccelやトルクを設定するsetTorqueなどもあるのでいろいろ試してみると面白いと思います。

物理演算用の形状、大きさ、位置の設定

物理演算で用いるオブジェクトの形状は見た目の形状と異なり、sphere,cube, cylinderで近似されています。デフォルトでは見た目と大体同じ形状、大きさに設定されていますが、これらを設定ファイルで修正することができます。

設定ファイル修正

まず、オブジェクトの設定ファイルを編集します。

$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs seToy_D.xml

seToy_D.xmlの中の

 <body filename="dummy-body.xml"/>

の下に以下のいずれかを追加します。

box

一辺が10の立方体に設定しました。

sphere

sphereに設定する場合は以下のように設定します。

半径10の球に設定しました。

cylinder

※2011/10時点ではシリンダ形状の代わりにカプセル型形状を作ります。

底面の円の半径3、円筒の高さ10のシリンダーに設定しました。

実行

再度シグバースを実行してエージェントが落下した時や、力を加えた時の動きの違いを確認してみてください。

Up:Tutorial?     Previous:テスト実行     Next:人間型エージェントの操作

English version?


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