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

📄 decisionmakingx.cpp

📁 足球机器人仿真组SimuroSot11vs11的源程序。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
{
	dbLRWheelVelocity* pSpeed = &rbV[nRobot];
	
	dbPOINT shoot_target;
	shoot_target.x = posTarget.GetX();
	shoot_target.y = posTarget.GetY();
	dbPOINT ballPt;
	ballPt.x = posBall.GetX();
	ballPt.y = posBall.GetY();
	
	
/************************************************************************/
/*  末端圆弧                                                            */
/*	可调参数: r, samespeed												*/
/************************************************************************/
/////////    ///////////////////////////////////////////////////////////////////////
	double	dist,distE,anglerb2ball,anglerb2target;
	double angle1,angle2,angle3,angle4,angleball2target,angle5;
	dbPOINT rbPt,EGoal;

	EGoal.x = PITCH_LENGTH + 3;
	EGoal.y = PITCH_WIDTH/2;
	
	dist = distRobot2Pt(Robot[nRobot],ballPt);//求出球和小车的距离
	rbPt.x = Robot[nRobot].x;
	rbPt.y = Robot[nRobot].y;
	anglerb2ball = Getpt2ptAngle(rbPt,ballPt);//小车指向球的方向
	anglerb2target = Getpt2ptAngle(rbPt,EGoal);//小车指向目标的方向
	angleball2target = Getpt2ptAngle(ballPt,shoot_target);//球到目标方向
	angle1 = VecPosition::NormalizeAngle2PI(anglerb2ball - anglerb2target);
	
	angle1 = VecPosition::NormalizeAngle(angle1);
	
	angle2 = VecPosition::NormalizeAngle2PI(Robot[nRobot].theta);
	angle3 = VecPosition::NormalizeAngle2PI(angle2 - anglerb2ball);
	
	// r大,圆半径变小
	double r = 18;//2.65;
	double radiu;

	LINEFORMULATION line1,line2,line3;
	dbPOINT tempPt1,tempPt2,tempPt3;
	tempPt1.x = Robot[nRobot].x;
	tempPt1.y = Robot[nRobot].y;
	StdLineForm(tempPt1,Robot[nRobot].theta, &line1);//点斜式得出车的直线方程L1
	cn_PointPerpendLine(tempPt1, &line1, &line2, &tempPt2);//过车作L1的垂线方程L2
	StdLineForm(tempPt1, ballPt, &line1);//车球连线方程L3
	tempPt2.x = (Robot[nRobot].x + ballPt.x)/2;
	tempPt2.y = (Robot[nRobot].y + ballPt.y)/2;//车球中点c
	cn_PointPerpendLine(tempPt2, &line1, &line3, &tempPt3);//过c作L3的垂线方程
	cn_2LinesCrossPoint(&line2, &line3, &tempPt3);//L2和L3的交点即圆心

	double angle8;
	dbPOINT roundpt;
	roundpt = tempPt3;
	angle8 = VecPosition::NormalizeAngle2PI(angle2 - Getpt2ptAngle(rbPt,ballPt));

	radiu = cn_2PointsDist(tempPt3,ballPt);
	StdLineForm(tempPt3, ballPt, &line1);//圆心球连线方程L4
	cn_PointPerpendLine(ballPt, &line1, &line2, &tempPt2);//过球作L4的垂线方程L5,L5即为触球时的切线
	
	
	angle4 = angle2 - anglerb2ball;
	
	if(rbPt.y<-(line2.a*rbPt.x+line2.c)/line2.b)
	{
		if(angle8<=PI)
		{
			angle5 = VecPosition::NormalizeAngle2PI(anglerb2ball - angle4);
		}
		else
		{
			angle5 = VecPosition::NormalizeAngle2PI(anglerb2ball + PI - angle4);
		}
	}
	else
	{
		if(angle8<=PI)
		{
			angle5 = VecPosition::NormalizeAngle2PI(anglerb2ball + PI - angle4);
		}
		else
		{
			angle5 = VecPosition::NormalizeAngle2PI(anglerb2ball - angle4);
		}
	}
	
	if(angle5>PI)
		angle5 -=2*PI;
	dbPOINT pt1,pt2;
	pt1.x = PITCH_LENGTH;
	pt1.y = PITCH_WIDTH/2+GOAL_WIDTH/2;
	pt2.x = PITCH_LENGTH;
	pt2.y = PITCH_WIDTH/2-GOAL_WIDTH/2;
	double angle6,angle7;
	angle6 = Getpt2ptAngle(ballPt,pt1);
	if(angle6>PI)
		angle6 -=2*PI;
	angle7 = Getpt2ptAngle(ballPt,pt2);
	if(angle7>PI)
		angle7 -=2*PI;

	//角度差在一定范围时以圆轨迹前进
	if(angle5>angle7
		&& angle5<angle6
		&& angle2!=anglerb2ball
		&& line2.b!=0
		&& rbPt.x<ballPt.x
		&& ballPt.x<EGoal.x
		&& IfEndprocess>2)
	{
		double samespeed = radiu/150*40+80;
		if(samespeed > MAXSPEED)
			samespeed = MAXSPEED;

//		SendMsg(2, "E3 : %2.2f, %2.2f", radiu, samespeed);

		double angleround;
		angleround = VecPosition::NormalizeAngle2PI(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;
				if(pSpeed->LeftValue>MAXSPEED)
				{
					pSpeed->RightValue = MAXSPEED - pSpeed->LeftValue + pSpeed->RightValue;
					pSpeed->LeftValue = MAXSPEED;
				}
			}
			else
			{
				pSpeed->RightValue = -(radiu + r)/radiu*samespeed;
				pSpeed->LeftValue = -(radiu - r)/radiu*samespeed;
				if(pSpeed->RightValue<-MAXSPEED)
				{
					pSpeed->LeftValue = -MAXSPEED + pSpeed->RightValue - pSpeed->LeftValue;
					pSpeed->RightValue = -MAXSPEED;
				}
			}
		}
		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;
				if(pSpeed->LeftValue<-MAXSPEED)
				{
					pSpeed->RightValue = -MAXSPEED + pSpeed->LeftValue - pSpeed->RightValue;
					pSpeed->LeftValue = -MAXSPEED;
				}
			}
			else
			{
				pSpeed->RightValue = (radiu + r)/radiu*samespeed;
				pSpeed->LeftValue = (radiu - r)/radiu*samespeed;
				if(pSpeed->RightValue>MAXSPEED)
				{
					pSpeed->LeftValue = MAXSPEED - pSpeed->RightValue + pSpeed->LeftValue;
					pSpeed->RightValue = MAXSPEED;
				}
			}
		}
	}
	

