MRSL Motion Primitive Library  1.2
A motion primitive library for generating trajectory for mobile robots
lambda.h
Go to the documentation of this file.
1 
6 #ifndef MPL_LAMBDA_H
7 #define MPL_LAMBDA_H
8 
9 #include <mpl_basis/data_type.h>
10 
11 #include "math.h"
12 
16 struct VirtualPoint {
17  decimal_t p;
18  decimal_t v;
19  decimal_t t;
20 };
21 
25 class LambdaSeg {
26  public:
27  LambdaSeg() {}
28 
29  LambdaSeg(const VirtualPoint &v1, const VirtualPoint &v2) {
30  Mat4f A;
31  A << power(v1.t, 3), v1.t * v1.t, v1.t, 1, 3 * v1.t * v1.t, 2 * v1.t, 1, 0,
32  power(v2.t, 3), v2.t * v2.t, v2.t, 1, 3 * v2.t * v2.t, 2 * v2.t, 1, 0;
33  Vec4f b;
34  b << v1.p, v1.v, v2.p, v2.v;
35 
36  a = A.inverse() * b;
37 
38  if (fabs(a(0)) < 1e-5) a(0) = 0;
39  if (fabs(a(1)) < 1e-5) a(1) = 0;
40  if (fabs(a(2)) < 1e-5) a(2) = 0;
41  if (fabs(a(3)) < 1e-5) a(3) = 0;
42 
43  ti = v1.t;
44  tf = v2.t;
45 
46  dT = getT(tf) - getT(ti);
47  }
48 
49  VirtualPoint evaluate(decimal_t tau) const {
50  VirtualPoint vt;
51  vt.t = tau;
52  vt.p = a(0) * power(tau, 3) + a(1) * tau * tau + a(2) * tau + a(3);
53  vt.v = 3 * a(0) * tau * tau + 2 * a(1) * tau + a(2);
54  return vt;
55  }
56 
57  decimal_t getT(decimal_t t) const {
58  return a(0) / 4 * power(t, 4) + a(1) / 3 * power(t, 3) + a(2) / 2 * t * t +
59  a(3) * t;
60  }
61 
62  Vec4f a;
63  decimal_t ti;
64  decimal_t tf;
65 
66  decimal_t dT;
67 };
68 
73 class Lambda {
74  public:
75  Lambda() {}
76 
77  Lambda(const std::vector<VirtualPoint> &vs) {
78  for (int i = 0; i < (int)vs.size() - 1; i++) {
79  LambdaSeg seg(vs[i], vs[i + 1]);
80  segs.push_back(seg);
81  }
82  }
83 
84  bool exist() const { return !segs.empty(); }
85 
86  std::vector<VirtualPoint> sample(int N) {
87  // sample N points
88  std::vector<VirtualPoint> vs;
89  if (segs.empty()) return vs;
90  decimal_t ti = segs.front().ti;
91  decimal_t tf = segs.back().tf;
92  decimal_t dt = (tf - ti) / N;
93  for (decimal_t t = ti; t <= tf; t += dt) {
94  for (const auto &seg : segs) {
95  if (t >= seg.ti && t < seg.tf) {
96  vs.push_back(seg.evaluate(t));
97  break;
98  }
99  }
100  }
101 
102  return vs;
103  }
104 
105  vec_Vec3f sampleT(int N) {
106  vec_Vec3f ts;
107  decimal_t ti = segs.front().ti;
108  decimal_t tf = segs.back().tf;
109  decimal_t dt = (tf - ti) / N;
110 
111  for (decimal_t t = ti; t <= tf; t += dt) ts.push_back(Vec3f(t, getT(t), 0));
112 
113  return ts;
114  }
115 
116  VirtualPoint evaluate(decimal_t tau) const {
117  VirtualPoint vt;
118  for (const auto &seg : segs) {
119  if (tau >= seg.ti && tau < seg.tf) {
120  vt = seg.evaluate(tau);
121  break;
122  }
123  }
124  return vt;
125  }
126 
127  decimal_t getT(decimal_t tau) const {
128  if (segs.empty()) return tau;
129  decimal_t T = 0;
130  for (const auto &seg : segs) {
131  if (tau >= seg.ti && tau <= seg.tf) {
132  T += seg.getT(tau) - seg.getT(seg.ti);
133  return T;
134  }
135  T += seg.dT;
136  }
137  return T;
138  }
139 
140  decimal_t getTau(decimal_t t) const {
141  if (!exist()) return t;
142  decimal_t T = 0;
143  for (const auto &seg : segs) {
144  if (t >= T && t <= T + seg.dT) {
145  decimal_t a = seg.a(0) / 4;
146  decimal_t b = seg.a(1) / 3;
147  decimal_t c = seg.a(2) / 2;
148  decimal_t d = seg.a(3);
149  decimal_t e = T - t - seg.getT(seg.ti);
150 
151  std::vector<decimal_t> ts = solve(a, b, c, d, e);
152  for (const auto &it : ts) {
153  if (it >= seg.ti && it <= seg.tf) return it;
154  }
155  }
156  T += seg.dT;
157  }
158 
159  printf("error: cannot find tau, t = %f\n", t);
160  return -1;
161  }
162 
163  decimal_t getTotalTime() const {
164  decimal_t t = 0;
165  for (const auto &seg : segs) t += seg.dT;
166 
167  return t;
168  }
169 
170  std::vector<LambdaSeg> segs;
171 };
172 
173 #endif
Polynomial roots solver.
piecewise polynomial for scaling trajectory
Definition: lambda.h:73
Vec4f a
a3, a2, a1, a0
Definition: lambda.h:62
decimal_t power(decimal_t t, int n)
Return .
Definition: math.h:197
std::vector< decimal_t > solve(decimal_t a, decimal_t b, decimal_t c, decimal_t d, decimal_t e)
General solver for .
Definition: math.h:117
Vecf< 3 > Vec3f
Eigen 1D float vector of size 3.
Definition: data_type.h:80
Matf< 4, 4 > Mat4f
4x4 Matrix in float
Definition: data_type.h:102
double decimal_t
Rename the float type used in lib.
Definition: data_type.h:49
Defines all data types used in this lib.
Used for scaling, ignored for most case.
Definition: lambda.h:16
Vecf< 4 > Vec4f
Eigen 1D float vector of size 4.
Definition: data_type.h:84
polynomial between two virtual points
Definition: lambda.h:25
vec_E< Vec3f > vec_Vec3f
Vector of type Vec3f.
Definition: data_type.h:93