Up:Tutorial?     Previous:エージェント視点の画像取得?     Next:物体を持つ動作?


エージェントの衝突

ここではエージェントが衝突したときに衝突したエンティティを検出してUターンするサンプルを紹介します。

コントローラ作成

$ cd ~/sigverse-<version>/bin/NewWorld
$ emacs Colli.cpp

Colli.cpp

このサンプルコードは衝突を検出したら衝突した相手のエンティティ名を表示して、Uターンするというものです。衝突時に関数onCollisionが呼び出され、体を180°後ろに体を回転させます。onActionでは常に自分の向いている方向に進みます。また、このサンプルコードは2体のロボットが登場することを想定して、2体のロボットにそれぞれ違った速度を設定しています。

MakefileにColli.soを追加してコンパイルします。

世界ファイルの作成

世界ファイルを作成します。

$ cd ..
$ emacs xml/ColliWorld.xml

ColliWorld.xml

ここではロボットが2体登場します。それぞれ同じコントローラを割り当てます。

衝突判定を行いたいエンティティは以下のように属性"collision"を"true"に設定しておきます。デフォルトでは"false"となっているので注意が必要です。

実行

それでは実行してみましょう。

$ ./sigserver.sh -w ColliWorld.xml -p 9001
Colli_1.PNG

サーバに接続するとロボットが2体いて、人間が通せんぼしているのがわかります。 それではシミュレーションを開始してみましょう。

Colli_2.PNG

まず前にいるロボットが人間と衝突して前にいるロボットだけがUターンします。

Colli_3.PNG

次にロボット同士が衝突してそれぞれUターンします。

この後、先ほどと同様に前にいるロボットがまた人間と衝突してUターンして、後ろにいるロボットを追いかけますが、前にいるロボットのほうが速度を早く設定しているため、いずれ後ろのロボットに追い付きます。

追い付いたロボット2体は再びUターンをして人間の方向に進みます。

延々とこの動作を繰り返します。

属性の追加

上のサンプルコントローラではロボットのエージェントごとに速度が設定されています。パラメータの値を変えるたびにコンパイルするのは面倒なので、ここではエージェントに属性として速度を追加して、世界ファイルでパラメータの値を設定する方法を紹介します。

エンティティファイルの編集

世界ファイルが読み込むロボットの設定ファイルを編集します。

$ emacs -nw xml/Robot-nii.xml

以下の行を追加します。

<attr name="vel" type="double" group="velocity" value="0.0"/>

Robot-nii.xml

世界ファイルの編集

次に世界ファイルでエージェントごとに速度を設定します。

$ emacs xml/ColliWorld.xml

"robot_000"の属性の値を設定しているところ

の下に以下の一行を加えます。

     <set-attr-value name="vel" value="5.0"/>

同様に"robot_001"の属性値を設定している箇所に以下を追加します。

    <set-attr-value name="vel" value="7.0"/>

コントローラの編集

次にコントローラの編集を行います。

速度パラメータvelは世界ファイルで設定を行ったので、onInit関数の中のvelの設定箇所を以下のように変更します。

$ cd NewWorld
$ emacs Colli.cpp

Colli.cpp

     ↓

これでコンパイルするとエージェントの速度は世界ファイルで設定可能となります。

$ make

正常に動作することを確認してみてください。

謝辞

このサンプルは奈良先端技術大学院大学の柴田智広先生にアドバイスをいただきました。ありがとうございました。

Old Version


Up:Tutorial?     Previous:エージェント視点の画像取得?     Next:物体を持つ動作?


Front page   New List of pages Search Recent changes   Help   RSS of recent changes