/************************************************************************/
/*  末端余弦                                                            */
/*	可调参数: maxd, maxe, kk, basespeed, kk								*/
/************************************************************************/

	// samespeed
	double basespeed = MAXSPEED;//100+(220-Robot[nRobot].x)/200*20;
	basespeed = Maths::Limit(basespeed, 100, MAXSPEED);

	double kk = 0.7;			// 余弦参数
	double maxd = 16;		// 球和车距离范围
	double maxe = 3.7;		// 轨迹范围
	distE = fabs(dist*sin(angle3));
	//球和车距离很近,球在车的轨迹范围内,射门角度不是很大
	if(dist<=maxd
		&& distE<=maxe
		&& IfEndprocess>1)
	{
	//	SendMsg(2, " cos");

		double anglelimit,anglet1,anglet2,anglet3;
		anglelimit = (150-Robot[nRobot].x-5)/(150 - 5)*PI*.2 + PI*.2;
		if(anglelimit>PI*.4)
			anglelimit = PI*.4;
		dbPOINT pt1,pt2;
		pt1.x = pt2.x = PITCH_LENGTH;
		pt1.y = PITCH_WIDTH/2+GOAL_WIDTH/2;
		pt2.y = PITCH_WIDTH/2-GOAL_WIDTH/2;
		
		//正面向球,
		if(angle3<PI*0.2&&angle3>=0||angle3>PI*1.8&&angle3<2*PI)
		{
			double anglek;
			anglek = VecPosition::NormalizeAngle2PI(Robot[nRobot].theta - anglerb2target);
			if(anglek>PI)
				anglek -=2*PI;
			
			//xue
			anglet1 = VecPosition::NormalizeAngle2PI(Robot[nRobot].theta - Getpt2ptAngle(rbPt,pt1));
			if(anglet1>PI)
				anglet1 -=2*PI;
			anglet2 = VecPosition::NormalizeAngle2PI(Robot[nRobot].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
			{
				//带球标志
				sym[2] = currentOrder[1];
				sym[1] = 1;
				sym[0] = 1;
				
				if(anglek>0)
				{
					if(fabs(anglek)<PI/2)
						pSpeed->LeftValue = (MAXSPEED-basespeed)*(PI/2-fabs(anglek))/PI*2+basespeed;
					else
						pSpeed->LeftValue = basespeed;
					
					pSpeed->RightValue = pSpeed->LeftValue*fabs(cos(anglek))*kk;
				}
				else 
				{	
					
					if(fabs(anglek)<PI/2)
						pSpeed->RightValue = (MAXSPEED-basespeed)*(PI/2-fabs(anglek))/PI*2+basespeed;
					else
						pSpeed->RightValue = basespeed;
					pSpeed->LeftValue = pSpeed->RightValue*fabs(cos(anglek))*kk;
					
				}
			}
		}
		//后面向球
		else if(angle3>PI - PI*0.2&&angle3<PI+PI*0.2)
		{
			double anglek;
			anglek = VecPosition::NormalizeAngle2PI(Robot[nRobot].theta+PI - anglerb2target);
			if(anglek>PI)
				anglek -=2*PI;
			//xue
			anglet1 = VecPosition::NormalizeAngle2PI(Robot[nRobot].theta - Getpt2ptAngle(rbPt,pt1)+PI);
			if(anglet1>PI)
				anglet1 -=2*PI;
			anglet2 = VecPosition::NormalizeAngle2PI(Robot[nRobot].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))
			{
				//带球标志
				sym[2] = currentOrder[1];
				sym[1] = 0;
				sym[0] = 1;
				
				if(anglek>0)
				{
					if(fabs(anglek)<PI/2)
						pSpeed->RightValue = (MAXSPEED-basespeed)*(PI/2-fabs(anglek))/PI*2+basespeed;
					else
						pSpeed->RightValue = basespeed;

					pSpeed->RightValue = -pSpeed->RightValue;
					pSpeed->LeftValue = pSpeed->RightValue*fabs(cos(anglek))*kk;
				}
				else
				{
					if(fabs(anglek)<PI/2)
						pSpeed->LeftValue = (MAXSPEED-basespeed)*(PI/2-fabs(anglek))/PI*2+basespeed;
					else
						pSpeed->LeftValue = basespeed;
					pSpeed->LeftValue = -pSpeed->LeftValue;
				
					pSpeed->RightValue = pSpeed->LeftValue*fabs(cos(anglek))*kk;
					
				}
				
			}
		}
	}
		
