如何編寫編譯Robocup3D代碼


開始編寫球隊代碼

裝好了Robocup 3D比賽平台后,就要開始着手編寫球隊策略代碼了。

我們使用的是utaustinvilla的Robocup 3D球隊代碼,球隊的體態運動等都已經是別人寫好的,我們暫時不要研究。

在下圖中,behaviors文件夾下的strategy.cc文件,就是我們需要編寫策略代碼的部分。

void NaoBehavior::beam()

球隊上場階段的函數,這一部分代碼來確定球隊如何上場,最開始的上場的站位在這里編寫。通過if語句判斷球員編號,根據球員編號返回(x坐標,y坐標,面向角度)。

這里正好提一下,球場是一個30*20的綠茵場,以中心為坐標原點。滿足x∈[-15,15],y∈[-10,10]。

SkillType NaoBehavior::PlayOnSkill()

球隊上場后,按下K鍵開球。之后球隊就會開始執行這一段函數,這一部分函數是我們目前主要要編寫部分。你們目前看到的這部一部分函數是學長上次比賽寫的,其中部分代碼有英文注釋。之后我會另寫一篇blog,對這一部分代碼詳細注釋。

其他階段函數

比賽的正常流程下有許多比賽狀態,大概流程如下:

比賽狀態 函數
上場 beam()
開球 MyKickOff()OppKickOff()
通常 PlayOnSkill()
罰球 KickIn、CornerKick、GaolKick、FreeKick

所有策略函數注釋如下

/*  正常比賽  */
void beam();				//球隊上場
SkillType MyKickOff();		//我方開球
SkillType OppKickOff();		//對方開球
SkillType PlayOnSkill();	//常規策略
/*  罰球函數  */
SkillType MyKickIn();		//我方界外球
SkillType OppKickIn();		//對方界外球
SkillType MyCornerKick();	//我方角球
SkillType OppCornerKick();	//對方角球
SkillType MyGaolKick();		//我方球門球
SkillType OppGaolKick();	//對方球門球
SkillType MyFreeKick(); 	//我方任意球
SkillType OppFreeKick();	//對方任意球

注意在下圖的代碼中有一段selectSkill()函數,是這段函數將比賽階段與對應的策略函數對應。例如,worldModel->getPlayMode()== PM_PLAY_ON時,返回return PlayOnSkill()函數。

比賽開始,先是階段執行beam(),然后開球極階段執行MyKickOff()或者OppKickOff(),球離開中圈后進入策略階段執行playOnSkill()。當滿足界外球、角球、球門球的情況下,執行相應函數。(對這三種情況不了解的可自行百度。)

修復make異常

這里要注意的是,我們從學長那里拿到代碼是不能直接make的。

我們打開終端,cd到球隊代碼目錄下(utaustinvilla3d-master),輸入make指令進行編譯。第一次你可能會看到如下報錯結果:

因為這是從學長電腦拷貝給你們的,你們這個文件的目錄和學長文件目錄可能不一樣。就算同樣是放在桌面,如果是中文系統就是/home/用戶名/桌面,英文就是/home/用戶名/Desktop,而且我們用戶名肯定也不一樣。所以目錄基本上是一定不一樣。

那就必須改目錄!

CMakeFiles下面有很多文件里都存儲有項目的目錄,為了能運行,都要修改。主要是要修改CMakeFiles/newforces.dir/下面的文件,然后退回到CMakeFile一級,還有一兩個文件需要修改。

修改時利用sublime編輯器,上面的find-Replace進行全部替換。

這張圖中,我將所有的 桌面 一鍵替換成了 Desktop。那么你的用戶名也和我不一樣,那你們就應該是 Shiraka/桌面替換成你的用戶名/Desktop。確保替換后,和你的目錄一致就行了。

最后成功運行如下圖:

如果不一樣,依舊報錯,說明還是有地方沒改。再仔細檢查一下CMakeFile下有沒有漏網之魚。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM