basicplayer_8c-source.html
来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 526 行 · 第 1/5 页
HTML
526 行
00179 <font class="comment">// do this by making angle in directon body and back of body and check</font>00180 <font class="comment">// whether estimated ball prediction lies between these two angles</font>00181 <font class="comment">// only change sign when not searched in previous cycles, otherwise could</font>00182 <font class="comment">// turn left, right, left, right and never find ball</font>00183 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBody = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>();00184 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angMax = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angBody + 180 );00185 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBall = (<a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a47">getBallPos</a>()-00186 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a43">getAgentGlobalPosition</a>()).getDirection();00187 00188 <font class="keywordflow">if</font>( abs( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a4">getCurrentTime</a>() - timeLastSearch ) > 3 )00189 iSign = <a class="code" href="Geometry_8h.html#a12">isAngInInterval</a>( angBall, angBody, angMax ) ? 1: -1;00190 timeLastSearch = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a4">getCurrentTime</a>();00191 00192 <font class="keywordflow">if</font>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a4">getCurrentTime</a>() != <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a10">getTimeLastSeeMessage</a>() )00193 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a182">CMD_TURN</a>, iSign * ang );00194 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a182">CMD_TURN</a>, iSign * ang );00195 }00196 00197 <a name="l00210"></a><a class="code" href="classBasicPlayer.html#b5">00210</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b5">BasicPlayer::dashToPoint</a>( <a class="code" href="classVecPosition.html">VecPosition</a> pos )00211 {00212 <font class="keywordtype">double</font> dDashPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a151">getPowerForDash</a>(00213 pos - <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a43">getAgentGlobalPosition</a>(),00214 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>(),00215 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a41">getAgentGlobalVelocity</a>(),00216 <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a40">getAgentEffort</a>() );00217 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>, dDashPower );00218 00219 }00220 <a name="l00233"></a><a class="code" href="classBasicPlayer.html#b6">00233</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b6">BasicPlayer::freezeBall</a>( )00234 {00235 <font class="comment">// determine power needed to kick the ball to compensate for current speed</font>00236 <font class="comment">// get opposite direction (current direction + 180) relative to body</font>00237 <font class="comment">// and make the kick command.</font>00238 00239 <font class="keywordtype">double</font> dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a144">getKickPowerForSpeed</a>( <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a48">getBallSpeed</a>() );00240 <font class="keywordflow">if</font>( dPower > <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>() )00241 {00242 Log.log( 552, <font class="stringliteral">"%d: freeze ball has to much power"</font>, <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a5">getCurrentCycle</a>() );00243 dPower = (double)<a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>();00244 }00245 <font class="keywordtype">double</font> dAngle = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a49">getBallDirection</a>() + 180 - <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>();00246 dAngle = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( dAngle );00247 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a186">CMD_KICK</a>, dPower, dAngle );00248 }00249 <a name="l00269"></a><a class="code" href="classBasicPlayer.html#b7">00269</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b7">BasicPlayer::kickBallCloseToBody</a>( <a class="code" href="Geometry_8h.html#a2">AngDeg</a> ang )00270 {00271 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBody = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>();00272 <a class="code" href="classVecPosition.html">VecPosition</a> posAgent = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a108">predictAgentPos</a>( 1, 0 );00273 <font class="keywordtype">double</font> dDist = <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a6">getPlayerSize</a>() +00274 <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a58">getBallSize</a>() +00275 <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a76">getKickableMargin</a>()/6.0;00276 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angGlobal = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angBody + ang );00277 <a class="code" href="classVecPosition.html">VecPosition</a> posDesBall = posAgent + <a class="code" href="classVecPosition.html">VecPosition</a>( dDist, angGlobal, POLAR );00278 <a class="code" href="classVecPosition.html">VecPosition</a> vecDesired = posDesBall - <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a47">getBallPos</a>();00279 <a class="code" href="classVecPosition.html">VecPosition</a> vecShoot = vecDesired - <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a53">getGlobalVelocity</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> );00280 <font class="keywordtype">double</font> dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a144">getKickPowerForSpeed</a>( vecShoot.<a class="code" href="classVecPosition.html#a32">getMagnitude</a>() );00281 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angActual = vecShoot.<a class="code" href="classVecPosition.html#a33">getDirection</a>() - angBody;00282 angActual = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angActual );00283 00284 <font class="keywordflow">if</font>( dPower > <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>() )00285 {00286 Log.log( 500, <font class="stringliteral">"kickBallCloseToBody: cannot compensate for ball speed, freeze"</font>);00287 Log.log( 101, <font class="stringliteral">"kickBallCloseToBody: cannot compensate for ball speed, freeze"</font>); 00288 <font class="keywordflow">return</font> <a class="code" href="classBasicPlayer.html#b6">freezeBall</a>();00289 }00290 <font class="keywordflow">else</font>00291 Log.log( 101, <font class="stringliteral">"(kick %f %f), vecDesired (%f,%f)"</font>, dPower, angActual,00292 vecDesired.<a class="code" href="classVecPosition.html#a26">getX</a>(), vecDesired.<a class="code" href="classVecPosition.html#a28">getY</a>() );00293 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a186">CMD_KICK</a>, dPower, angActual );00294 }00295 <a name="l00314"></a><a class="code" href="classBasicPlayer.html#b8">00314</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b8">BasicPlayer::accelerateBallToVelocity</a>( <a class="code" href="classVecPosition.html">VecPosition</a> velDes )00315 {00316 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> angBody = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>();00317 <a class="code" href="classVecPosition.html">VecPosition</a> velBall = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a53">getGlobalVelocity</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> );00318 <a class="code" href="classVecPosition.html">VecPosition</a> accDes = velDes - velBall;00319 <font class="keywordtype">double</font> dPower;00320 <font class="keywordtype">double</font> angActual;00321 00322 <font class="comment">// if acceleration can be reached, create shooting vector</font>00323 <font class="keywordflow">if</font>( accDes.<a class="code" href="classVecPosition.html#a32">getMagnitude</a>() < <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a68">getBallAccelMax</a>() )00324 {00325 dPower = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a144">getKickPowerForSpeed</a> ( accDes.<a class="code" href="classVecPosition.html#a32">getMagnitude</a>() );00326 angActual = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( accDes.<a class="code" href="classVecPosition.html#a33">getDirection</a>() - angBody );00327 <font class="keywordflow">if</font>( dPower <= <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>() )00328 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a186">CMD_KICK</a>, dPower, angActual );00329 }00330 00331 <font class="comment">// else determine vector that is in direction 'velDes' (magnitude is lower)</font>00332 dPower = <a class="code" href="classBasicPlayer.html#n2">SS</a>-><a class="code" href="classServerSettings.html#a94">getMaxPower</a>();00333 <font class="keywordtype">double</font> dSpeed = <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a143">getActualKickPowerRate</a>() * dPower;00334 <font class="keywordtype">double</font> tmp = velBall.<a class="code" href="classVecPosition.html#a47">rotate</a>(-velDes.<a class="code" href="classVecPosition.html#a33">getDirection</a>()).<a class="code" href="classVecPosition.html#a28">getY</a>();00335 angActual = velDes.<a class="code" href="classVecPosition.html#a33">getDirection</a>() - <a class="code" href="Geometry_8h.html#a11">asinDeg</a>( tmp / dSpeed );00336 angActual = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( angActual - angBody );00337 00338 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a186">CMD_KICK</a>, dPower, angActual );00339 }00340 <a name="l00349"></a><a class="code" href="classBasicPlayer.html#b9">00349</a> <a class="code" href="classSoccerCommand.html">SoccerCommand</a> <a class="code" href="classBasicPlayer.html#b9">BasicPlayer::catchBall</a>()00350 {00351 <font class="comment">// true means returned angle is relative to body instead of neck</font>00352 <font class="keywordflow">return</font> <a class="code" href="classSoccerCommand.html">SoccerCommand</a>( <a class="code" href="SoccerTypes_8h.html#a247a185">CMD_CATCH</a>, <a class="code" href="classBasicPlayer.html#n1">WM</a>-><a class="code" href="classWorldModel.html#a56">getRelativeAngle</a>( <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a>, <font class="keyword">true</font> ));00353 }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?