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

📄 action.cpp

📁 FIRA机器人足球比赛5V5仿真组的一般的防守策略
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;

		do{//whether to reduce
			//收敛!!
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 > 0  );
		
		nextangle-=v1;

		if(nextangle < turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
	
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 < 0 )
			{
				do{//该降低功率了
					f++;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 < turnangle && f <FF);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}
	else
	{//
		f=FF;
		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;
		
		do{//whether to reduce
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 < 0 );
		
		nextangle-=v1;

		if(nextangle > turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 > 0 )
			{
				do{//该降低功率了
					f--;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 > turnangle && f >-FF);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}

}

//
/*Angle 让robot转到正对pos的方向

*/
//
void Angle( Environment *env, int robot,Vector3D pos)
{

	Mydata * p;
	p=(Mydata *)env->userData;

	double speed = 0;		//和pangle接轨
	double accuracy=1;
	double turnangle=0,nextangle=0;
	double FF=125;		//最大减速度
	double angle=0;
	angle = Atan(p->robot[robot].pos , pos);

	turnangle = angle -p->robot[robot].rotation;
	RegulateAngle(turnangle);
if(turnangle < 1 && turnangle >-1)
{
	Velocity(env,robot,0,0);
	return ;
}
else if(turnangle < 2 && turnangle >-2)
	FF=10;
else if( turnangle >-3 && turnangle < 3)
	FF=15;
else if( turnangle >-5 && turnangle < 5)
	FF=30;

	double v=p->robot[robot].rotation - p->myoldpos[robot].z ;
	RegulateAngle(v);
	double v1=v;
	double f=0;	//相当于减速时,右轮速度,
//	int n=0;
	bool turnleft=true;			//判断小车是否是该向左转
	double a=ANGLE_A;
	double b=ANGLE_B;

	if(turnangle > 90)
	{
		turnleft=false;
		turnangle-=180;
	}
	else if(turnangle >0)
	{
		turnleft=true;	
	}
	else if(turnangle > -90)
	{
		turnleft=false;	
	}
	else 
	{
		turnleft=true;
		turnangle+=180;		
	}

	if(turnleft)
	{//
		f=-FF;

		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;

		do{//whether to reduce
			//收敛!!
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 > 0  );
		
		nextangle-=v1;

		if(nextangle < turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
	
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 < 0 )
			{
				do{//该降低功率了
					f++;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 < turnangle && f <FF);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}
	else
	{//
		f=FF;
		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;
		
		do{//whether to reduce
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 < 0 );
		
		nextangle-=v1;

		if(nextangle > turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 > 0 )
			{
				do{//该降低功率了
					f--;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 > turnangle && f >-FF);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}

}

//
/*PAngle 让robot朝angle的方向跑,并且speed控制它的最大轮速

*/
//
void PAngle( Environment *env, int robot,double angle,double speed)
{
	Mydata * p;
	p=(Mydata *)env->userData;
	
	double accuracy=1;
	double turnangle=0,nextangle=0;
	turnangle = angle -p->robot[robot].rotation;
	RegulateAngle(turnangle);
	double v=p->robot[robot].rotation - p->myoldpos[robot].z ;
	RegulateAngle(v);
	double v1=v;
	double FF=125;		//最大减速度
	double f=0;	//相当于减速时,右轮速度,
//	int n=0;
	bool turnleft=true;			//判断小车是否是该向左转
	double a=ANGLE_A;
	double b=ANGLE_B;
	
	bool face ;
	if(  turnangle < 90 && turnangle > -90 )	//检查是否正面跑位
	{
		face = true;
		speed = speed;
	}
	else
	{
		face = false;
		speed = -speed;
	}



	if(turnangle > 90)
	{
		turnleft=false;
		turnangle-=180;
	}
	else if(turnangle >0)
	{
		turnleft=true;	
	}
	else if(turnangle > -90)
	{
		turnleft=false;	
	}
	else 
	{
		turnleft=true;
		turnangle+=180;		
	}




	if(turnleft)
	{//
		f=-FF;

		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;

		do{//whether to reduce
			//收敛!!
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 > 0  );
		
		nextangle-=v1;

		if(nextangle < turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
	
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 < 0 )
			{
				do{//该降低功率了
					f++;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 < turnangle && f <125);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}
	else
	{//
		f=FF;
		v1=AngleOne(v1,speed+f,speed-f);		//v1+=a *( -b *f-v1);
		nextangle+=v1;
		
		do{//whether to reduce
			v1 =AngleOne(v1,speed-f,speed+f);//+= a *( b *f-v1);		// v1   
			nextangle+=v1;
		}while( v1 < 0 );
		
		nextangle-=v1;

		if(nextangle > turnangle)
		{//不满足减速条件 所以 f 取相反数
			Velocity(env,robot,speed+f,speed-f);
		}
		else 
		{//reduce
			v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
			if( v1 > 0 )
			{
				do{//该降低功率了
					f--;
					v1 = AngleOne(v,speed-f,speed+f);  //v + a *( b *f-v);
				}while( v1 > turnangle && f >-125);
			}
			Velocity(env,robot,speed-f,speed+f);
		}		
	}
}
//
/*PositionAndStop 让robot 跑到pos,并且停下来,
bestangle 是停下来之后的朝向,
limit	控制停在pos附近的距离

*/
//
void PositionAndStop(Environment *env,int  robot,Vector3D pos ,double bestangle,double limit) 
{	//考虑到可能的	急停和 急快速加速
	//特别作了优化
	//还有就是 被碰转后的转角过程 不能耽搁时间!!!
	//转角是最危险的过程

	Mydata * p;
	p=(Mydata *)env->userData;
	
	double anglespeedmax=0;		//控制转交速度的变量
	double vmax=125;			//默认的跑位加速度
	double Limitedangle=2;		//默认减速范围

	if( limit < 0.5 )
		limit =0.5;
	double Limiteddis=limit;	//减速范围有一个下限,保证不会来回跑动
	
	double  distance;			//robot和目标点的距离
	double turnangle,posangle,vangle;	//转动角度 ,目标点相对robot的角度,速度的绝对角度
	double dx,dy;				//pos  和robot的坐标差
	double a=SPEED_A;			//参数
	double b=SPEED_B;
	double v,v1;				//临时保存速度的大小!!!
	double f=vmax;				//加速度变量
	double s=0;					//预测的减速位移(路程)
	int n=0;					//跑位的步数
	bool face=true;			//判断小车是否是正面前进

	v= sqrt(p->myspeed[robot].x * p->myspeed[robot].x + p->myspeed[robot].y*p->myspeed[robot].y);
	//临时保存速度的大小!!!
	dx = pos.x - p->robot[robot].pos.x ;		//pos  和robot的坐标差
	dy = pos.y - p->robot[robot].pos.y ;
	
	distance = Distance(p->robot[robot].pos , pos);
	posangle = Atan(dy,dx);

	turnangle = p->robot[robot].rotation - posangle;		//转动角度 
	RegulateAngle(turnangle);

	if(turnangle > 90)
	{//判断小车是否是正面前进
		face=false;
		turnangle-=180;
	}
	else if(turnangle < -90)
	{
		face=false;
		turnangle+=180;
	}
	else 
	{
		face=true;
	}

	vangle = p->myspeed[robot].z - p->robot[robot].rotation;		//速度的方向和robot正面的夹角
	RegulateAngle(vangle);					//主要用于最后控制减速度的大小
	if( vangle <-90 || vangle > 90 )		//同时判断v的正负
		v=-v;

	if(face)
	{//forward	跑位,如果后退的话  就v=0
		//设vl,vr=0 还是vl,vr=125 有一个条件有一个临界条件那就是 
		//v = SPEED_ZERO
		if(v < -SPEED_ZERO)
		{
			Velocity(env,robot,0,0);
			return ;
		}
	}
	else if(v > SPEED_ZERO)
	{//back		跑位,如果后退的话  就v=0
		Velocity(env,robot,0,0);
		return ;
	}

	v1=v;	//v1 is changing while program running 
			//whlie, v is not

	if(distance > Limiteddis )
	{//it is too early to count the steps
		//but the Limiteddis should be tested!!	to do...
		if(turnangle > Limitedangle || turnangle < -Limitedangle)
		{//adjust angle
			/////////////////测试这一段
			//对于goalie这一段应该特别注意
			//发生变向	1.knock the robot,especially the opponent
			//	2.knock the wall
			// so the anglespeedmax is allowed ++ more!!
			if(turnangle > 20  || turnangle < -20)
				anglespeedmax = 0;
			else if(turnangle > 10  || turnangle < -10)
				anglespeedmax = 125;
			else if(turnangle > 5  || turnangle < -5)
				anglespeedmax = 180;
			else 
				anglespeedmax = 200;
			///////////////测试这一段
			PAngle(env,robot,posangle,anglespeedmax);
		}
		else
		{
			if(face)
				Velocity(env,robot,f,f);
			else
				Velocity(env,robot,-f,-f);
		}//it is time to rush
	}
	else
	{
		if(distance > 1)
		{		//调整角度	return!!!!!!
			//radious of robot is about 1.5 ,so the distance is very short
			if(turnangle > Limitedangle || turnangle < -Limitedangle)
			{	
				Angle(env,robot,posangle);
				return ;
			}
		}

		if(distance < 0.4)
		{	//停止并转向		return!!!!!!
			//radious of robot is about 1.5 ,so the distance is very short
			if( v<0.1 && v>-0.1)
			{	//the range of v shoud be tested 
				if(bestangle == 0)
					Velocity(env,robot,0,0);
				else
					Angle(env,robot,bestangle);
				return	;
			}
		}

		if(true)
		{
			vmax=125;
			if(face)
			{
				f=-vmax;		//减速度  为  0000000
				v1=VelocityOne(v1,-f,-f);		//加速一步
				s=v1;
				do{//whether to reduce
					if(v1 > SPEED_ZERO)	//as i said,this is limited
						v1=VelocityOne(v1,0,0);
					else 
						v1=VelocityOne(v1,f,f);
					s+=v1;
				}while( v1 > 0 );

				s-=v1;

				if(s < distance)
				{//不满足减速条件加速
					Velocity(env,robot,-f,-f);
				}
				else
				{
					if(v > SPEED_ZERO)
						Velocity(env,robot,0,0);
					else
					{
						v1=VelocityOne(v,f,f);		//减速一步
						if( v1 < 0 )
						{
							do{//该降低功率了
								f++;		//f=-vmax;
								v1 = VelocityOne(v,f,f);
							}while( v1 < distance && f < vmax);	
						}
						Velocity(env,robot,f,f);
					}
				}
			}			
			else
			{
				f=vmax;		//减速度!!!!!
				v1=VelocityOne(v1,-f,-f);
				s=v1;
				do{//whether to reduce
					if(v1 < -SPEED_ZERO)	//as i said,this is limited
						v1=VelocityOne(v1,0,0);
					else 
						v1=VelocityOne(v1,f,f);
					s+=v1;
				}while( v1 < -0.1 );

				s-=v1;

				if(s > -distance)
				{//不满足减速条件加速
					Velocity(env,robot,-f,-f);
				}
				else
				{
					if(v < -SPEED_ZERO)
						Velocity(env,robot,0,0);
					else
					{
						v1=VelocityOne(v,f,f);		//减速一步
						if( v1 > 0 )
						{
							do{//该降低功率了
								f--;		//f=-vmax;
								v1 = VelocityOne(v,f,f);
							}while( v1 > -distance && f > -vmax);	
						}
						Velocity(env,robot,f,f);
					}
				}
			}	
		}
	}
}

//
/*GoaliePosition 让robot 跑到pos,并且停下来,
bestangle 是停下来之后的朝向,
limit	控制停在pos附近的距离
	注意这个函数是针对守门员写的,
*/
//
void GoaliePosition(Environment *env,int  robot,Vector3D pos ,double bestangle,double limit) 
{	//考虑到可能的	急停和 急快速加速
	//特别作了优化
	//还有就是 被碰转后的转角过程 不能耽搁时间!!!
	//转角是最危险的过程

	Mydata * p;
	p=(Mydata *)env->userData;
	
	double anglespeedmax=0;		//控制转交速度的变量
	double vmax=125;			//默认的跑位加速度
	double Limitedangle=2;		//默认减速范围

	if( limit < 0.5 )
		limit =0.5;
	double Limiteddis=limit;	//减速范围有一个下限,保证不会来回跑动
	
	double  distance;			//robot和目标点的距离
	double turnangle,posangle,vangle;	//转动角度 ,目标点相对robot的角度,速度的绝对角度
	double dx,dy;				//pos  和robot的坐标差
	double a=SPEED_A;			//参数
	double b=SPEED_B;
	double v,v1;				//临时保存速度的大小!!!
	double f=vmax;				//加速度变量
	double s=0;					//预测的减速位移(路程)
	int n=0;					//跑位的步数
	bool face=true;			//判断小车是否是正面前进

	v= sqrt(p->myspeed[robot].x * p->myspeed[robot].x + p->myspeed[robot].y*p->myspeed[robot].y);
	//临时保存速度的大小!!!
	dx = pos.x - p->robot[robot].pos.x ;		//pos  和robot的坐标差
	dy = pos.y - p->robot[robot].pos.y ;
	

⌨️ 快捷键说明

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