Exemple #1
0
void UUIActionCommand::PopulateClock( Clock* inClock, int index )
{
  clock = inClock;

  // Recall cooldown's time from the action object (model object)
  // Set the cooldown's time at Populate time. Too early to do in ctor 
  // (UClass data may not have loaded)
  cooldown.TotalTime = GetCooldownTotalTime();
  
  // attach Action's Click() function to clicking on the clock.
  UUICmdActionIndex = index; // index inside the array that hosts the Counters.
  clock->SetTexture( GetIcon() );
  
  // Set the cooldown amount to being the cooldown of the particular action
  clock->SetFillFraction( cooldown.Fraction() );
  
  //info( FS( "Populating clock `%s` with cooldown=%f/%f",
  //  *clock->Name, cooldown.Time, cooldown.TotalTime ) );
  clock->Show();

  // Invoke I'th action of the object
  clock->OnMouseDownLeft = [this]( FVector2D mouse ) -> EventCode { 
    Click();
    info( FS( "Clicked Action %s", *GetName() ) );
    return Consumed;
  };
  
  clock->OnHover = [this]( FVector2D mouse ) -> EventCode {
    Hover();
    return NotConsumed;
  };
}
Exemple #2
0
UIElement * UserInterface::Hover(Vector2i xy, bool allUi)
{
	return Hover(xy.x, xy.y, allUi);
}
// Autonomous drone control
void AutoAdjustPosition(int key) {
	// Only auto-correct if user is not controlling drone and not in absolute control mode
	if (key < 0 && !absoluteControl) {

		// Switch variable
		int patternSwitch = 0;

		//// Check if there is no pattern visible, but there was one store previously
		//if (visiblePattern == 0 && lastVisiblePattern != 0) {
		//	// If so, execute action of last pattern
		//	patternSwitch = lastVisiblePattern;
		//// Else, execute current action
		//} else patternSwitch = visiblePattern;
		patternSwitch = visiblePattern;

		switch (patternSwitch) {

		case 4:
			PitchBackwards(false);
			RollRight(false);
			break;

		case 5:
			PitchBackwards(false);
			break;

		case 6:
			PitchBackwards(false);
			RollLeft(false);
			break;

		case 7:
			RollLeft(false);
			break;

		case 8:
			PitchForwards(false);
			RollLeft(false);
			break;

		case 9:
			PitchForwards(false);
			break;

		case 10:
			PitchForwards(false);
			RollRight(false);
			break;

		case 11:
			RollRight(false);
			break;

		case 1:
		case 2:
		case 3:
			Hover();
			break;
		}

		//cout << "last visible " << lastVisiblePattern << endl;
	}
}
void KeyControls(int key) {

	// Quit if ESC key
	if (key == 0x1b) quitProgram = true;

	// Start/Stop the game
	// p key
	if (key == 'p') {
		if (gameOn) gameOn = false;
		else {
			gameOn = true;
			// reset points
			points = 0;
			// reset timer
			gameTimeStart = cvGetTickCount();
			// reset crate/people pickup
			cratePicked = false;
			peoplePicked = false;
		}
	}

	// Change camera - C key
	static int mode = 0;
	if (key == 'c') ardrone.setCamera(++mode % 4);

	// Take off / Landing - SPACE key
	if (key == ' ') {
		ardrone.setFlatTrim();
		if (ardrone.onGround()) ardrone.takeoff();
		else                    ardrone.landing();
	}

	// Emergency stop
	// x key
	if (key == 'x') ardrone.emergency();

	// Start hovering
	// h key
	if (key == 'h') Hover();

	// Movement
	// r key
	// Gain altitude
	if (key == 'r')
		if (!IsTooHigh())
			GainAltitude();

	// Down arrow
	// f key
	// Loose altitude
	if (key == 'f')
		if (!IsTooLow())
			LooseAltitude();

	// q key
	// Yaw c-clockwise
	if (key == 'q')
		YawCClockwise();

	// e key
	// Yaw clockwise
	if (key == 'e')
		YawClockwise();

	// Game controls - need to be within bounds to opperate
	// Left arrow / a key
	// Roll left
	if (key == 0x250000 || key == 'a')
		if (IsWithinLeftBounds())
			RollLeft(true);
		else RollRight(false);

		// Right arrow / d key
		// Roll right
		if (key == 0x270000 || key == 'd')
			if (IsWithinRightBounds())
				RollRight(true);
			else RollLeft(false);

			// Up arrow // w key
			// Pitch forwards
			if (key == 0x260000 || key == 'w')
				if (IsWithinUpperBounds())
					PitchForwards(true);

			// Down arrow / s key
			// Pitch backwards
			if (key == 0x280000 || key == 's')
				if (IsWithinLowerBounds())
					PitchBackwards(true);

			// Toggle absolute control
			// o key
			if (key == 'o') {
				if (absoluteControl) absoluteControl = false;
				else absoluteControl = true;
			}
}
// --------------------------------------------------------------------------
// main(Number of arguments, Argument values)
// Description  : This is the entry point of the program.
// Return value : SUCCESS:0  ERROR:-1
// --------------------------------------------------------------------------
int main(int argc, char **argv) {

	// Initialize
	// If drone is not connected, initialise webcam
	if (!ardrone.open()) {
		printf("Drone failed to connect.\n");
		isDroneConnected = false;
	}
	else isDroneConnected = true;

	//// DEBUGGING
	//isDroneConnected = false;


	quitProgram = false;
	int patternCount = 0;
	visiblePattern = 0;
	//lastVisiblePattern = 0;
	absoluteControl = false;
	vx = 0.0, vy = 0.0, vz = 0.0, vr = 0.0;
	points = 0, pSaved = 0, cSaved = 0;
	peoplePicked = false, cratePicked = false;
	gameTimeStart = cvGetTickCount();
	gameTimeLeft = 0;
	gameOn = false;


	// Loading patterns
	LoadPattern(filename1, patternLibrary, patternCount);
	LoadPattern(filename2, patternLibrary, patternCount);
	LoadPattern(filename3, patternLibrary, patternCount);
	LoadPattern(filename4, patternLibrary, patternCount);
	LoadPattern(filename5, patternLibrary, patternCount);
	LoadPattern(filename6, patternLibrary, patternCount);
	LoadPattern(filename7, patternLibrary, patternCount);
	LoadPattern(filename8, patternLibrary, patternCount);
	LoadPattern(filename9, patternLibrary, patternCount);
	LoadPattern(filename10, patternLibrary, patternCount);
	LoadPattern(filename11, patternLibrary, patternCount);

	cout << patternCount << " patterns are loaded." << endl;


	// Pattern detector arguments
	int norm_pattern_size = PAT_SIZE;
	double fixed_thresh = 40;
	double adapt_thresh = 5;//non-used with FIXED_THRESHOLD mode
	int adapt_block_size = 45;//non-used with FIXED_THRESHOLD mode
	double confidenceThreshold = 0.35;
	int mode = 2;//1:FIXED_THRESHOLD, 2: ADAPTIVE_THRESHOLD

	// Set to vertical drone camera
	ardrone.setCamera(1);

	// Initialise PatternDetector
	PatternDetector myDetector(fixed_thresh, adapt_thresh, adapt_block_size, confidenceThreshold, norm_pattern_size, mode);

	vector<Point2f> coordinates;
	Point2f point;
	coordinates.push_back(point);
	coordinates.push_back(point);
	coordinates.push_back(point);
	coordinates.push_back(point);
	coordinates.push_back(point);
	for (int i = 0; i <= patternCount; i++) {
		// Initialise each pattern coordinates
		patternsCoordinates.push_back(coordinates);

		//// Initialise each pattern timer
		//int timer;
		//timers.push_back(timer);
	}


	// Start main loop
	while (1) {

		// check to terminate program
		if (quitProgram) break;

		// Update
		if (!ardrone.update()) break;

		// OpenCV image
		IplImage *img;

		// Check which image source to feed to OpenCV
		if (isDroneConnected) {
			// Get drone image
			img = ardrone.getImage();
		}
		else {
			// Capture webcam feed
			webcamCapture = cvCaptureFromCAM(0);

			// Get webcam image
			img = cvQueryFrame(webcamCapture);
		}



		// Create image matrix
		Mat imgMat = Mat(img);

		// Render the HUD
		Mat result;
		if (isDroneConnected)
			result = HUD(imgMat, WIDTH, HEIGHT);
		else
			result = HUD(imgMat, WIDTH, WEBCAM_HEIGHT);

		// Create a buffer of the image
		Mat buffer;
		result.copyTo(buffer);

		// Run the detector
		myDetector.detect(imgMat, cameraMatrix, distortions, patternLibrary, detectedPattern);

		// Augment the input frame (and print out the properties of pattern if you want)
		if (detectedPattern.size()) {
			for (unsigned int i = 0; i < detectedPattern.size(); i++) {

				// Get pattern id
				int id = detectedPattern[i].id;

				//// Start current pattern seen timer
				//int now = cvGetTickCount();
				//int passedSinceSeen = ((now - timers[detectedPattern[i].id]) / (cvGetTickFrequency() * 1000)) / 1000;

				//// Only set visible pattern if detected a pattern for more than 1 second 
				//if (passedSinceSeen > SEEN_TIMER) SetVisiblePattern(detectedPattern[i].id);
				SetVisiblePattern(id);


				// Drawing
				detectedPattern.at(i).draw(buffer, cameraMatrix, distortions);


				// Get pattern corner and centre coordinates
				Point2f ul, ur, lr, ll, centre;
				detectedPattern.at(i).getCoordinates(ul, ur, lr, ll, centre, cameraMatrix, distortions);

				// Store coordinates
				patternsCoordinates[id][0] = ul;
				patternsCoordinates[id][1] = ur;
				patternsCoordinates[id][2] = lr;
				patternsCoordinates[id][3] = ll;
				patternsCoordinates[id][4] = centre;


				if (isDroneConnected)
					CheckGamePatterns(WIDTH, HEIGHT, id);
				else CheckGamePatterns(WIDTH, WEBCAM_HEIGHT, id);
			}
		}
		else {
			//for (int i = 0; i < patternCount; i++) {
			//	// reset pattern timers
			//	timers[i] = cvGetTickCount();
			//}

			// Reset visible pattern
			visiblePattern = 0;
		}

		//// Get elapsed time since last saw pattern
		//lastVPElapsed = cvGetTickCount();
		//int elapsedTime = ((lastVPElapsed - lastVPStart) / (cvGetTickFrequency() * 1000)) / 1000;

		//// Check if reset timer limit passed and reset last visible pattern
		//if (elapsedTime < 300)
		//	if (RESET_TIMER - elapsedTime < 0) lastVisiblePattern = 0;



		// Get key input
		int key = cvWaitKey(33);

		// Providing key controls
		KeyControls(key);


		// Autonomous drone control
		KeepGoodAltitude();
		AutoAdjustPosition(key);

		// Always go back to hovering if no user input, no pattern visible and too old last visible pattern (0)
		if (absoluteControl && key < 0) Hover();
		else if (key < 0 && visiblePattern == 0/* && lastVisiblePattern == 0*/) Hover();

		// Drone movement
		ardrone.move3D(vx, vy, vz, vr);


		// Check game over
		if (gameTimeLeft < 0) {
			gameOn = false;
			peoplePicked = false;
			cratePicked = false;
		}


		// Combine buffer with original image + opacity
		double opacity = 0.4;
		addWeighted(buffer, opacity, result, 1 - opacity, 0, result);


		// Initialise window with OpenGL support
		namedWindow("AR.Drone", WINDOW_OPENGL);
		// Show the OpenCV image in a new window AR.Drone
		imshow("AR.Drone", result);


		// Give HighGUI time to process the draw requests
		cvWaitKey(1);


		// Clear pattern for next tick
		detectedPattern.clear();
	}

	// Stop processes before quitting
	Stop();
	return 0;
}