「Robocup Rescue Simulationを動かす」で動かしたMAPはちょっと大きすぎて
最初の取っ掛かりとしては難しいので,まずは簡単なMAPから実行してみる.
mapの変更
rescue-nightly\boot\config\gis.cfg
の中にMAPが書いてあるので, それを変更.
たとえば,
# The map directory to read
# gis.map.dir : ../maps/gml/legacy/Kobe
gis.map.dir : ../maps/gml/test
とすると,Mapがlegacy/Kobeからtestに変更できる.
これで実行すれば,各種エージェントが1種類ずつしかいない
小さいMAPを試してみることが可能.
エージェントの数の制御
ついでに,エージェント数などを変更する場所もメモしておこう.
rescue-nightly\maps\gml\
にマップデータがあるので,
scenario.xml
を書き換える.
エージェントの作り方
さて,ここまできていよいよエージェントの作成.
基本となるAbstractClassは,
rescuecore2.standard.components.StandardAgent
これを継承して,
import rescuecore2.standard.components.StandardAgent;
import rescuecore2.standard.entities.StandardEntity;
abstract public class AbstractAgent<E extends StandardEntity> extends StandardAgent<E> {
}
などというAbstractAgentクラスを作成すると良い.
さらに,それを継承して,AmbulanceTeam,PoliceForce,FireBrigaterを作成する.
たとえば,PoliceForceを作成するなら,
public class MyPoliceForceAgent extends AbstractAgent<PoliceForce>
とする.
とりあえず,ざっくりとしたMyPoliceForceAgentを作成してみる.
package jp.ac.nagoyau.is.ss.kishii.tori.rescue.test.agent;
import java.util.Collection;
import java.util.EnumSet;
import rescuecore2.messages.Command;
import rescuecore2.standard.entities.PoliceForce;
import rescuecore2.standard.entities.StandardEntityURN;
import rescuecore2.worldmodel.ChangeSet;
public class MyPoliceForceAgent extends AbstractAgent<PoliceForce> {
/**
* つなげるために呼ばれる.<br>
* これが呼ばれると全体のMAPなどが読み込めるようになる
*/
@Override
protected void postConnect() {
super.postConnect();
//何か初期化処理
}
/**
* なんだかよくわからないけど,書いておく.
* たぶんサーバ側で利用する
*/
@Override
protected EnumSet<StandardEntityURN> getRequestedEntityURNsEnum() {
return EnumSet.of(StandardEntityURN.POLICE_FORCE);
}
/**
* 1ステップごとに呼び出される.
*/
@Override
protected void think(int time, ChangeSet changeSet, Collection<Command> commands) {
//面倒なので何もしません
}
}
自分のエージェントで動かす
せっかく作ったら動かしたいというのが人間のサガ.
動かす方法も考えよう.
sample.LaunchSampleAgentsを自分の開発パッケージにコピーしておく.
で,作成したエージェントとSampleAgentを入れ替える.
たとえば,SamplePoliceForceAgentを今作成したMyPoliceForceAgentに変更するなら,
コピーしたLaunchSampleAgentsの100行目付近を
Logger.info("Connecting police force " + (i++) + "...");
//launcher.connect(new SamplePoliceForce());
launcher.connect(new SamplePoliceForce());
Logger.info("success");
と変更する.
で,実行してみると・・・
無事PoliceForceが何もしないチームが完成.
ますます役立たず.