Ejemplo n.º 1
0
	//--------------------------------------------------------------
	void ArmCalibration::keyPressed(int key)
	{
		enum ArmCalibrationMode
		{
			kReadingClouds = 0,
			kCheckingValues
		};
		static ArmCalibrationMode mode = kReadingClouds;

		if (key == 'm')
		{
			mode = mode == kReadingClouds ? kCheckingValues : kReadingClouds;
		}

		if (mode == kReadingClouds)
		{
			float sin15 = 0.2588;
			float sin30 = 0.5;
			float sin45 = 0.7071;
			float cos15 = 0.9659;
			float cos30 = 0.866;
			float cos45 = 0.7071;
			switch (key)
			{
				case '0':
					arduino.setArm3dCoordinates(ofVec3f(Arduino::ARM_LENGTH, 0, 0)); 
					arduino.lookAt(ofVec3f(Arduino::ARM_LENGTH, -Arduino::KINECT_HEIGHT - Arduino::MOTORS_HEIGHT, 0.10));
					break;
				case '1':
					//AngleMotor1 = -15
					arduino.setArm3dCoordinates(ofVec3f(Arduino::ARM_LENGTH*cos15, -Arduino::ARM_LENGTH*sin15, 0)); 
					arduino.lookAt(ofVec3f(arduino.getKinect3dCoordinates().x, arduino.getKinect3dCoordinates().y, arduino.getKinect3dCoordinates().z + 0.10));
					break;
				case '2':
					//AngleMotor2 = 15
					arduino.setArm3dCoordinates(ofVec3f(Arduino::ARM_LENGTH*cos15, 0, Arduino::ARM_LENGTH*sin15)); 
					arduino.lookAt(ofVec3f(arduino.getKinect3dCoordinates().x, arduino.getKinect3dCoordinates().y, arduino.getKinect3dCoordinates().z + 0.10));
					break;
				case '3':
					//AngleMotor8 > 90
					arduino.setArm3dCoordinates(ofVec3f(Arduino::ARM_LENGTH, 0, 0));
					arduino.lookAt(ofVec3f(arduino.getKinect3dCoordinates().x - 0.05, arduino.getKinect3dCoordinates().y, arduino.getKinect3dCoordinates().z + 0.10));
					break;
				case '4':
					//AngleMotor4 < 0 
					arduino.setArm3dCoordinates(ofVec3f(Arduino::ARM_LENGTH, 0, 0));
					arduino.lookAt(ofVec3f(arduino.getKinect3dCoordinates().x, arduino.getKinect3dCoordinates().y + 0.05, arduino.getKinect3dCoordinates().z + 0.15));
					break;
				case ' ':
					storeCloud();
					break;
				case 'k':
					saveRawClouds();
					break;
				case 'l':
					loadRawClouds();
					break;
			}
		}
		else
		{
			static short editingValue = 1;
			const float kValueChange = 0.002;
			switch (key)
			{
				case 'z':
					changeValue(Arduino::ARM_LENGTH, -kValueChange);
					break;
				case 'a':
					changeValue(Arduino::ARM_LENGTH, kValueChange);
					break;
				case 'x':
					changeValue(Arduino::KINECT_HEIGHT, -kValueChange);
					break;
				case 's':
					changeValue(Arduino::KINECT_HEIGHT, kValueChange);
					break;
				case 'c':
					changeValue(Arduino::MOTORS_HEIGHT, -kValueChange);
					break;
				case 'd':
					changeValue(Arduino::MOTORS_HEIGHT, kValueChange);
					break;

				case ' ':
					saveTransformedClouds();
					break;
			}
		}
	}
