[TOC] 開始編寫球隊代碼 裝好了Robocup 3D比賽平臺後,就要開始著手編寫球隊策略代碼了。 我們使用的是utaustinvilla的Robocup 3D球隊代碼,球隊的體態運動等都已經是別人寫好的,我們暫時不要研究。 在下圖中,behaviors文件夾下的strategy.cc文件,就是我 ...
目錄
開始編寫球隊代碼
裝好了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下有沒有漏網之魚。