55 kinematic_constraints::KinematicConstraintSetPtr ks,
56 constraint_samplers::ConstraintSamplerPtr cs)
57 : ob::GoalLazySamples(
58 pc->getOMPLSimpleSetup()->getSpaceInformation(),
59 [this](const GoalLazySamples* gls, ompl::base::State* state) {
60 return sampleUsingConstraintSampler(gls, state);
63 , planning_context_(pc)
64 , kinematic_constraint_set_(std::move(ks))
65 , constraint_sampler_(std::move(cs))
66 , work_state_(pc->getCompleteInitialRobotState())
67 , invalid_sampled_constraints_(0)
68 , warned_invalid_samples_(
false)
71 if (!constraint_sampler_)
72 default_sampler_ = si_->allocStateSampler();
73 RCLCPP_DEBUG(
getLogger(),
"Constructed a ConstrainedGoalSampler instance at address %p",
this);
81 return static_cast<const StateValidityChecker*
>(si_->getStateValidityChecker().get())->isValid(new_goal, verbose);
84bool ConstrainedGoalSampler::stateValidityCallback(ob::State* new_goal,
const moveit::core::RobotState* state,
85 const moveit::core::JointModelGroup* jmg,
const double* jpos,
89 moveit::core::RobotState solution_state(*state);
90 solution_state.setJointGroupPositions(jmg, jpos);
91 solution_state.update();
92 return checkStateValidity(new_goal, solution_state, verbose) &&
93 kinematic_constraint_set_->decide(solution_state, verbose).satisfied;
96bool ConstrainedGoalSampler::sampleUsingConstraintSampler(
const ob::GoalLazySamples* gls, ob::State* new_goal)
98 unsigned int max_attempts = planning_context_->getMaximumGoalSamplingAttempts();
99 unsigned int attempts_so_far = gls->samplingAttemptsCount();
102 if (attempts_so_far >= max_attempts)
106 if (gls->getStateCount() >= planning_context_->getMaximumGoalSamples())
110 if (planning_context_->getOMPLSimpleSetup()->getProblemDefinition()->hasSolution())
113 unsigned int max_attempts_div2 = max_attempts / 2;
114 for (
unsigned int a = gls->samplingAttemptsCount(); a < max_attempts && gls->isSampling(); ++a)
116 bool verbose =
false;
117 if (gls->getStateCount() == 0 && a >= max_attempts_div2)
119 if (verbose_display_ < 1)
126 if (constraint_sampler_)
130 verbose](moveit::core::RobotState* robot_state,
131 const moveit::core::JointModelGroup* joint_group,
132 const double* joint_group_variable_values) {
133 return stateValidityCallback(new_goal, robot_state, joint_group, joint_group_variable_values, verbose);
135 constraint_sampler_->setGroupStateValidityCallback(gsvcf);
137 if (constraint_sampler_->sample(work_state_, planning_context_->getMaximumStateSamplingAttempts()))
139 work_state_.update();
140 if (kinematic_constraint_set_->decide(work_state_, verbose).satisfied)
142 if (checkStateValidity(new_goal, work_state_, verbose))
147 invalid_sampled_constraints_++;
148 if (!warned_invalid_samples_ && invalid_sampled_constraints_ >= (attempts_so_far * 8) / 10)
150 warned_invalid_samples_ =
true;
151 RCLCPP_WARN(
getLogger(),
"More than 80%% of the sampled goal states "
152 "fail to satisfy the constraints imposed on the goal sampler. "
153 "Is the constrained sampler working correctly?");
160 default_sampler_->sampleUniform(new_goal);
161 if (
static_cast<const StateValidityChecker*
>(si_->getStateValidityChecker().get())->isValid(new_goal, verbose))
163 planning_context_->getOMPLStateSpace()->copyToRobotState(work_state_, new_goal);
164 if (kinematic_constraint_set_->decide(work_state_, verbose).satisfied)
Representation of a robot's state. This includes position, velocity, acceleration and effort.
ConstrainedGoalSampler(const ModelBasedPlanningContext *pc, kinematic_constraints::KinematicConstraintSetPtr ks, constraint_samplers::ConstraintSamplerPtr cs=constraint_samplers::ConstraintSamplerPtr())
const ModelBasedStateSpacePtr & getOMPLStateSpace() const
std::function< bool(RobotState *robot_state, const JointModelGroup *joint_group, const double *joint_group_variable_values)> GroupStateValidityCallbackFn
Signature for functions that can verify that if the group joint_group in robot_state is set to joint_...
rclcpp::Logger getLogger(const std::string &name)
Creates a namespaced logger.
The MoveIt interface to OMPL.
rclcpp::Logger getLogger()