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

Modules/SensorDataProcessor/GT2004SensorDataProcessor.cpp

Go to the documentation of this file.
00001 /**
00002 * @file GT2004SensorDataProcessor.cpp
00003 * 
00004 * This file contains a class for Sensor Data Processing.
00005 */
00006 
00007 #include "GT2004SensorDataProcessor.h"
00008 #include "Tools/Actorics/RobotDimensions.h"
00009 #include "Tools/Actorics/Kinematics.h"
00010 #include "Tools/Math/Common.h"
00011 #include "Platform/SystemCall.h"
00012 
00013 #include "Tools/Debugging/Debugging.h"
00014 
00015 GT2004SensorDataProcessor::GT2004SensorDataProcessor
00016 (const SensorDataProcessorInterfaces& interfaces)
00017 : SensorDataProcessor(interfaces),
00018 lastImageFrameNumber(0),
00019 gravity(0,0,0),
00020 accelerationWithGrav(0,0,0),
00021 leftRollStartTime(SystemCall::getCurrentSystemTime()),
00022 tempSysTime(0),
00023 rightRollStartTime(SystemCall::getCurrentSystemTime())
00024 {
00025   sensorDataRingBuffer.init();
00026   cameraMatrixRingBuffer.init();
00027   bodyPostureRingBuffer.init();
00028   for (int i = 0; i<3; i++) {
00029     previousAverage[i] = 0.0;
00030     actAverage[i] = 0.0;
00031   }
00032 }
00033 
00034 void GT2004SensorDataProcessor::execute()
00035 {
00036   int i;
00037   CameraMatrix frameCameraMatrix;
00038   BodyPosture frameBodyPosture;
00039 
00040   psdPercept.numOfPercepts = 0;
00041 
00042   for (i = 0; i < sensorDataBuffer.numOfFrames; i++)
00043   {
00044     sensorDataRingBuffer.add(sensorDataBuffer.frame[i]);
00045   
00046     sensorDataRingBuffer.updateAverage(SensorData::accelerationX,10,gravity.x);
00047     sensorDataRingBuffer.updateAverage(SensorData::accelerationY,10,gravity.y);
00048     sensorDataRingBuffer.updateAverage(SensorData::accelerationZ,10,gravity.z);
00049   
00050     sensorDataRingBuffer.updateAverage(SensorData::accelerationX,2,accelerationWithGrav.x);
00051     sensorDataRingBuffer.updateAverage(SensorData::accelerationY,2,accelerationWithGrav.y);
00052     sensorDataRingBuffer.updateAverage(SensorData::accelerationZ,2,accelerationWithGrav.z);
00053 
00054 
00055     frameBodyPosture.frameNumber = sensorDataBuffer.frame[i].frameNumber;
00056     calculateBodyPostureFromLegSensors(sensorDataBuffer.frame[i], frameBodyPosture);
00057     calculateBodyPostureFromAccelerationSensors(sensorDataBuffer.frame[i], frameBodyPosture);
00058 
00059     if (1) // if motion provides valid data...
00060     {
00061       frameBodyPosture.bodyTiltProvidedByMotionControl = motionInfo.bodyTilt;
00062       frameBodyPosture.neckHeightProvidedByMotionControl = motionInfo.neckHeight;
00063       frameBodyPosture.bodyRollProvidedByMotionControl = 0;
00064     }
00065     else
00066     {
00067       /** @todo copy data from "calculated from..."*/
00068     }
00069 
00070     buildCameraMatrix(sensorDataBuffer.frame[i], frameBodyPosture, frameCameraMatrix);
00071 
00072     cameraMatrixRingBuffer.add(frameCameraMatrix);
00073     bodyPostureRingBuffer.add(frameBodyPosture);
00074 
00075     buildPSDPercept(
00076       sensorDataBuffer.frame[i], 
00077       cameraMatrixRingBuffer.getEntry(9), // 9: hack
00078       psdPercept[psdPercept.numOfPercepts++]);
00079   }
00080 
00081   double bodyRollAngle = atan2((double)-gravity.y,(double)-gravity.z);
00082   if ((bodyRollAngle >= -gt2004SensorDataProcessorRolledOnWallAngle)||(bodyRollAngle <= -gt2004SensorDataProcessorFalldownRollAngle))
00083     leftRollStartTime = SystemCall::getCurrentSystemTime();
00084   if ((bodyRollAngle <= gt2004SensorDataProcessorRolledOnWallAngle)||(bodyRollAngle >= gt2004SensorDataProcessorFalldownRollAngle))
00085     rightRollStartTime = SystemCall::getCurrentSystemTime();
00086   
00087   if (lastImageFrameNumber == imageFrameNumber) 
00088   {
00089     // The image is not new, so the camera matrix should not be built
00090     return;
00091   }
00092   lastImageFrameNumber = imageFrameNumber;
00093 
00094   // search image frame in sensor data
00095   for (i = 0; i < sensorDataRingBuffer.getNumberOfEntries(); i++)
00096   {
00097     if (sensorDataRingBuffer.getEntry(i).frameNumber <= imageFrameNumber) break;
00098   }
00099   cameraMatrix = cameraMatrixRingBuffer.getEntry(i);
00100   bodyPosture = bodyPostureRingBuffer.getEntry(i);
00101   bodyPosture.bodyTiltProvidedByMotionControl = motionInfo.bodyTilt;
00102   bodyPosture.bodyRollProvidedByMotionControl = 0;
00103   bodyPosture.neckHeightProvidedByMotionControl = motionInfo.neckHeight;
00104  
00105   Vector3<double> acceleration = 
00106     accelerationWithGrav - gravity;
00107   bodyPercept.acceleration = acceleration;
00108   
00109   int switches = detectSwitches();
00110 
00111   bodyPercept.setFrameNumber(sensorDataBuffer.frame[0].frameNumber);
00112   
00113   bodyPercept.setMouthState(detectMouthState());
00114 
00115   bodyPercept.setBodyPSDHighValue(sensorDataBuffer.lastFrame().data[SensorData::bodyPsd]>150000); //BBWalk: 110000
00116   
00117   bodyPercept.setBodyPSDDistance(getDistanceToSIFOC());
00118   
00119     bodyPercept.setSwitches(switches);
00120   if (!motionInfo.motionIsStable) 
00121   {
00122     bodyPercept.setState(BodyPercept::standing);
00123   }
00124   else if (detectFallDown())
00125   {
00126     bodyPercept.setState(BodyPercept::crashed);
00127     //OUTPUT (idText, text, "GT2004SensorDataProcessor : crashed");
00128   }
00129   else if (SystemCall::getTimeSince(leftRollStartTime)>1500)
00130   {
00131     bodyPercept.setState(BodyPercept::rollLeft);
00132     //OUTPUT (idText, text, "GT2004SensorDataProcessor : roll left");
00133   }
00134   else if (SystemCall::getTimeSince(rightRollStartTime)>1500)
00135   {
00136     bodyPercept.setState(BodyPercept::rollRight);
00137     //OUTPUT (idText, text, "GT2004SensorDataProcessor : roll right");
00138   }
00139   else if (detectPickup(gravity,acceleration))
00140   {
00141     bodyPercept.setState(BodyPercept::pickedUp);
00142   }
00143   else
00144   {
00145     bodyPercept.setState(BodyPercept::standing);
00146   }
00147   
00148   //double camSpeed = getCameraVelocity();
00149 }
00150 
00151 
00152 void GT2004SensorDataProcessor::buildCameraMatrix(const SensorData& sensorData, const BodyPosture& bP, CameraMatrix& cameraMatrix)
00153 {
00154   double tilt = fromMicroRad(sensorData.data[SensorData::neckTilt]);
00155   double pan  = fromMicroRad(sensorData.data[SensorData::headPan]);
00156   double tilt2 = fromMicroRad(sensorData.data[SensorData::headTilt]);
00157   Kinematics::calculateCameraMatrix(tilt, pan, tilt2, bP.bodyTiltCalculatedFromLegSensors, bP.neckHeightCalculatedFromLegSensors, cameraMatrix);
00158   cameraMatrix.setFrameNumber(sensorData.frameNumber);
00159   //~ cameraMatrix.setFrameNumber(imageFrameNumber);
00160   cameraMatrix.isValid=motionInfo.motionIsStable;
00161 }
00162 
00163 void GT2004SensorDataProcessor::buildPSDPercept(const SensorData& sensorData, const CameraMatrix& cameraMatrix, SinglePSDPercept& psdPercept)
00164 {
00165   // Achtung !!!
00166   // Hier wird zunächst einmal die eventuell kritische Annahme getroffen, 
00167   // dass optische Achse und "PSD-Strahl"- Achse identisch sind. 
00168   // Das bleibt erst mal so, bis genaueres bekannt ist. (M.L.)
00169 
00170   psdPercept.isValid = cameraMatrix.isValid;
00171 
00172   // A vector in the camera coordinate system with the length of the measured psd distance
00173   Vector3<double> psd;
00174   psd.y = 0; psd.z = 0;
00175   
00176   if(sensorData.data[SensorData::psd]/1000 < 300)
00177     psd.x = sensorData.data[SensorData::psd]/1000 - 20; 
00178   else
00179     psd.x = sensorData.data[SensorData::headPsdFar]/1000 - 30; 
00180   // mark the percept to be out of scope 
00181   psdPercept.tooFarAway = (psd.x >= 1300 - 30);
00182   psdPercept.body = sensorData.data[SensorData::bodyPsd]/1000;
00183 
00184   //
00185   psdPercept.neckTilt = fromMicroRad(sensorData.data[SensorData::neckTilt]);
00186 
00187   // Transformation of the vector into the robot's coordinate system
00188   Vector3<double> objectRelativeToCamera = cameraMatrix.rotation * psd;
00189 
00190   //OUTPUT(idText,text,"x: " << objectRelativeToCamera.x << ", y: " << objectRelativeToCamera.y << ", z: " << objectRelativeToCamera.z);
00191 
00192   // calculates the spot detected by the PSD Sensor relative to the point on the
00193   // ground below the shoulder joints.
00194   (Vector3<double>&)psdPercept = objectRelativeToCamera + cameraMatrix.translation;
00195 
00196   // OUTPUT(idText,text,"x2 " << psdPercept.x << ", y2 " << psdPercept.y << ", z2 " << psdPercept.z);
00197 
00198   psdPercept.setFrameNumber(sensorData.frameNumber);
00199 }
00200 
00201 int GT2004SensorDataProcessor::detectSwitches()
00202 {
00203   int backMiddle, backFront, backBack,
00204       head, mouth, chin;
00205 
00206     backMiddle= (int)( (int)(sensorDataBuffer.frame[0].data[SensorData::back]) > 10  ) << BodyPercept::backMiddle;
00207     backFront = (int)( (int)(sensorDataBuffer.frame[0].data[SensorData::backF]) > 10  ) << BodyPercept::backFront;
00208     backBack  = (int)( (int)(sensorDataBuffer.frame[0].data[SensorData::backR]) > 10  ) << BodyPercept::backBack;
00209     head      = (int)( (int)(sensorDataBuffer.frame[0].data[SensorData::head]) > 10  ) << BodyPercept::head;
00210     mouth     = (int)(0 != (int)(sensorDataRingBuffer.getAverage(SensorData::mouth,     5)/-80000)) << BodyPercept::mouth;
00211     chin      = (int)(0 != (int)(sensorDataRingBuffer.getAverage(SensorData::chin,      5)*10)) << BodyPercept::chin;
00212 
00213   return 
00214     backMiddle | backFront | backBack |
00215     head | mouth | chin;
00216 }
00217 
00218 bool GT2004SensorDataProcessor::detectFallDown()
00219 {
00220   double bodyTiltAngle = atan2((double)gravity.x,(double)-gravity.z);
00221   double bodyRollAngle = atan2((double)-gravity.y,(double)-gravity.z);
00222 
00223   return
00224     (bodyTiltAngle >  gt2004SensorDataProcessorFalldownTiltAngle  ||
00225     bodyTiltAngle < -gt2004SensorDataProcessorFalldownTiltAngle  ||
00226     bodyRollAngle >  gt2004SensorDataProcessorFalldownRollAngle  ||
00227     bodyRollAngle < -gt2004SensorDataProcessorFalldownRollAngle);
00228 }
00229 
00230 bool GT2004SensorDataProcessor::detectPickup(const Vector3<double>& gravity, const Vector3<double>& acceleration)
00231 {
00232   double accZ = acceleration * gravity;
00233   
00234   return (accZ < -50000000000000.0);
00235 }
00236 
00237 BodyPercept::MouthStates 
00238 GT2004SensorDataProcessor::detectMouthState()
00239 {
00240   if(sensorDataBuffer.lastFrame().data[SensorData::mouth] < -370000) //mouth open
00241   {
00242     return BodyPercept::mouthOpen;
00243   }
00244   else
00245   {
00246     return BodyPercept::mouthClosed;
00247   }
00248 }
00249 
00250 /**************************/
00251 /***  SensorDataBuffer  ***/
00252 
00253 double GT2004SensorDataProcessor::SensorDataRingBuffer::getAverage (SensorData::sensors sensor, int ticks)
00254 {
00255   if (ticks>getNumberOfEntries()) ticks=getNumberOfEntries();
00256   if (ticks<1) return 0.0;
00257   double sum=0.0;
00258   for (int i=0;i<ticks;i++)
00259     sum+=getEntry(i).data[sensor];
00260   return sum/(double)ticks;
00261 }
00262 
00263 void GT2004SensorDataProcessor::SensorDataRingBuffer::updateAverage(SensorData::sensors sensor, int ticks, double& average)
00264 {
00265   if (ticks<1) return;
00266   if (ticks<getNumberOfEntries())
00267     average-=((double)getEntry(ticks).data[sensor])/(double)ticks;
00268   average+=((double)getEntry(0).data[sensor])/(double)ticks;
00269 }
00270 
00271 long GT2004SensorDataProcessor::SensorDataRingBuffer::interpolate (SensorData::sensors sensor, unsigned long imageFrame)
00272 {
00273   long frame = (long) imageFrame,
00274     currentValue = getEntry(0).data[sensor],
00275     currentFrame = (long) getEntry(0).frameNumber;
00276   if(currentFrame == frame)
00277     return currentValue;
00278   else
00279   {
00280     long oldValue = getEntry(1).data[sensor],
00281       oldFrame = (long) getEntry(1).frameNumber;
00282     if(currentFrame == oldFrame)
00283       return currentValue;
00284     else
00285       return currentValue + (oldValue - currentValue) * (frame - currentFrame) / (oldFrame - currentFrame);
00286   }
00287 }
00288 
00289 void GT2004SensorDataProcessor::calculateBodyPostureFromLegSensors(const SensorData& sensorData, BodyPosture& bP)
00290 {
00291   RobotVertices robotVertices;
00292   Kinematics::calcNeckAndLegPositions(sensorDataBuffer.lastFrame(), robotVertices);
00293 
00294   bP.bodyTiltCalculatedFromLegSensors = robotVertices.bodyTilt;
00295   bP.bodyRollCalculatedFromLegSensors = robotVertices.bodyRoll;
00296   bP.neckHeightCalculatedFromLegSensors = robotVertices.neckHeight;
00297 }
00298 
00299 void GT2004SensorDataProcessor::calculateBodyPostureFromAccelerationSensors(const SensorData& sensorData, BodyPosture& bP)
00300 {
00301   //calculate body angles
00302   long accX = sensorDataBuffer.lastFrame().data[SensorData::accelerationX]/1000;
00303   long accY = sensorDataBuffer.lastFrame().data[SensorData::accelerationY]/1000;
00304   long accZ = sensorDataBuffer.lastFrame().data[SensorData::accelerationZ]/1000;
00305   bP.bodyTiltCalculatedFromAccelerationSensors = atan2((double)accX,(double)-accZ);
00306   bP.bodyRollCalculatedFromAccelerationSensors = atan2((double)-accY,(double)-accZ);
00307 }
00308 
00309 double GT2004SensorDataProcessor::getCameraVelocity(const SensorData::sensors joint=SensorData::headPan)
00310 {
00311   const int numOfValues=4;
00312   int jointNum = 1;
00313   sensorDataRingBuffer.updateAverage(SensorData::neckTilt, numOfValues, actAverage[0]);
00314   sensorDataRingBuffer.updateAverage(SensorData::headPan, numOfValues, actAverage[1]);
00315   sensorDataRingBuffer.updateAverage(SensorData::headTilt, numOfValues, actAverage[2]);
00316   switch (joint)
00317   {
00318   case SensorData::headTilt: jointNum = 2;
00319     break;
00320   case SensorData::headPan: jointNum = 1;
00321     break;
00322   case SensorData::neckTilt: jointNum = 0;
00323     break;
00324   }
00325   double cameraSpeed = toDegrees(fromMicroRad((long) (actAverage[jointNum] - previousAverage[jointNum]))) / RobotDimensions::motionCycleTime;
00326   for (int index = 0; index < 3; index++)
00327     previousAverage[index] = actAverage[index];
00328   /** 
00329   if (abs ((int) cameraSpeed) > 50)
00330     if(SystemCall::getCurrentSystemTime()-tempSysTime > 250)
00331     {
00332       tempSysTime=SystemCall::getCurrentSystemTime();
00333       OUTPUT(idText, text, cameraSpeed);
00334     }
00335   */
00336   return cameraSpeed;
00337 }
00338 
00339 double GT2004SensorDataProcessor::getDistanceToSIFOC()
00340 {
00341   double value = 50;
00342   double psdval = 0;
00343   for (int i = 0; i < psdPercept.numOfPercepts; ++i)
00344     psdval += psdPercept[i].body;
00345   psdval /= (double)(psdPercept.numOfPercepts);
00346   if (psdval >= 170)
00347     psdval = 170;
00348 
00349   // from 160 to 170 equals from 1cm to 0cm
00350   if (psdval >= 160)
00351     value = 10-(psdval-160);
00352   else
00353   // from 145 to 160 equals from 2cm to 1cm
00354   if (psdval >= 145)
00355     value = ((15-(psdval-145))/1.5)+10;
00356   else
00357   // from 130 to 145 equals from 4cm to 2cm
00358   if (psdval >= 130)
00359     value = ((15-(psdval-130))/0.75)+20;
00360 
00361   return value;
00362 }
00363 
00364 
00365 /*
00366 * Change log :
00367 * 
00368 * $Log: GT2004SensorDataProcessor.cpp,v $
00369 * Revision 1.1  2004/07/10 00:18:31  spranger
00370 * renamed (readded) for coderelease
00371 *
00372 * Revision 1.16  2004/06/29 15:13:59  risler
00373 * removed touch sensor averaging and minimum press time, not necessary for ers7 buttons
00374 *
00375 * Revision 1.15  2004/06/17 15:52:06  nistico
00376 * Added visualization of camera motion vector on image
00377 * Fixed cameraMatrix.frameNumber=0 problem when playing logfiles
00378 * (the image frame number is copied)
00379 *
00380 * Revision 1.14  2004/06/17 12:17:14  schmitt
00381 * Modified getCameraVelocity()
00382 * Selection of the speed each head joint is now possible
00383 * Default is headPan
00384 *
00385 * Revision 1.13  2004/06/16 17:07:33  cesarz
00386 * Moved body PSD calculations
00387 *
00388 * Revision 1.12  2004/06/16 12:40:02  cesarz
00389 * implemented getCameraVelocity()
00390 *
00391 * Revision 1.11  2004/05/27 17:13:37  jhoffman
00392 * - renaming: tilt1 -> neckTilt,  pan -> headPan,  tilt2 -> headTilt
00393 * - clipping included for setJoints
00394 * - removed some microrad/rad-bugs
00395 * - bodyPosture constructor and "=" operator fixed
00396 *
00397 * Revision 1.10  2004/05/27 15:45:44  juengel
00398 * bug fixed
00399 *
00400 * Revision 1.9  2004/05/26 21:20:02  juengel
00401 * bodyTiltProvidedByMotionControl etc. is written to BodyPosture.
00402 *
00403 * Revision 1.8  2004/05/26 20:18:05  juengel
00404 * Calculation of BodyPosture.
00405 *
00406 * Revision 1.7  2004/05/26 17:21:47  dueffert
00407 * better data types used
00408 *
00409 * Revision 1.6  2004/05/26 17:12:22  juengel
00410 * Added bodyPosture.frameNumber.
00411 *
00412 * Revision 1.5  2004/05/25 19:11:31  goehring
00413 * PSD-threshold for grab ball changed
00414 *
00415 * Revision 1.4  2004/05/25 14:55:33  tim
00416 * changed parameters for PSD ball detection
00417 *
00418 * Revision 1.3  2004/05/25 12:36:51  tim
00419 * added body PSD data
00420 *
00421 * Revision 1.2  2004/05/24 14:14:26  juengel
00422 * New button evaluation.
00423 *
00424 * Revision 1.1.1.1  2004/05/22 17:21:30  cvsadm
00425 * created new repository GT2004_WM
00426 *
00427 * Revision 1.9  2004/04/07 12:28:59  risler
00428 * ddd checkin after go04 - first part
00429 *
00430 * Revision 1.3  2004/04/03 16:42:27  risler
00431 * removed OUTPUTs
00432 *
00433 * Revision 1.2  2004/04/02 19:10:48  risler
00434 * robot no longer is crashed when using dash
00435 *
00436 * Revision 1.1.1.1  2004/03/29 08:28:47  Administrator
00437 * initial transfer from tamara
00438 *
00439 * Revision 1.8  2004/03/10 14:16:33  risler
00440 * body psd value added to PSDPercept and ObstaclesModel
00441 *
00442 * Revision 1.7  2004/03/08 02:11:51  roefer
00443 * Interfaces should be const
00444 *
00445 * Revision 1.6  2004/01/28 08:33:27  dueffert
00446 * acceleration added
00447 *
00448 * Revision 1.5  2004/01/25 21:06:54  juengel
00449 * headPsdFar is used to calculate PSDPercept, if headPsdNear is greater than 300 mm.
00450 *
00451 * Revision 1.4  2004/01/24 11:29:10  juengel
00452 * Added ERS7 switches (head, backFront, backBack).
00453 *
00454 * Revision 1.3  2004/01/12 12:24:31  juengel
00455 * back pressed for ERS7
00456 *
00457 * Revision 1.2  2003/11/14 19:02:26  goehring
00458 * frameNumber added
00459 *
00460 * Revision 1.1  2003/10/06 14:10:14  cvsadm
00461 * Created GT2004 (M.J.)
00462 *
00463 * Revision 1.4  2003/09/30 10:51:13  dueffert
00464 * typos fixed
00465 *
00466 * Revision 1.3  2003/09/26 11:38:52  juengel
00467 * - sorted tools
00468 * - clean-up in DataTypes
00469 *
00470 * Revision 1.2  2003/07/06 12:05:31  schumann
00471 * added foreleg opening angle for ball challenge
00472 *
00473 * Revision 1.1.1.1  2003/07/02 09:40:24  cvsadm
00474 * created new repository for the competitions in Padova from the 
00475 * tamara CVS (Tuesday 2:00 pm)
00476 *
00477 * removed unused solutions
00478 *
00479 * Revision 1.28  2003/06/23 12:06:38  dueffert
00480 * consequetively roll on wall detection improved
00481 *
00482 * Revision 1.27  2003/06/21 12:53:44  juengel
00483 * psdPercept.isValid = cameraMatrix.isValid
00484 *
00485 * Revision 1.26  2003/06/20 15:32:32  dueffert
00486 * getting from down from wall by rolling added
00487 *
00488 * Revision 1.25  2003/06/20 14:34:31  juengel
00489 * Bug fixed.
00490 *
00491 * Revision 1.24  2003/06/20 13:27:20  risler
00492 * added tailLeft tailRight messages
00493 *
00494 * Revision 1.23  2003/06/12 17:35:25  risler
00495 * remeasured psd delay
00496 *
00497 * Revision 1.22  2003/06/12 16:49:56  risler
00498 * psd sensor data is delayed about 10 frames -> use stored camera matrix
00499 *
00500 * Revision 1.21  2003/05/16 14:06:18  risler
00501 * removed warning
00502 *
00503 * Revision 1.20  2003/05/14 19:54:42  risler
00504 * PSDPercept contains all points from one frame
00505 *
00506 * Revision 1.19  2003/05/02 18:26:18  risler
00507 * SensorDataBuffer added
00508 * replaced SensorData with SensorDataBuffer
00509 * full SensorData resolution now accessible
00510 *
00511 * Revision 1.18  2003/04/07 16:50:11  jhoffman
00512 * added PSD sensor workaround
00513 *
00514 * Revision 1.17  2003/04/04 17:51:23  hebbel
00515 * Removed not needed OUTPUTs
00516 *
00517 * Revision 1.16  2003/04/04 16:08:59  cesarz
00518 * mouth values adepted
00519 *
00520 * Revision 1.15  2003/04/01 22:40:44  cesarz
00521 * added mouth states
00522 *
00523 * Revision 1.14  2003/04/01 16:51:09  roefer
00524 * CameraMatrix contains validity and is calculated in Geometry
00525 *
00526 * Revision 1.13  2003/03/30 14:12:54  juengel
00527 * changed buildPSDPercept
00528 *
00529 * Revision 1.12  2003/03/28 14:32:10  juengel
00530 * Added offset to psdPercept.
00531 *
00532 * Revision 1.11  2003/03/19 17:29:05  roefer
00533 * detectFallDown uses own calculation of tilt and roll
00534 *
00535 * Revision 1.10  2003/01/30 11:26:47  juengel
00536 * Added tailPosition to bodyPercept
00537 *
00538 * Revision 1.9  2002/10/10 18:33:50  loetzsch
00539 * only PSD measurements less than 90 cm are used
00540 *
00541 * Revision 1.8  2002/10/10 16:18:39  loetzsch
00542 * some minor improvements and better doxygen comments
00543 *
00544 * Revision 1.7  2002/10/10 13:09:49  loetzsch
00545 * First experiments with the PSD Sensor
00546 * - SensorDataProcessor now calculates PSDPercept
00547 * - Added the PerceptBehaviorControl solution PSDTest
00548 * - Added the RadarViewer3D to RobotControl, which can display the Points3D structure
00549 *
00550 * Revision 1.6  2002/09/22 18:40:53  risler
00551 * added new math functions, removed GTMath library
00552 *
00553 * Revision 1.5  2002/09/17 23:55:22  loetzsch
00554 * - unraveled several datatypes
00555 * - changed the WATCH macro
00556 * - completed the process restructuring
00557 *
00558 * Revision 1.4  2002/09/12 12:24:09  juengel
00559 * continued change of module/solution mechanisms
00560 *
00561 * Revision 1.3  2002/09/10 21:07:30  loetzsch
00562 * continued change of module/solution mechanisms
00563 *
00564 * Revision 1.2  2002/09/10 17:53:40  loetzsch
00565 * First draft of new Module/Solution Mechanisms
00566 *
00567 * Revision 1.1  2002/09/10 15:36:16  cvsadm
00568 * Created new project GT2003 (M.L.)
00569 * - Cleaned up the /Src/DataTypes directory
00570 * - Removed challenge related source code
00571 * - Removed processing of incoming audio data
00572 * - Renamed AcousticMessage to SoundRequest
00573 *
00574 * Revision 1.2  2002/08/30 14:34:37  dueffert
00575 * removed unused includes
00576 *
00577 * Revision 1.1.1.1  2002/05/10 12:40:15  cvsadm
00578 * Moved GT2002 Project from ute to tamara.
00579 *
00580 * Revision 1.32  2002/04/23 10:38:30  risler
00581 * renamed headOdometry to headState
00582 *
00583 * Revision 1.31  2002/04/18 10:25:32  roefer
00584 * Bremen GO
00585 *
00586 * Revision 1.3  2001/12/01 21:21:59  roefer
00587 * HeadOdometry used in simulation
00588 *
00589 * Revision 1.2  2001/11/30 13:59:17  roefer
00590 * CMU kicking
00591 *
00592 * Revision 1.29  2002/04/08 17:48:28  risler
00593 * added tilt angle calculation, pickedUp detection
00594 * some cleaning up
00595 *
00596 * Revision 1.28  2002/04/02 13:10:20  dueffert
00597 * big change: odometryData and cameraMatrix in image now, old logfiles may be obsolete
00598 *
00599 * Revision 1.27  2002/03/29 23:09:53  roefer
00600 * SensorData initialized to avoid detection of falling down state
00601 *
00602 * Revision 1.26  2002/03/28 15:19:20  risler
00603 * implemented switch messages in RobotStateDetector
00604 *
00605 * Revision 1.25  2002/03/24 20:17:49  roefer
00606 * Warning on noFrameNumber removed
00607 *
00608 * Revision 1.24  2002/03/24 18:15:00  loetzsch
00609 * continued change to blocking sensor data receivers
00610 *
00611 * Revision 1.23  2002/03/24 14:19:46  roefer
00612 * Input now waits for SensorData
00613 *
00614 * Revision 1.22  2002/03/05 17:58:43  risler
00615 * added detectPickup
00616 *
00617 * Revision 1.21  2002/02/27 11:28:44  roefer
00618 * Better CameraMatrix calculation reactivated
00619 *
00620 * Revision 1.20  2002/02/16 16:24:28  roefer
00621 * SensorData interpolation corrected
00622 *
00623 * Revision 1.19  2002/02/14 16:45:00  petters
00624 * no message
00625 *
00626 * Revision 1.18  2002/02/11 11:13:06  roefer
00627 * BallPerceptor and BallLocator inserted
00628 *
00629 * Revision 1.17  2002/02/05 20:26:46  petters
00630 * ... uncommented
00631 *
00632 * Revision 1.16  2002/02/05 17:34:18  petters
00633 * interpolation functions in sensor data buffer added (not tested -> commented out)
00634 *
00635 * Revision 1.15  2002/02/03 09:32:54  risler
00636 * RingBuffer from DefaultSensorDataProcessor now is seperate class
00637 *
00638 * Revision 1.14  2002/02/01 15:03:23  risler
00639 * Removed pickup detection, as not working with paw sensors
00640 *
00641 * Revision 1.13  2002/01/29 18:11:04  mkunz
00642 * buildCameraMatrix pre-calculated (correctly, i hope)
00643 *
00644 * Revision 1.12  2002/01/29 12:53:33  risler
00645 * optimised buildCameraMatrix with new Pose3D functions
00646 *
00647 * Revision 1.11  2002/01/22 14:52:23  juengel
00648 * Compiler braucht nun nicht mehr so viel Speicher
00649 *
00650 * Revision 1.10  2002/01/20 23:35:06  loetzsch
00651 * Added parameter imageFrameNumber to execute(...)
00652 *
00653 * Revision 1.9  2002/01/18 12:51:39  petters
00654 * no message
00655 *
00656 * Revision 1.8  2002/01/18 12:46:40  petters
00657 * buildcameramatrix fixed
00658 *
00659 * Revision 1.7  2002/01/18 12:24:17  mkunz
00660 * build camera matrix added
00661 *
00662 * Revision 1.6  2002/01/18 11:23:17  petters
00663 * return bodypercept added
00664 *
00665 * Revision 1.5  2001/12/28 22:39:25  roefer
00666 * abs replaced by fabs
00667 *
00668 * Revision 1.4  2001/12/23 23:45:29  petters
00669 * sensordatabuffer implemented, state detector implemented, switch detector implemented
00670 *
00671 * Revision 1.3  2001/12/12 20:21:12  petters
00672 * Streaming for SensorData / Image implemented; Conflict solved
00673 *
00674 * Revision 1.2  2001/12/10 17:47:07  risler
00675 * change log added
00676 *
00677 */

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