00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "BallPercept.h"
00012 #include <math.h>
00013
00014 #include "Tools/Debugging/Debugging.h"
00015
00016 #include "Tools/Streams/StreamHandler.h"
00017 #include "Representations/Perception/Image.h"
00018
00019 BallPercept::BallPercept()
00020 {
00021 reset(0);
00022 }
00023
00024 void BallPercept::add(const Vector2<double>& offsetOnField,
00025 const Vector2<double>& bearingBasedOffsetOnField,
00026 const Vector2<double>& sizeBasedOffsetOnField,
00027 const Vector2<double>& centerInImage,
00028 double radiusInImage,
00029 double reliability,
00030 bool isCameraMatrixValid)
00031 {
00032 ballWasSeen = true;
00033 this->offsetOnField = offsetOnField;
00034 this->bearingBasedOffsetOnField = bearingBasedOffsetOnField;
00035 this->sizeBasedOffsetOnField = sizeBasedOffsetOnField;
00036 this->centerInImage = centerInImage;
00037 this->radiusInImage = radiusInImage;
00038 this->reliability = reliability;
00039 this->isCameraMatrixValid = isCameraMatrixValid;
00040 }
00041
00042 void BallPercept::addHighRes(const Vector2<int>& centerInPixel,
00043 const Vector2<double>& centerAsAngles,
00044 double radiusInPixel,
00045 double radiusAsAngle,
00046 const Vector3<double>& translationOfCamera,
00047 bool isCameraMatrixValid,
00048 double reliability)
00049 {
00050 if (!ballWasSeen || this->reliability < reliability)
00051 {
00052 Vector2<double> bbo;
00053 double distanceBearingBased = centerAsAngles.y < 0 ? (translationOfCamera.z - ballRadius) / tan(-centerAsAngles.y) : 10000;
00054 bbo.x = translationOfCamera.x + distanceBearingBased * cos(centerAsAngles.x);
00055 bbo.y = translationOfCamera.y + distanceBearingBased * sin(centerAsAngles.x);
00056 checkOffset(bbo);
00057
00058 Vector2<double> sbo;
00059 double distanceFromCameraToBallCenter =
00060 Geometry::getBallDistanceByAngleSize(int(2 * ballRadius), 2 * radiusAsAngle);
00061 double distanceFromCameraToBallCenterOnGround;
00062 if(distanceFromCameraToBallCenter > fabs(translationOfCamera.z - ballRadius))
00063 distanceFromCameraToBallCenterOnGround = sqrt(sqr(distanceFromCameraToBallCenter) - sqr(translationOfCamera.z - ballRadius));
00064 else
00065 distanceFromCameraToBallCenterOnGround = 0;
00066 sbo.x = translationOfCamera.x + distanceFromCameraToBallCenterOnGround * cos(centerAsAngles.x);
00067 sbo.y = translationOfCamera.y + distanceFromCameraToBallCenterOnGround * sin(centerAsAngles.x);
00068 checkOffset(sbo);
00069
00070 Vector2<double> o;
00071 double sbdist = sbo.abs();
00072 if(!isCameraMatrixValid || centerAsAngles.y >= 0 || sbdist > 300.0)
00073 o = sbo;
00074 else if(sbdist > 200.0)
00075 {
00076
00077 double factor = (300.0 - sbdist) / 100.0;
00078 o = bbo * factor + sbo * (1.0 - factor);
00079 }
00080 else
00081 o = bbo;
00082
00083 add(o, bbo, sbo, Vector2<double>(centerInPixel.x, centerInPixel.y) / 2.0, radiusInPixel / 2.0, reliability, isCameraMatrixValid);
00084 }
00085 }
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 void BallPercept::checkOffset(Vector2<double>& offset) const
00116 {
00117 if(offset.x < ballRadius / 2 && fabs(offset.y) < getRobotConfiguration().getRobotDimensions().lowerBodyWidth / 2 + ballRadius)
00118 offset.x = ballRadius / 2;
00119 }