Klamp't  0.9.0
RealTimePlanner.h
1 #ifndef REAL_TIME_PLANNER_H
2 #define REAL_TIME_PLANNER_H
3 
4 #include "RobotCSpace.h"
5 #include "PlannerSettings.h"
6 #include "PlannerObjective.h"
7 #include "RampCSpace.h"
8 #include <Klampt/Modeling/DynamicPath.h>
9 #include <KrisLibrary/utils/StatCollector.h>
10 #include <KrisLibrary/utils/threadutils.h>
11 #include <KrisLibrary/Timer.h>
12 
13 namespace Klampt {
14 
15 class MotionQueueInterface;
16 
27 {
28  public:
29  enum { Failure=0, Success=1, Timeout=2 };
30 
32  virtual ~DynamicMotionPlannerBase();
33  virtual void Init(CSpace* space,RobotModel* robot,WorldPlannerSettings* settings);
34  virtual void SetGoal(shared_ptr<PlannerObjectiveBase> newgoal);
35  virtual void SetTime(Real tstart);
36  virtual void SetDefaultLimits();
37  virtual void SetLimits(Real qScale=1.0,Real vScale=1.0,Real aScale=1.0);
38 
39  bool LogBegin(const char* fn="realtimeplanner.log");
40  bool LogEnd();
41 
42 
53  virtual int PlanFrom(ParabolicRamp::DynamicPath& path,Real cutoff)
54  {
55  return Failure;
56  }
57 
59  int PlanFrom(const Config& qstart,Real cutoff,ParabolicRamp::DynamicPath& result)
60  {
61  result.ramps.resize(1);
62  result.ramps[0].SetConstant(qstart);
63  return PlanFrom(result,cutoff);
64  }
65 
71  bool StopPlanning();
72 
74  int Shortcut(ParabolicRamp::DynamicPath& path,Real timeLimit);
77  int SmartShortcut(Real tstart,ParabolicRamp::DynamicPath& path,Real timeLimit);
78 
80  bool GetMilestoneRamp(const Config& q0,const Vector& dq0,const Config& q1,ParabolicRamp::DynamicPath& ramp) const;
82  bool GetMilestoneRamp(const ParabolicRamp::DynamicPath& curPath,const Config& q,ParabolicRamp::DynamicPath& ramp) const;
83 
84  //returns true if the ramp from the current config to q is collision free
85  bool CheckMilestoneRamp(const ParabolicRamp::DynamicPath& curPath,const Config& q,ParabolicRamp::DynamicPath& ramp) const;
86 
88  Real EvaluateDirectPathCost(const ParabolicRamp::DynamicPath& curPath,const Config& q);
89 
92  Real EvaluatePathCost(const ParabolicRamp::DynamicPath& path,Real tStart=-1.0);
93 
95  Real EvaluateTerminalCost(const Config& q,Real tEnd);
96 
97  RobotModel* robot;
98  WorldPlannerSettings* settings;
99  CSpace* cspace;
100  //objective function
101  shared_ptr<PlannerObjectiveBase> goal;
102  //configuration, velocity, and acceleration limits
103  ParabolicRamp::Vector qMin,qMax,velMax,accMax;
104 
105  //planning start time
106  Real tstart;
107  //flag: another thread may set this to true when the planner should
108  //stop during a long planning cycle. The subclass needs to continually
109  //monitor this flag
110  bool stopPlanning;
111 
112  //log file
113  FILE* flog;
114 };
115 
116 
121 {
122  public:
123  virtual ~SendPathCallbackBase() {}
131  virtual bool Send(Real tplanstart,Real tcut,const ParabolicRamp::DynamicPath& path) =0;
132 };
133 
134 
192 {
193 public:
194  RealTimePlanner();
195  virtual ~RealTimePlanner();
196 
198  void SetSpace(SingleRobotCSpace* space);
199 
201  void SetConstantPath(const Config& q);
204  void SetCurrentPath(Real tglobal,const ParabolicRamp::DynamicPath& path);
205 
207  virtual void Reset(shared_ptr<PlannerObjectiveBase> newgoal);
208 
210  shared_ptr<PlannerObjectiveBase> Objective() const;
211 
218  virtual bool PlanUpdate(Real tglobal,Real& splitTime,Real& planTime);
219 
221  bool StopPlanning() {
222  if(!planner) return true;
223  return planner->StopPlanning();
224  }
225 
228  virtual void MarkSendFailure();
229 
231 
233  shared_ptr<DynamicMotionPlannerBase> planner;
234 
237  ParabolicRamp::DynamicPath currentPath;
238 
240  shared_ptr<SendPathCallbackBase> sendPathCallback;
241 
245 
249 
250  enum SplitUpdateProtocol { Constant, ExponentialBackoff, Learning };
251  SplitUpdateProtocol protocol;
252  Real currentSplitTime,currentPadding,currentExternalPadding;
253  Real maxPadding;
254 
256  StatCollector planFailTimeStats,planSuccessTimeStats,planTimeoutTimeStats;
257 };
258 
288 {
289  public:
292 
294  void SetStartConfig(const Config& qstart);
296  void SetCSpace(SingleRobotCSpace* space);
298  void SetPlanner(const shared_ptr<DynamicMotionPlannerBase>& planner);
299  void SetPlanner(const shared_ptr<RealTimePlanner>& planner);
301  void SetObjective(shared_ptr<PlannerObjectiveBase> newgoal);
304  PlannerObjectiveBase* GetObjective() const;
307  void ResetCurrentPath(Real tglobal,const ParabolicRamp::DynamicPath& path);
310  bool Start();
312  void Stop();
314  bool IsPlanning();
316  void PausePlanning();
318  void BreakPlanning();
320  void StopPlanning();
322  void ResumePlanning();
324  bool HasUpdate();
326  bool SendUpdate(MotionQueueInterface* interface);
329  Real ObjectiveValue();
330 
331  void* internal;
332  shared_ptr<RealTimePlanner> planner;
333  Thread thread;
334 };
335 
336 } // namespace Klampt
337 
338 #endif
Definition: RobotInterface.h:29
shared_ptr< DynamicMotionPlannerBase > planner
Users must set these members before planning.
Definition: RealTimePlanner.h:233
bool acceptTimeOverruns
Definition: RealTimePlanner.h:248
A base class for a motion planner that generates dynamic paths. The output should always respect join...
Definition: RealTimePlanner.h:26
A cspace consisting of a single robot configuration in a WorldModel. Feasibility constraints are join...
Definition: RobotCSpace.h:103
A structure containing settings that should be used for collision detection, contact solving...
Definition: PlannerSettings.h:43
A real-time planner. Supports constant time-stepping or adaptive time-stepping.
Definition: RealTimePlanner.h:191
std::vector< ParabolicRampND > ramps
The path is stored as a series of ramps.
Definition: DynamicPath.h:160
Real EvaluatePathCost(const ParabolicRamp::DynamicPath &path, Real tStart=-1.0)
int PlanFrom(const Config &qstart, Real cutoff, ParabolicRamp::DynamicPath &result)
Plans from a start configuration.
Definition: RealTimePlanner.h:59
An interface to a planning thread.
Definition: RealTimePlanner.h:287
int SmartShortcut(Real tstart, ParabolicRamp::DynamicPath &path, Real timeLimit)
bool GetMilestoneRamp(const Config &q0, const Vector &dq0, const Config &q1, ParabolicRamp::DynamicPath &ramp) const
Helper.
A bounded-velocity, bounded-acceleration trajectory consisting of parabolic ramps.
Definition: DynamicPath.h:114
Real pathStartTime
Set the current path before planning, using SetConstantPath or SetCurrentPath.
Definition: RealTimePlanner.h:236
StatCollector planFailTimeStats
Statistics captured on planning times, depending on PlanMore output.
Definition: RealTimePlanner.h:256
bool StopPlanning()
Tells the planner to stop, when called from an external thread.
Definition: RealTimePlanner.h:221
int Shortcut(ParabolicRamp::DynamicPath &path, Real timeLimit)
Performs shortcutting up until the time limit.
Real EvaluateDirectPathCost(const ParabolicRamp::DynamicPath &curPath, const Config &q)
returns the cost of going straight to q (assuming no collision detection)
shared_ptr< SendPathCallbackBase > sendPathCallback
Users should set this up to capture the outputted path.
Definition: RealTimePlanner.h:240
A base class for the path sending callback. Send is called by the planner to update the path used by ...
Definition: RealTimePlanner.h:120
A base class for objective functionals in time/config/velocity space.
Definition: PlannerObjective.h:17
The main robot type used in RobotSim.
Definition: Robot.h:83
Real EvaluateTerminalCost(const Config &q, Real tEnd)
returns the terminal cost for a path ending at q at time tEnd
Real cognitiveMultiplier
Definition: RealTimePlanner.h:244
Definition: ContactDistance.h:6
virtual int PlanFrom(ParabolicRamp::DynamicPath &path, Real cutoff)
Definition: RealTimePlanner.h:53