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

Modules/ObstaclesLocator/GT2004ObstaclesLocator.cpp

Go to the documentation of this file.
00001 /**
00002 * @file GT2004ObstaclesLocator.cpp
00003 *
00004 * This file contains a class for obstacle localization.
00005 * @author Jan Hoffmann
00006 * @author <a href="mailto:juengel@informatik.hu-berlin.de">Matthias Juengel</a>
00007 */
00008 
00009 #include "GT2004ObstaclesLocator.h"
00010 #include "Tools/Debugging/DebugDrawings.h"
00011 #include "Tools/Math/Geometry.h"
00012 #include "Tools/FieldDimensions.h"
00013 #include "Tools/Math/Matrix2x2.h"
00014 #include "Tools/Debugging/GenericDebugData.h"
00015 #include "Platform/SystemCall.h"
00016 
00017 GT2004ObstaclesLocator::GT2004ObstaclesLocator(const ObstaclesLocatorInterfaces& interfaces)
00018 : ObstaclesLocator(interfaces), headTiltClipPSD(-.3)
00019 {
00020   usePSD = true;
00021   useLinesPercept = false;
00022   useObstaclesPercept = true;
00023   useAging = true;
00024   
00025   sectorWidth = pi2/(double)ObstaclesModel::numOfSectors;
00026 
00027   for(int i = 0; i < ObstaclesModel::numOfSectors; i++)
00028   {
00029     obstacles[i].x = 0;
00030     obstacles[i].y = 0;
00031     obstacleTypes[i] = ObstaclesPercept::unknown;
00032   }
00033 }
00034 
00035 
00036 void GT2004ObstaclesLocator::execute()
00037 {
00038   odometry = odometryData - lastOdometry;
00039   lastOdometry = odometryData;
00040 
00041   moveObstaclesByOdometry();
00042 
00043 //  if(usePSD) addPSDPercept();
00044   if(useObstaclesPercept) addObstaclesPercept();
00045   if(useLinesPercept) addLinesPercept();
00046 
00047   setObstaclesModel(true);
00048   obstaclesModel.setFrameNumber(obstaclesPercept.frameNumber);
00049 
00050 
00051   determineFreePartsOfGoals();
00052   determineNextFreeTeammate();
00053   DEBUG_DRAWING_FINISHED(sketch);
00054 }
00055 
00056 void GT2004ObstaclesLocator::moveObstaclesByOdometry()
00057 {
00058   // move representatives by odometry
00059 /*  if (odometry.translation.x == 0 &&
00060       odometry.translation.y == 0 &&
00061       odometry.rotation == 0) return;
00062 */
00063 
00064   Vector2<double> c1(cos(odometry.rotation),-sin(odometry.rotation));
00065   Vector2<double> c2(sin(odometry.rotation),cos(odometry.rotation));
00066   Matrix2x2<double> R(c1, c2);
00067 
00068   Vector2<double> movedObstacles[ObstaclesModel::numOfSectors];
00069   unsigned long movedTimestamps[ObstaclesModel::numOfSectors];
00070   ObstaclesPercept::ObstacleType movedObstacleTypes[ObstaclesModel::numOfSectors];
00071   int numOfObstacles = 0;
00072 
00073   int i;  
00074 
00075   for(i = 0; i < ObstaclesModel::numOfSectors; i++)
00076   {
00077     if (
00078       (obstacles[i].x != 0 || obstacles[i].y != 0) &&
00079       (!useAging ||
00080        SystemCall::getTimeSince(timestamps[i]) < timeAfterWhichObstacleIsForgotten)
00081        )
00082     {
00083       movedObstacles[numOfObstacles] = R*obstacles[i];
00084       movedObstacles[numOfObstacles] -= odometry.translation;
00085       movedObstacleTypes[numOfObstacles] = obstacleTypes[i];
00086       movedTimestamps[numOfObstacles] = timestamps[i];
00087       numOfObstacles++;
00088     }
00089     obstacles[i].x = obstacles[i].y = 0;
00090     obstacleTypes[i] = ObstaclesPercept::unknown;
00091   }
00092 
00093   for(i = 0; i < numOfObstacles; i++)
00094   {
00095     int targetSector = ObstaclesModel::getSectorFromAngle(movedObstacles[i].angle());
00096     double sqrDistance = movedObstacles[i]*movedObstacles[i];
00097 
00098     if
00099       (
00100         sqrDistance >= 10.0 &&
00101 //        sqrDistance < ObstaclesModel::maxDistance*ObstaclesModel::maxDistance &&
00102         (
00103          (obstacles[targetSector].x == 0 && obstacles[targetSector].y == 0) || 
00104          sqrDistance <= obstacles[targetSector]*obstacles[targetSector]
00105         )
00106       )
00107     {
00108       obstacles[targetSector] = movedObstacles[i];
00109       obstacleTypes[targetSector] = movedObstacleTypes[i];
00110       timestamps[targetSector] = movedTimestamps[i];
00111     }
00112   }
00113 }
00114 
00115 void GT2004ObstaclesLocator::setObstaclesModel(bool addWorldModel)
00116 {
00117   int i;
00118   double distance;
00119 
00120   ObstaclesModel buffer;
00121 
00122   // set sector distances
00123   for(i = 0; i < ObstaclesModel::numOfSectors; i++)
00124   {
00125     distance = obstacles[i].abs();
00126 
00127     // if the player is the goalie, don't avoid own penalty area!
00128     if (getPlayer().getPlayerNumber() != Player::one)
00129     //if (addWorldModel)
00130     {
00131       if (FieldDimensions::distanceToOwnPenaltyArea(robotPose) > 0)
00132       {
00133         double distToPenaltyArea = field.getDistanceToOwnPenaltyArea(robotPose + Pose2D(ObstaclesModel::getAngleOfSector(i)));
00134         if (distToPenaltyArea > 50 && distToPenaltyArea < ObstaclesModel::maxDistance)
00135           if ((distToPenaltyArea < distance) || (distance == 0))
00136             distance = distToPenaltyArea;
00137       }
00138     }
00139 
00140     if(distance > 0)
00141     {
00142       buffer.distance[i] = (int)distance;
00143       buffer.obstacleType[i] = obstacleTypes[i];
00144     }
00145     else
00146     {
00147       buffer.distance[i] = ObstaclesModel::maxDistance;
00148       buffer.obstacleType[i] = ObstaclesPercept::unknown;
00149     }
00150   }
00151 
00152 
00153 
00154   // remove near peaks to make it more robust against 
00155   // noise!
00156   for(i = 0; i < ObstaclesModel::numOfSectors; i++)
00157   {
00158     // if the two neighbouring sectors have a distance
00159     // that is 200 mm greater than the current one, 
00160     // perform smoothing:
00161     if ((buffer.distance[i] - buffer.distance[(i+1)%ObstaclesModel::numOfSectors] < -200) &&
00162         (buffer.distance[i] - buffer.distance[(i+ObstaclesModel::numOfSectors-1)%ObstaclesModel::numOfSectors]) < -200)
00163     {
00164       obstaclesModel.distance[i] = (buffer.distance[(i+1)%ObstaclesModel::numOfSectors] +
00165         buffer.distance[(i-1)%ObstaclesModel::numOfSectors])/2;
00166     }
00167     else
00168     {
00169       obstaclesModel.distance[i] = buffer.distance[i];
00170     }
00171     //obstaclesModel.distance[i] = buffer.distance[i];
00172     obstaclesModel.obstacleType[i] = buffer.obstacleType[i];
00173   }
00174 
00175   // calculate corridor
00176 
00177   /* the following is pretty useless !! - thinks JH 
00178 
00179   
00180  
00181   */
00182   double closest = ObstaclesModel::maxDistance; 
00183   for(i = ObstaclesModel::getSectorFromAngle(-pi_2); i < ObstaclesModel::getSectorFromAngle(pi_2); i++)
00184   {
00185     if ((obstacles[i].x < closest) && (obstacles[i].x > 10)
00186       && (obstacles[i].y < 90) && (obstacles[i].y > -90))
00187       closest = obstacles[i].x;
00188   }
00189   obstaclesModel.corridorInFront = (int )closest;
00190 
00191   obstaclesModel.bodyPSD = psdPercept[psdPercept.numOfPercepts - 1].body;
00192 }
00193 
00194 void GT2004ObstaclesLocator::addPSDPercept()
00195 {
00196   for (int i = 0; i < psdPercept.numOfPercepts; i++)
00197   {
00198     if (psdPercept[i].neckTilt > headTiltClipPSD && psdPercept[i].isValid)
00199     {
00200       // latest measurement
00201       Vector2<double> psdPoint(psdPercept[i].x, psdPercept[i].y);
00202       int sector = ObstaclesModel::getSectorFromAngle(psdPoint.angle());
00203       
00204        // point is on the ground  
00205       if(psdPercept[i].z < 90)
00206       {    
00207         double sqrDistance = obstacles[sector] * obstacles[sector];
00208         // only update if the point seen is farther away
00209         if (sqrDistance > 0 &&
00210             sqrDistance < psdPoint * psdPoint)
00211         {
00212           obstacles[sector].x = psdPoint.x;
00213           obstacles[sector].y = psdPoint.y;
00214           timestamps[sector] = SystemCall::getCurrentSystemTime();
00215         }
00216       }
00217       // point is an obstacle
00218       else if (!psdPercept[i].tooFarAway) 
00219       {
00220         double angleToPoint = normalize(psdPoint.angle());
00221         double angleToBall = Geometry::angleTo(robotPose.getPose(), ballModel.seen);
00222 
00223         if(toDegrees(normalize(angleToPoint - angleToBall)) < 10 &&
00224           toDegrees(normalize(angleToPoint - angleToBall)) > -10 && 
00225           SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 1000)
00226         {
00227           DOT(sketch, 20, 10, Drawings::green, Drawings::green);
00228         }
00229         else
00230         {
00231           obstacles[sector].x = psdPoint.x;
00232           obstacles[sector].y = psdPoint.y;
00233           timestamps[sector] = SystemCall::getCurrentSystemTime();
00234         }
00235       }
00236       // if nothing in this direction, perform reset
00237       else 
00238       {
00239         obstacles[sector].x = 0;
00240         obstacles[sector].y = 0;
00241       }
00242     }
00243   }
00244 }
00245 
00246 void GT2004ObstaclesLocator::addLinesPercept()
00247 {
00248   int i;
00249   for(i = 0; i < linesPercept.numberOfPoints[LinesPercept::redRobot]; i++)
00250   {
00251     Vector2<double> obstaclePoint(linesPercept.points[LinesPercept::redRobot][i].x, linesPercept.points[LinesPercept::redRobot][i].y);
00252     addObstaclePoint(obstaclePoint, limit);
00253   }
00254   for(i = 0; i < linesPercept.numberOfPoints[LinesPercept::blueRobot]; i++)
00255   {
00256     Vector2<double> obstaclePoint(linesPercept.points[LinesPercept::blueRobot][i].x, linesPercept.points[LinesPercept::blueRobot][i].y);
00257     addObstaclePoint(obstaclePoint, limit);
00258   }
00259   for(i = 0; i < linesPercept.numberOfPoints[LinesPercept::border]; i++)
00260   {
00261     Vector2<double> obstaclePoint(linesPercept.points[LinesPercept::border][i].x, linesPercept.points[LinesPercept::border][i].y);
00262     addObstaclePoint(obstaclePoint, extend);
00263   }
00264 }
00265 
00266 void GT2004ObstaclesLocator::addObstaclesPercept()
00267 {
00268   int i;
00269   //for(i = 1; i < obstaclesPercept.numberOfPoints - 1; i++)
00270   for(i = 0; i < obstaclesPercept.numberOfPoints ; i++)
00271   {
00272 //    Vector2<double> obstaclePoint(obstaclesPercept.farPoints[i].x, obstaclesPercept.farPoints[i].y);
00273 //    addObstaclePoint(obstaclePoint, limit);
00274   
00275 //    if(
00276 //      Geometry::distance(
00277 //      obstaclesPercept.farPoints[i], 
00278 //      obstaclesPercept.farPoints[i-1]) < 300 
00279 //      &&
00280 //      Geometry::distance(
00281 //      obstaclesPercept.farPoints[i], 
00282 //      obstaclesPercept.farPoints[i+1]) < 300 
00283 //      )
00284     addObstaclePoints(
00285       obstaclesPercept.nearPoints[i], 
00286       obstaclesPercept.farPoints[i], 
00287       obstaclesPercept.farPointIsOnImageBorder[i],
00288       obstaclesPercept.obstacleType[i]);
00289   }
00290 }
00291 
00292 void GT2004ObstaclesLocator::addObstaclePoint
00293 (
00294  const Vector2<double>& obstaclePoint,
00295  UpdateMode mode
00296  )
00297 {
00298   double angleToPoint = normalize(obstaclePoint.angle());
00299 
00300   //Vision based obstacles percept does not contain balls.
00301 /*
00302   double angleToBall = Geometry::angleTo(robotPose.getPose(), ballModel.seen);
00303   if(toDegrees(normalize(angleToPoint - angleToBall)) < 10 &&
00304     toDegrees(normalize(angleToPoint - angleToBall)) > -10 && 
00305     SystemCall::getTimeSince(ballModel.seen.timeWhenLastSeen) < 1000)
00306   {
00307     DOT(sketch, 10, 10, Drawings::red, Drawings::red);
00308     return;
00309   }
00310 */ 
00311 
00312   int sector = ObstaclesModel::getSectorFromAngle(angleToPoint);
00313 
00314   if ( sector >= ObstaclesModel::numOfSectors || ObstaclesModel::numOfSectors < 0 ) 
00315   {
00316     sector = 0;
00317     return;
00318 
00319     OUTPUT ( idText, text, "sector >= ObstaclesModel::numOfSectors" );
00320   }
00321   double sqrDistanceInModel = obstacles[sector] * obstacles[sector];
00322   double sqrDistanceToPoint = obstaclePoint * obstaclePoint;
00323 
00324   if(sqrt(sqrDistanceToPoint) < 150)
00325   {
00326     DOT(sketch, 30, 10, Drawings::blue, Drawings::blue);
00327     return;
00328   }
00329 
00330   switch(mode)
00331   {
00332   case overwrite:
00333       obstacles[sector].x = obstaclePoint.x;
00334       obstacles[sector].y = obstaclePoint.y;
00335       timestamps[sector] = SystemCall::getCurrentSystemTime();
00336     break;
00337   case extend:
00338     // only update if the new point seen is farther away than the old one
00339     if(sqrDistanceInModel < sqrDistanceToPoint)
00340     {
00341       obstacles[sector].x = obstaclePoint.x;
00342       obstacles[sector].y = obstaclePoint.y;
00343       timestamps[sector] = SystemCall::getCurrentSystemTime();
00344     }
00345     break;
00346  case limit:
00347     // only update if the new point is closer than the old one
00348     if(
00349       (obstacles[sector].x == 0 && obstacles[sector].y == 0) ||
00350        sqrDistanceToPoint < sqrDistanceInModel)
00351     {
00352       obstacles[sector].x = obstaclePoint.x;
00353       obstacles[sector].y = obstaclePoint.y;
00354       timestamps[sector] = SystemCall::getCurrentSystemTime();
00355     }
00356     break;
00357   }
00358 }
00359 
00360 void GT2004ObstaclesLocator::addObstaclePoints
00361 (
00362  const Vector2<int>& nearPoint,
00363  const Vector2<int>& farPoint,
00364  bool farPointIsOnImageBorder,
00365  ObstaclesPercept::ObstacleType obstacleType
00366  )
00367 {
00368   double angleToPoints = normalize(farPoint.angle());
00369   int sector = ObstaclesModel::getSectorFromAngle(angleToPoints);
00370 
00371   if ( sector >= ObstaclesModel::numOfSectors || ObstaclesModel::numOfSectors < 0 ) 
00372   {
00373     sector = 0;
00374     return;
00375     OUTPUT ( idText, text, "sector >= ObstaclesModel::numOfSectors" );
00376   }
00377   double sqrDistanceInModel = obstacles[sector] * obstacles[sector];
00378   double sqrDistanceToNearPoint = nearPoint * nearPoint;
00379   double sqrDistanceToFarPoint = farPoint * farPoint;
00380 
00381   if(sqrDistanceToNearPoint > sqrDistanceInModel && sqrDistanceInModel != 0) return;
00382   else if(!farPointIsOnImageBorder)
00383   {
00384     obstacles[sector].x = farPoint.x;
00385     obstacles[sector].y = farPoint.y;
00386     if(obstacleType != ObstaclesPercept::unknown || (fabs(sqrDistanceToFarPoint - sqrDistanceInModel) > 500)) 
00387       obstacleTypes[sector] = obstacleType;
00388     timestamps[sector] = SystemCall::getCurrentSystemTime();
00389   }
00390   else if(sqrDistanceInModel < sqrDistanceToFarPoint && sqrDistanceInModel != 0)
00391   {
00392     obstacles[sector].x = farPoint.x;
00393     obstacles[sector].y = farPoint.y;
00394     timestamps[sector] = SystemCall::getCurrentSystemTime();
00395   }
00396 }
00397 
00398 
00399 void GT2004ObstaclesLocator::determineFreePartsOfGoals()
00400 {
00401   for(int i = 0; i < 2; i++)
00402   {
00403     if (obstaclesPercept.angleToFreePartOfGoalWasDetermined[i])
00404     {
00405       lastTimeFreePartOfGoalWasDetermined[i] = SystemCall::getCurrentSystemTime();
00406       if(
00407         obstaclesPercept.widthOfFreePartOfGoal[i] > widthOfFreePartOfGoal[i] 
00408         || 
00409         (
00410         angleToFreePartOfGoal[i] - widthOfFreePartOfGoal[i] / 2.0 <
00411         obstaclesPercept.angleToFreePartOfGoal[i]
00412         &&
00413         obstaclesPercept.angleToFreePartOfGoal[i] <
00414         angleToFreePartOfGoal[i] + widthOfFreePartOfGoal[i] / 2.0
00415         )
00416         )
00417       {
00418         angleToFreePartOfGoal[i] = obstaclesPercept.angleToFreePartOfGoal[i];
00419         widthOfFreePartOfGoal[i] = obstaclesPercept.widthOfFreePartOfGoal[i];
00420         distanceToFreePartOfGoal[i] = obstaclesPercept.distanceToFreePartOfGoal[i];
00421 
00422         obstaclesModel.angleToFreePartOfGoalWasDetermined[i] = true;
00423       }
00424     }
00425     else if(SystemCall::getTimeSince(lastTimeFreePartOfGoalWasDetermined[i]) < 2000)
00426     {
00427       angleToFreePartOfGoal[i] -= odometry.getAngle();
00428       obstaclesModel.angleToFreePartOfGoalWasDetermined[i] = true;
00429     }
00430     else
00431     {
00432       angleToFreePartOfGoal[i] = 0.0;
00433       widthOfFreePartOfGoal[i] = 0.0;
00434       distanceToFreePartOfGoal[i] = 1000.0;
00435 
00436       obstaclesModel.angleToFreePartOfGoalWasDetermined[i] = false;
00437     }
00438     obstaclesModel.angleToFreePartOfGoal[i] = angleToFreePartOfGoal[i];
00439     obstaclesModel.widthOfFreePartOfGoal[i] = widthOfFreePartOfGoal[i];
00440     obstaclesModel.distanceToFreePartOfGoal[i] = distanceToFreePartOfGoal[i];
00441   }
00442 }
00443 
00444 void GT2004ObstaclesLocator::determineNextFreeTeammate()
00445 {
00446   int distanceToNextTeammate = 10000;
00447   double angleToNextTeammate = 0;
00448 
00449   bool foundTeammate = false;
00450 
00451   for(int i = 0; i < playerPoseCollection.numberOfOwnPlayers; i++)
00452   {
00453     PlayerPose currentPose = playerPoseCollection.getOwnPlayerPose(i);
00454     int currentDistance = (int)((currentPose.getPose().translation - robotPose.translation).abs());
00455     double currentAngle = normalize(Geometry::angleTo(robotPose, currentPose.getPose().translation));
00456 
00457     int targetSector = ObstaclesModel::getSectorFromAngle(currentAngle);
00458     int distanceOfTargetSector = (int)obstacles[targetSector].abs();
00459 
00460     if(currentDistance < distanceToNextTeammate && 
00461       (
00462       distanceOfTargetSector == 0 ||
00463       distanceOfTargetSector + 200 > distanceToNextTeammate
00464       )
00465       )
00466     {
00467       foundTeammate = true;
00468       angleToNextTeammate = currentAngle;
00469       distanceToNextTeammate = currentDistance;
00470     }
00471   }
00472   if(foundTeammate)
00473   {
00474     obstaclesModel.angleToNextFreeTeammateWasDetermined = true;
00475     obstaclesModel.angleToNextFreeTeammate = angleToNextTeammate;
00476     obstaclesModel.distanceToNextFreeTeammate = distanceToNextTeammate;
00477   }
00478   else
00479   {
00480     obstaclesModel.angleToNextFreeTeammateWasDetermined = false;
00481   }
00482 }
00483 
00484 
00485 bool GT2004ObstaclesLocator::handleMessage(InMessage& message)
00486 {
00487   bool handled = false;
00488 
00489   switch(message.getMessageID())
00490   {
00491   case idGenericDebugData:
00492     GenericDebugData d;
00493     message.bin >> d;
00494     if(d.id == GenericDebugData::defaultObstaclesLocator)
00495     {
00496       OUTPUT(idText,text,"generic debug message handled by module DefaultObstaclesLocator");
00497 
00498       headTiltClipPSD = d.data[0];
00499       switch((int)d.data[1])
00500       {
00501       case 0: usePSD = true; useLinesPercept = false; useAging = false;
00502         break;
00503       case 1: usePSD = false; useLinesPercept = true; useAging = false;
00504         break;
00505       case 2: usePSD = false; useLinesPercept = true; useAging = true;
00506         break;
00507       case 3: usePSD = true; useLinesPercept = true; useAging = false;
00508         break;
00509       case 4: usePSD = true; useLinesPercept = true; useAging = true;
00510         break;
00511       };
00512     }
00513     handled = true;
00514     break;
00515 
00516   }
00517   return handled;
00518 }
00519  
00520 /*
00521 * Change log :
00522 * 
00523 * $Log: GT2004ObstaclesLocator.cpp,v $
00524 * Revision 1.1  2004/07/10 00:18:30  spranger
00525 * renamed (readded) for coderelease
00526 *
00527 * Revision 1.6  2004/06/17 11:12:30  risler
00528 * penalty area only in obstacle model if distance smaller than maxDistance
00529 *
00530 * Revision 1.5  2004/06/16 18:17:48  risler
00531 * change obstacle type to unknown if distance to obstacle is different
00532 * dont change obstacle type if obstacle was not seen
00533 *
00534 * Revision 1.4  2004/06/16 18:12:53  risler
00535 * change obstacle type to unknown if distance to obstacle is different
00536 * dont change obstacle type if obstacle was not seen
00537 *
00538 * Revision 1.3  2004/05/27 17:13:37  jhoffman
00539 * - renaming: tilt1 -> neckTilt,  pan -> headPan,  tilt2 -> headTilt
00540 * - clipping included for setJoints
00541 * - removed some microrad/rad-bugs
00542 * - bodyPosture constructor and "=" operator fixed
00543 *
00544 * Revision 1.2  2004/05/22 22:52:02  juengel
00545 * Renamed ballP_osition to ballModel.
00546 *
00547 * Revision 1.1.1.1  2004/05/22 17:20:38  cvsadm
00548 * created new repository GT2004_WM
00549 *
00550 * Revision 1.13  2004/04/07 12:28:59  risler
00551 * ddd checkin after go04 - first part
00552 *
00553 * Revision 1.3  2004/04/02 00:32:37  dthomas
00554 * fix bug in obstacle model
00555 *
00556 * Revision 1.2  2004/04/02 00:18:46  dthomas
00557 * fix bug with goalie and penalty-area
00558 *
00559 * Revision 1.1.1.1  2004/03/29 08:28:47  Administrator
00560 * initial transfer from tamara
00561 *
00562 * Revision 1.12  2004/04/05 17:56:47  loetzsch
00563 * merged the local German Open CVS of the aibo team humboldt with the tamara CVS
00564 *
00565 * Revision 1.2  2004/04/01 21:06:30  hoffmann
00566 * bug fixed thanks to thomas
00567 *
00568 * Revision 1.1.1.1  2004/03/31 11:16:47  loetzsch
00569 * created ATH repository for german open 2004
00570 *
00571 * Revision 1.11  2004/03/29 15:04:07  juengel
00572 * Bug fixed.
00573 *
00574 * Revision 1.10  2004/03/25 09:13:34  jhoffman
00575 * - obstacles percepts: all percepts are put into the model (again! no filtering)
00576 * - filtering when model is created: single "peaks" are removed if neighboring sectors are further away
00577 *
00578 * Revision 1.9  2004/03/17 10:28:37  jhoffman
00579 * uncommented matthias' code to make it more robust against bad obstacle percepts (false positives)
00580 *
00581 * Revision 1.8  2004/03/16 14:00:21  juengel
00582 * Integrated Improvments from "Günne"
00583 * -ATH2004ERS7Behavior
00584 * -ATHHeadControl
00585 * -KickSelectionTable
00586 * -KickEditor
00587 *
00588 * Revision 1.7  2004/03/10 14:16:33  risler
00589 * body psd value added to PSDPercept and ObstaclesModel
00590 * - added ATH2004HeadControl
00591 * - added ATH2004LEDControl
00592 * - headmotiontester shows "tilt2"
00593 * - motion process updates odometry while no new robotPose is received, added to motion request
00594 * - some ui adjustments
00595 * - added member function to "field" to find out if robot is in own penalty area for use in the obstacles locator
00596 *
00597 * Revision 1.6  2004/03/08 01:39:03  roefer
00598 * Interfaces should be const
00599 *
00600 * Revision 1.5  2004/03/01 11:42:47  juengel
00601 * Different types are handled.
00602 *
00603 * Revision 1.4  2004/02/28 14:08:23  juengel
00604 * Added ObstacleType to ObstaclesModel.
00605 *
00606 * Revision 1.3  2003/11/14 19:02:26  goehring
00607 * frameNumber added
00608 *
00609 * Revision 1.2  2003/11/10 11:35:24  juengel
00610 * Added distance check for to neighbouring points.
00611 *
00612 * Revision 1.1  2003/10/06 14:10:14  cvsadm
00613 * Created GT2004 (M.J.)
00614 *
00615 * Revision 1.2  2003/09/26 11:38:52  juengel
00616 * - sorted tools
00617 * - clean-up in DataTypes
00618 *
00619 * Revision 1.1.1.1  2003/07/02 09:40:24  cvsadm
00620 * created new repository for the competitions in Padova from the 
00621 * tamara CVS (Tuesday 2:00 pm)
00622 *
00623 * removed unused solutions
00624 *
00625 * Revision 1.28  2003/06/25 18:45:10  juengel
00626 * Added nearPoints, farPoints[maxNumberOfPoints] and farPointIsOnImageBorder to ObstaclesPercept.
00627 *
00628 * Revision 1.27  2003/06/21 12:53:18  juengel
00629 * Changed maximal ground height to 90 mm, psdPercept.isValid is used.
00630 *
00631 * Revision 1.26  2003/06/19 12:09:45  juengel
00632 * No max distance for odometry update.
00633 *
00634 * Revision 1.25  2003/06/18 13:58:25  juengel
00635 * Added ballP_osition to ObstaclesLocatorInterfaces.
00636 * Ball is not an obstacle.
00637 *
00638 * Revision 1.24  2003/06/17 18:26:54  thomas
00639 * modified: auskommentiert von PropagatedBallP_osition::getPropagatedSpeed und range abgefangen in DefaultObstaclesLocator::addObstaclePoint
00640 *
00641 * Revision 1.23  2003/06/17 14:47:11  juengel
00642 * Added update mode.
00643 *
00644 * Revision 1.22  2003/06/13 14:51:56  juengel
00645 * Added addObstaclesPercept.
00646 *
00647 * Revision 1.21  2003/06/12 16:52:37  juengel
00648 * Activated usage of vision.
00649 *
00650 * Revision 1.20  2003/06/02 14:59:13  risler
00651 * bugfix: crash if angle is not normalized
00652 *
00653 * Revision 1.19  2003/06/02 09:08:51  loetzsch
00654 * 6 seconds free part of opponent goal modeling
00655 * -> 2 seconds
00656 *
00657 * Revision 1.18  2003/05/26 08:23:32  juengel
00658 * Added determineFreePartsOfGoals() and determineNextFreeTeammate();
00659 *
00660 * Revision 1.17  2003/05/22 10:06:55  risler
00661 * odometry update optimized
00662 *
00663 * Revision 1.16  2003/05/21 11:44:02  risler
00664 * added aging
00665 * some optimizations
00666 *
00667 * Revision 1.15  2003/05/16 14:07:48  risler
00668 * added radar view obstacles drawing
00669 *
00670 * Revision 1.14  2003/05/15 00:56:47  risler
00671 * added functions for sector to angle mapping to ObstaclesModel
00672 * sector to angle mapping unified
00673 * added rule AvoidObstacles
00674 *
00675 * Revision 1.13  2003/05/14 19:54:42  risler
00676 * PSDPercept contains all points from one frame
00677 *
00678 * Revision 1.12  2003/05/14 13:08:37  risler
00679 * removed DefaultObstaclesLocator
00680 * renamed MicroSectorsObstaclesLocator to DefaultObstaclesLocator
00681 * ObstaclesModel contains increased number of sectors
00682 * DefaultObstaclesLocator clean up
00683 *
00684 * Revision 1.9  2003/04/14 16:10:12  loetzsch
00685 * ATH after GermanOpen CVS merge
00686 *
00687 * Revision 1.7  2003/04/10 22:28:57  Jan Hoffmann
00688 * obstacle avoider tuning
00689 *
00690 * Revision 1.6  2003/04/10 15:08:14  Jan Hoffmann
00691 * disabled vision
00692 *
00693 * Revision 1.5  2003/04/10 14:14:46  Jan Hoffmann
00694 * added corridor to obstacle model
00695 *
00696 * Revision 1.4  2003/04/09 20:15:13  juengel
00697 * Added Border to obstacles.
00698 *
00699 * Revision 1.3  2003/04/09 20:12:16  Jan Hoffmann
00700 * no message
00701 *
00702 * Revision 1.2  2003/04/09 18:38:20  Jan Hoffmann
00703 * added parameter for searchForBall to specify time before scanning starts when ball was not seen
00704 *
00705 * Revision 1.1.1.1  2003/04/09 14:22:29  loetzsch
00706 * started Aibo Team Humboldt's GermanOpen CVS
00707 *
00708 * Revision 1.8  2003/04/06 21:37:39  juengel
00709 * Added some methods.
00710 *
00711 * Revision 1.7  2003/04/06 17:14:37  jhoffman
00712 * added headTilt to PSDpercept and added debugging capabilities to microsectors
00713 *
00714 * Revision 1.6  2003/04/06 16:31:55  jhoffman
00715 * no message
00716 *
00717 * Revision 1.5  2003/04/06 12:14:58  jhoffman
00718 * bug removed and code consolidated
00719 *
00720 * Revision 1.4  2003/04/05 17:33:08  jhoffman
00721 * if long distances are perceived as free, the micro sector is reset
00722 *
00723 * Revision 1.3  2003/04/05 12:46:11  jhoffman
00724 * worked on obstacle model
00725 *
00726 * Revision 1.2  2003/04/04 09:35:09  jhoffman
00727 * added obstacle locator
00728 *
00729 *
00730 */

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