/************************************************************************/
/*  末端直线                                                            */
/*	可调参数: maxe, angleLimit1,2										*/
/************************************************************************/	
	//角度特别好的处理
	if (IfEndprocess > 0)
	{
		maxe = 4;
		double angleLimit1 = 0.2*PI;
		double angleLimit2 = 0.45*PI;

		//正面向球
		if((angle3<angleLimit1&&angle3>=0||angle3>2*PI-angleLimit1&&angle3<2*PI)
			&&fabs(angle1)<PI*0.45
			&&distE<=maxe&&
			(angle2>=0 &&angle2<=angleLimit2||angle2>=2*PI-angleLimit2))
		{
			double temp;
			temp = Robot[nRobot].y+(PITCH_LENGTH-Robot[nRobot].x)*tan(angle2);
			if(temp>= PITCH_WIDTH/2 - GOAL_WIDTH/2 +1
				&&temp <= PITCH_WIDTH/2 + GOAL_WIDTH/2 -1)
			{
//				SendMsg(2, "line");

				pSpeed->LeftValue = pSpeed->RightValue = MAXSPEED;
				//带球标志
				sym[2] = currentOrder[1];
				sym[1] = 1;
				sym[0] = 1;
			}
		}
		//后面向球
		else if((angle3>PI - angleLimit1&&angle3<PI+angleLimit1)
			&&fabs(angle1)<PI*0.45
			&&distE<=maxe
			&&angle2>=PI-angleLimit2&&angle2<=2*PI-angleLimit2)
		{
			double temp;
			temp = Robot[nRobot].y+(PITCH_LENGTH-Robot[nRobot].x)*tan(angle2);
			if(temp>=PITCH_WIDTH/2 - GOAL_WIDTH/2+1
				&&temp<=PITCH_WIDTH/2 + GOAL_WIDTH/2-1)
			{
//				SendMsg(2, "line");
			
			
				pSpeed->LeftValue = pSpeed->RightValue = -MAXSPEED;
				//带球标志
				sym[2] = currentOrder[1];
				sym[1] = 0;
				sym[0] = 1;
			}
		}
	}	
}

