Tool Libs
UMIT-TIROL Institute of Automation and Control Engineering library collection
 
Loading...
Searching...
No Matches
trajectory.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <cmath>
8#include <utility>
9#include <utils/buffer.h>
10
11
16class Curve {
17protected:
18 Buffer<double> diffs;
19public:
20 virtual void setData(Buffer<double> &&b) {
21 assert(false); // ups, virtual call didn't work?
22 }
23
25 virtual ~Curve() {}
26
27 Curve(size_t n=2) : diffs(n) {
28 for (size_t i = 0; i < diffs.size; ++i) diffs.append(0);
29 }
30
31 Buffer<double> operator()(double dx) {
32 return getValue(dx);
33 }
34
35 virtual Buffer<double> getValue(double) {
36 assert(false); // ups, virtual call didn't work?
37 return 0;
38 }
39};
40
42class LinearTrajectory : public Curve {
43 struct Vec {
44 double x, y, m;
45 };
47public:
48 LinearTrajectory(size_t diffs=2) : Curve(diffs) {}
49
50 void setData(Buffer<double> &&b) override {
51 size_t off{b.size / 2};
52 P = Buffer<Vec>(off);
53 P.len = off;
54 double slope;
55 for (size_t i = 0; i < off; ++i) {
56 if (i + 1 < off) {
57 slope = (b[i + 1 + off] - b[i + off]) / (b[i + 1] - b[i]);
58 } else {
59 slope = 0;
60 }
61 P[i] = {b[i], b[i + off], slope};
62 }
63 }
64
65 Buffer<double> getValue(double dx) override {
66 if (!P.size) {
67 diffs[0] = 0;
68 diffs[1] = 0;
69 return diffs;
70 };
71 size_t i = (P.size - 1) / 2;
72 size_t left = 0, right = P.size - 1;
73 while (true) {
74 if (left == right) {
75 diffs[0] = P[right].y;
76 diffs[1] = 0;
77 break;
78 }
79 if (dx < P[i].x) {
80 right = i;
81 i = (left + right) / 2;
82 continue;
83 }
84 if (dx >= P[i + 1].x) {
85 left = i + 1;
86 i = (left + right) / 2;
87 continue;
88 }
89 diffs[0] = P[i].m * (dx - P[i].x) + P[i].y;
90 diffs[1] = P[i].m;
91 break;
92 }
93 return diffs;
94 }
95};
96
98class SmoothTrajectory : public Curve {
99 size_t n;
100 Buffer<double> coeffs;
101 struct Vec {
102 double x, y;
103 };
104 Buffer<Vec> P;
105public:
106 SmoothTrajectory(Buffer<double> coeffs, size_t n) : Curve(coeffs.len), n(n), coeffs(coeffs) {}
107
108 void setData(Buffer<double> &&b) override {
109 size_t off{b.size / 2};
110 P = Buffer<Vec>(off);
111 P.len = off;
112 for (size_t i = 0; i < off; ++i) {
113 P[i] = {b[i], b[i + off]};
114 }
115 }
116
117 Buffer<double> getValue(double x) override {
118 for (auto &d: diffs) d = 0;
119
120 size_t i = (P.size - 1) / 2;
121 size_t left = 0, right = P.size - 1;
122 while (true) {
123 if (left == right) {
124 diffs[0] = P[right].y;
125 diffs[1] = 0;
126 break;
127 }
128 if (x < P[i].x) {
129 right = i;
130 i = (left + right) / 2;
131 continue;
132 }
133 if (x >= P[i + 1].x) {
134 left = i + 1;
135 i = (left + right) / 2;
136 continue;
137 }
138 double dy = P[i + 1].y - P[i].y;
139 double dx = P[i + 1].x - P[i].x;
140 double tau = (x - P[i].x) / dx;
141
142 for (int k = n; k >= 0; --k) {
143 for (int j = n - diffs.len; j > 0; --j) {
144 diffs[j] = diffs[j] * tau + diffs[j - 1];
145 }
146 if (n - k >= coeffs.len)
147 diffs[0] *= tau;
148 else
149 diffs[0] = diffs[0] * tau + coeffs[k - coeffs.len];
150 }
151
152 for (size_t l = 0; l < diffs.len; ++l) {
153 if (l > 0)
154 diffs[l] *= dy * l / pow(dx, l);
155 else
156 diffs[l] = P[i].y + diffs[l] * dy;
157 }
158 break;
159 }
160
161 return diffs;
162 }
163};
164
166template<int n>
167struct Reference {
168 double y[n]{};
169
170 size_t size(){
171 return n;
172 }
173
174 operator double *() {
175 return y;
176 }
177
178 Reference &operator+(const Reference &other) {
179 for (int i = 0; i < n; ++i) {
180 this->y[i] += other.y[i];
181 }
182 return *this;
183 }
184
185 Reference &operator-(const Reference &other) {
186 for (int i = 0; i < n; ++i) {
187 this->y[i] -= other.y[i];
188 }
189 return *this;
190 }
191 Reference() { }
192 Reference(std::initializer_list<double> list) {
193 assert(list.size() == n);
194 int i = 0;
195 for (auto l = list.begin(); l != list.end(); ++l, ++i) {
196 y[i] = *l;
197 }
198 }
199 Reference(const Buffer<double> &b) {
200 assert(b.len == n);
201 int i = 0;
202 for (auto l = b.begin(); l != b.end(); ++l, ++i) {
203 y[i] = *l;
204 }
205 }
206};
Copyright (c) 2023 IACE.
Parametrized Curve.
Definition trajectory.h:16
virtual ~Curve()
virtual destructor
Definition trajectory.h:25
Class implementing linear interpolation.
Definition trajectory.h:42
Class implementing polynom interpolation.
Definition trajectory.h:98
dynamically allocated, but fixed-size buffer template
Definition buffer.h:18
Buffer & append(T b)
simple append single item
Definition buffer.h:44
T * end()
end method for range-based for loops
Definition buffer.h:58
size_t size
total capacity of buffer
Definition buffer.h:23
T * begin()
begin method for range-based for loops
Definition buffer.h:55
size_t len
number of items stored in buffer
Definition buffer.h:21
Class implementing reference interpolation.
Definition trajectory.h:167