Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Modules/BehaviorControl/CommonXabsl2Symbols/RobotPoseSymbols.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file RobotPoseSymbols.cpp
00003 *
00004 * Implementation of class RobotPoseSymbols.
00005 *
00006 * @author Martin Lötzsch
00007 */
00008 
00009 #include "RobotPoseSymbols.h"
00010 #include "Platform/SystemCall.h"
00011 #include "Tools/Math/Geometry.h"
00012 #include "Tools/FieldDimensions.h"
00013 #include "Tools/Debugging/DebugDrawings.h"
00014 
00015 RobotPoseSymbols::RobotPoseSymbols(const BehaviorControlInterfaces& interfaces)
00016 : BehaviorControlInterfaces(interfaces)
00017 {
00018 }
00019 
00020 
00021 void RobotPoseSymbols::registerSymbols(Xabsl2Engine& engine)
00022 {
00023   engine.registerDecimalInputSymbol("robot-pose.x",&robotPose.translation.x);
00024   engine.registerDecimalInputSymbol("robot-pose.y",&robotPose.translation.y);
00025   engine.registerDecimalInputSymbol("robot-pose.angle",this,
00026     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getAngle);
00027   engine.registerDecimalInputSymbol("robot-pose.validity",&robotPose.getValidity());
00028   
00029   engine.registerDecimalInputSymbol("robot-pose.distance-to-own-goal",this,
00030     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getDistanceToOwnGoal);
00031   engine.registerDecimalInputSymbol("robot-pose.distance-to-own-penalty-area",this,
00032     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getDistanceToOwnPenaltyArea);
00033   engine.registerDecimalInputSymbol("robot-pose.distance-to-opponent-goal",this,
00034     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getDistanceToOpponentGoal);
00035 
00036 
00037   engine.registerDecimalInputSymbol("defensive-supporter.robot-pose.y",this,
00038     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getDefensiveSupporterRobotPoseY);
00039  
00040   engine.registerDecimalInputSymbol("striker.robot-pose.y",this,
00041     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getStrikerRobotPoseY);
00042 
00043   engine.registerDecimalInputSymbol("robot-pose.distance-to-border",&robotPose.distanceToBorder);
00044 
00045   engine.registerDecimalInputSymbol("robot-pose.angle-to-border",this,
00046     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getAngleToBorder);
00047 
00048   
00049   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-pos-x",this,
00050     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendPosX);
00051   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-pos-y",this,
00052     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendPosY);
00053   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-angle",this,
00054     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendAngle);
00055   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-step-pos-x",this,
00056     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendStepPosX);
00057   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-step-pos-y",this,
00058     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendStepPosY);
00059   engine.registerDecimalInputSymbol("robot-pose.goalie-defend-step-angle",this,
00060     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::getGoalieDefendStepAngle);
00061   engine.registerDecimalInputFunction("robot-pose.update-goalie-defend-position",this,
00062     (double (Xabsl2FunctionProvider::*)())&RobotPoseSymbols::updateGoalieDefendPosition);
00063   engine.registerDecimalInputFunctionParameter("robot-pose.update-goalie-defend-position",
00064     "robot-pose.update-goalie-defend-position.ball-pos-x",RobotPoseSymbols::ballPosX);
00065   engine.registerDecimalInputFunctionParameter("robot-pose.update-goalie-defend-position",
00066     "robot-pose.update-goalie-defend-position.ball-pos-y",RobotPoseSymbols::ballPosY);
00067 }
00068 
00069 void RobotPoseSymbols::update()
00070 {
00071 }
00072 
00073 double RobotPoseSymbols::getAngle()
00074 {
00075   return toDegrees(robotPose.rotation);
00076 }
00077 
00078 double RobotPoseSymbols::getAngleToBorder()
00079 {
00080   return toDegrees(robotPose.angleToBorder);
00081 }
00082 
00083 
00084 double RobotPoseSymbols::getDistanceToOwnGoal()
00085 {
00086   return Geometry::distanceTo(robotPose,
00087     Vector2<double>(xPosOwnGroundline,yPosCenterGoal));
00088 }
00089 
00090 double RobotPoseSymbols::getDistanceToOwnPenaltyArea()
00091 {
00092   return FieldDimensions::distanceToOwnPenaltyArea(robotPose.translation);
00093 }
00094 
00095 double RobotPoseSymbols::getDistanceToOpponentGoal()
00096 {
00097   return Geometry::distanceTo(robotPose,
00098     Vector2<double>(xPosOpponentGroundline,yPosCenterGoal));
00099 }
00100 
00101 double RobotPoseSymbols::getDefensiveSupporterRobotPoseY()
00102 {
00103   for (int i=0; i<3;i++)
00104   {
00105     if (teamMessageCollection[i].isActual())
00106     {
00107       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole 
00108         == BehaviorTeamMessage::defensiveSupporter)
00109       {
00110         return teamMessageCollection[i].robotPose.translation.y;
00111       }
00112     }
00113   }
00114   
00115   return -1;
00116 }
00117 
00118 double RobotPoseSymbols::getStrikerRobotPoseY()
00119 {
00120   for (int i=0; i<3;i++)
00121   {
00122     if (teamMessageCollection[i].isActual())
00123     {
00124       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole 
00125         == BehaviorTeamMessage::striker)
00126       {
00127         return teamMessageCollection[i].robotPose.translation.y;
00128       }
00129     }
00130   }
00131   
00132   return -1;
00133 }
00134 
00135 double RobotPoseSymbols::getGoalieDefendAngle()
00136 {
00137   return RobotPoseSymbols::goalieDefendAngle;
00138 }
00139 
00140 double RobotPoseSymbols::getGoalieDefendPosX()
00141 {
00142   return RobotPoseSymbols::goalieDefendPositionX;
00143 }
00144 
00145 double RobotPoseSymbols::getGoalieDefendPosY()
00146 {
00147   return RobotPoseSymbols::goalieDefendPositionY;
00148 }
00149 
00150 double RobotPoseSymbols::getGoalieDefendStepPosX()
00151 {
00152   return RobotPoseSymbols::goalieDefendStepPosX;
00153 }
00154 
00155 double RobotPoseSymbols::getGoalieDefendStepPosY()
00156 {
00157   return RobotPoseSymbols::goalieDefendStepPosY;
00158 }
00159 
00160 double RobotPoseSymbols::getGoalieDefendStepAngle()
00161 {
00162   return RobotPoseSymbols::goalieDefendStepAngle;
00163 }
00164 
00165 double RobotPoseSymbols::updateGoalieDefendPosition()
00166 {
00167   RobotPoseSymbols::goalieDefendRadiusMax = 800;
00168   const RobotDimensions& rD = getRobotConfiguration().getRobotDimensions();
00169   const double degree90 = fromDegrees(90);
00170   const double degree180 = fromDegrees(180);
00171   double alpha = 0;
00172   double beta = 0;
00173   double gamma = 0;
00174   double teta = 0;
00175   double r1 = 0;
00176   double r2 = 0;
00177   double r = 0;
00178   double distX = -xPosOwnGroundline + RobotPoseSymbols::ballPosX;
00179   double halfSW = rD.shoulderWidth / 2;
00180 
00181   //toDegrees(double angle);
00182   //fromDegrees(double degrees);
00183   
00184   if( RobotPoseSymbols::ballPosY < 0.0 ) {
00185     
00186     alpha = atan2( RobotPoseSymbols::ballPosY , distX );
00187     gamma = atan2( distX , (yPosLeftPenaltyArea - RobotPoseSymbols::ballPosY) );
00188     if( RobotPoseSymbols::ballPosY > yPosRightPenaltyArea )
00189       beta = atan2( distX , (yPosLeftPenaltyArea + RobotPoseSymbols::ballPosY) );
00190     else if( RobotPoseSymbols::ballPosY < yPosRightPenaltyArea)
00191       beta = atan2( (yPosRightPenaltyArea - RobotPoseSymbols::ballPosY) , distX ) + degree90;
00192     else
00193       beta = degree90;
00194     teta = (degree180 - gamma - beta) / 2;
00195     
00196     r1 = halfSW / tan( teta );
00197     r = distX / sin( degree90 + alpha );
00198     r2 = r - r1;
00199     
00200   } else if( RobotPoseSymbols::ballPosY > 0.0 ){
00201     
00202     alpha = atan( RobotPoseSymbols::ballPosY / distX );
00203     beta = atan( distX / (yPosLeftPenaltyArea + RobotPoseSymbols::ballPosY) );
00204     if( RobotPoseSymbols::ballPosY < yPosLeftPenaltyArea )
00205       gamma = atan2( distX , (yPosLeftPenaltyArea - RobotPoseSymbols::ballPosY) );
00206     else if( RobotPoseSymbols::ballPosY > yPosLeftPenaltyArea)
00207       gamma = atan2( (yPosRightPenaltyArea + RobotPoseSymbols::ballPosY) , distX ) + degree90;
00208     else
00209       gamma = degree90;
00210     teta = (degree180 - gamma - beta) / 2;
00211     
00212     r1 = halfSW / tan( teta );
00213     r = distX / sin( degree90 - alpha );
00214     r2 = r - r1;
00215     
00216   } else if( RobotPoseSymbols::ballPosY == 0.0 ) {
00217     
00218     alpha = 0.0;
00219     teta = atan2( yPosLeftPenaltyArea , distX );
00220     r1 = halfSW / tan( teta );
00221   }
00222   
00223   /*if(toDegrees(alpha) < -70)
00224     RobotPoseSymbols::computeGoalieDefendMinPos(-degree90, rD);
00225   else if(toDegrees(alpha) > 70)
00226     RobotPoseSymbols::computeGoalieDefendMinPos(degree90, rD);
00227   else*/
00228     RobotPoseSymbols::computeGoalieDefendMinPos(alpha, rD);
00229   
00230   RobotPoseSymbols::goalieDefendRadius = r2;
00231   
00232   if( r2 < RobotPoseSymbols::goalieDefendRadiusMin ) {
00233     
00234     RobotPoseSymbols::goalieDefendPositionX = RobotPoseSymbols::goalieDefendMinPosX;
00235     RobotPoseSymbols::goalieDefendPositionY = RobotPoseSymbols::goalieDefendMinPosY;
00236     
00237   } else if( r2 > RobotPoseSymbols::goalieDefendRadiusMax ) {
00238     
00239     if( RobotPoseSymbols::ballPosY != 0.0 ) {
00240       RobotPoseSymbols::goalieDefendPositionX = xPosOwnGroundline + cos( alpha ) * RobotPoseSymbols::goalieDefendRadiusMax;
00241       RobotPoseSymbols::goalieDefendPositionY = sin( alpha ) * RobotPoseSymbols::goalieDefendRadiusMax;
00242     } else {
00243       RobotPoseSymbols::goalieDefendPositionX = xPosOwnGroundline + RobotPoseSymbols::goalieDefendRadiusMax;
00244       RobotPoseSymbols::goalieDefendPositionY = 0.0;
00245     }
00246     
00247   } else {
00248     
00249     if( RobotPoseSymbols::ballPosY != 0.0 ) {
00250       RobotPoseSymbols::goalieDefendPositionX = xPosOwnGroundline + cos( alpha ) * r2;
00251       RobotPoseSymbols::goalieDefendPositionY = sin( alpha ) * r2;
00252     } else {
00253       RobotPoseSymbols::goalieDefendMinPosX = xPosOwnGroundline + distX - r1;
00254       RobotPoseSymbols::goalieDefendMinPosY = 0.0;
00255     }
00256   }
00257 
00258   RobotPoseSymbols::goalieDefendAngle = toDegrees(alpha);
00259   //RobotPoseSymbols::goalieDebugAngleAlpha = RobotPoseSymbols::goalieDefendAngle;
00260   if(RobotPoseSymbols::goalieDefendAngle < -70)
00261     RobotPoseSymbols::goalieDefendAngle = -90;
00262   else if(RobotPoseSymbols::goalieDefendAngle > 70)
00263     RobotPoseSymbols::goalieDefendAngle = 90;
00264 
00265   double diffX = fabs( RobotPoseSymbols::goalieDefendPositionX - robotPose.translation.x );
00266   double diffY = fabs( RobotPoseSymbols::goalieDefendPositionY - robotPose.translation.y );
00267   double angle = toDegrees(robotPose.rotation);
00268   double diffA = fabs( angle - RobotPoseSymbols::goalieDefendAngle );
00269 
00270   double ratio = 0;
00271   if( diffX > 100 ) {
00272 
00273     ratio = 100 / diffX;
00274     if( RobotPoseSymbols::goalieDefendPositionX < robotPose.translation.x )
00275       RobotPoseSymbols::goalieDefendStepPosX = robotPose.translation.x - 100;
00276     else
00277       RobotPoseSymbols::goalieDefendStepPosX = robotPose.translation.x + 100;
00278 
00279   } else {
00280     ratio = 1.0;
00281     RobotPoseSymbols::goalieDefendStepPosX = RobotPoseSymbols::goalieDefendPositionX;
00282   }
00283 
00284   if( diffY > 100 ) {
00285 
00286     ratio += 100 / diffY;
00287     if( RobotPoseSymbols::goalieDefendPositionY < robotPose.translation.y )
00288       RobotPoseSymbols::goalieDefendStepPosY = robotPose.translation.y - 100;
00289     else
00290       RobotPoseSymbols::goalieDefendStepPosY = robotPose.translation.y + 100;
00291 
00292   } else {
00293     ratio += 1.0;
00294     RobotPoseSymbols::goalieDefendStepPosY = RobotPoseSymbols::goalieDefendPositionY;
00295   }
00296 
00297   if( RobotPoseSymbols::goalieDefendAngle < angle ) 
00298     RobotPoseSymbols::goalieDefendStepAngle = angle - ratio / 2 * diffA;
00299   else
00300     RobotPoseSymbols::goalieDefendStepAngle = angle + ratio / 2 * diffA;
00301   
00302 
00303   return RobotPoseSymbols::goalieDefendPositionX;
00304 }
00305 
00306 void RobotPoseSymbols::computeGoalieDefendMinPos(const double& alpha, const RobotDimensions& rD)
00307 {
00308   const double degree90 = fromDegrees(90);
00309   const double degree45 = fromDegrees(45);
00310   double halfSW = rD.shoulderWidth / 2;
00311   
00312   if(alpha == 0.0) {
00313     RobotPoseSymbols::goalieDefendRadiusMin = halfSW + rD.bodyWidth;
00314     RobotPoseSymbols::goalieDefendMinPosX = xPosOwnGroundline + RobotPoseSymbols::goalieDefendRadiusMin;
00315     RobotPoseSymbols::goalieDefendMinPosY = 0.0;
00316   } else if(alpha < -degree45) {
00317     RobotPoseSymbols::goalieDefendRadiusMin = cos( degree90 + alpha) * yPosLeftPenaltyArea;
00318     RobotPoseSymbols::goalieDefendMinPosX = xPosOwnGroundline + sin( degree90 + alpha) * yPosLeftPenaltyArea + halfSW;
00319     RobotPoseSymbols::goalieDefendMinPosY = yPosRightPenaltyArea;
00320   } else if(alpha > degree45) {
00321     RobotPoseSymbols::goalieDefendRadiusMin = cos( degree90 - alpha) * yPosLeftPenaltyArea;
00322     RobotPoseSymbols::goalieDefendMinPosX = xPosOwnGroundline + sin( degree90 - alpha) * yPosLeftPenaltyArea + halfSW;
00323     RobotPoseSymbols::goalieDefendMinPosY = yPosLeftPenaltyArea;
00324   } else {
00325     double r0 = halfSW + rD.bodyWidth;
00326     RobotPoseSymbols::goalieDefendRadiusMin = r0 / cos( alpha );
00327     RobotPoseSymbols::goalieDefendMinPosX = xPosOwnGroundline + r0;
00328     RobotPoseSymbols::goalieDefendMinPosY = sin( alpha ) * r0;
00329   }
00330 }
00331 
00332 /*
00333 * Change Log
00334 * 
00335 * $Log: RobotPoseSymbols.cpp,v $
00336 * Revision 1.7  2004/06/22 18:48:56  juengel
00337 * kickAngles clean up
00338 *
00339 * Revision 1.6  2004/06/16 23:09:17  juengel
00340 * Added angle-to-center-of-field.
00341 *
00342 * Revision 1.5  2004/06/16 17:07:33  cesarz
00343 * Moved body PSD calculations
00344 *
00345 * Revision 1.4  2004/06/02 17:18:23  spranger
00346 * MotionRequest cleanup
00347 *
00348 * Revision 1.3  2004/05/26 18:56:41  loetzsch
00349 * clean up in the behavior control interfaces
00350 *
00351 * Revision 1.2  2004/05/22 20:41:41  juengel
00352 * Renamed ballP_osition to ballModel.
00353 *
00354 * Revision 1.1.1.1  2004/05/22 17:17:01  cvsadm
00355 * created new repository GT2004_WM
00356 *
00357 * Revision 1.18  2004/05/04 16:24:25  juengel
00358 * angleToPointBehindOpponentGoal  is not vision-based any more
00359 *
00360 * Revision 1.17  2004/05/04 10:48:58  loetzsch
00361 * replaced all enums
00362 * xxxBehaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00363 * by
00364 * behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00365 * (this mechanism was neither fully implemented nor used)
00366 *
00367 * Revision 1.16  2004/04/08 15:33:01  wachter
00368 * GT04 checkin of Microsoft-Hellounds
00369 *
00370 * Revision 1.15  2004/04/05 17:56:47  loetzsch
00371 * merged the local German Open CVS of the aibo team humboldt with the tamara CVS
00372 *
00373 * Revision 1.2  2004/04/04 01:16:13  jumped
00374 * Added angle-to-point-behind-opponent-goal.
00375 *
00376 * Revision 1.1.1.1  2004/03/31 11:16:42  loetzsch
00377 * created ATH repository for german open 2004
00378 *
00379 * Revision 1.14  2004/03/27 16:16:37  juengel
00380 * Added distanceToBorder and angleToBorder.
00381 *
00382 * Revision 1.13  2004/03/22 20:22:35  kerdels
00383 * adjusted threshold
00384 *
00385 * Revision 1.12  2004/03/17 16:31:20  kerdels
00386 * added boolean input symbol "robot-pose.something-in-front-of-chest" utilizing the chest distance sensor
00387 *
00388 * Revision 1.11  2004/03/08 00:58:57  roefer
00389 * Interfaces should be const
00390 *
00391 * Revision 1.10  2004/03/01 17:14:02  kerdels
00392 * added robot-pose.distance-to-opponent-goal,
00393 * moved robot-pose.angle-to-teammate1-3 to MSH2004StrategySymbols as fieldpos.angle-to-teammate1-3,
00394 * added fieldpos.distance-to-teammate1-3,
00395 * added DTT-Options newKickToGoal, newKickToClear, newKickToTeammate1-3,
00396 * added DTT-OptionClass newKickToTeammate,
00397 * added kickToPosRating function in DefaultOptionRating
00398 *
00399 * Revision 1.9  2004/02/28 12:50:15  rempe
00400 * some changes
00401 *
00402 * Revision 1.8  2004/02/27 10:45:17  spranger
00403 * moved get-Angle-to-Teammate function and parameter to ATH2004StrategySymbols
00404 *
00405 * Revision 1.7  2004/02/25 13:49:12  spranger
00406 * removed OUTPUTS
00407 *
00408 * Revision 1.6  2004/02/25 13:45:23  spranger
00409 * added function getAngleToTeammate and Xabsl input-function get-angle-to-teammate
00410 *
00411 * Revision 1.5  2004/02/19 17:26:43  kerdels
00412 * modified kickAngle to Teammates like suggested by Walter
00413 *
00414 * Revision 1.4  2004/02/16 00:54:47  rempe
00415 * symbols for new goalie
00416 *
00417 * Revision 1.3  2004/01/27 14:28:14  lohmann
00418 * getPenaltyPointAngle added (for bananaCross)
00419 *
00420 * Revision 1.2  2004/01/07 23:17:01  kerdels
00421 * added symbols:
00422 * robot-pose.angle-to-teammate1
00423 * robot-pose.angle-to-teammate2
00424 * robot-pose.angle-to-teammate3
00425 *
00426 * Revision 1.1  2003/10/22 22:18:44  loetzsch
00427 * prepared the cloning of the GT2003BehaviorControl
00428 *
00429 * Revision 1.1  2003/10/06 13:39:29  cvsadm
00430 * Created GT2004 (M.J.)
00431 *
00432 * Revision 1.9  2003/09/01 10:20:11  juengel
00433 * DebugDrawings clean-up 2
00434 * DebugImages clean-up
00435 * MessageIDs clean-up
00436 * Stopwatch clean-up
00437 *
00438 * Revision 1.8  2003/07/07 15:12:55  juengel
00439 * Changed bestAngleAwayFromOwnGoal near borders
00440 *
00441 * Revision 1.7  2003/07/06 02:14:12  juengel
00442 * goalKickAngle is as bestAngleAwayFromOwnGoal if robot looks to own goal.
00443 *
00444 * Revision 1.6  2003/07/06 00:18:31  juengel
00445 * changed condition for goalKickAngle
00446 *
00447 * Revision 1.5  2003/07/05 23:57:09  juengel
00448 * Added best-angle-away-from-own-goal and best-angle-away-from-own-goal-no-obstacles.
00449 *
00450 * Revision 1.4  2003/07/04 12:25:28  juengel
00451 * Added bestAngleToOpponentGoalNoObstacles.
00452 *
00453 * Revision 1.3  2003/07/03 23:11:20  juengel
00454 * active passing
00455 *
00456 * Revision 1.2  2003/07/03 10:50:07  juengel
00457 * Added Drawing kickAnglesRadar.
00458 *
00459 * Revision 1.1.1.1  2003/07/02 09:40:23  cvsadm
00460 * created new repository for the competitions in Padova from the 
00461 * tamara CVS (Tuesday 2:00 pm)
00462 *
00463 * removed unused solutions
00464 *
00465 * Revision 1.17  2003/06/27 15:10:53  juengel
00466 * goal-kick-angle uses getAngleOfLargeGapInRange2.
00467 *
00468 * Revision 1.16  2003/06/26 12:36:26  juengel
00469 * goal-kick-angle improved.
00470 *
00471 * Revision 1.15  2003/06/24 09:38:01  risler
00472 * bug fix: goal kick angle should be relative
00473 *
00474 * Revision 1.14  2003/06/22 10:55:01  juengel
00475 * Fixed bug in calculation of bestAngleToOpponentGoal.
00476 *
00477 * Revision 1.13  2003/06/20 21:43:52  juengel
00478 * New version of best angle to opponent goal.
00479 *
00480 * Revision 1.12  2003/06/20 20:15:24  juengel
00481 * Renamed some methods in ObstaclesModel.
00482 *
00483 * Revision 1.11  2003/06/19 19:51:07  juengel
00484 * Obstacles are used to determine bestAngleToOpponentGoal.
00485 *
00486 * Revision 1.10  2003/06/19 12:11:17  juengel
00487 * Changed calculation of goal-kick-angle.
00488 *
00489 * Revision 1.9  2003/06/18 18:31:49  juengel
00490 * goal-kick-angle is calculated
00491 *
00492 * Revision 1.8  2003/06/18 13:47:36  loetzsch
00493 * added input symbol "goalie.kick-when-stuck"
00494 *
00495 * Revision 1.7  2003/06/18 09:12:47  loetzsch
00496 * added symbol "striker.robot-pose.y"
00497 *
00498 * Revision 1.6  2003/06/17 18:28:45  thomas
00499 * added: goalie cont-behaviours, return-state, etc.
00500 *
00501 * Revision 1.5  2003/06/16 20:01:23  loetzsch
00502 * added "defensive-supporter.robot-pose.y"
00503 *
00504 * Revision 1.4  2003/06/05 18:10:02  juengel
00505 * Added angle-to-next-free-teammate.
00506 *
00507 * Revision 1.3  2003/05/26 13:07:00  juengel
00508 * Moved angleToFreePartOfGoal from specialPercept to obstaclesPercept.
00509 *
00510 * Revision 1.2  2003/05/26 08:30:12  juengel
00511 * Moved angleToFreePartOfGoal from specialPercept to obstaclesPercept.
00512 *
00513 * Revision 1.1  2003/05/06 16:03:05  loetzsch
00514 * added class RobotPoseSymbols
00515 *
00516 * Revision 1.1  2003/05/04 11:41:40  loetzsch
00517 * added class RobotPoseSymbols
00518 *
00519 */
00520 

Generated on Thu Sep 23 19:57:25 2004 for GT2004 by doxygen 1.3.6