se2ez
goals.cpp
Go to the documentation of this file.
1 /* Author: Zachary Kingston */
2 
3 #include <se2ez/core/log.h>
4 #include <se2ez/core/math.h>
5 
6 #include <se2ez/plan/goals.h>
7 
8 #include <ompl/base/ConstrainedSpaceInformation.h>
9 
10 using namespace ompl::base;
11 
12 WrapperGoalRegion::WrapperGoalRegion(const SpaceInformationPtr &si, const std::shared_ptr<GoalRegion> &goal)
13  : GoalRegion(si), goal_(goal)
14 {
15 }
16 
17 bool WrapperGoalRegion::isSatisfied(const State *state) const
18 {
19  return goal_->isSatisfied(state->as<WrapperStateSpace::StateType>()->getState());
20 }
21 
22 bool WrapperGoalRegion::isSatisfied(const State *state, double *distance) const
23 {
24  return goal_->isSatisfied(state->as<WrapperStateSpace::StateType>()->getState(), distance);
25 }
26 
27 double WrapperGoalRegion::distanceGoal(const State *state) const
28 {
29  return goal_->distanceGoal(state->as<WrapperStateSpace::StateType>()->getState());
30 }
31 
33 {
34  goal_->print(out);
35 }
36 
37 void WrapperGoalRegion::setThreshold(double threshold)
38 {
39  goal_->setThreshold(threshold);
40 }
41 
43 {
44  return goal_->getThreshold();
45 }
46 
47 ///
48 /// GoalConstraint
49 ///
50 
52  : Constraint(goal->getSpaceInformation()->getStateSpace()->getDimension(), 1)
53  , goal_(goal)
54  , state_(goal->getSpaceInformation()->allocState())
55 {
56 }
57 
58 void GoalConstraint::function(const ompl::base::State *state, Eigen::Ref<Eigen::VectorXd> out) const
59 {
60  out[0] = goal_->distanceGoal(state);
61  SE2EZ_DEBUG("GOAL DISTANCE: %1%", out[0]);
62 }
63 
64 void GoalConstraint::function(const Eigen::Ref<const Eigen::VectorXd> &x,
65  Eigen::Ref<Eigen::VectorXd> out) const
66 {
67  const auto &space = goal_->getSpaceInformation()->getStateSpace();
68  for (unsigned int i = 0; i < space->getDimension(); ++i)
69  *space->getValueAddressAtIndex(state_, i) = x[i];
70 
71  function(state_, out);
72 }
73 
74 double GoalConstraint::distance(const ompl::base::State *state) const
75 {
76  return goal_->distanceGoal(state);
77 }
78 
79 bool GoalConstraint::isSatisfied(const ompl::base::State *state) const
80 {
81  return goal_->isSatisfied(state);
82 }
83 
84 ///
85 /// Foliation
86 ///
87 
88 Foliation::Foliation(const unsigned int ambientDim, const unsigned int coDim, const unsigned int leafDim,
89  double tolerance)
90  : Constraint(ambientDim, coDim, tolerance), p_(leafDim), t_(coDim - leafDim)
91 {
92 }
93 
94 
95 unsigned int Foliation::getLeafDimension() const
96 {
97  return p_;
98 }
99 
101 {
102  return t_;
103 }
104 
105 void Foliation::setLeafDimension(unsigned int p)
106 {
107  p_ = p;
108 }
109 
111 {
112  t_ = t;
113 }
114 
115 FoliationIntersection::FoliationIntersection(const unsigned int ambientDim,
116  std::vector<FoliationPtr> foliations, double tolerance)
117  : Foliation(ambientDim, 0, ambientDim, tolerance)
118 {
119  for (const auto &foliation : foliations)
120  addConstraint(foliation);
121 }
122 
123 FoliationPtr FoliationIntersection::copy() const
124 {
125  std::vector<FoliationPtr> foliations;
126  for (const auto &foliation : foliations_)
127  foliations.emplace_back(foliation->copy());
128 
129  return std::make_shared<FoliationIntersection>(n_, foliations, tolerance_);
130 }
131 
132 void FoliationIntersection::function(const Eigen::Ref<const Eigen::VectorXd> &x,
133  Eigen::Ref<Eigen::VectorXd> out) const
134 {
135  unsigned int i = 0;
136  for (const auto &foliation : foliations_)
137  {
138  foliation->function(x, out.segment(i, foliation->getCoDimension()));
139  i += foliation->getCoDimension();
140  }
141 }
142 
143 void FoliationIntersection::jacobian(const Eigen::Ref<const Eigen::VectorXd> &x,
144  Eigen::Ref<Eigen::MatrixXd> out) const
145 {
146  unsigned int i = 0;
147  for (const auto &foliation : foliations_)
148  {
149  foliation->jacobian(x, out.block(i, 0, foliation->getCoDimension(), n_));
150  i += foliation->getCoDimension();
151  }
152 }
153 
154 Eigen::VectorXd FoliationIntersection::getTransversal(const Eigen::Ref<const Eigen::VectorXd> &state) const
155 {
156  Eigen::VectorXd transverse(t_);
157 
158  unsigned int i = 0;
159  for (const auto &foliation : foliations_)
160  {
161  transverse.segment(i, foliation->getTransverseDimension()) = foliation->getTransversal(state);
162  i += foliation->getTransverseDimension();
163  }
164 
165  return transverse;
166 }
167 
168 ConstraintPtr FoliationIntersection::getLeaf(const Eigen::Ref<const Eigen::VectorXd> &tv) const
169 {
170  std::vector<ConstraintPtr> constraints;
171 
172  unsigned int i = 0;
173  for (const auto &foliation : foliations_)
174  {
175  constraints.emplace_back(foliation->getLeaf(tv.segment(i, foliation->getTransverseDimension())));
176  i += foliation->getTransverseDimension();
177  }
178 
179  return std::make_shared<ConstraintIntersection>(n_, constraints);
180 }
181 
182 FoliationPtr FoliationIntersection::getFrond(const Eigen::Ref<const Eigen::VectorXd> &a,
183  const Eigen::Ref<const Eigen::VectorXd> &b) const
184 {
185  std::vector<FoliationPtr> constraints;
186 
187  unsigned int i = 0;
188  for (const auto &foliation : foliations_)
189  {
190  constraints.emplace_back(foliation->getFrond(a.segment(i, foliation->getTransverseDimension()),
191  b.segment(i, foliation->getTransverseDimension())));
192  i += foliation->getTransverseDimension();
193  }
194 
195  return std::make_shared<FoliationIntersection>(n_, constraints, tolerance_);
196 }
197 
198 void FoliationIntersection::addConstraint(const FoliationPtr &constraint)
199 {
200  setManifoldDimension(k_ - constraint->getCoDimension());
201  setLeafDimension(p_ - constraint->getLeafDimension());
202  setTransverseDimension(t_ + constraint->getLeafDimension());
203 
204  foliations_.push_back(constraint);
205 }
206 
207 ///
208 /// ConstraintGoal
209 ///
210 
211 ConstraintGoal::ConstraintGoal(const ConstraintPtr &constraint, SpaceInformationPtr si, double threshold)
212  : GoalLazySamples(
213  si, std::bind(&ConstraintGoal::sample, this, std::placeholders::_1, std::placeholders::_2), false)
214  , isConstrained_(std::dynamic_pointer_cast<ConstrainedSpaceInformation>(si))
215  , isFoliation_(std::dynamic_pointer_cast<FoliationPtr>(constraint))
216  , constraint_(allocateConstraint(constraint))
217  , sampler_(si_->allocStateSampler())
218 {
219  setThreshold(threshold);
220 
221  if (isFoliation_)
222  {
223  transverse_.reset(new NearestNeighborsGNAT<Transition>());
224  transverse_->setDistanceFunction(
225  [](const Transition &a, const Transition &b) { return (a.first - b.first).norm(); });
226 
227  setNewStateCallback(std::bind(&ConstraintGoal::update, this, std::placeholders::_1));
228  }
229 }
230 
232 {
233  stopSampling();
234 }
235 
236 ConstraintPtr ConstraintGoal::allocateConstraint(const ConstraintPtr &constraint) const
237 {
238  if (isConstrained_)
239  {
240  const auto &css = std::static_pointer_cast<ConstrainedStateSpace>(si_->getStateSpace());
241  return std::make_shared<ConstraintIntersection>(
242  si_->getStateDimension(),
243  (std::initializer_list<ConstraintPtr>){css->getConstraint(), constraint});
244  }
245  else
246  return constraint;
247 }
248 
249 const Eigen::Ref<const Eigen::VectorXd> ConstraintGoal::getVectorConst(const State *state) const
250 {
251  const auto &ss = si_->getStateSpace();
252 
253  // Dynamically set the vector reference to the underlying state memory
254  if (isConstrained_)
255  return *state->as<ConstrainedStateSpace::StateType>();
256  else
257  return Eigen::Map<const Eigen::VectorXd>(ss->getValueAddressAtIndex(state, 0), ss->getDimension());
258 }
259 
260 Eigen::Ref<Eigen::VectorXd> ConstraintGoal::getVector(State *state) const
261 {
262  const auto &ss = si_->getStateSpace();
263 
264  // Dynamically set the vector reference to the underlying state memory
265  if (isConstrained_)
266  return *state->as<ConstrainedStateSpace::StateType>();
267  else
268  return Eigen::Map<Eigen::VectorXd>(ss->getValueAddressAtIndex(state, 0), ss->getDimension());
269 }
270 
271 double ConstraintGoal::distanceGoal(const State *state) const
272 {
273  return constraint_->distance(getVectorConst(state));
274 }
275 
276 bool ConstraintGoal::sample(const GoalLazySamples *, State *state)
277 {
278  Eigen::Ref<Eigen::VectorXd> cs = getVector(state);
279 
280  bool success = false;
281 
282  unsigned int i = tries_;
283  while (not success && i > 0)
284  {
285  sampler_->sampleUniform(state);
286  success = constraint_->project(cs);
287 
288  i--;
289  }
290 
291  return maxSampleCount() < maxSample_;
292 }
293 
294 void ConstraintGoal::update(const State *state)
295 {
296  const auto &foliation = std::static_pointer_cast<Foliation>(constraint_);
297  Eigen::VectorXd transverse = foliation->getTransversal(getVectorConst(state));
298 
299  transverse_->add(std::make_pair(transverse, state));
300 }
ConstraintGoal(const ConstraintPtr &constraint, SpaceInformationPtr si, double threshold=1e-5)
Definition: goals.cpp:211
GoalConstraint(const std::shared_ptr< GoalRegion > &goal)
Definition: goals.cpp:51
const unsigned int maxSample_
Definition: goals.h:129
bool sample(const GoalLazySamples *gls, State *state)
Definition: goals.cpp:276
const unsigned int tries_
Definition: goals.h:128
Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const override
Definition: goals.cpp:154
double distance(const ompl::base::State *state) const override
Definition: goals.cpp:74
const std::shared_ptr< GoalRegion > goal_
Definition: goals.h:46
bool isSatisfied(const State *state) const override
Definition: goals.cpp:17
const StateSamplerPtr sampler_
Definition: goals.h:122
void setThreshold(double threshold)
Definition: goals.cpp:37
void addConstraint(const FoliationPtr &constraint)
Definition: goals.cpp:198
FoliationPtr getFrond(const Eigen::Ref< const Eigen::VectorXd > &a, const Eigen::Ref< const Eigen::VectorXd > &b) const override
Definition: goals.cpp:182
FoliationPtr copy() const override
Definition: goals.cpp:123
std::vector< FoliationPtr > foliations_
Constituent constraints.
Definition: goals.h:100
void setTransverseDimension(unsigned int t)
Definition: goals.cpp:110
unsigned int getLeafDimension() const
Definition: goals.cpp:95
unsigned int t_
Transverse dimension.
Definition: goals.h:73
FoliationIntersection(const unsigned int ambientDim, std::vector< FoliationPtr > foliations, double tolerance=magic::CONSTRAINT_PROJECTION_TOLERANCE)
Definition: goals.cpp:115
void update(const State *state)
Definition: goals.cpp:294
double distanceGoal(const State *state) const override
Definition: goals.cpp:27
void print(std::ostream &out=std::cout) const override
Definition: goals.cpp:32
const ConstraintPtr constraint_
Definition: goals.h:121
ConstraintPtr allocateConstraint(const ConstraintPtr &constraint) const
Definition: goals.cpp:236
WrapperGoalRegion(const SpaceInformationPtr &si, const std::shared_ptr< GoalRegion > &goal)
Definition: goals.cpp:12
~ConstraintGoal() override
Definition: goals.cpp:231
T push_back(T... args)
void jacobian(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::MatrixXd > out) const override
Definition: goals.cpp:143
ConstraintPtr getLeaf(const Eigen::Ref< const Eigen::VectorXd > &tv) const override
Definition: goals.cpp:168
double getThreshold() const
Definition: goals.cpp:42
Foliation(const unsigned int ambientDim, const unsigned int coDim, const unsigned int leafDim, double tolerance=magic::CONSTRAINT_PROJECTION_TOLERANCE)
Definition: goals.cpp:88
T make_pair(T... args)
std::shared_ptr< NearestNeighbors< Transition > > transverse_
Definition: goals.h:125
const bool isFoliation_
Definition: goals.h:120
T bind(T... args)
T static_pointer_cast(T... args)
void function(const Eigen::Ref< const Eigen::VectorXd > &x, Eigen::Ref< Eigen::VectorXd > out) const override
Definition: goals.cpp:132
bool isSatisfied(const ompl::base::State *state) const override
Definition: goals.cpp:79
unsigned int p_
Leaf dimension.
Definition: goals.h:72
unsigned int getTransverseDimension() const
Definition: goals.cpp:100
void function(const ompl::base::State *state, Eigen::Ref< Eigen::VectorXd > out) const override
Definition: goals.cpp:58
const bool isConstrained_
Definition: goals.h:119
virtual Eigen::VectorXd getTransversal(const Eigen::Ref< const Eigen::VectorXd > &state) const =0
double distanceGoal(const State *state) const override
Definition: goals.cpp:271
const std::shared_ptr< GoalRegion > goal_
Definition: goals.h:28
#define SE2EZ_DEBUG(fmt,...)
Definition: log.h:45
Eigen::Ref< Eigen::VectorXd > getVector(State *state) const
Definition: goals.cpp:260
const Eigen::Ref< const Eigen::VectorXd > getVectorConst(const State *state) const
Definition: goals.cpp:249
T emplace_back(T... args)
void setLeafDimension(unsigned int p)
Definition: goals.cpp:105