⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forage.java

📁 利用JAVA编写的群体机器人局部通讯完成一定得队形控制
💻 JAVA
字号:
/* * forage.java */ package Domains.Forage;import	EDU.gatech.cc.is.util.Vec2;import	EDU.gatech.cc.is.abstractrobot.*;import	EDU.gatech.cc.is.clay.*;/** * <B>Introduction</B><BR> * Example of complex schema-based control system for a MultiForageN150  * robot.  It uses a motor schema-based configuration to search for  * attractor * objects and carry them to a homebase.  The configuration  * is built using Clay.  * It can be run in simulation or on a robot. * <P> * For detailed information on how to configure behaviors, see the * <A HREF="../clay/docs/index.html">Clay page</A>. * <P> * <A HREF="../COPYRIGHT.html">Copyright</A> * (c)1997 Georgia Tech Research Corporation * * @author Tucker Balch * @version $Revision: 1.2 $ */public class forage  extends ControlSystemMFN150	{	public final static boolean DEBUG = true;	private NodeVec2	turret_configuration;	private NodeVec2	steering_configuration;	private NodeDouble	gripper_fingers_configuration;	private NodeDouble	gripper_height_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.4*abstract_robot.MAX_TRANSLATION);		abstract_robot.setGripperHeight(-1,0);   // put gripper down		abstract_robot.setGripperFingers(-1,1);  // open gripper		NodeVec2		PS_HOMEBASE0_GLOBAL = new v_FixedPoint_(0.0,0.0);				//======		// 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 = new v_GlobalToEgo_rv(abstract_robot,				PS_HOMEBASE0_GLOBAL);		//--- targets of visual class 0		NodeVec2Array 		PS_TARGETS0_EGO = 			new va_VisualObjects_r(0,abstract_robot);		NodeVec2Array 		PS_TARGETS0_GLOBAL = 			new va_Add_vav(PS_TARGETS0_EGO, PS_GLOBAL_POS);		//--- filter out targets close to homebase		NodeVec2Array 		PS_TARGETS0_GLOBAL_FILT = new va_FilterOutClose_vva(0.75,			PS_HOMEBASE0_GLOBAL, PS_TARGETS0_GLOBAL);		//--- make them egocentric		NodeVec2Array 		PS_TARGETS0_EGO_FILT = new va_Subtract_vav(			PS_TARGETS0_GLOBAL_FILT, PS_GLOBAL_POS);		//--- get the closest one		NodeVec2		PS_CLOSEST0 = new v_Closest_va(PS_TARGETS0_EGO_FILT);		//--- type of object in the gripper		NodeInt		PS_IN_GRIPPER = new i_InGripper_r(abstract_robot);		//======		// Perceptual Features		//======		// is something visible?		NodeBoolean		PF_TARGET0_VISIBLE = new b_NonZero_v(PS_CLOSEST0);		// is it not visible?		NodeBoolean		PF_NOT_TARGET0_VISIBLE = new b_Not_s(PF_TARGET0_VISIBLE);		// is something in the gripper?		NodeBoolean		PF_TARGET0_IN_GRIPPER = new b_Equal_i(0,PS_IN_GRIPPER);		// 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 target 0		NodeVec2		MS_SWIRL_OBSTACLES_TARGET0 = new v_Swirl_vav(2.0,			abstract_robot.RADIUS + 0.22,			PS_OBS,			PS_CLOSEST0);		// 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);		// go to target0		NodeVec2		MS_MOVE_TO_TARGET0 = new v_LinearAttraction_v(0.4,0.0,PS_CLOSEST0);		// 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_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_GO_TO_TARGET0		//======		v_StaticWeightedSum_va 		AS_ACQUIRE0 = new v_StaticWeightedSum_va();		AS_ACQUIRE0.weights[0]  = 1.0;		AS_ACQUIRE0.embedded[0] = MS_AVOID_OBSTACLES;		AS_ACQUIRE0.weights[1]  = 1.0;		AS_ACQUIRE0.embedded[1] = MS_MOVE_TO_TARGET0;		AS_ACQUIRE0.weights[2]  = 1.0;		AS_ACQUIRE0.embedded[2] = MS_SWIRL_OBSTACLES_TARGET0;		AS_ACQUIRE0.weights[3]  = 0.2;		AS_ACQUIRE0.embedded[3] = MS_NOISE_VECTOR;		//======		// AS_DELIVER0		//======		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;		//======		// STATE_MACHINE		//======		STATE_MACHINE = new i_FSA_ba();		STATE_MACHINE.state = 0;				// STATE 0 WANDER		STATE_MACHINE.triggers[0][0]  = PF_TARGET0_VISIBLE;		STATE_MACHINE.follow_on[0][0] = 1; // transition to ACQUIRE0		// STATE 1 ACQUIRE0		STATE_MACHINE.triggers[1][0]  = PF_TARGET0_IN_GRIPPER;		STATE_MACHINE.follow_on[1][0] = 2; // transition to DELIVER		STATE_MACHINE.triggers[1][1]  = PF_NOT_TARGET0_VISIBLE;		STATE_MACHINE.follow_on[1][1] = 0; // transition to WANDER		// STATE 2 DELIVER0		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_ACQUIRE0;		STEERING.embedded[2] = AS_DELIVER0;		//======		// TURRET		//======		v_Select_vai		TURRET = new v_Select_vai((NodeInt)STATE_MACHINE);		TURRET.embedded[0] = AS_WANDER;		TURRET.embedded[1] = AS_ACQUIRE0;		TURRET.embedded[2] = AS_DELIVER0;		//======		// GRIPPER_FINGERS		//======		d_Select_i		GRIPPER_FINGERS = new d_Select_i(STATE_MACHINE);		GRIPPER_FINGERS.embedded[0] = 1;  // open in WANDER		GRIPPER_FINGERS.embedded[1] = -1; // trigger in ACQUIRE		GRIPPER_FINGERS.embedded[2] = 0;  // closed in DELIVER		turret_configuration = TURRET;		steering_configuration = STEERING;		gripper_fingers_configuration = GRIPPER_FINGERS;		}			/**	 * 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);		// FINGERS		dresult = gripper_fingers_configuration.Value(curr_time);		abstract_robot.setGripperFingers(curr_time, dresult);		// STATE DISPLAY		int state = STATE_MACHINE.Value(curr_time);		if (state == 0)			abstract_robot.setDisplayString("wander");		else if (state == 1)			abstract_robot.setDisplayString("acquire");		else if (state == 2)			abstract_robot.setDisplayString("deliver");				return(CSSTAT_OK);		}	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -