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

📄 decisionmakingx.cpp

📁 该程序实现FIRE足球机器人竞赛中的3:3比赛源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		{
			if(ball.y > CENTER_Y + 10) 
				IsClockWise = 1;
			else if(ball.y < CENTER_Y - 10)
				IsClockWise = -1;
			else if(pRobot->y < ball.y)
				IsClockWise = 1;
			else 
				IsClockWise = -1;
		}
		moveTheta = theta_rb + k*IsClockWise/dist*(pi/2);
		if(dist > 50)
			s_MoveOnAngle(pRobot,moveTheta,m_MoveParameter.V_max,pSpeed);
		else
			s_MoveOnAngle(pRobot,moveTheta,m_MoveParameter.V_max,pSpeed);
		if(k==0)
			s_Move2Pt(pRobot,ball,m_MoveParameter.V_max,pSpeed);*/
	dbPOINT goal;
	goal.x = wallright;
	goal.y = walltop/2;
	ToPositionNew(pRobot,ball,goal,70,2,pSpeed);
	if(pRobot->x>ball.x)
		{
			dbPOINT pt;
			double det;
			det = 30;
			pt.x =ball.x +100;
			pt.y = 2*ball.y-pRobot->y;
			if(pt.y>ball.y)
				pt.y = ball.y + 5;
			else
				pt.y = ball.y - 5;
			if(ball.y<det)
				pt.y = ball.y - 3;
			else if(ball.y>walltop-det)
				pt.y = ball.y + 3;
			ToPositionNew(pRobot,ball,pt,70,0,pSpeed);	
		}
	return 1;
}
///////////////////////////////////////////////////////
//函数   DribleBall()
//函数名 带球至对方球门
///////////////////////////////////////////////////////
int CDecisionMakingx::DribleBall(dbROBOTPOSTURE *pRobot,ballInformation ball ,dbLRWheelVelocity *pSpeed)
{

	return 1;
}
///////////////////////////////////////////////////////
//函数   Defence()
//函数名 防守
///////////////////////////////////////////////////////
int CDecisionMakingx::Defence(dbROBOTPOSTURE *pRobot,ballInformation ball ,dbLRWheelVelocity *pSpeed)
{
		double		theta_rb;		
		double		dx,dy;
		double		dist;
		int			IsClockWise = 0;
		dbPOINT		target;
		double		moveTheta,theta_e;
		double		k = 1.0; 
///////////////////////////////////////////
		dx = ball.x - pRobot->x;
		dy = ball.y - pRobot->y;
		dist = sqrt(dx*dx + dy*dy);

		target.x = ball.x;
		target.y = ball.y;

		theta_rb = atan2(dy,dx);	 
		theta_rb = cn_AngleTrim2PI(theta_rb);
		pRobot->theta = cn_AngleTrim2PI(pRobot->theta);
///////////////////////////////////////////
	if(ball.x > pRobot->x + 5)
	{
		if((theta_rb < 65.0/180*pi && theta_rb >= 0 ) || (theta_rb < 2*pi && theta_rb > 300.0/180*pi)) // 55-- 305 
		{
			theta_e = theta_rb - pRobot->theta;
			theta_e = cn_AngleTrim2PI(theta_e);
			if(theta_e > pi) theta_e -= pi;
			if(theta_e > pi/2)	theta_e = pi - theta_e;

			if(theta_e < pi/6)						// Deb %%% modify 30
			{
				Move2Pt(pRobot,target,m_MoveParameter.V_max,pSpeed);
				return  0;
			}
		}

		double tempC = 0.5*dist/cos(theta_rb);
		if( tempC < 0 ) tempC =0;	// should +		
		target.x = ball.x - tempC;
		if(target.y < wallbottom + BOUND1) 
			target.y= wallbottom + BOUND1;
		else if(target.y > walltop - BOUND1)
			target.y= walltop - BOUND1;
		else if(target.y < GOAL_UP_LINE + 2 && target.y > GOAL_DN_LINE - 2)
		{
			if(target.x < goal_x_widthM + 4) 
				target.x = goal_x_widthM + 4;//2
			if(pRobot->x < goal_x_widthM + 5) 
			{  
				theta_e = pRobot->theta;			
				if(theta_e > pi) theta_e -= pi;
				theta_e -= pi/2;
				if(fabs(theta_e) > pi/6)
				{ 
					TurnToAnglePD(pRobot,pi/2,NOCLOCK,pSpeed);
					return 0;
				}
				else			
					target.x = ball.x;	// ????	
			}
		}
		else 
		{	
			if(target.x < wallleft + BOUND1) 
				target.x = wallleft + BOUND1;
		}		
		ToPositionPD(pRobot,target,m_MoveParameter.V_max,10.0,pSpeed);	// Vbase pt
		return 0;
	}
	else
	{
		if(pRobot->x < goal_x_widthM + 4) 
		    if( pRobot->y < GOAL_UP_LINE + 2 && pRobot->y > GOAL_DN_LINE - 2)
			{
				 theta_e = pRobot->theta;
				if(theta_e > pi) theta_e -= pi;
					theta_e -= pi/2;
				if(fabs(theta_e) > pi/6)			
					TurnToAnglePD(pRobot,pi/2,NOCLOCK,pSpeed);
				else
				{
					target.x = goal_x_widthM;//+2
					if(ball.y > GOAL_UP_LINE + 2)
						target.y = GOAL_UP_LINE + 8;
					else if(ball.y < GOAL_DN_LINE - 2)
						target.y = GOAL_DN_LINE - 8;
					else
						target.y = ball.y;
//					ToPositionPD(pRobot,target,m_MoveParameter.V_max,10.0,pSpeed);	// Vbase pt
					Move2Pt(pRobot,target,pSpeed);
				}
				return 0;
			}
			else if( ball.x < goal_x_widthM)
			{
				target.y = 0;
				if(ball.y > GOAL_UP_LINE + 6)
					target.y = GOAL_UP_LINE + 8;
				else if(ball.y < GOAL_DN_LINE - 6)
					target.y = GOAL_DN_LINE - 8;
				//else						//	????
				//	target.y= ball.y;			
				if(target.y != 0)
				{
					ToPositionPD(pRobot,target,m_MoveParameter.V_max,10.0,pSpeed);	// Vbase pt
					return 0;
				}
			} 

		if(dist > 40) k = 0;
		else k = 15;//12
		// according to the position of ball compared with robot;
		if(ball.y > UP_LINE)
			IsClockWise = 1;		
		else if(ball.y < DN_LINE)		
			IsClockWise = -1;	
		else
		{
			if(pRobot->y < ball.y ) 
				IsClockWise = 1;
			else
				IsClockWise = -1;
		}
		moveTheta = theta_rb + k*IsClockWise/dist*(pi/2);
		if(dist > 50)
			MoveOnAngle(pRobot,moveTheta,m_MoveParameter.V_max,pSpeed);
		else
			MoveOnAngle(pRobot,moveTheta,m_MoveParameter.V_max/2,pSpeed);
	}
	return 0;
}
//末端处理(不能应用到球在车后的情况)
int CDecisionMakingx::EndProcess(int i,dbROBOTPOSTURE *pRobot,dbPOINT shoot_target,dbPOINT ballPt,dbLRWheelVelocity *pSpeed)
{
		double	r,dist,distE,anglerb2ball,anglerb2target,angle1,angle2,angle3,angle4,angleball2target,angle5,maxe,maxd,maxspeed;
		dbPOINT rbPt,EGoal;
		maxspeed = 60;//80
		EGoal.x = wallright + 4;
		EGoal.y = walltop/2;
		maxd = 15;
		maxe = 2.8;
		r = 2.8;//2.8;
		dist = distRobot2Pt(*pRobot,ballPt);//求出球和小车的距离
		rbPt.x = pRobot->x;
		rbPt.y = pRobot->y;
		anglerb2ball = Getpt2ptAngle(rbPt,ballPt);//小车指向球的方向
		anglerb2target = Getpt2ptAngle(rbPt,EGoal);//小车指向目标的方向
		angleball2target = Getpt2ptAngle(ballPt,shoot_target);//球到目标方向
		angle1 = cn_AngleTrim2PI(anglerb2ball - anglerb2target);

		if(angle1>pi&&angle1<=2*pi)
			angle1 =angle1 - 2*pi;

		angle2 = cn_AngleTrim2PI(pRobot->theta);
		angle3 = cn_AngleTrim2PI(angle2 - anglerb2ball);

		//末端圆弧
		double radiu;
		double samespeed = 40.0;
//		double theta_E,theta1,theta2;
		LINEFORMULATION line1,line2,line3;
		dbPOINT tempPt1,tempPt2,tempPt3;
		tempPt1.x = pRobot->x;tempPt1.y = pRobot->y;
		StdLineForm(tempPt1,pRobot->theta, &line1);//点斜式得出车的直线方程L1
		cn_PointPerpendLine(tempPt1, &line1, &line2, &tempPt2);//过车作L1的垂线方程L2
		StdLineForm(tempPt1, ballPt, &line1);//车球连线方程L3
		tempPt2.x = (pRobot->x + ballPt.x)/2;
		tempPt2.y = (pRobot->y + ballPt.y)/2;//车球中点c
		cn_PointPerpendLine(tempPt2, &line1, &line3, &tempPt3);//过c作L3的垂线方程
		cn_2LinesCrossPoint(&line2, &line3, &tempPt3);//L2和L3的交点即圆心
		//xue
		double angle8;
		dbPOINT roundpt;
		roundpt = tempPt3;
		angle8 = cn_AngleTrim2PI(angle2 - Getpt2ptAngle(rbPt,ballPt));
	//	BOOL sign1;

		radiu = cn_2PointsDist(tempPt3,ballPt);
		StdLineForm(tempPt3, ball, &line1);//圆心球连线方程L4
		cn_PointPerpendLine(ball, &line1, &line2, &tempPt2);//过球作L4的垂线方程L5,L5即为触球时的切线

	
		///xue
		angle4 = angle2 - anglerb2ball;

		if(rbPt.y<-(line2.a*rbPt.x+line2.c)/line2.b)
		{
			if(angle8<=pi)
			{
				angle5 = cn_AngleTrim2PI(anglerb2ball - angle4);
			}
			else
			{
				angle5 = cn_AngleTrim2PI(anglerb2ball + pi - angle4);
			}
		}
		else
		{
			if(angle8<=pi)
			{
				angle5 = cn_AngleTrim2PI(anglerb2ball + pi - angle4);
			}
			else
			{
				angle5 = cn_AngleTrim2PI(anglerb2ball - angle4);
			}
		}
	
		if(angle5>pi)
			angle5 -=2*pi;
		dbPOINT pt1,pt2;
		pt1.x =wallright;
		pt1.y = CENTER_Y+20;
		pt2.x = wallright;
		pt2.y = CENTER_Y-20;
		double angle6,angle7;
		angle6 = Getpt2ptAngle(ballPt,pt1);
		if(angle6>pi)
			angle6 -=2*pi;
		angle7 = Getpt2ptAngle(ballPt,pt2);
		if(angle7>pi)
			angle7 -=2*pi;
		//xue

		double y = -(line2.a*150 + line2.c)/line2.b;
		if(angle5>angle7&&angle5<angle6&&angle2!=anglerb2ball&&line2.b!=0&&rbPt.x<ballPt.x&&ball.x<EGoal.x&&i>1)//角度差在一定范围时以圆轨迹前进
		{
			//xue4.25
			samespeed = radiu/150*35+60;
			if(samespeed > 110)
				samespeed = 110;
			//xue 4.26
			double angleround;
			angleround = cn_AngleTrim2PI(Getpt2ptAngle(roundpt,rbPt)-Getpt2ptAngle(roundpt,ballPt));

			if(rbPt.y<-(line2.a*rbPt.x+line2.c)/line2.b&&angleround<pi*1.2)
			{
				if(angle8<=pi)
				{
					pSpeed->LeftValue = (radiu + r)/radiu*samespeed;
					pSpeed->RightValue = (radiu - r)/radiu*samespeed;
				}
				else
				{
					pSpeed->RightValue = -(radiu + r)/radiu*samespeed;
					pSpeed->LeftValue = -(radiu - r)/radiu*samespeed;
				}
			}
			else if(rbPt.y>=-(line2.a*rbPt.x+line2.c)/line2.b&&(2*pi -  angleround)<pi*1.2)//xue 4.26
			{
				if(angle8<=pi)
				{
					pSpeed->LeftValue = -(radiu + r)/radiu*samespeed;
					pSpeed->RightValue = -(radiu - r)/radiu*samespeed;
				}
				else
				{
					pSpeed->RightValue = (radiu + r)/radiu*samespeed;
					pSpeed->LeftValue = (radiu - r)/radiu*samespeed;
				}
			}
		}

		distE = fabs(dist*sin(angle3));
		//球和车距离很近,车在对方门区附近,车在球后,车和球的连线与右边界的交点在对方球门附近
	/*	if(dist<=maxd&&pRobot->x>CENTER_X+wallright/4&&pRobot->x<ballPt.x&&fabs(angle1)<pi*0.45)
			TurnTo(pRobot,ball,EGoal,124,pSpeed);*/
		//球和车距离很近,球在车的轨迹范围内,射门角度不是很大
		if(dist<=maxd&&distE<=maxe&&i>0)
		{
			//xue
			double anglelimit,anglet1,anglet2,anglet3,kk;
			kk = 0.85;/////////////////////////////0.9
			anglelimit = (150-pRobot->x -5)/(150 - 5)*pi*.2 + pi*.0.2;/////0.2
			if(anglelimit>pi*.4)
				anglelimit = pi*.4;
			dbPOINT pt1,pt2;
			pt1.x = pt2.x = wallright;
			pt1.y = CENTER_Y+20;
			pt2.y = CENTER_Y-20;
			//

			//正面向球,
			if(angle3<pi*0.2&&angle3>=0||angle3>pi*1.8&&angle3<2*pi)
			{
				double anglek;
				anglek = cn_AngleTrim2PI(pRobot->theta - anglerb2target);
				if(anglek>pi)
					anglek -=2*pi;

				//xue
				anglet1 = cn_AngleTrim2PI(pRobot->theta - Getpt2ptAngle(rbPt,pt1));
				if(anglet1>pi)
					anglet1 -=2*pi;
				anglet2 = cn_AngleTrim2PI(pRobot->theta - Getpt2ptAngle(rbPt,pt2));
				if(anglet2>pi)
					anglet2 -=2*pi;
				if(fabs(anglet1)>fabs(anglet2))
					anglet3 = fabs(anglet2);
				else
					anglet3 = fabs(anglet1);
				
				//
				if(anglet3<anglelimit||(anglet1*anglet2<0))//xue
				{
					if(anglek>0)
					{
						if(anglek<pi/2)
							pSpeed->LeftValue = (maxspeed-60)*(pi/2-fabs(anglek))/pi*2+60;
						else
							pSpeed->LeftValue = 70;

						pSpeed->RightValue = pSpeed->LeftValue*fabs(cos(anglek))*kk;
						
					}
					else 
					{	
					
						if(anglek>-pi/2)//(anglek<pi/2)
							pSpeed->RightValue = (maxspeed-60)*(pi/2-fabs(anglek))/pi*2+60;
						else
							pSpeed->RightValue = 70;
						//pSpeed->RightValue = maxspeed;
						pSpeed->LeftValue = pSpeed->RightValue*fabs(cos(anglek))*kk;
						
					}
				}
			}
			//后面向球
			else if(angle3>pi - pi*0.2&&angle3<pi+pi*0.2&&i>0)
			{
				double anglek;
				anglek = cn_AngleTrim2PI(pRobot->theta+pi - anglerb2target);
				if(anglek>pi)
					anglek -=2*pi;
				//xue
				anglet1 = cn_AngleTrim2PI(pRobot->theta - Getpt2ptAngle(rbPt,pt1)+pi);
				if(anglet1>pi)
					anglet1 -=2*pi;
				anglet2 = cn_AngleTrim2PI(pRobot->theta - Getpt2ptAngle(rbPt,pt2)+pi);
				if(anglet2>pi)
					anglet2 -=2*pi;
				if(fabs(anglet1)>fabs(anglet2))
					anglet3 = fabs(anglet2);
				else
					anglet3 = fabs(anglet1);
				
				//
				if(anglet3<anglelimit||(anglet1*anglet2<0))
				{
					if(anglek>0)
					{
					//	pSpeed->RightValue = -maxspeed;
						if(anglek<pi/2)
							pSpeed->RightValue = (maxspeed-60)*(pi/2-fabs(anglek))/pi*2+60;
						else
							pSpeed->RightValue = 70;
						pSpeed->RightValue = -pSpeed->RightValue;

						pSpeed->LeftValue = pSpeed->RightValue*fabs(cos(anglek))*kk;
					}
					else
					{
						if(anglek>-pi/2)//(anglek<pi/2)
							pSpeed->LeftValue = (maxspeed-60)*(pi/2-fabs(anglek))/pi*2+60;
						else
							pSpeed->LeftValue = 70;
						pSpeed->LeftValue = -pSpeed->LeftValue;

					//	pSpeed->LeftValue = -maxspeed;
						pSpeed->RightValue = pSpeed->LeftValue*fabs(cos(anglek))*kk;
		
					}
				}
			}
		}

		//角度特别好的处理
		//正面向球
		//maxe应等于(7.5/2-4/2)/sin(angle3)
		if((angle3<pi*0.2&&angle3>=0||angle3>pi*1.8&&angle3<2*pi)&&fabs(angle1)<pi*0.45&&distE<=maxe&&(angle2>=0&&angle2<=pi*0.45||angle2>=pi*1.55&&angle2<=2*pi))
		//if((angle3<pi*0.4&&angle3>=0||angle3>pi*1.6&&angle3<2*pi)&&fabs(angle1)<pi*0.45&&distE<=maxe&&(angle2>=0&&angle2<=pi*0.45||angle2>=pi*1.55&&angle2<=2*pi))
		{
			double temp;
			temp = pRobot->y+(wallright-pRobot->x)*tan(angle2);
			if(temp>=GATE_DN_LINE+1&&temp<=GATE_UP_LINE-

⌨️ 快捷键说明

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