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

Modules/BehaviorControl/CommonXabsl2Symbols/AngleSymbols.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file AngleSymbols.cpp
00003 *
00004 * Implementation of class AngleSymbols.
00005 *
00006 * @author Matthias Jüngel
00007 */
00008 
00009 #include "AngleSymbols.h"
00010 #include "Platform/SystemCall.h"
00011 #include "Tools/Math/Geometry.h"
00012 #include "Tools/FieldDimensions.h"
00013 #include "Tools/Debugging/DebugDrawings.h"
00014 #include "Tools/StringFunctions.h"
00015 
00016 AngleSymbols::AngleSymbols(const BehaviorControlInterfaces& interfaces)
00017 : BehaviorControlInterfaces(interfaces)
00018 {
00019   angleShownByLEDs = undefined;
00020   angles[undefined] = 0;
00021 }
00022 
00023 
00024 void AngleSymbols::registerSymbols(Xabsl2Engine& engine)
00025 {
00026   // localisation based:
00027   engine.registerDecimalInputSymbol("angle.angle-to-center-of-field",this,
00028     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getAngleToCenterOfField);
00029 
00030   engine.registerDecimalInputSymbol("angle.angle-to-opponent-goal",this,
00031     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getAngleToOpponentGoal);
00032 
00033   engine.registerDecimalInputSymbol("angle.angle-to-point-behind-opponent-goal",this,
00034     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getAngleToPointBehindOpponentGoal);
00035   
00036   // vision based
00037   // ...
00038 
00039   // combined: vision + localisation based
00040   
00041   
00042   engine.registerDecimalInputSymbol("angle.best-angle-to-opponent-goal",this,
00043     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getBestAngleToOpponentGoal);
00044 
00045   engine.registerDecimalInputSymbol("angle.best-angle-to-opponent-goal-no-obstacles",this,
00046     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getBestAngleToOpponentGoalNoObstacles);
00047   
00048   engine.registerDecimalInputSymbol("angle.best-angle-away-from-own-goal",this,
00049     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getBestAngleAwayFromOwnGoal);
00050   
00051   engine.registerDecimalInputSymbol("angle.best-angle-away-from-own-goal-no-obstacles",this,
00052     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getBestAngleAwayFromOwnGoalNoObstacles);
00053   
00054   engine.registerDecimalInputSymbol("angle.goal-kick-angle",this,
00055     (double (Xabsl2FunctionProvider::*)())&AngleSymbols::getGoalieGoalKickAngle);
00056 
00057 
00058   engine.registerEnumeratedOutputSymbol("angle.angle-shown-by-leds",(int*)&angleShownByLEDs);
00059 
00060   int i;
00061   char s[256];
00062   for (i = 0; i < numberOfAngles; i++)
00063   {
00064     sprintf(s,"angle.");
00065     getXmlString(s+strlen(s),getAngleName((Angles)i));
00066     engine.registerEnumeratedOutputSymbolEnumElement("angle.angle-shown-by-leds",s,i);
00067   }
00068 }
00069 
00070 void AngleSymbols::update()
00071 {
00072   calculateLocalisationBasedAngles();
00073   calculateVisionBasedAngles();
00074   calculateCombinedAngles();
00075   drawAngleShownByLeds();
00076 }
00077 
00078 // localisation based
00079 double AngleSymbols::getAngleToCenterOfField()           {return toDegrees(normalize(angles[angleToCenterOfField])); }
00080 double AngleSymbols::getAngleToOpponentGoal()            {return toDegrees(normalize(angles[angleToOpponentGoal])); }
00081 double AngleSymbols::getAngleToPointBehindOpponentGoal() {return toDegrees(normalize(angles[angleToPointBehindOpponentGoal])); }
00082 
00083 // combined: vision + localisation
00084 double AngleSymbols::getBestAngleToOpponentGoal()            {return toDegrees(normalize(angles[bestAngleToOpponentGoal])); }
00085 double AngleSymbols::getBestAngleToOpponentGoalNoObstacles() {return toDegrees(normalize(angles[bestAngleToOpponentGoalNoObstacles])); }
00086 double AngleSymbols::getBestAngleAwayFromOwnGoal()           {return toDegrees(normalize(angles[bestAngleAwayFromOwnGoal])); }
00087 double AngleSymbols::getBestAngleAwayFromOwnGoalNoObstacles(){return toDegrees(normalize(angles[bestAngleAwayFromOwnGoalNoObstacles])); }
00088 double AngleSymbols::getGoalieGoalKickAngle()                {return toDegrees(normalize(angles[goalieGoalKickAngle])); }
00089 
00090 void AngleSymbols::calculateLocalisationBasedAngles()
00091 {
00092   angles[angleToCenterOfField]     = Geometry::angleTo(robotPose, Vector2<double>(0.0,0.0));
00093 
00094   angles[angleToLeftOpponentGoalPost]  = Geometry::angleTo(robotPose, Vector2<double>(xPosOpponentGroundline,yPosLeftGoal));
00095   angles[angleToRightOpponentGoalPost] = Geometry::angleTo(robotPose, Vector2<double>(xPosOpponentGroundline,yPosRightGoal));
00096   if(angles[angleToLeftOpponentGoalPost] < angles[angleToRightOpponentGoalPost])
00097   {
00098     angles[angleToLeftOpponentGoalPost] += pi2;
00099   }
00100   angles[angleToOpponentGoal] = (angles[angleToLeftOpponentGoalPost] + angles[angleToRightOpponentGoalPost]) / 2.0;
00101 
00102   angles[angleToLeftOpponentGoalCorner] = Geometry::angleTo(robotPose, Vector2<double>(xPosOpponentGoal,yPosLeftGoal));
00103   angles[angleToRightOpponentGoalCorner] = Geometry::angleTo(robotPose, Vector2<double>(xPosOpponentGoal,yPosRightGoal));
00104   if(angles[angleToLeftOpponentGoalCorner] < angles[angleToRightOpponentGoalCorner])
00105   {
00106     angles[angleToLeftOpponentGoalCorner] += pi2;
00107   }
00108   angles[angleToPointBehindOpponentGoal] = (angles[angleToLeftOpponentGoalCorner] + angles[angleToRightOpponentGoalCorner]) / 2.0;
00109 }
00110 
00111 void AngleSymbols::calculateVisionBasedAngles()
00112 {
00113   angles[angleToFreePartOfOpponentGoal] = obstaclesModel.angleToFreePartOfGoal[ObstaclesModel::opponentGoal];
00114 }
00115 
00116 void AngleSymbols::calculateCombinedAngles()
00117 {
00118   //best angle to opponent goal ///////////
00119   if(obstaclesModel.angleToFreePartOfGoalWasDetermined[ObstaclesModel::opponentGoal])
00120   {
00121     angles[bestAngleToOpponentGoalNoObstacles] = angles[angleToFreePartOfOpponentGoal];
00122   }
00123   else
00124   {
00125     angles[bestAngleToOpponentGoalNoObstacles] = angles[angleToOpponentGoal];
00126   }
00127   
00128   if(FieldDimensions::distanceToOpponentPenaltyArea(robotPose.translation) > 300)
00129   {
00130     int distanceToNextTeammate = 10000;
00131     double angleToNextTeammate = 0;
00132     bool foundTeammate = false;
00133 
00134     for(int i = 0; i < playerPoseCollection.numberOfOwnPlayers; i++)
00135     {
00136       PlayerPose currentPose = playerPoseCollection.getOwnPlayerPose(i);
00137       int currentDistance = (int)((currentPose.getPose().translation - robotPose.translation).abs());
00138       double currentAngle = normalize(Geometry::angleTo(robotPose, currentPose.getPose().translation));
00139 
00140       if(currentDistance < distanceToNextTeammate)
00141       {
00142         foundTeammate = true;
00143         angleToNextTeammate = currentAngle;
00144         distanceToNextTeammate = currentDistance;
00145       }
00146     }
00147 
00148     
00149     double leftAngleToOpponentGoal = obstaclesModel.getAngleOfNextFreeSectorLeft(pi/8.0, angles[bestAngleToOpponentGoalNoObstacles], 600);
00150     double rightAngleToOpponentGoal = obstaclesModel.getAngleOfNextFreeSectorRight(pi/8.0, angles[bestAngleToOpponentGoalNoObstacles], 600);
00151     
00152     if(foundTeammate && 
00153       fabs(
00154       fabs(normalize(angles[bestAngleToOpponentGoalNoObstacles] - leftAngleToOpponentGoal)) -
00155       fabs(normalize(angles[bestAngleToOpponentGoalNoObstacles] - rightAngleToOpponentGoal))
00156       )
00157       < fromDegrees(20) )
00158     {
00159       if(angleToNextTeammate > 0) angles[bestAngleToOpponentGoal] = leftAngleToOpponentGoal;
00160       else angles[bestAngleToOpponentGoal] = rightAngleToOpponentGoal;
00161     }
00162     else
00163     {
00164       if(
00165         fabs(normalize(angles[bestAngleToOpponentGoalNoObstacles] - leftAngleToOpponentGoal)) <
00166         fabs(normalize(angles[bestAngleToOpponentGoalNoObstacles] - rightAngleToOpponentGoal))
00167         ) angles[bestAngleToOpponentGoal] = leftAngleToOpponentGoal;
00168       else angles[bestAngleToOpponentGoal] = rightAngleToOpponentGoal;
00169     }
00170 
00171     if(fabs(angles[bestAngleToOpponentGoal] - angles[bestAngleToOpponentGoalNoObstacles]) > fromDegrees(70))
00172     {
00173       angles[bestAngleToOpponentGoal] = angles[bestAngleToOpponentGoalNoObstacles];
00174     }
00175   }
00176   else
00177   {
00178     angles[bestAngleToOpponentGoal] = angles[bestAngleToOpponentGoalNoObstacles];
00179   }
00180 
00181   //best angle away from own goal ///////////
00182   if(obstaclesModel.angleToFreePartOfGoalWasDetermined[ObstaclesModel::ownGoal])
00183   {
00184     angles[bestAngleAwayFromOwnGoalNoObstacles] = obstaclesModel.angleToFreePartOfGoal[ObstaclesModel::ownGoal] + pi;
00185 
00186 /*
00187     LINE(behavior_kickAngles, 
00188     robotPose.getPose().translation.x, 
00189     robotPose.getPose().translation.y, 
00190     robotPose.getPose().translation.x + cos(bestAngleAwayFromOwnGoalNoObstacles + robotPose.getAngle()) * 2000,
00191     robotPose.getPose().translation.y + sin(bestAngleAwayFromOwnGoalNoObstacles + robotPose.getAngle()) * 2000,
00192     2, Drawings::ps_solid, Drawings::green
00193     );
00194 */
00195   }
00196   else
00197   {
00198     double angleToLeftOwnGoalPost = Geometry::angleTo(robotPose, Vector2<double>(xPosOwnGroundline,yPosLeftGoal));
00199     double angleToRightOwnGoalPost = Geometry::angleTo(robotPose, Vector2<double>(xPosOwnGroundline,yPosRightGoal));
00200     
00201     if(angleToLeftOwnGoalPost < angleToRightOwnGoalPost)
00202     {
00203       angleToLeftOwnGoalPost += pi2;
00204     }
00205     angles[bestAngleAwayFromOwnGoalNoObstacles] = (angleToLeftOwnGoalPost + angleToRightOwnGoalPost) / 2.0;
00206 /*
00207   LINE(behavior_kickAngles, 
00208     robotPose.getPose().translation.x, 
00209     robotPose.getPose().translation.y, 
00210     robotPose.getPose().translation.x + cos(angleToLeftOwnGoalPost + robotPose.getAngle()) * 2000,
00211     robotPose.getPose().translation.y + sin(angleToLeftOwnGoalPost + robotPose.getAngle()) * 2000,
00212     2, Drawings::ps_solid, Drawings::white);
00213 
00214   LINE(behavior_kickAngles, 
00215     robotPose.getPose().translation.x, 
00216     robotPose.getPose().translation.y, 
00217     robotPose.getPose().translation.x + cos(angleToRightOwnGoalPost + robotPose.getAngle()) * 2000,
00218     robotPose.getPose().translation.y + sin(angleToRightOwnGoalPost + robotPose.getAngle()) * 2000,
00219     2, Drawings::ps_solid, Drawings::white
00220     );
00221 */
00222   }
00223 
00224   if(
00225     robotPose.translation.y > yPosLeftSideline - 350 || 
00226     robotPose.translation.y < yPosRightSideline + 350
00227     )
00228   {
00229     angles[bestAngleAwayFromOwnGoalNoObstacles] = normalize(-robotPose.getAngle());
00230   }
00231 
00232   angles[bestAngleAwayFromOwnGoal] = angles[bestAngleAwayFromOwnGoalNoObstacles];
00233 /*
00234   LINE(behavior_kickAnglesRadar, 
00235     0, 0, 
00236     cos(bestAngleAwayFromOwnGoalNoObstacles) * 2000,
00237     sin(bestAngleAwayFromOwnGoalNoObstacles) * 2000,
00238     40, Drawings::ps_solid, Drawings::red
00239     );
00240   LINE(behavior_kickAngles, 
00241     robotPose.getPose().translation.x, 
00242     robotPose.getPose().translation.y, 
00243     robotPose.getPose().translation.x + cos(angles[bestAngleAwayFromOwnGoalNoObstacles] + robotPose.getAngle()) * 2000,
00244     robotPose.getPose().translation.y + sin(angles[bestAngleAwayFromOwnGoalNoObstacles] + robotPose.getAngle()) * 2000,
00245     2, Drawings::ps_solid, Drawings::red
00246     );
00247 
00248 
00249 
00250   LINE(behavior_kickAnglesRadar, 
00251     0, 0, 
00252     cos(angles[bestAngleToOpponentGoalNoObstacles]) * 1000,
00253     sin(angles[bestAngleToOpponentGoalNoObstacles]) * 1000,
00254     40, Drawings::ps_solid, Drawings::red
00255     );
00256   LINE(behavior_kickAngles, 
00257     robotPose.getPose().translation.x, 
00258     robotPose.getPose().translation.y, 
00259     robotPose.getPose().translation.x + cos(angles[bestAngleToOpponentGoalNoObstacles] + robotPose.getAngle()) * 1000,
00260     robotPose.getPose().translation.y + sin(angles[bestAngleToOpponentGoalNoObstacles] + robotPose.getAngle()) * 1000,
00261     2, Drawings::ps_solid, Drawings::red
00262     );
00263 
00264   LINE(behavior_kickAngles, 
00265     robotPose.getPose().translation.x, 
00266     robotPose.getPose().translation.y, 
00267     robotPose.getPose().translation.x + cos(angles[angleToPointBehindOpponentGoal] + robotPose.getAngle()) * 1000,
00268     robotPose.getPose().translation.y + sin(angles[angleToPointBehindOpponentGoal] + robotPose.getAngle()) * 1000,
00269     2, Drawings::ps_solid, Drawings::yellow
00270     );
00271 
00272 
00273   LINE(behavior_kickAnglesRadar, 
00274     0, 0, 
00275     cos(angles[bestAngleToOpponentGoal]) * 1000,
00276     sin(angles[bestAngleToOpponentGoal]) * 1000,
00277     20, Drawings::ps_solid, Drawings::blue
00278     );
00279   LINE(behavior_kickAngles, 
00280     robotPose.getPose().translation.x, 
00281     robotPose.getPose().translation.y, 
00282     robotPose.getPose().translation.x + cos(angles[bestAngleToOpponentGoal] + robotPose.getAngle()) * 1000,
00283     robotPose.getPose().translation.y + sin(angles[bestAngleToOpponentGoal] + robotPose.getAngle()) * 1000,
00284     2, Drawings::ps_solid, Drawings::blue
00285     );
00286 */
00287 
00288 /*
00289   // goal kick angle ///////////
00290   double angle;
00291 //  if(motionInfo.executedMotionRequest.walkType != MotionRequest::turnWithBall)
00292   if(headControlMode.headControlMode != HeadControlMode::catchBall)
00293   {
00294     angle = obstaclesModel.getAngleOfLargeGapInRange2(0, pi, ObstaclesModel::searchLeftAndRight);
00295   }
00296   else if(motionInfo.executedMotionRequest.walkRequest.walkParams.rotation < 0)
00297   {
00298     angle = obstaclesModel.getAngleOfLargeGapInRange2(0, pi, ObstaclesModel::searchRight);
00299   }
00300   else
00301   {
00302     angle = obstaclesModel.getAngleOfLargeGapInRange2(0, pi, ObstaclesModel::searchLeft);
00303   }
00304 
00305   angles[goalieGoalKickAngle] = normalize(angle + robotPose.getAngle());
00306   if(toDegrees(angles[goalieGoalKickAngle]) > 65) angles[goalieGoalKickAngle] = fromDegrees(65);
00307   if(toDegrees(angles[goalieGoalKickAngle]) < -65) angles[goalieGoalKickAngle] = fromDegrees(-65);
00308   angles[goalieGoalKickAngle] = normalize(angles[goalieGoalKickAngle] - robotPose.getAngle());
00309 
00310   if(robotPose.rotation > fromDegrees(95) || robotPose.rotation < fromDegrees(-95) )
00311   {
00312     angles[goalieGoalKickAngle] = angles[bestAngleAwayFromOwnGoal];
00313   }
00314 */
00315   angles[goalieGoalKickAngle] = -robotPose.getAngle();
00316 
00317 /*
00318   LINE(behavior_kickAnglesRadar, 
00319     0, 0, 
00320     cos(goalieGoalKickAngle) * 1000,
00321     sin(goalieGoalKickAngle) * 1000,
00322     20, Drawings::ps_solid, Drawings::green
00323     );
00324   LINE(behavior_kickAngles, 
00325     robotPose.getPose().translation.x, 
00326     robotPose.getPose().translation.y,
00327     robotPose.getPose().translation.x + cos(goalieGoalKickAngle + robotPose.getAngle()) * 1000,
00328     robotPose.getPose().translation.y + sin(goalieGoalKickAngle + robotPose.getAngle()) * 1000,
00329     2, Drawings::ps_solid, Drawings::green
00330     );
00331 
00332   DEBUG_DRAWING_FINISHED(behavior_kickAnglesRadar);
00333   DEBUG_DRAWING_FINISHED(behavior_kickAngles);
00334 */
00335 }
00336 
00337 double AngleSymbols::getAngle(Angles id)
00338 {
00339   return angles[id];
00340 }
00341 
00342 void AngleSymbols::drawAngleShownByLeds()
00343 {
00344   LINE(behavior_kickAngles, 
00345     robotPose.getPose().translation.x, 
00346     robotPose.getPose().translation.y,
00347     robotPose.getPose().translation.x + cos(angles[angleShownByLEDs] + robotPose.getAngle()) * 1500,
00348     robotPose.getPose().translation.y + sin(angles[angleShownByLEDs] + robotPose.getAngle()) * 1500,
00349     30, Drawings::ps_solid, Drawings::light_gray
00350     );
00351 
00352   DEBUG_DRAWING_FINISHED(behavior_kickAngles);
00353 }
00354 
00355 /*
00356 * Change Log
00357 * 
00358 * $Log: AngleSymbols.cpp,v $
00359 * Revision 1.2  2004/06/23 19:31:10  juengel
00360 * Added angle "undefined"
00361 *
00362 * Revision 1.1  2004/06/22 18:48:56  juengel
00363 * kickAngles clean up
00364 *
00365 */
00366 

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