bool constraint_samplers::IKConstraintSampler::sample(planning_models::KinematicState::JointStateGroup *jsg, const planning_models::KinematicState &ks, unsigned int max_attempts)
{
  // make sure we at least have a chance of sampling using IK; we need at least some kind of constraint
  if (!sampling_pose_.position_constraint_ && !sampling_pose_.orientation_constraint_)
    return false;

  // load an IK solver if we need to 
  if (!loadIKSolver())
  {
    kb_.reset();
    return false;
  }

  for (unsigned int a = 0 ; a < max_attempts ; ++a)
  {
    // sample a point in the constraint region
    Eigen::Vector3d point;    
    Eigen::Quaterniond quat;
    if (!samplePose(point, quat, ks, max_attempts))
      return false;

    geometry_msgs::Pose ik_query;
    ik_query.position.x = point.x();
    ik_query.position.y = point.y();
    ik_query.position.z = point.z();
    ik_query.orientation.x = quat.x();
    ik_query.orientation.y = quat.y();
    ik_query.orientation.z = quat.z();
    ik_query.orientation.w = quat.w();        
    
    if (callIK(ik_query, ik_timeout_, jsg))
      return true; 
  }
  return false;
}
Beispiel #2
0
void MyWindow::timeStepping()
{
	if (!mSimulating) return;
	int numFrames = static_cast<int>(mMovie.size());

	if (mController2)
	{
		numFrames = std::min(numFrames, static_cast<int>(mMovie2.size()));
		Eigen::VectorXd qhat2 = samplePose(mMovie2, mTime);// mMovie2[mFrameCount % numFrames].mPose;
		mController2->robot()->setPositions(qhat2);
		mController2->robot()->computeForwardKinematics(true, true, false);
	}
	Eigen::VectorXd qhat = samplePose(mMovie, mTime); //  mMovie[mFrameCount % numFrames].mPose;

	mController->robot()->setPositions(qhat);
	mController->robot()->computeForwardKinematics(true, true, false);



	mTime = mFrameCount * mController->robot()->getTimeStep();
	LOG(INFO) << mFrameCount << ": " << mTime;
	mFrameCount++;
}