bool IKSolver::solveIK(const string &tipLinkName, const Eigen::Vector3d &pos, const Eigen::Quaterniond &orient, const JointState &cs, JointState &state)
{
    using namespace Eigen ;

    assert(model_) ;

    Affine3d solver_tip_to_pose_tip = model_->getWorldTransform(solver_->getTipName()).inverse() * model_->getWorldTransform(tipLinkName) ;
    Affine3d frame = model_->getWorldTransform(solver_->getBaseName()) ;
    Affine3d pose_ = frame.inverse() *  Translation3d(pos) * orient * solver_tip_to_pose_tip.inverse() ;

    geometry_msgs::Pose pose = eigenPoseToROS(pose_.translation(), Quaterniond(pose_.rotation())) ;

    vector<double> solution ;
    int error_code ;

    vector<double> seed_state_vals = cs.getValues(joint_names_) ;

    if ( solver_->searchPositionIK(pose, seed_state_vals, 1.0, solution,
                                   boost::bind(&IKSolver::initialPoseCheck, this, _1, _2, _3),
                                   boost::bind(&IKSolver::collisionCheck, this, _1, _2, _3),
                                   error_code ) )
    {
        state = JointState(joint_names_, solution) ;
        return true ;
    }
    else return false ;
}
Exemplo n.º 2
0
    void trace_rays0(MData *m, SurfaceList *surflist, int nsurfs, Ray *R, int nray, int rsize, char *xray)
    {

	int *traversed = new int[nray];
	Ray *ray;

	//fprintf(stderr, "Ray0 %ld %p %d %d\n", R, R, nray, rsize);
	//fflush(stderr);

	//return;

	for ( int h = 0; h < nsurfs; h++ ) {

	    Surface *surf = surflist[h].surf;
	    int     nsurf = surflist[h].nsurf;
	    int      once = surflist[h].type;
	    int		j;

	    if ( once ) { for ( int j = 0; j < nray; j++ ) { traversed[j] = 0; } }

	    for ( int i = 0; i < nsurf; i++ ) {
		if ( isinf(surf[i].p[Px_thickness]) ) { continue; }
		if (      !surf[i].enable           ) { continue; } 

		Affine3d txforward = Affine3d::Identity();
		Affine3d txreverse  ;
		Affine3d rtforward  ;
		Affine3d rtreverse  ;

		txforward   = 						// Ray position transform
			    Affine3d::Identity()
			    * Translation3d(0.0, 0.0,  m->z)
				* AngleAxisd(d2r( surf[i].p[Px_rz]), Vector3d(0.0, 0.0, -1.0))
				* AngleAxisd(d2r(-surf[i].p[Px_ry]), Vector3d(0.0, 1.0,  0.0))
				* AngleAxisd(d2r(-surf[i].p[Px_rx]), Vector3d(1.0, 0.0,  0.0))
			    * Translation3d(0.0, 0.0, -m->z)
			    * Translation3d(-surf[i].p[Px_px], -surf[i].p[Px_py], -surf[i].p[Px_pz])
			;

		rtforward   =						// Ray direction transform
			    Affine3d::Identity()
				* AngleAxisd(d2r( surf[i].p[Px_rz]), Vector3d(0.0, 0.0, -1.0))
				* AngleAxisd(d2r(-surf[i].p[Px_ry]), Vector3d(0.0, 1.0,  0.0))
				* AngleAxisd(d2r(-surf[i].p[Px_rx]), Vector3d(1.0, 0.0,  0.0))
			;

		txreverse 	= txforward.inverse();
		rtreverse 	= rtforward.inverse();

		//printf("Surface %s %d %d: %f %f %f	%d %ld\n", surf[i].type, h, i, -surf[i].p[Px_px], -surf[i].p[Px_py], -surf[i].p[Px_pz], once, surf[i].traverse);

		for ( j = 0, ray = R; j < nray; j++, ray = (Ray *) (((char *) ray) + rsize) ) {
		    Vector3d saveP = ray->p;
		    Vector3d saveK = ray->k;

			//printf("Ray  ");
			//prays(ray, 1);

		    if ( ray->vignetted ) { continue; }

		    ray->p = txforward * ray->p;		// Put the ray into the surface cs.
		    ray->k = rtforward * ray->k;

			//printf("Conv ");
			//prays(ray, 1);

		    ray->vignetted = surf[i].traverse(m, &surf[i], ray);

			//printf("Trav ");
			//prays(ray, 1);

		    if ( ray->vignetted == 2 ) {		// Coordbreak returns 2
			ray->vignetted = 0;

			if ( xray ) {
			    memcpy(xray, ray, rsize);
			    xray += rsize;
			}
			continue; 
		    }

		    if ( ray->vignetted || (!ray->vignetted && aper_clip(&surf[i], ray)) ) {
		        ray->vignetted = i ? i : -1;
		    }

		    if ( once ) {
			//printf("Here ");
			//prays(ray, 1);

			  if ( !ray->vignetted ) {		// If the ray was not vignetted it has traversed this surface.
			//printf("Trav ");
			//prays(ray, 1);
			      traversed[j] = 1;			// Don't try this ray again
			      ray->vignetted = 1;
			  } else {
			//printf("Ving ");
			//prays(&ray[j], 1);
			      ray->p = saveP;			// Reset
			      ray->k = saveK;

			      ray->vignetted = 0;		// Try again on next surface

			      continue;
			  }
		    }

		    ray->p = txreverse * ray->p;		// Put the ray back into global cs..
		    ray->k = rtreverse * ray->k;

		    if ( xray ) {
			memcpy(xray, ray, rsize);
			xray += rsize;
		    }

			//printf("Next ");
			//prays(ray, 1);
		}

		if ( !once ) {
		    m->indicies  = surf[i].indicies[0] > 0.0 ? surf[i].indicies: m->indicies;
		    m->z += surf[i].p[Px_thickness];
		}
	    }
			//printf("Done ");
			//prays(ray, 1);

	    if ( once ) {
		for ( j = 0, ray = R; j < nray; j++, ray = (Ray *) (((char *) ray) + rsize) ) {	// Rays that have not traversed are vignetted.
		    ray->vignetted = !traversed[j];
		}
		m->indicies  = surf[0].indicies[0] > 0.0 ? surf[0].indicies: m->indicies;
		m->z += surf[0].p[Px_thickness];
	    }
	}
	delete [] traversed;
    }