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

📄 worldmodel.cpp

📁 底层robocup3d源码。 suse10.0 kdevelop 开发.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{	return param.GoalDepth;}double Worldmodel::GetAgentMass(){	return param.AgentMass;}double Worldmodel::GetNowCycle(){	return NowCycle;}std::string Worldmodel::GetPlayMode(){	return param.PlayMode;}double Worldmodel::GetBallMass(){   return param.BallMass;}void  Worldmodel::SetMyPosition(const Vec v){   Mystate.PositionV=v;}Vec   Worldmodel::GetTeamMatePosV(int number){    Vision vi;    TeamMateVQ[number-1].getAny(vi,TeamMateVQ[number-1].size());    return  vi.posV;}Vec   Worldmodel::GetOpponentPosV(int number){     Vision vi;    OpponentVQ[number-1].getAny(vi,OpponentVQ[number-1].size());    return  vi.posV;}Pol   Worldmodel::GetTeamMatePosP(int number){    Vision vi;    TeamMateVQ[number-1].getAny(vi,TeamMateVQ[number-1].size());    return  vi.posP;}Pol   Worldmodel::GetOpponentPosP(int number){    Vision vi;    OpponentVQ[number-1].getAny(vi,OpponentVQ[number-1].size());    return  vi.posP;}bool  Worldmodel::IsBallInAir(){	Vision Vi1;	BallQ.getAny(Vi1,BallQ.size());	if(Vi1.posP.Pz>0)return true;	else return false;} double Worldmodel::WhereBall(){	Vision Vi1,Vi2;	BallQ.getAny(Vi1,BallQ.size());	BallQ.getAny(Vi2,BallQ.size()-1);	return Vi1.posP.Py-Vi2.posP.Py;}MoveState Worldmodel::GetBallState_ground(long cycle,int &reliable){	reliable=0;	MoveState tempMove;	int queue_size=BallQ.size();	if(queue_size<3)	{			return tempMove;	}	else	{	    Vision Vi[2];	    Vision temp_Vi;	    Vec temp_V;	    double s;	    double t=0.0, Vt_x=0.0,V0_x=0.0,St_x=0.0;	    double        Vt_y=0.0,V0_y=0.0,St_y=0.0;	    BallQ.getAny(Vi[0],queue_size);	    BallQ.getAny(Vi[1],queue_size-1);	    BallStop=false;	    Vec distanceV=Vi[0].posV-Vi[1].posV;	    distanceV.Vz=0.0;	    if(distanceV.GetMod()<0.1)	    {		    BallStop=true;		    tempMove.PositionV=Vi[0].posV;		    tempMove.speed=Vec(0,0,0);		    return tempMove;	    }	    s=BALL_K_GROUND/GetBallMass();	    for(int i=queue_size-2;i>0;i--)	    {		    t=(Vi[0].cycle-Vi[1].cycle)*0.01;		    temp_V=Vi[0].posV-Vi[1].posV;		    St_x=temp_V.Vx;		    V0_x=s*St_x/(1.0-exp(-1.0*s*t));		    St_y=temp_V.Vy;		    V0_y=s*St_y/(1.0-exp(-1.0*s*t));		    BallQ.getAny(temp_Vi,i);		    t=(Vi[1].cycle-temp_Vi.cycle)*0.01;		    St_x=V0_x*(1.0-exp(-1.0*s*t))/(s*exp(-1.0*s*t));		    St_y=V0_y*(1.0-exp(-1.0*s*t))/(s*exp(-1.0*s*t));		    temp_V.Vx=Vi[1].posV.Vx-St_x;		    temp_V.Vy=Vi[1].posV.Vy-St_y;		    temp_V=temp_V-temp_Vi.posV;		    temp_V.Vz=0;		    if(temp_V.GetMod()<0.35)		    {			    Vi[1]=temp_Vi;		    }		    else break;		    reliable=queue_size-i;	    }	    t=(Vi[0].cycle-Vi[1].cycle)*0.01;	    temp_V=Vi[0].posV-Vi[1].posV;	    St_x=temp_V.Vx;	    V0_x=s*St_x/(1.0-exp(-1.0*s*t));	    St_y=temp_V.Vy;	    V0_y=s*St_y/(1.0-exp(-1.0*s*t));	    Vt_x=V0_x*exp(-1.0*s*t);	    Vt_y=V0_y*exp(-1.0*s*t);	    t=(cycle-Vi[0].cycle-DELAY)*0.01;	    St_x=(1.0-exp(-1.0*s*t))*Vt_x/s;	    St_y=(1.0-exp(-1.0*s*t))*Vt_y/s;	    Vt_x=Vt_x*exp(-1.0*s*t);	    Vt_y=Vt_y*exp(-1.0*s*t);	    tempMove.speed.Vx=Vt_x;	    tempMove.speed.Vy=Vt_y;	    tempMove.PositionV.Vx=Vi[0].posV.Vx+St_x;	    tempMove.PositionV.Vy=Vi[0].posV.Vy+St_y;	    tempMove.PositionV.Vz=param.BallRadius;	    return tempMove;	}}MoveState Worldmodel::GetBallState_air(long cycle,int &reliable){	reliable=0;	MoveState tempMove;	int queue_size=BallQ.size();	if(queue_size<3)	{			return tempMove;	}	else	{		Vision Vi[2];		Vision temp_Vi;		Vec temp_V;		double s;		double t=0.0, Vt_x=0.0,V0_x=0.0,St_x=0.0;		double        Vt_y=0.0,V0_y=0.0,St_y=0.0;		double        Vt_z=0.0,V0_z=0.0,St_z=0.0;		BallQ.getAny(Vi[0],queue_size);		BallQ.getAny(Vi[1],queue_size-1);		s=BALL_K_AIR/GetBallMass();		for(int i=queue_size-2;i>0;i--)		{			t=(Vi[0].cycle-Vi[1].cycle)*0.01;			temp_V=Vi[0].posV-Vi[1].posV;			St_x=temp_V.Vx;			V0_x=s*St_x/(1.0-exp(-1.0*s*t));			St_y=temp_V.Vy;			V0_y=s*St_y/(1.0-exp(-1.0*s*t));			St_z=temp_V.Vz;			V0_z=Get_v0_Z_st(St_z,t);			BallQ.getAny(temp_Vi,i);			t=(Vi[1].cycle-temp_Vi.cycle)*0.01;			St_x=V0_x*(1.0-exp(-1.0*s*t))/(s*exp(-1.0*s*t));			St_y=V0_y*(1.0-exp(-1.0*s*t))/(s*exp(-1.0*s*t));			V0_z=Get_v0_Z_vt(V0_z,t);			St_z=Get_s_Z(V0_z,t);			temp_V.Vx=Vi[1].posV.Vx-St_x;			temp_V.Vy=Vi[1].posV.Vy-St_y;			temp_V.Vz=Vi[1].posV.Vz-St_z;			temp_V=temp_V-temp_Vi.posV;			if(temp_V.GetMod()<0.4)			{				Vi[1]=temp_Vi;			}			else break;			reliable=queue_size-i;		}		t=(Vi[0].cycle-Vi[1].cycle)*0.01;		temp_V=Vi[0].posV-Vi[1].posV;		St_x=temp_V.Vx;		V0_x=s*St_x/(1.0-exp(-1.0*s*t));		St_y=temp_V.Vy;		V0_y=s*St_y/(1.0-exp(-1.0*s*t));		St_z=temp_V.Vz;		V0_z=Get_v0_Z_st(St_z,t);		Vt_z=Get_Vt_Z(V0_z,t);		Vt_x=V0_x*exp(-1.0*s*t);		Vt_y=V0_y*exp(-1.0*s*t);		t=(cycle-Vi[0].cycle-DELAY)*0.01;		St_x=(1.0-exp(-1.0*s*t))*Vt_x/s;		St_y=(1.0-exp(-1.0*s*t))*Vt_y/s;		St_z=Get_s_Z(Vt_z,t);		Vt_x=Vt_x*exp(-1.0*s*t);		Vt_y=Vt_y*exp(-1.0*s*t);		Vt_z=Get_Vt_Z(Vt_z,t);		tempMove.speed.Vx=Vt_x;		tempMove.speed.Vy=Vt_y;		tempMove.speed.Vz=Vt_z;		tempMove.PositionV.Vx=Vi[0].posV.Vx+St_x;		tempMove.PositionV.Vy=Vi[0].posV.Vy+St_y;		tempMove.PositionV.Vz=Vi[0].posV.Vz+St_z;		if(tempMove.PositionV.Vz<param.BallRadius)tempMove.PositionV.Vz=0.111;		return tempMove;	}}void Worldmodel::UpBallState(){	int rely;	MoveState state_ball;	if(IsBallInAir())		state_ball=GetBallState_air(param.CycleReceive,rely);	else 		state_ball=GetBallState_ground(param.CycleReceive,rely);	Ballstate=state_ball;}Vec   Worldmodel::ForeseeFallPoint(double &t,Vec &Vec_vt,int &reliable){	int  rely;	MoveState BallMove=GetBallState_air(param.CycleReceive,rely);	reliable=rely;	if(BallMove.PositionV.Vz<=param.BallRadius)	{		t=0.0;		return BallMove.PositionV;	}	else	{		Vec v=BallMove.PositionV;		double s_z=param.BallRadius-BallMove.PositionV.Vz;		double v0_z=BallMove.speed.Vz;		double v0_x=BallMove.speed.Vx;		double v0_y=BallMove.speed.Vy; 	        t=Get_t_Z(v0_z,s_z);		double s_x=Get_s_XY(v0_x,t,BALL_K_AIR);		double s_y=Get_s_XY(v0_y,t,BALL_K_AIR);		v.Vx=v.Vx+s_x;		v.Vy=v.Vy+s_y;		v.Vz=param.BallRadius;		Vec_vt.Vx=Get_Vt_XY(v0_x,t,BALL_K_AIR);		Vec_vt.Vy=Get_Vt_XY(v0_y,t,BALL_K_AIR);		Vec_vt.Vz=Get_Vt_Z(v0_z,t);		return v;	}}MoveState Worldmodel::GetTeamMateState(int number,long cycle){	Vision vi1,vi2;	MoveState move;	int size=TeamMateVQ[number-1].size();	if(size>2)	{		TeamMateVQ[number-1].getAny(vi1,size);		if((param.CycleReceive-vi1.cycle)<50)		{			TeamMateVQ[number-1].getAny(vi2,size-2);			Vec dist=vi1.posV-vi2.posV;			double t=(vi1.cycle-vi2.cycle)*0.01;			move.speed=dist/t;			t=(cycle-vi1.cycle)*0.01;			move.PositionV=vi1.posV+move.speed*t;			return move;		}	}	move.PositionV=GetStrategy(number);	return move;}MoveState Worldmodel::GetOpponentState(int number,long cycle){	Vision vi1,vi2;	MoveState move;	int size=OpponentVQ[number-1].size();	if(size>2)	{		OpponentVQ[number-1].getAny(vi1,size);		OpponentVQ[number-1].getAny(vi2,size-2);		Vec dist=vi1.posV-vi2.posV;		double t=(vi1.cycle-vi2.cycle)*0.01;		move.speed=dist/t;		t=(cycle-vi1.cycle)*0.01;		move.PositionV=vi1.posV+move.speed*t;	}	return move;}MoveState Worldmodel::GetMyState(){	return Mystate;}double Worldmodel::Get_t_Z(double v0,double s){	double t=0.0;	double tempt1=100.0,tempt2=0.0;	double temps=0.0;	double g=G,k=BALL_K_AIR,m=GetBallMass();	if(s>=0.0)return 0.0;	else	{		int i=0;		while(temps-s>0.001||temps-s<-0.001)		{			i++;			t=(tempt1+tempt2)/2;			temps=-1.0*m*g*t/k+(m*m*g+m*v0*k)/(k*k)*(1.0-exp(-1.0*k*t/m));			if(temps<=s)tempt1=t;			else tempt2=t;			if(i>100)break;		}			return t;		}}double Worldmodel::Get_t_XY(double v0_XY,double s_XY,double k){	double s=k/GetBallMass();	double t=0.0;	t=-1.0*log((v0_XY-s_XY*s)/v0_XY)/s;	return t;}double Worldmodel::Get_Vt_Z(double v0_z,double t_z){	double m=GetBallMass();	double k=BALL_K_AIR;	double Vt=0.0;	double g=G;	Vt=v0_z+(exp(-1.0*k*t_z/m)-1.0)*(m*g+v0_z*k)/k;	return Vt;}double Worldmodel::Get_s_Z(double v0_z,double t_z){	double m=GetBallMass();	double k=BALL_K_AIR;	double s=0.0;	double g=G;	s=-1.0*m*g*t_z/k+(1.0-exp(-1.0*k*t_z/m))*(m*m*g+m*v0_z*k)/(k*k);	return s;}double Worldmodel::Get_v0_Z_st(double s_z,double t_z){	double m=GetBallMass();	double k=BALL_K_AIR;	double v0=0.0;	double g=G;	v0=(s_z*k+m*g*t_z)/(m-m*exp(-1.0*k*t_z/m))-m*g/k;	return v0;}double Worldmodel::Get_v0_Z_vt(double vt_z,double t_z){	double m=GetBallMass();	double k=BALL_K_AIR;	double v0=0.0;	double g=G;	v0=vt_z/exp(-1.0*k*t_z/m)-m*g*(exp(-1.0*k*t_z/m)-1)/(k*exp(-1.0*k*t_z/m));	return v0;}double Worldmodel::Get_s_XY(double v0_XY,double t_XY,double k){	double s=k/GetBallMass();	double St=0.0;	St=v0_XY*(1.0-exp(-1.0*s*t_XY))/s;	return St;}double Worldmodel::Get_V0_XY_tv(double t_XY,double v_t_XY,double k){	double s=k/GetBallMass();	double v0=0.0;	v0=v_t_XY/exp(-1.0*s*t_XY);	return v0;}double Worldmodel::Get_V0_XY_sv(double s_XY,double v_t_XY,double k){	double s=k/GetBallMass();	double v0=0.0;		v0=s_XY*s+v_t_XY;	return v0;}double Worldmodel::Get_V0_XY_st(double s_XY,double t_XY,double k){	double s=k/GetBallMass();	double v0=0.0;	v0=s_XY*s/(1.0-exp(-1.0*s*t_XY));	return v0;}double Worldmodel::Get_Vt_XY(double v0_XY,double t_XY,double k){	double s=k/GetBallMass();	double Vt=0.0;	Vt=v0_XY*exp(-1.0*s*t_XY);	return Vt;}double Worldmodel::Get_t_XY_v(double v0_XY,double Vt_XY,double k){	double s=k/GetBallMass();	double t=0.0;	t=-1.0*log(Vt_XY/v0_XY)/s;	return t;}Worldmodel::~Worldmodel(){	}}

⌨️ 快捷键说明

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