/*
* Simbad - Robot Simulator
* Copyright (C) 2004 Louis Hugues
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
-----------------------------------------------------------------------------
* $Author: sioulseuguh $
* $Date: 2005/08/07 12:24:57 $
* $Revision: 1.13 $
* $Source: /cvsroot/simbad/src/simbad/sim/RobotFactory.java,v $
*/
package simbad.sim;
import javax.media.j3d.Transform3D;
import javax.vecmath.Vector3d;
/**
* A helper class to aid building robot bodies and sensors.
* It only contains only static methods and thus should not be instanciated.
*
*
*
*/
public class RobotFactory extends Factory {
/**
* Adds a prebuild camera sensor to the agent. Image resolution is 100x100 pixels.
* Camera is situated on the top of the agent.
* @param agent
* @return the sensor object
*/
static public CameraSensor addCameraSensor(Agent agent) {
double agentHeight = agent.getHeight();
float cameraBodyRadius = 0.1f;
CameraSensor camera = new CameraSensor(cameraBodyRadius, 100, 100);
camera.setUpdatePerSecond(3);
camera.setName("Camera");
Vector3d pos = new Vector3d(0.0, (agentHeight / 2)
+ (cameraBodyRadius * 3) / 4, 0);
agent.addSensorDevice(camera, pos, 0);
return camera;
}
/**
* Adds a prebuild belt of sonar sensor to the agent.
* @param agent
* @return the sensor object
*/
static public RangeSensorBelt addSonarBeltSensor(Agent agent) {
double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
RangeSensorBelt sonarBelt = new RangeSensorBelt((float) agentRadius,
0f, 1.5f, 9, RangeSensorBelt.TYPE_SONAR,0);
sonarBelt.setUpdatePerSecond(3);
sonarBelt.setName("sonars");
Vector3d pos = new Vector3d(0, agentHeight / 2, 0.0);
agent.addSensorDevice(sonarBelt, pos, 0);
return sonarBelt;
}
/**
* Adds a prebuild belt of sonar sensor to the agent.
* @param agent
* @param nbSonars the number of sonars.
* @return the sensor object
*/
static public RangeSensorBelt addSonarBeltSensor(Agent agent,int nbSonars) {
double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
RangeSensorBelt sonarBelt = new RangeSensorBelt((float) agentRadius,
0f, 1.5f, nbSonars, RangeSensorBelt.TYPE_SONAR,0);
sonarBelt.setUpdatePerSecond(3);
sonarBelt.setName("sonars");
Vector3d pos = new Vector3d(0, agentHeight / 2, 0.0);
agent.addSensorDevice(sonarBelt, pos, 0);
return sonarBelt;
}
/**
* Adds a prebuild belt of bumpers sensor to the agent.
* @param agent
* @return the sensor object
*/
static public RangeSensorBelt addBumperBeltSensor(Agent agent) {
// double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
RangeSensorBelt bumperBelt = new RangeSensorBelt((float) agentRadius-0.1f,
0f, 0.2f, 9, RangeSensorBelt.TYPE_BUMPER,0);
bumperBelt.setUpdatePerSecond(6);
bumperBelt.setName("bumpers");
Vector3d pos = new Vector3d(0, 0, 0.0);
agent.addSensorDevice(bumperBelt, pos, 0);
return bumperBelt;
}
/**
* Adds a prebuild belt of bumpers sensor to the agent. Specify the number of sensors.
* @param agent
* @param nbSensors
* @return the sensor object
*/
static public RangeSensorBelt addBumperBeltSensor(Agent agent,int nbSensors) {
// double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
RangeSensorBelt bumperBelt = new RangeSensorBelt((float) agentRadius-0.1f,
0f, 0.2f, nbSensors, RangeSensorBelt.TYPE_BUMPER,0);
bumperBelt.setUpdatePerSecond(6);
bumperBelt.setName("bumpers");
Vector3d pos = new Vector3d(0, 0, 0.0);
agent.addSensorDevice(bumperBelt, pos, 0);
return bumperBelt;
}
/**
* Adds a prebuild light sensor to the agent.
* @param agent
* @return the sensor object
*/
static public LightSensor addLightSensor(Agent agent) {
double agentHeight = agent.getHeight();
LightSensor sensor = new LightSensor();
sensor.setUpdatePerSecond(3);
sensor.setName("Light Sensor");
Vector3d pos = new Vector3d(0.0, (agentHeight / 2), 0);
agent.addSensorDevice(sensor, pos, -Math.PI / 2);
return sensor;
}
/**
* Adds a prebuild light sensor to the agent at a given position.
* @param agent
* @return the sensor object
*/
static public LightSensor addLightSensor(Agent agent, Vector3d pos,
float angle, String label) {
LightSensor sensor = new LightSensor();
sensor.setUpdatePerSecond(3);
sensor.setName("Light Sensor " + label);
agent.addSensorDevice(sensor, pos, angle);
return sensor;
}
/**
* Adds a prebuild light sensor on the left of the agent .
* @param agent
* @return the sensor object
*/
static public LightSensor addLightSensorLeft(Agent agent) {
Vector3d front = new Vector3d(agent.getRadius()+0.5, 0, 0);
Transform3D t3d = new Transform3D();
t3d.rotY(Math.PI / 4);
Vector3d left = new Vector3d(front);
t3d.transform(left);
return RobotFactory.addLightSensor(agent, left, (float) Math.PI / 4,
"left");
}
/**
* Adds a prebuild light sensor on the right of the agent .
* @param agent
* @return the sensor object
*/
static public LightSensor addLightSensorRight(Agent agent) {
Vector3d front = new Vector3d(agent.getRadius()+0.5, 0, 0);
Transform3D t3d = new Transform3D();
t3d.rotY(-Math.PI / 4);
Vector3d right = new Vector3d(front);
t3d.transform(right);
return RobotFactory.addLightSensor(agent, right, (float) -Math.PI / 4,
"left");
}
/**
* Adds a prebuild line sensor to the agent.
* @param agent
* @return the sensor object
*/
static public LineSensor addLineSensor(Agent agent) {
return addLineSensor(agent, 5);
}
/**
* Adds a prebuild line sensor to the agent. Specify the number of sensors.
* @param agent
* @param nbSensors
* @return the sensor object
*/
static public LineSensor addLineSensor(Agent agent, int nbSensors) {
double agentHeight = agent.getHeight();
double agentRadius = agent.getRadius();
LineSensor lineSensor = new LineSensor((float) agentRadius+0.001f,
0f, 0.025f, nbSensors, LineSensor.FLAG_SHOW_FULL_SENSOR_RAY);
lineSensor.setUpdatePerSecond(20);
lineSensor.setName("line sensor");
Vector3d pos = new Vector3d(0, -(agentHeight / 2) + 0.025f, 0.0);
agent.addSensorDevice(lineSensor, pos, 0);
return lineSensor;
}
/**
* Adds a prebuild key input to the agent.
* @param agent
* @return the sensor object
*/
static public KeyInputSensor addKeyInputSensor(Agent agent) {
KeyInputSensor sensor = new KeyInputSensor();
sensor.setUpdatePerSecond(3);
sensor.setName("key input");
// position has no meaning in the case of that sensor.
Vector3d pos = new Vector3d(0, 0.0, 0.0);
agent.addSensorDevice(sensor, pos, 0);
return sensor;
}
/////////////////////////////////////////////////////////////////////////////////////
// Prebuild Actuators
/**
* Adds a prebuild lamp actuator on the top of the agent .
* @param agent
* @return the actuator object
*/
static public LampActuator addLamp(Agent agent) {
LampActuator la = new LampActuator(0.15f);
la.setName("lamp");
la.setUpdatePerSecond(5f);
agent.addActuatorDevice(la, new Vector3d(0,agent.getHeight(),0),0);
return la;
}
/////////////////////////////////////////////////////////////////////////////////////
// Prebuild KinelaticModels
/** Sets the kinematic model to be DifferentialDrive (instead of DefaultKinematic)
* @param agent
*/
static public DifferentialKinematic setDifferentialDriveKinematicModel(Agent agent){
agent.setKinematicModel(new DifferentialKinematic(agent.getRadius()));
return (DifferentialKinematic)agent.getKinematicModel();
}
}