8 #include <ompl/base/ConstrainedSpaceInformation.h> 13 : GoalRegion(si), goal_(goal)
19 return goal_->isSatisfied(state->as<WrapperStateSpace::StateType>()->getState());
24 return goal_->isSatisfied(state->as<WrapperStateSpace::StateType>()->getState(), distance);
29 return goal_->distanceGoal(state->as<WrapperStateSpace::StateType>()->getState());
39 goal_->setThreshold(threshold);
44 return goal_->getThreshold();
52 : Constraint(goal->getSpaceInformation()->getStateSpace()->getDimension(), 1)
54 , state_(goal->getSpaceInformation()->allocState())
60 out[0] =
goal_->distanceGoal(state);
65 Eigen::Ref<Eigen::VectorXd> out)
const 67 const auto &space =
goal_->getSpaceInformation()->getStateSpace();
68 for (
unsigned int i = 0; i < space->getDimension(); ++i)
69 *space->getValueAddressAtIndex(
state_, i) = x[i];
76 return goal_->distanceGoal(state);
81 return goal_->isSatisfied(state);
90 : Constraint(ambientDim, coDim, tolerance), p_(leafDim), t_(coDim - leafDim)
117 :
Foliation(ambientDim, 0, ambientDim, tolerance)
119 for (
const auto &foliation : foliations)
129 return std::make_shared<FoliationIntersection>(n_, foliations, tolerance_);
133 Eigen::Ref<Eigen::VectorXd> out)
const 138 foliation->function(x, out.segment(i, foliation->getCoDimension()));
139 i += foliation->getCoDimension();
144 Eigen::Ref<Eigen::MatrixXd> out)
const 149 foliation->jacobian(x, out.block(i, 0, foliation->getCoDimension(), n_));
150 i += foliation->getCoDimension();
156 Eigen::VectorXd transverse(
t_);
161 transverse.segment(i, foliation->getTransverseDimension()) = foliation->getTransversal(state);
162 i += foliation->getTransverseDimension();
175 constraints.
emplace_back(foliation->getLeaf(tv.segment(i, foliation->getTransverseDimension())));
176 i += foliation->getTransverseDimension();
179 return std::make_shared<ConstraintIntersection>(n_, constraints);
183 const Eigen::Ref<const Eigen::VectorXd> &b)
const 190 constraints.
emplace_back(foliation->getFrond(a.segment(i, foliation->getTransverseDimension()),
191 b.segment(i, foliation->getTransverseDimension())));
192 i += foliation->getTransverseDimension();
195 return std::make_shared<FoliationIntersection>(n_, constraints, tolerance_);
200 setManifoldDimension(k_ - constraint->getCoDimension());
214 , isConstrained_(
std::dynamic_pointer_cast<ConstrainedSpaceInformation>(si))
215 , isFoliation_(
std::dynamic_pointer_cast<FoliationPtr>(constraint))
216 , constraint_(allocateConstraint(constraint))
217 , sampler_(si_->allocStateSampler())
219 setThreshold(threshold);
223 transverse_.reset(
new NearestNeighborsGNAT<Transition>());
241 return std::make_shared<ConstraintIntersection>(
242 si_->getStateDimension(),
251 const auto &ss = si_->getStateSpace();
255 return *state->as<ConstrainedStateSpace::StateType>();
257 return Eigen::Map<const Eigen::VectorXd>(ss->getValueAddressAtIndex(state, 0), ss->getDimension());
262 const auto &ss = si_->getStateSpace();
266 return *state->as<ConstrainedStateSpace::StateType>();
268 return Eigen::Map<Eigen::VectorXd>(ss->getValueAddressAtIndex(state, 0), ss->getDimension());
278 Eigen::Ref<Eigen::VectorXd> cs =
getVector(state);
280 bool success =
false;
283 while (not success && i > 0)
ConstraintGoal(const ConstraintPtr &constraint, SpaceInformationPtr si, double threshold=1e-5)
GoalConstraint(const std::shared_ptr< GoalRegion > &goal)
const unsigned int maxSample_
bool sample(const GoalLazySamples *gls, State *state)
const unsigned int tries_
Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
double distance(const ompl::base::State *state) const override
const std::shared_ptr< GoalRegion > goal_
bool isSatisfied(const State *state) const override
const StateSamplerPtr sampler_
void setThreshold(double threshold)
void addConstraint(const FoliationPtr &constraint)
FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
FoliationPtr copy() const override
std::vector< FoliationPtr > foliations_
Constituent constraints.
void setTransverseDimension(unsigned int t)
unsigned int getLeafDimension() const
unsigned int t_
Transverse dimension.
FoliationIntersection(const unsigned int ambientDim, std::vector< FoliationPtr > foliations, double tolerance=magic::CONSTRAINT_PROJECTION_TOLERANCE)
void update(const State *state)
double distanceGoal(const State *state) const override
void print(std::ostream &out=std::cout) const override
const ConstraintPtr constraint_
ConstraintPtr allocateConstraint(const ConstraintPtr &constraint) const
WrapperGoalRegion(const SpaceInformationPtr &si, const std::shared_ptr< GoalRegion > &goal)
~ConstraintGoal() override
void jacobian(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::MatrixXd > out) const override
ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
double getThreshold() const
Foliation(const unsigned int ambientDim, const unsigned int coDim, const unsigned int leafDim, double tolerance=magic::CONSTRAINT_PROJECTION_TOLERANCE)
std::shared_ptr< NearestNeighbors< Transition > > transverse_
T static_pointer_cast(T... args)
void function(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > out) const override
bool isSatisfied(const ompl::base::State *state) const override
unsigned int p_
Leaf dimension.
unsigned int getTransverseDimension() const
void function(const ompl::base::State *state, Eigen::Ref< Eigen::VectorXd > out) const override
const bool isConstrained_
virtual Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const =0
double distanceGoal(const State *state) const override
const std::shared_ptr< GoalRegion > goal_
#define SE2EZ_DEBUG(fmt,...)
Eigen::Ref< Eigen::VectorXd > getVector(State *state) const
const Eigen::Ref< const Eigen::VectorXd > getVectorConst(const State *state) const
T emplace_back(T... args)
void setLeafDimension(unsigned int p)