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

Representations/Cognition/ObstaclesModel.cpp

Go to the documentation of this file.
00001 /**
00002  * @file ObstaclesModel.cpp
00003  *
00004  * Implementation of class ObstaclesModel. 
00005  * @author <a href="mailto:juengel@informatik.hu-berlin.de">Matthias Juengel</a>
00006  */
00007 
00008 #include "ObstaclesModel.h"
00009 #include "Tools/Math/Geometry.h"
00010 #include "Tools/Debugging/DebugDrawings.h"
00011 #include "Tools/RingBufferWithSum.h"
00012 
00013 ObstaclesModel::ObstaclesModel()
00014 {
00015   for(int i = 0; i < numOfSectors; i++)
00016   {
00017     distance[i] = maxDistance;
00018   }
00019   corridorInFront = maxDistance;
00020   angleToFreePartOfGoalWasDetermined[0] = false;
00021   angleToFreePartOfGoalWasDetermined[1] = false;
00022   angleToNextFreeTeammateWasDetermined = false;
00023   bodyPSD = 0;
00024 }
00025 
00026 ObstaclesModel::~ObstaclesModel()
00027 {
00028 }
00029 
00030 int ObstaclesModel::getDistanceInMajorDirection(Directions direction) const
00031 {
00032   int numberOfMicrosPerMacro = numOfSectors/numberOfDirections;
00033   int macroSector = (int)direction;
00034   int sector;
00035   int endSector = ((macroSector+1)*numberOfMicrosPerMacro-numberOfMicrosPerMacro/2)%numOfSectors;
00036 
00037   int minDistance = maxDistance;
00038 
00039   for(
00040     sector = macroSector*numberOfMicrosPerMacro-numberOfMicrosPerMacro/2; 
00041     sector != endSector; 
00042     sector = (sector + 1) % numOfSectors)
00043     if(distance[sector] < minDistance) 
00044       minDistance = distance[sector];
00045 
00046   return minDistance;
00047 }
00048 
00049 
00050 
00051 int ObstaclesModel::getDistanceInDirection(double direction, double openingAngle) const
00052 {
00053   int sector;
00054   int minDistance = maxDistance;
00055   int endSector = getSectorFromAngle(direction + openingAngle);
00056 
00057   for (
00058     sector = getSectorFromAngle(direction - openingAngle);
00059     sector != endSector;
00060     sector = (sector + 1) % numOfSectors)
00061     if (distance[sector] < minDistance)
00062       minDistance = distance[sector];
00063 
00064   return minDistance;
00065 }
00066 
00067 
00068 double ObstaclesModel::getTotalFreeSpaceInSector(double direction, double openingAngle, double maxDist) const
00069 {
00070   int sector;
00071   int endSector = getSectorFromAngle(direction + openingAngle/2);
00072   double sum = 0.0;
00073 
00074   for (sector = getSectorFromAngle(direction - openingAngle/2); 
00075     sector != endSector; sector = (sector + 1) % numOfSectors)
00076     {
00077     if (distance[sector] < maxDist)
00078       sum += distance[sector];
00079     else
00080       sum += maxDist;
00081     }
00082 
00083   return sum;
00084 }
00085 
00086 
00087 double ObstaclesModel::getDistanceInCorridor(double angle, double width) const
00088 {
00089   double minDistance = maxDistance;
00090 
00091   int minSector = ObstaclesModel::getSectorFromAngle(angle-pi_2);
00092   int maxSector = ObstaclesModel::getSectorFromAngle(angle+pi_2);
00093 
00094   Geometry::Line centerLine, leftLine, rightLine;
00095   leftLine.direction.x = cos(angle);
00096   leftLine.direction.y = sin(angle);
00097 
00098   leftLine.base.y = leftLine.direction.x * width / 2;
00099   leftLine.base.x = -leftLine.direction.y * width / 2;
00100 
00101   rightLine.direction = leftLine.direction;
00102   rightLine.base = -leftLine.base;
00103 
00104   centerLine.base.x = 0; centerLine.base.y = 0;
00105   centerLine.direction = leftLine.direction;
00106 
00107   for(int i = minSector; i < maxSector; i++)
00108   {
00109     int currentSector = i%numOfSectors;
00110     Vector2<double> point; 
00111     point.x = cos(getAngleOfSector(currentSector)) * distance[currentSector];
00112     point.y = sin(getAngleOfSector(currentSector)) * distance[currentSector];
00113     if(
00114       distance[currentSector] < minDistance && 
00115       distance[currentSector] > 10 &&
00116       abs((int)Geometry::getDistanceToLine(centerLine, point)) < width / 2.0
00117       )
00118       minDistance = distance[currentSector];
00119   }
00120 
00121   LINE(models_corridorsRadar, 
00122     leftLine.base.x, leftLine.base.y, 
00123     leftLine.base.x + leftLine.direction.x * minDistance,
00124     leftLine.base.y + leftLine.direction.y * minDistance,
00125     2, Drawings::ps_solid, Drawings::red
00126     );
00127   LINE(models_corridorsRadar, 
00128     rightLine.base.x, rightLine.base.y, 
00129     rightLine.base.x + rightLine.direction.x * minDistance,
00130     rightLine.base.y + rightLine.direction.y * minDistance,
00131     2, Drawings::ps_solid, Drawings::green
00132     );
00133   LINE(models_corridorsRadar, 
00134     leftLine.base.x + leftLine.direction.x * minDistance,
00135     leftLine.base.y + leftLine.direction.y * minDistance,
00136     rightLine.base.x + rightLine.direction.x * minDistance,
00137     rightLine.base.y + rightLine.direction.y * minDistance,
00138     2, Drawings::ps_solid, Drawings::blue
00139     );
00140   return minDistance;
00141 }
00142 
00143 double ObstaclesModel::getAngleOfNextFreeSectorLeft(double sizeOfGap, double angle, int minDistance) const
00144 {
00145   double direction = 0;
00146   int numberOfSectorsOfGap = (int)(sizeOfGap * numOfSectors / pi2);
00147 
00148   int startSector = getSectorFromAngle(angle);
00149   int leftCounter = 0;
00150  
00151   for(int i = -numberOfSectorsOfGap / 2; i < numOfSectors / 2; i++)
00152   {
00153     int leftSector = (startSector+i)%numOfSectors;
00154 //    ASSERT(leftSector < numOfSectors && leftSector >=0);
00155     if(distance[leftSector] > minDistance)
00156       leftCounter++;
00157     else leftCounter = 0;
00158     
00159     if(leftCounter == numberOfSectorsOfGap)
00160     {
00161       direction = getAngleOfSector((startSector+i-numberOfSectorsOfGap/2)%numOfSectors);
00162       break;
00163     }
00164 
00165   }
00166   /*
00167   LINE(models_corridorsRadar, 
00168     0, 0, 
00169     cos(direction) * 1000,
00170     sin(direction) * 1000,
00171     20, Drawings::ps_solid, Drawings::red
00172     );
00173 
00174   LINE(models_corridorsRadar, 
00175     0, 0, 
00176     cos(angle) * 1000,
00177     sin(angle) * 1000,
00178     15, Drawings::ps_dash, Drawings::blue
00179     );
00180 
00181   CIRCLE(models_corridorsRadar, 
00182     0, 0, minDistance,
00183     3, Drawings::ps_solid, Drawings::blue);
00184 */
00185   // Left and Rightside is calculated, check teammates
00186 
00187   return direction;
00188 }
00189 
00190 
00191 double ObstaclesModel::getAngleOfNextFreeSectorRight(double sizeOfGap, double angle, int minDistance) const
00192 {
00193   double direction = 0;
00194   int numberOfSectorsOfGap = (int)(sizeOfGap * numOfSectors / pi2);
00195 
00196   int startSector = getSectorFromAngle(angle);
00197   int rightCounter = 0;
00198 
00199   for(int i = -numberOfSectorsOfGap / 2; i < numOfSectors / 2; i++)
00200   {    
00201     int rightSector = (startSector-i)%numOfSectors;
00202 //    ASSERT(rightSector < numOfSectors && rightSector >=0);
00203     if(distance[rightSector] > minDistance)
00204       rightCounter++;
00205     else rightCounter = 0;
00206 
00207     if(rightCounter == numberOfSectorsOfGap)
00208     {
00209       direction = getAngleOfSector((startSector-i+numberOfSectorsOfGap/2)%numOfSectors);
00210       break;
00211     }
00212 
00213   }
00214   /*
00215   LINE(models_corridorsRadar, 
00216     0, 0, 
00217     cos(direction) * 1000,
00218     sin(direction) * 1000,
00219     20, Drawings::ps_solid, Drawings::red
00220     );
00221 
00222   LINE(models_corridorsRadar, 
00223     0, 0, 
00224     cos(angle) * 1000,
00225     sin(angle) * 1000,
00226     15, Drawings::ps_dash, Drawings::blue
00227     );
00228 
00229   CIRCLE(models_corridorsRadar, 
00230     0, 0, minDistance,
00231     3, Drawings::ps_solid, Drawings::blue);
00232 */
00233   // Left and Rightside is calculated, check teammates
00234 
00235   return direction;
00236 }
00237 double ObstaclesModel::getAngleOfNextFreeSector(double sizeOfGap, double angle, int minDistance) const
00238 {
00239   double direction = 0;
00240   int numberOfSectorsOfGap = (int)(sizeOfGap * numOfSectors / pi2);
00241 
00242   int startSector = getSectorFromAngle(angle);
00243   int leftCounter = 0;
00244   int rightCounter = 0;
00245 
00246   for(int i = -numberOfSectorsOfGap / 2; i < numOfSectors / 2; i++)
00247   {
00248     int leftSector = (startSector+i)%numOfSectors;
00249 //    ASSERT(leftSector < numOfSectors && leftSector >=0);
00250     if(distance[leftSector] > minDistance)
00251       leftCounter++;
00252     else leftCounter = 0;
00253     
00254     int rightSector = (startSector-i)%numOfSectors;
00255 //    ASSERT(rightSector < numOfSectors && rightSector >=0);
00256     if(distance[rightSector] > minDistance)
00257       rightCounter++;
00258     else rightCounter = 0;
00259 
00260     if(leftCounter == numberOfSectorsOfGap)
00261     {
00262       direction = getAngleOfSector((startSector+i-numberOfSectorsOfGap/2)%numOfSectors);
00263       break;
00264     }
00265 
00266     if(rightCounter == numberOfSectorsOfGap)
00267     {
00268       direction = getAngleOfSector((startSector-i+numberOfSectorsOfGap/2)%numOfSectors);
00269       break;
00270     }
00271   }
00272   /*
00273   LINE(models_corridorsRadar, 
00274     0, 0, 
00275     cos(direction) * 1000,
00276     sin(direction) * 1000,
00277     20, Drawings::ps_solid, Drawings::red
00278     );
00279 
00280   LINE(models_corridorsRadar, 
00281     0, 0, 
00282     cos(angle) * 1000,
00283     sin(angle) * 1000,
00284     15, Drawings::ps_dash, Drawings::blue
00285     );
00286 
00287   CIRCLE(models_corridorsRadar, 
00288     0, 0, minDistance,
00289     3, Drawings::ps_solid, Drawings::blue);
00290 */
00291   return direction;
00292 }
00293 
00294 
00295 int ObstaclesModel::getMinimalDistanceInRange
00296 (
00297  double centerAngle, 
00298  double openingAngle, 
00299  double& angleWithMinimalDistance
00300  ) const
00301 {
00302   int centerSector = getSectorFromAngle(centerAngle); 
00303   int endSector = getSectorFromAngle(centerAngle + openingAngle / 2.0);
00304 
00305   int minDistance = 10000;
00306   int sectorWithMinimalDistance = centerSector;
00307 
00308   for(int i = 0; centerSector + i < endSector; i++)
00309   {
00310     if(distance[centerSector + i] < minDistance) 
00311     {
00312       minDistance = distance[centerSector + i];
00313       sectorWithMinimalDistance = centerSector + i;
00314     }
00315     if(distance[centerSector - i] < minDistance) 
00316     {
00317       minDistance = distance[centerSector - i];
00318       sectorWithMinimalDistance = centerSector - i;
00319     }
00320   }
00321   angleWithMinimalDistance = getAngleOfSector(sectorWithMinimalDistance);
00322   return minDistance;
00323 }
00324 
00325 int ObstaclesModel::getMinimalDistanceInRange
00326 (
00327  double centerAngle, 
00328  double openingAngle, 
00329  double& angleWithMinimalDistance, 
00330  ObstaclesPercept::ObstacleType obstacleType
00331  ) const
00332 {
00333   int centerSector = getSectorFromAngle(centerAngle); 
00334   int endSector = getSectorFromAngle(centerAngle + openingAngle / 2.0);
00335 
00336   int minDistance = 10000;
00337   int sectorWithMinimalDistance = centerSector;
00338 
00339   for(int i = 0; centerSector + i < endSector; i++)
00340   {
00341     if(this->obstacleType[centerSector + i] == obstacleType && distance[centerSector + i] < minDistance) 
00342     {
00343       minDistance = distance[centerSector + i];
00344       sectorWithMinimalDistance = centerSector + i;
00345     }
00346     if(this->obstacleType[centerSector - i] == obstacleType && distance[centerSector - i] < minDistance) 
00347     {
00348       minDistance = distance[centerSector - i];
00349       sectorWithMinimalDistance = centerSector - i;
00350     }
00351   }
00352   angleWithMinimalDistance = getAngleOfSector(sectorWithMinimalDistance);
00353   return minDistance;
00354 }
00355 
00356 double ObstaclesModel::getPercentageOfLowDistanceObstaclesInRange
00357 (
00358  double centerAngle, 
00359  double openingAngle, 
00360  int maxDistance
00361  ) const
00362 {
00363   int beginSector = getSectorFromAngle(centerAngle - openingAngle / 2.0);
00364   int endSector = getSectorFromAngle(centerAngle + openingAngle / 2.0);
00365   
00366   int numberOfSectorsWithCloseObstacle = 0;
00367 
00368   for(int i = beginSector; i <= endSector; i++)
00369   {
00370     if(distance[i] < maxDistance) 
00371     {
00372       numberOfSectorsWithCloseObstacle++;
00373     }
00374   }
00375   return (double)(numberOfSectorsWithCloseObstacle) / (double)(endSector - beginSector + 1);
00376 }
00377 
00378 
00379 double ObstaclesModel::getAngleOfLargeGapInRange(double centerAngle, double openingAngle, SearchDirections searchDirection) const
00380 {
00381   int centerSector = getSectorFromAngle(centerAngle); 
00382   int endSectorLeft = getSectorFromAngle(centerAngle + openingAngle / 2.0);
00383 
00384   int numberOfSectorsOnOneSide = endSectorLeft - centerSector + 1;
00385 
00386   int bestSector;
00387   //int sumOfDistances = 0;
00388   int maxSumOfDistances = 0;
00389   enum {numberOfSectorsOfGap = 7};
00390 
00391   RingBufferWithSum<numberOfSectorsOfGap> bufferMovingRight;
00392   RingBufferWithSum<numberOfSectorsOfGap> bufferMovingLeft;
00393 
00394   int i;
00395   for(i = 0; i < numberOfSectorsOfGap; i++)
00396   {
00397     bufferMovingLeft.add(min(1000, distance[i + centerSector - numberOfSectorsOfGap / 2]) );
00398     bufferMovingRight.add(min(1000, distance[-i + centerSector + numberOfSectorsOfGap / 2]) );
00399   }
00400   maxSumOfDistances = bufferMovingLeft.getSum();
00401   bestSector = centerSector;
00402 
00403   for(i = numberOfSectorsOfGap / 2 + 1; i < numberOfSectorsOnOneSide; i++)
00404   {
00405     bufferMovingLeft.add(min(1000, distance[centerSector + i]) );
00406     bufferMovingRight.add(min(1000, distance[centerSector - i]) );
00407 
00408     int newSum;
00409     int newSector;
00410     if(
00411       (
00412       bufferMovingLeft.getSum() > bufferMovingRight.getSum() && 
00413       searchDirection != searchRight)
00414       ||
00415       searchDirection == searchLeft
00416       )
00417     {
00418       newSum = bufferMovingLeft.getSum();
00419       newSector = centerSector + i - (numberOfSectorsOfGap / 2);
00420     }
00421     else
00422     {
00423       newSum = bufferMovingRight.getSum();
00424       newSector = centerSector - i + (numberOfSectorsOfGap / 2);
00425     }
00426 
00427     if(newSum > maxSumOfDistances + 80 * numberOfSectorsOfGap)
00428     {
00429       maxSumOfDistances = newSum;
00430       bestSector = newSector;
00431     }
00432   }
00433   return getAngleOfSector(bestSector);
00434 }
00435 
00436 double ObstaclesModel::getAngleOfLargeGapInRange2(double centerAngle, double openingAngle, SearchDirections searchDirection) const
00437 {
00438   int centerSector = getSectorFromAngle(centerAngle); 
00439   int endSectorLeft = getSectorFromAngle(centerAngle + openingAngle / 2.0);
00440 
00441   int numberOfSectorsOnOneSide = endSectorLeft - centerSector + 1;
00442 
00443   int bestSector;
00444   //int sumOfDistances = 0;
00445   int maxMinOfDistances = 0;
00446   enum {numberOfSectorsOfGap = 7};
00447 
00448   RingBufferWithSum<numberOfSectorsOfGap> bufferMovingRight;
00449   RingBufferWithSum<numberOfSectorsOfGap> bufferMovingLeft;
00450 
00451   int i;
00452   for(i = 0; i < numberOfSectorsOfGap; i++)
00453   {
00454     bufferMovingLeft.add(min(1000, distance[i + centerSector - numberOfSectorsOfGap / 2]) );
00455     bufferMovingRight.add(min(1000, distance[-i + centerSector + numberOfSectorsOfGap / 2]) );
00456   }
00457   maxMinOfDistances = bufferMovingLeft.getMinimum();
00458   bestSector = centerSector;
00459 
00460   for(i = numberOfSectorsOfGap / 2 + 1; i < numberOfSectorsOnOneSide; i++)
00461   {
00462     bufferMovingLeft.add(min(1000, distance[centerSector + i]) );
00463     bufferMovingRight.add(min(1000, distance[centerSector - i]) );
00464 
00465     int newMin;
00466     int newSector;
00467     if(
00468       (
00469       bufferMovingLeft.getSum() > bufferMovingRight.getSum() && 
00470       searchDirection != searchRight)
00471       ||
00472       searchDirection == searchLeft
00473       )
00474     {
00475       newMin = bufferMovingLeft.getMinimum();
00476       newSector = centerSector + i - (numberOfSectorsOfGap / 2);
00477     }
00478     else
00479     {
00480       newMin = bufferMovingRight.getMinimum();
00481       newSector = centerSector - i + (numberOfSectorsOfGap / 2);
00482     }
00483 
00484     if(newMin > maxMinOfDistances + 80)
00485     {
00486       maxMinOfDistances = newMin;
00487       bestSector = newSector;
00488     }
00489   }
00490   return getAngleOfSector(bestSector);
00491 }
00492 
00493 
00494 void ObstaclesModel::operator=(const ObstaclesModel& other)
00495 {
00496   for(int i = 0; i < numOfSectors; i++)
00497   {
00498     distance[i] = other.distance[i];
00499     obstacleType[i] = other.obstacleType[i];
00500   }
00501   corridorInFront = other.corridorInFront;
00502 }
00503 
00504 In& operator>>(In& stream,ObstaclesModel& obstaclesModel)
00505 {
00506   stream >> obstaclesModel.frameNumber;
00507   stream.read(&obstaclesModel,sizeof(ObstaclesModel));
00508   return stream;
00509 }
00510 
00511 Out& operator<<(Out& stream, const ObstaclesModel& obstaclesModel)
00512 {
00513   stream << obstaclesModel.frameNumber;
00514   stream.write(&obstaclesModel,sizeof(ObstaclesModel));
00515   return stream;
00516 }
00517 
00518 /*
00519  * Change log :
00520  * 
00521  * $Log: ObstaclesModel.cpp,v $
00522  * Revision 1.2  2004/06/16 14:43:51  risler
00523  * added obstacles symbols
00524  * added symbol obstacles.opponent-close-to-ball
00525  *
00526  * Revision 1.1.1.1  2004/05/22 17:25:15  cvsadm
00527  * created new repository GT2004_WM
00528  *
00529  * Revision 1.5  2004/03/16 14:00:21  juengel
00530  * Integrated Improvments from "Günne"
00531  * -ATH2004ERS7Behavior
00532  * -ATHHeadControl
00533  * -KickSelectionTable
00534  * -KickEditor
00535  *
00536  * Revision 1.4  2004/03/10 14:16:33  risler
00537  * body psd value added to PSDPercept and ObstaclesModel
00538  *
00539  * Revision 1.2  2004/03/15 17:11:40  hoffmann
00540  * - added ATH2004HeadControl
00541  * - added ATH2004LEDControl
00542  * - headmotiontester shows "tilt2"
00543  * - motion process updates odometry while no new robotPose is received, added to motion request
00544  * - some ui adjustments
00545  * - added member function to "field" to find out if robot is in own penalty area for use in the obstacles locator
00546  *
00547  * Revision 1.3  2004/02/28 13:57:34  juengel
00548  * Added ObstacleType.
00549  *
00550  * Revision 1.2  2003/11/14 19:02:25  goehring
00551  * frameNumber added
00552  *
00553  * Revision 1.1  2003/10/07 10:07:01  cvsadm
00554  * Created GT2004 (M.J.)
00555  *
00556  * Revision 1.3  2003/09/01 10:23:14  juengel
00557  * DebugDrawings clean-up 2
00558  * DebugImages clean-up
00559  * MessageIDs clean-up
00560  * Stopwatch clean-up
00561  *
00562  * Revision 1.2  2003/07/03 18:13:35  dassler
00563  * Adding two Methods:
00564  * getAngleOfNextFreeSectorLeft
00565  * getAngleOfNextFreeSectorRight
00566  *
00567  * Copy of getAngleOfNextFreeSector
00568  *
00569  * Revision 1.1.1.1  2003/07/02 09:40:22  cvsadm
00570  * created new repository for the competitions in Padova from the 
00571  * tamara CVS (Tuesday 2:00 pm)
00572  *
00573  * removed unused solutions
00574  *
00575  * Revision 1.20  2003/06/27 15:10:15  juengel
00576  * Added getAngleOfLargeGapInRange2 which uses minimum instead of sum.
00577  *
00578  * Revision 1.19  2003/06/27 13:17:57  jhoffman
00579  * work on obstacle avoider challenge,
00580  * added headcontrolmode,
00581  * added method needed to determine empty space,
00582  * updatet drawing method to reflect actual corridor size
00583  *
00584  * Revision 1.18  2003/06/26 12:35:25  juengel
00585  * getAngleOfLargeGapInRange has search direction.
00586  *
00587  * Revision 1.17  2003/06/21 15:26:01  juengel
00588  * Fixed bug in getPercentageOfLowDistanceObstaclesInRange.
00589  *
00590  * Revision 1.16  2003/06/21 12:56:26  juengel
00591  * Added getPercentageOfLowDistanceObstaclesInRange.
00592  *
00593  * Revision 1.15  2003/06/21 10:13:59  dueffert
00594  * warnings removed
00595  *
00596  * Revision 1.14  2003/06/20 20:13:01  juengel
00597  * Renamed some methods.
00598  *
00599  * Revision 1.13  2003/06/20 13:59:17  juengel
00600  * Added minimalDistanceInRange.
00601  *
00602  * Revision 1.12  2003/06/19 19:51:56  juengel
00603  * Renamed some variables.
00604  *
00605  * Revision 1.11  2003/06/19 12:10:43  juengel
00606  * Added getBestAngle
00607  *
00608  * Revision 1.10  2003/06/18 18:31:15  juengel
00609  * DebugDrawings removed.
00610  *
00611  * Revision 1.9  2003/06/17 20:01:22  juengel
00612  * Renamed getNextFreeSector to getAngleOfNextFreeSector.
00613  *
00614  * Revision 1.8  2003/06/05 08:33:27  juengel
00615  * warning removed
00616  *
00617  * Revision 1.7  2003/06/05 08:14:28  juengel
00618  * Added getDistanceInCorridor and getNextFreeSector.
00619  *
00620  * Revision 1.6  2003/06/03 15:50:04  risler
00621  * added getDistanceInDirection
00622  * minor optimizations
00623  *
00624  * Revision 1.5  2003/05/28 17:46:48  loetzsch
00625  * some initialitzations
00626  *
00627  * Revision 1.4  2003/05/14 13:08:38  risler
00628  * removed DefaultObstaclesLocator
00629  * renamed MicroSectorsObstaclesLocator to DefaultObstaclesLocator
00630  * ObstaclesModel contains increased number of sectors
00631  * DefaultObstaclesLocator clean up
00632  *
00633  * Revision 1.3  2003/04/14 16:01:41  loetzsch
00634  * ATH after GermanOpen CVS merge:
00635  * added corridor to obstacle model
00636  *
00637  * Revision 1.2  2003/04/10 14:14:47  Jan Hoffmann
00638  * added corridor to obstacle model
00639  *
00640  * Revision 1.1.1.1  2003/04/09 14:22:16  loetzsch
00641  * started Aibo Team Humboldt's GermanOpen CVS
00642  *
00643  * Revision 1.2  2003/03/11 11:29:20  juengel
00644  * Added data and constructor
00645  *
00646  * Revision 1.1  2003/03/10 13:52:30  juengel
00647  * Added ObstaclesModel
00648  *
00649  */

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