大连市仿真机器人足球竞赛平台手册 V3.0平台操作说明1 启动 Server打开 DUTSoccerServer,单击菜单 Start 2 启动 Client 打开 DUTSoccerClent1,输入 DUTSoccerServer 所在机器的 IP,如果在同一台机器上,输入 127.0.0.1 即可 端口号 Port 用默认的即可 单击按钮 Select you team dll! ,选择球队动态链接库文件(如文件 ../球队/范例球队.dll) 单击带有连接按钮(带有闪电图标的按钮) 用相同的方法启动 DUTSoccerClent2,连接第二个球队3 开始比赛待两个球队都连好后,单击 DUTSoccerServer 上的菜单 KickOff,比赛开始3 结束比赛比赛正常结束,两个客户端会关闭与 Server 的网络连接如若在比赛结束前强行关闭Server,需关闭客户端的提示窗口 (The match was terminate exceptionally),如若继续比赛,重新打开 Server 可执行文件,客户端不用重新打开规则说明 比赛简介:大连市仿真机器人足球竞赛是面向大连市所有本科生、研究生的计算机程序类竞赛。
参赛选手编制 AI 程序分别控制五名球员,在一定大小的场地上进行虚拟足球比赛,以规定时间内的累积得分来判断胜负 升级说明: 为比赛水平不断接近国际比赛标准,在 V3.0 版本中,球员运动规则基本采用国际比赛标准且仍然采用集中控制的形式,保证了比赛易上手的特点,且对参加更高级比赛提供了更好的指导性 场地说明:1. 无论左侧的球队或右侧的球队,场地的左上角均为其坐标原点,坐标系如图所示先连接 Server 的为左队,后连接的为右队编写球队时,要使自己的球队为左队或右队均可正常比赛2. 场地的坐标信息,单位为米const double CDOORWIDTH = 4.0; // 球门一侧长度是 4.0,实际长度是 2 * 4.0const double CPNZWIDTH = 20.0; // 大禁区的宽度const double CHALFPNZWIDTH = 10.0; // 大禁区的半宽度const double CPNZLEN = 8.0; // 大禁区的长度const double CSPNZWIDTH = 12.24; // 小禁区的宽度const double CHALFSPNZWIDTH = 6.12; // 小禁区的半宽度const double CSPNZLEN = 5.2; // 小禁区的长度const double CFLDWIDTH = 34.0; // 场地宽度const double CHALFFLDWIDTH = 17.0; // 一半场地宽度const double CFLDLEN = 52.0; // 场地长度const double CHALFFLDLEN = 26.0; // 一半场地长度const double CDOORY1 = CHALFFLDWIDTH - CDOORWIDTH; // 上门柱const double CDOORY2 = CHALFFLDWIDTH + CDOORWIDTH; // 下门柱 模型1. 运动模型每一个仿真步长内, 每一个物体的运动按如下公式计算: t+1tttttxyxyxyttttt+1tt+1t ttxyxyttv ,v ,a ,ppv, ,dec ,a0 ,加 速移 动减 速, 加 速 度 置 零这里, 和 分别为物体在 时刻的位置和速度。
是一个用txy(p,)txy(v,)tdecay和 指定的衰减参数 是物体的加速度, 它源自(由) 于bal_declar_dectxy(a)dash中的Power 参数( 当物体是球员), 或kick命令(当是球的时候), 遵从下面的公式:(axt, ayt) = Power * power_rate * (cos(θ t), sin(θ t))θ t是物体在timestep t上的方向, 并 power_rate是dash_power_rate 或从kick_power_rate计算. 当为球员的时候, 它就是球员面向的方向. 当为球的时候, 它的方向按下述公式给出:θ tball =θ tkicker + Directionθ tball 和θ tkicker分别是球和踢球者的方向 , Direction是kick命令的第二个参数 .2. 运动噪声模型为了反映真实世界的物体的意外运动, β往运动物体和指令的参数中增加了噪声. 有关运动的噪声在方程4.18中被加入:(ut+1x; ut+1y) = (vtx ; vty ) + (atx; aty) + (˜rrmax; ˜rrmax)这里, ˜rmax是在[-rmax, rmax]上, 具有统一属性的随机数字. rmax 是依据物体速度量的参数, 公式如下:rmax = rand * |(vtx , vty )|这里, rand是由play_rand 和ball_rand给出的参数.噪声也象下面那样被加入一个指令的Power和Moment参数:argument = (1 + ˜rrand) * argument试验平台中关闭了运动噪声,而将平台设置中视觉噪声去掉的话就是一个理想模型3. 碰撞模型如果在一个仿真周期结束的时候, 两个物体重叠, 那么它们被移动回来, 直到不重叠. 那么速度的大小将变为原来的0.1倍,且方向取相反方向。
注意, 这是可能的: 一个球穿过一个球员, 只要球和球员在仿真周期末尾决不重叠发生碰撞后,将被如下显示出:球员间碰撞球员与球碰撞4. 球员跑动模型(Dash model)与体力模型(Stamina model) 跑动模型(Dash model)用在球员向自己所对方向加速的命令, 把加速的力量作为一个参数加速力量的dashdash有效范围在 和 之间每个球员执行 命令都会消耗一定数量的minpoweraxeras体力每场比赛的开始,每个球员的体力被设为 如果球员加速向前奔跑tmin_x(power>0) ,体力将会减少 power如果球员向后加速奔跑(power a矢量初始为零,因为球员不能在一个周期内dash超过一次而且除了 dash也没有别的办法使球员获得加速度) 在仿真周期n向周期n+1过度过程中,加速度矢量 n被应用于:- > a1. n被限制,以player_accel_max为最大值 > a2.当前球员的速度 n加上 n n被限制,以player_speed_max为最大值 > V - > a - > V3.球员新位置 n+1 是由上一周期的位置 n与速度矢量 n的和。
(例如,球员在一- > p - > p - > v个仿真周期内的最大移动距离差为player_speed_max) 4.Player_decay应用在球员速度中: n+ 1 = n *Player_decay加速度 n+1被设- > v - > v - > a为零 体力模型(Stamina model)对于球员的体力有三个重要的变量:体力值(the stamina value) ,体力恢复值(recovery)和体力使用效率(effort) 体力在进行dashing动作时不断减少,不过每个周期中体力也会不断的慢慢增加Recovery代表了每个周期内球员可以恢复多少体力, effort则代表了dashing 的有效率参数如下:const double CSTAMINAMAX = 4000.0; // 球员最大体力值const double CSTAMINAINCMAX = 45.0; // 球员最大体力恢复值const double CDASHPOWERRATE = 0.006; // 球员加速系数const double CEFFORTMIN = 0.6; // 球员最小体力效用值const double CEFFORTMAX = 1.0; // 球员最大体力效用值const double CEFFORTDECTHR = 0.3; // 球员体力效用系数const double CEFFORTDEC = 0.005; // 球员体力效用系数const double CEFFORTINCTHR = 0.6; // 球员体力效用系数const double CEFFORTINC = 0.01; // 球员体力效用系数const double CRECOVERDECTHR = 0.3; // 球员体力恢复系数const double CRECOVERDEC = 0.002; // 球员体力恢复系数const double CRECOVERMAX = 1.0; // 球员体力恢复系数const double CRECOVERMIN = 0.5; // 球员体力恢复系数体力更新过程:其C++算法实现如下:void Stamina::calStaminaAfterDash( double dPower){// double negative value when dashed backwardsm_dStamina -= ( dPower > 0.0 ) ? dPower : -2 * dPower ;if( m_dStamina CRECOVERMIN)m_dRecovery -= CRECOVERDEC;// stamina below effort decrease threshold, lower effortif( m_dStamina CEFFORTMIN )m_dEffort -= CEFFORTDEC;// stamina higher than effort incr threshold, raise effort and check maximumif( m_dStamina >= CEFFORTINCTHR * CSTAMINAMAX &&m_dEffort 1.0 )m_dEffort = 1.0;}// increase stamina with (new) recovery value and check for maximumm_dStamina += m_dRecovery*CSTAMINAINCMAX;if ( m_dStamina > CSTAMINAMAX )m_dStamina = CSTAMINAMAX;}5. 踢球模型(Kick model)踢球命令含有两个参数:踢球球员想要踢球的力量(在 minpower 和 maxpower 之间) ,踢球的角度。
角是以度的形式给出,并且在 minmoment 和 maxmoment 之间一旦踢球命令到达 server,如果球在踢球球员的可踢范围内,那么踢球命令将被执行假如踢球球员和球之间的距离在 0 和 kick_able_margen 之间,对于球员球是可以踢到的为了计算区域内的距离,我们必须知道球员和球之间的距离,我们计算出人和球外表之间的最近距离那么,它们之间的距离就是两个物体中心距离减去球的半径再减去球员的半径对于踢球首先要计算的就是踢球的有效力度(ep):ep = kick power×kick_power_rate;如果球不是在球员的正前方,踢球的有效力度将会减少一定的数量,而这个减少的数量取决。