Up:Tutorial? Previous:テスト実行 Next:人間型エージェントの操作
このチュートリアルはv2.1.0以降で動作します。v2.0.3以前はこちら。
ここでは物体を落下させる動力学シミュレーションを行う新しい仮想空間を作成します。
インストール先のディレクトリ構造は以下のようになります。
sigverse-<version> | |---bin |---include | +----sigverse +---shared +----sigverse +----data | |----xml | +----shape |----etc |----jar +----samples
sigverse-<version>/shared/sigverse/data/xml の中にSIGVerseに登場可能なロボットやオブジェクトの設定ファイルや世界ファイルのサンプルが置かれています。
sigverse-<version>/shared/sigverse/data/shape の中にX3D,VRMLで書かれた3次元形状モデルのサンプルが置かれています。
まず作業ディレクトリを作成します。 どこでもかまいませんがこのチュートリアルではhomeディレクトリの下にMyWorldというディレクトリを作成します。
SIGVerse作業ディレクトリを作成するにはsigcreate.shを使います
$ cd ~/ $ sigcreate.sh MyWorld
MyWorldディレクトリが作られます。
$ cd MyWorld
この中には世界ファイルやコントローラ、Makefileなどのサンプルが用意されています。
世界ファイルとはSIGVerseに登場するキャラクターやSIGVerse世界の環境を設定することができるファイルです。世界ファイルを作成することにより自分独自の仮想世界を作成することができます。
SIGVerseではC++で書かれたコントローラをSIGVerseエンティティにアタッチすることでエンティティは自律的に行動することができます。ここでは簡単なコントローラの作成方法について説明します。
サンプルとして用意されているコントローラをコンパイルします。 コントローラのコンパイルにはsigmake.shを使います。
$ ./sigmake.sh ControllerSample.cpp
ControllerSample.soが作成されたら成功です。 これは何もしないコントローラです。
コントローラを見てみましょう
$ emacs ControllerSample.cpp
※コメントはチュートリアル用に付け加えました。
基本的にコントローラはContorollerクラスを継承して作成します。 これは何もしないコントローラです。1秒ごとに何もしない関数onActionが呼び出されます。
次に世界ファイルを見てみましょう
$ emacs WorldSample.xml
登場キャラクターとしてseToy_D.xmlが読み込まれます。
seToy_D.xmlは sigverse-<version>/shared/sigverse/data/xmlの中に用意される、エンティティの設定ファイルです。
作成したコントローラの指定は以下のように設定しました。
<set-attr-value name="implementation" value="./ControllerSample.so"/>
それ以外にも仮想世界における重力や、エンティティの名前、位置、質量、dynamics、collisionなどの設定ができます。
それではSIGVerseを起動してみます。
$ sigserver.sh -w ./WorldSample.xml : : [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を起動して接続するホスト名とポート番号を入力し、"Connect"ボタンをクリックしてサーバに接続します。
エージェントToy_Dが位置(0.0, 60.0, 0.0)でスタンバイしている様子が確認できます。SIGViewerでは目印として原点から三軸方向に短い線が伸びており、赤がx軸、黄色がy軸、緑がz軸であることが確認できます。
次に"START"ボタンを押してシミュレーションを開始します。
シミュレーションが開始し、エージェント(toy_D)が地面に落下して弾んでいるのが確認できます。
次にエージェントに力を与えて移動させます。ControllerSample.cppを修正します。
$ emacs ControllerSample.cpp
onActionの中に以下のコードを追加します。
ControllerSample.cpp
↓
コンパイルして実行します。
$ ./sigmake.sh ControllerSample.cpp $ ./sigserver.sh -w NewWorld.xml -p 9001
SIGViewerで確認すると、1秒に一回エージェントが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のシリンダーに設定しました。 ※オブジェクトの大きさを0に設定し、物理演算用の形状を作らないことも可能です。
再度シグバースを実行してエージェントが落下した時や、力を加えた時の動きの違いを確認してみてください。
SIGVerseでは単位系は以下を用います
量 | 名称 | 記号 |
長さ | センチメートル | cm |
質量 | キログラム | kg |
時間 | 秒 | s |
角度 | ラジアン | rad |
速度 | センチメートル毎秒 | cm/s |
加速度 | センチメートル毎秒毎秒 | cm/s^2 |
力 | キログラムセンチメートル毎秒毎秒 | kg・cm/s^2 |
トルク | ニュートン・センチメートル | N・cm |
Up:Tutorial? Previous:テスト実行 Next:人間型エージェントの操作
English version?