/**
* update: 20060922
* Robot Trace Demo - a robot shortly wanders through the environment - the trace is written to a file in the \"log\" directory.
* Authors: Cedric and Nicolas
*/
package contribs.robotlogtracer;
import java.util.Random;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import simbad.gui.Simbatch;
import simbad.sim.Agent;
import simbad.sim.EnvironmentDescription;
import simbad.sim.RangeSensorBelt;
import simbad.sim.RobotFactory;
import simbad.sim.Wall;
/**
* Robot Trace Demo - a robot shortly wanders through the environment - the trace is written to a file in the \"log\" directory.
*/
public class RobotTraceDemo extends EnvironmentDescription
{
public final static int ARENA_WIDTH = 5; //lenght of the arena
public final static int ARENA_HEIGHT = 5; // width of the arena
// pixel matrix for the traces
public int [][] _matrice = new int [ARENA_WIDTH*100][ARENA_HEIGHT*100];
public LogTracer tg = new LogTracer();
public static Random _rand = new Random(); //randomizer
public WanderRobot _myRobot = new WanderRobot(new Vector3d(_rand.nextInt(ARENA_WIDTH*2-1)-(ARENA_WIDTH*2-1)/2, 0, _rand.nextInt(ARENA_HEIGHT*2-1)-(ARENA_HEIGHT*2-1)/2), "Simple network 0", this); //The evolutionnary bot used in the environment.
/**
* Default constructor. It builds a simple environment with white walls and puts a single bot in it.
*/
public RobotTraceDemo ()
{
System.out.println("Robot Trace Demo - a robot shortly wanders through the environment - the trace is written to a file in the \"log\" directory");
this.wallColor = new Color3f(0.4f,0.4f,1);
Wall w1 = new Wall(new Vector3d(ARENA_WIDTH, 0, 0), ARENA_WIDTH*2, 1, this); w1.rotate90(1); add(w1);
Wall w3 = new Wall(new Vector3d(0, 0, ARENA_HEIGHT), ARENA_HEIGHT*2, 1, this); add(w3);
Wall w2 = new Wall(new Vector3d(-ARENA_WIDTH, 0, 0), ARENA_WIDTH*2, 1, this); w2.rotate90(1); add(w2);
Wall w4 = new Wall(new Vector3d(0, 0, -ARENA_HEIGHT), ARENA_HEIGHT*2, 1, this); add(w4);
add(_myRobot);
}
/**
* A wandering robot
*/
public class WanderRobot extends Agent
{
RangeSensorBelt bumpers, sonars; //sensors for the bot
public WanderRobot (Vector3d position, String nom, RobotTraceDemo __setup)
{
super(position,nom);
sonars = RobotFactory.addSonarBeltSensor(this,8);
bumpers = RobotFactory.addBumperBeltSensor(this,12);
}
public void initBehavior ()
{
}
public void performBehavior ()
{
// *** avoider robot ***
if (bumpers.oneHasHit()) {
setTranslationalVelocity(-0.1);
setRotationalVelocity(0.5-(0.1 * Math.random()));
} else if (collisionDetected()) {
// stop the robot
setTranslationalVelocity(0.0);
setRotationalVelocity(0);
} else if (sonars.oneHasHit()) {
// reads the three front quadrants
double left = sonars.getFrontLeftQuadrantMeasurement();
double right = sonars.getFrontRightQuadrantMeasurement();
double front = sonars.getFrontQuadrantMeasurement();
// if obstacle near
if ((front < 0.7)||(left < 0.7)||(right < 0.7)) {
if (left < right)
setRotationalVelocity(-1);
else
setRotationalVelocity(1);
setTranslationalVelocity(0);
} else{
setRotationalVelocity(0);
setTranslationalVelocity(0.6);
}
} else {
setTranslationalVelocity(0.8);;
setRotationalVelocity(0);
}
}
} // end of robot class
/** running the robot and writing trace to "log" directory */
private void evalueTrace ()
{
// double globalFitness=0;
String suffixe = ""+System.currentTimeMillis()/1000;
Simbatch sim = new Simbatch(this,true);
sim.reset(); // stability test?
int x=0;
int z=0;
int i = 0;
// 20000 steps
while ( i < 20000 ) //&& this._isRunnable )
{
//try {Thread.sleep(10); } catch(Exception e){}
sim.step();
i++;
Point3d coords = new Point3d();
_myRobot.getCoords(coords);
// update the pixel matrix
int xm = (int)((coords.x+5)*50);
int zm = (int)((coords.z+5)*50);
this._matrice[xm][zm]+=5;
if (i==1) { x=xm; z=zm; }
System.out.flush();
}
System.out.println("end of the trace - see trace file in \"log\" directory");
// trace the graphic to a file
this.tg.setBeginTrace(x,z);
this.tg.commitTrace(this._matrice,"log/tracelog-"+suffixe+".png");
//reset the pixel marix
for(int ki =0;ki<_matrice.length;ki++)
{
for(int kj=0;kj<_matrice[ki].length;kj++)
{
_matrice[ki][kj]=0;
}
}
// ready for a new trace...
System.out.println("end of trace demo.");
}
// demo purpose : a robot shortly wanders through the environment - the trace is written to a file in the "log" directory
public static void main (String [] argv)
{
RobotTraceDemo demo = new RobotTraceDemo();
demo._myRobot.initBehavior();
demo.evalueTrace();
}
}