basicplayer_8c-source.html

来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 526 行 · 第 1/5 页

HTML
526
字号
00587   <font class="comment">// first predict the angle between the agent and the ball after two cycles,</font>00588   <font class="comment">// is this larger than the angle when to turn, turn to position of the ball</font>00589   <font class="comment">// after two cycles. Then perform a dash based on the position of the ball</font>00590   <font class="comment">// after two cycles and the position of the agent after the turn. If after</font>00591   <font class="comment">// these two command the agent is in the kickable distance, return turn</font>00592   <font class="comment">// command.</font>00593   posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00594   posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 2, 0 );00595   ang     = (posBall - posPred).getDirection();00596   ang     = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( ang - angBody );00597   <font class="keywordflow">if</font> (fabs( ang ) &gt; <a class="code" href="classBasicPlayer.html#n3">PS</a>-&gt;<a class="code" href="classPlayerSettings.html#a9">getPlayerWhenToTurnAngle</a>() ) <font class="comment">// if we want to turn</font>00598   {00599     soc = <a class="code" href="classBasicPlayer.html#b1">turnBodyToPoint</a>( posBall, 2 );             <font class="comment">// perform turn</font>00600     <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&amp;posPred,&amp;velMe,&amp;angBody,&amp;ang,&amp;sta );00601     dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00602     <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &amp;posPred, &amp;velMe, &amp;sta, angBody);00603     <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) &lt; <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00604       <font class="keywordflow">return</font> soc;00605   }00606 00607   <font class="comment">// try two dashes</font>00608   <font class="comment">// first predict the position in the next cycle when dash with full power</font>00609   <font class="comment">// is performed. Then calculate the dash power to reach the point where the</font>00610   <font class="comment">// ball will be in two cycles and predict the global position of the agent</font>00611   <font class="comment">// after a dash with this power. If the position is in the kickable distance</font>00612   <font class="comment">// return a dash with full power.</font>00613   soc = <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a94">getMaxPower</a>() );00614   <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&amp;posPred,&amp;velMe,&amp;angBody,&amp;ang,&amp;sta );00615   dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00616   <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &amp;posPred, &amp;velMe, &amp;sta, angBody );00617   <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) &lt; <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00618     <font class="keywordflow">return</font> soc;00619 00620   <font class="comment">// try three dashes</font>00621   <font class="comment">// same as with two dashes, but now try two maximum dashes and</font>00622   posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 3 );00623   soc = <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a94">getMaxPower</a>() );00624   <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&amp;posPred,&amp;velMe,&amp;angBody,&amp;ang,&amp;sta );00625   <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a102">predictStateAfterCommand</a>( soc, &amp;posPred, &amp;velMe, &amp;angBody, &amp;ang,&amp;sta );00626   dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00627   <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &amp;posPred, &amp;velMe, &amp;sta, angBody );00628   <font class="keywordflow">if</font> (posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) &lt; <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a210">getMaximalKickDist</a>())00629     <font class="keywordflow">return</font> soc;00630 00631   <font class="comment">// cannot intercept ball in two cycles</font>00632   <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a180">CMD_ILLEGAL</a> );00633 }00634 <a name="l00671"></a><a class="code" href="classBasicPlayer.html#b16">00671</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b16">BasicPlayer::interceptCloseGoalie</a>( )00672 {00673   <a class="code" href="classSoccerCommand.html">SoccerCommand</a> soc;00674   <font class="keywordtype">double</font>        dPower, dDist;00675   <a class="code" href="Geometry_8h.html#a2">AngDeg</a>        ang;00676   <a class="code" href="classVecPosition.html">VecPosition</a>   posClosestToBall;00677 00678   <font class="comment">// initialize all variables with information from worldmodel.</font>00679   <a class="code" href="classVecPosition.html">VecPosition</a>   posPred   = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 1, 0 );00680   <a class="code" href="classVecPosition.html">VecPosition</a>   posBall   = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 1 );00681   <a class="code" href="classVecPosition.html">VecPosition</a>   velMe     = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a41">getAgentGlobalVelocity</a>( );00682   <a class="code" href="classStamina.html">Stamina</a>       sta       = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a39">getAgentStamina</a>( );00683   <a class="code" href="Geometry_8h.html#a2">AngDeg</a>        angBody   = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>( );00684   <a class="code" href="classLine.html">Line</a>          lineGoalie=<a class="code" href="classLine.html#d1">Line::makeLineFromPositionAndAngle</a>(posPred,angBody);00685 00686   <font class="comment">// when it is theoretical possible</font>00687   <font class="comment">// try one dash and check whether ball is in catchable area</font>00688   dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a66">getBallSpeedMax</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>()+<a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>();00689   <font class="keywordflow">if</font>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a54">getRelativeDistance</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> ) &lt; dDist )00690   {00691     posClosestToBall = lineGoalie.<a class="code" href="classLine.html#a5">getPointOnLineClosestTo</a>( posBall );00692     dPower           = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(00693                           posClosestToBall-posPred,00694                           angBody,00695                           velMe,00696                           sta.<a class="code" href="classStamina.html#a4">getEffort</a>()           );00697     posPred          = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 1, (<font class="keywordtype">int</font>)dPower);00698     <font class="keywordflow">if</font> ( posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>( posBall ) &lt; <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>() )00699       <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, dPower );00700   }00701 00702   <font class="comment">// when it is theoretical possible</font>00703   <font class="comment">// try two dashes and check whether ball is in catchable area</font>00704   <font class="comment">// otherwise try first two  dashes and check whether ball is in catchable</font>00705   <font class="comment">// area, thereafter for turn and dash.</font>00706   dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a66">getBallSpeedMax</a>()*(1.0+<a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a60">getBallDecay</a>())00707            + 2*<a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>()00708            + <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>();00709   <font class="keywordflow">if</font>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a54">getRelativeDistance</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> ) &lt; dDist )00710   {00711     <font class="comment">// try two dashes</font>00712     <font class="comment">// first predict the position in the next cycle when dash with full power</font>00713     <font class="comment">// is performed. Then calculate the dash power to reach the point where the</font>00714     <font class="comment">// ball will be in two cycles and predict the global position of the agent</font>00715     <font class="comment">// after a dash with this power. If the position is in the catchable area</font>00716     <font class="comment">// return a dash with full power.</font>00717     posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00718     soc     = <a class="code" href="classBasicPlayer.html#b5">dashToPoint</a>( posBall );00719     <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>(soc,&amp;posPred,&amp;velMe,&amp;angBody,&amp;ang,&amp;sta );00720     dPower=<a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(posBall-posPred,angBody,velMe,sta.<a class="code" href="classStamina.html#a4">getEffort</a>());00721     <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( dPower, &amp;posPred, &amp;velMe, &amp;sta, angBody );00722     <font class="keywordflow">if</font>( posPred.<a class="code" href="classVecPosition.html#a30">getDistanceTo</a>(posBall) &lt; <a class="code" href="classBasicPlayer.html#n2">SS</a>-&gt;<a class="code" href="classServerSettings.html#a48">getCatchableAreaL</a>() )00723       <font class="keywordflow">return</font> soc;00724 00725     <font class="comment">// try one turn and a dash</font>00726     posBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a107">predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, 2 );00727     posPred = <a class="code" href="classBasicPlayer.html#n1">WM</a>-&gt;<a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 2, 0 );00728     ang     = (posBall - posPred).getDirection();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?