(完整word版)機(jī)器人足球仿真實驗報告_第1頁
(完整word版)機(jī)器人足球仿真實驗報告_第2頁
(完整word版)機(jī)器人足球仿真實驗報告_第3頁
(完整word版)機(jī)器人足球仿真實驗報告_第4頁
(完整word版)機(jī)器人足球仿真實驗報告_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

合肥工業(yè)大學(xué)計算機(jī)與信息學(xué)院 機(jī)器人足球仿真實驗報告班級: 計算機(jī)科學(xué)與技術(shù) 11-1班姓名:魏慷學(xué)號:201124252012年12月5日1實驗一機(jī)器人足球比賽編程預(yù)備知識1.實驗?zāi)康恼莆誖oboCup仿真機(jī)器人足球比賽相關(guān)知識點, 具體內(nèi)容如下:(1)Linux操作系統(tǒng)的熟悉及了解其基本操作。 (2)掌握Linux下如何進(jìn)行C++編程,了解gcc編譯器以及一些簡單編輯工 具,如:vi、emacsgedit、Anjuta、Kdevelope等。(3)啟動RoboCup仿真(2D)足球隊的比賽。 2.實驗設(shè)備硬件環(huán)境:PC機(jī)軟件環(huán)境:操作系統(tǒng) linux3.實驗內(nèi)容(1)掌握Linux一些常用的命令 文件或目錄處理格式:ls卜atFlgR][name] 第一項是一些語法加量。第二項是文件名。常用的方法有:ls 列出當(dāng)前目錄下的所有文件。 ls氣列出包括以?開始的隱藏文件的所有文件名。 ls4 依照文件最后修改時間的順序列出文件名。lsF 列出當(dāng)前目錄下的文件名及其類型。以/結(jié)尾表示為目錄名、以*結(jié)尾表示未可執(zhí)行文件、以@結(jié)尾表示為符號連接。 ls4 列出目錄下所有文件的權(quán)限、所有者、文件大小、修改時間及名稱。ls-lg 同上,并顯示出文件的所有者工作組名。 lsR 顯示出目錄下以及其所有子目錄的文件名。 改變工作目錄格式::cd[name]name:目錄名、路徑或目錄縮寫。 常用的方法有:cd 改變目錄位置至用戶登錄時的工作目錄。 cddirl 改變目錄位置至 dirl目錄下。cd~user 改變目錄位置至用戶的工作目錄。 cd..改變目錄位置至。cd../user改變目錄位置至相對路徑user的目錄下。 cd/../.. 改變目錄位置至絕對路徑的目錄位置下。 復(fù)制文件格式:cp[-r]源地址目的地址2常用的方法有: cpfile1file2將文件file1復(fù)制成file2cpfile1dir1將文件file1復(fù)制到目錄dir1下,文件名仍為file1。cp/tmp/file1將目錄/tmp下的文件file1復(fù)制到當(dāng)前目錄下,文件名仍為file10cp/tmp/file1file2將目錄/tmp下的文件file1復(fù)制到當(dāng)前目錄下,文件名仍為file2。cp-rdir1dir2 復(fù)制整個目錄。 移動或更改文件、目錄名稱 格式:mv源地址目的地址常用的方法有:mvfile1file2將文件file1更名為file2omvfile1dir1將文件file1轉(zhuǎn)移到目錄dir1下,文件名仍為file1。mvdir1dir2將目錄dir1更改為目錄dir2。建立新目錄格式:mkdir目錄名刪除目錄格式:rmdir[目錄名]文件名] 常用的方法有:rm-rdir1刪除目錄dir1及其子目錄下的所有文件。 列出當(dāng)前所在的目錄位置 格式:p做1 查看文件內(nèi)容格式:cat文件名文件權(quán)限的設(shè)定格式:chmod[-R]modenamename:文件名或目錄名。mode:3個或8個數(shù)字或rwx的組合。r-read(讀權(quán)限)、w-write(寫權(quán)限)、x-execute(執(zhí)行)常用的方法有:chmod777file1給所有用戶file1全部的權(quán)限。文件的打包和解壓縮格式:tar[option][file]gzip[option][file]tar主要來進(jìn)行打包而不壓縮,而gzip則進(jìn)行壓縮。 option主要有:-c—創(chuàng)建一個新歸檔。 -f—當(dāng)與-c選項一起使用時,創(chuàng)建的tar文件使用該選項指定的文件名; 當(dāng)與-x選項一起使用時,則解除該選項指定的歸檔。 -t一顯示包括在tar文件中的文件列表。-v—顯示文件的歸檔進(jìn)度。 -x—從歸檔中抽取文件。-z—使用gzip來壓縮tar文件。如使用:tar-cvffilename.tar/home/mine/work/home/mine/school上面的命令把/home/mine目錄下的work和school子目錄內(nèi)的所有文件3都放入當(dāng)前目錄中一個叫做filename.tar的新文件里。(2)完成以下操作: 1.如何找到用戶主目錄的絕對路徑名?在自己的系統(tǒng)上,用戶主目錄的絕對 路徑名是什么?執(zhí)行cd;執(zhí)行pwd;即顯示用戶主目錄的絕對路徑名。 用戶主目錄的絕對路徑名是" /home/username”2.將當(dāng)前工作目錄從/home/UVA轉(zhuǎn)到/home/Tsinghua需要使用什么命令 ?如何顯示當(dāng)前目錄?cd/home/Tsinghua或cd../Tsinghua3.如何在當(dāng)前目錄下建立子目錄 RoboCup?mkdirRobcup4.如何刪除子目錄RoboCup?rmdirRobcup5.如何查看當(dāng)前目錄下的內(nèi)容 ?ls6.如何將文件start.sh的權(quán)限設(shè)定為:start.sh屬于可讀、可寫、可執(zhí)行?可讀:chmodg+rrstart.sh可寫:chmodg+rwstart.sh可執(zhí)行:chmodg+rxstart.sh7.如何將當(dāng)前目錄包括所有子目錄全部做備份文件 ,備份文件名為 first.tar?tarczvffirst.tardir18.如何將目錄/home下每一個文件壓縮成.gz文件?tar-cvfstore.tardir19.如何把上例中每個壓縮的文件解壓 ,并列出詳細(xì)的信息?tarxvfstore.tarls-lg4.啟動球隊上場比賽完成以下操作: rcssserverrcsslogplayer在球隊路徑下:./start.sh在本地啟動第二個球隊: ./start.shlocalhostaaa實驗二Demeer5基本動作11.實驗?zāi)康蘑帕私釪emeer5的工作原理4(2)學(xué)會對Demeer5進(jìn)行簡單的修改 2.實驗設(shè)備硬件環(huán)境:PC軟件環(huán)境:Linux3.實驗內(nèi)容⑴Demeer5的工作原理: Demeer5函數(shù)是整個球隊的核心,它最終返回一個可以執(zhí)行的動作,底層的模塊負(fù)責(zé)將此動作發(fā)送給 server,然后由server執(zhí)行??梢哉f,Demeer5就是我們想法的體現(xiàn),是一支球隊的大腦。在Demeer5中有一系列的判斷來決定每個 周期的動作。下面對Demeer5進(jìn)行簡要的分析.Demeer5()是一個決策函數(shù),在策略上使用的是下面這個簡單的策略: 如果球可踢,則用最大力量踢球; 如果球不可踢且我是隊友中最快到球的隊員,則去截球; 其他情況按戰(zhàn)略點跑位。我們現(xiàn)在只要看一下球可踢時的代碼:elseif(WM->isBallKickable())//如果球可踢{〃確定踢向的點VecPositionposGoal(PITCH_LENGTH/2.0,-1+2*(WM->getCurrentCycle()%2))*0.4 *SS->getGoalWidth());〃調(diào)用踢球的動作soc=kickTo(posGoal,SS->getBallSpeedMax());//kickmaximal//將動作放入命令隊列中ACT->putCommandInQueue(soc);//將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));〃記錄調(diào)試信息Log.log(100,"kickball");}這一小段函數(shù)決定了當(dāng)球在球員 Agent的可踢范圍之內(nèi)時應(yīng)當(dāng)做的動作,這 里是一個簡單的把球向前踢而不考慮任何其他情況的方法。該程序段的條理是很 清晰的。5(2)對Demeer5進(jìn)行簡單的修改: 現(xiàn)在我們對Demeer5進(jìn)行簡單的修改, 讓它在球可踢的時候進(jìn)行帶球的動作。帶球就是kick和dash動作序列的結(jié)合。帶球的函數(shù)在BasicPlayer中,函數(shù)為dribble().它接收兩個參數(shù),第一個參數(shù)為帶球的方向,第二個參數(shù)為帶球的 類型。帶球類型解釋如下:DRIBBLE_FAST:快速帶球; DRIBBLE_SLOW:慢速帶球; DRIBBLE_WITHBALL:安全帶球; 所以,對dribble的一種調(diào)用形式為:dribble(ang,DRIBBLE_FAST)其中ang為AngDeg(是一個double)類型該函數(shù)的返回值是一個 SoccerCommand類型。 知道了如何調(diào)用dribble,我們來對Demeer5進(jìn)行替換: elseif(WM->isBallKickable()){ AngDegang=0.0;soc=dribble(ang,DRIBBLE_FAST);//進(jìn)行帶球〃將動作放入命令隊列中ACT->putCommandInQueue(soc);〃將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));〃記錄調(diào)試信息Log.log(100,"kickball");}這樣,在球可踢的時候,球員智能體將把球帶向前方,這里取的是0度角,即沿x軸一直向前快速帶球。 我們再次對Demeer5函數(shù)進(jìn)行修改,這次是讓球員Agent將球踢向各個不同 的地方。 這將調(diào)用kickTo()函數(shù)來完成。下面簡要說明一下 kickTo()函數(shù)的使用方法:這個函數(shù)有兩個參數(shù),第一個參數(shù)是目標(biāo)點的坐標(biāo),第二個參數(shù)是 球到達(dá)目標(biāo)點是的速度,返回一個踢球的動作。 可以使用下面的形式來調(diào)用: VecPositionpos(x,y);doublespeed=1.0;kickTo(pos,speed);kickTo()函數(shù)在其內(nèi)部將會決定踢球時所用力量的大小, 并且會判斷是否能夠?qū)⑶蛱叩皆擖c,并作出相應(yīng)的調(diào)整。比如,將球一直踢向(0,0)點,1.0的末速度:elseif(WM->isBallKickable()){soc=kickTo(VecPosition(0,0),1.0);6//將動作放入命令隊列中ACT->putCommandInQueue(soc);//將脖子轉(zhuǎn)向球ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));〃記錄調(diào)試信息Log.log(100,"kickball");}⑶根據(jù)上述操作,完成以下踢球操作:將球踢向?qū)Ψ降那蜷T。VecPositionpos=WM->getPosOpponentGoal;soc=kickTo(pos,1.0);ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));將球踢向距離自己最近的隊友。ObjectTo=WM->getClosestInSetTo(OBJECT_SET_TEAMMATES,posAgent);soc=kickTo(WM->getGlobalPosition(o) ,1.0 );ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc)); 嘗試不同的踢球點。 (略)(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)入對方禁區(qū)后以最大力量踢向球7門(末速度最大為2.7)。涉及到的具體函數(shù)請查看教材。 VecPositionposGoal(52.5,0);if(WM->isInTheirPenaltyArea(WM->getBa11Pos()))11 判斷是否在對方禁區(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));實驗三Demeer5基本動作21.實驗?zāi)康氖煜emeer5并學(xué)會demeer5的基本使用方法,具體內(nèi)容如下: (1)能理解UVA程序中原來的demeer5中的內(nèi)容(2)能通過修改demeer5中的具體函數(shù)內(nèi)容實現(xiàn)對場上球員的控制 (3)能通過底層動作的簡單組合控制場上隊員做出一些復(fù)雜動作 2.實驗設(shè)備:硬件設(shè)備:pc機(jī)軟件設(shè)備:操作系統(tǒng) linux3.實驗內(nèi)容⑴在球隊程序中找到 playerTeams.cpp;(2)在player.cpp中找到demmer5函數(shù);(3)閱讀此段程序,并結(jié)合Monitor觀察球員的具體行為(你將發(fā)現(xiàn)可以踢到球的球員會將球朝球門的方向踢去,而不能踢到球的隊員中如果是離球最近的隊員就去截球,否者則按陣型跑位) ;(4)修改demmer5函數(shù)改變隊員的行為具體步驟如下: ①在demeer5函數(shù)中找到8if(WM->isBallKickable())//isBallKickable()函數(shù)用來判斷球是否可踢{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);//只有把命令放入命令隊列動作才會執(zhí)行ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//做動作的同時改變脖子的方向}②『控球』將此函數(shù)修改為 if(WM->isBallKickable()){soc=kickBallCloseToBody(45);〃45 是踢球的方向ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}然后編譯運行程序,觀察球員的行為我們會發(fā)現(xiàn)當(dāng)球可踢時,球員不再朝著 球門的方向踢了,而是將球繞自己身體轉(zhuǎn)動(uva的這個底層動作經(jīng)常把球轉(zhuǎn)丟 !) ③『帶球』將此函數(shù)修改為if(WM->isBallKickable()) {soc=dribble(0.0,DRIBBLE_SLOW);//其中dribble函數(shù)中第一個參數(shù)表示帶球的方向-180?180之間,不一一定是 0.0ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}后編譯運行程序,觀察球員的行為我們會發(fā)現(xiàn)當(dāng)球可踢時,球員不再朝著球 門的方向踢了,而是朝我們指定的方向執(zhí)行帶球9④『傳球』將此函數(shù)修改為 if(WM->isBallKickable()) {soc=leadingPass(OBJECT_TEAMMATE_9,1);//9是接球的人,1是指球與接球人之間的距離//其中l(wèi)eadingPass中第一個參數(shù)表示傳球的對象,本實驗中我們將球直接傳給指定號碼(1~11)的球員,不一定是OBJECT_TEAMMATE_9ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));}然后編譯運行程序,觀察球員的行為我們會發(fā)現(xiàn)當(dāng)球可踢時,球員不再朝著 球門的方向踢了,而是將球傳給我們指定號碼的隊員。⑤『配合』將此函數(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));}編譯程序,觀察球員行為,我們會發(fā)現(xiàn),當(dāng)9號隊員得到球后會朝前方帶球, 其他隊員得到球后會將球傳給 9號(不管9號是不是越位).(5)根據(jù)以上描述完成以下實驗內(nèi)容: 如果在對方禁區(qū)內(nèi)就射門,否則,如果是 7,8,9號隊員就朝前帶球, 其他隊員將球傳給 9號(用WM->isInTheirPenaltyArea(WM->getBa11Pos()) 來判斷球是否在對方禁區(qū)) 如果隊員的位置在自己半場就將球朝對方球門踢去,否者就朝前方帶球(用WM->getBa11Pos().getX()來得到球的x坐標(biāo))當(dāng)有人來搶球時(離自己很近),就將球傳給離自己最近的隊員,否則 就自己帶球(調(diào)用WM->getClosestRelativeInSet函數(shù)來得到離自己最近的己方或?qū)Ψ角騿T,通過pos1.getDistanceTo(pos2)來得到兩位置之間的距離)。Circlecir(posAgent,2.0); 〃定義這樣一個圓形區(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->getBa11Pos().getX()>0){if(WM->isInTheirPenaltyArea(WM->getBa11Pos())){VecPositionposGoal(PITCH_LENGTH/2.0,(-1+2*(WM->getCurrentCyc1e()%2))*0.4*SS->getGoa1Width());soc=kickTo(posGoa1,SS->getBa11SpeedMax()); }elseif(WM->getAgentObjectType() ==OBJECT_TEAMMATE_7 ||WM->getAgentObjectType()TOC\o"1-5"\h\z==OBJECT_TEAMMATE_8|| WM->getAgentObjectType() ==OBJECT_TEAMMATE_9 ){ soc=dribb1e(0.0,DRIBBLE_SLOW); }else{ soc=1eadingPass(OBJECT_TEAMMATE_9,1); }}else{ VecPositionpos=(PITCH_LENGTH/2.0,( -1+2* (WM->getCurrentCyc1e() %2))*0.4*SS->getGoa1Width());soc=kickTo(pos,SS->getBa11SpeedMax()); }ACT->putCommandInQueue(soc);//放入命令隊列ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));11實驗四復(fù)雜的動作決策1.實驗?zāi)康倪M(jìn)一步了解demeer5并能熟悉的修改demeer5的內(nèi)容以達(dá)到對場上的球員的控制(1)能理解UVA程序中原來的 demeer5中的全部內(nèi)容 (2)能通過修改demeer5中的具體函數(shù)內(nèi)容實現(xiàn)對場上球員的控制(3)能通過底層動作的簡單組合控制場上隊員做出一些復(fù)雜動作決策 (4)對WorldModel有初步的認(rèn)識,學(xué)會在 WorldModel,basicplayer里添加新函數(shù)2.實驗設(shè)備硬件環(huán)境:PC軟件環(huán)境:操作系統(tǒng) linux3.實驗內(nèi)容(1)在球隊程序中找到player.c并打開;(2)在player.c中找到demmer5函數(shù);(3)閱讀此段程序,并結(jié)合monitor觀察球員的具體行為(你將發(fā)現(xiàn)可以踢到球的球員會將球朝球門的方向踢去,而不能踢到球的隊員中如果是離球最近的隊員就去截球,否者則按陣型跑位) ;(4)修改demmer5函數(shù)改變隊員的行為具體步驟如下: ①在demeer5函數(shù)中找到elseif(WM->getFastestInSetTo(OBJECT_SET_TEAMMATES,OBJECT_BALL,&iTmp)'==WM->getAgentObjectType()&&!WM->isDeadBallThem()){ //如果是最快到達(dá)球的隊員Log.log(100,"Iamfastesttoball;cangettherein%dcycles",iTmp);soc=intercept(false); //截球if(mandType==CMD_DASH&& //當(dāng)體力低時WM->getAgentStamina().getStamina()<SS->getRecoverDecThr()*SS->getStaminaMax()+200)12{soc.dPower=30.0*WM->getAgentStamina().getRecovery();//慢速移動ACT->putCommandInQueue(soc);ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc)力〃脖子轉(zhuǎn)向球}else //當(dāng)體力高時{ACT->putCommandInQueue(soc); 〃正常移動速度ACT->putCommandInQueue(turnNeckToObject(OBJECT_BALL,soc));//脖子轉(zhuǎn)向球}}此函數(shù)的內(nèi)容是,當(dāng)球不可踢時,如果是離球最近的隊員就執(zhí)行截球命令(截 球函數(shù)intercept。在BasicPlayer.c中定義)觀察在隊員體力值小于多少時,帶球 速度會變慢。 ②現(xiàn)在我們來通過修改函數(shù),來改變非持球隊員的決策,在以上函數(shù)之前加上此段代碼:elseif(WM->getAgentObjectType()==OBJECT_TEAMMATE_9)〃如果是9號隊員{soc=SoccerCommand(CMD_TURN,60); 〃轉(zhuǎn)身體ACT->putCommandInQueue(soc);ACT->putCommandInQueue(alignNeckW讓hBody()); 〃脖子隨著身體一起轉(zhuǎn)動}然后編譯運行程序,觀察球員的行為我們會發(fā)現(xiàn)當(dāng) 9號不持球時,身體在一 直的轉(zhuǎn)動(此動作可用來找球)(5)在WorldMoled里填加狀態(tài)函數(shù) ①.打開WorldModel.h,在里面預(yù)定義函數(shù),即寫入boolisOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist);該函數(shù)用來判斷當(dāng)前球員角度在 angA~angB之間距離小于dDist的范圍內(nèi)是13否有對方隊員。②.找到并打開WorldModel.c在里面填加一個新函數(shù)boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent =getAgentGlobalPosition();VecPositionposOpp;AngDeg angOpp;intilndex;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));}然后編譯運行程序,觀察球員的行為,試分析球員的行為14(6)根據(jù)以上描述完成練習(xí):通過基本動作的組合實現(xiàn)球員的以下行為判斷守門員的位置,朝球門空隙較大的一方射門,(通過在WorldModel里建立新狀態(tài)來判斷,球門哪一方空隙較大,守門員的位置為VecPositionposGoalie=WM->getGlobalPosition(WM->getOppGoalieType()); 球門位置坐標(biāo) 為(52.5,0),可嘗試朝(52.5,6.5)(52.5,-6.5)兩點射門) 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里填加一個帶球函數(shù),要求如果無人阻擋(帶球?qū)⒁?jīng)過的路 線附近沒有對方球員)就朝球門方向帶球,否則想辦法避開對方球員帶球前進(jìn) (要求只要作出閃避的動作即可,不要求效果)。打開WorldModel.h,在里面預(yù)定義函數(shù),即寫入boolisOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist);該函數(shù)用來判斷當(dāng)前球員角度在 angA~angB之間距離小于dDist的范圍內(nèi)是否有對方隊員。找到并打開WorldModel.c在里面添加一個新函數(shù): boolWorldModel::isOpponentAtAngleEx(AngDegangA,AngDegangB,doubledDist){VecPositionposAgent=getAgentGlobalPosition();VecPositionposOpp;AngDeg angOpp;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));}嘗試修改視覺函數(shù)使得球員能更多的獲得場上信息(要求不影響球員的動作)。先在Basicplayer.h中函數(shù)聲明SoccerCommandview1122333(SoccerCommandsoc);在Basicplayer.cpp中view1122333(SoccerCommandsoc)函數(shù)定義如下:/*將視覺分成1122333的視覺模式(“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));就可看到明顯的視覺變化。實驗五特殊比賽模式的設(shè)計1.實驗?zāi)康恼莆誖obocup仿真機(jī)器人足球比賽中特殊比賽模式發(fā)生的條件; 掌握Robocup仿真機(jī)器人足球比賽特殊比賽模式的規(guī)則要求; 了解Robocup仿真機(jī)器人足球比賽特殊比賽模式的戰(zhàn)術(shù)設(shè)計思想;進(jìn)一步熟悉WorldModel類。2.實驗設(shè)備硬件環(huán)境:PC機(jī)軟件環(huán)境:操作系統(tǒng) Linux173.實驗內(nèi)容(1)概述Robocup仿真機(jī)器人足球比賽特殊比賽模式包括角球(corner_kick)、界外球(kick_in)、定位球/任意王(free_kick)以及球門球(goal_kick)。 (2)角球(corner_kick)當(dāng)防守方球員將球踢出底線時,由進(jìn)攻方開角球。 Server一旦接收到發(fā)球隊 員發(fā)出的kick命令后,就將比賽模式設(shè)為正常的play_on模式。注意,和國際足 聯(lián)的規(guī)則類似,發(fā)球隊員在其他球員接觸球之前不能再觸球,否則判犯規(guī)。此時, 另一方球員須在一定時間(根據(jù)Manual的規(guī)定為300周期)內(nèi)將球開出,否則算發(fā)球失誤,由對方發(fā)定位球。在UVA_trilearn的原代碼中,球員是不管這些特殊比賽模式的,統(tǒng)統(tǒng)是最近 的球員跑向球,一腳踢向球門。這就需要我們手工編碼完成這些細(xì)節(jié)地方。一種簡單的設(shè)計思路是:(1)如果比賽進(jìn)入角球模式,則離球最近的球員A跑向球,而次近的球員B跑到某個接應(yīng)點,等待A將球傳過來;(2)A跑到球跟前(即 進(jìn)入可踢范圍)時,不必立即將球開出,可以先看看場上環(huán)境,等B跑到預(yù)定位置并且體力恢復(fù)得差不多時再開球。 以上設(shè)計思路同學(xué)們在實驗過程中只須完成( 1)即可,對于學(xué)有余力的同 學(xué)可以考慮(2)的實現(xiàn)。下面列出幾個可能用到的函數(shù): PlayModeTWorldModel::getPlayMode()const 返回比賽模式(或者直接用boolWorldModel::isCornerKickUs()判斷是不是我方開角球);ObjectTWorldModel::getClosestInSetTo(ObjectSetTobjectSet,ObjectTo,double*dDist=NULL,doubledConfThr=-1.0)返回在對象集合objectSet中距離對象o最近的對象,只有當(dāng)對象的可信度高于給定的閾值才被考慮,如果沒有給出 閾值則使用PlayerSettings中定義的閾值,同時dDist返回距離;ObjectTWorldModel::getSecondClosestInSetTo(ObjextSetTobjectSet,ObjectTo,double*dDist=NULL,doubledConfThr=-1.0)返回在對象集合objectSet中距離對象o次近的對象,只有當(dāng)對象的可信度高于給定的閾值才被考慮, 如果沒有給出閾值則使用PlayerSettings中定義的閾值,同時dDist返回距離。下面具體描述一下實現(xiàn)過程: 首先,我們知道demeer5()主要是圍繞三句話展開的, 即(1)如果球可踢, 則用最大力量踢球;(2)如果球不可踢且我是隊友中最快到球的隊員, 則去截球;(3)其他情況按戰(zhàn)略點跑位。我們可以圍繞這三句話來實現(xiàn)角球策略。即在角 球模式下(1)如果球可踢,則傳球給接應(yīng)球員;(2)如果球不可踢且我是隊友 中最快到球的隊員,則去發(fā)球; (3)其他情況下,如果我是離球次近的隊員,那么我去接應(yīng)。接著,有了這個基本思想后,我們開始編寫代碼。在demeer5()中找至UElseif(WM->isBallKickable()){ //ifkickable在里面加入我們的角球代碼: If ( WM->isCornerKickUs()){ ACT->putCommandInQueue(kickTo(pointToKickTo(),SS->getBallSpeedMaxO*0.8));18}這一部分代碼是完成開球動作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論