worldmodelpredict_8c-source.html
来自「仿真人工智能是指用人工的方法和技术」· HTML 代码 · 共 310 行 · 第 1/2 页
HTML
310 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>WorldModelPredict.C Source File</title><link href="doxygen.css" rel="stylesheet" type="text/css"></head><body bgcolor="#ffffff"><!-- Generated by Doxygen 1.2.12 --><center><a class="qindex" href="index.html">Main Page</a> <a class="qindex" href="hierarchy.html">Class Hierarchy</a> <a class="qindex" href="annotated.html">Compound List</a> <a class="qindex" href="files.html">File List</a> <a class="qindex" href="functions.html">Compound Members</a> <a class="qindex" href="globals.html">File Members</a> </center><hr><h1>WorldModelPredict.C</h1><a href="WorldModelPredict_8C.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <font class="comment">/*</font>00002 <font class="comment">Copyright (c) 2000,2001, Jelle Kok, University of Amsterdam</font>00003 <font class="comment">All rights reserved.</font>00004 <font class="comment"></font>00005 <font class="comment">Redistribution and use in source and binary forms, with or without </font>00006 <font class="comment">modification, are permitted provided that the following conditions are met:</font>00007 <font class="comment"></font>00008 <font class="comment">1. Redistributions of source code must retain the above copyright notice, this </font>00009 <font class="comment">list of conditions and the following disclaimer. </font>00010 <font class="comment"></font>00011 <font class="comment">2. Redistributions in binary form must reproduce the above copyright notice, </font>00012 <font class="comment">this list of conditions and the following disclaimer in the documentation </font>00013 <font class="comment">and/or other materials provided with the distribution. </font>00014 <font class="comment"></font>00015 <font class="comment">3. Neither the name of the University of Amsterdam nor the names of its </font>00016 <font class="comment">contributors may be used to endorse or promote products derived from this </font>00017 <font class="comment">software without specific prior written permission. </font>00018 <font class="comment"></font>00019 <font class="comment">THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" </font>00020 <font class="comment">AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE </font>00021 <font class="comment">IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE </font>00022 <font class="comment">DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE </font>00023 <font class="comment">FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL </font>00024 <font class="comment">DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR </font>00025 <font class="comment">SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER </font>00026 <font class="comment">CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, </font>00027 <font class="comment">OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE </font>00028 <font class="comment">OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</font>00029 <font class="comment">*/</font>00043 <font class="preprocessor">#include <stdio.h></font>00044 <font class="preprocessor">#include "<a class="code" href="WorldModel_8h.html">WorldModel.h</a>"</font>00045 00046 <font class="comment">/*****************************************************************************/</font>00047 <font class="comment">/************************** PREDICTIONS **************************************/</font>00048 <font class="comment">/*****************************************************************************/</font>00049 <a name="l00062"></a><a class="code" href="classWorldModel.html#a102">00062</a> <font class="keywordtype">bool</font> <a class="code" href="classWorldModel.html#a102">WorldModel::predictStateAfterCommand</a>( <a class="code" href="classSoccerCommand.html">SoccerCommand</a> com,00063 <a class="code" href="classVecPosition.html">VecPosition</a> *pos, <a class="code" href="classVecPosition.html">VecPosition</a> *vel, <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angGlobalBody,00064 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angGlobalNeck, <a class="code" href="classStamina.html">Stamina</a> *sta )00065 {00066 <font class="keywordflow">switch</font>( com.<a class="code" href="classSoccerCommand.html#m1">commandType</a> ) <font class="comment">// based on kind of command, choose action</font>00067 {00068 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a181">CMD_DASH</a>:00069 <font class="keywordflow">if</font>( <a class="code" href="classWorldModel.html#o11">playMode</a> != <a class="code" href="SoccerTypes_8h.html#a242a121">PM_BEFORE_KICK_OFF</a> )00070 <a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( com.<a class="code" href="classSoccerCommand.html#m3">dPower</a>, pos, vel, sta, *angGlobalBody );00071 <font class="keywordflow">break</font>;00072 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a182">CMD_TURN</a>:00073 <a class="code" href="classWorldModel.html#a106">predictStateAfterTurn</a>(com.<a class="code" href="classSoccerCommand.html#m2">dAngle</a>,pos,vel,angGlobalBody,angGlobalNeck,sta);00074 <font class="keywordflow">break</font>;00075 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a183">CMD_TURNNECK</a>: <font class="comment">// note that position and velocity are not updated</font>00076 *angGlobalNeck = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>(*angGlobalNeck + com.<a class="code" href="classSoccerCommand.html#m2">dAngle</a>);00077 <font class="keywordflow">break</font>;00078 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a186">CMD_KICK</a>:00079 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a185">CMD_CATCH</a>:00080 <a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( 0.0, pos, vel, sta, *angGlobalBody );00081 <font class="keywordflow">break</font>;00082 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a187">CMD_MOVE</a>:00083 pos-><a class="code" href="classVecPosition.html#a29">setVecPosition</a>( com.<a class="code" href="classSoccerCommand.html#m6">dX</a>, com.<a class="code" href="classSoccerCommand.html#m7">dY</a> );00084 vel-><a class="code" href="classVecPosition.html#a31">setMagnitude</a>( 0.0 );00085 <font class="keywordflow">break</font>;00086 <font class="keywordflow">case</font> <a class="code" href="SoccerTypes_8h.html#a247a180">CMD_ILLEGAL</a>:00087 <a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( 0.01, pos, vel, sta, *angGlobalBody );00088 <font class="keywordflow">break</font>;00089 <font class="keywordflow">default</font>:00090 <font class="keywordflow">return</font> <font class="keyword">false</font>;00091 <font class="keywordflow">break</font>;00092 }00093 <font class="keywordflow">return</font> <font class="keyword">true</font>;00094 }00095 <a name="l00106"></a><a class="code" href="classWorldModel.html#a103">00106</a> <font class="keywordtype">bool</font> <a class="code" href="classWorldModel.html#a103">WorldModel::predictAgentStateAfterCommand</a>( <a class="code" href="classSoccerCommand.html">SoccerCommand</a> com,00107 <a class="code" href="classVecPosition.html">VecPosition</a> *pos, <a class="code" href="classVecPosition.html">VecPosition</a> *vel, <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angGlobalBody,00108 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angGlobalNeck, <a class="code" href="classStamina.html">Stamina</a> *sta )00109 {00110 *pos = <a class="code" href="classWorldModel.html#a43">getAgentGlobalPosition</a>();00111 *vel = <a class="code" href="classWorldModel.html#a41">getAgentGlobalVelocity</a>();00112 *angGlobalBody = <a class="code" href="classWorldModel.html#a38">getAgentGlobalBodyAngle</a>();00113 *angGlobalNeck = <a class="code" href="classWorldModel.html#a37">getAgentGlobalNeckAngle</a>();00114 *sta = <a class="code" href="classWorldModel.html#a39">getAgentStamina</a>();00115 <a class="code" href="classWorldModel.html#a102">predictStateAfterCommand</a>( com, pos, vel, angGlobalBody, angGlobalNeck, sta );00116 00117 <font class="keywordflow">return</font> <font class="keyword">true</font>;00118 }00119 <a name="l00125"></a><a class="code" href="classWorldModel.html#a104">00125</a> <a class="code" href="classVecPosition.html">VecPosition</a> <a class="code" href="classWorldModel.html#a104">WorldModel::predictAgentPosAfterCommand</a>( <a class="code" href="classSoccerCommand.html">SoccerCommand</a> com )00126 {00127 <a class="code" href="classVecPosition.html">VecPosition</a> p1, p2;00128 <a class="code" href="Geometry_8h.html#a2">AngDeg</a> a1, a2;00129 <a class="code" href="classStamina.html">Stamina</a> sta;00130 <a class="code" href="classWorldModel.html#a103">predictAgentStateAfterCommand</a>( com, &p1, &p2, &a1, &a2, &sta );00131 <font class="keywordflow">return</font> p1;00132 }00133 <a name="l00142"></a><a class="code" href="classWorldModel.html#a105">00142</a> <font class="keywordtype">void</font> <a class="code" href="classWorldModel.html#a105">WorldModel::predictStateAfterDash</a>( <font class="keywordtype">double</font> dActualPower, <a class="code" href="classVecPosition.html">VecPosition</a> *pos,00143 <a class="code" href="classVecPosition.html">VecPosition</a> *vel, <a class="code" href="classStamina.html">Stamina</a> *sta, <font class="keywordtype">double</font> dDirection )00144 {00145 <font class="comment">// get acceleration associated with actualpower</font>00146 <font class="keywordtype">double</font> dEffort = ( sta != NULL ) ? sta-><a class="code" href="classStamina.html#a4">getEffort</a>() : 1.0;00147 <font class="keywordtype">double</font> dAcc = dActualPower * <a class="code" href="classWorldModel.html#o0">SS</a>-><a class="code" href="classServerSettings.html#a80">getDashPowerRate</a>() * dEffort;00148 00149 <font class="comment">// add it to the velocity; negative acceleration in backward direction</font>00150 <font class="keywordflow">if</font>( dAcc > 0 )00151 *vel += <a class="code" href="classVecPosition.html#d0">VecPosition::getVecPositionFromPolar</a>( dAcc, dDirection );00152 <font class="keywordflow">else</font>00153 *vel += <a class="code" href="classVecPosition.html#d0">VecPosition::getVecPositionFromPolar</a>( fabs(dAcc),00154 <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>(dDirection+180));00155 00156 <font class="comment">// check if velocity doesn't exceed maximum speed</font>00157 <font class="keywordflow">if</font>( vel-><a class="code" href="classVecPosition.html#a32">getMagnitude</a>() > <a class="code" href="classWorldModel.html#o0">SS</a>-><a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>() )00158 vel-><a class="code" href="classVecPosition.html#a31">setMagnitude</a>( <a class="code" href="classWorldModel.html#o0">SS</a>-><a class="code" href="classServerSettings.html#a14">getPlayerSpeedMax</a>() );00159 00160 <font class="comment">// add velocity to current global position and decrease velocity</font>00161 *pos += *vel;00162 *vel *= <a class="code" href="classWorldModel.html#o0">SS</a>-><a class="code" href="classServerSettings.html#a8">getPlayerDecay</a>();00163 <font class="keywordflow">if</font>( sta != NULL )00164 <a class="code" href="classWorldModel.html#a111">predictStaminaAfterDash</a>( dActualPower, sta );00165 }00166 <a name="l00178"></a><a class="code" href="classWorldModel.html#a106">00178</a> <font class="keywordtype">void</font> <a class="code" href="classWorldModel.html#a106">WorldModel::predictStateAfterTurn</a>( <a class="code" href="Geometry_8h.html#a2">AngDeg</a> dSendAngle, <a class="code" href="classVecPosition.html">VecPosition</a> *pos,00179 <a class="code" href="classVecPosition.html">VecPosition</a> *vel, <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angBody, <a class="code" href="Geometry_8h.html#a2">AngDeg</a> *angNeck, <a class="code" href="classStamina.html">Stamina</a> *sta )00180 {00181 <font class="comment">// calculate effective angle that is turned and turn body and neck accordingly</font>00182 <font class="keywordtype">double</font> dEffectiveAngle = <a class="code" href="classWorldModel.html#a150">getActualTurnAngle</a>( dSendAngle, vel-><a class="code" href="classVecPosition.html#a32">getMagnitude</a>());00183 *angBody = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( *angBody + dEffectiveAngle );00184 *angNeck = <a class="code" href="classVecPosition.html#d1">VecPosition::normalizeAngle</a>( *angNeck + dEffectiveAngle );00185 00186 <font class="comment">// update as if dashed with no power</font>00187 <a class="code" href="classWorldModel.html#a105">predictStateAfterDash</a>( 0.0, pos, vel, sta, *angBody );00188 <font class="keywordflow">return</font>;00189 }00190 <a name="l00200"></a><a class="code" href="classWorldModel.html#a107">00200</a> <a class="code" href="classVecPosition.html">VecPosition</a> <a class="code" href="classWorldModel.html#a107">WorldModel::predictPosAfterNrCycles</a>( <a class="code" href="SoccerTypes_8h.html#a240">ObjectT</a> o, <font class="keywordtype">int</font> iCycles,00201 <font class="keywordtype">int</font> iDashPower, <a class="code" href="classVecPosition.html">VecPosition</a> *velocity )00202 {00203 <a class="code" href="classVecPosition.html">VecPosition</a> vel = <a class="code" href="classWorldModel.html#a53">getGlobalVelocity</a>( o );00204 <a class="code" href="classVecPosition.html">VecPosition</a> pos = <a class="code" href="classWorldModel.html#a51">getGlobalPosition</a>( o );00205 00206 <font class="keywordflow">if</font>( o == <a class="code" href="SoccerTypes_8h.html#a240a24">OBJECT_BALL</a> )00207 {00208 <font class="comment">// get the speed and the distance it travels in iCycle's.</font>00209 <font class="comment">// use this distance and direction it travels in, to calculate new pos</font>00210 <font class="comment">// geom series is serie s=a+ar+..+ar^n...decay=r,iCycles=n,dSpeed=a</font>00211 <font class="keywordtype">double</font> dDist = <a class="code" href="classGeometry.html#d1">Geometry::getSumGeomSeries</a>( vel.<a class="code" href="classVecPosition.html#a32">getMagnitude</a>(),00212 <a class="code" href="classWorldModel.html#o0">SS</a>-><a class="code" href="classServerSettings.html#a60">getBallDecay</a>(),00213 (double)iCycles);00214 pos += <a class="code" href="classVecPosition.html">VecPosition</a>( dDist, vel.<a class="code" href="classVecPosition.html#a33">getDirection</a>(), POLAR );00215 }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?