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

Modules/RobotStateDetector/GT2004RobotStateDetector.cpp

Go to the documentation of this file.
00001 /**
00002 * @file GT2004RobotStateDetector.cpp
00003 *
00004 * Implementation of class GT2004RobotStateDetector
00005 *
00006 * @author Max Risler
00007 */
00008 
00009 #include "GT2004RobotStateDetector.h"
00010 #include "Platform/SystemCall.h"
00011 
00012 GT2004RobotStateDetector::GT2004RobotStateDetector(const RobotStateDetectorInterfaces& interfaces)
00013 : RobotStateDetector(interfaces)
00014 {
00015   int i,j,k;
00016   
00017   for (i = 0; i < BodyPercept::numOfSwitches;switchDown[i++]=false);
00018   
00019   for (i = 0; i < 6; i++)
00020   {
00021     timeSinceLastCollision[i] = 0;
00022     consecutiveCollisionTime[i] = 0;
00023   }
00024    
00025   remindCollision = 750;
00026 
00027   for (j = 0; j < maxFrameHistory; j++)
00028   {
00029     for (k = 0; k < robotSides; k++)
00030     {
00031       numOfCollisions[j][k] = false;
00032     }  
00033   }
00034 
00035   /****/
00036   for (i = 0; i < BodyPercept::numOfSwitches;i++)
00037   {
00038     buttonPressed[i]=false;
00039     buttonTime[i]=0;
00040     buttonPressedTime[i]=0;
00041     buttonDuration[i]=0;
00042   }
00043   anyBackButtonPressed=false;
00044   anyBackButtonTime=0;
00045   anyBackButtonPressedTime=0;
00046   anyBackButtonDuration=0;
00047   setNewButtonStatus();
00048   /****/
00049 }
00050 
00051 void GT2004RobotStateDetector::execute()
00052 {
00053   robotState.setFrameNumber(bodyPercept.frameNumber);
00054   
00055   calculateCollisionState();
00056   
00057   robotState.setState(
00058     (RobotState::States)bodyPercept.getState());
00059   
00060   robotState.setMouthState(
00061     (RobotState::MouthStates)bodyPercept.getMouthState());
00062   
00063   robotState.setSomethingInFrontOfChest(bodyPercept.getBodyPSDHighValue());
00064   robotState.setDistanceToSIFOC(bodyPercept.getBodyPSDDistance());
00065   if(bodyPercept.getBodyPSDHighValue())
00066   {
00067     robotState.setTimeWhenSomethingWasInFrontOfChestLast(SystemCall::getCurrentSystemTime());
00068   }
00069 
00070   robotState.acceleration=bodyPercept.acceleration;
00071   
00072   int i;
00073   for (i = 0; i < BodyPercept::numOfSwitches; i++) 
00074   {
00075     if ((bodyPercept.getSwitches() & (1<<i)) > 0)
00076     {
00077       if (!switchDown[i]) 
00078       {
00079         // switch pressed
00080         switchDown[i] = true;
00081         switchDownTime[i] = SystemCall::getCurrentSystemTime();
00082         
00083         /***/
00084         buttonPressed[i]=true;  //Button pressed
00085         buttonTime[i]=SystemCall::getCurrentSystemTime(); //Aktuelle Zeit
00086         buttonPressedTime[i]=0; //Later: CurrentTime-buttonTime, buttonPressedTime started
00087         buttonDuration[i]=0;
00088         
00089         switch(i)
00090         {
00091         case BodyPercept::backMiddle:
00092         case BodyPercept::backBack:
00093         case BodyPercept::backFront:
00094           {
00095             if (anyBackButtonPressed==false)
00096             {
00097               anyBackButtonPressed=true;
00098               anyBackButtonTime=SystemCall::getCurrentSystemTime();
00099               anyBackButtonPressedTime=0;
00100               anyBackButtonDuration=0;
00101             }
00102             break;
00103           }
00104         }
00105         setNewButtonStatus();
00106         /***/
00107         
00108       }
00109     }
00110     else
00111     { 
00112       if (switchDown[i]) 
00113       {
00114         // switch released
00115         switchDown[i] = false;
00116         
00117         /***/
00118         buttonPressed[i]=false;  //Button released
00119         buttonPressedTime[i]=SystemCall::getCurrentSystemTime()-buttonTime[i]; //how long the button was pressed
00120         buttonTime[i]=SystemCall::getCurrentSystemTime(); //when the button was pressed
00121         buttonDuration[i]=0; // And it starts again
00122         if (anyBackButtonPressed==true)
00123         {
00124           if ((buttonPressed[BodyPercept::backMiddle]==false)&&(buttonPressed[BodyPercept::backFront]==false)&&(buttonPressed[BodyPercept::backBack]==false))
00125           {
00126             anyBackButtonPressed=false;
00127             anyBackButtonPressedTime=SystemCall::getCurrentSystemTime()-anyBackButtonTime;
00128             anyBackButtonTime=SystemCall::getCurrentSystemTime();
00129             anyBackButtonDuration=0;
00130           }
00131         }
00132         setNewButtonStatus();
00133         /***/
00134       }
00135     }
00136   }
00137   /****/
00138   for (i = 0; i < BodyPercept::numOfSwitches; i++)  // update my duration time
00139   {
00140     buttonDuration[i]=SystemCall::getTimeSince(buttonTime[i]);
00141     /*  
00142     OUTPUT(idText, text, "ButtonDuration: " << buttonDuration[i]);
00143     OUTPUT(idText, text, "ButtonTime: " << buttonTime[i]);
00144     OUTPUT(idText, text, "ButtonPressed: " << buttonPressed[i]);
00145     OUTPUT(idText, text, "ButtonPressedTime: " << buttonPressedTime[i]);
00146     */  
00147   }
00148   anyBackButtonDuration=SystemCall::getTimeSince(anyBackButtonTime);
00149   /*
00150   OUTPUT(idText, text, "anyBackButtonDuration: " << anyBackButtonDuration);
00151   OUTPUT(idText, text, "--------------- ");
00152   */
00153   setNewButtonStatus();
00154   /****/
00155 }
00156 
00157 void GT2004RobotStateDetector::setNewButtonStatus()
00158 {
00159   robotState.setButtonPressed(buttonPressed);
00160   robotState.setButtonTime(buttonTime);
00161   robotState.setButtonPressedTime(buttonPressedTime);
00162   robotState.setButtonDuration(buttonDuration);
00163   robotState.setAnyBackButtonPressed(anyBackButtonPressed);
00164   robotState.setAnyBackButtonTime(anyBackButtonTime);
00165   robotState.setAnyBackButtonPressedTime(anyBackButtonPressedTime);
00166   robotState.setAnyBackButtonDuration(anyBackButtonDuration);
00167 }
00168 
00169 void GT2004RobotStateDetector::calculateCollisionState()
00170 {
00171   // collisionTime  1. Component 0 fl, 1 fr, 2 hl, 3 hr, 4 head, 5 anyone of them
00172   //                2. Component two previous collision times
00173   
00174   
00175   long time = SystemCall::getCurrentSystemTime();
00176   
00177   //setze alle states auf 0!!!
00178   
00179   robotState.setCollisionFrontLeft(false);
00180   robotState.setCollisionFrontRight(false);
00181   robotState.setCollisionHindLeft(false);
00182   robotState.setCollisionHindRight(false);
00183   robotState.setCollisionHead(false);
00184   robotState.setCollisionAggregate(false);
00185   
00186   
00187   if ((time - timeSinceLastCollision[0]) >  remindCollision)
00188   {
00189     consecutiveCollisionTime[0] = time;
00190     robotState.setConsecutiveCollisionTimeFrontLeft(0);
00191   }
00192   
00193   if ((time - timeSinceLastCollision[1]) >  remindCollision)
00194   {
00195     consecutiveCollisionTime[1] = time;
00196     robotState.setConsecutiveCollisionTimeFrontRight(0);
00197   }
00198   
00199   if ((time - timeSinceLastCollision[2]) >  remindCollision)
00200   {
00201     consecutiveCollisionTime[2] = time;
00202     robotState.setConsecutiveCollisionTimeHindLeft(0);
00203   }
00204   
00205   if ((time - timeSinceLastCollision[3]) >  remindCollision)
00206   {
00207     consecutiveCollisionTime[3] = time;
00208     robotState.setConsecutiveCollisionTimeHindRight(0);
00209   }
00210   
00211   if ((time - timeSinceLastCollision[4]) >  remindCollision)
00212   {
00213     consecutiveCollisionTime[4] = time;
00214     robotState.setConsecutiveCollisionTimeHead(0);
00215   }
00216   
00217   if ((time - timeSinceLastCollision[5]) >  remindCollision)
00218   {
00219     consecutiveCollisionTime[5] = time;
00220     robotState.setConsecutiveCollisionTimeAggregate(0);
00221   }
00222   
00223   if (collisionPercept.getCollisionFrontLeft())
00224   {
00225     robotState.setCollisionFrontLeft(true);
00226     if ((time-timeSinceLastCollision[0]) > remindCollision)
00227     {
00228       consecutiveCollisionTime[0] = time; // first collision
00229     }
00230     robotState.setConsecutiveCollisionTimeFrontLeft(time-consecutiveCollisionTime[0]);
00231     timeSinceLastCollision[0] = time; //last collision
00232   }
00233   
00234   if (collisionPercept.getCollisionFrontRight()) 
00235   {
00236     robotState.setCollisionFrontRight(true);
00237     if ((time-timeSinceLastCollision[1]) > remindCollision)
00238     {
00239       consecutiveCollisionTime[1] = time;
00240     }
00241     robotState.setConsecutiveCollisionTimeFrontRight(time-consecutiveCollisionTime[1]);
00242     timeSinceLastCollision[1] = time;
00243   }
00244   
00245   if (collisionPercept.getCollisionHindLeft()) 
00246   {
00247     robotState.setCollisionHindLeft(true);
00248     if ((time-timeSinceLastCollision[2]) > remindCollision)
00249     {
00250       consecutiveCollisionTime[2] = time;
00251     }
00252     robotState.setConsecutiveCollisionTimeHindLeft(time-consecutiveCollisionTime[2]);
00253     timeSinceLastCollision[2] = time;
00254   }
00255   
00256   if (collisionPercept.getCollisionHindRight()) 
00257   {
00258     robotState.setCollisionHindRight(true);
00259     if ((time-timeSinceLastCollision[3]) > remindCollision)
00260     {
00261       consecutiveCollisionTime[3] = time;
00262     }
00263     robotState.setConsecutiveCollisionTimeHindRight(time-consecutiveCollisionTime[3]);
00264     timeSinceLastCollision[3] = time;
00265   }
00266   
00267   if (collisionPercept.getCollisionHead()) 
00268   {
00269     robotState.setCollisionHead(true);
00270     if ((time-timeSinceLastCollision[4]) > remindCollision)
00271     {
00272       consecutiveCollisionTime[4] = time;
00273     }
00274     robotState.setConsecutiveCollisionTimeHead(time-consecutiveCollisionTime[4]);
00275     timeSinceLastCollision[4] = time;
00276   }
00277   
00278   if (collisionPercept.getCollisionAggregate()) 
00279   {
00280     robotState.setCollisionAggregate(true);
00281     if ((time-timeSinceLastCollision[5]) > remindCollision)
00282     {
00283       consecutiveCollisionTime[5] = time;
00284     }
00285     robotState.setConsecutiveCollisionTimeAggregate(time-consecutiveCollisionTime[5]);
00286     timeSinceLastCollision[5] = time;
00287   }
00288 
00289   if (collisionPercept.getCollisionFrontLeft() || collisionPercept.getCollisionHindLeft())
00290   {
00291     setCollisionOnLeftSide(true);
00292   }
00293   else 
00294   {
00295     setCollisionOnLeftSide(false);
00296   }
00297 
00298   if (collisionPercept.getCollisionFrontRight() || collisionPercept.getCollisionHindRight())
00299   {
00300     setCollisionOnRightSide(true);
00301   }
00302   else 
00303   {
00304     setCollisionOnRightSide(false);
00305   }
00306 
00307   robotState.setCollisionSide(getCollisionSide());
00308 }
00309 
00310   /** Did collision occur at front left leg */
00311 int GT2004RobotStateDetector::getCollisionSide() 
00312 {
00313     int l = 0;
00314     int r = 0;
00315 
00316     for (int i = 0; i < maxFrameHistory; i++)
00317     {
00318       if (numOfCollisions[i][left])  {++l;}
00319       if (numOfCollisions[i][right]) {++r;}
00320     }
00321 
00322     if (l > r) {return left;}
00323     else if (l < r) {return right;}
00324     else return middle;
00325 }
00326 
00327 void GT2004RobotStateDetector::setCollisionOnLeftSide(bool collision)
00328 {
00329   numOfCollisions[collisionPercept.frameNumber%maxFrameHistory][GT2004RobotStateDetector::left] = collision;
00330 }
00331 
00332 void GT2004RobotStateDetector::setCollisionOnRightSide(bool collision)
00333 {
00334   numOfCollisions[collisionPercept.frameNumber%maxFrameHistory][GT2004RobotStateDetector::right] = collision;
00335 }
00336 
00337 
00338 
00339 /*
00340 * Change log :
00341 * 
00342 * $Log: GT2004RobotStateDetector.cpp,v $
00343 * Revision 1.1  2004/07/10 00:18:31  spranger
00344 * renamed (readded) for coderelease
00345 *
00346 * Revision 1.6  2004/06/23 11:02:26  goehring
00347 * Xabsl symbol collision-side added
00348 *
00349 * Revision 1.5  2004/06/16 17:07:33  cesarz
00350 * Moved body PSD calculations
00351 *
00352 * Revision 1.4  2004/06/08 18:35:18  juengel
00353 * Added robot-state.time-since-something-was-in-front-of-chest.
00354 *
00355 * Revision 1.3  2004/05/25 12:36:51  tim
00356 * added body PSD data
00357 *
00358 * Revision 1.2  2004/05/24 14:14:26  juengel
00359 * New button evaluation.
00360 *
00361 * Revision 1.1.1.1  2004/05/22 17:20:41  cvsadm
00362 * created new repository GT2004_WM
00363 *
00364 * Revision 1.8  2004/05/11 08:00:19  juengel
00365 * Fixed VC6 compiler errors.
00366 *
00367 * Revision 1.7  2004/05/11 06:59:05  brueckne
00368 * added new way to know how long a button is/was pressed/released (not ready yet)
00369 *
00370 * Revision 1.6  2004/03/08 02:11:44  roefer
00371 * Interfaces should be const
00372 *
00373 * Revision 1.5  2004/02/10 11:12:31  dueffert
00374 * acceleration added
00375 *
00376 * Revision 1.4  2004/01/24 11:32:32  juengel
00377 * Added ERS7 switches (head, backFront, backBack).
00378 *
00379 * Revision 1.3  2003/11/14 19:02:26  goehring
00380 * frameNumber added
00381 *
00382 * Revision 1.2  2003/10/16 12:58:40  goehring
00383 * remindCollision reduced for CollisionDetection
00384 *
00385 * Revision 1.1  2003/10/06 14:10:14  cvsadm
00386 * Created GT2004 (M.J.)
00387 *
00388 * Revision 1.3  2003/09/26 21:23:20  loetzsch
00389 * renamed class JointState to CollisionPercept
00390 *
00391 * Revision 1.2  2003/07/06 12:05:31  schumann
00392 * added foreleg opening angle for ball challenge
00393 *
00394 * Revision 1.1.1.1  2003/07/02 09:40:24  cvsadm
00395 * created new repository for the competitions in Padova from the 
00396 * tamara CVS (Tuesday 2:00 pm)
00397 *
00398 * removed unused solutions
00399 *
00400 * Revision 1.10  2003/06/21 13:07:36  goehring
00401 * CollisionStateSymbol modelling changed
00402 *
00403 * Revision 1.9  2003/06/20 16:57:46  goehring
00404 * CollisionDetectorValues improved
00405 *
00406 * Revision 1.8  2003/06/20 14:50:07  risler
00407 * numOfSwitches added
00408 *
00409 * Revision 1.7  2003/06/20 13:27:19  risler
00410 * added tailLeft tailRight messages
00411 *
00412 * Revision 1.6  2003/06/20 10:30:37  goehring
00413 * calculateCollisionState implemented
00414 *
00415 * Revision 1.5  2003/04/01 22:40:44  cesarz
00416 * added mouth states
00417 *
00418 * Revision 1.4  2003/03/24 18:39:46  loetzsch
00419 * message backPressedAndTailUp and backPressedAndTailDown removed
00420 *
00421 * Revision 1.3  2003/01/30 11:29:24  juengel
00422 * Added tailPosition to bodyPercept
00423 *
00424 * Revision 1.2  2002/09/12 09:45:58  juengel
00425 * continued change of module/solution mechanisms
00426 *
00427 * Revision 1.1  2002/09/10 15:36:15  cvsadm
00428 * Created new project GT2003 (M.L.)
00429 * - Cleaned up the /Src/DataTypes directory
00430 * - Removed challenge related source code
00431 * - Removed processing of incoming audio data
00432 * - Renamed AcousticMessage to SoundRequest
00433 *
00434 * Revision 1.4  2002/08/30 14:33:38  dueffert
00435 * removed unused includes
00436 *
00437 * Revision 1.3  2002/05/15 10:52:42  risler
00438 * no message
00439 *
00440 * Revision 1.2  2002/05/15 08:09:10  risler
00441 * added button down messages
00442 *
00443 * Revision 1.1.1.1  2002/05/10 12:40:15  cvsadm
00444 * Moved GT2002 Project from ute to tamara.
00445 *
00446 * Revision 1.6  2002/03/28 16:55:58  risler
00447 * RobotStateDetector receives BodyPercept instead of PerceptCollection
00448 * added switch duration in RobotStateDetector
00449 *
00450 * Revision 1.5  2002/03/28 15:21:40  risler
00451 * removed output
00452 *
00453 * Revision 1.4  2002/03/28 15:19:20  risler
00454 * implemented switch messages in RobotStateDetector
00455 *
00456 * Revision 1.3  2002/02/23 16:33:07  risler
00457 * finished GetupEngine
00458 *
00459 * Revision 1.2  2001/12/10 17:47:06  risler
00460 * change log added
00461 *
00462 */
00463 

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