struct field_outline_t form_getFieldFormInfo
(struct self_pos_t *absolute_locate, const struct wheel_speed_t go_forward){
  struct xy_coord_t current_bump_pos, before_bump_pos;
  struct xy_coord_t start_corner_pos, first_corner_pos, second_corner_pos;
  struct field_outline_t field_info;
  int corner_counter = 0;
  int loop_counter = 0;
  int judge_bump;
  int judge_corner_flag;
  int approach_corner_angle[CORNER_NUM];
  int draw_count = 0;

  char *fname1 = "field_form_coord.txt";
  FILE *fp1;


  /* 外壁情報取得開始時の隅の座標の取得 */
  start_corner_pos.x = absolute_locate->pos.x;
  start_corner_pos.y = absolute_locate->pos.y;
  
  /* 衝突位置座標の初期化 */
  before_bump_pos.x = current_bump_pos.x = 0;
  before_bump_pos.y = current_bump_pos.y = 0;

  
  while(1){
    /* createを直進させる */
    directDrive(go_forward.vel_left, go_forward.vel_right);

    getCurrentSelfPos(absolute_locate, go_forward);
    if(loop_counter % DRAW_COUNT_RANGE == 0){
      filePrintCoord(&fp1, fname1, "a", absolute_locate->pos.x, absolute_locate->pos.y);
      printf("%d, %d %d\n", absolute_locate->pos.x, absolute_locate->pos.y, absolute_locate->theta);
    }
    /* createが衝突したかを判定する */
    /* getBumpsAndWheelDropsはcreateが衝突したならば以下の値を返す */
    /* 右側のbumpsensorが衝突を検知->1 左側のbumpsensor->2 両方のbumpsensorに衝突を検知->3 */
    judge_bump = getBumpsAndWheelDrops();
    if(judge_bump == 1 || judge_bump == 2 || judge_bump == 3){
      current_bump_pos = form_getBumpPos(absolute_locate);
      
      /*隅に到達したならば、judge_corner_flagを立てる*/
      judge_corner_flag = form_judgeCorner(current_bump_pos, before_bump_pos);
      
      if(judge_corner_flag == TRUE){
	corner_counter++;
	printf("corner_num = %d\n\n\n\n", corner_counter);
	form_resetAbsoluteTheta(corner_counter, absolute_locate);
	approach_corner_angle[corner_counter] = absolute_locate->theta;/* 隅に進入時のcreateの姿勢角度を保存 */
	
	/*
	  一つ目及び2つ目の隅を見つけた際にフィールドの縦横の長さを計算する 
	  フィールドの形は平行四辺形との規定があるため、2辺の長さしか算出して
	  いない。
	*/
	switch(corner_counter){
	case 1:
	  first_corner_pos = form_getCornerPos(absolute_locate);
	  field_info.virtical_length = form_getFieldLength(start_corner_pos, first_corner_pos);
	  break;
	case 2:
	  second_corner_pos = form_getCornerPos(absolute_locate);
	  field_info.side_length = form_getFieldLength(first_corner_pos, second_corner_pos);
	  break;
	case CORNER_NUM:
	  field_info.corner_angle = form_setEachCornerAngle(approach_corner_angle);
	  robot_Stop_Back_Stop(1, BACK_DISTANCE, absolute_locate);
	  absolute_locate->theta = robot_Turn_Stop(TARGET_ANGLE_5, CORRECTION_ANGLE_5, turn_clockwise_100, absolute_locate->theta);
	  return field_info;
	default:
	  break;
	}
      }
      robot_Stop_Back_Stop(0.2, BACK_DISTANCE, absolute_locate);
      absolute_locate->theta = robot_Turn_Stop(TARGET_ANGLE_5, CORRECTION_ANGLE_5, turn_clockwise_100, absolute_locate->theta);
      before_bump_pos = current_bump_pos;
    }
    countCicleTime();
    draw_count++;
  }
}
Esempio n. 2
0
int main(int argc, char** argv){

	int port_number;
	int client_length;

	struct sockaddr_in server_address, client_address;
	struct hostent *host_properties;
	char buffer[BUFFER_SIZE];
	char *host_address;
	int  message_size;
	int  message_byte_size;
	
	const char delimiters[ ] = ":";


	port_number = atoi( argv[ 2 ] );

	//-- create the socket
	printf( "creating udp socket...\n" );
	socket_descriptor = socket(AF_INET, SOCK_DGRAM, 0);
	if ( socket_descriptor < 0 )
		perror( "Error opening the socket" );

	//-- quick trick to avoid error on binding
	int optval = 1;
	setsockopt( socket_descriptor, SOL_SOCKET, SO_REUSEADDR, ( const void * )&optval, sizeof( int ) );

	//-- set server internet address
	bzero( ( char * )&server_address, sizeof( server_address ) );
	server_address.sin_family = AF_INET;
	server_address.sin_addr.s_addr = inet_addr( argv[ 1 ] );
	server_address.sin_port = htons( ( unsigned short )port_number );

	//-- bind socket to port
	if( bind( socket_descriptor, ( struct sockaddr * )&server_address, sizeof( server_address ) ) < 0 )
		perror( "Error binding socket to port" );

	//-- if nothing has failed up to this point, let's start the connection to the create robot
	printf( "connecting to irobot create on %s...\n", argv[ 3 ] );
	startOI_MT( argv[ 3 ] );

	//-- the main loop !
	client_length = sizeof( client_address );
	while( 1 ){
		//-- receive the packets from the iphone app
		bzero( buffer, BUFFER_SIZE );
		message_byte_size = recvfrom( socket_descriptor, buffer, BUFFER_SIZE, 0, ( struct sockaddr * )&client_address, &client_length );
		if( message_byte_size < 0 )
			perror("Error in recvfrom");

		printf("%s\n", buffer);
		fflush(stdout);

		//-- split the control instruction and extract left wheel velocity and right wheel velocity
		char *left; 
		char *right; 
		left  =	strtok( buffer, delimiters );	// left = "Left";
		left  = strtok( NULL, delimiters );	// left = string with actual value for left wheel velocity
		right = strtok( NULL, delimiters );	// right = "Right"
		right = strtok( NULL, delimiters );	// right = string with actual value for right wheel velocity

		int left_velocity  = atoi( left );
		int right_velocity = atoi( right );
		
		//-- quick fix so that if the velocities of the wheels are too close 
		//   together then set them to the same, this should be handled on the 
		//   iphone code.
		if( abs( left_velocity - right_velocity ) < ERROR_MARGIN )
			left_velocity = right_velocity;

		//-- send command to the robot
		directDrive( left_velocity, right_velocity );
	}
	//-- stop robot 
	stopOI_MT();
}