




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
機(jī)器人足球仿真實(shí)驗(yàn)報(bào)告合肥工業(yè)大學(xué)計(jì)算機(jī)與信息學(xué)院機(jī)器人足球仿真實(shí)驗(yàn)報(bào)告班級(jí):計(jì)算機(jī)科學(xué)與技術(shù)11-1班姓名:魏慷學(xué)號(hào):201124252012年12月5日1實(shí)驗(yàn)一機(jī)器人足球比賽編程預(yù)備知識(shí)1.實(shí)驗(yàn)?zāi)康恼莆誖oboCup仿真機(jī)器人足球比賽相關(guān)知識(shí)點(diǎn),具體內(nèi)容如下:(1)Linux操作系統(tǒng)的熟悉及了解其基本操作。(2)掌握Linux下如何進(jìn)行C++編程,了解gcc編譯器以及一些簡(jiǎn)單編輯工具,如:vi、emacs、gedit、Anjuta、Kdevelope等。(3)啟動(dòng)RoboCup仿真(2D)足球隊(duì)的比賽。2.實(shí)驗(yàn)設(shè)備硬件環(huán)境:PC機(jī)軟件環(huán)境:操作系統(tǒng)linux3.實(shí)驗(yàn)內(nèi)容(1)掌握Linux一些常用的命令文件或目錄處理格式:ls[-atFlgR][name]第一項(xiàng)是一些語(yǔ)法加量。第二項(xiàng)是文件名。常用的方法有:ls列出當(dāng)前目錄下的所有文件。ls–a列出包括以.開始的隱藏文件的所有文件名。ls–t依照文件最后修改時(shí)間的順序列出文件名。ls–F列出當(dāng)前目錄下的文件名及其類型。以/結(jié)尾表示為目錄名、以*結(jié)尾表示未可執(zhí)行文件、以@結(jié)尾表示為符號(hào)連接。ls–l列出目錄下所有文件的權(quán)限、所有者、文件大小、修改時(shí)間及名稱。ls–lg同上,并顯示出文件的所有者工作組名。ls–R顯示出目錄下以及其所有子目錄的文件名。改變工作目錄格式::cd[name]name:目錄名、路徑或目錄縮寫。常用的方法有:cd改變目錄位置至用戶登錄時(shí)的工作目錄。cddirl改變目錄位置至dirl目錄下。cd~user改變目錄位置至用戶的工作目錄。cd..改變目錄位置至。cd../user改變目錄位置至相對(duì)路徑user的目錄下。cd/../..改變目錄位置至絕對(duì)路徑的目錄位置下。復(fù)制文件格式:cp[-r]源地址目的地址2常用的方法有:cpfile1file2將文件file1復(fù)制成file2cpfile1dir1將文件file1復(fù)制到目錄dir1下,文件名仍為file1。cp/tmp/file1將目錄/tmp下的文件file1復(fù)制到當(dāng)前目錄下,文件名仍為file1。cp/tmp/file1file2將目錄/tmp下的文件file1復(fù)制到當(dāng)前目錄下,文件名仍為file2。cp-rdir1dir2復(fù)制整個(gè)目錄。移動(dòng)或更改文件、if(WM->isBallKickable())//如果球可踢{//確定踢向的點(diǎn)VecPositionposGoal(PITCH_LENGTH/2.0,-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());//調(diào)用踢球的動(dòng)作soc=kickTo(posGoal,SS->getBallSpeedMax());//kickmaximal//將動(dòng)作放入命令隊(duì)列中ACT->putCommandInQueue(soc);//將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//記錄調(diào)試信息Log.log(100,"kickball");}這一小段函數(shù)決定了當(dāng)球在球員Agent的可踢范圍之內(nèi)時(shí)應(yīng)當(dāng)做的動(dòng)作,這里是一個(gè)簡(jiǎn)單的把球向前踢而不考慮任何其他情況的方法。該程序段的條理是很清晰的。5(2)對(duì)Demeer5進(jìn)行簡(jiǎn)單的修改:現(xiàn)在我們對(duì)Demeer5進(jìn)行簡(jiǎn)單的修改,讓它在球可踢的時(shí)候進(jìn)行帶球的動(dòng)作。帶球就是kick和dash動(dòng)作序列的結(jié)合。帶球的函數(shù)在BasicPlayer中,函數(shù)為dribble().它接收兩個(gè)參數(shù),第一個(gè)參數(shù)為帶球的方向,第二個(gè)參數(shù)為帶球的類型。帶球類型解釋如下:DRIBBLE_FAST:快速帶球;DRIBBLE_SLOW:慢速帶球;DRIBBLE_WITHBALL:安全帶球;所以,對(duì)dribble的一種調(diào)用形式為:dribble(ang,DRIBBLE_FAST)其中ang為AngDeg(是一個(gè)double)類型該函數(shù)的返回值是一個(gè)SoccerCommand類型。知道了如何調(diào)用dribble,我們來(lái)對(duì)Demeer5進(jìn)行替換:elseif(WM->isBallKickable()){AngDegang=0.0;soc=dribble(ang,DRIBBLE_FAST);//進(jìn)行帶球//將動(dòng)作放入命令隊(duì)列中ACT->putCommandInQueue(soc);//將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//記錄調(diào)試信息Log.log(100,"kickball");}這樣,在球可踢的時(shí)候,球員智能體將把球帶向前方,這里取的是0度角,即沿x軸一直向前快速帶球。我們?cè)俅螌?duì)Demeer5函數(shù)進(jìn)行修改,這次是讓球員Agent將球踢向各個(gè)不同的地方。這將調(diào)用kickTo()函數(shù)來(lái)完成。下面簡(jiǎn)要說(shuō)明一下kickTo()函數(shù)的使用方法:這個(gè)函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是目標(biāo)點(diǎn)的坐標(biāo),第二個(gè)參數(shù)是球到達(dá)目標(biāo)點(diǎn)是的速度,返回一個(gè)踢球的動(dòng)作。可以使用下面的形式來(lái)調(diào)用:VecPositionpos(x,y);doublespeed=1.0;kickTo(pos,speed);kickTo()函數(shù)在其內(nèi)部將會(huì)決定踢球時(shí)所用力量的大小,并且會(huì)判斷是否能夠?qū)⑶蛱叩皆擖c(diǎn),并作出相應(yīng)的調(diào)整。比如,將球一直踢向(0,0)點(diǎn),1.0的末速度:elseif(WM->isBallKickable()){soc=kickTo(VecPosition(0,0),1.0);6//將動(dòng)作放入命令隊(duì)列中ACT->putCommandInQueue(soc);//將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//記錄調(diào)試信息Log.log(100,"kickball");}(3)根據(jù)上述操作,完成以下踢球操作:將球踢向?qū)Ψ降那蜷T。VecPositionpos=WM->getPosOpponentGoal;soc=kickTo(pos,1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));將球踢向距離自己最近的隊(duì)友。ObjectTo=WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent);soc=kickTo(WM->getGlobalPosition(o),1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));嘗試不同的踢球點(diǎn)。(略)(4)根據(jù)上述內(nèi)容,完成以下帶球的操作:用不同的帶球模式進(jìn)行帶球,并觀察效果,比較異同。AngDegang=0.0;soc=dribble(ang,DRIBBLE_SLOW);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));將球向?qū)Ψ降那蜷T方向帶。doubleang=(VecPosition(52.5,0)-posAgent).getDirection();//求與球門間角度soc=dribble(ang,DRIBBLE_SLOW);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));嘗試不同的帶球組合。(略)(5)根據(jù)上述內(nèi)容,完成以下綜合練習(xí):帶球與踢球的結(jié)合:讓agent一直向?qū)Ψ角蜷T的方向帶球,在進(jìn)入對(duì)方禁區(qū)后以最大力量踢向球7門(末速度最大為2.7)。涉及到的具體函數(shù)請(qǐng)查看教材。VecPositionposGoal(52.5,0);if(WM->isInTheirPenaltyArea(WM->getBallPos()))//判斷是否在對(duì)方禁區(qū){soc=kickTo(posGoal,2.7);}else{doubleang=(posGoal-posAgent).getDirection();//求與球門間角度soc=dribble(ang,DRIBBLE_FAST);}ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));實(shí)驗(yàn)三Demeer5基本動(dòng)作21.實(shí)驗(yàn)?zāi)康氖煜emeer5并學(xué)會(huì)demeer5的基本使用方法,具體內(nèi)容如下:(1)能理解UVA程序中原來(lái)的demeer5中的內(nèi)容(2)能通過(guò)修改demeer5中的具體函數(shù)內(nèi)容實(shí)現(xiàn)對(duì)場(chǎng)上球員的控制(3)能通過(guò)底層動(dòng)作的簡(jiǎn)單組合控制場(chǎng)上隊(duì)員做出一些復(fù)雜動(dòng)作2.實(shí)驗(yàn)設(shè)備:硬件設(shè)備:pc機(jī)軟件設(shè)備:操作系統(tǒng)linux3.實(shí)驗(yàn)內(nèi)容(1)在球隊(duì)程序中找到playerTeams.cpp;(2)在player.cpp中找到demmer5函數(shù);(3)閱讀此段程序,并結(jié)合Monitor觀察球員的具體行為(你將發(fā)現(xiàn)可以踢到球的球員會(huì)將球朝球門的方向踢去,而不能踢到球的隊(duì)員中如果是離球最近的隊(duì)員就去截球,否者則按陣型跑位);(4)修改demmer5函數(shù)改變隊(duì)員的行為具體步驟如下:①在demeer5函數(shù)中找到8if(WM->isBallKickable())//isBallKickable()函數(shù)用來(lái)判斷球是否可踢{VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());//設(shè)定射門位置坐標(biāo)soc=kickTo(posGoal,SS->getBallSpeedMax());//朝球門方向?qū)⑶蛞宰畲罅Χ忍叱鯝CT->putCommandInQueue(soc);//只有把命令放入命令隊(duì)列動(dòng)作才會(huì)執(zhí)行ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//做動(dòng)作的同時(shí)改變脖子的方向}②『控球』將此函數(shù)修改為if(WM->isBallKickable()){soc=kickBallCloseToBody(45);//45是踢球的方向ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}然后編譯運(yùn)行程序,觀察球員的行為我們會(huì)發(fā)現(xiàn)當(dāng)球可踢時(shí),球員不再朝著球門的方向踢了,而是將球繞自己身體轉(zhuǎn)動(dòng)(uva的這個(gè)底層動(dòng)作經(jīng)常把球轉(zhuǎn)丟!)③『帶球』將此函數(shù)修改為if(WM->isBallKickable()){soc=dribble(0.0,DRIBBLE_SLOW);//其中dribble函數(shù)中第一個(gè)參數(shù)表示帶球的方向-180~180之間,不一定是0.0ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}后編譯運(yùn)行程序,觀察球員的行為我們會(huì)發(fā)現(xiàn)當(dāng)球可踢時(shí),球員不再朝著球門的方向踢了,而是朝我們指定的方向執(zhí)行帶球9④『傳球』將此函數(shù)修改為if(WM->isBallKickable()){soc=leadingPass(OBJECT_TEAMMATE_9,1);//9是接球的人,1是指球與接球人之間的距離//其中l(wèi)eadingPass中第一個(gè)參數(shù)表示傳球的對(duì)象,本實(shí)驗(yàn)中我們將球直接傳給指定號(hào)碼(1~11)的球員,不一定是OBJECT_TEAMMATE_9ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}然后編譯運(yùn)行程序,觀察球員的行為我們會(huì)發(fā)現(xiàn)當(dāng)球可踢時(shí),球員不再朝著球門的方向踢了,而是將球傳給我們指定號(hào)碼的隊(duì)員。⑤『配合』將此函數(shù)修改為if(WM->isBallKickable()){if(WM->getAgentObjectType()==OBJECT_TEAMMATE_9)soc=dribble(0.0,DRIBBLE_SLOW);//帶球}elsesoc=leadingPass(OBJECT_TEAMMATE_9,1);//傳球ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}編譯程序,觀察球員行為,我們會(huì)發(fā)現(xiàn),當(dāng)9號(hào)隊(duì)員得到球后會(huì)朝前方帶球,其他隊(duì)員得到球后會(huì)將球傳給9號(hào)(不管9號(hào)是不是越位).(5)根據(jù)以上描述完成以下實(shí)驗(yàn)內(nèi)容:如果在對(duì)方禁區(qū)內(nèi)就射門,否則,如果是7,8,9號(hào)隊(duì)員就朝前帶球,其他隊(duì)員將球傳給9號(hào)(用WM->isInTheirPenaltyArea(WM->getBallPos())來(lái)判斷球是否在對(duì)方禁區(qū))如果隊(duì)員的位置在自己半場(chǎng)就將球朝對(duì)方球門踢去,否者就朝前方帶球(用WM->getBallPos().getX()來(lái)得到球的x坐標(biāo))當(dāng)有人來(lái)?yè)屒驎r(shí)(離自己很近),就將球傳給離自己最近的隊(duì)員,否則就自己帶球(調(diào)用WM->getClosestRelativeInSet函數(shù)來(lái)得到離自己最近的己方或?qū)Ψ角騿T,通過(guò)pos1.getDistanceTo(pos2)來(lái)得到兩位置之間的距離)。Circlecir(posAgent,2.0);//定義這樣一個(gè)圓形區(qū)域,以我為圓心,2.0為半徑10intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);//判斷2.0范圍內(nèi)有多少人if(num>0){soc=leadingPass(WM->getClosestRelativeInSet(OBJECT_SET_TEAMMATES),1);}elseif(WM->getBallPos().getX()>0){if(WM->isInTheirPenaltyArea(WM->getBallPos())){VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());soc=kickTo(posGoal,SS->getBallSpeedMax());}elseif(WM->getAgentObjectType()==OBJECT_TEAMMATE_7||WM->getAgentObjectType()==OBJECT_TEAMMATE_8||WM->getAgentObjectType()==OBJECT_TEAMMATE_9){soc=dribble(0.0,DRIBBLE_SLOW);}else{soc=leadingPass(OBJECT_TEAMMATE_9,1);}}else{VecPositionpos=(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCycle()%2))*0.4*SS->getGoalWidth());soc=kickTo(pos,SS->getBallSpeedMax());}ACT->putCommandInQueue(soc);//放入命令隊(duì)列ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));11實(shí)驗(yàn)四復(fù)雜的動(dòng)作決策1.實(shí)驗(yàn)?zāi)康倪M(jìn)一步了解demeer5并能熟悉的修改demeer5的內(nèi)容以達(dá)到對(duì)場(chǎng)上的球員的控制(1)能理解UVA程序中原來(lái)的demeer5中的全部?jī)?nèi)容(2)能通過(guò)修改demeer5中的具體函數(shù)內(nèi)容實(shí)現(xiàn)對(duì)場(chǎng)上球員的控制(3)能通過(guò)底層動(dòng)作的簡(jiǎn)單組合控制場(chǎng)上隊(duì)員做出一些復(fù)雜動(dòng)作決策(4)對(duì)WorldModel有初步的認(rèn)識(shí),學(xué)會(huì)在WorldModel,basicplayer里添加新函數(shù)2.實(shí)驗(yàn)設(shè)備硬件環(huán)境:PC軟件環(huán)境:操作系統(tǒng)linux3.實(shí)驗(yàn)內(nèi)容(1)在球隊(duì)程序中找到player.c并打開;(2)在player.c中找到demmer5函數(shù);(3)閱讀此段程序,并結(jié)合monitor觀察球員的具體行為(你將發(fā)現(xiàn)可以踢到球的球員會(huì)將球朝球門的方向踢去,而不能踢到球的隊(duì)員中如果是離球最近的隊(duì)員就去截球,否者則按陣型跑位);(4)修改demmer5函數(shù)改變隊(duì)員的行為具體步驟如下:①在demeer5函數(shù)中找到elseif(WM->getFastestInSetTo(OBJECT_SET_TEAMMATES,OBJECT_BALL,&iTmp)`==WM->getAgentObjectType()&&!WM->isDeadBallThem()){//如果是最快到達(dá)球的隊(duì)員Log.log(100,"Iamfastesttoball;cangettherein%dcycles",iTmp);soc=intercept(false);//截球if(mandType==CMD_DASH&&//當(dāng)體力低時(shí)WM->getAgentStamina().getStamina()<SS->getRecoverDecThr()*SS->getStaminaMax()+200)12{soc.dPower=30.0*WM->getAgentStamina().getRecovery();//慢速移動(dòng)ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//脖子轉(zhuǎn)向球}else//當(dāng)體力高時(shí){ACT->putCommandInQueue(soc);//正常移動(dòng)速度ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//脖子轉(zhuǎn)向球}}此函數(shù)的內(nèi)容是,當(dāng)球不可踢時(shí),如果是離球最近的隊(duì)員就執(zhí)行截球命令(截球函數(shù)intercept()在BasicPlayer.c中定義)觀察在隊(duì)員體力值小于多少時(shí),帶球速度會(huì)變慢。②現(xiàn)在我們來(lái)通過(guò)修改函數(shù),來(lái)改變非持球隊(duì)員的決策,在以上函數(shù)之前加上此段代碼:elseif(WM->getAgentObjectType()==OBJECT_TEAMMATE_9)//如果是9號(hào)隊(duì)員{soc=SoccerCommand(CMD_TURN,60);//轉(zhuǎn)身體ACT->putCommandInQueue(soc);ACT->putCommandInQueue(alignNeckWithBody());//脖子隨著身體一起轉(zhuǎn)動(dòng)}然后編譯運(yùn)行程序,觀察球員的行為我們會(huì)發(fā)現(xiàn)當(dāng)9號(hào)不持球時(shí),身體在一直的轉(zhuǎn)動(dòng)(此動(dòng)作可用來(lái)找球)(5)在WorldMoled里填加狀態(tài)函數(shù)①.打開WorldModel.h,在里面預(yù)定義函數(shù),即寫入boolisOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist);該函數(shù)用來(lái)判斷當(dāng)前球員角度在angA~angB之間距離小于dDist的范圍內(nèi)是13否有對(duì)方隊(duì)員。②.找到并打開WorldModel.c在里面填加一個(gè)新函數(shù)boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent=getAgentGlobalPosition();VecPositionposOpp;AngDegangOpp;intiIndex;for(ObjectTo=iterateObjectStart(iIndex,OBJECT_SET_OPPONENTS);o!=OBJECT_ILLEGAL;o=iterateObjectNext(iIndex,OBJECT_SET_OPPONENTS)){posOpp=getGlobalPosition(o);angOpp=(posOpp-posAgent).getDirection();if(angA<=angOpp&&angOpp<=angB&&posAgent.getDistanceTo(posOpp)<dDist)returntrue;}iterateObjectDone(iIndex);returnfalse;}③.將if(WM->isBallKickable())內(nèi)的內(nèi)容改為:if(WM->isBallKickable()){doubleang=(VecPosition(52.5,0)-posAgent).getDirection();if(WM->isOpponentAtAngleEx(ang-45,ang,6))ang+=45;elseif(WM->isOpponentAtAngleEx(ang,ang+45,6))ang-=45;SoccerCommandsoc=dribble(ang,DRIBBLE_SLOW);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}然后編譯運(yùn)行程序,觀察球員的行為,試分析球員的行為14(6)根據(jù)以上描述完成練習(xí):通過(guò)基本動(dòng)作的組合實(shí)現(xiàn)球員的以下行為判斷守門員的位置,朝球門空隙較大的一方射門,(通過(guò)在WorldModel里建立新狀態(tài)來(lái)判斷,球門哪一方空隙較大,守門員的位置為VecPositionposGoalie=WM->getGlobalPosition(WM->getOppGoalieType());球門位置坐標(biāo)為(52.5,0),可嘗試朝(52.5,6.5)(52.5,-6.5)兩點(diǎn)射門)VecPositionvec=WM->getGlobalPosition(WM->getOppGoalieType());if(vec.getY()>0){VecPositionpos=(52.2,-6.5);soc=kickTo(pos,SS->getBallSpeedMax());}else{VecPositionpos1=(52.5,6.5);soc=kickTo(pos1,SS->getBallSpeedMax());}ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));在BasicPlay里填加一個(gè)帶球函數(shù),要求如果無(wú)人阻擋(帶球?qū)⒁?jīng)過(guò)的路線附近沒(méi)有對(duì)方球員)就朝球門方向帶球,否則想辦法避開對(duì)方球員帶球前進(jìn)(要求只要作出閃避的動(dòng)作即可,不要求效果)。打開WorldModel.h,在里面預(yù)定義函數(shù),即寫入boolisOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist);該函數(shù)用來(lái)判斷當(dāng)前球員角度在angA~angB之間距離小于dDist的范圍內(nèi)是否有對(duì)方隊(duì)員。找到并打開WorldModel.c在里面添加一個(gè)新函數(shù):boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent=getAgentGlobalPosition();VecPositionposOpp;AngDegangOpp;intiIndex;for(ObjectTo=iterateObjectStart(iIndex,OBJECT_SET_OPPONENTS);o!=OBJECT_ILLEGAL;o=iterateObjectNext(iIndex,OBJECT_SET_OPPONENTS)){posOpp=getGlobalPosition(o);angOpp=(posOpp-posAgent).getDirection();15if(angA<=angOpp&&angOpp<=angB&&posAgent.getDistanceTo(posOpp)<dDist)returntrue;}iterateObjectDone(iIndex);returnfalse;}在playerteams.cpp中添加elseif(WM->isBallKickable()){Circlecir(posAgent,2.5);intnum=WM->getNrInSetInCircle(OBJECT_SET_OPPONENTS,cir);if(num<2){doubleang=(VecPosition(52.5,0)-posAgent).getDirection();if(WM->isOpponentAtAngleEx(ang-45,ang,6))ang+=45;elseif(WM->isOpponentAtAngleEx(ang,ang+45,6))ang-=45;SoccerCommandsoc=dribble(ang,DRIBBLE_SLOW);}else{soc=dribble(0.0,DRIBBLE_FAST);}ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}嘗試修改視覺(jué)函數(shù)使得球員能更多的獲得場(chǎng)上信息(要求不影響球員的動(dòng)作)。先在Basicplayer.h中函數(shù)聲明SoccerCommandview1122333(SoccerCommandsoc);在Basicplayer.cpp中view1122333(SoccerCommandsoc)函數(shù)定義如下:/*將視覺(jué)分成1122333的視覺(jué)模式(“1”代表60度,“2”代表120,“3”代表180)*/SoccerCommandBasicPlayer::view1122333(SoccerCommandsoc){//7-->共分成7份VecPositionposAgent=WM->getAgentGlobalPosition();AngDegangBody=WM->getAgentGlobalBodyAngle();AngDegangTurn=30;switch(WM->getCurrentCycle()%7){16case0:angTurn-=60;case1:ACT->putCommandInQueue(SoccerCommand(CMD_CHANGEVIEW,VA_NARROW,VQ_HIGH));ACT->putCommandInQueue(turnNeckToPoint(posAgent+VecPosition(5,VecPosition::normalizeAngle(angBody+angTurn),POLAR),soc));break;case2:case3:ACT->putCommandInQueue(SoccerCommand(CMD_CHANGEVIEW,VA_NORMAL,VQ_HIGH));ACT->putCommandInQueue(turnNeckToPoint(posAgent+VecPosition(5,angBody,POLAR),soc));break;case4:case5:case6:ACT->putCommandInQueue(SoccerCommand(CMD_CHANGEVIEW,VA_WIDE,VQ_HIGH));break;default:;}}再在playerTeams.cpp球可踢的條件下增加ACT->putCommandInQueue(view1122333(soc));就可看到明顯的視覺(jué)變化。實(shí)驗(yàn)五特殊比賽模式的設(shè)計(jì)1.實(shí)驗(yàn)?zāi)康恼莆誖obocup仿真機(jī)器人足球比賽中特殊比賽模式發(fā)生的條件;掌握Robocup仿真機(jī)器人足球比賽特殊比賽模式的規(guī)則要求;了解Robocup仿真機(jī)器人足球比賽特殊比賽模式的戰(zhàn)術(shù)設(shè)計(jì)思想;進(jìn)一步熟悉WorldModel類。2.實(shí)驗(yàn)設(shè)備硬件環(huán)境:PC機(jī)軟件環(huán)境:操作系統(tǒng)Linux173.實(shí)驗(yàn)內(nèi)容(1)概述Robocup仿真機(jī)器人足球比賽特殊比賽模式包括角球(corner_kick)、界外球(kick_in)、定位球/任意球(free_kick)以及球門球(goal_kick)。(2)角球(corner_kick)當(dāng)防守方球員將球踢出底線時(shí),由進(jìn)攻方開角球。Server一旦接收到發(fā)球隊(duì)員發(fā)出的kick命令后,就將比賽模式設(shè)為正常的play_on模式。注意,和國(guó)際足聯(lián)的規(guī)則類似,發(fā)球隊(duì)員在其他球員接觸球之前不能再觸球,否則判犯規(guī)。此時(shí),另一方球員須在一定時(shí)間(根據(jù)Manual的規(guī)定為300周期)內(nèi)將球開出,否則算發(fā)球失誤,由對(duì)方發(fā)定位球。在UVA_trilearn的原代碼中,球員是不管這些特殊比賽模式的,統(tǒng)統(tǒng)是最近的球員跑向球,一腳踢向球門。這就需要我們手工編碼完成這些細(xì)節(jié)地方。一種簡(jiǎn)單的設(shè)計(jì)思路是:(1)如果比賽進(jìn)入角球模式,則離球最近的球員A跑向球,而次近的球員B跑到某個(gè)接應(yīng)點(diǎn),等待A將球傳過(guò)來(lái);(2)A跑到球跟前(即進(jìn)入可踢范圍)時(shí),不必立即將球開出,可以先看看場(chǎng)上環(huán)境,等B跑到預(yù)定位置并且體力恢復(fù)得差不多時(shí)再開球。以上設(shè)計(jì)思路同學(xué)們?cè)趯?shí)驗(yàn)過(guò)程中只須完成(1)即可,對(duì)于學(xué)有余力的同學(xué)可以考慮(2)的實(shí)現(xiàn)。下面列出幾個(gè)可能用到的函數(shù):PlayModeTWorldModel::getPlayMode()const返回比賽模式(或者直接用boolWorldModel::isCornerKickUs()判斷是不是我方開角球);ObjectTWorldModel::getClosestInSetTo(ObjectSetTobjectSet,ObjectTo,double*dDist=NULL,doubledConfThr=-1.0)返回在對(duì)象集合objectSet中距離對(duì)象o最近的對(duì)象,只有當(dāng)對(duì)象的可信度高于給定的閾值才被考慮,如果沒(méi)有給出閾值則使用PlayerSettings中定義的閾值,同時(shí)dDist返回距離;ObjectTWorldModel::getSecondClosestInSetTo(ObjextSetTobjectSet,ObjectTo,double*dDist=NULL,doubledConfThr=-1.0)返回在對(duì)象集合objectSet中距離對(duì)象o次近的對(duì)象,只有當(dāng)對(duì)象的可信度高于給定的閾值才被考慮,如果沒(méi)有給出閾值則使用PlayerSettings中定義的閾值,同時(shí)dDist返回距離。下面具體描述一下實(shí)現(xiàn)過(guò)程:首先,我們知道demeer5()主要是圍繞三句話展開的,即(1)如果球可踢,則用最大力量踢球;(2)如果球不可踢且我是隊(duì)友中最快到球的隊(duì)員,則去截球;(3)其他情況按戰(zhàn)略點(diǎn)跑位。我們可以圍繞這三句話來(lái)實(shí)現(xiàn)角球策略。即在角球模式下(1)如果球可踢,則傳球給接應(yīng)球員;(2)如果球不可踢且我是隊(duì)友中最快到球的隊(duì)員,則去發(fā)球;(3)其他情況下,如果我是離球次近的隊(duì)員,那么我去接應(yīng)。接著,有了這個(gè)基本思想后,我們開始編寫代碼。在demeer5()中找到Elseif(WM->isBallKickable()){//ifkickable在里面加入我們的角球代碼:If(WM->isCornerKickUs()){ACT->putCommandInQueue(kickTo(pointToKickTo(),SS->getBallSpeedMax()*0.8));18}這一部分代碼是完成開球動(dòng)作。函數(shù)pointToKickTo()是Player類的成員函數(shù),返回一個(gè)VecPosition類型的參數(shù),代表要將球踢向的坐標(biāo)。下面給出一段參考代碼:VecPositionPlayer::pointToKickTo()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 股權(quán)式孵化協(xié)議書
- 船泊位出租轉(zhuǎn)讓協(xié)議書
- 護(hù)膚店合伙協(xié)議書
- 小程序招商協(xié)議書
- 房屋互換住協(xié)議書
- 洗車廠轉(zhuǎn)讓協(xié)議書
- 學(xué)生帶手表協(xié)議書
- 購(gòu)買種植土協(xié)議書
- 自貿(mào)區(qū)招商協(xié)議書
- 課后班責(zé)任協(xié)議書
- 2025年農(nóng)村個(gè)人果園承包合同
- 湖北省武漢市2025屆高三年級(jí)五月模擬訓(xùn)練試題數(shù)學(xué)試題及答案(武漢五調(diào))
- 醫(yī)師掛證免責(zé)協(xié)議書
- 2025年數(shù)控技術(shù)專業(yè)畢業(yè)考試試題及答案
- 濟(jì)南民政離婚協(xié)議書
- 車牌租賃協(xié)議和抵押合同
- 2025年內(nèi)蒙古自治區(qū)初中學(xué)業(yè)水平考試數(shù)學(xué)模擬試題 (一)(含答案)
- 四川?。拼笥嶏w大數(shù)據(jù))2025屆高三第二次教學(xué)質(zhì)量聯(lián)合測(cè)評(píng)生物試題及答案
- 《綠色建筑施工培訓(xùn)課件》資料
- GA 1812.3-2024銀行系統(tǒng)反恐怖防范要求第3部分:印鈔造幣企業(yè)
- 【公開課】+滑輪-人教版(2024)初中物理八年級(jí)下冊(cè)
評(píng)論
0/150
提交評(píng)論