王明菱,肖軍浩
(1.西昌衛(wèi)星發(fā)射中心,四川 西昌 615000; 2.國防科技大學(xué) 智能科學(xué)學(xué)院,湖南 長沙410000)
在RoboCup 標(biāo)準(zhǔn)平臺組聯(lián)賽發(fā)展早期,由于底層運(yùn)動控制等方面的研究處于起步階段,群體智能發(fā)展十分有限,單個機(jī)器人的性能在競賽中發(fā)揮著主要作用.隨著研究的深入,單機(jī)器人自主控制能力的日漸成熟,以及傳感器、控制器、電機(jī)等硬件性能的大幅提高,仿人機(jī)器人的機(jī)動能力已經(jīng)不再是機(jī)器人足球賽勝負(fù)的決定性因素.當(dāng)然,在一些更加復(fù)雜的情況下,機(jī)器人的機(jī)動能力仍然面臨巨大挑戰(zhàn).本文在RoboCup 標(biāo)準(zhǔn)平臺組聯(lián)賽指定的統(tǒng)一機(jī)器人平臺下,采用國際強(qiáng)隊B-human 公開發(fā)布的開源軟件框架,通過與傳統(tǒng)策略進(jìn)行對比,研究多機(jī)器人協(xié)同足球競賽的頂層策略.
如圖1 所示,所有的坐標(biāo)遵循球場坐標(biāo)系: 以球場中心點為原點,指向敵方球門為x軸正方向,x軸正方向在球場平面逆時針旋轉(zhuǎn)90°得到y(tǒng)軸正方向.球場的有效范圍:4500-<x< 4500,3000-<y< 3000,單位取mm.
圖1 球場坐標(biāo)系
參賽隊伍由五個機(jī)器人組成,其中規(guī)則指定1 號機(jī)器人為守門員,無特殊情況不允許在比賽進(jìn)行中更換守門員角色.守門員策略為: 當(dāng)足球的速度超過閾值的時候,判斷它是否可能進(jìn)入己方球門,如果可能則向著球速度所指的方向臥倒,以期望阻止對方得分.
隊伍中配置有兩個前鋒,分別是2 號左前鋒和5 號右前鋒.其中左前鋒控制敵方半場偏左的區(qū)域(- 2000<x<4500,- 600<y< 3000),右前鋒則控制敵方半場偏右的區(qū)域(- 2000 <x<4500,- 3000<y< 600).前鋒的策略為先判斷球的位置,如果球進(jìn)入自己控制的區(qū)域內(nèi),且沒有隊友正在控球,則過去控球,并找準(zhǔn)合適的時機(jī)射門,否則就跑位.前鋒控球的時候,掃描前方的障礙,如果障礙離自己比較近( <800),則帶球前進(jìn),如果障礙較遠(yuǎn)則射門.前鋒跑位的時候,根據(jù)球的位置(主要是x坐標(biāo))選取相應(yīng)的跑位點,一般跑位點的x坐標(biāo)位于球的x坐標(biāo)更靠近對方球門方向的位置,跑位點的y坐標(biāo)根據(jù)經(jīng)驗確定.
隊伍中同樣設(shè)置了兩個后衛(wèi),分別是3號右后衛(wèi)和4號左后衛(wèi).右后衛(wèi)控制己方半場偏右的區(qū)域( - 4500<x< 1000,-3000 <y<1500),左后衛(wèi)控制己方半場偏左的區(qū)域( - 4500<x< 1000,- 1500 <y<3000).后衛(wèi)的策略為,判斷球的位置,如果球在自己控制的區(qū)域內(nèi)且沒有隊友在控球,則過去控球,并找準(zhǔn)時機(jī)將球踢到敵方半場靠近己方前鋒的位置,否則回歸初始位置.控球策略和前鋒類似.各角色控制區(qū)域如圖2所示.
圖2 角色控制區(qū)域
傳統(tǒng)策略基于靜態(tài)角色分配.在狀態(tài)機(jī)上,每個角色之間不會形成狀態(tài)轉(zhuǎn)移,可以針對單個角色進(jìn)行詳細(xì)設(shè)計,算法復(fù)雜度和編程復(fù)雜度都很低,容易實現(xiàn),用來應(yīng)付一般的競賽基本足夠.但是角色固定之后,容易出現(xiàn)對方控球進(jìn)入我方半場,足球離前鋒較遠(yuǎn)的情況,而機(jī)器人動作笨拙,傳球精度很低,就會使雙方在場內(nèi)反復(fù)控球,增加我方失分的風(fēng)險.而且,這種劃分區(qū)域攻防的方式,判斷隊友是否在控球比較困難,因此經(jīng)常在區(qū)域的交叉處出現(xiàn)兩個己方機(jī)器人互相搶球的情況.為了解決上述問題,本文提出一種基于動態(tài)角色分配的策略,稱之為分布式多機(jī)器人協(xié)同策略.
本策略基于一種動態(tài)角色分配算法,在動態(tài)角色分配算法下,所有機(jī)器人(除了1號必須是守門員之外)角色不固定.算法采取的策略較為均衡,兼顧了進(jìn)攻和防守,注重對機(jī)器人資源的最大化利用.策略的合理性和可擴(kuò)展性強(qiáng),同時也更加靈活.五個機(jī)器人角色分別為: Keeper(固定1 號為守門員),Striker(前鋒),Supporter(助攻),FDefender(左后衛(wèi)/前后位),BDefender(右后衛(wèi)/后后衛(wèi)).下面分別對這些角色的具體算法進(jìn)行描述.由于守門員和前鋒在比賽中發(fā)揮的作用最大,所以重點介紹這兩個角色.
動態(tài)角色分配流程(見圖3)在狀態(tài)機(jī)中以O(shè)ption 的形式給出.
圖3 動態(tài)角色分配流程
動態(tài)角色分配的基本方案為:守門員被固定為1號;其余四個機(jī)器人中,距離足球最近的分配為前鋒;除前鋒外最靠前的機(jī)器人分配為助攻;剩下兩個機(jī)器人,靠左的分配為左后衛(wèi),靠右的分配為右后衛(wèi).動態(tài)分配角色除了要添加底層模塊之外,還需要提供相應(yīng)的Option.底層模塊RoleProviderRoyale每個周期都會更新一個名為Role 的Represent,需要在Option中調(diào)用該Represent 以達(dá)到動態(tài)分配效果,整體跳轉(zhuǎn)使用“common_transition”進(jìn)行Option 內(nèi)最高優(yōu)先級的狀態(tài)跳轉(zhuǎn).
守門員在機(jī)器人足球賽中起到至關(guān)重要的防御作用,是整個球場上的最后一道防線,一旦被突破,就意味著對方得分.因此守門員算法的重要性不言而喻.
守門員規(guī)則:守門員通常為1 號球員,一般位于禁區(qū)內(nèi),必要時也能出禁區(qū)踢球.守門員在己方禁區(qū)內(nèi)可以用手觸球,而出了禁區(qū)則不允許用手觸球,如圖4所示.
圖4 守門員位置
判斷球是否可能進(jìn)門:整個球場在全局坐標(biāo)系下的覆蓋范圍為(- 4500<x< 4500,-3000 <x<3000),己方球門線位于(x=-4500,-800<y< 800)的范圍內(nèi).當(dāng)出現(xiàn)以下幾種情況即認(rèn)為球不可能進(jìn)門:當(dāng)球的x坐標(biāo)大于-1 000時;當(dāng)球的x坐標(biāo)在 -3000 ~-1 000之間且球的速度小于400mm/s時;當(dāng)球的x坐標(biāo)小于 - 3000且球的速度小于200mm/s時.在這三種情況之外,則需通過以下公式計算:
其中(vx,vy)代表球在全局坐標(biāo)系下的速度,代表球在全局坐標(biāo)系下的位置.當(dāng) -810 <y<810的時候,認(rèn)為球可能進(jìn)門,而其他情況均認(rèn)為球不可能進(jìn)門.
上述公式的原理在于:以球為起始點,沿球速度方向做一條射線,判斷該射線與己方球門底線的交點是否位于球門內(nèi)(兩側(cè)留出10mm 的裕度用來應(yīng)付判斷模糊的情況).如圖5 所示.
圖5 足球位置預(yù)判示意圖
倒地?fù)淝蚍较蚺袛?在球可能進(jìn)門的情況下,守門員需要做出倒地?fù)淝虻膭幼鱽碜柚骨蜻M(jìn)門.因此判斷球的方向很重要,這決定了守門員的撲球是否能起到阻擋作用,公式為
其中k為式(1)中的k,()代表守門員的坐標(biāo),()代表球在全局坐標(biāo)系下的位置.判斷條件為,y=PyR代表球的速度指向機(jī)器人左側(cè),y<PyR則指向機(jī)器人右側(cè).
式(3)的原理與式(2)類似,只是將球門底線改成了守門員的x坐標(biāo),判斷條件也略有不同,如圖6所示.
圖6 足球兩側(cè)預(yù)判示意圖
當(dāng)前時刻不可能進(jìn)球的預(yù)防守:在判斷球不可能進(jìn)門的情況下,守門員應(yīng)做出預(yù)防守動作(跑位)盡可能預(yù)判球的走向,最理想的情況是扼殺對手一切射門的可能性,而本算法可以做到消除大部分對手射門的隱患.算法分為兩種情況討論,一種是球距離球門較遠(yuǎn),威脅系數(shù)不大的情況;另一種是球已經(jīng)很接近球門了,對手射門的可能性很大.
具體算法思想如下:當(dāng)球距離己方球門較遠(yuǎn)的時(即以x=-2500為分界線,大于此界則認(rèn)為球距離己方球門較遠(yuǎn),小于則認(rèn)為球距離己方球門較近),守門員跑位靠前,即期望x坐標(biāo)位于 -4000的位置.而y坐標(biāo)是根據(jù)球的位置而變化的.以坐標(biāo)點(-5000,0)為中心,與球所在的坐標(biāo)點連線作一條直線,該直線與直線x=- 4000的交點即為守門員的期望跑位.守門員期望跑位的坐標(biāo)用(TxK,TyK)表示,公式為
其中(PxB,PyB)為球的全局坐標(biāo),的值有上下限,分別為-600和600.公式的原理基于相似三角形.
當(dāng)球距離己方球門較近時,守門員跑位靠后,此時的中心坐標(biāo)點變?yōu)? - 7000,0),這是根據(jù)經(jīng)驗反復(fù)調(diào)試確定的.相應(yīng)的期望跑位公式為
其中各變量的含義同式(4)和式(5).
其中(PxR,PyR)為機(jī)器人的全局坐標(biāo),(TxK,TyK)為機(jī)器人期望全局坐標(biāo),R代表機(jī)器人在全局坐標(biāo)系下正方向與全局x坐標(biāo)軸的夾角.
守門員在狀態(tài)機(jī)中的狀態(tài)轉(zhuǎn)移策略:以上是各項策略的分開描述,而策略的整合則是在狀態(tài)機(jī)中完成的.優(yōu)先級最高的狀態(tài)轉(zhuǎn)移在common_transition 內(nèi)完成,如圖7所示.優(yōu)先級較低的狀態(tài)轉(zhuǎn)移從initial_state開始,在各個狀態(tài)之間跳轉(zhuǎn),用于完成預(yù)防守,如圖8所示.
圖7 守門員優(yōu)先級最高的狀態(tài)轉(zhuǎn)移
圖8 守門員普通優(yōu)先級狀態(tài)跳轉(zhuǎn)
圖7中,信號量Sem_dive是為了防止守門員做出倒地動作后看見球過來,重復(fù)做出倒地動作損壞關(guān)節(jié)而設(shè)定的.在倒地動作做出后馬上讓Sem_dive=0,即可避免上述問題出現(xiàn).Sem_dive的復(fù)位放在初始狀態(tài)中.圖8中,狀態(tài)turnToBall 表示機(jī)器人轉(zhuǎn)向球,直到機(jī)器人對準(zhǔn)球;狀態(tài)searchBall 表示在機(jī)器人沒看見球的情況下尋找球;alignToBall表示機(jī)器人將自身位置(Posx,Posy)移動到通過預(yù)判球的走向而計算出的位置(STx,STy).
守門員的算法在仿真軟件中運(yùn)行效果良好,能起到很好的防御作用.其缺點就是倒地動作容易造成關(guān)節(jié)損傷.另外倒地后起立會導(dǎo)致自定位不準(zhǔn),這些問題都是底層算法不夠成熟導(dǎo)致的.
前鋒是整個球隊的靈魂,不僅因為它的進(jìn)攻性最強(qiáng),是球隊得分最重要的一環(huán),而且在動態(tài)角色分配算法下,離球最近的機(jī)器人被分配為前鋒,任何角色(守門員除外)都有可能直接跳轉(zhuǎn)為前鋒.因此前鋒算法的好壞直接決定了場上機(jī)器人的整體表現(xiàn)(包括控球、傳球、射門等).
前鋒的規(guī)則:前鋒可以出現(xiàn)在場上任意位置,但除守門員外,其他的球員最多只能有一個進(jìn)入禁區(qū),否則視為犯規(guī).
前鋒的核心算法:前鋒的主要作用在于避障射門.本文提出一種名為“前向掃描算法”的避障策略.NAO機(jī)器人的前向視野范圍為 ± 30°.經(jīng)過大量試驗,決定將掃描范圍定為± 20°.在兩側(cè)留出10°的裕度,是為了避免判斷模糊導(dǎo)致的一系列問題,通過仿真也證明了留出裕度更好.循環(huán)從0°開始,以5°為間隔向兩邊發(fā)散掃描.每一輪掃描循環(huán)五次,每次判斷兩個角度(一個為正角,一個為負(fù)角).對于每個角度,從“ObstacleModel”這個Represent 中獲得視野中障礙物的信息,并判斷此角度是否與某個障礙物相交.若某角度與大于或等于一個障礙物相交,且不滿足函數(shù)“DirToGoal(float theangle,Vector2f pos)”,則該角度被認(rèn)定為無效角度,否則認(rèn)定為有效角度.有效角度中越靠近0°的優(yōu)先級越高.最終判定可行角度即為有效角度中優(yōu)先級最高的角度.如圖9 所示,圖中有效角度為+ 5°、 + 10°、 + 15°,可行角度可被確定為 + 5°,約定正數(shù)優(yōu)先級略高于負(fù)數(shù),因此最終可行角度為 + 5°.
圖9 “前向掃描”確定可行角度(+5°)
函數(shù)“DirToGoal(float theangle,Vector2f Pos)”包含兩個輸入?yún)?shù),分別表示需要判斷的角度theangle和機(jī)器人當(dāng)前的位置Pos.輸出為bool 類型,表示當(dāng)前角度是否滿足條件.函數(shù)內(nèi)部有如下計算公式:
當(dāng)機(jī)器人當(dāng)前位置Pos中的x坐標(biāo)小于1000 時,若式(14)中的y位于±3000 以內(nèi)返回true,否則返回false;當(dāng)機(jī)器人當(dāng)前位置Pos中的x坐標(biāo)大于1000 時,若式(14)中的y位于± 800以內(nèi)(即球門內(nèi))返回true,否則返回false.
式(13)和式(14)的判斷原則與式(2)類似,即判斷沿當(dāng)前方向的直線與對方球門底線的交點位置(交點的坐標(biāo)即為(4500,y)),交點位于規(guī)定范圍內(nèi)則該角度判定為有效.在確定了可行角度后,將其保存在變量“angleWithNoOpponent”內(nèi)并提供外部接口函數(shù)“GetangleWithNoOpponent()”以便于狀態(tài)機(jī)訪問.可行角度隨時間變化,以確保在前鋒將球踢出去的瞬間,該角度上是無障礙的.若所有角度均被判定為無效,則進(jìn)入傳球動作,否則一旦確定可行角度,便將球向可行角度踢出.傳球時盡量踢向Supporter 所在的方向.
前鋒在狀態(tài)機(jī)中的狀態(tài)轉(zhuǎn)移策略:狀態(tài)機(jī)中前鋒的Option 為option(striker),主要使用普通優(yōu)先級的狀態(tài)轉(zhuǎn)移實現(xiàn),最高優(yōu)先級的common_transition 只有一個跳轉(zhuǎn)條件,即當(dāng)自身面向敵方,且球以一定速度滾向自己的時候,執(zhí)行kickBall.其他所有角色中亦有運(yùn)用此common_transition.狀態(tài)機(jī)結(jié)構(gòu)如圖10 和圖11所示.圖11中,(Bx,By)為球的全局坐標(biāo),(Posx,Posy)為機(jī)器人全局坐標(biāo),Rrotation為機(jī)器人在全局坐標(biāo)系下的方向角.
圖10 前鋒最高優(yōu)先級狀態(tài)轉(zhuǎn)移
圖11 前鋒普通優(yōu)先級狀態(tài)轉(zhuǎn)移
前鋒算法在仿真環(huán)境中進(jìn)行了驗證,在后方可以進(jìn)行有效支援,在前線也有強(qiáng)大的進(jìn)攻能力,能把握住大量的機(jī)會突破敵方的防守并得分.其缺點在于當(dāng)其位于死角處射門時效果欠佳(很容易出界),一般直接改為向內(nèi)傳球來避免.
助攻在進(jìn)攻中起到支援前鋒的作用,策略較為簡單,即跑位.助攻跑到與足球相關(guān)聯(lián)的固定點,等待前鋒的傳球.前鋒一旦將球傳至助攻附近,角色分配算法會自動交換二者的角色,可以實現(xiàn)二者之間傳球的完美銜接.助攻在競賽規(guī)則中并沒有作特別規(guī)定,和前鋒一樣,屬于非守門員機(jī)器人.所有非守門員機(jī)器人每一時刻只能有一臺進(jìn)入己方禁區(qū).
助攻的跑位:當(dāng)球位于深色區(qū)域內(nèi)時,助攻跑位落在淺色曲線上(見圖12a).同理,當(dāng)球位于淺色區(qū)域內(nèi)時,助攻跑位落在深色曲線上(見圖12b).前后位置由球的前后位置確定,一般不會離球太遠(yuǎn),以方便前鋒隨時傳球.助攻在狀態(tài)機(jī)中的狀態(tài)轉(zhuǎn)移策略:助攻Option中,最高優(yōu)先級的狀態(tài)跳轉(zhuǎn)(即Common_transition)與前鋒策略一樣,普通優(yōu)先級的狀態(tài)跳轉(zhuǎn)如圖13 所示.其中,(Posx,Posy)為機(jī)器人坐標(biāo),(STx,STy)為助攻跑位需要到達(dá)的位置.狀態(tài)judgePosition即為判斷球的位置確定跑位位置,并通過指令使機(jī)器人跑到指定位置.
圖12 助攻跑位示意圖
圖13 助攻算法普通優(yōu)先級狀態(tài)跳轉(zhuǎn)
在仿真中,助攻基本能夠做好輔助工作,為前鋒制造機(jī)會,效果令人滿意.
兩個后衛(wèi)的算法沒有太大差異,基本上是沿中軸的左右鏡像翻轉(zhuǎn)外加前后位置有所不同.如圖14所示,兩個后衛(wèi)的防守線位分別位于直線x=-3200以及直線x=-2500上,即兩個后衛(wèi)只在這兩條線上運(yùn)動(如果被自動分配為其他角色的話則可以脫離這個限制).靠前的后衛(wèi)被限制在左半場,靠后的后衛(wèi)被限制在右半場,這是為了提高后衛(wèi)應(yīng)對突發(fā)情況的快速反應(yīng)能力,防止出現(xiàn)某一瞬間我方后場空虛的問題.
圖14 后衛(wèi)防守線示意圖
后衛(wèi)的防守策略:該策略與守門員的“預(yù)防守”策略相似,只需將STx的值改為-3 200或-2500即可.
后衛(wèi)在狀態(tài)機(jī)中的狀態(tài)轉(zhuǎn)移策略:后衛(wèi)的Option 中也分為最高優(yōu)先級的跳轉(zhuǎn)common_transition 和普通優(yōu)先級的狀態(tài)轉(zhuǎn)移.最高優(yōu)先級的跳轉(zhuǎn)與前鋒相同,下面主要介紹普通優(yōu)先級的狀態(tài)轉(zhuǎn)移.
如圖15所示,后衛(wèi)的狀態(tài)轉(zhuǎn)移和助攻十分相似,因為其目的與助攻類似,都是跑到關(guān)聯(lián)目標(biāo)點等待球的接近,然后變成前鋒控球.不同之處也很明顯,助攻主要關(guān)注前線的進(jìn)攻,而后衛(wèi)主要關(guān)注于后方的防守.圖15中,狀態(tài)judgePosition的動作是讓機(jī)器人走到防守策略中規(guī)定的關(guān)聯(lián)目標(biāo)點上.
圖15 后衛(wèi)普通優(yōu)先級狀態(tài)轉(zhuǎn)移
后衛(wèi)在仿真實驗中能表現(xiàn)出很好的防守能力,使得敵方機(jī)器人幾乎不可能從中場長驅(qū)直入,另外當(dāng)球接近時可以很順利地轉(zhuǎn)換角色,變成前鋒上去控球,而其他離球較遠(yuǎn)的機(jī)器人可以及時回到己方半場填補(bǔ)后衛(wèi)的空缺.
本文算法在仿真過程中表現(xiàn)出色,成績預(yù)計可達(dá)到國際賽的平均水平,但是仍然存在很大的改進(jìn)空間.比如守門員算法的倒地動作過于夸張,不但防守效果較差,而且容易摔壞,嚴(yán)重的時候甚至?xí)p傷關(guān)節(jié).可以考慮將撲球動作改為朝一側(cè)進(jìn)行緩沖臥倒,再加上原地坐下用于應(yīng)付中間來球等.
未來工作將繼續(xù)關(guān)注RoboCup競賽,持續(xù)改進(jìn)算法,設(shè)計出更先進(jìn)的多機(jī)器人協(xié)同控制策略.