Ejemplo n.º 2
0
void CrichtonView<PointT>::fit_SQ( CloudPtr _cluster, int _index,
				   std::vector<SQ_parameters> &_ps, 
				   ObjectEntry _oe  ) {

  CloudPtr filtered( new Cloud() );  
  CloudPtr completed( new Cloud() );  

  // Filter
  pcl::StatisticalOutlierRemoval<PointT> sor;
  sor.setInputCloud (_cluster);
  sor.setMeanK (50);
  sor.setStddevMulThresh (1.0);
  sor.filter (*filtered);

  Eigen::Isometry3d Tsymm; Eigen::Vector3d Bb;
  *completed = *filtered;

    // Debug: Store raw cloud
  char name[100]; sprintf( name, "%s_original", _oe.name.c_str() );
   storeCloud( name, _index, completed );    

  // Mirror
   clock_t ts, tf; double dt;

  if( mMirror ) {
    ts = clock();
    mindGapper<PointT> mg;
    std::vector<double> tc(4); for( int i = 0; i < 4; ++i ) { tc[i] = mTts.mTableCoeffs[i]; }
    mg.setTablePlane( tc );
    mg.setFittingParams();
    mg.setDeviceParams();
    mg.setFocalDist(mF);

    mg.reset();
    if( mg.complete( completed, true ) < 0 ) { printf("No mirror was valid \n");     sprintf( name, "%s_no_mirrored", _oe.name.c_str() ); }
    else { printf("Mirroring was effectively applied \n");      sprintf( name, "%s_mirrored", _oe.name.c_str() ); }
    tf = clock();
    dt = (tf-ts)/(double) CLOCKS_PER_SEC;
    printf("* Mirroring time: %f \n", dt );
    // Debug: Store mirrored cloud
    storeCloud( name, _index, completed );
  }
  
  // Fit superquadric
  SQ_parameters p; 
  int type = SQ_FX_ICHIM; // MULTIPLE WE USE DIFFERENT
  ts = clock();
  switch( _oe.sq_type ) {
  case REGULAR: {
    printf("Type: regular \n");
    SQ_fitter<PointT> fitter;
    fitter.setInputCloud( completed );
    fitter.fit( type, 0.03, 0.005, 5, 0.005 );
    fitter.getFinalParams( p ); _ps.push_back(p);
    break;
  }
  case TAMPERED: {
    printf("Type: tampered \n");
    SQ_fitter_t<PointT> fitter;
    fitter.setInputCloud( completed );
    fitter.fit( type, 0.03, 0.005, 5, 0.005 );
    fitter.getFinalParams( p ); _ps.push_back(p);
    break;
  }
  case BENT: {
    printf("Type: bent \n");
    SQ_fitter_b<PointT> fitter;
    fitter.setInputCloud( completed );
    fitter.fit( type, 0.03, 0.005, 5, 0.005 );
    fitter.getFinalParams( p ); _ps.push_back(p);
    break;
  }
  case MULTIPLE: {
    printf("Type: multiple \n");
    SQ_fitter_m<PointT> fitter;
    fitter.setInputCloud( completed );
    fitter.fit( SQ_FX_RADIAL, _oe.part_type, _oe.num_parts, _oe.hint_search, 0.03, 0.005, 5, 0.005 );
    fitter.getFinalParams( _ps );
    
    break;
  }

  }
  tf = clock();
  dt = (tf-ts)/(double)CLOCKS_PER_SEC;
  printf("Fitting time");
  if( mMirror ) { printf(" with mirror "); } else { printf(" with NO mirror: \n"); }
  printf(" %f \n", dt );

  if( _oe.sq_type != MULTIPLE ) {
    printParamsInfo(_ps[0]);
    
    pcl::PointCloud<pcl::PointXYZ>::Ptr sqp( new pcl::PointCloud<pcl::PointXYZ>() );
    char sqname[75]; sprintf( sqname, "%s_sq.pcd", _oe.name.c_str() ); 
    sqp = sampleSQ_uniform<pcl::PointXYZ>( _ps[0] ); 
    pcl::io::savePCDFile( sqname, *sqp );
    
    }
}