/*
* 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 org.myrobotlab.mapper.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 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 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 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;
}
/**
* 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;
}
/**
* 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 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;
}
// ///////////////////////////////////////////////////////////////////////////////////
// Prebuild Actuators
/**
* 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;
}
// ///////////////////////////////////////////////////////////////////////////////////
// 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();
}
}