📄 diamandformation.java
字号:
/*
* DiamandFormation.java
*/
package Domains.DiamandFormation;
import EDU.gatech.cc.is.util.Vec2;
import EDU.gatech.cc.is.abstractrobot.*;
import EDU.gatech.cc.is.clay.*;
/**
* Swarm robots DiamandFormation control(2007/05/28).
* @author yxh
* @version $Revision: 1.0 $
*/
public class DiamandFormation extends ControlSystemMFN150
{
public final static boolean DEBUG = true;
private NodeVec2 turret_configuration;
private NodeVec2 steering_configuration;
private NodeInt state_monitor;
private i_FSA_ba STATE_MACHINE;
/**
* Configure the control system using Clay.
*/
public void configure()
{
//======
// Set some initial hardware configurations.
//======
abstract_robot.setObstacleMaxRange(3.0); // don't consider things further away
abstract_robot.setBaseSpeed(0.8*abstract_robot.MAX_TRANSLATION);
//======
// perceptual schemas
//======
//--- robot's global position
NodeVec2
PS_GLOBAL_POS = new v_GlobalPosition_r(abstract_robot);
//--- obstacles
NodeVec2Array // the sonar readings
PS_OBS = new va_Obstacles_r(abstract_robot);
//--- homebase
NodeVec2 // the place to deliver
PS_HOMEBASE0_GLOBAL = new v_FixedPoint_(30.0,0.0);
NodeVec2 // make it egocentric
PS_HOMEBASE0 = new v_GlobalToEgo_rv(abstract_robot,
PS_HOMEBASE0_GLOBAL);
//======
// Perceptual Features
//======
// close to homebase
NodeBoolean
PF_CLOSE_TO_HOMEBASE0 = new b_Close_vv(0.4, PS_GLOBAL_POS,
PS_HOMEBASE0_GLOBAL);
//======
// motor schemas
//======
// avoid obstacles
NodeVec2
MS_AVOID_OBSTACLES = new v_Avoid_va(1.5,
abstract_robot.RADIUS + 0.1,
PS_OBS);
// swirl obstacles wrt homebase0
NodeVec2
MS_SWIRL_OBSTACLES_HOMEBASE0 = new v_Swirl_vav(2.0,
abstract_robot.RADIUS + 0.22,
PS_OBS,
PS_HOMEBASE0);
// go home 0
NodeVec2
MS_MOVE_TO_HOMEBASE0 = new v_LinearAttraction_v(0.4,0.0,PS_HOMEBASE0);
// noise vector
NodeVec2
MS_NOISE_VECTOR = new v_Noise_(5,seed);
// swirl obstacles wrt noise
NodeVec2
MS_SWIRL_OBSTACLES_NOISE = new v_Swirl_vav(2.0,
abstract_robot.RADIUS + 0.1,
PS_OBS,
MS_NOISE_VECTOR);
// maintain diamand_formation
NodeVec2
MS_DIAMAND_FORMATION = new v_Formation_r(3.0,3.0,1.0,0.0,abstract_robot,3);
//MS_DIAMAND_FORMATION = new v_DiamandFormation_r(3.0,3.0,1.0,0.0,abstract_robot);
//======
// AS_WANDER
//======
v_StaticWeightedSum_va
AS_WANDER = new v_StaticWeightedSum_va();
AS_WANDER.weights[0] = 1.0;
AS_WANDER.embedded[0] = MS_AVOID_OBSTACLES;
AS_WANDER.weights[1] = 1.0;
AS_WANDER.embedded[1] = MS_NOISE_VECTOR;
AS_WANDER.weights[2] = 1.0;
AS_WANDER.embedded[2] = MS_SWIRL_OBSTACLES_NOISE;
//======
// AS_DELIVER0
//======
v_StaticWeightedSum_va
AS_DELIVER0 = new v_StaticWeightedSum_va();
AS_DELIVER0.weights[0] = 1.5;
AS_DELIVER0.embedded[0] = MS_AVOID_OBSTACLES;
AS_DELIVER0.weights[1] = 0.8;
AS_DELIVER0.embedded[1] = MS_MOVE_TO_HOMEBASE0;
AS_DELIVER0.weights[2] = 1.5;
AS_DELIVER0.embedded[2] = MS_SWIRL_OBSTACLES_HOMEBASE0;
AS_DELIVER0.weights[3] = 0.1;
AS_DELIVER0.embedded[3] = MS_NOISE_VECTOR;
AS_DELIVER0.weights[4] = 2.0;
AS_DELIVER0.embedded[4] = MS_DIAMAND_FORMATION;
//======
// STATE_MACHINE
//======
STATE_MACHINE = new i_FSA_ba();
STATE_MACHINE.state = 1;
// STATE 0 WANDER
//STATE_MACHINE.triggers[0][0] = PF_TARGET0_VISIBLE;
//STATE_MACHINE.follow_on[0][0] = 1; // transition to ACQUIRE0
// STATE 1 DELIVER0
STATE_MACHINE.triggers[1][0] = PF_CLOSE_TO_HOMEBASE0;
//MS_AVOID_OBSTACLES;
STATE_MACHINE.follow_on[1][0] = 0; // transition to WANDER
// STATE 2 SLOWDOWN
/*STATE_MACHINE.triggers[2][0] = PF_CLOSE_TO_HOMEBASE0;
STATE_MACHINE.follow_on[2][0] = 0; // transition to WANDER*/
state_monitor = STATE_MACHINE;
//======
// STEERING
//======
v_Select_vai
STEERING = new v_Select_vai((NodeInt)STATE_MACHINE);
STEERING.embedded[0] = AS_WANDER;
STEERING.embedded[1] = AS_DELIVER0;
//======
// TURRET
//======
v_Select_vai
TURRET = new v_Select_vai((NodeInt)STATE_MACHINE);
TURRET.embedded[0] = AS_WANDER;
TURRET.embedded[1] = AS_DELIVER0;
turret_configuration = TURRET;
steering_configuration = STEERING;
}
/**
* Called every timestep to allow the control system to
* run.
*/
public int takeStep()
{
Vec2 result;
double dresult;
long curr_time = abstract_robot.getTime();
Vec2 p;
// STEER
result = steering_configuration.Value(curr_time);
//System.out.println(abstract_robot.getID()+" "+result.r);
abstract_robot.setSteerHeading(curr_time, result.t);
abstract_robot.setSpeed(curr_time, result.r);
// TURRET
result = turret_configuration.Value(curr_time);
abstract_robot.setTurretHeading(curr_time, result.t);
// STATE DISPLAY
int state = STATE_MACHINE.Value(curr_time);
if (state == 0)
abstract_robot.setDisplayString("wander");
else if (state == 1)
abstract_robot.setDisplayString("deliver");
return(CSSTAT_OK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -