Up:Tutorial? Previous:エージェント視点の画像取得 Next:物体を持つ動作 エージェントの衝突 †※このチュートリアルはv2.1.0以降対応しています。 ここではエージェントが衝突したときに衝突したエンティティを検出してUターンするサンプルを紹介します。 コントローラ作成 †$ cd ~/MyWorld $ emacs Colli.cpp Colli.cpp このサンプルコードは衝突を検出したら衝突した相手のエンティティ名を表示して、Uターンするというものです。衝突時に関数onCollisionが呼び出され、体を180°後ろに回転させます。onActionでは常に自分の向いている方向に進みます。また、このサンプルコードは2体のロボットが登場することを想定して、2体のロボットにそれぞれ違った速度を設定しています。 コンパイルします。 $ ./sigmake.sh Colli.cpp 世界ファイルの作成 †世界ファイルを作成します。 $ emacs ColliWorld.xml ColliWorld.xml ここではロボットが2体登場します。それぞれ同じコントローラを割り当てます。 衝突判定を行うエンティティは以下のように属性"collision"を"true"に設定しておきます。デフォルトでは"false"となっているので注意が必要です。 実行 †それでは実行してみましょう。 $ sigserver.sh -w ./ColliWorld.xml サーバに接続するとロボットが2体いて、人間が通せんぼしているのがわかります。 それではシミュレーションを開始してみましょう。 まず前にいるロボットが人間と衝突して前にいるロボットだけがUターンします。 次にロボット同士が衝突してそれぞれUターンします。 この後、先ほどと同様に前にいるロボットがまた人間と衝突してUターンして、後ろにいるロボットを追いかけますが、前にいるロボットのほうが速度を早く設定しているため、いずれ後ろのロボットに追い付きます。 追い付いたロボット2体は再びUターンをして人間の方向に進みます。 延々とこの動作を繰り返します。 属性の追加 †上のサンプルコントローラではロボットのエージェントごとに速度が設定されています。パラメータの値を変えるたびにコンパイルするのは面倒なので、ここではエージェントに属性として速度を追加して、世界ファイルでパラメータの値を設定する方法を紹介します。 エンティティファイルの編集 †世界ファイルが読み込むロボットの設定ファイルを編集します。 まずロボットの設定ファイルをカレントディレクトリにコピーします。 $ cp ~/sigverse-<version>/share/sigverse/data/xml/Robot-nii.xml . 以下の行を追加します。 <attr name="vel" type="double" group="velocity" value="0.0"/> Robot-nii.xml 世界ファイルの編集 †次に世界ファイルでエージェントごとに速度を設定します。 $ emacs ColliWorld.xml "robot_000"の属性の値を設定しているところ の下に以下の一行を加えます。 <set-attr-value name="vel" value="1.0"/> 同様に"robot_001"の属性値を設定している箇所に以下を追加します。 <set-attr-value name="vel" value="2.0"/> コントローラの編集 †次にコントローラの編集を行います。 速度パラメータvelは世界ファイルで設定を行ったので、onInit関数の中のvelの設定箇所を以下のように変更します。 $ emacs Colli.cpp Colli.cpp ↓ これでコンパイルするとエージェントの速度は世界ファイルで設定可能となります。 $ ./sigmake.sh Colli.cpp 正常に動作することを確認してみてください。 謝辞 †このサンプルは奈良先端技術大学院大学の柴田智広先生にアドバイスをいただきました。ありがとうございました。 Old Version †Up:Tutorial? Previous:エージェント視点の画像取得 Next:物体を持つ動作
Counter: 2707,
today: 1,
yesterday: 1
|