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