/******************************************************************
 * Solve Inverse Kinematics
 * @deltaX : delta for end-effector position < R 3
 * @deltaP : delta for palm direction  < R 3
 * @restQ  : rest joint angles 
 * @deltaQ : output joint angles 
 ******************************************************************/
void sKinematics::solveIKPalm(double delta_x[], int axis, double delta_dir[], double q_rest[], double delta_q[])
{	
	int i;
	double in[6];
	double *q, *q_null;

	q      = svector(dof);
	q_null = svector(dof);	

	getJacobianPalm(axis, OJ );
	for( i=0; i<3; i++ ){
		in[i  ] = delta_x[i];
		in[i+3] = delta_dir[i];
	}
	
	//matsvdinv(OJ, 6, dof, OJi );
	matsvdinvDLS(OJ, 6, dof, 0.01, OJi );	
	matmul_vec(OJi, dof, 6, in, delta_q );

	// pseudo null space motion
	getJoints(q);
	matsub_c1(dof, q_rest, q, q_null );
	for(i=0; i<dof; i++ ) q_null[i] *= lamda;
	matnull(6, dof, OJ, OJi, N);
	matmul_vec( N, dof, dof, q_null, q ); 
	matadd_c1(dof, q, delta_q );
}
Beispiel #2
0
int rd_coords( FILE *istream, double ***ptr_pcoords, int *ncoords )
{
 int n,i,status=0;
 double **p_coords;
 char line[MAXLENGTH],**p_parse;

 p_coords = dmatrix(2,MAX_N_COORDS);
 n=0;
 while (fgets( line, MAXLENGTH, istream ) != NULL) {
   if (n>=MAX_N_COORDS) {
   	fprintf(stderr,"ERROR: Too many sources. Max=%d\n",MAX_N_COORDS);
	free_dmatrix(p_coords);
	return(ERRNO_INPUT_ERROR);
   }
   p_parse = svector(2,MAXLENGTH);
   splitstr(line,p_parse,SPACES);
   *(*(p_coords+0)+n) = atof(p_parse[0]);
   *(*(p_coords+1)+n) = atof(p_parse[1]);
   n++;
   free_svector(p_parse);
 }
 *ncoords = n;

 *ptr_pcoords = dmatrix(2,*ncoords);
 for (i=0;i<*ncoords;i++) {
   *(*(*ptr_pcoords + 0) + i) = *(*(p_coords+0)+i);
   *(*(*ptr_pcoords + 1) + i) = *(*(p_coords+1)+i);
 }
 free_dmatrix(p_coords);

 return(status);
}
Beispiel #3
0
void spolint (const float *xa, const float *ya, int_t n,
	            float x,         float *y,  float *dy)
{
  register int_t ns  = 1;
#if  defined(__uxp__) || defined(_SX)
  float            dif = (float) fabs (x - xa[1]),
#else
  float            dif = fabsf(x - xa[1]),
#endif
                   *c  = svector(1, n),
                   *d  = svector(1, n);
  register int_t i, m;
  float            den, dift, ho, hp, w;

  for (i = 1; i <= n; i++) {
#if  defined(__uxp__) || defined(_SX)
    if ((dift = (float) fabs  (x - xa[1])) < dif) {
#else
    if ((dift =         fabsf (x - xa[i])) < dif) {
#endif
      ns  = i;
      dif = dift;
    }
    c[i] = ya[i];
    d[i] = ya[i];
  }
    
  *y = ya[ns--];
  for (m = 1; m < n; m++) {
    for (i = 1; i <= n - m; i++) {
      ho = xa[i] - x;
      hp = xa[i+m] -x;
      w  = c[i+1] - d[i];
      if( (den = ho-hp) == 0.0F)
	message("spolint()", "two x values the same (within roundoff)", ERROR);
      den  = w  / den;
      d[i] = hp * den;
      c[i] = ho * den;
    }
    *y += (*dy=((ns<<1) < (n-m) ? c[ns+1] : d[ns--]));
  }

  freeSvector (c, 1);
  freeSvector (d, 1);
}
/******************************************************************
 * Set Inverse points
 * 
 ******************************************************************/
void sKinematics::initIKpoints(int nPoints, int points_index[], double points_weight[])
{
	int i;
	int row = nPoints*3;

	ik_points_index  = (int *)malloc(nPoints*sizeof(int));
	ik_points_weight = svector(nPoints);
	vweight          = svector(row);

	this->nPoints = nPoints;
	for(i=0; i<nPoints; i++){
		ik_points_index[i]  = points_index[i];
		ik_points_weight[i] = points_weight[i];

		vweight[i*3+0] = points_weight[i];
		vweight[i*3+1] = points_weight[i];
		vweight[i*3+2] = points_weight[i];
	}

	J   = smatrix(3, dof);
	FJ  = smatrix(row, dof);
	FJi = smatrix(dof, row);
}
Beispiel #5
0
SHORTVECTOR *new_shortvector(long nh)





{





SHORTVECTOR *m;


		  


		  m=(SHORTVECTOR *)malloc(sizeof(SHORTVECTOR));


		  if (!m) t_error("allocation failure in SHORTVECTOR()");


		  


		  m->isdynamic=isDynamic;		  


		  m->nl=NL;


		  m->nh=nh;


		  


		  m->co=svector(1,nh);


		  


		  return m;


}
    GMMStates* readGMMStatesFromFile(const char* file, unsigned int& num_states, unsigned int& num_vars)
    {
      FILE *fid;
      int res;
      double dtemp;
      fid = fopen(file, "r");
      if(!fid)
      {
              cout<<"Error opening file \""<<file<<"\"\n";
              throw;
      }
      res=fscanf(fid, "%lf\n", &dtemp);
      num_states = (int)dtemp;
      res=fscanf(fid, "%lf\n", &(dtemp));
      num_vars = (int)dtemp;
      GMMStates* GMMState  = (GMMStates  *)malloc(num_states*sizeof(GMMStates ) );
      for( unsigned int s=0; s<num_states; s++ ){
              GMMState[s].Mu       = svector(num_vars);
              GMMState[s].Sigma    = smatrix(num_vars, num_vars );
      }
      // Read priors
      for( unsigned int s=0; s<num_states; s++ )
              res=fscanf(fid, "%lf", &(GMMState[s].Prio ) );

      // Read Mu
      for( unsigned int i=0; i<num_vars; i++ )
              for( unsigned int s=0; s<num_states; s++ )
                      res=fscanf(fid, "%lf", &(GMMState[s].Mu[i]) );
      // Read Sigmas
      for( unsigned int s=0; s<num_states; s++ )
              for( unsigned int i=0; i<num_vars; i++ )
                      for( unsigned int j=0; j<num_vars; j++ )
                              res=fscanf(fid, "%lf", &(GMMState[s].Sigma[i][j]));
      fclose(fid);

      return GMMState;
    }
Beispiel #7
0
void sspline (integer n, float yp1, float ypn, const float* x, const float* y,
                                                                     float* y2)
{
  register integer i, k;
  float            h  = x[1] - x[0], 
                   *u = svector(0, n-2);
  float            p, qn, sig, un, hh;

  if (yp1 > 0.99e30)
    y2[0] = u[0] = 0.0F;
  else {
    y2[0] = -0.5F;
    u [0] = (3.0F / h) * ((y[1]-y[0]) / h - yp1);
  }

  for (i = 1; i < n-1; i++) {
    hh     = 1. / (x[i+1] - x[i-1]);
    sig    = h * hh;
    p      = sig * y2[i-1] + 2.;
    y2[i]  = (sig - 1.) / p;
    u [i]  = (y[i] - y[i-1]) / h;
    u [i]  = (y[i+1] - y[i]) / (h = x[i+1]-x[i]) - u[i];
    u [i]  = (6.0F * u[i] * hh - sig * u[i-1])/p;
  }

  if (ypn > 0.99e30)
    qn = un = 0.0F;
  else {
    qn = 0.5F;
    un = (3.0F / h)*(ypn - (y[n-1]-y[n-2])/h);
  }

  y2[n-1] = (un - qn * u[n-2]) / (qn * y2[n-2] + 1.);
  for (k = n-2; k; k--) y2[k] = y2[k] * y2[k+1] + u[k];

  freeSvector(u, 0);
}
Beispiel #8
0
int main(int argc, char* argv[])
{
	int i = 0;
	int data = 0;
	CVector<int>* dvector = new CVector<int>(10);

	for(i = 0; i < 20; i++)
	{
		dvector->append(i);
		assert(dvector->get(i, data) && data == i);
	}

	CVector<int> svector(*dvector);
	CVector<int> avector = *dvector;
	
	for(i = 0; i < 20; i++)
	{
		assert(svector.get(i, data) && data == i);
	}

	delete dvector;

	return 0;
}
/******************************************************************
 * Solve Inverse Kinematics
 ******************************************************************/
double sKinematics::solveIKPalmItr(double x_dest[], int axis, double dir_dest[], double q_rest[], double q_out[])
{	
	int i,j;
	double *q_old, *q_curr, *q_delta, *q_null;
	double x[3], dir[3];
	double ox[6];
	double error_old, error;

	error_old = 1000.0; // set maximum error;

	q_old  = svector(dof);
	q_curr = svector(dof);
	q_delta= svector(dof);
	q_null = svector(dof);

	while(1){
		getJacobianPalm(axis, OJ );
		getEndPos(x);
		getEndDirAxis(axis, dir);
		getJoints(q_curr);

		for( i=0; i<3; i++ ){
			ox[i  ] = x_dest[i]-x[i];
			ox[i+3] = dir_dest[i] - dir[i];
		}
		error = vnorm(6, ox );
		//printf("%f \n", error );

		// stop when the error reach to a local minimum
		if( error < IK_TOLERANCE ){
			matcp_c1(dof, q_curr, q_out );
			return error;
		}
		else if( abs(error_old - error)  < IK_TOLERANCE ){
			matcp_c1(dof, q_curr, q_out );
			return error;
		}
		else if( error > error_old ){
			matcp_c1(dof, q_old, q_out );
			return error_old;
		}

		matcp_c1(dof, q_curr, q_old );

		// solve inverse kinematics
		matsvdinvDLS(OJ, 6, dof, 0.01, OJi ); 
		// set weight
		for( i=0; i<dof; i++ ){
			for( j=0; j<6; j++ ){
				OJi[i][j] *= sDH[active_index[i]].weight;
			}
		}

		matnull(6, dof, OJ, OJi, N );               
		matsub_c1(dof, q_rest, q_curr, q_null );
		for(i=0; i<dof; i++ ) q_null[i] *= lamda;

		matmul_vec(OJi, dof, 6, ox, q_delta );
		matadd_c1(dof, q_delta, q_curr );

		matmul_vec( N, dof, dof, q_null, q_delta ); 
		matadd_c1(dof, q_delta, q_curr );           


		checkVelocityLimit(q_old, q_curr, deltaT);
		setJoints(q_curr);
		
		getEndPos(x);
		getEndDirAxis(axis, dir);
		for( i=0; i<3; i++ ){
			ox[i  ] = x_dest[i]-x[i];
			ox[i+3] = dir_dest[i] - dir[i];
		}
		error = vnorm(6, ox );
		error_old = error;		
		
    }
}
Beispiel #10
0
double sKinematics::solveIKpointsItr(double x_dest[], double q_out[])
{
	int i, j, k;
	double *q_old, *q_curr, *q_delta, *q_init;
	double x[3];
	double *ox_delta;
	double error_old, error;
	int dim = 3*nPoints;
	
	// set maximum error;
	error_old = 100000.0; 

	q_old   = svector(dof);
	q_curr  = svector(dof);
	q_delta = svector(dof);
	q_init  = svector(dof);
	ox_delta= svector(dim);

	getJoints(q_old);	
	matcp_c1(dof, q_old, q_init );
	while(1){
		// get current joint
		getJoints(q_curr);

		// get jacobian and delta x
		for( i=0; i<nPoints; i++){
			getJacobianPos(ik_points_index[i], J);			
			for( j=0; j<3; j++ ){
				for( k=0; k<dof; k++ ){
					FJ[i*3+j][k] = J[j][k];
				}
			}

			getEndPos(ik_points_index[i], x);
			for( j=0; j<3; j++ ) {
				ox_delta[i*3+j] = x_dest[i*3+j]-x[j];
			}
		}

		// calculate error
		error = 0;
		for( i=0; i<dim; i++ ){
			error += ox_delta[i]*ox_delta[i]*vweight[i];
		}
		error = sqrt(error);	
		//printf("%f \n", error );
		
		// exit when the error reach a local minimum
		if( error < IK_TOLERANCE ){
			matcp_c1(dof, q_curr, q_out );
			return error;
		}
		else if( abs(error_old - error)  < IK_TOLERANCE*0.1 ){
			matcp_c1(dof, q_curr, q_out );
			return error;
		}
		else if( error > error_old ){
			matcp_c1(dof, q_old, q_out );
			return error_old;
		}

		// solve IK
		matsvdinvDLS(FJ, dim, dof, 0.5, FJi );
		matmul_vec(FJi, dof, dim, ox_delta, q_delta );

		matcp_c1(dof, q_curr, q_old );    // backup joint angles
		matadd_c1(dof, q_delta, q_curr ); // set current joint

		checkVelocityLimit(q_init, q_curr, deltaT);
		setJoints(q_curr);
		error_old = error;
	}
	return error;
}
Beispiel #11
0
int artimg_snr(FILE *fstream, ARTIMGPARS pars, double **ppix, 
		KLFITS_HEADER *headers, int *nheaders)
{
 int ncol, status=0;
 long int xcenter,ycenter,ii,jj;
 double gcd,gcl,diameter,sb;
 double pc2pix,lum2flux,gcdpix,radius,sbinst,r;
 char line[2*MAXLENGTH],**p_parse;
 KLFITS_HEADER *h;

 pc2pix = (pars.artimg_distance * pars.artimg_pixscale) / SECPERRAD;
 lum2flux = 1./(4*PI*pow(pars.artimg_distance*MPERPC,2.));

 p_parse=svector(MKSNRPOP_OUTPUT_NCOL,MAXLENGTH);
 while (fgets( line, 2*MAXLENGTH, fstream ) != NULL) {
   if (!strncmp(line,"#",1)) { 
      h = create_list_klfits_header();
      if (status = parse_popheader(line, h)) {
      	 fprintf(stderr,"ERROR: Parsing header in artimg_snr.\n");
      	 fprintf(stderr,ERRMSG_INPUT_ERROR,line);
	 return(status);
      }
      if ( h->datatype != 0 ) {
        add_klfits_header( h, &headers );
	 (*nheaders)++;
      }
      h = NULL;
      continue;
   }
   ncol = splitstr(line,p_parse,SPACES);
   if (ncol != MKSNRPOP_OUTPUT_NCOL) {
   	fprintf(stderr,ERRMSG_INPUT_ERROR,"");
	return(ERRNO_INPUT_ERROR);
   }
   gcd = atof(p_parse[0]);
   gcl = atof(p_parse[1]);
   diameter = atof(p_parse[2]);
   sb = atof(p_parse[3]);
   gcdpix = gcd / pc2pix;
   xcenter = (long int)(pars.artimg_x0 + cos(gcl*PI/180.)*gcdpix);
   ycenter = (long int)(pars.artimg_y0 + sin(gcl*PI/180.)*gcdpix);
   radius = 0.5 * diameter / pc2pix;
   if ( (xcenter+radius < 1) || (xcenter-radius > pars.artimg_naxes[0]) ||
        (ycenter+radius < 1) || (ycenter-radius > pars.artimg_naxes[1]) ) {
     continue;
   }
   sbinst = sb * pow(pc2pix,2) * lum2flux / pars.artimg_fluxcalib;
   
   for (jj=ycenter-radius-1; jj<ycenter+radius; jj++) {
     if ( (jj>=0) && (jj<pars.artimg_naxes[1]) ) {
       for (ii=xcenter-radius-1; ii<xcenter+radius; ii++) {
         if ( (ii>=0) && (ii<pars.artimg_naxes[0]) ) {
	   r = sqrt( pow(ii-xcenter,2.) + pow(jj-ycenter,2.) );
	   if ( r <= radius ) { *(*(ppix+jj)+ii) += sbinst; }
	 }
       }
     }
   }
 }
 free_svector(p_parse);

 return(status);
}