00001
00002
00003
00004
00005
00006
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
00024 engine.registerDecimalInputSymbol("robot-number", this,
00025 (double(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getRobotNumber);
00026
00027
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
00035 engine.registerDecimalInputSymbol("estimated-time-to-reach-ball", (double *)&estimatedTimeToReachBall);
00036
00037
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
00049 engine.registerBooleanInputSymbol("another-player-is-in-ready-state",
00050 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getAnotherPlayerIsInReadyState);
00051
00052
00053 engine.registerBooleanInputSymbol("another-player-is-in-initial-state",
00054 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getAnotherPlayerIsInInitialState);
00055
00056
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
00062 engine.registerBooleanInputSymbol("another-teammate-is-performing-a-kick",
00063 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getAnotherTeammateIsPerformingAKick);
00064
00065
00066 engine.registerBooleanInputSymbol("the-striker-is-playing-near-the-opponent-goal",
00067 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getTheStrikerIsPlayingNearTheOpponentGoal);
00068
00069
00070 engine.registerBooleanInputSymbol("the-striker-is-not-playing-near-the-opponent-goal",
00071 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOpponentGoal);
00072
00073
00074 engine.registerBooleanInputSymbol("the-striker-is-playing-near-the-own-goal",
00075 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getTheStrikerIsPlayingNearTheOwnGoal);
00076
00077
00078 engine.registerBooleanInputSymbol("the-striker-is-not-playing-near-the-own-goal",
00079 this,(bool(Xabsl2FunctionProvider::*)())>2004StrategySymbols::getTheStrikerIsNotPlayingNearTheOwnGoal);
00080
00081
00082 engine.registerDecimalInputSymbol("goalie-max-position-speed", this,
00083 (double (Xabsl2FunctionProvider::*)())>2004StrategySymbols::getGoalieMaxPositionSpeed);
00084
00085 engine.registerDecimalInputSymbol("search-ball.x", this,
00086 (double (Xabsl2FunctionProvider::*)())>2004StrategySymbols::getSearchBallX);
00087
00088
00089 engine.registerDecimalInputFunction("get-angle-to-teammate",this,
00090 (double (Xabsl2FunctionProvider::*)())>2004StrategySymbols::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
00110 role = BehaviorTeamMessage::goalie;
00111 return;
00112 }
00113
00114
00115
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
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
00171
00172
00173 double minTeammateTime = 100000.0;
00174
00175 for (i = 0; i < teamMessageCollection.numberOfTeamMessages; i++ )
00176 {
00177 if ( teamMessageCollection[i].isActual() )
00178 {
00179 if ( teamMessageCollection[i].behaviorTeamMessage.dynamicRole != BehaviorTeamMessage::goalie
00180 && teamMessageCollection[i].behaviorTeamMessage.gameState == BehaviorTeamMessage::playing)
00181
00182
00183
00184 {
00185 double time =
00186 teamMessageCollection[i].behaviorTeamMessage.estimatedTimeToReachBall;
00187
00188
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
00201 if (role == BehaviorTeamMessage::striker)
00202 minTeammateTime += 1000.0;
00203
00204
00205 if ( estimatedTimeToReachBall < minTeammateTime )
00206 {
00207 role = BehaviorTeamMessage::striker;
00208 return;
00209 }
00210
00211
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
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
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
00269 estimatedTimeToReachBall = Geometry::distanceTo(robotPose.translation, ballModel.seen) / 0.2;
00270
00271
00272
00273
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
00288 estimatedTimeToReachBall += 2.0 * SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen);
00289
00290
00291
00292
00293
00294
00295
00296
00297 }
00298
00299 double GT2004StrategySymbols::getAngleToTeammate()
00300 {
00301
00302
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
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
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500