📄 rankformation.java
字号:
/*
* RankFormation.java
*/
package Domains.RankFormation;
import EDU.gatech.cc.is.util.Vec2;
import EDU.gatech.cc.is.abstractrobot.*;
import EDU.gatech.cc.is.clay.*;
/**
* Swarm robots RankFormation control(2007/05/28).
* @author yxh
* @version $Revision: 1.0 $
*/
public class RankFormation 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;
int run_i;
/**
* 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,-5.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);
NodeBoolean
CHANGEFORMATION = new changeformation_test();
//======
// 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 rank_formation 0-5,6-11,12-17
NodeVec2
MS_RANK_FORMATION = new v_RankFormation_r(0,2.5,2.5,0,1,0,abstract_robot);
NodeVec2
MS_RANK_FORMATION_CHANGE = new v_RankFormation_r(0,3.0,3.0,0,1,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.2;
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.2;
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] = 1.2;
AS_DELIVER0.embedded[4] = MS_RANK_FORMATION;
//=====
// AS_CHANGE
//=====
v_StaticWeightedSum_va
AS_CHANGE = new v_StaticWeightedSum_va();
AS_CHANGE.weights[0] = 1.2;
AS_CHANGE.embedded[0] = MS_AVOID_OBSTACLES;
AS_CHANGE.weights[1] = 0.5;
AS_CHANGE.embedded[1] = MS_MOVE_TO_HOMEBASE0;
AS_CHANGE.weights[2] = 1.2;
AS_CHANGE.embedded[2] = MS_SWIRL_OBSTACLES_HOMEBASE0;
AS_CHANGE.weights[3] = 0.2;
AS_CHANGE.embedded[3] = MS_NOISE_VECTOR;
AS_CHANGE.weights[4] = 1.2;
AS_CHANGE.embedded[4] = MS_RANK_FORMATION_CHANGE;
//======
// 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] = CHANGEFORMATION;
STATE_MACHINE.follow_on[1][0] = 2; // transition to CHANGE
// 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;
STEERING.embedded[2] = AS_CHANGE;
//======
// TURRET
//======
v_Select_vai
TURRET = new v_Select_vai((NodeInt)STATE_MACHINE);
TURRET.embedded[0] = AS_WANDER;
TURRET.embedded[1] = AS_DELIVER0;
TURRET.embedded[2] = AS_CHANGE;
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;
//double [][]robot_v = new double[1500][18];
//int robot_id = abstract_robot.getID(-1);
// STEER
result = steering_configuration.Value(curr_time);
/*robot_v [run_i][robot_id] = result.r;
run_i++;
//System.out.println(abstract_robot.getID()+" "+result.r);
//System.out.println(run_i);
System.out.println("robot_v["+run_i+"]["+robot_id+"]="+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");
else if (state == 2)
abstract_robot.setDisplayString("change");
return(CSSTAT_OK);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -