第2章 server manual.docx
《第2章 server manual.docx》由会员分享,可在线阅读,更多相关《第2章 server manual.docx(26页珍藏版)》请在冰豆网上搜索。
第2章servermanual
第二章SoccerServer
机器人足球世界杯比赛(Robocup)仿真组比赛是在一个标准的计算机环境内进行的。
比赛规则基本上与国际足球联合会的比赛规则一致,对于某些特殊的部分,在手册第二章会有详细论述。
比赛的方式是由Robocup委员会提供标准的Soccerserver系统,各参赛队编写各自的CLIENT程序,模拟实际足球队员参加比赛。
Soccerserver是一个允许竞赛者使用各种程序语言进行仿真足球比赛的系统。
比赛以Client/Server方式进行。
Server,即Soccerserver,提供了一个虚拟场地,并对比赛双方的全部队员和足球的移动进行仿真。
Client,相当于球员的大脑,指挥球员的运动。
Server和Client之间的通信是通过UDP/IP协议进行的。
所以,竞赛者可以使用支持UDP/IP的任何程序系统。
Soccerserver包含两个程序:
Soccerserver和Soccermonitor。
Soccerserver的工作是仿真足球和队员的移动、与Client进行通信、按照一定的规则控制游戏的进程。
Soccermonitor则负责利用Xwindow(或windows95)系统在server中显示虚拟场地。
server可以同时与多个Soccermonitor相连。
因此,我们可以在多个显示器上同时显示比赛的情况。
Client与Server之间都是通过UDP/IP协议进行信息交互的。
通过这种方式,Client发送指令去控制相应的队员,同时从Server端接受队员的传感器传回的信息。
每个Client模块只允许控制一名球员。
故竞赛者必须同时运行与比赛球员数目相等的client。
Client之间的通讯必须通过Soccerserver来进行。
Soccerserver的一个目标就是对多智能体系统进行评价,而智能体之间的通讯效率是一个重要标准。
竞赛者必须在此要求下实现对多个智能体的控制。
2.1比赛过程及规则
2.1.1Server的获取和安装
Soccerserver的源文件可以从如下地址中获得:
目前,在网上可以找到Soccerserver的UNIX和Windows95两个版本,都是源码,分别需要利用GCC和VC++5.0编译成可执行代码。
有关编译过程可参考Soccerserver的Readme文件。
本组委会提供全部有关的文件,包括源代码和编译好的可执行代码。
2.1.2整场比赛的过程
由Soccerserver控制的比赛过程可分为如下步骤:
1两队的全部队员通过init命令与Soccerserver一一连接。
2当全部队员都准备好时,比赛裁判(commissary)用鼠标点取Soccerserver的kick-off按钮,上半场比赛开始。
3上半场比赛为5分钟。
当上半场比赛结束时,Soccerserver暂停比赛。
4中场休息为5分钟。
在此期间,竞赛者可以修改Client程序。
5在下半场比赛开始之前,每个Client需要使用reconnect命令与Soccerserver重新进行连接。
6当全部Client准备就绪时,裁判(commissary)点取kick-off按钮,开始下半场比赛。
7下半场结束时,server自动停止比赛。
8如果比赛结果为平局,加时赛开始。
加时赛采用金球法,即任一方球队进球,比赛立即结束,进球方获胜。
2.1.3Soccerserver控制的比赛规则:
1进球(Goal)
当进球时,裁判(referee)通过向全部Client发送广播式消息宣布进球。
同时它登记比分、暂停比赛5秒钟、将球移回中点、并且将比赛模式切换为开球模式(kick-off)。
当裁判暂停比赛时,球员必须回到自己半场,可以使用move命令。
如果某个球员仍在对方半场,裁判(referee)会自动将此球员移回到自己半场,放置在随机位置。
2开球(kick-off)
开球时全部球员必须在自己半场。
如果某个球员仍在对方半场,裁判(referee)会将此球员移回到自己半场,放置在随机位置。
3出界(OutofField)
当球出界时,裁判(referee)将球移到一个合适位置(边线、角球区或罚球区),并将比赛模式相应的切换为:
边界球(kick_in)、角球(corner_kick)或球门球(goal_kick)。
发角球时,裁判(referee)将球放置在角内(1m,1m)处。
4清场(Clearance)
当守门员扑球后,或当前模式为:
开球(kick_off),边线发球(throw_in),角球(corner_kick),球门球(goal_kick),或越位(offside)时,裁判(referee)将防守队员移出以球为圆心,半径为9.15的圆形区域,被移出的队员随机放置在圆形区域的周围。
5比赛模式控制(Play_modeControl)
当比赛模式为开球(kick_off)、边线发球(throw_in)、角球(corner_kick)、球门球(goal_kick)时,在球接收到kick命令开始移动之后,裁判(referee)将模式切换到正常进行模式(play_on)。
6中场休息时间和终场时间(HalftimeandTimeUp)
当上半场和下半场结束时,裁判(referee)自动终止比赛。
每半场缺省的比赛时间为3000个仿真周期,大约5分钟。
如果下半场结束时为平局,会进行加时赛,直到一方进球为止。
2.1.4需要人判断的规则
某些故意犯规动作,如故意阻挡等,很难由裁判(referee)自动判断,因为它与球员的意图有关。
因此,Soccerserver为通过人来判断这些犯规动作提供了一种方式。
下面简单介绍一下此类犯规动作:
1故意包围足球(Surroudingtheball)
2故意用多名队员阻挡球(Blockingthegoalwithtoomanyplayers)
3故意持球(Notputtingtheballintoplay)
4故意阻挡其他队员的移动(Intentionallyblockingthemovementofotherplayers)
5守门员滥用“catch”命令,守门员不允许在罚球区内重复使用kick和catch命令
6不允许向server发送过多命令,每个Client在一个仿真周期内不能发送超过3或4个命令。
过多的命令会使server阻塞。
2.2Soccerserver
主要介绍了SoccerServer的各个组成部分(对象),包括场地以及球场上面的对象以及球员相关的各种模型。
2.2.1球场上的对象
图2.1是用UML实例图表示了robocup仿真组中的对象。
Figure2.1:
UMLdiagramoftheobjectsinthesimulation
2.2.2场地和球员
仿真环境中足球场和其中的全部对象都是二维的。
任何对象都没有高度的概念。
比赛场地的尺寸为field_length
field_width,球门的宽度为goal_width,缺省值为105(m)
68(m)(单位是没有意义的),球门宽度为14.64(m),是实际的两倍。
实验证明,对于正常的宽度是很难进球的。
球员和球都使用圆圈来表示。
动作模型是离散的(在一个仿真周期结束时全部的动作被执行一次)。
每个仿真周期时间的长短是由参数simulator_step决定的。
在每个仿真周期结束前,Soccerserver接收所有client的命令,并执行命令,并利用当前场上对象(球员和球)的位置和速度信息计算出全部对象新的位置和速度信息。
2.2.3对象的运动模型
在仿真周期内,对象的移动按如下公式进行计算:
(
)=(
)+(
):
加速
(
)=(
)+(
):
移动
(
)=
:
衰减速率
(
)=(
):
复位加速度
其中,(
)和(
)分别表示t时刻物体的位置和速度。
Decay是一个参数,分别由ball-decay和player-decay控制。
(
)表示对象在t时刻的加速度,可以通过dash(针对队员)和kick(针对足球)的Power参数计算得到:
(
)=Power
其中
表示对象在t时刻的前进方向。
如果对象为球员,他的方向通过由下式计算:
Moment是turn命令的参数。
对于足球,其方向的计算方法是:
其中
和
表示球和踢球队员当前的方向,而Direction是kick命令中第二个参数。
(
)表示是在t+1时刻的加速度,在现在的Server版本中复位为0。
另外加入以下2种因素:
2.2.3.1碰撞
如果在某个仿真周期结束时,两个对象发生重叠,则server自动将他们向后移动,直到不再重叠为止,然后将各自速度乘以-0.1。
需要说明的是,只要在仿真周期结束时球和某队员不发生重叠,那么球就可以直接穿过该队员。
2.2.3.2风和环境干扰
为了反映出实际比赛中球以及球员运动的不确定性,Soccerserver在球与球员的移动及命令的参数中加入了干扰。
首先考虑移动,干扰是以如下方式加入的:
(
)=(
)+(
)+(
)
为属于
的随机数。
rmax的定义为:
rmax
rand是player-rand和ball-rand的参数。
turn命令中Power参数的干扰加入方式为:
2.2.4球员的感知信息
球员可以从server接受三种不同的感知信息:
听觉、视觉和身体状态信息。
听觉感知检测裁判,教练和其他球员发送的消息。
视觉感知检测场上的可视信息,如球员当前可视范围内的对象的距离和方向。
视觉信息很象一个传感器,可以“见到”在球员身后的附近对象。
身体状态信息检测球员的当前物理状态,如球员自身的体力stamina,速度speed和头颈角度neckangle。
2.4.4.1听觉模型
当某球员或裁判(referee)“说”消息(sayMessage)时,附近的其他球员包括对方球员可以立即听到消息,没有延迟。
他们以(hearTimeSender"Message")的形式听到消息。
其中:
Time:
前的仿真周期。
Sender:
如果是其他球员发送的消息,那么是发送者的相当方向(Direction),否则就是下面的选项:
●self:
发送者是自己本人。
●referee:
裁判是发送者。
●online_coach_left或者online_coach_ringt:
发送者是在线教练。
Message:
消息内容。
最长可以是say_msg_size个字节。
裁判发送的消息可以是:
before_kick_off、kick_off_l、kick_off_r、kick_in_l、kick_in_r、corner_kick_l、corner_kick_r、goal_kick_l、goal_kick_r、free_kick_l、free_kik_r、offside_l、offside_r、play_on、half_time、time_up、extend、foul_Side_Unum、goal_Side_Point。
注意关于是哪个队员发的消息和他的距离是不知道的。
队员只有有限的通讯能力,只能听到一定距离之内的声音,此距离由soccerserver参数audio_cut_off_dist决定。
同时队员在hear_decay个循环周期内只能听到hear_inc条消息。
一般情况下,在2个循环周期内,当有多个队员说某消息时,一名队员只能接收一条,而失去了其他的消息。
裁判(referee)所发的消息具有高的优先级,可以被全部队员接收到。
2.4.4.2视觉模型
从server得到的听觉信息按如下格式:
(seeTimeObjInfoObjInfo…)
Time:
当前时间。
ObjInfo表示了可视对象的信息。
其格式为:
(ObjNameDistanceDirectionDistChngDirChngBodyDirHeadDir)
ObjName=(playerTeamnameUnum)
|(golaSide)
|(ball)
|(flagc)
|(flag[l|c|r][t|b])
|(flagp[l|r][t|c|b])
|(flag[t|b][l|r][10|20|30|40|50])
|(flag[l|r][t|b][10|20|30])
|(flag[l|r|t|b]0)
|(line[l|r|t|b])
Distance,Direction表示目标的相对距离和相对方向。
DistChng和DirChng分别表示目标距离和方向的相对变化,DistChng和DirChng不是精确值,只是一个粗略值。
字母:
“l、r、c、t、b”分别表示了左、右、中心、上、下。
“p”表示罚球区。
详见图2.2。
图2.2球场标志
Distance,Direction,DistChng和DirChng按如下方式计算出来的:
Distance=
Direction=
/Distance
/Distance
Distance
其中
是目标的绝对位置坐标,
是接收视觉信息的队员自己本身的绝对坐标,
是目标的绝对速度,
队员自己的绝对速度。
是队员所面向的绝对方向。
另外
和
表示目标的相对位置和相对速度。
表示平行于相对位置向量的单位向量。
如果被观察者是球员的话,才会有BodyDir和HeadDir,分别是被观察球员相对观察者的身体和头部的相对角度。
如果两个球员的身体都是相同的角度,那么BodyDir就等于零。
HeadDir也一样。
视野范围
球员的可视部分依赖于几个因素。
首先是server上的参数sense_step和visible_angle,决定了视觉信息的时间间隔,以及球员正常视角时的角度。
现在使用的是150ms和90°。
球员通过改变ViewWidth和ViewQuality也可以改变视觉信息的频率和质量。
view_frequency和view_angle由以下公式2.1和2.2计算得出:
(2.1)
1当ViewQuality=high
0.5当ViewQuality=low
2当ViewWidth=narrow
1当ViewWidth=normal
0.5当ViewWidth=wide
也就是说,视觉质量要求越高,视角要求越小,则发送时间间隔越大。
(2.2)
2当ViewWidth=wide
1当ViewWidth=normal
0.5当ViewWidth=narrow
球员能够“看到”在他领域内的对象(以visible_distance为半径的圆周)。
如果某一对象在此范围内,但是不在球员的视野范围内,那么球员只知道对象的类型(足球,球员,球门或者是标记),而不知道对象的确切名字。
就是说使用“B”,“P”,“G”和“F”来作为对象的名字,而不是使用“b”,“p”,“g”和“f”。
图2.3球员的视野
图4.3表示了view_angle的意思。
图中的观察球员由两个半圆组成,空心的半圆表示球员的前部。
全黑的圆周代表场上的对象。
只有在view_angle/2的角度范围内,而且在visible_distance的距离范围内的对象才能被看到。
因此,对象b和g是不可见的,其他的对象都是可见的。
对象f在观察者的正前方,它的角度被认为是0°。
对象e会被认为是-40°,而对象d则会被认为是大约20°。
请参考图2.3的标志,球员所获得的视觉信息和距离的相关程度很大。
对于近距离球员,它既可以看到它所属的球队同时也可以看到他的球员号码。
然而,随着距离的增加,首先消失的是球员的号码。
然后距离的增加还会导致球员的队别也分不清楚了。
在服务器端假定这些距离是:
这里假定dist是球员和自己的距离,那么:
◆如果
那么球员号码和球队名称都可见。
◆如果
,那么队名是可见的,但是队员号码有一定的概率看不到。
这个概率根据dist是线性的从1到0减少的。
◆如果
,那么球员号码是不可见的。
◆如果
,那么队名也存在一定的概率不可见,概率是随着dist的减少从1到0线性的递减的。
◆如果
,那么队名是不可见的。
视觉感知噪声模型
为了在视觉感知数据中引入噪声,server发送的信息被进行了量化处理。
如:
无论远处的目标是球还是球员,目标的距离值按如下方式进行量化:
其中
分别表示精确距离和相应的量化距离。
且:
ceiling(V/Q)*Q
这表示队员是不能知道远处物体的精确位置的。
例如:
当距离为100.0时,最大噪声可达到10.0,但当距离在10.0之内时,噪声小于1.0。
对于远处目标是旗或线的情况,距离值按如下公式量化:
其中,
=0.1,
=0.01
2.4.4.3自身感知模型
自身感知返回球员当前的物理状态。
每隔sense_body_step(目前使用100ms),就会自动的向球员发送自身感知信息。
自身感知消息的格式如下:
(sense_bodyTime
(view_modeViewQualityViewWidth)
(staminaStaminaEffort)
(speedAmountOfSpeedDirectionOfSpeed)
(head_angleHeadDirection)
(kickKickCount)
(dashDashCount)
(turnTurnCount)
(saySayCount)
(turn_neckTurnNeckCount)
(catchCatchCount)
(moveMoveCount)
(change_viewChangeViewCount))
ViewQuality的取值是high或low。
ViewWidth取值是narrow,normal,wide。
AmountOfSpeed是球员速度的近似值。
DirectionOfSpeed是球员速度的近似方向。
HeadDirection是球员头部的相对方向。
变量Count是由server执行的对应命令的总量。
如:
DashCount=134说明球员其时已经执行
了134次dash命令
2.2.5球员的动作模型
下面介绍一些球员可以发送给sever的各种动作,并且指出了那些动作是可以同时发送给Server,那些是不能同时发送的。
表2.1中列出了全部表示动作的命令。
(catchDirection)
向Direction方向扑球。
当球落入宽为goalie_catchable_w,长为goalie_catchable_l的矩形内时,并且方向为Direction,守门员可以扑到球。
(turnMoment)
控制球员转身的角度。
Moment应在-180~180之间。
球员身体可以转过的角度随着球员的快速运动而减少。
(Moment的范围会改变。
)
(turn_neckAngel)
控制球员转脖子。
其中Angel转过的角度。
Angel
[minneckmoment,maxneckmomnet]
(moveXY)
移动球员到(XY)。
X
[-52.5,52.5],Y
[-34,34]
(dashPower)
在球员所面对的方向上增加球员的速度。
Power应在-100~100之间(范围可变)。
(kickPowerDirection)
以Power的力量向Direction方向踢球。
条件是球要在kickable_area范围内。
Power
[-100,100],Direction
[-180,180]。
(sayMessage)
向所有球员广播Message。
Message会迅速被其他球员(包括对方球员)以听的方式接收。
Message是串长小于10个字节的字符串。
可以包含字母,阿拉伯数字和符号“+-*/_.()”。
球员的听力受距离限制。
(tacklepower)
在可tackle的范围内,可以使用power
[-100,100]进行tackle
(score)
询问在Time时刻我们和对手的得分。
(change_viewANGLE_WIDTHQUALITY)
改变球员的视角宽度和视觉能力。
ANGLE_WIDTH可以是wide、normal、narrow。
QUALITY为high或low。
(sense_body)
{sense_bodyTIME
(view_modeQUALITYWIDTH)
(staminaSTAMINAEFFORT)
(speedAMOUNT_OF_SPEED)
(kickKICK_COUNT)
(dashDASH_COUNT)
(turnTURN_COUNT)
(saySAY_COUNT)
}
表2.1表示动作的命令
●catch
球员抓球动作。
守门员是唯一能执行catch命令的球员。
守门员可以从任何方向抓到足球,只要足球在可抓范围内,守门员在罚球区内,且比赛模式是“play_on”。
如果守门员以δ角度去catch足球,那么可抓范围是长宽分别是catchable_area_l和catchable_area_w的矩形区域。
如果足球在这个矩形区域内,能够被抓到的可能性是catch_probability,在外面则不能被抓到。
●turn
球员的转身动作,其参数moment属于minmoment和maxmoment(缺省为
到
)组成的区间。
在球员运动的过程中,由于惯性的存在,转身更为困难。
一般地,球员的实际角度由下式计算:
inertia_moment是一个参数,缺省值为5.0。
由上式可知,当一个球员以最大速度前进时,他最大可以转过的角度是
。
●turn_neck
球员转脖子动作。
使用turn_neck命令,从某种角度上,是在独立于球员身体的转动头颈。
球员的头部角度是他的视野角度。
命令turn改变球员的身体角度,而命令turn_neck则改变了球员相对他的身体的颈部角度。
球员颈部的相对角度介于minmoment和maxmoment之间(在文件serever.conf中定义)。
切记头颈角度是相对于球员身体的相对角度,如果球员执行了turn命令,而没有执行turn_neck命令,球员的视野角度也是会改变的。
●move
命令move可以把球员移动到场上的任何一个地方。
只有在设置整个球队时,move命令有效,在正常比赛期间是没有效果的。
在上下半场开始前(比赛模式是‘before_kick_off’)以及进球后(比赛模式是‘goal_r_n’和‘goal_l_n’)才可以使用move命令。
在这种情况下,只要比赛模式没有改变,球员可以被移动到自己半场的任何地点(就是说x<0),而且可以被移动任意多次。
如果球员还在对方半场的话,那么将会被server移动到己方半场的随机位置。
●dash
dash