KrisLibrary  1.0.0
CSpaceHelpers.h
1 #ifndef CSPACE_HELPERS_H
2 #define CSPACE_HELPERS_H
3 
4 #include "CSpace.h"
5 #include "GeodesicSpace.h"
6 
11 class GeodesicCSpace : public CSpace, public GeodesicSpace
12 {
13 public:
14  GeodesicCSpace() {}
15  virtual ~GeodesicCSpace() {}
16 };
17 
22 {
23 public:
24  GeodesicCSpaceAdaptor(const std::shared_ptr<GeodesicSpace>& geodesic);
25  virtual int NumDimensions() { return geodesic->NumDimensions(); }
26  virtual int NumIntrinsicDimensions() { return geodesic->NumIntrinsicDimensions(); }
27  virtual Real Distance(const Config& x, const Config& y) { return geodesic->Distance(x,y); }
28  virtual void Interpolate(const Config& x,const Config& y,Real u,Config& out) { geodesic->Interpolate(x,y,u,out); }
29  virtual void Midpoint(const Config& x,const Config& y,Config& out) { geodesic->Interpolate(x,y,0.5,out); }
30 
31  virtual void InterpolateDeriv(const Config& a,const Config& b,Real u,Vector& dx) { geodesic->InterpolateDeriv(a,b,u,dx); }
32  virtual void InterpolateDerivA(const Config& a,const Config& b,Real u,const Vector& da,Vector& dx) { geodesic->InterpolateDerivA(a,b,u,da,dx); }
33  virtual void InterpolateDerivB(const Config& a,const Config& b,Real u,const Vector& db,Vector& dx) { geodesic->InterpolateDerivB(a,b,u,db,dx); }
34  virtual void InterpolateDeriv2(const Config& a,const Config& b,Real u,Vector& ddx) { geodesic->InterpolateDeriv2(a,b,u,ddx); }
35  virtual void Integrate(const Config& a,const Vector& da,Config& b) { geodesic->Integrate(a,da,b); }
36 
37  std::shared_ptr<GeodesicSpace> geodesic;
38 };
39 
45 {
46 public:
47  CartesianCSpace(int d);
48  virtual int NumDimensions() { return d; }
49  virtual void SampleNeighborhood(const Config& c,Real r,Config& x);
50  virtual Real Distance(const Config& x, const Config& y) { return CSpace::Distance(x,y); }
51  virtual void Interpolate(const Config& x,const Config& y,Real u,Config& out) { CSpace::Interpolate(x,y,u,out); }
52  virtual void Midpoint(const Config& x,const Config& y,Config& out) { out.add(x,y); out.inplaceMul(0.5); }
53 
54  virtual void Sample(Config& q) { FatalError("Not implemented"); }
55 
56  int d;
57 };
58 
63 class BoxCSpace : public CartesianCSpace
64 {
65 public:
66  BoxCSpace(Real xmin,Real xmax,int d=1);
67  BoxCSpace(const Vector& bmin,const Vector& bmax);
68  void SetDomain(const Vector& bmin,const Vector& bmax);
69  void GetDomain(Vector& bmin,Vector& bmax);
70  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b);
71  virtual void Sample(Config& x);
72  virtual void SampleNeighborhood(const Config& c,Real r,Config& x);
73  virtual bool ProjectFeasible(Config& x);
74  virtual void Properties(PropertyMap&);
75 
77  Vector bmin,bmax;
78 };
79 
80 
111 {
112 public:
113  MultiCSpace();
114  MultiCSpace(const std::shared_ptr<CSpace>& space1,const std::shared_ptr<CSpace>& space2);
115  MultiCSpace(const std::vector<std::shared_ptr<CSpace> >& components);
116  void Add(const std::string& name,const std::shared_ptr<CSpace>& space,Real distanceWeight=1);
117 
120  inline bool AreSubspacesIndependent() const { return constraints.empty(); }
121 
127  void FlattenConstraints();
130  void AddConstraint(int spaceIndex,const std::string& name,CSet* constraint);
133  void AddConstraint(int spaceIndex,const std::string& name,const std::shared_ptr<CSet>& constraint);
136  void AddConstraint(int spaceIndex,const std::string& name,CSet::CPredicate test);
137 
138  void Split(const Vector& x,std::vector<Vector>& items);
139  void SplitRef(const Vector& x,std::vector<Vector>& items);
140  void Join(const std::vector<Vector>& items,Vector& x);
141 
144  bool IsFeasible_Independent(const Config&);
146  EdgePlannerPtr LocalPlanner_Independent(const Config& a,const Config& b);
148  EdgePlannerPtr PathChecker_Independent(const Config& a,const Config& b);
150  EdgePlannerPtr PathChecker_Independent(const Config& a,const Config& b,int constraint);
151 
152  //CSpace overloads
153  virtual int NumDimensions();
154  virtual int NumIntrinsicDimensions();
155  virtual std::string VariableName(int i);
156  virtual int NumConstraints();
157  virtual std::string ConstraintName(int i);
158  virtual std::shared_ptr<CSet> Constraint(int i);
159  virtual void Sample(Config& x);
160  virtual void SampleNeighborhood(const Config& c,Real r,Config& x);
161  virtual bool IsFeasible(const Config& q);
162  virtual bool ProjectFeasible(Config& x);
163  virtual EdgePlannerPtr LocalPlanner(const Config& a,const Config& b);
164  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b);
165  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b,int obstacle);
166 
168  virtual Real Distance(const Config& x, const Config& y);
169  virtual void Interpolate(const Config& x,const Config& y,Real u,Config& out);
170  virtual void Midpoint(const Config& x,const Config& y,Config& out);
171  virtual Real ObstacleDistance(const Config& a);
172  virtual void Properties(PropertyMap&);
173 
174  //GeodesicSpace overloads
175  virtual void InterpolateDeriv(const Config& a,const Config& b,Real u,Vector& dx);
176  virtual void InterpolateDerivA(const Config& a,const Config& b,Real u,const Vector& da,Vector& dx);
177  virtual void InterpolateDerivB(const Config& a,const Config& b,Real u,const Vector& db,Vector& dx);
178  virtual void InterpolateDeriv2(const Config& a,const Config& b,Real u,Vector& ddx);
179  virtual void Integrate(const Config& a,const Vector& da,Config& b);
180 
181  std::vector<std::shared_ptr<CSpace> > components;
182  std::vector<std::string> componentNames;
183  std::vector<Real> distanceWeights;
184 };
185 
196 class PiggybackCSpace : public CSpace
197 {
198 public:
199  PiggybackCSpace(CSpace* _baseSpace=NULL);
200  virtual int NumDimensions();
201  virtual std::string VariableName(int i);
202  virtual int NumConstraints();
203  virtual std::string ConstraintName(int i);
204  virtual std::shared_ptr<CSet> Constraint(int i);
205  virtual void Sample(Config& x);
206  virtual void SampleNeighborhood(const Config& c,Real r,Config& x);
207  virtual EdgePlannerPtr LocalPlanner(const Config& a,const Config& b);
208  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b);
209  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b,int obstacle);
210  virtual bool IsFeasible(const Config& x);
211  virtual bool IsFeasible(const Config&,int constraint);
212  virtual bool ProjectFeasible(Config& x);
214  virtual Real Distance(const Config& x, const Config& y);
215  virtual void Interpolate(const Config& x,const Config& y,Real u,Config& out);
216  virtual void Midpoint(const Config& x,const Config& y,Config& out);
217  virtual void Properties(PropertyMap& map);
218 
219  CSpace* baseSpace;
220 };
221 
226 {
227 public:
228  SubsetConstraintCSpace(CSpace* baseSpace,const std::vector<int>& constraints);
229  SubsetConstraintCSpace(CSpace* baseSpace,int constraints);
230  virtual bool IsFeasible(const Config& x) { return CSpace::IsFeasible(x); }
231  virtual bool IsFeasible(const Config& x,int obstacle) { return CSpace::IsFeasible(x,obstacle); }
232  virtual bool ProjectFeasible(Config& x) { return CSpace::ProjectFeasible(x); }
234  virtual EdgePlannerPtr LocalPlanner(const Config& a,const Config& b) { return CSpace::LocalPlanner(a,b); }
235  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b);
236  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b,int obstacle);
237 
238  std::vector<int> activeConstraints;
239 };
240 
241 
255 {
256 public:
257  AdaptiveCSpace(CSpace* baseSpace);
258  virtual bool IsFeasible(const Config& x);
259  virtual bool IsFeasible(const Config& x,int obstacle);
260  virtual void CheckConstraints(const Config& x,std::vector<bool>& satisfied);
261  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b);
262  virtual EdgePlannerPtr PathChecker(const Config& a,const Config& b,int obstacle);
263  bool IsFeasible_NoDeps(const Config& x,int obstacle);
264  EdgePlannerPtr PathChecker_NoDeps(const Config& a,const Config& b,int obstacle);
265  void SetupAdaptiveInfo();
266  bool AddFeasibleDependency(int constraint,int dependency);
267  bool AddVisibleDependency(int constraint,int dependency);
268  bool AddFeasibleDependency(const char* name,const char* dependency);
269  bool AddVisibleDependency(const char* name,const char* dependency);
270  void OptimizeQueryOrder();
271  void GetFeasibleDependencies(int obstacle,std::vector<int>& deps,bool recursive=true) const;
272  void GetVisibleDependencies(int obstacle,std::vector<int>& deps,bool recursive=true) const;
273  void GetStats(PropertyMap& stats) const;
274  void LoadStats(const PropertyMap& stats);
275 
277  {
278  double cost;
279  double probability;
280  double count;
281  };
282  bool adaptive;
283  std::map<std::string,int> constraintMap;
284  std::vector<PredicateStats> feasibleStats,visibleStats;
285  std::vector<std::vector<int> > feasibleTestDeps,visibleTestDeps;
286  std::vector<int> feasibleTestOrder,visibleTestOrder;
287  bool useBaseVisibleTest;
288  PredicateStats baseVisibleStats;
289 };
290 
291 
294 EdgePlannerPtr MakeSingleConstraintEpsilonChecker(CSpace* space,const Config& a,const Config& b,int obstacle,Real epsilon);
295 
298 EdgePlannerPtr MakeSingleConstraintBisectionPlanner(CSpace* space,const Config& a,const Config& b,int obstacle,Real epsilon);
299 
300 
301 #endif
Definition: CSpaceHelpers.h:110
A space with geodesics and (optionally) geodesic derivatives.
Definition: GeodesicSpace.h:31
virtual void Properties(PropertyMap &)
Returns properties of the space that might be useful for planners.
Definition: CSpace.cpp:127
virtual Real Distance(const Config &x, const Config &y)
optionally overrideable (default uses euclidean space)
Definition: CSpaceHelpers.h:27
virtual Optimization::NonlinearProgram * FeasibleNumeric()
If possible, give the feasible set as a nonlinear program.
Definition: CSpace.cpp:190
Vector Config
an alias for Vector
Definition: RobotKinematics3D.h:14
Motion planning configuration space base class. The configuration space implements an interpolation s...
Definition: CSpace.h:39
virtual Optimization::NonlinearProgram * FeasibleNumeric()
If possible, give the feasible set as a nonlinear program.
Definition: CSpaceHelpers.h:233
Definition: CSpaceHelpers.h:11
virtual void CheckConstraints(const Config &, std::vector< bool > &satisfied)
Returns a vector indicating which constraints are satisfied.
Definition: CSpace.cpp:211
virtual Real Distance(const Config &x, const Config &y)
optionally overrideable (default uses euclidean space)
Definition: CSpaceHelpers.h:50
virtual Real Distance(const Config &x, const Config &y)
optionally overrideable (default uses euclidean space)
Definition: CSpace.h:61
bool AreSubspacesIndependent() const
Definition: CSpaceHelpers.h:120
virtual bool ProjectFeasible(Config &x)
Definition: CSpaceHelpers.h:232
virtual Real ObstacleDistance(const Config &a)
for local planners using obstacle distance
Definition: CSpace.cpp:201
A class that optimizes constraint testing order using empirical data.
Definition: CSpaceHelpers.h:254
Converts an CSpace so that it only checks one or a subset of selected constraints.
Definition: CSpaceHelpers.h:225
Definition: CSpaceHelpers.h:276
Vector bmin
The domain. NOTE: modifing these does not directly affect the constraints! Use SetDomain instead...
Definition: CSpaceHelpers.h:77
A helper class that assists with selective overriding of another cspace&#39;s methods (similar to "monkey...
Definition: CSpaceHelpers.h:196
A simple map from keys to values.
Definition: PropertyMap.h:27
A structure defining a nonlinear program.
Definition: NonlinearProgram.h:22
Definition: CSpaceHelpers.h:63
A subset of a CSpace, which establishes a constraint for a configuration must meet. Mathematically, this is a set S which imposes the constraint [q in S].
Definition: CSet.h:20
Definition: CSpaceHelpers.h:21
Definition: CSpaceHelpers.h:44
virtual bool ProjectFeasible(Config &x)
Definition: CSpace.cpp:141