///ボールしきい値デバッグ///
void checkBallSensor3()
{
  static int ball[BALL_SENSOR_NUM] = {
    0, 0, 0, 0, 0, 0, 0, 0                                                };

  // measure the ball sensor
  for (int i = 0; i < BALL_SENSOR_NUM; i++)
  {
    if(getBall(i) > ball[i])
    {
      ball[i] = getBall(i);
    }
  }

  if (g_use_lcd == 1)
  {
    slcd.setCursor(0,0);
    slcd.print("B");
    for (int j = 0; j < BALL_SENSOR_NUM; j++)
    {
      if (j == 4) {
        slcd.setCursor(0,1);
        slcd.print("B");
      }
      slcd.print(ball[j], DEC);
      slcd.print(" ");
    }
  }
}
void getBallDir()
{ 
  int t_max = -1 , t_max2 = -1 , no = -1 , no2 = -1;
  for(int i ; i < 8 ; i++)
  {
    if(getBall(i) - g_debugBall[i] > t_max)
    {  
      t_max = getBall(i);
      no = i;
    }
    else if(getBall(i) - g_debugBall[i] > t_max2)
    {
      t_max2 = getBall(i);
      no2 = i;
    }


  }
  int value = t_max2 / t_max * 22.5;
  if(no > no2) value *= -1;
  int value2 = no * 45;
  g_BallDir = value + value2;
  slcd.setCursor(0,1);
  slcd.print("BallDir");
  slcd.print(g_BallDir, DEC);
  slcd.print(" ");
}
bool RelativePositionDetection::execute() {
	// TODO add angle of objects to panAngle and tiltAngle
	// TODO use object size in image for distance approximation
	mPanAngle = DEGREE_TO_RADIAN * getBodyStatus().getPan();
	mTiltAngle = DEGREE_TO_RADIAN * getBodyStatus().getTilt();

	const RobotConfiguration& botConf = getRobotConfiguration();
	const CameraSettings& camSet = getCameraSettings();
	mRadiansPerPixelH = DEGREE_TO_RADIAN * botConf.cameraOpeningHorizontal
			/ (double) (camSet.width);
	mRadiansPerPixelV = DEGREE_TO_RADIAN * botConf.cameraOpeningVertical
			/ (double) (camSet.height);

	mPrinciplePointX = botConf.principlePointX;
	mPrinciplePointY = botConf.principlePointY;
	mCameraHeight 	 = botConf.cameraHeight;
	mCameraOffsetX 	 = botConf.cameraOffsetX;

	updateVector(getBall(), &getBallVector());
	updateVectors( getGoalPoles().getObjects(), &getGoalPolesVectors().data);
	updateVectors( getCyanRobots().getObjects(), &getCyanRobotsVectors().data);
	updateVectors( getMagentaRobots().getObjects(), &getMagentaRobotsVectors().data);
	updateVectors( getRobots().getObjects(), &getRobotsVectors().data);
	return true;
}
int getBallDir()
{ 
  int t_max = -1 , no = -1;


  for(int i=0 ; i < 8 ; i++)
  {
    g_ball[i] = getBall(i);
    if(g_ball[i]  > t_max)
    {  
      t_max = g_ball[i];
      no = i;
    }
  }

  if (t_max < BALL_THRESH)  g_BallDir = 999; // no ball
  else {
    g_BallDir =  360 - 45 * no;    
  }   
  if (g_BallDir == 360) g_BallDir = 0; 

  return g_BallDir;
  /* slcd.setCursor(0,0);
   slcd.print("max:");
   slcd.print(t_max, DEC);
   slcd.print(" ");
   slcd.print(no, DEC);
   slcd.setCursor(0,1);
   slcd.print("BallDir:");
   slcd.print(g_BallDir, DEC);
   slcd.print(" "); */
}
BallDetection::BallDetection()
:	mBallCenterX( 0),
	mBallCenterY( 0),
	mBallRadius( 10),
	mMinCloudDistance( 30),
	mAdditionalScanPixelFactor( 0.6),
	mAdditionalScanPixelMin( 1),
	mAdditionalScanPixelCount( 20),
	mRadiusCompareWeight( 1.0),
	mCircleAnomalyCompareWeight( 1.0),
	mFoundEdgesRatioCompareWeight( 1.0),
	mCorrectEdgesRatioCompareWeight( 1.0),
	mPointsAreaRatioCompareWeight( 1.0),
	mMinRadius( 2),
	mMaxFieldlineError( 5),
	mMaxCircleAnomaly( 20.0),
	mMinFoundEdgesRatio( 0.4),
	mMinCorrectEdgesRatio( 0.5),
	mMinPointsAreaRatio( 0.01),
	mMaxAnomalyRadiusFactor( 0.2),
	mDebugInfoEnabled( false),
	mIsFilterFieldLine( true),
	mIsFilterHorizon( true),
	mMinY( 50),
	mMaxU( 140),
	mMinV( 140),
	mIsAtBorder( false),
	mVisionChangeBallDetection(30),
	mDebugDrawings(0),
	mColor(DebugDrawer::RED)
{
	getBall().type = Object::BALL;
	Config::getInstance()->registerConfigChangeHandler(this);
	this->configChanged();
}
void RelativePositionDetection::showDebugInformations(const Object &object, Vector *pos, double tilt) {
	double pan = pos->getAngle();
	double distance = pos->getLength();
	Debugger::INFO("RelativePositionDetection", "%s-Vector %.1f; %.1f : %.1f",
			object.toString().c_str(), pan*RADIAN_TO_DEGREE, tilt*RADIAN_TO_DEGREE, distance);

#ifdef _DEBUG
	if( mDebugDrawings >= 2) {
		int x = getBall().lastImageTopLeftX;
		int y = getBall().lastImageTopLeftY;
		DRAW_TEXT(object.toString(), x + 2, y + 10, DebugDrawer::YELLOW,
			"%.0f mm (%d px; %.2f deg)", distance, getBall().lastImageWidth, tilt*RADIAN_TO_DEGREE);
		DRAW_TEXT(object.toString(), x + 2, y + 24, DebugDrawer::YELLOW,
			"Pan: %.2f deg", pan*RADIAN_TO_DEGREE);
	}
#endif
}
void getMaxball()
{
  int t_max = -1;
  g_no = 8;  
  for(int i = 0; i < BALL_SENSOR_NUM; i++) {
    g_ball[i] =-1;
  }

  for(int i = 0; i < BALL_SENSOR_NUM; i++)
  {
    g_ball[i] = getBall(i);
    if(g_ball[i] - g_debugBall[i] >= t_max)
    {
      t_max = g_ball[i];
      g_no = i;
    }
  }
}
Esempio n. 8
0
VOID Game_Paint(HWND hwnd)
{

	//3.选用位图对象
	SelectObject(g_bdc, g_hBackground);
	//4.贴图 背景
	BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bdc, 0, 0, SRCCOPY);

	//球
	SelectObject(g_bdc, g_hBall);

	Ball* ball = getBall();
	if (ball != NULL)
	{
		ball->isLive = true;
		g_angle += 0.2;
		ball->angle = g_angle;
		ball->x = 320 - 32;
		ball->y = 240 - 32;
	}

	for (int i = 0; i < 100; i++)
	{
		if (balls[i].isLive == true)
		{
			balls[i].x += balls[i].v * cosf(balls[i].angle);
			balls[i].y += balls[i].v * sinf(balls[i].angle);
			TransparentBlt(g_mdc, balls[i].x, balls[i].y, 64, 64, g_bdc, 0, 0, 64, 64, RGB(0, 0, 0));	
		}
		if (balls[i].x <= -32 || balls[i].x >= 640 || balls[i].y <= -32 || balls[i].y >= 480)
		{
			balls[i].isLive = false;
		}
	}
	BitBlt(g_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_mdc, 0, 0, SRCCOPY);
}
bool BallDetection::execute()
{
	mBallClouds.clear();
	mBallCloudDataList.clear();
	getRemovedBallCandidates().clearList();

	mColor = DebugDrawer::RED;

	const list<Point>* cloud = getBallPoints().getCloud();
	list<Point>::const_iterator it = cloud->begin();
	for( ; it != cloud->end(); ++it) {
		addBallPointToNearestCloud( (*it));
	}

	//mergeOverlappingClouds();

	BoundingBox bestCompareBox(Point(0,0),0,0);
	double bestCompareResult = 0.0;
	vector<PointCloud>::const_iterator pointCloudIt;
	for( pointCloudIt = mBallClouds.begin(); pointCloudIt != mBallClouds.end(); ++pointCloudIt) {

		BoundingBox box = pointCloudIt->calculateBoundingBox();
		Point point = pointCloudIt->getCenterPoint();
		mBallCenterX = point.getX();
		mBallCenterY = point.getY();
		mBallRadius = (box.width + box.height) / 4; //3 // 4
		//Debugger::INFO("BallDetection", "Cloud-Radius: %d", ballRadius);

		//Debugger::DEBUG("BallDetection", "maxValue: %i", maxValue);

		if (filterFieldLines(Point(mBallCenterX, mBallCenterY))
			&& filterHorizon(Point(mBallCenterX, mBallCenterY))) {

			// todo: filter out all possible balls with too small pixel to size ratio
			// filter out all balls with wrong expected size (tilt angle)

			getBallEdges().clearCloud();

			//Debugger::DEBUG("BallDetection", "-----------------------------");
			//Debugger::DEBUG("BallDetection", "BallRadius 1: %d", mBallRadius);

			mIsAtBorder = false;
			BallCompareData ballCompareData;
			if( !findAllBallEdges(ballCompareData)) {
				if (mDebugDrawings >= 2) {
					DRAW_CIRCLE("Ball", box.topLeft.getX(), box.topLeft.getY(), 2*mBallRadius,
							DebugDrawer::GREEN);
				}
				//break;
			}

			ballCompareData.centerX = mBallCenterX;
			ballCompareData.centerY = mBallCenterY;
			ballCompareData.numCloudPixels = pointCloudIt->getSize();

			if (mDebugDrawings >= 6) {
				DRAW_POINT("Ball", mBallCenterX, mBallCenterY, DebugDrawer::YELLOW);
			}

			int countEdges = (int)getBallEdges().getSize();
			int sumX = 0;
			int sumY = 0;
			list<Point>::const_iterator it2;
			for (it2 = getBallEdges().getCloud()->begin();
					it2 != getBallEdges().getCloud()->end(); ++it2) {
				Point p = (*it2);
				sumX += p.getX();
				sumY += p.getY();
			}
			if( countEdges > 1) {
				mBallCenterX = sumX / countEdges;
				mBallCenterY = sumY / countEdges;
				if (mDebugDrawings >= 6) {
					DRAW_POINT("Ball", mBallCenterX, mBallCenterY, DebugDrawer::BLUE);
				}
			}

			double sumDistances = 0.0;
			vector<double> radiusList;
			int i = 0;

			list<Point>::const_iterator pointIt;
			for (pointIt = getBallEdges().getCloud()->begin();
					pointIt != getBallEdges().getCloud()->end(); ++pointIt) {
				Point p = (*pointIt);
				double dx = (double)mBallCenterX - p.getX();
				double dy = (double)mBallCenterY - p.getY();
				double rad = sqrt((dx * dx) + (dy * dy));
				radiusList.push_back(rad);
				sumDistances += rad;
				/*if( mDebugInfoEnabled) {
					Debugger::DEBUG("BallDetection", "%d) Radius point: %.2f (%d; %d)", i, rad, p.getX(), p.getY());
				}*/
				++i;
			}
			if( countEdges >= 4) {
				mBallRadius = (int)(sumDistances / (double)countEdges);
				//Debugger::INFO("Ball", "Mean-Radius: %d", ballRadius);
			}

			//Debugger::DEBUG("BallDetection", "BallRadius 2: %d", mBallRadius);

			if (filterFieldLines(Point(mBallCenterX, mBallCenterY))
				&& filterHorizon(Point(mBallCenterX, mBallCenterY))) {

				//Debugger::DEBUG("BallDetection", "ballCenter: %d, %d", ballCenterX, ballCenterY);
				//Debugger::DEBUG("BallDetection", "radius: %d", ballRadius);

				ballCompareData.meanRadius = mBallRadius;
				ballCompareData.circleAnomaly = 0.0;

				int numCorrectEdges = 0;
				double maxAnomaly = (mMaxAnomalyRadiusFactor * mBallRadius) * (mMaxAnomalyRadiusFactor * mBallRadius);
				//double maxAnomaly = 25; // 5 pixel
				//Debugger::DEBUG("BallDetection", "maxAnomaly: %.2f", maxAnomaly);
				i = 0;
				vector<double>::const_iterator doubleIt;
				for (doubleIt = radiusList.begin(); doubleIt != radiusList.end(); ++doubleIt) {
					double anomaly = (double)mBallRadius - (*doubleIt);
					anomaly *= anomaly;
					if( mDebugInfoEnabled) {
						Debugger::DEBUG("BallDetection", "%d) Anomaly point: %.2f", i, anomaly);
					}
					if( anomaly > maxAnomaly) {
						ballCompareData.circleAnomaly += anomaly;
						//Debugger::DEBUG("BallDetection", "CircleAnomaly: %.2f",ballCompareData.circleAnomaly);
					} else {
						numCorrectEdges++;
					}
					++i;
				}

				if( numCorrectEdges > 0) {
					//Debugger::DEBUG("BallDetection", "CircleAnomaly1: %.2f (%d)",ballCompareData.circleAnomaly, numCorrectEdges);
					ballCompareData.circleAnomaly /= (double)numCorrectEdges;
				}
				//Debugger::DEBUG("BallDetection", "CircleAnomaly2: %.2f",ballCompareData.circleAnomaly);
				if( countEdges > 0) {
					ballCompareData.correctEdgesRatio = (double)numCorrectEdges / (double)countEdges;
				}

				box.topLeft = Point(mBallCenterX - mBallRadius, mBallCenterY - mBallRadius);
				box.width = 2 * mBallRadius;
				box.height = 2 * mBallRadius;

				double compareResult = calculateCompareResult(ballCompareData);
				if( mDebugInfoEnabled) {
					Debugger::INFO("BallDetection", "CompareResult: %f", compareResult);
				}
				if( compareResult > bestCompareResult) {
					bestCompareResult = compareResult;
					bestCompareBox = box;
				}

				if (mDebugDrawings >= 3) {
					DRAW_CIRCLE("Ball", box.topLeft.getX() +1, box.topLeft.getY() +1, box.width,
							DebugDrawer::BROWN);
				}
			} else {
				if (mDebugDrawings >= 4) {
					DRAW_CIRCLE("Ball", box.topLeft.getX(), box.topLeft.getY(), box.width,
							DebugDrawer::ORANGE);
				}
			}
		} else {
			Object obj(box.topLeft.getX(), box.topLeft.getY(), box.width, box.height);
			obj.type = Object::BALL;
			getRemovedBallCandidates().addObject(obj);
			if (mDebugDrawings >= 5) {
				DRAW_CIRCLE("Ball", box.topLeft.getX(), box.topLeft.getY(), box.width,
						DebugDrawer::LIGHT_GRAY);
			}
		}
	}

	if( bestCompareResult > 0.0) {
		int x = bestCompareBox.topLeft.getX();
		int y = bestCompareBox.topLeft.getY();
		getBall().updateObject( x, y, bestCompareBox.width, bestCompareBox.height);
		//x = getBall().lastImageX;
		//y = getBall().lastImageY;
		// todo add angle from position in image

		double panAngle = DEGREE_TO_RADIANS * getBodyStatus().getPan();
		double tiltAngle = DEGREE_TO_RADIANS * getBodyStatus().getTilt();
		double length = getRobotConfiguration().cameraHeight * tan(tiltAngle);
		length += getRobotConfiguration().cameraOffsetX;
		getBall().lastVector.updateVector(panAngle, length);

		Debugger::INFO("BallDetection", "BallVector %.1f; %.1f : %.1f", panAngle*RADIANS_TO_DEGREE, tiltAngle*RADIANS_TO_DEGREE, length);
		if( mDebugDrawings >= 1) {
			x = bestCompareBox.topLeft.getX();
			y = bestCompareBox.topLeft.getY();
			DRAW_CIRCLE("Ball", x, y, bestCompareBox.width, DebugDrawer::RED);
			if( mDebugDrawings >= 2) {
				DRAW_TEXT("Ball", x + 2, y + 10, DebugDrawer::YELLOW,
					"%.0f mm (%d px; %.2f deg)", length, bestCompareBox.width, tiltAngle*RADIANS_TO_DEGREE);
				DRAW_TEXT("Ball", x + 2, y + 24, DebugDrawer::YELLOW,
					"Pan: %.2f deg", panAngle*RADIANS_TO_DEGREE);
			}
		}
	} else {
		getBall().notSeen();
	}

	return true;
}
bool BallDetection::execute()
{
Debugger::DEBUG("BallDetection", "BallDetection Start");
#ifdef USE_BALL_DETECTION_DOUBLE
	if(getBodyStatus().getTilt() > mVisionChangeBallDetection){
		Debugger::DEBUG("BallDetection", "Tilt is too high (%d), OpenCV detection is used!",
				getBodyStatus().getTilt());
		return false;
	}
#endif
	//Debugger::DEBUG("BallDetection","Using Ball Detection COLOR %d", getBodyStatus().getTilt());

	mBallClouds.clear();
	mBallCloudDataList.clear();
	getRemovedBallCandidates().clearList();

	mColor = DebugDrawer::RED;

	const list<Point>* cloud = getBallPoints().getCloud();
	list<Point>::const_iterator it = cloud->begin();
	for( ; it != cloud->end(); ++it) {
		addBallPointToNearestCloud( (*it));
	}

	//mergeOverlappingClouds();

	BoundingBox bestCompareBox(Point(0,0),0,0);
	double bestCompareResult = 0.0;
	//vector<PointCloud>::const_iterator pointCloudIt;
	//for( pointCloudIt = mBallClouds.begin(); pointCloudIt != mBallClouds.end(); ++pointCloudIt) {
	for (auto cloud : mBallClouds) {

		BoundingBox box = cloud.calculateBoundingBox();
		Point centerPoint = cloud.getCenterPoint();
		mBallCenterX = centerPoint.getX();
		mBallCenterY = centerPoint.getY();
		mBallRadius = (box.width + box.height) / 4; //3 // 4
		//Debugger::INFO("BallDetection", "Cloud-Radius: %d", ballRadius);

		//Debugger::DEBUG("BallDetection", "maxValue: %i", maxValue);

		if (filterFieldLines(centerPoint)
			&& filterHorizon(centerPoint)) {

			// todo: filter out all possible balls with too small pixel to size ratio
			// filter out all balls with wrong expected size (tilt angle)

			getBallEdges().clearCloud();

			//Debugger::DEBUG("BallDetection", "-----------------------------");
			//Debugger::DEBUG("BallDetection", "BallRadius 1: %d", mBallRadius);

			mIsAtBorder = false;
			BallCompareData ballCompareData;

			if( !findAllBallEdges(ballCompareData)) {
				DEBUG_DRAWING_BALL(box, DebugDrawer::GREEN, 2);
				//break;
			}

			ballCompareData.centerX = mBallCenterX;
			ballCompareData.centerY = mBallCenterY;
			ballCompareData.numCloudPixels = cloud.getSize();

			DEBUG_DRAWING_CENTER(DebugDrawer::YELLOW, 6);

			int countEdges = (int)getBallEdges().getSize();
			int sumX = 0;
			int sumY = 0;
			list<Point>::const_iterator it2;
			for (it2 = getBallEdges().getCloud()->begin();
					it2 != getBallEdges().getCloud()->end(); ++it2) {
				Point p = (*it2);
				sumX += p.getX();
				sumY += p.getY();
			}

			if( countEdges > 1) {
				mBallCenterX = sumX / countEdges;
				mBallCenterY = sumY / countEdges;
				DEBUG_DRAWING_CENTER(DebugDrawer::BLUE, 6);
			}

			centerPoint.updatePoint(mBallCenterX, mBallCenterY);
			if (filterFieldLines(centerPoint)
				&& filterHorizon(centerPoint)) {

				double sumDistances = 0.0;
				vector<double> radiusList;
				int i = 0;

				list<Point>::const_iterator pointIt;
				for (pointIt = getBallEdges().getCloud()->begin();
						pointIt != getBallEdges().getCloud()->end(); ++pointIt) {
					Point p = (*pointIt);
					double dx = (double)mBallCenterX - p.getX();
					double dy = (double)mBallCenterY - p.getY();
					double rad = sqrt((dx * dx) + (dy * dy));
					radiusList.push_back(rad);
					sumDistances += rad;
					/*if( mDebugInfoEnabled) {
						Debugger::DEBUG("BallDetection", "%d) Radius point: %.2f (%d; %d)", i, rad, p.getX(), p.getY());
					}*/
					++i;
				}
				if( countEdges >= 4) {
					mBallRadius = (int)(sumDistances / (double)countEdges);
					//Debugger::INFO("Ball", "Mean-Radius: %d", ballRadius);
				}

				//Debugger::DEBUG("BallDetection", "BallRadius 2: %d", mBallRadius);

				//Debugger::DEBUG("BallDetection", "ballCenter: %d, %d", ballCenterX, ballCenterY);
				//Debugger::DEBUG("BallDetection", "radius: %d", ballRadius);

				ballCompareData.meanRadius = mBallRadius;
				ballCompareData.circleAnomaly = 0.0;

				int numCorrectEdges = 0;
				double maxAnomaly = (mMaxAnomalyRadiusFactor * mBallRadius) * (mMaxAnomalyRadiusFactor * mBallRadius);
				//double maxAnomaly = 25; // 5 pixel
				//Debugger::DEBUG("BallDetection", "maxAnomaly: %.2f", maxAnomaly);
				i = 0;
				for (double radius : radiusList) {
					double anomaly = (double)mBallRadius - radius;
					anomaly *= anomaly;
#ifdef _DEBUG
					if( mDebugInfoEnabled) {
						Debugger::DEBUG("BallDetection", "%d) Anomaly centerPoint: %.2f", i, anomaly);
					}
#endif
					if( anomaly > maxAnomaly) {
						ballCompareData.circleAnomaly += anomaly;
						//Debugger::DEBUG("BallDetection", "CircleAnomaly: %.2f",ballCompareData.circleAnomaly);
					} else {
						numCorrectEdges++;
					}
					++i;
				}

				if( numCorrectEdges > 0) {
					//Debugger::DEBUG("BallDetection", "CircleAnomaly1: %.2f (%d)",ballCompareData.circleAnomaly, numCorrectEdges);
					ballCompareData.circleAnomaly /= (double)numCorrectEdges;
				}
				//Debugger::DEBUG("BallDetection", "CircleAnomaly2: %.2f",ballCompareData.circleAnomaly);
				if( countEdges > 0) {
					ballCompareData.correctEdgesRatio = (double)numCorrectEdges / (double)countEdges;
				}

				box.topLeft = Point(mBallCenterX - mBallRadius, mBallCenterY - mBallRadius);
				box.width = 2 * mBallRadius;
				box.height = 2 * mBallRadius;

				double compareResult = calculateCompareResult(ballCompareData);
#ifdef _DEBUG
				if( mDebugInfoEnabled) {
					Debugger::INFO("BallDetection", "CompareResult: %f", compareResult);
				}
#endif
				if( compareResult > bestCompareResult) {
					bestCompareResult = compareResult;
					bestCompareBox = box;
				}
				DEBUG_DRAWING_BALL(box, DebugDrawer::BROWN, 3);
			} else {
				DEBUG_DRAWING_BALL(box, DebugDrawer::ORANGE, 4);
			}
		} else {
			Object obj(box.topLeft.getX(), box.topLeft.getY(), box.width, box.height);
			obj.type = Object::BALL;
			getRemovedBallCandidates().addObject(obj);
			DEBUG_DRAWING_BALL(box, DebugDrawer::LIGHT_GRAY, 5);
		}
	}

	if( bestCompareResult > 0.0) {
		int x = bestCompareBox.topLeft.getX();
		int y = bestCompareBox.topLeft.getY();
		getBall().updateObject( x, y, bestCompareBox.width, bestCompareBox.height);
		DEBUG_DRAWING_BALL(bestCompareBox, DebugDrawer::RED, 1);
	} else {
		getBall().notSeen();
	}
	Debugger::DEBUG("BallDetection", "BallDetection END");
	return true;
}
Esempio n. 11
0
void fight()
{
  PID();
  if (g_diff > 30 || g_diff < -30) turn(g_pid);
  if (getBall(0) > g_debugBall[0] && getBall(0) > getBall(1) && getBall(0) >= getBall(2) && getBall(0) >= getBall(3) && getBall(0) >= getBall(4) && getBall(0) >= getBall(5) && getBall(0) >= getBall(6) && getBall(0) > getBall(7) ) moveAngle4ch(0,0,0);


  else if(getBall(1) > g_debugBall[1] && getBall(1) >= getBall(2) && getBall(1) > getBall(3) && getBall(1) > getBall(4) && getBall(1) > getBall(5) && getBall(1) > getBall(6) && getBall(1) > getBall(7))
  {
    //if (getPing(3) < 15) moveAngle4ch(50 , 0, 0); 
    if (getBall(1) > 600) moveAngle4ch(50, 0, 95);
    else moveAngle4ch(85 , 0, 95);
  } 
  else if(getBall(2) > g_debugBall[2] && getBall(2) >= getBall(3) && getBall(2) > getBall(4) && getBall(2) > getBall(5) && getBall(2) > getBall(6) && getBall(2) > getBall(7)) 
  {
    if(getBall(2) > 600)moveAngle4ch(50 , 0, 95);
    else moveAngle4ch(85, 0, 95);
  }
  else if (getBall(6) >  g_debugBall[6] && getBall(6) >= getBall(5)) 
  {
    if (getBall(6) > 600)moveAngle4ch(50 , 0, 265);
    else moveAngle4ch(85, 0, 265);
  }
  else if(getBall(7) > g_debugBall[7] && getBall(7) > getBall(1)) 
  {
    //if(getPing(1) < 15) moveAngle4ch(50 , 0, 0);
    if (getBall(7) > 600) moveAngle4ch(50, 0, 265);
    else moveAngle4ch(85, 0, 265);
  }
  else moveAngle4ch(0,0,0);
}
bool BallDetectionOpenCV::execute() {
#ifdef USE_OPENCV

	//get cr channel

	const cv::Mat& mat = getOpenCVImage().getChannelCR();

	cv::Point minLoc;
	cv::Point maxLoc;
	double minVal;
	double maxVal;

	cv::Mat blurred;

	cv::GaussianBlur(mat, blurred, cv::Size(21,21), 0, 0, cv::BORDER_DEFAULT);

	cv::minMaxLoc(blurred, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());


//	Debugger::DEBUG("BallDetectionOpenCV", "maxVal: %f", maxVal);
//
//	Debugger::DEBUG("BallDetectionOpenCV", "minLoc :%d | %d ", minLoc.x,
//			minLoc.y);

//	vector<cv::Vec3f> circles;
//
//	/// Apply the Hough Transform to find the circles
//	cv::HoughCircles(mat, circles, CV_HOUGH_GRADIENT, 1, mat.rows / 8, 50, 100,
//			0, 0);
//
//	for (size_t i = 0; i < circles.size(); ++i) {
//		Object ball;
//
//		ball.lastImageX = circles[i].val[0];
//		ball.lastImageY = circles[i].val[1];
//		ball.lastImageWidth = circles[i].val[2];
//		ball.lastImageHeigth = circles[i].val[2];
//
//		Debugger::DEBUG("BallDetectionOpenCV", "Circle Found");
//
//		getBalls().addObject(ball);
//	}
//
//
//


//	cv::Mat thresholded;
//
//	cv::threshold(mat, thresholded, maxVal-50, 255, cv::THRESH_BINARY);
//
//	cv::imshow("test", thresholded);
//
//	vector<cv::Mat> contours;
//
//	cv::findContours(thresholded, contours, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0));





	if (maxVal > 200) {
		getBall().updateObject(maxLoc.x, maxLoc.y, maxLoc.x, maxLoc.y);

	} else {
		getBall().notSeen();
	}

#endif
	return true;
}