示例#1
0
Target zone_Search_Handler_Plastic(VideoCopy *image, Target obj)
{
    Target zone;
    
    redZoneCnt = blueZoneCnt = greenZoneCnt = 0;

    while(1){
	zone = findZone(image, obj);
      
	printf("obj flag : %d\n", zone.flag);
	
	if(zone.flag == MILK)
	    break;
	
	else if(zone.flag == 5)	// red
	{
	    turn_Right_Grabbing_Plastic();
	    usleep(200000);
	    turn_Right_Grabbing_Plastic();
	    usleep(200000);
	    
	    redZoneCnt++;
	}
	else if(zone.flag == 4)	// green
	{
	    turn_Left_Grabbing_Plastic();
	    usleep(200000);
	    
	    blueZoneCnt++;
	}
	
	else if(zone.flag > 3)
	{
	    printf("zone not found\n"); 
	    music_G();
	    usleep(200000);
	}
    
    }
   
    return zone;
}
示例#2
0
void* doMission(void) {
	
	if(goal == MILK) 
	{
	    while (stopFlag == 0) {
		  switch (step) {
		  case 1:	// 우유팩만 탐색
			  // 우유팩만 찾으면 됨
			  //t = findTarget(&bufCopy);
			  t = findTarget(&bufCopy, COKE);

			  break;
		  case 2:	// 우유팩에 접근	  
			  while(1) {
			  	switch (approach2Milk(&bufCopy, t)) {
			  		case 2:
			  			exit(0);
			  			break;
			  		case 0:
			  			goto STOP_APPROACH_2_MILK;
			  			break;
			  		default:
			  			usleep(2000000);
			  			break;
			  	}
			  }

			  STOP_APPROACH_2_MILK:
			
			  break;
		  case 3:	// 우유팩 줍기
			  
			  // 우유팩을 위한 겟타겟
			  t.flag = MILK;
			  getTarget(t);
			  
			  // 180도 돌 것인가?
			  break;
		  case 4:	// 중간까지 나오기
//			  go_MiddlePos();
			  
			  break;	
		  case 5:	// 목표장소 탐색
			  // 고동완이 만들 목적지 탐색 비교 함수 필요
			  // 목적지를 찾을 수 있게 좀 나와야함
			  // findZone implementation
			  t.flag = MILK;
			  z = findZone(&bufCopy, t);
//				zoneHandler(&minorStep, z);
			  break;
		  case 6:	// 우유팩 장소에 접근
			  // 우유팩 존에 다가갈 함수 필요
		    
			  approach2Zone(&bufCopy, z);
			  
			  break;
			  
		  case 7:	// 던지기
			  // 우유팩 던지는것 필요
			  putTarget();
//				stopFlag = 1;	
			  // 물건 놓았으면 적외선 감지 끝
//				terminate_infra();
			  break;
		  default:
			  break;
		  }
		    
		  step++;
		  
		  if(step >= 10)
		    step = 1;
	    }	
	}
/*	
	else if(goal == PLASTIC)
	{
	  while (stopFlag == 0) {
	      
		    switch (minorStep) {
			    case 1:
				    // 플라스틱 찾을 함수 필요
				    //t = findTarget(&bufCopy);
				    t = search_Step();
			      
				    break;
			    case 2:	// 타겟 찾기 예외처리	
				    
				    break;
			    case 3:
				    // 플라스틱에 특화된 접근 필요
				    stopCnt = 0;
				    
				    while(stopCnt < 2){
				      approach2Target(&bufCopy, t);
				      stopCnt++;
				    }
				    
				    break;
			    case 4:	// 물체 접근 예외처리	
				    
				    break;	
			    case 5:
				    // 플라스틱 목적지 탐색하면
				    // 플라스틱 걷어차는 함수 필요
				    getTarget(t);
				    
				    // 성공하였을 경우 적외선 감지 시작
    //				generate_Infra();
				    
				    break;
			    case 6:	// 물체 집기 예외처리
			      
				    break;
				    
			    case 7:	// 다음 단계 전환 전 준비
			      
				    break;
			    default:
				    break;
		    }
		    
		    minorStep++;
	    }
	}
*/	
	// 다 끝나면 캔에 대해서 작업
}
示例#3
0
Target zone_Search_Handler(VideoCopy *image, Target obj)
{
    Target zone;
    
    redZoneCnt = blueZoneCnt = greenZoneCnt = 0;
    
    while(1){
	zone = findZone(image, obj);
	  
	printf("obj flag : %d\n", zone.flag);
	
	if(zone.flag == MILK)
	{
	    if(zone.x_point < 50)
		turn_Right_Grabbing();
	    else if(zone.x_point > 270)
		turn_Left_Grabbing();
	    
	    break;
	}
	
	else if(zone.flag == 7)	// red
	{
	    turn_Right_Grabbing();
	    usleep(200000);
	    
	    redZoneCnt++;
	    
	}
	else if(zone.flag == 8)	// blue
	{
	    turn_Right_Grabbing();
	    usleep(200000);
	    
	    blueZoneCnt++;
	}
	
	else if(zone.flag > 3)
	{
	    printf("zone not found\n"); 
	    right_Kick();
	    usleep(200000);
	}
    }
    
    if(redZoneCnt > 0){
	moveStraightGrabbing();
	
	usleep(15000000);	
	    
	moveStop();
	usleep(200000);
    }
  /*  
    else if(blueZoneCnt > 0){
	moveStraightGrabbing();
	
	usleep(5000000);	
	    
	moveStop();
	usleep(200000);
    }
  */  
    
//     while(1){
	zone = findZone(image, obj);
      
	printf("obj flag : %d\n", zone.flag);
	
	if(zone.flag == MILK)
	{
	  
	    if(zone.x_point < 50)
		turn_Right_Grabbing();
	    else if(zone.x_point > 270)
		turn_Left_Grabbing();
	    
//	    break;
	    
	}
	
	else if(zone.flag == 7)	// red
	{
	    turn_Right_Grabbing();
	    usleep(200000);
	    
	    redZoneCnt++;
	}
	else if(zone.flag == 8)	// blue
	{
	    turn_Right_Grabbing();
	    usleep(200000);
	    
	    blueZoneCnt++;
	}
	
	else if(zone.flag > 3)
	{
	    printf("zone not found\n"); 
//	    turn_Left_Grabbing();
	    usleep(200000);
	}
    
//    }
    
    return zone;
}
示例#4
0
void rotate_To_Zone(VideoCopy *image, Target target)
{
    int i;
    
    while(1){
	
	
	Target zone = findZone(image, target);
      
	printf("zone flag : %d\n", zone.flag);
	printf("x : %d\n", zone.x_point);
	
	
	if(zone.flag == target.flag)
	{
	    //music_G();
	    // 가운데 있다고 판단 되면
	    if(zone.x_point < maxX && zone.x_point >minX)
	    {
		music_G();
		break;
	    }
	    
	    else if(zone.x_point <=minX)
	    {
		for(i=0; i<1; i++){
		    rotateOnRight();
		    //usleep(200000);
		    turnCnt--;
		}
		
	    }
	    else if(zone.x_point >=maxX)
	    {
		for(i=0;i<1; i++){
		    rotateOnLeft();
		    //usleep(200000);
		    turnCnt++;
		}	
	    }
	}
	
	else if(zone.flag == 4)	// see left     
	{
	    for(i=0;i<2; i++){
		rotateOnLeft();
		//usleep(200000);
		turnCnt++;
	    }	
	}
	else if(zone.flag == 5)	// see right
	{
	    for(i=0; i<2; i++){
		rotateOnRight();
		//usleep(200000);
		turnCnt--;
	    }
	}
	
	else if(zone.flag == 6)
	{
	    music_D();
	    printf("zone not found\n"); 
	}
    }
}
示例#5
0
void searchZone_n_Kick(VideoCopy *image, Target target)
{
    int kickCnt = 0;
    int i,j;
    
    
    int sideFlag_Cnt = 3;	// 사이드인지 아닌지 판별할 플래그의 카운트 기준수
    
    while(1)
    {
	int kickFlag = 0;
	
	Target zone = findZone(image, target);
      
	printf("zone flag : %d\n", zone.flag);
	printf("x : %d\n", zone.x_point);
	
	
	if(zone.flag == target.flag)
	{
	    // 가운데 있다고 판단 되면
	    if(zone.x_point < maxX && zone.x_point >minX)
	    {
		kickFlag = 1;
		printf("kickFlag = 1\n");
	    }
	    
	    else if(zone.x_point <=minX)
	    {
		for(i=0; i<1; i++){
		    rotateOnRight();
		    usleep(200000);
		    turnCnt--;
		}
		
	    }
	    else if(zone.x_point >=maxX)
	    {
		for(i=0;i<1; i++){
		    rotateOnLeft();
		    usleep(200000);
		    turnCnt++;
		}	
	    }
	}
	
	else if(zone.flag == 4)	// see left     
	{
	    for(i=0;i<1; i++){
		rotateOnLeft();
		usleep(200000);
		turnCnt++;
	    }	
	}
	else if(zone.flag == 5)	// see right
	{
	    for(i=0; i<1; i++){
		rotateOnRight();
		usleep(200000);
		turnCnt--;
	    }
	}
	
	else if(zone.flag == 6)
	{
	    printf("zone not found\n"); 
	}
	
	// 세부조정
	while(1){
		printf("see down\n");
		// 내려다 보기
		
		seeDown();
		
		usleep(200000);	// delay 1sec, camera buffer update
		 

		// 내려다 본 결과로 판단

		Target obj = findTarget(&bufCopy, target.flag);
		
		printf("x : %d, y : %d, flag : %d\n", obj.x_point, obj.y_point, obj.flag);
		
		printf("see up\n");
		// 몸을 다시 일으키고
		seeUp();
		usleep(200000);
			
			
		// 못 찾았을 경우에 대한 예외처리가 없음 현재는
		if(obj.flag == target.flag){
		  
		   if(obj.x_point < detail_minX)
		  {
		      rightOneStep();
		      usleep(200000);
		  }
		  else if(obj.x_point >detail_maxX)
		  {
		      leftOneStep();
		      usleep(200000);
		  }
		  
		  else if(obj.y_point > detail_Y)	
		  {
		      frontOneStep();
		      usleep(200000);
		  }
		  else
		  {
		      /*
		      if(kickFlag == 0){
			gathered_Touch(4);	// 아무의미없는 인자
			usleep(200000);
		      }
		      */
		      break;
		  }
		}
	}
	
	// 킥 플래그 서 있으면 찬다
	if(kickFlag == 1)
	{
	    gathered_Touch(PLASTIC);
	    usleep(200000);
	    left_Kick();
	    usleep(200000);
	    
	     
	    // 물체앞까지 의무걸음
	    moveStraight();
	
	    usleep(5500000);	
	    
	    moveStop();
	    usleep(200000);
	    
	    kickCnt++;
	    
	    if(plastic_Start_Pos == 2)
	    {
		if(kickCnt >= side_Cnt)
		  break;
	    }
	    else if(plastic_Start_Pos == 1)
	    {
		if(kickCnt >= straight_Cnt)
		  break;
	    }
	     
	}
	
	if(kickCnt == 1)
	{
	  if(abs(turnCnt) >= sideFlag_Cnt)
	  {
	    plastic_Start_Pos = 2;	// 먼 곳에서 시작
	  }
	  else
	  {
	    plastic_Start_Pos = 1;	// 가까운곳, 즉 가운데서 시작
	  }
	}
	
    }


}
示例#6
0
int * PlaceJoueur::placeJoueur(int ** carte, int largeur,int hauteur, int* peuple, int nbJoueurs)
{

	vector< vector<Coordonnees> > tabZones;
	for(int i=0;i<nbJoueurs;i++)
	{
		vector<Coordonnees> tmp = findZone(carte,largeur,hauteur,peuple[i]);
		tabZones.push_back(tmp);
	}

	vector<Coordonnees> zoneAccessible = getUnion(tabZones);
	
	int * coord = new int[2*nbJoueurs];

	Coordonnees coordJ1, coordJ2;
	int max=0;
	
	AStar * star = new AStar();
	vector<Coordonnees>::iterator it = zoneAccessible.begin();
	for(;it!=zoneAccessible.end();it++)
	{
		vector<Coordonnees>::iterator it2 = zoneAccessible.begin();
		for(;it2!=zoneAccessible.end();it2++)
		{
			if (!(*it==*it2))
			{
				if (verif[peuple[0]][carte[(*it).x()][(*it).y()]])
				{
					vector<Node*>* res = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[0],largeur,hauteur,(*it),(*it2));
					if (res->size()>max)
					{
						max=res->size();
						coordJ1 = (*it);
						coordJ2 = (*it2);
					}
				}
			}
		}
	}
	
	coord[0]=coordJ1.x();
	coord[1]=coordJ1.y();
	coord[2] = coordJ2.x();
	coord[3] = coordJ2.y();
	
	Coordonnees coordJ3;

	if (nbJoueurs>=3)
	{
		bool ok = false;
		int sigmaRef = 2;
		while (!ok)
		{
			double max=0;
			vector<Coordonnees>::iterator it = zoneAccessible.begin();
			for(;it!=zoneAccessible.end();it++)
			{
				if (!((*it) == coordJ1 || (*it) == coordJ2))
				{
					if (verif[peuple[2]][carte[(*it).x()][(*it).y()]])
					{
						vector<Node*>* res = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[2],largeur,hauteur,(*it),(coordJ1));
						vector<Node*>* res2 = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[2],largeur,hauteur,(*it),(coordJ2));
						if (std::abs((int)res->size()-(int)res2->size())<=2 && (res->size()+res2->size())/2>max)
						{
							max=(res->size()+res2->size())/2;
							coordJ3 = (*it);
							ok = true;
						}
					}
				}
			}
			sigmaRef++;
		}
		coord[4] = coordJ3.x();
		coord[5] = coordJ3.y();


		if (nbJoueurs==4)
		{
			Coordonnees coordJ4;
			bool ok = false;
			int sigmaRef = 3;
			while (!ok)
			{
				double max=0;
				vector<Coordonnees>::iterator it = zoneAccessible.begin();
				for(;it!=zoneAccessible.end();it++)
				{
					if (!((*it) == coordJ1 || (*it) == coordJ2 || (*it) == coordJ3))
					{
						if (verif[peuple[3]][carte[(*it).x()][(*it).y()]])
						{
							vector<Node*>* res = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[3],largeur,hauteur,(*it),(coordJ1));
							vector<Node*>* res2 = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[3],largeur,hauteur,(*it),(coordJ2));
							vector<Node*>* res3 = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple[3],largeur,hauteur,(*it),(coordJ3));
							int sigtmp1 = std::abs((int)res->size()-(int)res2->size());
							int sigtmp2 = std::abs((int)res2->size()-(int)res3->size());
							int sigtmp3 = std::abs((int)res->size()-(int)res3->size());
							if ((sigtmp1+sigtmp2+sigtmp3)/3<=sigmaRef && (res->size()+res2->size()+res3->size())/3>max)
							{
								max=(res->size()+res2->size()+res3->size())/3;
								coordJ4 = (*it);
								ok = true;
							}
						}
					}
				}
				sigmaRef++;
			}
			coord[6] = coordJ4.x();
			coord[7] = coordJ4.y();
		}
	}

	delete star;
	
	/*
	int nbJoueur = compteJoueurs(tabJoueurs,largeur,hauteur);

	srand (time(NULL));
	int * coord = new int[2];
	if (nbJoueur==0)
	{
		coord[0]=rand()%2*(largeur-1);
		coord[1]=rand()%2*(hauteur-1);
		int * coord2 = new int[2];
		coord2[0] = (((largeur-1)-coord[0])/4)*4;
		coord2[1] = (((hauteur-1)-coord[1])/4)*4;

		AStar * star = new AStar();
		vector<Node*>* res = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple,largeur,hauteur,Coordonnees(coord[0],coord[1]),Coordonnees(coord2[0],coord2[1]));
		delete star;
		coord[0]=res->back()->getCoord().x();
		coord[1]=res->back()->getCoord().y();
		delete res;

	}
	else if(nbJoueur==1)
	{
		coord = getCoordJoueur1(tabJoueurs,largeur,hauteur);
		int * coord2 = new int[2];
		coord2[0] = (((largeur-1)-coord[0])/4)*4;
		coord2[1] = (((hauteur-1)-coord[1])/4)*4;
		
		AStar * star = new AStar();
		vector<Node*>* res = star->pathFinding(tabToVecor(carte,largeur,hauteur),peuple,largeur,hauteur,Coordonnees(coord[0],coord[1]),Coordonnees(coord2[0],coord2[1]));
		delete star;
		coord[0]=res->back()->getCoord().x();
		coord[1]=res->back()->getCoord().y();
		delete res;

	}
	else
	{
		do
		{
			coord[0]=rand()%2*(largeur-1);
			coord[1]=rand()%2*(hauteur-1);
		} 
		while (tabJoueurs[coord[0]][coord[1]]!=0);
	}
	*/

	return coord;
}