動力学シミュレーションのサンプル(v2.0系)
[
Front page
] [
New
|
List of pages
|
Search
|
Recent changes
|
Help
]
Start:
Up:[[Tutorial]] Previous:[[テスト実行]] ...
----
#contents
*物体が落下する仮想空間の作成 [#c6d40ee5]
ここでは物体を落下させる動力学シミュレーションを行う新し...
**ディレクトリ構造 [#fea2aba6]
インストールしたパッケージのディレクトリ構造は以下のよう...
sigverse-<version>
|
|---bin
|---include
| +----sigverse
+---shared
+----sigverse
+----data
| |----xml
| +----shape
|----etc
|----jar
+----samples
まず自分の好きな場所(たとえばホームディレクトリ)にディ...
※このチュートリアルではsigverse-<version>/binに新しくディ...
**コントローラとは [#c3a3fbd9]
SIGVerseではC++で書かれたコントローラをSIGVerseエンティテ...
**エージェントコントローラの作成 [#b9411488]
エージェントとは仮想世界で自律動作を行う物体のことを言い...
まずSIGVerseの sigverse-<version>/binに移動します。
$ cd ~/sigverse-<version>/bin
ここに新しいディレクトリを作成します。
$ mkdir NewWorld
$ cd NewWorld
emacsまたはviなどのエディタを使ってMoveController.cppファ...
$ emacs MoveController.cpp
MoveController.cpp
#highlight(cpp){{
#include "ControllerEvent.h"
#include "Controller.h"
#include "Logger.h"
//ControllerのサブクラスMoveControllerの宣言します ...
class MoveController : public Controller {
public:
//シミュレーション開始時に一度だけ呼出される関数onInit...
void onInit(InitEvent &evt);
//定期的な処理を行うonActionの利用を宣言します ...
double onAction(ActionEvent&);
//メッセージ受信時に呼び出されます
void onRecvMsg(RecvMsgEvent &evt);
};
void MoveController::onInit(InitEvent &evt) {
}
double MoveController::onAction(ActionEvent &evt) {
return 5.0; //次にonActionが呼ばれるまでの時間を返...
}
void MoveController::onRecvMsg(RecvMsgEvent &evt) {
}
//自身のインスタンスをSIGVerseに返します。 ...
extern "C" Controller * createController() {
return new MoveController;
}
}}
※ファイル保存時にコードシステムを聞かれたら今後すべてutf-...
基本的にコントローラはContorollerクラスを継承して作成しま...
これは何もしないコントローラです。5秒ごとに何もしない関数...
**コンパイル [#hf0f4b09]
次に作成したコードのコンパイルを行うためのmakefileを作成...
// emacs make.sh
//make.sh
// #!/bin/sh
// #SIGVerseソースの場所を指定します。
// export SIG_SRC="/home/<username>/sigverse-201003/inclu...
// #コンパイルを行います。
// make clean
// make
$ emacs Makefile
Makefile
#SIGVerseヘッダファイルの場所指定
SIG_SRC = ../../include/sigverse
#オブジェクトファイルの指定
OBJS = MoveController.so
all: $(OBJS)
#コンパイルを行います。
./%.so: ./%.cpp
g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I...
※コマンド行のg++の前のスペースはTabですので注意してくださ...
makeを実行します。
$ make
MoveController.soが作成されていればコンパイル成功です。
$ ls
Makefile MoveController.cpp MoveController.so
**世界ファイルの作成 [#j3bf1bf8]
次に仮想世界の設定を記述した世界ファイルを作成します。世...
世界ファイルをsigverse-<version>/share/sigverse/data/xml...
$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs NewWorld.xml
NewWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld1">
<!--重力の設定-->
<gravity x="0.0" y="-980.7" z="0.0"/>
<!--エージェントToy_Dのインスタンス作成-->
<instanciate class="seToy_D.xml">
<!--エージェント名-->
<set-attr-value name="name" value="Toy_D"/>
<!--C++言語の指定-->
<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="100.0"/>
<set-attr-value name="z" value="0.0"/>
<!--エージェントの質量設定-->
<set-attr-value name="mass" value="1.0"/>
<!--衝突判定ON-->
<set-attr-value name="collision" value="true"/>
</instanciate>
</world>
}}
ここでは動力学シミュレーションを行うため"dynamics"を"true...
エージェントとしてはseToy_D.xmlというファイルを読み込むよ...
作成したコントローラの指定は以下のように設定しました。
#highlight(xml:firstline[18]){{
<set-attr-value name="implementation" value="./N...
}}
作成したコントローラのパスを指定するときはシグバースを実...
これで準備は完了です。
**シミュレーション開始[#i190b28d]
それではSIGVerseを起動してみます。
sigverseを起動するにはシグバースインストール先の~/sigvers...
シェルスクリプトsigserver.shを使って実行します。
わざわざディレクトリを移動するのが面倒な場合は
$ export PATH=$PATH:/home/<username>/sigverse-<version>/...
でシェルスクリプトがあるディレクトリのパスを通しておきま...
また、作業場所にこのファイルをコピーして使用することもで...
$ 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オプションで作成した世界ファイルを指定します。(...
xmlファイルの中で今回作成したコントローラを指定したので、...
次にSIGViewerを起動して接続するホスト名とポート番号を入力...
#ref(./toy_1.PNG,40%)
エージェントToy_Dが世界ファイルで記述した位置(0.0, 100.0,...
次に"START"ボタンを押してシミュレーションを開始します。
シミュレーションが開始し、エージェント(toy_D)が地面に落...
*エージェントの移動 [#z54adf9a]
次にエージェントに力を与えて移動させます。MoveController....
$ cd NewWorld
$ emacs MoveController.cpp
onActionの中に以下のコードを追加します。
MoveController.cpp
#highlight(cpp:firstline[13]){{
double MoveController::onAction(ActionEvent &evt) {
return 5.0; //次にonActionが呼ばれるまでの時間を...
}
}}
↓
#highlight(cpp:firstline[13]){{
double MoveController::onAction(ActionEvent &evt) {
SimObj *obj = getObj(myname()); //自分自身の取得
obj->addForce(0,0,5000); //z軸方向に5000[kg・c...
return 1.0; //次にonActionが呼ばれるまでの時間を...
}
}}
コンパイルして実行します。
$ make
$ cd ..
$ ./sigserver.sh -w NewWorld.xml -p 9001
SIGViewerで確認すると、1秒に一回エージェントがz方向に力...
#ref(toy_3.jpg)
力を与える関数setForce以外にも速度を設定するsetVelocityや...
*物理演算用の形状、大きさ、位置の設定 [#n6779cdb]
物理演算で用いるオブジェクトの形状は見た目の形状と異なり...
**設定ファイル修正 [#ofb6b204]
まず、オブジェクトの設定ファイルを編集します。
$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs seToy_D.xml
seToy_D.xmlの中の
<body filename="dummy-body.xml"/>
の下に以下のいずれかを追加します。
***box [#b90fa015]
#highlight(xml:nogutter){{
<!--形状をboxに設定します。-->
<simpleShape type="box">
<!--物理演算形状の位置(見た目の形状からのずれ)を設定し...
<position x="0" y="0" z="0"/>
<!--物理演算用の形状のサイズを設定します。-->
<size sx="10" sy="10" sz="10"/>
</simpleShape>
}}
一辺が10の立方体に設定しました。
***sphere [#f0404294]
sphereに設定する場合は以下のように設定します。
#highlight(xml:nogutter){{
<simpleShape type="sphere">
<position x="0" y="0" z="0"/>
<size r="10"/>
</simpleShape>
}}
半径10の球に設定しました。
***cylinder [#z94a7687]
#highlight(xml:nogutter){{
<simpleShape type="cylinder">
<position x="0" y="0" z="0"/>
<size r="3" h="10"/>
</simpleShape>
}}
※2011/10時点ではシリンダ形状の代わりにカプセル型形状を作...
底面の円の半径3、円筒の高さ10のシリンダーに設定しました。
※オブジェクトの大きさを0に設定し、物理演算用の形状を作ら...
**実行 [#r537a2f8]
再度シグバースを実行してエージェントが落下した時や、力を...
*単位系 [#c72a1e70]
SIGVerseでは単位系は以下を用います
|量|名称|記号|
|長さ|センチメートル|cm|
|質量|キログラム|kg|
|時間|秒|s|
|角度|ラジアン|rad|
|速度|センチメートル毎秒|cm/s|
|加速度|センチメートル毎秒毎秒|cm/s^2|
|力|キログラムセンチメートル毎秒毎秒|kg・cm/s^2|
|トルク|ニュートン・センチメートル|N・cm|
*Old version [#s7e27ae3]
-[[動力学シミュレーションのサンプル(v120330, v1.4.8)]]
Up:[[Tutorial]] Previous:[[テスト実行]] ...
[[English version>Samples/Control of humanoid agent]]
#highlight(end)
End:
Up:[[Tutorial]] Previous:[[テスト実行]] ...
----
#contents
*物体が落下する仮想空間の作成 [#c6d40ee5]
ここでは物体を落下させる動力学シミュレーションを行う新し...
**ディレクトリ構造 [#fea2aba6]
インストールしたパッケージのディレクトリ構造は以下のよう...
sigverse-<version>
|
|---bin
|---include
| +----sigverse
+---shared
+----sigverse
+----data
| |----xml
| +----shape
|----etc
|----jar
+----samples
まず自分の好きな場所(たとえばホームディレクトリ)にディ...
※このチュートリアルではsigverse-<version>/binに新しくディ...
**コントローラとは [#c3a3fbd9]
SIGVerseではC++で書かれたコントローラをSIGVerseエンティテ...
**エージェントコントローラの作成 [#b9411488]
エージェントとは仮想世界で自律動作を行う物体のことを言い...
まずSIGVerseの sigverse-<version>/binに移動します。
$ cd ~/sigverse-<version>/bin
ここに新しいディレクトリを作成します。
$ mkdir NewWorld
$ cd NewWorld
emacsまたはviなどのエディタを使ってMoveController.cppファ...
$ emacs MoveController.cpp
MoveController.cpp
#highlight(cpp){{
#include "ControllerEvent.h"
#include "Controller.h"
#include "Logger.h"
//ControllerのサブクラスMoveControllerの宣言します ...
class MoveController : public Controller {
public:
//シミュレーション開始時に一度だけ呼出される関数onInit...
void onInit(InitEvent &evt);
//定期的な処理を行うonActionの利用を宣言します ...
double onAction(ActionEvent&);
//メッセージ受信時に呼び出されます
void onRecvMsg(RecvMsgEvent &evt);
};
void MoveController::onInit(InitEvent &evt) {
}
double MoveController::onAction(ActionEvent &evt) {
return 5.0; //次にonActionが呼ばれるまでの時間を返...
}
void MoveController::onRecvMsg(RecvMsgEvent &evt) {
}
//自身のインスタンスをSIGVerseに返します。 ...
extern "C" Controller * createController() {
return new MoveController;
}
}}
※ファイル保存時にコードシステムを聞かれたら今後すべてutf-...
基本的にコントローラはContorollerクラスを継承して作成しま...
これは何もしないコントローラです。5秒ごとに何もしない関数...
**コンパイル [#hf0f4b09]
次に作成したコードのコンパイルを行うためのmakefileを作成...
// emacs make.sh
//make.sh
// #!/bin/sh
// #SIGVerseソースの場所を指定します。
// export SIG_SRC="/home/<username>/sigverse-201003/inclu...
// #コンパイルを行います。
// make clean
// make
$ emacs Makefile
Makefile
#SIGVerseヘッダファイルの場所指定
SIG_SRC = ../../include/sigverse
#オブジェクトファイルの指定
OBJS = MoveController.so
all: $(OBJS)
#コンパイルを行います。
./%.so: ./%.cpp
g++ -DCONTROLLER -DNDEBUG -DUSE_ODE -DdDOUBLE -I...
※コマンド行のg++の前のスペースはTabですので注意してくださ...
makeを実行します。
$ make
MoveController.soが作成されていればコンパイル成功です。
$ ls
Makefile MoveController.cpp MoveController.so
**世界ファイルの作成 [#j3bf1bf8]
次に仮想世界の設定を記述した世界ファイルを作成します。世...
世界ファイルをsigverse-<version>/share/sigverse/data/xml...
$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs NewWorld.xml
NewWorld.xml
#highlight(xml){{
<?xml version="1.0" encoding="utf8"?>
<world name="myworld1">
<!--重力の設定-->
<gravity x="0.0" y="-980.7" z="0.0"/>
<!--エージェントToy_Dのインスタンス作成-->
<instanciate class="seToy_D.xml">
<!--エージェント名-->
<set-attr-value name="name" value="Toy_D"/>
<!--C++言語の指定-->
<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="100.0"/>
<set-attr-value name="z" value="0.0"/>
<!--エージェントの質量設定-->
<set-attr-value name="mass" value="1.0"/>
<!--衝突判定ON-->
<set-attr-value name="collision" value="true"/>
</instanciate>
</world>
}}
ここでは動力学シミュレーションを行うため"dynamics"を"true...
エージェントとしてはseToy_D.xmlというファイルを読み込むよ...
作成したコントローラの指定は以下のように設定しました。
#highlight(xml:firstline[18]){{
<set-attr-value name="implementation" value="./N...
}}
作成したコントローラのパスを指定するときはシグバースを実...
これで準備は完了です。
**シミュレーション開始[#i190b28d]
それではSIGVerseを起動してみます。
sigverseを起動するにはシグバースインストール先の~/sigvers...
シェルスクリプトsigserver.shを使って実行します。
わざわざディレクトリを移動するのが面倒な場合は
$ export PATH=$PATH:/home/<username>/sigverse-<version>/...
でシェルスクリプトがあるディレクトリのパスを通しておきま...
また、作業場所にこのファイルをコピーして使用することもで...
$ 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オプションで作成した世界ファイルを指定します。(...
xmlファイルの中で今回作成したコントローラを指定したので、...
次にSIGViewerを起動して接続するホスト名とポート番号を入力...
#ref(./toy_1.PNG,40%)
エージェントToy_Dが世界ファイルで記述した位置(0.0, 100.0,...
次に"START"ボタンを押してシミュレーションを開始します。
シミュレーションが開始し、エージェント(toy_D)が地面に落...
*エージェントの移動 [#z54adf9a]
次にエージェントに力を与えて移動させます。MoveController....
$ cd NewWorld
$ emacs MoveController.cpp
onActionの中に以下のコードを追加します。
MoveController.cpp
#highlight(cpp:firstline[13]){{
double MoveController::onAction(ActionEvent &evt) {
return 5.0; //次にonActionが呼ばれるまでの時間を...
}
}}
↓
#highlight(cpp:firstline[13]){{
double MoveController::onAction(ActionEvent &evt) {
SimObj *obj = getObj(myname()); //自分自身の取得
obj->addForce(0,0,5000); //z軸方向に5000[kg・c...
return 1.0; //次にonActionが呼ばれるまでの時間を...
}
}}
コンパイルして実行します。
$ make
$ cd ..
$ ./sigserver.sh -w NewWorld.xml -p 9001
SIGViewerで確認すると、1秒に一回エージェントがz方向に力...
#ref(toy_3.jpg)
力を与える関数setForce以外にも速度を設定するsetVelocityや...
*物理演算用の形状、大きさ、位置の設定 [#n6779cdb]
物理演算で用いるオブジェクトの形状は見た目の形状と異なり...
**設定ファイル修正 [#ofb6b204]
まず、オブジェクトの設定ファイルを編集します。
$ cd ~/sigverse-<version>/share/sigverse/data/xml
$ emacs seToy_D.xml
seToy_D.xmlの中の
<body filename="dummy-body.xml"/>
の下に以下のいずれかを追加します。
***box [#b90fa015]
#highlight(xml:nogutter){{
<!--形状をboxに設定します。-->
<simpleShape type="box">
<!--物理演算形状の位置(見た目の形状からのずれ)を設定し...
<position x="0" y="0" z="0"/>
<!--物理演算用の形状のサイズを設定します。-->
<size sx="10" sy="10" sz="10"/>
</simpleShape>
}}
一辺が10の立方体に設定しました。
***sphere [#f0404294]
sphereに設定する場合は以下のように設定します。
#highlight(xml:nogutter){{
<simpleShape type="sphere">
<position x="0" y="0" z="0"/>
<size r="10"/>
</simpleShape>
}}
半径10の球に設定しました。
***cylinder [#z94a7687]
#highlight(xml:nogutter){{
<simpleShape type="cylinder">
<position x="0" y="0" z="0"/>
<size r="3" h="10"/>
</simpleShape>
}}
※2011/10時点ではシリンダ形状の代わりにカプセル型形状を作...
底面の円の半径3、円筒の高さ10のシリンダーに設定しました。
※オブジェクトの大きさを0に設定し、物理演算用の形状を作ら...
**実行 [#r537a2f8]
再度シグバースを実行してエージェントが落下した時や、力を...
*単位系 [#c72a1e70]
SIGVerseでは単位系は以下を用います
|量|名称|記号|
|長さ|センチメートル|cm|
|質量|キログラム|kg|
|時間|秒|s|
|角度|ラジアン|rad|
|速度|センチメートル毎秒|cm/s|
|加速度|センチメートル毎秒毎秒|cm/s^2|
|力|キログラムセンチメートル毎秒毎秒|kg・cm/s^2|
|トルク|ニュートン・センチメートル|N・cm|
*Old version [#s7e27ae3]
-[[動力学シミュレーションのサンプル(v120330, v1.4.8)]]
Up:[[Tutorial]] Previous:[[テスト実行]] ...
[[English version>Samples/Control of humanoid agent]]
#highlight(end)
Page: