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

Modules/BehaviorControl/CommonXabsl2Symbols/BallSymbols.cpp

Go to the documentation of this file.
00001 /** 
00002 * @file BallSymbols.cpp
00003 *
00004 * Implementation of class BallSymbols.
00005 *
00006 * @author Martin Lötzsch
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   // use the information that was set by the options in the last frame
00118   ballIsHandledAtTheMoment = (ballWasHandledInLastFrame == 0 ? false : true);
00119 
00120   playBallPrecisely = (ballPrecision == 0 ? false : true);
00121 
00122 
00123   // set "ballWasHandledInLastFrame" to false. It will only become true when
00124   // an option sets it to true again
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 * Change Log
00272 * 
00273 * $Log: BallSymbols.cpp,v $
00274 * Revision 1.8  2004/06/28 00:35:37  juengel
00275 * bug fixed
00276 *
00277 * Revision 1.7  2004/06/27 17:41:01  goetzke
00278 * Added penalty-shooter.
00279 *
00280 * Revision 1.6  2004/06/23 11:37:43  dassler
00281 * New Ballsymbols introduced
00282 * ball.projected-distance-on-y-axis" description="Projected Distance of the ball to the y axis of the robot
00283 * ball.time-until-ball-crosses-y-axis" description="Time until the ball crosses the y axis of the robot
00284 *
00285 * Revision 1.5  2004/06/15 17:50:24  juengel
00286 * Added symbols:
00287 * numberOfImagesWithBallPercept,
00288 * numberOfImagesWithoutBallPercept
00289 *
00290 * Revision 1.4  2004/05/27 18:49:17  kerdels
00291 * added a small 5 frames sliding average for the relative ballspeed,
00292 * added new ballState Representation and adjusted the apropriate files
00293 *
00294 * Revision 1.3  2004/05/22 22:52:02  juengel
00295 * Renamed ballP_osition to ballModel.
00296 *
00297 * Revision 1.2  2004/05/22 20:47:58  juengel
00298 * Renamed ballP_osition to ballModel.
00299 *
00300 * Revision 1.1.1.1  2004/05/22 17:16:56  cvsadm
00301 * created new repository GT2004_WM
00302 *
00303 * Revision 1.18  2004/05/04 10:48:58  loetzsch
00304 * replaced all enums
00305 * xxxBehaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00306 * by
00307 * behaviorControlTimeAfterWhichCommunicatedBallsAreAccepted
00308 * (this mechanism was neither fully implemented nor used)
00309 *
00310 * Revision 1.17  2004/05/03 15:32:25  uhrig
00311 * Added additional ball state and disabled sending of Kalman filter process model states.
00312 *
00313 * Revision 1.16  2004/04/15 13:12:27  loetzsch
00314 * added setting of the symbol "ball.handling"
00315 *
00316 * Revision 1.15  2004/04/14 20:35:28  loetzsch
00317 * i.m.p.r.o.v.e.d.
00318 *
00319 * Revision 1.14  2004/04/08 15:33:01  wachter
00320 * GT04 checkin of Microsoft-Hellounds
00321 *
00322 
00323 * Revision 1.13  2004/04/05 17:56:47  loetzsch
00324 * merged the local German Open CVS of the aibo team humboldt with the tamara CVS
00325 *
00326 * Revision 1.3  2004/04/02 11:44:30  jumped
00327 * addded ball.seen.in.front-of-opponent-goal (and supporting functions)
00328 *
00329 * Revision 1.2  2004/04/01 22:08:37  juengel
00330 * Added ball.average-distance.
00331 *
00332 * Revision 1.1.1.1  2004/03/31 11:16:41  loetzsch
00333 * created ATH repository for german open 2004
00334 *
00335 * Revision 1.12  2004/03/28 17:54:11  juengel
00336 * Added ballState "ballRollsFast".
00337 *
00338 * Revision 1.11  2004/03/28 16:33:58  loetzsch
00339 * added input symbol ball.consecutively-seen-time and ball.time-since-last-consecutively-seen
00340 *
00341 * Revision 1.10  2004/03/27 21:11:29  loetzsch
00342 * changed ball.seen-consecutively
00343 *
00344 * Revision 1.9  2004/03/27 14:45:41  loetzsch
00345 * added boolean input symbol "ball.seen-consecutively"
00346 *
00347 * Revision 1.8  2004/03/21 12:44:49  juengel
00348 * Added "wait-for-feedback" to ballState
00349 *
00350 * Revision 1.7  2004/03/08 00:58:54  roefer
00351 * Interfaces should be const
00352 *
00353 * Revision 1.6  2004/02/05 16:56:00  spranger
00354 * fixed ball-state enum
00355 *
00356 * Revision 1.5  2004/02/05 14:21:03  spranger
00357 * added ballState enum
00358 *
00359 * Revision 1.4  2004/02/03 13:20:47  spranger
00360 * renamed all references to  class BallP_osition to BallModel (possibly changed include files)
00361 *
00362 * Revision 1.3  2004/01/29 11:00:51  schumann
00363 * added filtering of ball motion
00364 *
00365 * Revision 1.2  2004/01/29 09:52:43  schumann
00366 * added motion validity symbol to xabsl
00367 *
00368 * Revision 1.1  2003/10/22 22:18:44  loetzsch
00369 * prepared the cloning of the GT2003BehaviorControl
00370 *
00371 * Revision 1.1  2003/10/06 13:39:28  cvsadm
00372 * Created GT2004 (M.J.)
00373 *
00374 * Revision 1.1.1.1  2003/07/02 09:40:23  cvsadm
00375 * created new repository for the competitions in Padova from the 
00376 * tamara CVS (Tuesday 2:00 pm)
00377 *
00378 * removed unused solutions
00379 *
00380 * Revision 1.10  2003/06/24 14:31:19  schumann
00381 * added primitive behavior for ball challenge
00382 *
00383 * Revision 1.9  2003/06/22 14:54:12  risler
00384 * ball.seen.relative-speed.x/y added
00385 *
00386 * Revision 1.8  2003/06/19 14:49:04  risler
00387 * symbol ball.getting-closer added
00388 *
00389 * Revision 1.7  2003/06/18 18:31:29  risler
00390 * added relative ball position
00391 *
00392 * Revision 1.6  2003/06/17 19:54:59  risler
00393 * ball caught symbols moved to strategy
00394 *
00395 * Revision 1.5  2003/06/04 11:17:14  risler
00396 * added symbol ball.seen.distance-to-own-penalty-area
00397 *
00398 * Revision 1.4  2003/06/02 14:45:33  loetzsch
00399 * added symbols ball.caught and ball.catch-time
00400 *
00401 * Revision 1.3  2003/06/02 03:57:52  loetzsch
00402 * copied a simple goalie behavior from humboldt2003
00403 *
00404 * Revision 1.2  2003/05/09 15:28:51  loetzsch
00405 * added time-after-which-communicated-ball-are-accepted
00406 *
00407 * Revision 1.1  2003/05/04 11:41:40  loetzsch
00408 * added class BallSymbols
00409 *
00410 */
00411 

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