王明菱,肖军浩
(1.西昌卫星发射中心,四川 西昌 615000; 2.国防科技大学 智能科学学院,湖南 长沙410000)
在RoboCup 标准平台组联赛发展早期,由于底层运动控制等方面的研究处于起步阶段,群体智能发展十分有限,单个机器人的性能在竞赛中发挥着主要作用.随着研究的深入,单机器人自主控制能力的日渐成熟,以及传感器、控制器、电机等硬件性能的大幅提高,仿人机器人的机动能力已经不再是机器人足球赛胜负的决定性因素.当然,在一些更加复杂的情况下,机器人的机动能力仍然面临巨大挑战.本文在RoboCup 标准平台组联赛指定的统一机器人平台下,采用国际强队B-human 公开发布的开源软件框架,通过与传统策略进行对比,研究多机器人协同足球竞赛的顶层策略.
如图1 所示,所有的坐标遵循球场坐标系: 以球场中心点为原点,指向敌方球门为x轴正方向,x轴正方向在球场平面逆时针旋转90°得到y轴正方向.球场的有效范围:4500-<x< 4500,3000-<y< 3000,单位取mm.
图1 球场坐标系
参赛队伍由五个机器人组成,其中规则指定1 号机器人为守门员,无特殊情况不允许在比赛进行中更换守门员角色.守门员策略为: 当足球的速度超过阈值的时候,判断它是否可能进入己方球门,如果可能则向着球速度所指的方向卧倒,以期望阻止对方得分.
队伍中配置有两个前锋,分别是2 号左前锋和5 号右前锋.其中左前锋控制敌方半场偏左的区域(- 2000<x<4500,- 600<y< 3000),右前锋则控制敌方半场偏右的区域(- 2000 <x<4500,- 3000<y< 600).前锋的策略为先判断球的位置,如果球进入自己控制的区域内,且没有队友正在控球,则过去控球,并找准合适的时机射门,否则就跑位.前锋控球的时候,扫描前方的障碍,如果障碍离自己比较近( <800),则带球前进,如果障碍较远则射门.前锋跑位的时候,根据球的位置(主要是x坐标)选取相应的跑位点,一般跑位点的x坐标位于球的x坐标更靠近对方球门方向的位置,跑位点的y坐标根据经验确定.
队伍中同样设置了两个后卫,分别是3号右后卫和4号左后卫.右后卫控制己方半场偏右的区域( - 4500<x< 1000,-3000 <y<1500),左后卫控制己方半场偏左的区域( - 4500<x< 1000,- 1500 <y<3000).后卫的策略为,判断球的位置,如果球在自己控制的区域内且没有队友在控球,则过去控球,并找准时机将球踢到敌方半场靠近己方前锋的位置,否则回归初始位置.控球策略和前锋类似.各角色控制区域如图2所示.
图2 角色控制区域
传统策略基于静态角色分配.在状态机上,每个角色之间不会形成状态转移,可以针对单个角色进行详细设计,算法复杂度和编程复杂度都很低,容易实现,用来应付一般的竞赛基本足够.但是角色固定之后,容易出现对方控球进入我方半场,足球离前锋较远的情况,而机器人动作笨拙,传球精度很低,就会使双方在场内反复控球,增加我方失分的风险.而且,这种划分区域攻防的方式,判断队友是否在控球比较困难,因此经常在区域的交叉处出现两个己方机器人互相抢球的情况.为了解决上述问题,本文提出一种基于动态角色分配的策略,称之为分布式多机器人协同策略.
本策略基于一种动态角色分配算法,在动态角色分配算法下,所有机器人(除了1号必须是守门员之外)角色不固定.算法采取的策略较为均衡,兼顾了进攻和防守,注重对机器人资源的最大化利用.策略的合理性和可扩展性强,同时也更加灵活.五个机器人角色分别为: Keeper(固定1 号为守门员),Striker(前锋),Supporter(助攻),FDefender(左后卫/前后位),BDefender(右后卫/后后卫).下面分别对这些角色的具体算法进行描述.由于守门员和前锋在比赛中发挥的作用最大,所以重点介绍这两个角色.
动态角色分配流程(见图3)在状态机中以Option 的形式给出.
图3 动态角色分配流程
动态角色分配的基本方案为:守门员被固定为1号;其余四个机器人中,距离足球最近的分配为前锋;除前锋外最靠前的机器人分配为助攻;剩下两个机器人,靠左的分配为左后卫,靠右的分配为右后卫.动态分配角色除了要添加底层模块之外,还需要提供相应的Option.底层模块RoleProviderRoyale每个周期都会更新一个名为Role 的Represent,需要在Option中调用该Represent 以达到动态分配效果,整体跳转使用“common_transition”进行Option 内最高优先级的状态跳转.
守门员在机器人足球赛中起到至关重要的防御作用,是整个球场上的最后一道防线,一旦被突破,就意味着对方得分.因此守门员算法的重要性不言而喻.
守门员规则:守门员通常为1 号球员,一般位于禁区内,必要时也能出禁区踢球.守门员在己方禁区内可以用手触球,而出了禁区则不允许用手触球,如图4所示.
图4 守门员位置
判断球是否可能进门:整个球场在全局坐标系下的覆盖范围为(- 4500<x< 4500,-3000 <x<3000),己方球门线位于(x=-4500,-800<y< 800)的范围内.当出现以下几种情况即认为球不可能进门:当球的x坐标大于-1 000时;当球的x坐标在 -3000 ~-1 000之间且球的速度小于400mm/s时;当球的x坐标小于 - 3000且球的速度小于200mm/s时.在这三种情况之外,则需通过以下公式计算:
其中(vx,vy)代表球在全局坐标系下的速度,代表球在全局坐标系下的位置.当 -810 <y<810的时候,认为球可能进门,而其他情况均认为球不可能进门.
上述公式的原理在于:以球为起始点,沿球速度方向做一条射线,判断该射线与己方球门底线的交点是否位于球门内(两侧留出10mm 的裕度用来应付判断模糊的情况).如图5 所示.
图5 足球位置预判示意图
倒地扑球方向判断:在球可能进门的情况下,守门员需要做出倒地扑球的动作来阻止球进门.因此判断球的方向很重要,这决定了守门员的扑球是否能起到阻挡作用,公式为
其中k为式(1)中的k,()代表守门员的坐标,()代表球在全局坐标系下的位置.判断条件为,y=PyR代表球的速度指向机器人左侧,y<PyR则指向机器人右侧.
式(3)的原理与式(2)类似,只是将球门底线改成了守门员的x坐标,判断条件也略有不同,如图6所示.
图6 足球两侧预判示意图
当前时刻不可能进球的预防守:在判断球不可能进门的情况下,守门员应做出预防守动作(跑位)尽可能预判球的走向,最理想的情况是扼杀对手一切射门的可能性,而本算法可以做到消除大部分对手射门的隐患.算法分为两种情况讨论,一种是球距离球门较远,威胁系数不大的情况;另一种是球已经很接近球门了,对手射门的可能性很大.
具体算法思想如下:当球距离己方球门较远的时(即以x=-2500为分界线,大于此界则认为球距离己方球门较远,小于则认为球距离己方球门较近),守门员跑位靠前,即期望x坐标位于 -4000的位置.而y坐标是根据球的位置而变化的.以坐标点(-5000,0)为中心,与球所在的坐标点连线作一条直线,该直线与直线x=- 4000的交点即为守门员的期望跑位.守门员期望跑位的坐标用(TxK,TyK)表示,公式为
其中(PxB,PyB)为球的全局坐标,的值有上下限,分别为-600和600.公式的原理基于相似三角形.
当球距离己方球门较近时,守门员跑位靠后,此时的中心坐标点变为( - 7000,0),这是根据经验反复调试确定的.相应的期望跑位公式为
其中各变量的含义同式(4)和式(5).
其中(PxR,PyR)为机器人的全局坐标,(TxK,TyK)为机器人期望全局坐标,R代表机器人在全局坐标系下正方向与全局x坐标轴的夹角.
守门员在状态机中的状态转移策略:以上是各项策略的分开描述,而策略的整合则是在状态机中完成的.优先级最高的状态转移在common_transition 内完成,如图7所示.优先级较低的状态转移从initial_state开始,在各个状态之间跳转,用于完成预防守,如图8所示.
图7 守门员优先级最高的状态转移
图8 守门员普通优先级状态跳转
图7中,信号量Sem_dive是为了防止守门员做出倒地动作后看见球过来,重复做出倒地动作损坏关节而设定的.在倒地动作做出后马上让Sem_dive=0,即可避免上述问题出现.Sem_dive的复位放在初始状态中.图8中,状态turnToBall 表示机器人转向球,直到机器人对准球;状态searchBall 表示在机器人没看见球的情况下寻找球;alignToBall表示机器人将自身位置(Posx,Posy)移动到通过预判球的走向而计算出的位置(STx,STy).
守门员的算法在仿真软件中运行效果良好,能起到很好的防御作用.其缺点就是倒地动作容易造成关节损伤.另外倒地后起立会导致自定位不准,这些问题都是底层算法不够成熟导致的.
前锋是整个球队的灵魂,不仅因为它的进攻性最强,是球队得分最重要的一环,而且在动态角色分配算法下,离球最近的机器人被分配为前锋,任何角色(守门员除外)都有可能直接跳转为前锋.因此前锋算法的好坏直接决定了场上机器人的整体表现(包括控球、传球、射门等).
前锋的规则:前锋可以出现在场上任意位置,但除守门员外,其他的球员最多只能有一个进入禁区,否则视为犯规.
前锋的核心算法:前锋的主要作用在于避障射门.本文提出一种名为“前向扫描算法”的避障策略.NAO机器人的前向视野范围为 ± 30°.经过大量试验,决定将扫描范围定为± 20°.在两侧留出10°的裕度,是为了避免判断模糊导致的一系列问题,通过仿真也证明了留出裕度更好.循环从0°开始,以5°为间隔向两边发散扫描.每一轮扫描循环五次,每次判断两个角度(一个为正角,一个为负角).对于每个角度,从“ObstacleModel”这个Represent 中获得视野中障碍物的信息,并判断此角度是否与某个障碍物相交.若某角度与大于或等于一个障碍物相交,且不满足函数“DirToGoal(float theangle,Vector2f pos)”,则该角度被认定为无效角度,否则认定为有效角度.有效角度中越靠近0°的优先级越高.最终判定可行角度即为有效角度中优先级最高的角度.如图9 所示,图中有效角度为+ 5°、 + 10°、 + 15°,可行角度可被确定为 + 5°,约定正数优先级略高于负数,因此最终可行角度为 + 5°.
图9 “前向扫描”确定可行角度(+5°)
函数“DirToGoal(float theangle,Vector2f Pos)”包含两个输入参数,分别表示需要判断的角度theangle和机器人当前的位置Pos.输出为bool 类型,表示当前角度是否满足条件.函数内部有如下计算公式:
当机器人当前位置Pos中的x坐标小于1000 时,若式(14)中的y位于±3000 以内返回true,否则返回false;当机器人当前位置Pos中的x坐标大于1000 时,若式(14)中的y位于± 800以内(即球门内)返回true,否则返回false.
式(13)和式(14)的判断原则与式(2)类似,即判断沿当前方向的直线与对方球门底线的交点位置(交点的坐标即为(4500,y)),交点位于规定范围内则该角度判定为有效.在确定了可行角度后,将其保存在变量“angleWithNoOpponent”内并提供外部接口函数“GetangleWithNoOpponent()”以便于状态机访问.可行角度随时间变化,以确保在前锋将球踢出去的瞬间,该角度上是无障碍的.若所有角度均被判定为无效,则进入传球动作,否则一旦确定可行角度,便将球向可行角度踢出.传球时尽量踢向Supporter 所在的方向.
前锋在状态机中的状态转移策略:状态机中前锋的Option 为option(striker),主要使用普通优先级的状态转移实现,最高优先级的common_transition 只有一个跳转条件,即当自身面向敌方,且球以一定速度滚向自己的时候,执行kickBall.其他所有角色中亦有运用此common_transition.状态机结构如图10 和图11所示.图11中,(Bx,By)为球的全局坐标,(Posx,Posy)为机器人全局坐标,Rrotation为机器人在全局坐标系下的方向角.
图10 前锋最高优先级状态转移
图11 前锋普通优先级状态转移
前锋算法在仿真环境中进行了验证,在后方可以进行有效支援,在前线也有强大的进攻能力,能把握住大量的机会突破敌方的防守并得分.其缺点在于当其位于死角处射门时效果欠佳(很容易出界),一般直接改为向内传球来避免.
助攻在进攻中起到支援前锋的作用,策略较为简单,即跑位.助攻跑到与足球相关联的固定点,等待前锋的传球.前锋一旦将球传至助攻附近,角色分配算法会自动交换二者的角色,可以实现二者之间传球的完美衔接.助攻在竞赛规则中并没有作特别规定,和前锋一样,属于非守门员机器人.所有非守门员机器人每一时刻只能有一台进入己方禁区.
助攻的跑位:当球位于深色区域内时,助攻跑位落在浅色曲线上(见图12a).同理,当球位于浅色区域内时,助攻跑位落在深色曲线上(见图12b).前后位置由球的前后位置确定,一般不会离球太远,以方便前锋随时传球.助攻在状态机中的状态转移策略:助攻Option中,最高优先级的状态跳转(即Common_transition)与前锋策略一样,普通优先级的状态跳转如图13 所示.其中,(Posx,Posy)为机器人坐标,(STx,STy)为助攻跑位需要到达的位置.状态judgePosition即为判断球的位置确定跑位位置,并通过指令使机器人跑到指定位置.
图12 助攻跑位示意图
图13 助攻算法普通优先级状态跳转
在仿真中,助攻基本能够做好辅助工作,为前锋制造机会,效果令人满意.
两个后卫的算法没有太大差异,基本上是沿中轴的左右镜像翻转外加前后位置有所不同.如图14所示,两个后卫的防守线位分别位于直线x=-3200以及直线x=-2500上,即两个后卫只在这两条线上运动(如果被自动分配为其他角色的话则可以脱离这个限制).靠前的后卫被限制在左半场,靠后的后卫被限制在右半场,这是为了提高后卫应对突发情况的快速反应能力,防止出现某一瞬间我方后场空虚的问题.
图14 后卫防守线示意图
后卫的防守策略:该策略与守门员的“预防守”策略相似,只需将STx的值改为-3 200或-2500即可.
后卫在状态机中的状态转移策略:后卫的Option 中也分为最高优先级的跳转common_transition 和普通优先级的状态转移.最高优先级的跳转与前锋相同,下面主要介绍普通优先级的状态转移.
如图15所示,后卫的状态转移和助攻十分相似,因为其目的与助攻类似,都是跑到关联目标点等待球的接近,然后变成前锋控球.不同之处也很明显,助攻主要关注前线的进攻,而后卫主要关注于后方的防守.图15中,状态judgePosition的动作是让机器人走到防守策略中规定的关联目标点上.
图15 后卫普通优先级状态转移
后卫在仿真实验中能表现出很好的防守能力,使得敌方机器人几乎不可能从中场长驱直入,另外当球接近时可以很顺利地转换角色,变成前锋上去控球,而其他离球较远的机器人可以及时回到己方半场填补后卫的空缺.
本文算法在仿真过程中表现出色,成绩预计可达到国际赛的平均水平,但是仍然存在很大的改进空间.比如守门员算法的倒地动作过于夸张,不但防守效果较差,而且容易摔坏,严重的时候甚至会损伤关节.可以考虑将扑球动作改为朝一侧进行缓冲卧倒,再加上原地坐下用于应付中间来球等.
未来工作将继续关注RoboCup竞赛,持续改进算法,设计出更先进的多机器人协同控制策略.