////////////////// Basic Actions End /////////////////////////////////////////////////////

////////////////// Complex Actions ///////////////////////////////////////////////////////

/************************************************************************/
/*  射门函数                                                            */
/************************************************************************/
void CDecisionMakingx::Vect_MidShoot(int nRobot)
{
	VecPosition posGoal(PITCH_LENGTH, PITCH_WIDTH/2);
	VecPosition posBall;
	GetToPositionNewPerformance(11, nRobot, posGoal, posBall);
	ToPositionNew(nRobot, posGoal, posBall, MAXSPEED, 0);	
	return;
	if(Robot[nRobot].x > m_posBall.GetX())
	{
		VecPosition pos;
		double det = 30;
		pos.SetX(m_posBall.GetX() +100);
		if(m_posBall.GetY() > Robot[nRobot].y)
			pos.SetY(m_posBall.GetY() + 5);
		else
			pos.SetY(m_posBall.GetY() - 5);
		
		if(m_posBall.GetY() < det)
			pos.SetY(m_posBall.GetY() - 3);
		else if(m_posBall.GetY() > PITCH_WIDTH-det)
			pos.SetY(m_posBall.GetY() + 3);
		ToPositionNew(nRobot, pos, m_posBall, 110, 2);	
	}
}

/************************************************************************/
/*  中分线射门                                                          */
/************************************************************************/
void CDecisionMakingx::Vect_MidShoot1(int nRobot)
{
	VecPosition posRobot(Robot[nRobot].x, Robot[nRobot].y);
	VecPosition posGoal(PITCH_LENGTH, PITCH_WIDTH/2);
	VecPosition posBall = m_posBall;

	Line lineBall2Goal = Line::MakeLineFromTwoPoints(posGoal, posBall);
	double L = 0, R = 30;
	VecPosition posShoot = lineBall2Goal.GetPointInLine(posBall, -L);
	Line linePerp = lineBall2Goal.GetPerpendicularLine(posShoot);
	VecPosition posCenter = linePerp.GetPointInLine(posShoot, -R);
	Circle c(posCenter, R);
	Line lineRobot2Shoot = Line::MakeLineFromTwoPoints(posRobot, posShoot);
	VecPosition posMid = (posRobot + posShoot)/2;
	Line linePerp2 = lineRobot2Shoot.GetPerpendicularLine(posMid);
	VecPosition posSolu[2], posTarget;
	linePerp2.GetCircleIntersectionPoints(c, &posSolu[0], &posSolu[1]);
	if ( posSolu[0].GetDistanceTo(posRobot) > posSolu[1].GetDistanceTo(posRobot))
		posTarget = posSolu[1];
	else
		posTarget = posSolu[0];

	ToPositionPD(nRobot, posTarget, 100);

	SendMsg(3, "%2.2f, %2.2f", posTarget.GetX(), posTarget.GetY());
}

