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

Modules/BehaviorControl/GT2004BehaviorControl/GT2004Symbols/GT2004StrategySymbols.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file GT2004StrategySymbols.cpp
00003 *
00004 * Implementation of class GT2004StrategySymbols.
00005 *
00006 * @author Martin Lötzsch
00007 */
00008 
00009 #include "GT2004StrategySymbols.h"
00010 #include "Tools/FieldDimensions.h"
00011 
00012 
00013 GT2004StrategySymbols::GT2004StrategySymbols(BehaviorControlInterfaces& interfaces)
00014 : BehaviorControlInterfaces(interfaces),
00015 doProfile(GT2004StrategySymbols::dontDoProfiling), writeProfile(GT2004StrategySymbols::dontWriteProfiles)
00016 {
00017   role = BehaviorTeamMessage::goalie;
00018   estimatedTimeToReachBall = 0.0;
00019 }
00020 
00021 void GT2004StrategySymbols::registerSymbols(Xabsl2Engine& engine)
00022 {
00023   // "robot-number"
00024   engine.registerDecimalInputSymbol("robot-number", this,
00025     (double(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getRobotNumber);
00026   
00027   // "role"
00028   engine.registerEnumeratedInputSymbol("role", (int *)&role);
00029   engine.registerEnumeratedInputSymbolEnumElement("role", "goalie", BehaviorTeamMessage::goalie);
00030   engine.registerEnumeratedInputSymbolEnumElement("role", "striker", BehaviorTeamMessage::striker);
00031   engine.registerEnumeratedInputSymbolEnumElement("role", "defensive-supporter", BehaviorTeamMessage::defensiveSupporter);
00032   engine.registerEnumeratedInputSymbolEnumElement("role", "offensive-supporter", BehaviorTeamMessage::offensiveSupporter);
00033   
00034   // "estimated-time-to-reach-ball"
00035   engine.registerDecimalInputSymbol("estimated-time-to-reach-ball", (double *)&estimatedTimeToReachBall);
00036   
00037   // "sent-game-state"
00038   engine.registerEnumeratedOutputSymbol("sent-game-state",(int*)&outgoingBehaviorTeamMessage.gameState);
00039   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.sleep",BehaviorTeamMessage::sleep);
00040   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.initial",BehaviorTeamMessage::initial);
00041   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.ready",BehaviorTeamMessage::ready);
00042   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.playing",BehaviorTeamMessage::playing);
00043   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.penalized",BehaviorTeamMessage::penalized);
00044   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.finished",BehaviorTeamMessage::finished);
00045   engine.registerEnumeratedOutputSymbolEnumElement("sent-game-state","sent-game-state.set",BehaviorTeamMessage::set);
00046   
00047   
00048   // "another-player-is-in-ready-state"
00049   engine.registerBooleanInputSymbol("another-player-is-in-ready-state",
00050     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getAnotherPlayerIsInReadyState);
00051   
00052   // "another-player-is-in-initial-state"
00053   engine.registerBooleanInputSymbol("another-player-is-in-initial-state",
00054     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getAnotherPlayerIsInInitialState);
00055   
00056   // "team-message"
00057   engine.registerEnumeratedOutputSymbol("team-message",(int*)&outgoingBehaviorTeamMessage.message);
00058   engine.registerEnumeratedOutputSymbolEnumElement("team-message","team-message.none", BehaviorTeamMessage::none);
00059   engine.registerEnumeratedOutputSymbolEnumElement("team-message","team-message.performing-a-kick",BehaviorTeamMessage::performingAKick);
00060   
00061   // "another-teammate-is-performing-a-kick"
00062   engine.registerBooleanInputSymbol("another-teammate-is-performing-a-kick",
00063     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getAnotherTeammateIsPerformingAKick);
00064   
00065   // "the-striker-is-playing-near-the-opponent-goal"
00066   engine.registerBooleanInputSymbol("the-striker-is-playing-near-the-opponent-goal",
00067     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getTheStrikerIsPlayingNearTheOpponentGoal);
00068   
00069   // "the-striker-is-not-playing-near-the-opponent-goal"
00070   engine.registerBooleanInputSymbol("the-striker-is-not-playing-near-the-opponent-goal",
00071     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOpponentGoal);
00072   
00073   // "the-striker-is-playing-near-the-own-goal"
00074   engine.registerBooleanInputSymbol("the-striker-is-playing-near-the-own-goal",
00075     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getTheStrikerIsPlayingNearTheOwnGoal);
00076   
00077   // "the-striker-is-not-playing-near-the-own-goal"
00078   engine.registerBooleanInputSymbol("the-striker-is-not-playing-near-the-own-goal",
00079     this,(bool(Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOwnGoal);
00080 
00081   // "goalie-max-position-speed"
00082   engine.registerDecimalInputSymbol("goalie-max-position-speed", this,
00083     (double (Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getGoalieMaxPositionSpeed);
00084     
00085   engine.registerDecimalInputSymbol("search-ball.x", this,
00086     (double (Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getSearchBallX);
00087   
00088   // "get-angle-to-teammate
00089   engine.registerDecimalInputFunction("get-angle-to-teammate",this,
00090     (double (Xabsl2FunctionProvider::*)())&GT2004StrategySymbols::getAngleToTeammate);
00091   engine.registerDecimalInputFunctionParameter("get-angle-to-teammate","get-angle-to-teammate.index",GT2004StrategySymbols::angleToTeammateIndex);
00092 }
00093 
00094 void GT2004StrategySymbols::update()
00095 {
00096   estimateTimeToReachBall();
00097   computeRole();
00098   
00099   outgoingBehaviorTeamMessage.estimatedTimeToReachBall = estimatedTimeToReachBall;
00100   outgoingBehaviorTeamMessage.dynamicRole = role;
00101 }
00102 
00103 void GT2004StrategySymbols::computeRole()
00104 {
00105   int i;
00106   
00107   if (getPlayer().getPlayerNumber() == Player::one)
00108   {
00109     // no role changes for the goalie
00110     role = BehaviorTeamMessage::goalie;
00111     return;
00112   }
00113 
00114   
00115   // if in the goalzone and ball lies within angle infront, role = striker
00116   if(FieldDimensions::distanceToOpponentPenaltyArea(robotPose.translation) < 400
00117     && SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 1000)
00118   {
00119     if(ballModel.seen.ballInFrontOfOpponentGoal)
00120     {
00121         role = BehaviorTeamMessage::striker;
00122         return;
00123     }
00124   }
00125 
00126   // fall-back if no wlan
00127   if (SystemCall::getTimeSince(teamMessageCollection[0].lastReceivedTimeStamp) > 5000 
00128     && SystemCall::getTimeSince(teamMessageCollection[1].lastReceivedTimeStamp) > 5000
00129     && SystemCall::getTimeSince(teamMessageCollection[2].lastReceivedTimeStamp) > 5000)
00130   {
00131     switch(getPlayer().getPlayerNumber())
00132     {
00133     case Player::two:
00134       if (SystemCall::getTimeSince (ballModel.seen.timeWhenLastSeen) > 5000)
00135         role = BehaviorTeamMessage::defensiveSupporter;
00136       else if(role == BehaviorTeamMessage::defensiveSupporter)
00137       { 
00138         if (ballModel.seen.x < 400)
00139           role = BehaviorTeamMessage::striker;
00140         else
00141           role = BehaviorTeamMessage::defensiveSupporter;
00142       } else {
00143         if (ballModel.seen.x < 600)
00144           role = BehaviorTeamMessage::striker;
00145         else
00146           role = BehaviorTeamMessage::defensiveSupporter;
00147       }
00148       break;
00149     case Player::three:
00150     case Player::four:
00151       if (SystemCall::getTimeSince (ballModel.seen.timeWhenLastSeen) > 5000)
00152         role = BehaviorTeamMessage::offensiveSupporter;
00153       else if(role == BehaviorTeamMessage::offensiveSupporter)
00154       { 
00155         if (ballModel.seen.x > -400)
00156           role = BehaviorTeamMessage::striker;
00157         else
00158           role = BehaviorTeamMessage::offensiveSupporter;
00159       } else {
00160         if (ballModel.seen.x > -600)
00161           role = BehaviorTeamMessage::striker;
00162         else
00163           role = BehaviorTeamMessage::offensiveSupporter;
00164       }
00165       break;
00166     }
00167     return;
00168   }
00169   
00170   // with wlan
00171   
00172   // estimate the closest other teammate to the ball
00173   double minTeammateTime = 100000.0;
00174   
00175   for (i = 0; i < teamMessageCollection.numberOfTeamMessages; i++ ) 
00176   {
00177     if ( teamMessageCollection[i].isActual() ) // only new messages
00178     {
00179       if ( teamMessageCollection[i].behaviorTeamMessage.dynamicRole != BehaviorTeamMessage::goalie 
00180         && teamMessageCollection[i].behaviorTeamMessage.gameState == BehaviorTeamMessage::playing)
00181         // the robot is not interested in 
00182         // (1) how fast the goalie can approach the ball 
00183         // (2) how fast a penalized field player can approach the ball
00184       {
00185         double time = 
00186           teamMessageCollection[i].behaviorTeamMessage.estimatedTimeToReachBall;
00187         
00188         // bonus for current striker
00189         if ( teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::striker ) 
00190           time -= 500.0;
00191         
00192         if (time < minTeammateTime ) 
00193         {
00194           minTeammateTime = time;
00195         }
00196       }
00197     }
00198   }
00199   
00200   // bonus for current striker
00201   if (role == BehaviorTeamMessage::striker)
00202     minTeammateTime += 1000.0;
00203   
00204   // assign striker-role if nearest to the ball
00205   if ( estimatedTimeToReachBall < minTeammateTime )
00206   {
00207     role = BehaviorTeamMessage::striker;
00208     return;
00209   }
00210   
00211   // assign supporting roles
00212   double maxTeammateX = (double)xPosOwnGroundline;
00213   for (i = 0; i < teamMessageCollection.numberOfTeamMessages; i++ ) 
00214   {
00215     if ( teamMessageCollection[i].isActual() )
00216     {
00217       if ( teamMessageCollection[i].behaviorTeamMessage.dynamicRole != BehaviorTeamMessage::striker 
00218         && teamMessageCollection[i].behaviorTeamMessage.dynamicRole != BehaviorTeamMessage::goalie 
00219         && teamMessageCollection[i].behaviorTeamMessage.gameState == BehaviorTeamMessage::playing)
00220       {
00221         double teammateX = 
00222           teamMessageCollection[i].robotPose.translation.x;
00223         
00224         // bonus for current offensive supporter
00225         if ( teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::offensiveSupporter ) 
00226           teammateX += 300.0;
00227         
00228         if (teammateX > maxTeammateX ) 
00229         {
00230           maxTeammateX = teammateX;
00231         }
00232       }
00233     }
00234   }
00235   
00236   // bonus for current offensive supporter
00237   if ( role == BehaviorTeamMessage::offensiveSupporter ) 
00238     maxTeammateX -= 300.0;
00239   
00240   if ( robotPose.translation.x >= maxTeammateX ) 
00241     role = BehaviorTeamMessage::offensiveSupporter;
00242   else 
00243     role = BehaviorTeamMessage::defensiveSupporter;
00244    
00245 }
00246 
00247 double GT2004StrategySymbols::getGoalieMaxPositionSpeed()
00248 {
00249   double maxSpeed = 150;
00250   double minDistance = 300; 
00251 
00252   double minSpeed = 60;
00253   double maxDistance = 1500;
00254 
00255   double ballDistance = Geometry::distanceTo(robotPose.getPose(),ballModel.seen);
00256 
00257   double speed = maxSpeed - ((ballDistance - minDistance) * maxSpeed) / (maxDistance ) ;
00258 
00259   speed = max(minSpeed, speed);
00260   speed = min(maxSpeed, speed);
00261 
00262   return speed;
00263 }
00264 
00265 void GT2004StrategySymbols::estimateTimeToReachBall()
00266 {
00267   
00268   // account for distance to ball
00269   estimatedTimeToReachBall = Geometry::distanceTo(robotPose.translation, ballModel.seen) / 0.2;
00270   
00271   // account if the robot is between the ball and the opponent goal
00272   
00273   // the position of the robot
00274   Vector2<double> robotPosition = robotPose.translation;
00275   double angleToLeftOpponentGoalPost = Geometry::angleTo(robotPosition, Vector2<double>(xPosOpponentGroundline,yPosLeftGoal));
00276   double angleToRightOpponentGoalPost = Geometry::angleTo(robotPosition, Vector2<double>(xPosOpponentGroundline,yPosRightGoal));
00277   if(angleToLeftOpponentGoalPost < angleToRightOpponentGoalPost)
00278   {
00279     angleToLeftOpponentGoalPost += pi2;
00280   }
00281   double angleToOpponentGoal= (angleToLeftOpponentGoalPost + angleToRightOpponentGoalPost) / 2.0;
00282   double absoluteAngleToBall = Geometry::angleTo(robotPosition,ballModel.seen);
00283   double angleBetweenBallAndOpponentGoal = normalize(angleToOpponentGoal - absoluteAngleToBall);
00284   
00285   estimatedTimeToReachBall += 400.0 * fabs(angleBetweenBallAndOpponentGoal);
00286   
00287   // longer if ball not seen
00288   estimatedTimeToReachBall += 2.0 * SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen);
00289   
00290   // test for obstacles
00291   /*
00292   if ( isOpponentBetweenRobotAndBall(robotPose) || 
00293   isOwnBetweenRobotAndBall (robotPose) )
00294   time += 5000.0;
00295   */
00296   
00297 }
00298 
00299 double GT2004StrategySymbols::getAngleToTeammate()
00300 {
00301   
00302   //OUTPUT(idText, text,"::nrofownplayer:"<<playerPoseCollection.numberOfOwnPlayers);
00303   
00304   
00305   if(1 <= playerPoseCollection.numberOfOwnPlayers)
00306   {
00307     return toDegrees(Geometry::angleTo(robotPose, playerPoseCollection.getOwnPlayerPose((int)angleToTeammateIndex).getPose().translation));
00308   }
00309   else
00310   {
00311     return toDegrees(Geometry::angleTo(robotPose,
00312       Vector2<double>(xPosOpponentGroundline,yPosCenterGoal)));
00313   }
00314 }
00315 
00316 bool GT2004StrategySymbols::getAnotherPlayerIsInReadyState()
00317 {
00318   for (int i=0; i<3;i++)
00319   {
00320     if (teamMessageCollection[i].isActual())
00321     {
00322       if (teamMessageCollection[i].behaviorTeamMessage.gameState 
00323         == BehaviorTeamMessage::ready)
00324       {
00325         return true;
00326       }
00327     }
00328   }
00329   return false;
00330 }
00331 
00332 bool GT2004StrategySymbols::getAnotherPlayerIsInInitialState()
00333 {
00334   for (int i=0; i<3;i++)
00335   {
00336     if (teamMessageCollection[i].isActual())
00337     {
00338       if (teamMessageCollection[i].behaviorTeamMessage.gameState 
00339         == BehaviorTeamMessage::initial)
00340       {
00341         return true;
00342       }
00343     }
00344   }
00345   return false;
00346 }
00347 
00348 bool GT2004StrategySymbols::getAnotherTeammateIsPerformingAKick()
00349 {
00350   for (int i=0; i<3;i++)
00351   {
00352     if (teamMessageCollection[i].isActual())
00353     {
00354       if (teamMessageCollection[i].behaviorTeamMessage.message
00355         == BehaviorTeamMessage::performingAKick)
00356       {
00357         return true;
00358       }
00359     }
00360   }
00361   return false;
00362 }
00363 
00364 bool GT2004StrategySymbols::getTheStrikerIsPlayingNearTheOpponentGoal()
00365 {
00366   for (int i=0; i<3;i++)
00367   {
00368     if (teamMessageCollection[i].isActual())
00369     {
00370       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::striker
00371         && teamMessageCollection[i].robotPose.translation.x > 1500)
00372       {
00373         return true;
00374       }
00375     }
00376   }
00377   return false;
00378 }
00379 
00380 bool GT2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOpponentGoal()
00381 {
00382   for (int i=0; i<3;i++)
00383   {
00384     if (teamMessageCollection[i].isActual())
00385     {
00386       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::striker
00387         && teamMessageCollection[i].robotPose.translation.x < 1300)
00388       {
00389         return true;
00390       }
00391     }
00392   }
00393   return false;
00394 }
00395 
00396 bool GT2004StrategySymbols::getTheStrikerIsPlayingNearTheOwnGoal()
00397 {
00398   for (int i=0; i<3;i++)
00399   {
00400     if (teamMessageCollection[i].isActual())
00401     {
00402       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::striker
00403         && teamMessageCollection[i].robotPose.translation.x < -1200)
00404       {
00405         return true;
00406       }
00407     }
00408   }
00409   return false;
00410 }
00411 
00412 bool GT2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOwnGoal()
00413 {
00414   for (int i=0; i<3;i++)
00415   {
00416     if (teamMessageCollection[i].isActual())
00417     {
00418       if (teamMessageCollection[i].behaviorTeamMessage.dynamicRole == BehaviorTeamMessage::striker
00419         && teamMessageCollection[i].robotPose.translation.x > -1000)
00420       {
00421         return true;
00422       }
00423     }
00424   }
00425   return false;
00426 }
00427 
00428 double GT2004StrategySymbols::getSearchBallX()
00429 {
00430   // fall-back if no wlan
00431   if (SystemCall::getTimeSince(teamMessageCollection[0].lastReceivedTimeStamp) > 5000 
00432     && SystemCall::getTimeSince(teamMessageCollection[1].lastReceivedTimeStamp) > 5000
00433     && SystemCall::getTimeSince(teamMessageCollection[2].lastReceivedTimeStamp) > 5000)
00434   {
00435     switch(getPlayer().getPlayerNumber())
00436     {
00437     case Player::two:
00438       return -1000;
00439     case Player::three:
00440       return 0;
00441     case Player::four:
00442     default:
00443       return 1000;
00444     }
00445   }
00446   else
00447   {
00448     switch (role)
00449     {
00450     case BehaviorTeamMessage::defensiveSupporter:
00451       return -1000;
00452     case BehaviorTeamMessage::offensiveSupporter:
00453       return 1000;
00454     case BehaviorTeamMessage::striker:
00455     default:
00456       return 0;
00457     }
00458   }
00459 }
00460 
00461 
00462 
00463 /*
00464 * Change Log
00465 * 
00466 * $Log: GT2004StrategySymbols.cpp,v $
00467 * Revision 1.8  2004/06/23 18:18:47  spranger
00468 * reintroduced ballModel.seen.ballInFrontOfOpponentGoal
00469 *
00470 * Revision 1.7  2004/06/18 11:11:26  risler
00471 * kick team messages clean up
00472 * intercept behavior improved
00473 *
00474 * Revision 1.6  2004/06/16 14:43:51  risler
00475 * added obstacles symbols
00476 * added symbol obstacles.opponent-close-to-ball
00477 *
00478 * Revision 1.5  2004/06/14 15:54:07  risler
00479 * improved no wavelan fallback role assignment, added hysteresis for supporter assignment
00480 *
00481 * Revision 1.4  2004/05/26 18:56:41  loetzsch
00482 * clean up in the behavior control interfaces
00483 *
00484 * Revision 1.3  2004/05/23 19:00:17  spranger
00485 * removed profiler-symbols
00486 *
00487 * Revision 1.2  2004/05/22 20:43:55  juengel
00488 * Renamed ballP_osition to ballModel.
00489 *
00490 * Revision 1.1.1.1  2004/05/22 17:18:04  cvsadm
00491 * created new repository GT2004_WM
00492 *
00493 * Revision 1.2  2004/05/03 14:33:20  loetzsch
00494 * some cleanup
00495 *
00496 * Revision 1.1  2004/05/02 13:23:45  juengel
00497 * Added GT2004BehaviorControl.
00498 *
00499 */
00500 

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