📄 formation.java
字号:
/* * formation.java */ package Domains.Formation;import EDU.gatech.cc.is.util.Vec2;import EDU.gatech.cc.is.abstractrobot.*;import EDU.gatech.cc.is.clay.*;/** * Swarm robots formation control(2007/01/28). * @author Yongming Yang * @version $Revision: 1.0 $ */public class formation 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.niantu */ 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_(25.0,abstract_robot.getPosition(-1).y);//0.0 ADD BY WEN 080412 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 (DIAN JI MO SHI) //====== // 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); //====== // AS_DELIVER0 (JIAO FU ) //====== v_StaticWeightedSum_va AS_DELIVER0 = new v_StaticWeightedSum_va(); AS_DELIVER0.weights[0] = 1.0; AS_DELIVER0.embedded[0] = MS_AVOID_OBSTACLES; AS_DELIVER0.weights[1] = 1.0; AS_DELIVER0.embedded[1] = MS_MOVE_TO_HOMEBASE0; AS_DELIVER0.weights[2] = 1.0; AS_DELIVER0.embedded[2] = MS_SWIRL_OBSTACLES_HOMEBASE0; AS_DELIVER0.weights[3] = 0.2; AS_DELIVER0.embedded[3] = MS_NOISE_VECTOR; //====== // AS_WANDER (MAN YOU) //====== 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; //====== // STATE_MACHINE (ZHUANG TAI JI) //====== 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; STATE_MACHINE.follow_on[1][0] = 0; // transition to WANDER state_monitor = STATE_MACHINE; //====== // STEERING (DU DAO) //====== v_Select_vai STEERING = new v_Select_vai((NodeInt)STATE_MACHINE); STEERING.embedded[0] = AS_WANDER; STEERING.embedded[1] = AS_DELIVER0; //====== // TURRET (DUO JI ?) //====== 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); 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 + -