// 圆弧射门 
void CDecisionMakingx::Vect_MidShoot2(int nRobot)
{
	VecPosition posRobot(Robot[nRobot].x, Robot[nRobot].y);
	VecPosition posGoal(PITCH_LENGTH, PITCH_WIDTH/2);
	VecPosition posBall = m_posBall;

	double L = 5;
	Line lineBall2Goal = Line::MakeLineFromTwoPoints(posBall, posGoal);
	posBall = lineBall2Goal.GetPointInLine(posBall, L* 
		( (posBall.GetX() < posGoal.GetX()) ? -1 : 1 ));
	Line linePerBall2Goal = lineBall2Goal.GetPerpendicularLine(posBall);
	Line lineRobot2Ball = Line::MakeLineFromTwoPoints(posRobot, posBall);
	Line lineMidPerRobot2Ball = lineRobot2Ball.GetPerpendicularLine((posRobot+posBall)/2);
	VecPosition posCenter = linePerBall2Goal.GetIntersection(lineMidPerRobot2Ball);

	double dRadius = (posCenter-posBall).GetMagnitude();
	Circle circle(posCenter, dRadius);
//	double d = (posCenter - posRobot).GetMagnitude();

	rbV[nRobot].LeftValue = (dRadius-4.0);//-(dRadius + 4.1)/dRadius * 100;
	rbV[nRobot].RightValue = (dRadius+4.0);//-(dRadius - 4.1)/dRadius * 100;

//	EndProcess(1, nRobot, posGoal, m_posBall);
//	rbV[nRobot].LeftValue = -12;//-(dRadius + 4.1)/dRadius * 100;
//	rbV[nRobot].RightValue = 0;//-(dRadius - 4.1)/dRadius * 100;
}

int CDecisionMakingx::Vect_MidShootli(dbROBOTPOSTURE pRobotInford, BallInformation &ball,dbLRWheelVelocity *pSpeed)
{
//	pSpeed->LeftValue = pSpeed->RightValue = 0;
//	return 1;

	dbPOINT	goal,ballPt;
	double delta,angletemp;
	delta = 10;
	ballPt = ball;
	goal.x = PITCH_LENGTH + 5;
	goal.y = PITCH_WIDTH/2;
	angletemp = Getpt2ptAngle(ballPt,goal);
	//ballPt.x = ballPt.x - delta*sin(angletemp);
	//ballPt.y = ballPt.y - delta*cos(angletemp);
	double deltax;
	deltax = 10;
	if((ball.x>PITCH_LENGTH - deltax)&&(ball.y>PITCH_LENGTH/2 - GOAL_AREA_WIDTH/2-deltax&&ball.y<PITCH_LENGTH/2 + GOAL_AREA_WIDTH/2 + deltax))
	{
		if(ball.y<=PITCH_LENGTH/2)
			goal.y = ball.y + deltax;
		else
			goal.y = ball.y - deltax;
		goal.x = PITCH_LENGTH + 8;
		ToPositionNewli(&pRobotInford,ballPt,goal,120,2,pSpeed);
		return 1;
	}
	ToPositionNewli(&pRobotInford,ballPt,goal,120,2,pSpeed);	
	/*if(pRobotInford.x>ball.x)
	Vect_MidShoot2(pRobotInford,ball,goal,0,pSpeed);*/
	return 1;

⌨️ 快捷键说明

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