32 #include <ompl/util/Console.h> 33 #include <ompl/util/RandomNumbers.h> 37 template <
class ProblemType>
40 template <
class ProblemType>
43 template <
class ProblemType>
47 prob_ = std::static_pointer_cast<ProblemType>(pointer);
48 if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::FIXED)
50 else if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::PLANAR)
52 if (init_.IsDubinsStateSpace)
57 else if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::FLOATING)
60 ThrowNamed(
"Unsupported base type " << prob_->GetScene()->GetKinematicTree().GetControlledBaseType());
61 ompl_simple_setup_.reset(
new ompl::geometric::SimpleSetup(state_space_));
62 ompl_simple_setup_->setStateValidityChecker(ompl::base::StateValidityCheckerPtr(
new OMPLStateValidityChecker(ompl_simple_setup_->getSpaceInformation(), prob_)));
63 ompl_simple_setup_->setPlannerAllocator(boost::bind(planner_allocator_, _1, algorithm_));
65 if (init_.Projection.rows() > 0)
67 std::vector<int> project_vars(init_.Projection.rows());
68 for (
int i = 0; i < init_.Projection.rows(); ++i)
70 project_vars[i] = (int)init_.Projection(i);
71 if (project_vars[i] < 0 || project_vars[i] >= prob_->N)
ThrowNamed(
"Invalid projection index! " << project_vars[i]);
73 if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::FIXED)
74 ompl_simple_setup_->getStateSpace()->registerDefaultProjection(ompl::base::ProjectionEvaluatorPtr(
new OMPLRNProjection(state_space_, project_vars)));
75 else if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::PLANAR)
76 ompl_simple_setup_->getStateSpace()->registerDefaultProjection(ompl::base::ProjectionEvaluatorPtr(
new OMPLSE2RNProjection(state_space_, project_vars)));
77 else if (prob_->GetScene()->GetKinematicTree().GetControlledBaseType() == BaseType::FLOATING)
78 ompl_simple_setup_->getStateSpace()->registerDefaultProjection(ompl::base::ProjectionEvaluatorPtr(
new OMPLSE3RNProjection(state_space_, project_vars)));
82 template <
class ProblemType>
85 return ompl::RNG::getSeed();
88 template <
class ProblemType>
94 ompl_simple_setup_->getProblemDefinition()->clearSolutionPaths();
95 const ompl::base::PlannerPtr planner = ompl_simple_setup_->getPlanner();
98 ompl_simple_setup_->getPlanner()->setProblemDefinition(ompl_simple_setup_->getProblemDefinition());
100 ompl_simple_setup_->getSpaceInformation()->getMotionValidator()->resetMotionCounter();
103 template <
class ProblemType>
106 ompl_simple_setup_->clearStartStates();
107 int v = ompl_simple_setup_->getSpaceInformation()->getMotionValidator()->getValidMotionCount();
108 int iv = ompl_simple_setup_->getSpaceInformation()->getMotionValidator()->getInvalidMotionCount();
111 if (ompl_simple_setup_->getProblemDefinition()->hasApproximateSolution())
115 template <
class ProblemType>
118 ompl::base::ScopedState<> gs(state_space_);
119 state_space_->as<
OMPLStateSpace>()->ExoticaToOMPLState(qT, gs.get());
120 if (!ompl_simple_setup_->getStateValidityChecker()->isValid(gs.get()))
125 if (!ompl_simple_setup_->getSpaceInformation()->satisfiesBounds(gs.get()))
130 auto bounds = prob_->GetBounds();
131 std::string out_of_bounds_joint_ids =
"";
132 for (
int i = 0; i < qT.rows(); ++i)
133 if (qT(i) < bounds[i] || qT(i) > bounds[i + qT.rows()])
134 out_of_bounds_joint_ids +=
"[j" + std::to_string(i) +
"=" + std::to_string(qT(i)) +
", ll=" + std::to_string(bounds[i]) +
", ul=" + std::to_string(bounds[i + qT.rows()]) +
"]\n";
136 ThrowNamed(
"Invalid goal state [Invalid joint bounds for joint indices: \n" 137 << out_of_bounds_joint_ids <<
"]");
139 ompl_simple_setup_->setGoalState(gs, eps);
142 template <
class ProblemType>
145 ompl::geometric::PathSimplifierPtr psf = ompl_simple_setup_->getPathSimplifier();
146 const ompl::base::SpaceInformationPtr &si = ompl_simple_setup_->getSpaceInformation();
148 ompl::geometric::PathGeometric pg = ompl_simple_setup_->getSolutionPath();
151 bool try_more =
true;
153 while (init_.ReduceVertices && times < init_.SimplifyTryCnt && try_more && ptc ==
false)
155 pg.interpolate(init_.SimplifyInterpolationLength);
156 try_more = psf->reduceVertices(pg, 0, 0, init_.RangeRatio);
159 if (init_.ShortcutPath && si->getStateSpace()->isMetricSpace())
162 while (times < init_.SimplifyTryCnt && try_more && ptc ==
false)
164 pg.interpolate(init_.SimplifyInterpolationLength);
165 try_more = psf->shortcutPath(pg, 0, 0, init_.RangeRatio, init_.SnapToVertex);
170 std::vector<ompl::base::State *> &states = pg.getStates();
171 unsigned int length = 0;
172 if (init_.FinalInterpolationLength > 3)
174 length = init_.FinalInterpolationLength;
178 const int n1 = states.size() - 1;
179 for (
int i = 0; i < n1; ++i)
180 length += si->getStateSpace()->validSegmentCount(states[i], states[i + 1]);
182 pg.interpolate(
int(length * init_.SmoothnessFactor));
184 traj.resize(pg.getStateCount(), prob_->GetSpaceDim());
185 Eigen::VectorXd tmp(prob_->GetSpaceDim());
187 for (
int i = 0; i < static_cast<int>(pg.getStateCount()); ++i)
189 state_space_->as<
OMPLStateSpace>()->OMPLToExoticaState(pg.getState(i), tmp);
190 traj.row(i) = tmp.transpose();
194 template <
class ProblemType>
198 ompl::msg::setLogLevel(debug_ ? ompl::msg::LogLevel::LOG_DEBUG : ompl::msg::LogLevel::LOG_WARN);
200 Eigen::VectorXd q0 = prob_->ApplyStartState();
203 const std::vector<double> bounds = prob_->GetBounds();
204 for (
const double l : bounds)
206 if (!std::isfinite(l))
208 std::cerr <<
"Detected non-finite joint limits:" << std::endl;
209 const size_t nlim = bounds.size() / 2;
210 for (uint i = 0; i < nlim; ++i)
212 std::cout << bounds[i] <<
", " << bounds[nlim + i] << std::endl;
214 throw std::runtime_error(
"All joint limits need to be finite!");
221 bounds_ = prob_->GetBounds();
223 else if (!bounds_.empty() && bounds_ != prob_->GetBounds())
225 ThrowPretty(
"Cannot set new bounds on locked state space!");
228 ompl_simple_setup_->getSpaceInformation()->setup();
230 ompl_simple_setup_->setup();
232 if (ompl_simple_setup_->getPlanner()->params().hasParam(
"Range"))
233 ompl_simple_setup_->getPlanner()->params().setParam(
"Range", init_.Range);
234 if (ompl_simple_setup_->getPlanner()->params().hasParam(
"GoalBias"))
235 ompl_simple_setup_->getPlanner()->params().setParam(
"GoalBias", init_.GoalBias);
237 if (init_.RandomSeed > -1)
239 HIGHLIGHT_NAMED(algorithm_,
"Setting random seed to " << init_.RandomSeed);
240 ompl::RNG::setSeed(static_cast<long unsigned int>(init_.RandomSeed));
243 SetGoalState(prob_->GetGoalState(), init_.Epsilon);
245 ompl::base::ScopedState<> ompl_start_state(state_space_);
247 state_space_->as<
OMPLStateSpace>()->ExoticaToOMPLState(q0, ompl_start_state.get());
248 ompl_simple_setup_->setStartState(ompl_start_state);
251 ompl::time::point start = ompl::time::now();
252 ompl::base::PlannerTerminationCondition ptc = ompl::base::timedPlannerTerminationCondition(init_.Timeout - ompl::time::seconds(ompl::time::now() - start));
255 if (ompl_simple_setup_->solve(ptc) == ompl::base::PlannerStatus::EXACT_SOLUTION && ompl_simple_setup_->haveSolutionPath())
257 GetPath(solution, ptc);
#define CONSOLE_BRIDGE_logWarn(fmt,...)
int GetRandomSeed() const
#define CONSOLE_BRIDGE_logDebug(fmt,...)
virtual void SpecifyProblem(PlanningProblemPtr pointer)
void SpecifyProblem(PlanningProblemPtr pointer) override
const Eigen::Ref< const Eigen::VectorXd > & VectorXdRefConst
void SetGoalState(Eigen::VectorXdRefConst qT, const double eps=0)
void GetPath(Eigen::MatrixXd &traj, ompl::base::PlannerTerminationCondition &ptc)
#define HIGHLIGHT_NAMED(name, x)
double GetDuration() const
std::shared_ptr< PlanningProblem > PlanningProblemPtr
void Solve(Eigen::MatrixXd &solution) override