Up:Tutorial? 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 ↓ 定期的に呼び出される関数onActionでエンティティに力を加えます。 コンパイルして実行します。 $ ./sigmake.sh ControllerSample.cpp $ sigserver.sh -w ./WorldSample.xml SIGViewerで確認すると、1秒に一回エージェントがz方向に力が加えられて、移動しているのがわかります。 力を与える関数setForce以外にも速度を設定するsetLinearVelocityやトルクを設定するsetTorqueなどもあるのでいろいろ試してみると面白いと思います。 衝突判定用の形状、大きさ、位置の設定 †衝突判定で用いるオブジェクトの形状は見た目の形状と異なり、球,Box,円柱で近似されています。衝突判定形状は見た目の形状から自動的に推定されます。 衝突判定形状の確認 †この衝突判定用の形状をビューワーで見ることができます。 ビューワーでオブジェクトを表示している状態でメニューバーのOptionをクリックし、Dynamics viewをクリックします。 転がっているオブジェクトの衝突判定用形状を見ることができます。 ペンギンキャラクターは球とみなされ物理シミュレーションが行われます。 形状の設定 †物理シミュレーションに使われる形状を少し変えてみます。 まずエンティティの設定ファイルを作業ディレクトリにコピーします。 $ cp ~/sigverse-<version>/share/sigverse/data/xml/seToy_D.xml . エンティティ設定ファイルを編集します。 $ emacs seToy_D.xml seToy_D.xmlの中の <body filename="dummy-body.xml"/> の下に以下のいずれかを追加します。 box †一辺が10の立方体に設定しました。 sphere †sphereに設定する場合は以下のように設定します。 半径10の球に設定しました。 cylinder †底面の円の半径3、円筒の高さ10のシリンダーに設定しました。 実行 †再度シグバースを実行してエージェントが落下した時や、力を加えた時の動きの違いを確認してみてください。 単位系 †SIGVerseでは単位系は以下を用います
Old version †Up:Tutorial? Next:人間型エージェントの操作
Counter: 3484,
today: 1,
yesterday: 0
|