Example #1
0
//--------------------------------------------------------------
void testApp::update()
{
    ofBackground(100,100,100);

    if(bLearnBackground)
    {
        thread_1.bLearnBackground = true;
        thread_2.bLearnBackground = true;
        bLearnBackground = false;
    }

    thread_1.setThreshold(threshold);
    thread_2.setThreshold(threshold);

    thread_1.updateOnce();
    trackBlobs(thread_1.getBlobs());

    thread_2.updateOnce();
    trackBlobs(thread_2.getBlobs());

    rm.myOffscreenTexture.clear();
}
int emf_searchBlob(int key)
{
	static int status = 0;
	static int status2 = 0;
	static int change = 0;
	double tmp;
	static BlobTracker *bt;
	static PID tiltSrvPID = {0.05, 0.035, 0.001, 0.0, 0.0, 0.0};
	static PID panSrvPID = {0.02, 0.009, 0.001, 0.0, 0.0, 0.0};

	double bx, by;
	double errX, errY;
	double resp;
	static CvPoint center;

	static FILE *fp;

	unsigned int sw;

	if (!fp)
	{
		fp = fopen("hist_fb_7.data", "w");
		if (!fp)
			fprintf(stderr, "history file not opened!\n");
	}
	if (key == 0)
	{
		change = 0;
		status = 0;
		status2 = 0;
		if (findState(&is, "intruder_near")||findState(&is, "intruder_found"))
			;
		else
			bt = intruder;
	}
	trackBlobs(bt, frame, 0);
	if (bt->blobs->trackable)
	{
		if (status2 == 3)
		{
			//sendCommand(STOP, is.ltMotorVal=0, is.rtMotorVal=0);
			is.ltMotorVal=0, is.rtMotorVal=0;
			send_command(MOTOR_DIR, MOTOR_STOP);	//stop
			if (bt == intruder)
				addState(&is, "intruder_found");
			return 1;
		}
		if (status2 == 0)
		{
			clearPid(&tiltSrvPID);
			clearPid(&panSrvPID);
			status2 = 1;
			printf("tilt_clear: prev_resp=%g pan_prev_resp=%g.\n", tiltSrvPID.prevResp, panSrvPID.prevResp);
		}
		if (status2 == 1)
		{
			center = bt->blobs->center;
			bx = ((double)center.x/(double)fsize.width)*100.0;
			by = ((double)center.y/(double)fsize.height)*100.0;
			errY = by-50.0;
			errX = bx-50.0;
			printf("errorX %g, Y %g\n", errX, errY);
			if (errY<5.0f)
			{
				tmp = is.hdPanAngle;
				//writeServo(PAN_SRV, is.hdPanAngle=90.0f);
				send_command(SERVO_PAN, (byte)((int)(is.hdPanAngle=90.0f)));
				printf("waiting for 1sec...pan %g\n",tmp);
				sw = getTickCount();
				while ((getTickCount()-sw)<2000)
				{
					printf("time = %dms\n", getTickCount()-sw);
					frame = cvQueryFrame(capture);
				}
				printf("out of 1sec loop...\n");
				status2 = 3;
				if (MOD(tmp-90.0f)<10.0f)
				{
					printf("go straight\n");
					return 1;
				}
				if (tmp>90.0f)
				{
					printf("go right\n");
					is.ltMotorVal=is.rtMotorVal=40;
					send_command(RIGHT_MTR_VAL, 128+is.ltMotorVal/2);
					send_command(LEFT_MTR_VAL, 128-is.rtMotorVal/2);
					send_command(MOTOR_DIR, MOTOR_FWD);
					//sendCommand(LTMTR_SDIR, 1, 0);
					//sendCommand(DIFF_DRV, is.ltMotorVal=175, is.rtMotorVal=80);
				}
				else
				{
					printf("go left\n");
					is.ltMotorVal=is.rtMotorVal=40;
					send_command(LEFT_MTR_VAL, 128+is.rtMotorVal/2);
					send_command(RIGHT_MTR_VAL, 128-is.ltMotorVal/2);
					send_command(MOTOR_DIR, MOTOR_FWD);
					//sendCommand(RTMTR_SDIR, 1, 0);
					//sendCommand(DIFF_DRV, is.ltMotorVal=80, is.rtMotorVal=175);
				}
				return 1;
			}
			//resp = getPidRespVerb(&tiltSrvPID, errY, fp, "Tilt");
			resp = (double)errY*0.05f;
			is.hdTiltAngle -= resp;
			if (is.hdTiltAngle < MAX_SERVO_TILT_DOWN)
				is.hdTiltAngle = MAX_SERVO_TILT_DOWN;
			else
				if (is.hdTiltAngle > MAX_SERVO_TILT_UP)
					is.hdTiltAngle = MAX_SERVO_TILT_UP;
			if (is.hdPanAngle < MAX_SERVO_PAN_LEFT)
				is.hdPanAngle = MAX_SERVO_PAN_LEFT;
			else
				if (is.hdPanAngle > MAX_SERVO_PAN_RIGHT)
					is.hdPanAngle = MAX_SERVO_PAN_RIGHT;
			writePanTiltServos(is.hdPanAngle, is.hdTiltAngle);
			return 1;
		}
	}
	if (status2 == 3)
		return 1;
	if (status2)
		status2 = 0;
	if (!status)
	{
		status = 1;
		writePanTiltServos(is.hdPanAngle=150.0f/*30.0f*/, is.hdTiltAngle=90.0f);
		printf("waiting for 1sec...\n");
		sw = getTickCount();
		while ((getTickCount()-sw)<2000)
		{
			printf("time = %dms\n", getTickCount()-sw);
			frame = cvQueryFrame(capture);
		}
		printf("out of 1sec loop...\n");
		return 1;
	}
	if (!change)
	{
		if (is.hdPanAngle>160.0f||is.hdPanAngle<20.0f)
		{
			if (is.hdTiltAngle<40/*>140.0f*/)
			{
				writePanTiltServos(is.hdPanAngle=90.0f, is.hdTiltAngle=90.0f);
				cleanStates(&is);
				return 1;
			}
			//writeServo(TILT_SRV, is.hdTiltAngle-=20.0f);
			send_command(SERVO_TILT, (byte)((int)(is.hdTiltAngle-=20.0f)));
			status = -status;
			change = 1;
			return 1;
		}
	}
	if (change)
		change = 0;
	if (status==1)
		//writeServo(PAN_SRV, is.hdPanAngle-=5.0f);
		send_command(SERVO_PAN, (byte)((int)(is.hdPanAngle-=5.0f)));
	else
		//writeServo(PAN_SRV, is.hdPanAngle+=5.0f);
		send_command(SERVO_PAN, (byte)((int)(is.hdPanAngle+=5.0f)));
	return 1;
}
int emf_shootIntruder(int key)
{
	static int status = 0;
	unsigned int sw;
	static BlobTracker *bt;

	int blobfound;
	double bx, by;
	double error;
	double resp;
	CvPoint center;


	if (key == 0)
	{
		status = 0;
		bt = intruder;
		is.hdPanAngle = 90;
		send_command(SERVO_PAN, (byte)((int)is.hdPanAngle));
	}
	if (status == 0)
	{
		/*sendCommand(LTMTR_SDIR, 1, 0);
		sendCommand(RTMTR_SDIR, 1, 0);
		sendCommand(DIFF_DRV, is.ltMotorVal=150, is.rtMotorVal=165);*/
		int i;

		for (i=0; i<5; ++i)
		{
			while (1)
			{
				frame = cvQueryFrame(capture);
				trackBlobs(bt, frame, 0);
				blobfound = bt->blobs->trackable;
				center = bt->blobs->center;
				if (blobfound)
				{
					bx = ((double)center.x/(double)fsize.width)*100.0;
		    		by = ((double)center.y/(double)fsize.height)*100.0;

		    		printf("pos bx=%g, by=%g\n", bx, by);

		    		error = bx-50.0;
					printf("SHOOT PAN ERR= %g.\n", error);
					if ((error>0&&error<10.0) || (error<0&&error>-10.0))
						break;
		    	//resp = getPidRespVerb(&driveMtrPID, error, fp, "DriveMtr");
					resp = (double)error*0.2;
					is.hdPanAngle += resp;
					if (is.hdPanAngle < MAX_SERVO_PAN_LEFT)
						is.hdPanAngle = MAX_SERVO_PAN_LEFT;
					else
						if (is.hdPanAngle > MAX_SERVO_PAN_RIGHT)
							is.hdPanAngle = MAX_SERVO_PAN_RIGHT;
					send_command(SERVO_PAN, (byte)((int)is.hdPanAngle));
				}
				else
				{
					status = 1;
					return 1;
				}
			}
			printf("in laser_shoot: %d.\n", i);
			send_command(LASER_CMD, LASER_ON);
			//sleep(2);
			sw = getTickCount();
			while ((getTickCount()-sw)<2000)
				frame = cvQueryFrame(capture);
			send_command(LASER_CMD, LASER_OFF);
			sw = getTickCount();
			while ((getTickCount()-sw)<2000)
				frame = cvQueryFrame(capture);
			trackBlobs(bt, frame, 0);
			if (!bt->blobs->trackable)
				break;
		}
		if (bt->blobs->trackable)
			status = 2;
		else
			status = 1;
	}
	if (status == 1)
	{
		sw = getTickCount();
		while ((getTickCount()-sw)<5000)
		{
			frame = cvQueryFrame(capture);
		}
		//sendCommand(BUZ_TOGGLE, 0, 0);
		//++status;
		removeState(&is, "intruder_near");
		printf("Starting again.\n");
	}
	if (status == 2)
	{
		int status = 0;

		//sendCommand(BUZ_TOGGLE, 0, 0);
		send_command(ROBOT_STATUS, SET_LED(status, 3));
		/*sw = getTickCount();
		while ((getTickCount()-sw)<1000)
		{
			frame = cvQueryFrame(capture);
		}
		//sendCommand(BUZ_TOGGLE, 0, 0);
		//++status;*/
		removeState(&is, "intruder_near");
		//removeState(&is, "gp_near");
		addState(&is, "done_shooting");
		printf("Finished\n");
	}
	return 1;
}
int emf_movetoBlob(int key)
{
	static int status=0;

	unsigned int sw;

	int blobfound;
	double bx, by;
	double error;
	double resp;
	CvPoint center;

	static double maxTiltAngle;
	static BlobTracker *bt;
	static PID driveMtrPID = {5.0, 0.1, 0.01, 0.0, 0.0, 0.0};
	//static PID driveMtrPID = {1.0, 0.1, 0.05, 0.0, 0.0, 0.0};
//	static PID driveMtrPID = {3.0, 2.0, 1.0, 0.0, 0.0, 0.0};
	static PID tiltSrvPID = {0.05, 0.035, 0.001, 0.0, 0.0, 0.0};

	static FILE *fp;


	if (key == 0)
	{
		status = 0;
		clearPid(&driveMtrPID);
		clearPid(&tiltSrvPID);
		maxTiltAngle = /*145.0f*/35;
		bt = intruder;
	}
	if (!fp)
	{
		fp = fopen("hist8.data", "w");
		if (!fp)
			fprintf(stderr, "MoveToBlob history file not opened!\n");
	}
	trackBlobs(bt, frame, 0);
	blobfound = bt->blobs->trackable;
	center = bt->blobs->center;
	if (!blobfound)
	{
		removeState(&is, "intruder_found");
		removeState(&is, "gp_found");
		//sendCommand(STOP, is.ltMotorVal=0, is.rtMotorVal=0);
		is.ltMotorVal=0, is.rtMotorVal=0;
		send_command(MOTOR_DIR, MOTOR_STOP);

	}
	if (status==1&&blobfound)
	{
		if (bt == intruder)
		{
			removeState(&is, "intruder_found");
			addState(&is, "intruder_near");
		}
		return 1;
	}
	if (is.hdTiltAngle<45.0f/*145.0f*/)
	{
		//sendCommand(STOP, is.ltMotorVal=0, is.rtMotorVal=0);
		is.ltMotorVal=0, is.rtMotorVal=0;
		send_command(MOTOR_DIR, MOTOR_STOP);
		fprintf(fp, "Got intruder \n");
		printf("waiting for 2sec to stabilize intruder...\n");
		sw = getTickCount();
		while ((getTickCount()-sw)<2000)
		{
			printf("time = %dms\n", getTickCount()-sw);
			frame = cvQueryFrame(capture);
		}
		status = 1;
		return 1;
	}
	else
	{
		if (blobfound)
		{
			bx = ((double)center.x/(double)fsize.width)*100.0;
		    by = ((double)center.y/(double)fsize.height)*100.0;

		    printf("pos bx=%g, by=%g\n", bx, by);
		    fprintf(fp, "pos bx=%g, by=%g\n", bx, by);

		    error = bx-50.0;
		    //resp = getPidRespVerb(&driveMtrPID, error, fp, "DriveMtr");
resp = (double)error*1.0;
		    if (resp>120.0)
		    	resp = 120.0;
		    else
		    	if (resp<-120.0)
		        	resp = -120.0;
		    if (resp > 0)
		    {
		        is.ltMotorVal = /*120*/240;
		        is.rtMotorVal = /*120-(int)resp*/0;
		    }
		    else
		    {
		    	is.ltMotorVal = /*120+(int)resp*/0;
		    	is.rtMotorVal = 240;
		    }

		    error = by-50.0;
//		    resp = getPidRespVerb(&tiltSrvPID, error, fp, "TiltSrv");
resp = (double)error*0.05f;
			is.hdTiltAngle -= resp;
		    if (is.hdTiltAngle < MAX_SERVO_TILT_DOWN)
		    	is.hdTiltAngle = MAX_SERVO_TILT_DOWN;
		    else
		    	if (is.hdTiltAngle > MAX_SERVO_TILT_UP)
		    		is.hdTiltAngle = MAX_SERVO_TILT_UP;
		    //writeServo(TILT_SRV, is.hdTiltAngle);
		    send_command(SERVO_TILT, (byte)((int)is.hdTiltAngle));
		    //sendCommand(DIFF_DRV, is.ltMotorVal, is.rtMotorVal);
		    send_command(LEFT_MTR_VAL, 128-is.ltMotorVal/2);
		    send_command(RIGHT_MTR_VAL, 128-is.rtMotorVal/2);
		    send_command(MOTOR_DIR, MOTOR_FWD);
		    fprintf(fp, "CMD: x=%d y=%d pan=%g, tilt=%g lmotor=%d rmotor=%d\n\n",
		    		center.x, center.y, is.hdPanAngle, is.hdTiltAngle,
		    		128-is.ltMotorVal/2, 128-is.rtMotorVal/2);
		}
	}
	return 1;
}