60 std::vector<kinematic_constraints::JointConstraint> jc;
61 for (
const moveit_msgs::JointConstraint& joint_constraint : constr.joint_constraints)
64 if (j.configure(joint_constraint))
68 return jc.empty() ? false :
configure(jc);
77 ROS_ERROR_NAMED(
"constraint_samplers",
"NULL group specified for constraint sampler");
83 std::map<std::string, JointInfo> bound_data;
84 bool some_valid_constraint =
false;
87 if (!joint_constraint.enabled())
94 some_valid_constraint =
true;
98 std::map<std::string, JointInfo>::iterator it = bound_data.find(joint_constraint.getJointVariableName());
99 if (it != bound_data.end())
105 joint_constraint.getDesiredJointPosition() - joint_constraint.getJointToleranceBelow()),
107 joint_constraint.getDesiredJointPosition() + joint_constraint.getJointToleranceAbove()));
109 ROS_DEBUG_NAMED(
"constraint_samplers",
"Bounds for %s JointConstraint are %g %g",
114 std::stringstream cs;
115 joint_constraint.print(cs);
117 "The constraints for joint '%s' are such that "
118 "there are no possible values for the joint: min_bound: %g, max_bound: %g. Failing.\n",
123 bound_data[joint_constraint.getJointVariableName()] = ji;
126 if (!some_valid_constraint)
128 ROS_WARN_NAMED(
"constraint_samplers",
"No valid joint constraints");
132 for (std::pair<const std::string, JointInfo>& it : bound_data)
138 if (bound_data.find(joint->getName()) == bound_data.end() && joint->getVariableCount() > 0 &&
139 joint->getMimic() ==
nullptr)
142 const std::vector<std::string>& vars = joint->getVariableNames();
145 bool all_found =
true;
146 for (
const std::string& var : vars)
147 if (bound_data.find(var) == bound_data.end())
170 ROS_WARN_NAMED(
"constraint_samplers",
"JointConstraintSampler not configured, won't sample");
175 std::vector<double> v;
176 for (std::size_t i = 0; i <
unbounded_.size(); ++i)
180 for (std::size_t j = 0; j < v.size(); ++j)
185 for (
const JointInfo& bound :
bounds_)
196 return sample(state, state, max_attempts);
238 const kinematic_constraints::OrientationConstraintPtr& oc)
239 : position_constraint_(pc), orientation_constraint_(oc)
263 ROS_WARN_NAMED(
"constraint_samplers",
"No enabled constraints in sampling pose");
274 "Position and orientation constraints need to be specified for the same link "
275 "in order to use IK-based sampling");
286 ROS_WARN_NAMED(
"constraint_samplers",
"No solver instance in setup");
296 for (std::size_t p = 0; p < constr.position_constraints.size(); ++p)
297 for (std::size_t o = 0; o < constr.orientation_constraints.size(); ++o)
298 if (constr.position_constraints[p].link_name == constr.orientation_constraints[o].link_name)
300 kinematic_constraints::PositionConstraintPtr pc(
302 kinematic_constraints::OrientationConstraintPtr oc(
304 if (pc->configure(constr.position_constraints[p],
scene_->getTransforms()) &&
305 oc->configure(constr.orientation_constraints[o],
scene_->getTransforms()))
306 return configure(IKSamplingPose(pc, oc));
309 for (
const moveit_msgs::PositionConstraint& position_constraint : constr.position_constraints)
311 kinematic_constraints::PositionConstraintPtr pc(
313 if (pc->configure(position_constraint,
scene_->getTransforms()))
317 for (
const moveit_msgs::OrientationConstraint& orientation_constraint : constr.orientation_constraints)
319 kinematic_constraints::OrientationConstraintPtr oc(
321 if (oc->configure(orientation_constraint,
scene_->getTransforms()))
332 const std::vector<bodies::BodyPtr>& constraint_regions =
336 vol += constraint_region->computeVolume();
337 if (!constraint_regions.empty())
372 "The IK solver expects requests in frame '%s' but this frame is not known to the sampler. "
373 "Ignoring transformation (IK may fail)",
379 bool wrong_link =
false;
387 for (
const std::pair<const moveit::core::LinkModel* const, Eigen::Isometry3d>& fixed_link : fixed_links)
405 for (
const std::pair<const moveit::core::LinkModel* const, Eigen::Isometry3d>& fixed_link : fixed_links)
419 "IK cannot be performed for link '%s'. The solver can report IK solutions for link '%s'.",
423 kb_->getTipFrame().c_str());
430 unsigned int max_attempts)
436 "IKConstraintSampler received dirty robot state, but valid transforms are required. "
448 for (std::size_t i = 0; i < b.size(); ++i)
456 ROS_ERROR_NAMED(
"constraint_samplers",
"Unable to sample a point inside the constraint region");
462 ROS_ERROR_NAMED(
"constraint_samplers",
"Unable to sample a point inside the constraint region. "
463 "Constraint region is empty when it should not be.");
476 temp_state.setToRandomPositions(
jmg_);
493 Eigen::Isometry3d diff;
495 moveit_msgs::OrientationConstraint::XYZ_EULER_ANGLES)
497 diff = Eigen::Isometry3d(Eigen::AngleAxisd(angle_x, Eigen::Vector3d::UnitX()) *
498 Eigen::AngleAxisd(angle_y, Eigen::Vector3d::UnitY()) *
499 Eigen::AngleAxisd(angle_z, Eigen::Vector3d::UnitZ()));
502 moveit_msgs::OrientationConstraint::ROTATION_VECTOR)
505 diff = Eigen::Isometry3d(Eigen::AngleAxisd(rotation_vector.norm(), rotation_vector.normalized()));
511 "The parameterization type for the orientation constraints is invalid.");
518 quat = Eigen::Quaterniond(reqr.linear());
527 Eigen::Isometry3d rt(
t.linear() * quat);
528 quat = Eigen::Quaterniond(rt.linear());
536 quat = Eigen::Quaterniond(q[3], q[0], q[1], q[2]);
551 const std::vector<double>& ik_sol, moveit_msgs::MoveItErrorCodes& error_code)
554 std::vector<double> solution(bij.size());
555 for (std::size_t i = 0; i < bij.size(); ++i)
556 solution[i] = ik_sol[bij[i]];
557 if (constraint(state, jmg, &solution[0]))
558 error_code.val = moveit_msgs::MoveItErrorCodes::SUCCESS;
565 unsigned int max_attempts)
567 return sampleHelper(state, reference_state, max_attempts,
false);
571 unsigned int max_attempts,
bool project)
575 ROS_WARN_NAMED(
"constraint_samplers",
"IKConstraintSampler not configured, won't sample");
581 adapted_ik_validity_callback = [
this, state_ptr = &state](
const geometry_msgs::Pose& ,
582 const std::vector<double>& joints,
583 moveit_msgs::MoveItErrorCodes& error_code) {
587 for (
unsigned int a = 0; a < max_attempts; ++a)
591 Eigen::Quaterniond quat;
595 ROS_INFO_NAMED(
"constraint_samplers",
"IK constraint sampler was unable to produce a pose to run IK for");
604 Eigen::Isometry3d ikq(Eigen::Translation3d(
point) * quat);
607 point = ikq.translation();
608 quat = Eigen::Quaterniond(ikq.linear());
614 Eigen::Isometry3d ikq(Eigen::Translation3d(
point) * quat);
616 point = ikq.translation();
617 quat = Eigen::Quaterniond(ikq.linear());
620 geometry_msgs::Pose ik_query;
621 ik_query.position.x =
point.x();
622 ik_query.position.y =
point.y();
623 ik_query.position.z =
point.z();
624 ik_query.orientation.x = quat.x();
625 ik_query.orientation.y = quat.y();
626 ik_query.orientation.z = quat.z();
627 ik_query.orientation.w = quat.w();
654 std::vector<double> seed(ik_joint_bijection.size(), 0.0);
655 std::vector<double> vals;
663 assert(vals.size() == ik_joint_bijection.size());
664 for (std::size_t i = 0; i < ik_joint_bijection.size(); ++i)
665 seed[i] = vals[ik_joint_bijection[i]];
667 std::vector<double> ik_sol;
668 moveit_msgs::MoveItErrorCodes error;
670 if (adapted_ik_validity_callback ?
671 kb_->searchPositionIK(ik_query, seed, timeout, ik_sol, adapted_ik_validity_callback, error) :
672 kb_->searchPositionIK(ik_query, seed, timeout, ik_sol, error))
674 assert(ik_sol.size() == ik_joint_bijection.size());
675 std::vector<double> solution(ik_joint_bijection.size());
676 for (std::size_t i = 0; i < ik_joint_bijection.size(); ++i)
677 solution[ik_joint_bijection[i]] = ik_sol[i];
685 error.val != moveit_msgs::MoveItErrorCodes::INVALID_ROBOT_STATE &&
687 ROS_ERROR_NAMED(
"constraint_samplers",
"IK solver failed with error %d", error.val);