Tutorial?
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を指定してください。
基本的にコントローラはContorollerクラスを継承して作成します。 これは何もしないコントローラです。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_Dが世界ファイルで記述した位置(0.0, 18.0, 5.0)でスタンバイしている様子が確認できます。SIGVerseではy方向が高さになります。
次にSIM_CTRL_CMDの枠の中がSTARTとなっている状態でSendボタンを押してシミュレーションを開始します。
シミュレーションが開始し、エージェント(toy_D)が地面に落下して弾んでいるのが確認できます。
次にエージェントに力を与えて移動させます。MoveController.cppを修正します。
$ cd NewWorld $ emacs MoveController.cpp
onActionの中に以下のコードを追加します。
MoveController.cpp
↓
コンパイルして実行します。
$ make $ cd .. $ ./sigserver.sh -w NewWorld.xml -p 9001
SIGViewerで確認すると、5秒に一回エージェントがz方向に力が加えられて、移動しているのがわかります。
力を与える関数setForce以外にも速度を設定するsetVelocityやトルクを設定するsetTorqueなどもあるのでいろいろ試してみると面白いと思います。
物理演算で用いるオブジェクトの形状は見た目の形状と異なり、sphere,cube, cylinderで近似されています。デフォルトでは見た目と大体同じ形状、大きさに設定されていますが、これらを設定ファイルで修正することができます。
まず、オブジェクトの設定ファイルを編集します。
$ cd ~/sigverse-<version>/share/sigverse/data/xml $ emacs seToy_D.xml
seToy_D.xmlの中の
<body filename="dummy-body.xml"/>
の下に以下のいずれかを追加します。
一辺が10の立方体に設定しました。
sphereに設定する場合は以下のように設定します。
半径10の球に設定しました。
※2011/10時点ではシリンダ形状の代わりにカプセル型形状を作ります。
底面の円の半径3、円筒の高さ10のシリンダーに設定しました。
再度シグバースを実行してエージェントが落下した時や、力を加えた時の動きの違いを確認してみてください。
SIGVerseでは単位系は角度(ラジアン)以外は特に決まっていませんが、このチュートリアルでは世界標準の国際(SI)単位系を用います。
量 | 名称 | 記号 |
長さ | メートル | m |
質量 | キログラム | kg |
時間 | 秒 | s |
角度 | ラジアン | rad |
速度 | メートル毎秒 | m/s |
加速度 | メートル毎秒毎秒 | m/s^2 |
力 | ニュートン | N |
トルク | ニュートン・メートル | Nm |
Up:Tutorial? Previous:テスト実行 Next:人間型エージェントの操作
English version?