00001
00002
00003
00004
00005
00006
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
00182
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
00224
00225
00226
00227
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
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
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
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
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520