00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "GT2005ConfigurationSymbols.h"
00010 #include "Tools/FieldDimensions.h"
00011 #include "Tools/Debugging/Trace.h"
00012
00013 GT2005ConfigurationSymbols::GT2005ConfigurationSymbols(
00014 BehaviorControlInterfaces& interfaces)
00015 : BehaviorControlInterfaces(interfaces)
00016 {
00017
00018 switch (getPlayer().getPlayerNumber())
00019 {
00020 case Player::one:
00021 kickoff_role = BehaviorTeamMessage::goalie;
00022 break;
00023 case Player::two:
00024 kickoff_role = BehaviorTeamMessage::defensiveSupporter;
00025 break;
00026 case Player::three:
00027 kickoff_role = BehaviorTeamMessage::offensiveSupporter;
00028 break;
00029 case Player::four:
00030 kickoff_role = BehaviorTeamMessage::striker;
00031 break;
00032 }
00033 currentKickoff = 0;
00034
00035 goalie.x = xPosOwnGroundline + 100.0;
00036 goalie.y = 50;
00037
00038 defensiveSupporter.x = xPosOwnGroundline / 2 - 100;
00039 defensiveSupporter.y = -300.0;
00040
00041
00042 offensiveSupporterOpponentKickoff.x = xPosOwnGroundline / 2 - 100;
00043 offensiveSupporterOpponentKickoff.y = -1000.0;
00044
00045 strikerOpponentKickoff.x = xPosOwnGroundline / 2 - 100;
00046 strikerOpponentKickoff.y = 600.0;
00047
00048
00049 offensiveSupporterOwnKickoff[0].x = -200.0;
00050 offensiveSupporterOwnKickoff[0].y = -800.0;
00051 offensiveSupporterOwnKickoffAngle[0] = 0.0;
00052 strikerOwnKickoff[0].x = -130.0;
00053 strikerOwnKickoff[0].y = 130.0;
00054 strikerOwnKickoffAngle[0] = -45.0;
00055
00056
00057 offensiveSupporterOwnKickoff[1].x = -200.0;
00058 offensiveSupporterOwnKickoff[1].y = 800.0;
00059 offensiveSupporterOwnKickoffAngle[1] = 0.0;
00060 strikerOwnKickoff[1].x = -130.0;
00061 strikerOwnKickoff[1].y = -130.0;
00062 strikerOwnKickoffAngle[1] = 45.0;
00063
00064 }
00065
00066 void GT2005ConfigurationSymbols::registerSymbols(Xabsl2Engine& engine)
00067 {
00068
00069 engine.registerEnumeratedInputSymbol("kickoff.role", (int *)&kickoff_role);
00070 engine.registerEnumeratedInputSymbolEnumElement("kickoff.role", "kickoff.role.kickoff-goalie", BehaviorTeamMessage::goalie);
00071 engine.registerEnumeratedInputSymbolEnumElement("kickoff.role", "kickoff.role.kickoff-striker", BehaviorTeamMessage::striker);
00072 engine.registerEnumeratedInputSymbolEnumElement("kickoff.role", "kickoff.role.kickoff-defensive-supporter", BehaviorTeamMessage::defensiveSupporter);
00073 engine.registerEnumeratedInputSymbolEnumElement("kickoff.role", "kickoff.role.kickoff-offensive-supporter", BehaviorTeamMessage::offensiveSupporter);
00074 engine.registerDecimalInputSymbol("kickoff.rolenumber",this,
00075 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getKickOffRoleNumber);
00076
00077 engine.registerDecimalInputSymbol("current-kickoff-variant",this,
00078 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getCurrentKickoff);
00079
00080 engine.registerDecimalInputSymbol("own-kickoff.angle",this,
00081 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOwnKickoffAngle);
00082 engine.registerDecimalInputSymbol("own-kickoff.x",this,
00083 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOwnKickoffX);
00084 engine.registerDecimalInputSymbol("own-kickoff.y",this,
00085 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOwnKickoffY);
00086
00087 engine.registerDecimalInputSymbol("opponent-kickoff.angle",this,
00088 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOpponentKickoffAngle);
00089 engine.registerDecimalInputSymbol("opponent-kickoff.x",this,
00090 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOpponentKickoffX);
00091 engine.registerDecimalInputSymbol("opponent-kickoff.y",this,
00092 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getOpponentKickoffY);
00093
00094
00095 engine.registerDecimalInputFunction("kickoff.x",this,
00096 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getKickoffX);
00097 engine.registerDecimalInputFunctionParameter("kickoff.x","kickoff.x.role",role);
00098 engine.registerDecimalInputFunctionParameter("kickoff.x","kickoff.x.ownkickoff",ownKickOff);
00099
00100 engine.registerDecimalInputFunction("kickoff.y",this,
00101 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getKickoffY);
00102 engine.registerDecimalInputFunctionParameter("kickoff.y","kickoff.y.role",role);
00103 engine.registerDecimalInputFunctionParameter("kickoff.y","kickoff.y.ownkickoff",ownKickOff);
00104
00105 engine.registerDecimalInputFunction("kickoff.angle",this,
00106 (double (Xabsl2FunctionProvider::*)())>2005ConfigurationSymbols::getKickoffAngle);
00107 engine.registerDecimalInputFunctionParameter("kickoff.angle","kickoff.angle.role",role);
00108 engine.registerDecimalInputFunctionParameter("kickoff.angle","kickoff.angle.ownkickoff",ownKickOff);
00109 }
00110
00111 void GT2005ConfigurationSymbols::update()
00112 {
00113 currentKickoff = gameControlData.getOpponentTeam().score % numOfKickoff;
00114
00115
00116 double radius = 250.0;
00117
00118 double leftAbs = fromDegrees(10.0);
00119 double rightAbs = fromDegrees(55.0);
00120 double freeWidth = fromDegrees(15.0);
00121
00122 double step = fromDegrees(5.0);
00123 double bestAngle = 0.0;
00124 double bestDist = 0.0;
00125
00126 double start = leftAbs,
00127 end = rightAbs;
00128 enum { left, right } direction = left;
00129
00130 if (currentKickoff % 2 == 0)
00131 {
00132 start *= -1;
00133 end *= -1;
00134 step *= -1;
00135 direction = right;
00136 }
00137
00138 for(
00139 double ang = start;
00140 (direction == left && ang <= end) || (direction == right && ang >= end);
00141 ang += step
00142 )
00143 {
00144 double currDist = obstaclesModel.getDistanceInCorridor(ang, freeWidth);
00145 double angAbs = ang - robotPose.getAngle();
00146 currDist = obstaclesModel.getDistanceInDirection(angAbs, freeWidth);
00147 if(currDist > bestDist)
00148 {
00149 bestDist = currDist;
00150 bestAngle = ang;
00151 }
00152 }
00153
00154 double posX = - cos ( bestAngle ) * radius;
00155 double posY = - sin ( bestAngle ) * radius;
00156
00157 obstacleKickoff.translation.x = posX;
00158 obstacleKickoff.translation.y = posY;
00159 obstacleKickoff.fromAngle(toDegrees(bestAngle));
00160 computeKickoffRole();
00161
00162 DEBUG_RESPONSE("KickOff:Role:output",OUTPUT(idText,text,"kickoffrole: "<<kickoff_role));
00163 DEBUG_RESPONSE("KickOff:Role:goalie",kickoff_role = BehaviorTeamMessage::goalie;return;);
00164 DEBUG_RESPONSE("KickOff:Role:defence",kickoff_role = BehaviorTeamMessage::defensiveSupporter;return;);
00165 DEBUG_RESPONSE("KickOff:Role:offence",kickoff_role = BehaviorTeamMessage::offensiveSupporter;return;);
00166 DEBUG_RESPONSE("KickOff:Role:striker",kickoff_role = BehaviorTeamMessage::striker;return;);
00167 }
00168
00169 double GT2005ConfigurationSymbols::getCurrentKickoff()
00170 {
00171 return currentKickoff;
00172 }
00173
00174 double GT2005ConfigurationSymbols::getOwnKickoffAngle()
00175 {
00176 switch (getPlayer().getPlayerNumber())
00177 {
00178 case Player::one:
00179 case Player::two:
00180 default:
00181 return 0;
00182 case Player::three:
00183 return offensiveSupporterOwnKickoffAngle[currentKickoff];
00184 case Player::four:
00185 return getOwnKickoffAngleByObstacles();
00186
00187 }
00188 }
00189
00190 double GT2005ConfigurationSymbols::getOwnKickoffX()
00191 {
00192 switch (getPlayer().getPlayerNumber())
00193 {
00194 case Player::one:
00195 default:
00196 return goalie.x;
00197 case Player::two:
00198 return defensiveSupporter.x;
00199 case Player::three:
00200 return offensiveSupporterOwnKickoff[currentKickoff].x;
00201 case Player::four:
00202 return getOwnKickoffXByObstacles();
00203
00204 }
00205 }
00206
00207 double GT2005ConfigurationSymbols::getOwnKickoffY()
00208 {
00209 switch (getPlayer().getPlayerNumber())
00210 {
00211 case Player::one:
00212 default:
00213 return goalie.y;
00214 case Player::two:
00215 return defensiveSupporter.y;
00216 case Player::three:
00217 return offensiveSupporterOwnKickoff[currentKickoff].y;
00218 case Player::four:
00219 return getOwnKickoffYByObstacles();
00220
00221 }
00222 }
00223
00224 double GT2005ConfigurationSymbols::getOwnKickoffXByObstacles()
00225 {
00226 return obstacleKickoff.translation.x;
00227 }
00228
00229 double GT2005ConfigurationSymbols::getOwnKickoffYByObstacles()
00230 {
00231 return obstacleKickoff.translation.y;
00232 }
00233
00234 double GT2005ConfigurationSymbols::getOwnKickoffAngleByObstacles()
00235 {
00236 return obstacleKickoff.getAngle();
00237 }
00238
00239 double GT2005ConfigurationSymbols::getOpponentKickoffAngle()
00240 {
00241 switch (getPlayer().getPlayerNumber())
00242 {
00243 case Player::one:
00244 case Player::two:
00245 case Player::three:
00246 case Player::four:
00247 default:
00248 return 0;
00249 }
00250 }
00251
00252 double GT2005ConfigurationSymbols::getOpponentKickoffX()
00253 {
00254 switch (getPlayer().getPlayerNumber())
00255 {
00256 case Player::one:
00257 default:
00258 return goalie.x;
00259 case Player::two:
00260 return defensiveSupporter.x;
00261 case Player::three:
00262 return offensiveSupporterOpponentKickoff.x;
00263 case Player::four:
00264 return strikerOpponentKickoff.x;
00265 }
00266 }
00267
00268 double GT2005ConfigurationSymbols::getOpponentKickoffY()
00269 {
00270 switch (getPlayer().getPlayerNumber())
00271 {
00272 case Player::one:
00273 default:
00274 return goalie.y;
00275 case Player::two:
00276 return defensiveSupporter.y;
00277 case Player::three:
00278 return offensiveSupporterOpponentKickoff.y;
00279 case Player::four:
00280 return strikerOpponentKickoff.y;
00281 }
00282 }
00283
00284 double GT2005ConfigurationSymbols::getKickoffX()
00285 {
00286 if(ownKickOff)
00287 {
00288 switch ((int)role )
00289 {
00290 case BehaviorTeamMessage::goalie:
00291 default:
00292 return goalie.x;
00293 case BehaviorTeamMessage::defensiveSupporter:
00294 return defensiveSupporter.x;
00295 case BehaviorTeamMessage::offensiveSupporter:
00296 return offensiveSupporterOwnKickoff[currentKickoff].x;
00297 case BehaviorTeamMessage::striker:
00298 return getOwnKickoffXByObstacles();
00299
00300 }
00301 }else{
00302 switch ((int)role )
00303 {
00304 case BehaviorTeamMessage::goalie:
00305 default:
00306 return goalie.x;
00307 case BehaviorTeamMessage::defensiveSupporter:
00308 return defensiveSupporter.x;
00309 case BehaviorTeamMessage::offensiveSupporter:
00310 return offensiveSupporterOpponentKickoff.x;
00311 case BehaviorTeamMessage::striker:
00312 return strikerOpponentKickoff.x;
00313 }
00314 }
00315 return 0;
00316 }
00317
00318 double GT2005ConfigurationSymbols::getKickoffY()
00319 {
00320 if(ownKickOff)
00321 {
00322 switch ((int)role)
00323 {
00324 case BehaviorTeamMessage::goalie:
00325 default:
00326 return goalie.y;
00327 case BehaviorTeamMessage::defensiveSupporter:
00328 return defensiveSupporter.y;
00329 case BehaviorTeamMessage::offensiveSupporter:
00330 return offensiveSupporterOwnKickoff[currentKickoff].y;
00331 case BehaviorTeamMessage::striker:
00332 return getOwnKickoffYByObstacles();
00333
00334 }
00335 }else{
00336 switch ((int)role)
00337 {
00338 case BehaviorTeamMessage::goalie:
00339 default:
00340 return goalie.y;
00341 case BehaviorTeamMessage::defensiveSupporter:
00342 return defensiveSupporter.y;
00343 case BehaviorTeamMessage::offensiveSupporter:
00344 return offensiveSupporterOpponentKickoff.y;
00345 case BehaviorTeamMessage::striker:
00346 return strikerOpponentKickoff.y;
00347 }
00348 }
00349 return 0;
00350 }
00351
00352
00353 double GT2005ConfigurationSymbols::getKickoffAngle()
00354 {
00355 if(ownKickOff)
00356 {
00357 switch ((int)role)
00358 {
00359 case BehaviorTeamMessage::goalie:
00360 case BehaviorTeamMessage::defensiveSupporter:
00361 default:
00362 return 0;
00363 case BehaviorTeamMessage::offensiveSupporter:
00364 return offensiveSupporterOwnKickoffAngle[currentKickoff];
00365 case BehaviorTeamMessage::striker:
00366 return getOwnKickoffAngleByObstacles();
00367
00368 }
00369 }else{
00370 return 0;
00371 }
00372 return 0;
00373 }
00374
00375
00376 double GT2005ConfigurationSymbols::getTimeToReachKickoffPose( BehaviorTeamMessage::DynamicRole role, Vector2<double> pos)
00377 {
00378
00379 this->role = role;
00380 if (gameControlData.getKickoffTeam()==GameControlData::ownTeam)
00381 this->ownKickOff = 1;
00382 else
00383 this->ownKickOff = 0;
00384
00385 Vector2<double>dpos(getKickoffX(),getKickoffY());
00386 return (dpos-pos).abs();
00387 }
00388
00389 void GT2005ConfigurationSymbols::computeKickoffRole()
00390 {
00391
00392 if (gameControlData.data.state != GameControlData::ready )
00393 {
00394 return;
00395 }
00396
00397 Player::playerNumber playernumber;
00398 playernumber = getPlayer().getPlayerNumber();
00399
00400 if (playernumber == Player::one)
00401 {
00402 kickoff_role = BehaviorTeamMessage::goalie;
00403 return;
00404 }
00405
00406 bool wlan
00407 = (teamMessageCollection[0].isActual(5000)
00408 && teamMessageCollection[1].isActual(5000)
00409 && teamMessageCollection[2].isActual(5000));
00410
00411 DEBUG_RESPONSE("KickOff:WLan:output",OUTPUT(idText,text,"KickOffRole Wlan: "<<wlan));
00412 DEBUG_RESPONSE("KickOff:WLan:no",wlan =false;);
00413 DEBUG_RESPONSE("KickOff:WLan:yes",wlan =true;);
00414
00415
00416 if(!wlan)
00417 {
00418 switch (playernumber)
00419 {
00420 case Player::one:
00421 kickoff_role = BehaviorTeamMessage::goalie;
00422 break;
00423 case Player::two:
00424 kickoff_role = BehaviorTeamMessage::defensiveSupporter;
00425 break;
00426 case Player::three:
00427 kickoff_role = BehaviorTeamMessage::offensiveSupporter;
00428 break;
00429 case Player::four:
00430 kickoff_role = BehaviorTeamMessage::striker;
00431 break;
00432 }
00433 return;
00434 }
00435
00436 double time[Player::numOfPlayerNumbers -1][BehaviorTeamMessage::sizeofKickoff];
00437 Vector2<double> pos = robotPose.translation;
00438 for(int j = 0; j < BehaviorTeamMessage::sizeofKickoff; ++j)
00439 {
00440 kickoffTimes[j].add( (int)(getTimeToReachKickoffPose( (BehaviorTeamMessage::DynamicRole)(j+1), pos)));
00441 time[0][j] = (double)kickoffTimes[j].getSum() / (double)kickoffTimes[j].getNumberOfEntries();
00442 outgoingBehaviorTeamMessage.estimatedTimeToReachKickoff[j] = time[0][j];
00443
00444 }
00445 int h = 1;
00446 for(int i = 0; i < 3; ++i)
00447 {
00448 int num = teamMessageCollection[i].playerNumberOfSender;
00449
00450
00451 if (num == 0)
00452 continue;
00453 if (num > 3)
00454 continue;
00455 if (h>2)
00456 {
00457 OUTPUT(idText,text,"Error more than 3 player are not a goalie");
00458 OUTPUT(idText,text,"own playernumber: "<< playernumber);
00459 OUTPUT(idText,text,"actual message playernumber: "<< num);
00460 continue;
00461 }
00462
00463 for(int j = 0; j < 3; ++j)
00464 {
00465 time[h][j] = teamMessageCollection[i].behaviorTeamMessage.estimatedTimeToReachKickoff[j];
00466
00467
00468 }
00469 h++;
00470 }
00471
00472 double best = 99999999999999999.0 ;
00473 int bestper = -1;
00474 int per[3*2][3] = { {0,1,2},{0,2,1},{1,0,2},{1,2,0},{2,0,1},{2,1,0} };
00475 for(int i = 0; i < 3*2*1; ++i)
00476 {
00477 double pervalue = time[0][per[i][0]];
00478 if (pervalue < time[1][per[i][1]])
00479 pervalue = time[1][per[i][1]];
00480 if (pervalue < time[2][per[i][2]])
00481 pervalue = time[2][per[i][2]];
00482 pervalue = 3*pervalue
00483 + time[0][per[i][0]]
00484 + time[1][per[i][1]]
00485 + time[2][per[i][2]];
00486 pervalue = pervalue/6;
00487 if( pervalue < best)
00488 {
00489 best = pervalue;
00490 bestper = i;
00491 }
00492 }
00493
00494 kickoff_role = (BehaviorTeamMessage::DynamicRole)(per[bestper][0]+1);
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577 }
00578
00579 double GT2005ConfigurationSymbols::getKickOffRoleNumber()
00580 {
00581 return kickoff_role;
00582 }
00583