2010年6月21日月曜日

Robocup Rescue Simulationを動かす2

「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が何もしないチームが完成.
ますます役立たず.

0 件のコメント: