00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "BallSymbols.h"
00010 #include "Tools/Math/Geometry.h"
00011 #include "Tools/FieldDimensions.h"
00012
00013 BallSymbols::BallSymbols(const BehaviorControlInterfaces& interfaces) :
00014 BehaviorControlInterfaces(interfaces),
00015 ballIsHandledAtTheMoment(false),
00016 ballWasHandledInLastFrame(false),
00017 playBallPrecisely(false),
00018 ballPrecision(0)
00019 {
00020 }
00021
00022
00023 void BallSymbols::registerSymbols(Xabsl2Engine& engine)
00024 {
00025 engine.registerDecimalInputSymbol("ball.seen.distance",this,
00026 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenDistance);
00027 engine.registerDecimalInputSymbol("ball.seen.angle",this,
00028 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenAngle);
00029
00030 engine.registerDecimalInputSymbol("ball.number-of-images-with-ball-percept", this,
00031 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getNumberOfImagesWithBallPercept);
00032
00033 engine.registerDecimalInputSymbol("ball.number-of-images-without-ball-percept", this,
00034 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getNumberOfImagesWithoutBallPercept);
00035
00036 engine.registerBooleanInputSymbol("ball.ball-was-seen",&ballModel.ballWasSeen);
00037
00038 engine.registerDecimalInputSymbol("ball.seen.x",&(ballModel.seen.x));
00039 engine.registerDecimalInputSymbol("ball.seen.y",&(ballModel.seen.y));
00040 engine.registerDecimalInputSymbol("ball.seen.speed",this,
00041 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenSpeed);
00042 engine.registerDecimalInputSymbol("ball.seen.relative-speed.x",this,
00043 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenRelativeSpeedX);
00044 engine.registerDecimalInputSymbol("ball.seen.relative-speed.y",this,
00045 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenRelativeSpeedY);
00046 engine.registerDecimalInputSymbol("ball.seen.distance-to-own-penalty-area",this,
00047 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getDistanceSeenBallToOwnPenaltyArea);
00048 engine.registerDecimalInputSymbol("ball.seen.distance-x",this,
00049 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenDistanceX);
00050 engine.registerDecimalInputSymbol("ball.seen.distance-y",this,
00051 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getSeenDistanceY);
00052 engine.registerDecimalInputSymbol("ball.time-since-last-seen",this,
00053 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getTimeSinceLastSeen);
00054 engine.registerDecimalInputSymbol("ball.consecutively-seen-time",this,
00055 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getConsecutivelySeenTime);
00056 engine.registerDecimalInputSymbol("ball.time-since-last-seen-consecutively",this,
00057 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getTimeSinceLastSeenConsecutively);
00058 engine.registerBooleanInputSymbol("ball.just-seen",this,
00059 (bool (Xabsl2FunctionProvider::*)())&BallSymbols::getJustSeen);
00060 engine.registerBooleanInputSymbol("ball.seen.ball-in-front-of-opponent-goal", this,
00061 (bool (Xabsl2FunctionProvider::*)())&BallSymbols::getBallSeenInFrontOfOpponentGoal);
00062
00063 engine.registerDecimalInputSymbol("ball.known.distance",this,
00064 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getKnownDistance);
00065 engine.registerDecimalInputSymbol("ball.known.angle",this,
00066 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getKnownAngle);
00067 engine.registerDecimalInputSymbol("ball.known.x",this,
00068 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getKnownX);
00069 engine.registerDecimalInputSymbol("ball.known.y",this,
00070 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getKnownY);
00071 engine.registerDecimalInputSymbol("ball.motionValidity",this,
00072 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getMotionValidity);
00073 engine.registerDecimalInputSymbol("ball.time-since-last-known",this,
00074 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getTimeSinceLastKnown);
00075 engine.registerDecimalInputSymbol("ball.time-after-which-communicated-balls-are-accepted",this,
00076 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getTimeAfterWhichCommunicatedBallAreAccepted);
00077 engine.registerDecimalInputSymbol("ball.angle-to-opponent-goal",this,
00078 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getAngleToOpponentGoal);
00079
00080 engine.registerDecimalInputSymbol("ball.projected-distance-on-y-axis",this,
00081 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getProjectedDistanceOnYAxis);
00082 engine.registerDecimalInputSymbol("ball.time-until-ball-crosses-y-axis",this,
00083 (double (Xabsl2FunctionProvider::*)())&BallSymbols::getTimeUntilBallCrossesYAxis);
00084
00085 engine.registerBooleanInputSymbol("ball.is-handled-at-the-moment", &ballIsHandledAtTheMoment);
00086 engine.registerDecimalInputSymbol("ball.average-distance",&averageDistance);
00087
00088 engine.registerEnumeratedOutputSymbol("ball.handling",&ballWasHandledInLastFrame);
00089 engine.registerEnumeratedOutputSymbolEnumElement("ball.handling","handling-the-ball",1);
00090 engine.registerEnumeratedOutputSymbolEnumElement("ball.handling","not-handling-the-ball",0);
00091
00092 engine.registerBooleanInputSymbol("ball.rolls-by-left" , &(ballModel.ballState.ballRollsByLeft));
00093 engine.registerBooleanInputSymbol("ball.rolls-by-right" , &(ballModel.ballState.ballRollsByRight));
00094 engine.registerBooleanInputSymbol("ball.rolls-towards-robot" , &(ballModel.ballState.ballRollsTowardsRobot));
00095 engine.registerBooleanInputSymbol("ball.rolls-fast" , &(ballModel.ballState.ballRollsFast));
00096
00097 engine.registerBooleanInputSymbol("ball.play-ball-precisely", &playBallPrecisely);
00098 engine.registerEnumeratedOutputSymbol("ball.precision",&ballPrecision);
00099 engine.registerEnumeratedOutputSymbolEnumElement("ball.precision","precision.player",0);
00100 engine.registerEnumeratedOutputSymbolEnumElement("ball.precision","precision.penalty-shooter",1);
00101
00102
00103 }
00104
00105 void BallSymbols::update()
00106 {
00107 ballDistanceRingBuffer.add(
00108 (int)Geometry::distanceTo(robotPose.getPose(), ballModel.seen) );
00109
00110 if(ballDistanceRingBuffer.getNumberOfEntries() != 0)
00111 {
00112 averageDistance = ballDistanceRingBuffer.getSum() / ballDistanceRingBuffer.getNumberOfEntries();
00113 }
00114 else averageDistance = 1000;
00115
00116
00117
00118 ballIsHandledAtTheMoment = (ballWasHandledInLastFrame == 0 ? false : true);
00119
00120 playBallPrecisely = (ballPrecision == 0 ? false : true);
00121
00122
00123
00124
00125 ballWasHandledInLastFrame = 0;
00126
00127 }
00128
00129
00130 double BallSymbols::getKnownDistance()
00131 {
00132 return Geometry::distanceTo(robotPose.getPose(),ballModel.getKnownPosition(
00133 BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted));
00134 }
00135
00136 double BallSymbols::getSeenDistance()
00137 {
00138 return Geometry::distanceTo(robotPose.getPose(),ballModel.seen);
00139 }
00140
00141 double BallSymbols::getSeenDistanceX()
00142 {
00143 return getSeenDistance() *
00144 cos(Geometry::angleTo(robotPose.getPose(),ballModel.seen));
00145 }
00146
00147 double BallSymbols::getSeenDistanceY()
00148 {
00149 return getSeenDistance() *
00150 sin(Geometry::angleTo(robotPose.getPose(),ballModel.seen));
00151 }
00152
00153 double BallSymbols::getKnownAngle()
00154 {
00155 return toDegrees(Geometry::angleTo(robotPose.getPose(),
00156 ballModel.getKnownPosition(BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted)));
00157 }
00158
00159 double BallSymbols::getTimeAfterWhichCommunicatedBallAreAccepted()
00160 {
00161 return (double)BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted;
00162 }
00163
00164 double BallSymbols::getSeenAngle()
00165 {
00166 return toDegrees(Geometry::angleTo(robotPose.getPose(),
00167 ballModel.seen));
00168 }
00169
00170 double BallSymbols::getSeenSpeed()
00171 {
00172 return ballModel.seen.speed.abs();
00173 }
00174
00175 double BallSymbols::getSeenRelativeSpeedX()
00176 {
00177 return
00178 (ballModel.seen.speed.x * cos(robotPose.rotation) -
00179 ballModel.seen.speed.y * sin(robotPose.rotation));
00180 }
00181
00182 double BallSymbols::getSeenRelativeSpeedY()
00183 {
00184 return
00185 (ballModel.seen.speed.x * sin(robotPose.rotation) +
00186 ballModel.seen.speed.y * cos(robotPose.rotation));
00187 }
00188
00189 double BallSymbols::getDistanceSeenBallToOwnPenaltyArea()
00190 {
00191 return FieldDimensions::distanceToOwnPenaltyArea(ballModel.seen);
00192 }
00193
00194 double BallSymbols::getTimeUntilBallCrossesYAxis()
00195 {
00196 return (double) ballModel.ballState.timeBallCrossesYAxis;
00197 }
00198
00199 double BallSymbols::getProjectedDistanceOnYAxis()
00200 {
00201 return ballModel.ballState.projectedDistanceOnYAxis;
00202 }
00203
00204 double BallSymbols::getKnownX()
00205 {
00206 return ballModel.getKnownPosition(
00207 BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted).x;
00208 }
00209
00210 double BallSymbols::getKnownY()
00211 {
00212 return ballModel.getKnownPosition(
00213 BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted).y;
00214 }
00215
00216 double BallSymbols::getMotionValidity()
00217 {
00218 if (ballModel.motionValidity<0){
00219 return 0.0;
00220 }
00221 return ballModel.motionValidity;
00222 }
00223
00224 double BallSymbols::getTimeSinceLastKnown()
00225 {
00226 return ballModel.getTimeSinceLastKnown(
00227 BallModel::behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted);
00228 }
00229
00230 double BallSymbols::getTimeSinceLastSeen()
00231 {
00232 return SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen);
00233 }
00234
00235 double BallSymbols::getConsecutivelySeenTime()
00236 {
00237 return ballModel.seen.timeUntilSeenConsecutively
00238 - ballModel.seen.timeWhenFirstSeenConsecutively;
00239 }
00240
00241 double BallSymbols::getTimeSinceLastSeenConsecutively()
00242 {
00243 return SystemCall::getTimeSince(ballModel.seen.timeUntilSeenConsecutively);
00244 }
00245
00246 bool BallSymbols::getBallSeenInFrontOfOpponentGoal(){
00247 return ballModel.seen.ballInFrontOfOpponentGoal;
00248 }
00249
00250 bool BallSymbols::getJustSeen()
00251 {
00252 return SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 50;
00253 }
00254
00255 double BallSymbols::getAngleToOpponentGoal()
00256 {
00257 return toDegrees(normalize(Geometry::angleTo(ballModel.seen, Vector2<double>(xPosOpponentGroundline,yPosCenterGoal))));
00258 }
00259
00260 double BallSymbols::getNumberOfImagesWithBallPercept()
00261 {
00262 return ballModel.numberOfImagesWithBallPercept;
00263 }
00264
00265 double BallSymbols::getNumberOfImagesWithoutBallPercept()
00266 {
00267 return ballModel.numberOfImagesWithoutBallPercept;
00268 }
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
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