Klamp't  0.9.0
Conversions.h
1 #include <KrisLibrary/spline/PiecewisePolynomial.h>
2 #include "ParabolicRamp.h"
3 #include "DynamicPath.h"
4 
5 namespace Klampt {
6 
7 inline Spline::PiecewisePolynomial Cast(const ParabolicRamp::ParabolicRamp1D& ramp)
8 {
9  Spline::PiecewisePolynomial res;
10  res.segments.resize(3);
11  res.timeShift.resize(3);
12  res.times.resize(4);
13  res.times[0] = 0;
14  res.times[1] = ramp.tswitch1;
15  res.times[2] = ramp.tswitch2;
16  res.times[3] = ramp.ttotal;
17  res.segments[0].Resize(3);
18  res.segments[0].coef[0] = ramp.x0;
19  res.segments[0].coef[1] = ramp.dx0;
20  res.segments[0].coef[2] = 0.5*ramp.a1;
21  res.timeShift[0] = 0;
22  res.segments[1].Resize(2);
23  res.segments[1].coef[0] = ramp.Evaluate(ramp.tswitch1);
24  res.segments[1].coef[1] = ramp.Derivative(ramp.tswitch1);
25  res.timeShift[1] = ramp.tswitch1;
26  res.segments[2].Resize(3);
27  res.segments[2].coef[0] = ramp.x1;
28  res.segments[2].coef[1] = ramp.dx1;
29  res.segments[2].coef[2] = 0.5*ramp.a2;
30  res.timeShift[2] = ramp.ttotal;
31 
32  if(ramp.ttotal == ramp.tswitch2) {
33  res.times.erase(--res.times.end());
34  res.segments.erase(--res.segments.end());
35  res.timeShift.erase(--res.timeShift.end());
36  }
37  if(ramp.tswitch1 == ramp.tswitch2) {
38  res.times.erase(++res.times.begin());
39  res.segments.erase(++res.segments.begin());
40  res.timeShift.erase(++res.timeShift.begin());
41  }
42  if(ramp.tswitch1 == 0 && res.segments.size()>1) {
43  res.times.erase(res.times.begin());
44  res.segments.erase(res.segments.begin());
45  res.timeShift.erase(res.timeShift.begin());
46  }
47  return res;
48 }
49 
50 inline Spline::PiecewisePolynomialND Cast(const ParabolicRamp::ParabolicRampND& ramp)
51 {
52  Spline::PiecewisePolynomialND res;
53  res.elements.resize(ramp.ramps.size());
54  for(size_t i=0;i<ramp.ramps.size();i++)
55  res.elements[i] = Cast(ramp.ramps[i]);
56  return res;
57 }
58 
59 //concatenates the ramps
60 inline Spline::PiecewisePolynomial Cast(const std::vector<ParabolicRamp::ParabolicRamp1D>& ramps)
61 {
62  assert(!ramps.empty());
63  if(ramps.size()==1) return Cast(ramps[0]);
64  Spline::PiecewisePolynomial p = Cast(ramps[0]);
65  for(size_t i=1;i<ramps.size();i++)
66  p.Concat(Cast(ramps[i]),true);
67  return p;
68 }
69 
70 inline Spline::PiecewisePolynomialND Cast(const std::vector<std::vector<ParabolicRamp::ParabolicRamp1D> >& ramps)
71 {
72  Spline::PiecewisePolynomialND res;
73  res.elements.resize(ramps.size());
74  for(size_t i=0;i<ramps.size();i++)
75  res.elements[i] = Cast(ramps[i]);
76  return res;
77 }
78 
79 inline Spline::PiecewisePolynomialND Cast(const ParabolicRamp::DynamicPath& path)
80 {
81  Spline::PiecewisePolynomialND res;
82  for(size_t i=0;i<path.ramps.size();i++) {
83  if(i==0) res = Cast(path.ramps[i]);
84  else res.Concat(Cast(path.ramps[i]),true);
85  }
86  return res;
87 }
88 
89 } //namespace Klampt
Solves for optimal trajectores for a velocity-bounded ND system.
Definition: ParabolicRamp.h:110
std::vector< ParabolicRampND > ramps
The path is stored as a series of ramps.
Definition: DynamicPath.h:160
Real Derivative(Real t) const
Evaluates the derivative of the trajectory.
A bounded-velocity, bounded-acceleration trajectory consisting of parabolic ramps.
Definition: DynamicPath.h:114
Real Evaluate(Real t) const
Evaluates the trajectory.
Real x0
Input.
Definition: ParabolicRamp.h:97
Stores optimal trajectores for an acceleration and velocity-bounded 1D system.
Definition: ParabolicRamp.h:54
Real tswitch1
Calculated upon SolveX.
Definition: ParabolicRamp.h:101
Functions for optimal acceleration-bounded trajectories.
Definition: ContactDistance.h:6