The RoboCup Soccer Simulator documentation
Soccer Server 足球服务器(中):模型
Sensor Model 感官模型
RoboCup 的智能体具有三个不同的传感器(和一个特殊传感器)。
- 听觉传感器检测裁判、教练和其他球员发送的信息。
- 视觉传感器检测有关场地的视觉信息,例如到玩家当前视野中物体的距离和方向。视觉传感器还可以作为接近传感器,通过“看到”靠近但在玩家身后的物体。
- 身体传感器检测球员当前的“身体”状态,如耐力、速度和颈部角度。传感器一起为agent提供了很好的环境映象。
Aural Sensor Model 听觉传感器模型
当客户端或教练发送say command时,会发送听觉传感器的消息。来自裁判的呼叫也作为听觉信息被接收。所有消息都会立即收到。
Format 格式
(hear Time Sender ‘’Message’’)
- Time:当前比赛时间
- Sender 如果发出声音(信息)的人是另一个球员就写的是相对方向,否则是:
self
: 自己发出的声音.referee
: 裁判发出的声音.online_coach_left
oronline_coach_right
: 两个阵营的教练发出声音.
- Message:信息。最大长度为
server::say_msg_size
bytes. 可能的来自裁判的信息详见 Section Play Modes and referee messages.
Parameters 参数
Parameter in server.conf | 名词解释 | Value |
---|---|---|
audio_cut_dist | 信息发送距离 | 50.0 |
hear_max | 听觉容量最大值 | 1 |
hear_inc | 听觉容量增长 | 1 |
hear_decay | 听觉容量损失 | 1 |
Capacity of the Aural Sensor 听觉传感器的容量
只有当玩家的听觉容量至少为 server::hear_decay
时,玩家才能听到消息,因为当听到消息时,玩家的听觉容量会减少该数量。每个周期,听觉容量都会增加 server::hear_inc
。最大听觉容量是 server::hear_max
。
为了避免一个团队通过使频道过载而使其他团队的通信变得无用,球员对每个团队都有单独的听觉传感器。
使用当前的 server.conf 文件,这意味着玩家每两个模拟周期最多可以听到来自每个团队的一条消息。如果同时到达的消息多于玩家可以听到的消息,则实际听到的消息是随机选择的。(当前实现根据到达的顺序选择消息。)此规则不包括来自裁判的消息,也不包括来自自己的消息。换句话说,一个玩家可以在同一时间戳内说出一个消息并听到另一个玩家的消息。
Range of Communication 通讯范围
球员所说的消息仅从该球员传输到 server::audio_cut_dist
(单位:米)以内的玩家。
所有球员都可以听到来自裁判的信息。
Vision Sensor Model 视觉传感器模型
视觉传感器汇报球员当前看到的对象。信息会在每个 server::sense_step
自动发送到球员,当前默认设置为 $150$毫秒。
Format 格式
(see ObjName Distance Direction DistChng DirChng BodyDir HeadDir)
设目标对象的绝对坐标为$(p{xt},p{yt})$,基准对象(即感官所在对象)的绝对坐标为$(p{xo},p{yo})$, 目标对象的绝对速度为$(v{xt},v{yt})$,基准对象的绝对速度为$(v{xo},v{yo})$,$\alpha_0$是球员面对的绝对方向,则:
$$ p{rx}=\Delta p{x}=p{xt}-p{xo} \ p{ry}=\Delta p{y}=p{yt}-p{yo} \ v{rx}=\Delta v{x}=v{xt}-v{xo} \ v{ry}=\Delta v{y}=v{yt}-v{yo} \ distance=\sqrt{p^2{rx}+p^2{ry}}\ -\alpha0 \ direction=\arctan\frac{p{ry}}{p{rx}} \ DistChng=\frac{p{rx}v{rx}}{distance}+\frac{p{ry}v{ry}}{distance} \ DirChng=\frac{180}{\pi}\cdot \frac{p{ry}v{rx}+p{rx}v_{ry}}{distance^2} \ BodyDir=PlayerBodyDir-AgentBodyDir-AgentHeadDir \ HeadDir=PlayerHeadDir-AgentBodyDir-AgentHeadDir
$$ BodyDir 和 HeadDir 仅在被观察对象是玩家时才包括在内,并且是被观察玩家的身体和头部方向相对于观察者的身体和头部方向。因此,如果两个玩家的身体转向相同的方向,那么 BodyDir 将为 0。HeadDir 也是如此。
除了可移动物体,视觉传感器还能看到一些标志性位置,称为flag,具体至本链接查看,大体在足球场上分布如下:
如果协议版本>13,当一个球员的球队可见时,他们的抢断和踢球状态也通过 t 和 k 可见。f 球员正在铲球,t 存在。如果他们在踢,k 会出现。如果观察到的球员正在铲球,则踢球标志总是被铲球标志覆盖。踢球状态在踢球后紧随的周期可见。
Range of View 视力范围
玩家的可见区域取决于几个因素。首先,我们有服务器参数 server::sense_step
和 server::visible_angle
,它们决定了视觉信息之间的基本时间步长和玩家正常视锥的度数。当前默认值为 150 毫秒和 90 度。
玩家还可以通过改变ViewWidth
和 ViewQuality
来影响信息的频率和质量。
计算观察频率和观察角度的公式如下:
$$ view_freq = \frac{sense_step \times view_quality_factor}{view_width_factor} \ view_angle= visible_angle \times view_width_factor
$$
where view_quality_factor
is 1 if ViewQuality is high
and 0.5 if ViewQuality is low
;
where view_width_factor
is 0.5 if ViewWidth is narrow
, 1 if ViewWidth is normal
, and 2 if ViewWidth is wide
.
如果对象在玩家的 server::visible_distance
米内,球员也可以“看到”该对象。如果对象在此距离内但不在视锥内,则玩家只能知道对象的类型(球、球员、球门或旗帜),但不能知道对象的确切名称。
此外,在这种情况下,使用大写的名称,即“B”、“P”、“G”和“F”。
Parameters 参数
Parameter in server.conf |
Value |
---|---|
server::sense_step | 150 |
server::visible_angle | 90.0 |
server::visible_distance | 3.0 |
unum_far_length † | 20.0 |
unum_too_far_length † | 40.0 |
team_far_length † | 40.0 |
team_too_far_length † | 60.0 |
server::quantize_step | 0.1 |
server::quantize_step_l | 0.01 |
† : Not in server.conf
, but compiled into the server.
Visual Sensor Noise Model 视觉传感器噪声模型
为了在视觉传感器数据中引入噪声,对从服务器发送的值进行量化。例如,物体的距离值,在视线中的物体是球或球员的情况下,按如下方式量子化:
设$d$为实际距离,$d'$为量子化的距离,$Quantize(V,Q)=ceiling(\frac VQ)\cdot Q$
$$ d'=Quantize(e^{Quantize(\log(d),quantize_step)},0.1)
$$ 这意味着玩家无法知道很远物体的确切位置。
在视线中的物体是flag/line的情况下,按如下方式量子化:
$$ d'=Quantize(e^{Quantize(\log(d),quantize_step_l)},0.1)
$$
Body Sensor Model 身体传感器模型
身体传感器报告玩家当前的“身体”状态。他的信息会在每个 server::sense_body_step
自动发送给玩家,目前为 $100$ 毫秒。
Format 格式
(sense_body Time (view_mode ViewQuality ViewWidth) (stamina Stamina Effort Capacity) (speed AmountOfSpeed DirectionOfSpeed) (head_angle HeadAngle) (kick KickCount) (dash DashCount) (turn TurnCount) (say SayCount) (turn_neck TurnNeckCount) (catch CatchCount) (move MoveCount) (change_view ChangeViewCount) (arm (movable MovableCycles) (expires ExpireCycles) (count PointtoCount)) (focus (target {none|{l|r} Unum}) (count AttentiontoCount)) (tackle (expires ExpireCycles) (count TackleCount)) (collision {none|[(ball)] [(player)] [(post)]}) (foul (charged FoulCycles) (card {red|yellow|none})))
- ViewQuality 取值为
high
和low
二选一。 - ViewWidth 取值为
narrow
,normal
, 和wide
三选一。 - AmountOfSpeed 是玩家速度的近似值。
- DirectionOfSpeed 是玩家速度方向的近似值。
- HeadDirection 是玩家头部的相对方向。
- _Count 变量是服务器执行的该类型命令的总数。例如 DashCount = 134 表示玩家到目前为止已经执行了 134 次 dash 命令。
- MovableCycles
- ExpireCycles
- FoulCycles