Klamp't  0.9.0
PlannerObjective.h
1 #ifndef PLANNER_OBJECTIVES_H
2 #define PLANNER_OBJECTIVES_H
3 
4 #include <Klampt/Modeling/Robot.h>
6 #include <Klampt/Modeling/DynamicPath.h>
7 #include <KrisLibrary/robotics/IK.h>
8 
9 class AnyCollection;
10 
11 namespace Klampt {
12 
18 {
19  public:
21  virtual ~PlannerObjectiveBase() {}
22 
24  virtual const char* TypeString() { return NULL; }
25 
27  virtual string Description() { if(TypeString()) return TypeString(); return ""; }
28 
31  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend) { return 0.0; }
32 
35  virtual Real DifferentialCost(Real t,const Vector& q,const Vector& dq) { return 0.0; }
36 
38  virtual bool DifferentialTimeInvariant() const { return false; }
39  virtual bool TerminalTimeInvariant() const { return false; }
41  virtual bool PathInvariant() const { return false; }
42 
46  virtual Real IncrementalCost(Real t,const ParabolicRamp::ParabolicRampND& ramp) { return 0.0; }
47  virtual Real IncrementalCost(Real t,const ParabolicRamp::DynamicPath& path);
48 
51  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0);
52 
55  virtual Real Delta(PlannerObjectiveBase* priorGoal) { return Inf; }
56 
58  virtual bool Read(File& file) { return false; }
59  virtual bool Write(File& file) { return false; }
60 };
61 
66 {
67  public:
68  TimeObjective() {}
69  virtual ~TimeObjective() {}
70  virtual const char* TypeString() { return "time"; }
71  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0);
72  virtual Real DifferentialCost(Real t,const Vector& q,const Vector& dq) { return 1.0; }
73  virtual Real IncrementalCost(Real t,const ParabolicRamp::ParabolicRampND& ramp);
74  virtual Real Delta(PlannerObjectiveBase* priorGoal);
75  virtual bool DifferentialTimeInvariant() const { return true; }
76  virtual bool TerminalTimeInvariant() const { return true; }
77 };
78 
84 {
85  public:
86  TerminalTimeObjective(Real tgoal);
87  virtual ~TerminalTimeObjective() {}
88  virtual const char* TypeString() { return "term_time"; }
89  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend);
90  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0);
91  virtual Real Delta(PlannerObjectiveBase* priorGoal);
92  virtual bool DifferentialTimeInvariant() const { return true; }
93 
94  Real tgoal;
95 };
96 
101 {
102  public:
103  ConfigObjective(const Config& qgoal);
104  virtual ~ConfigObjective() {}
105  virtual const char* TypeString() { return "config"; }
106  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend) {
107  return qend.distance(qgoal);
108  }
109  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0) {
110  return qgoal.distance(Vector(path.ramps.back().x1));
111  }
112  virtual Real Delta(PlannerObjectiveBase* priorGoal);
113  virtual bool TerminalTimeInvariant() const { return true; }
114  virtual bool DifferentialTimeInvariant() const { return true; }
115  virtual bool PathInvariant() const { return true; }
116 
117  Vector qgoal;
118 };
119 
124 {
125  public:
126  VelocityObjective(const Vector& vgoal);
127  virtual ~VelocityObjective() {}
128  virtual const char* TypeString() { return "velocity"; }
129  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend) {
130  return dqend.distance(vgoal);
131  }
132  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0) {
133  return vgoal.distance(Vector(path.ramps.back().dx1));
134  }
135  virtual Real Delta(PlannerObjectiveBase* priorGoal);
136  virtual bool TerminalTimeInvariant() const { return true; }
137  virtual bool DifferentialTimeInvariant() const { return true; }
138  virtual bool PathInvariant() const { return true; }
139 
140  Vector vgoal;
141 };
142 
148 {
149  public:
152 
154  void Add(const shared_ptr<PlannerObjectiveBase>& obj,Real weight=1.0);
155 
156  virtual const char* TypeString() { return "composite"; }
157  virtual string Description();
158 
159  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend);
160  virtual Real DifferentialCost(Real t,const Vector& q,const Vector& dq);
161  virtual Real IncrementalCost(Real t,const ParabolicRamp::ParabolicRampND& ramp);
162  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0);
163  virtual Real Delta(PlannerObjectiveBase* priorGoal);
164  virtual bool TerminalTimeInvariant() const;
165  virtual bool DifferentialTimeInvariant() const;
166  virtual bool PathInvariant() const;
167 
168  Real norm;
169  vector<shared_ptr<PlannerObjectiveBase> > components;
170  vector<Real> weights;
171 };
172 
173 
178 {
179  public:
181  virtual ~CartesianObjective() {}
182 
183  virtual const char* TypeString() { return "cartesian"; }
184 
185  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend);
186  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0) {
187  return TerminalCost(0,Vector(path.ramps.back().x1),Vector(path.ramps.back().dx1));
188  }
189  virtual Real Delta(PlannerObjectiveBase* priorGoal);
190  virtual bool TerminalTimeInvariant() const { return true; }
191  virtual bool DifferentialTimeInvariant() const { return true; }
192  virtual bool PathInvariant() const { return true; }
193 
194  RobotModel* robot;
195  IKGoal ikGoal;
196 };
197 
202 {
203  public:
204  IKObjective(RobotModel* robot);
205  virtual ~IKObjective() {}
206 
207  virtual const char* TypeString() { return "ik"; }
208 
209  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend);
210 
211  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0) {
212  return TerminalCost(0,Vector(path.ramps.back().x1),Vector(path.ramps.back().dx1));
213  }
214 
215  virtual Real Delta(PlannerObjectiveBase* priorGoal);
216 
217  virtual bool TerminalTimeInvariant() const { return true; }
218  virtual bool DifferentialTimeInvariant() const { return true; }
219  virtual bool PathInvariant() const { return true; }
220 
221  RobotModel* robot;
222  IKGoal ikGoal;
223  Real posCoeff,oriCoeff;
224 };
225 
230 {
231  public:
233  virtual ~CartesianTrackingObjective() {}
234  virtual const char* TypeString() { return "cartesian_tracking"; }
235 
236  virtual Real TerminalCost(Real tend,const Vector& qend,const Vector& dqend);
237  virtual Real DifferentialCost(Real t,const Vector& q,const Vector& dq);
238  virtual Real IncrementalCost(Real t,const ParabolicRamp::ParabolicRampND& ramp);
239  virtual Real PathCost(const ParabolicRamp::DynamicPath& path,Real tstart=0);
240  virtual Real Delta(PlannerObjectiveBase* priorGoal);
241 
244  int FindSegment(Real t) const;
245  //integrates the time range [a,b] over the ramp starting at tstart
246  Real IntegrateSegment(int index,Real a,Real b,Real tstart,const ParabolicRamp::ParabolicRampND& ramp);
247  //computes desired 3-space position at time t
248  Vector3 GetDesiredPosition(Real t) const;
249  //differential cost at time t in the form (x-b)^T A (x-b)
250  void GetDifferentialCostFunction(Real t,Matrix3& A,Vector3& b) const;
251  Real DifferentialCost(Real t,const Vector& q,int index);
252 
253  RobotModel* robot;
254  //track localPosition on this link
255  int link;
256  Vector3 localPosition;
257  //3-space trajectory to follow
258  vector<Vector3> positions;
259  vector<Real> times;
260  //optional: scalar weight for each time
261  vector<Real> weights;
262  //optional: matrix weight e^T A e for each time
263  vector<Matrix3> matWeights;
264  //optional: terminal cost
265  Real endTimeWeight,endPosWeight;
266  Matrix3 endPosMatWeight;
267 };
268 
294 PlannerObjectiveBase* LoadPlannerObjective(istream& in,RobotModel* robot=NULL);
295 
297 bool SavePlannerObjective(PlannerObjectiveBase* obj,ostream& out);
298 
300 PlannerObjectiveBase* LoadPlannerObjective(AnyCollection& msg,RobotModel* robot=NULL);
301 bool SavePlannerObjective(PlannerObjectiveBase* obj,AnyCollection& msg);
302 
303 } //namespace Klampt
304 
305 #endif
306 
virtual Real PathCost(const ParabolicRamp::DynamicPath &path, Real tstart=0)
virtual Real Delta(PlannerObjectiveBase *priorGoal)
Definition: PlannerObjective.h:55
virtual Real PathCost(const ParabolicRamp::DynamicPath &path, Real tstart=0)
Definition: PlannerObjective.h:186
A goal that measures point-to-point distance.
Definition: PlannerObjective.h:177
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:156
Solves for optimal trajectores for a velocity-bounded ND system.
Definition: ParabolicRamp.h:110
A goal that measures absolute difference in terminal time (i.e., penalize stopping at a different tim...
Definition: PlannerObjective.h:83
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:38
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:70
virtual bool PathInvariant() const
Subclasses: planners may exploit path-invariant costs for faster performance.
Definition: PlannerObjective.h:138
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:92
An objective that measures path execution time.
Definition: PlannerObjective.h:65
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:218
virtual Real DifferentialCost(Real t, const Vector &q, const Vector &dq)
Definition: PlannerObjective.h:72
std::vector< ParabolicRampND > ramps
The path is stored as a series of ramps.
Definition: DynamicPath.h:160
A goal for an IK solution (including possibly rotation)
Definition: PlannerObjective.h:201
virtual bool PathInvariant() const
Subclasses: planners may exploit path-invariant costs for faster performance.
Definition: PlannerObjective.h:219
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:191
Tracking a path in cartesian space.
Definition: PlannerObjective.h:229
virtual Real PathCost(const ParabolicRamp::DynamicPath &path, Real tstart=0)
Definition: PlannerObjective.h:211
virtual Real PathCost(const ParabolicRamp::DynamicPath &path, Real tstart=0)
Definition: PlannerObjective.h:132
A bounded-velocity, bounded-acceleration trajectory consisting of parabolic ramps.
Definition: DynamicPath.h:114
An objective that merges contributions from multiple other objective functions.
Definition: PlannerObjective.h:147
virtual bool Read(File &file)
Subclasses: read and write to binary file (optional, not implemented yet)
Definition: PlannerObjective.h:58
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:114
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:75
virtual Real DifferentialCost(Real t, const Vector &q, const Vector &dq)
Definition: PlannerObjective.h:35
virtual Real TerminalCost(Real tend, const Vector &qend, const Vector &dqend)
Definition: PlannerObjective.h:106
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:105
virtual bool PathInvariant() const
Subclasses: planners may exploit path-invariant costs for faster performance.
Definition: PlannerObjective.h:41
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:88
virtual bool DifferentialTimeInvariant() const
Subclasses: planners may exploit time invariant costs for faster performance.
Definition: PlannerObjective.h:137
A base class for objective functionals in time/config/velocity space.
Definition: PlannerObjective.h:17
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:24
The main robot type used in RobotSim.
Definition: Robot.h:83
virtual Real PathCost(const ParabolicRamp::DynamicPath &path, Real tstart=0)
Definition: PlannerObjective.h:109
A goal that measures distance to a goal velocity vgoal.
Definition: PlannerObjective.h:123
virtual Real TerminalCost(Real tend, const Vector &qend, const Vector &dqend)
Definition: PlannerObjective.h:31
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:128
virtual bool PathInvariant() const
Subclasses: planners may exploit path-invariant costs for faster performance.
Definition: PlannerObjective.h:192
virtual bool PathInvariant() const
Subclasses: planners may exploit path-invariant costs for faster performance.
Definition: PlannerObjective.h:115
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:207
Functions for optimal acceleration-bounded trajectories.
virtual Real TerminalCost(Real tend, const Vector &qend, const Vector &dqend)
Definition: PlannerObjective.h:129
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:234
Definition: ContactDistance.h:6
virtual const char * TypeString()
Subclasses: return an identifier for this goal type.
Definition: PlannerObjective.h:183
A goal that measures distance to a goal configuration qgoal.
Definition: PlannerObjective.h:100
virtual Real IncrementalCost(Real t, const ParabolicRamp::ParabolicRampND &ramp)
Definition: PlannerObjective.h:46
virtual string Description()
Subclasses: return a string for printing (optional)
Definition: PlannerObjective.h:27