16 template <
class T,
class VECTOR>
25 const size_t N = ys.size();
26 if (
x<=x0)
return ys[0];
27 if (
x>=x1)
return ys[N-1];
28 const T Ax = (x1-x0)/T(N);
29 const size_t i = int( (
x-x0)/Ax );
30 if (i>=N-1)
return ys[N-1];
31 const T Ay = ys[i+1]-ys[i];
32 return ys[i] + (
x-(x0+i*Ax))*Ay/Ax;
36 template <
typename NUMTYPE,
class VECTORLIKE>
37 NUMTYPE
spline(
const NUMTYPE
t,
const VECTORLIKE &
x,
const VECTORLIKE &
y,
bool wrap2pi)
45 for (
unsigned int i = 0; i < 3; i++)
46 h[i] =
x[i + 1] -
x[i];
48 double k = 1 / (4 * h[0] * h[1] + 4 * h[0] * h[2] + 3 * h[1] * h[1] + 4 * h[1] * h[2]);
49 double a11 = 2 * (h[1] + h[2])*k;
50 double a12 = -h[1] * k;
51 double a22 = 2 * (h[0] + h[1])*k;
53 double y0, y1, y2, y3;
91 double b1 = (y2 - y1) / h[1] - (y1 - y0) / h[0];
92 double b2 = (y3 - y2) / h[2] - (y2 - y1) / h[1];
95 double z1 = 6 * (a11*
b1 + a12*
b2);
96 double z2 = 6 * (a12*
b1 + a22*
b2);
101 res = (z1*pow((
t -
x[0]), 3) + z0*pow((
x[1] -
t), 3)) / (6 * h[0]) + (y1 / h[0] - h[0] / 6 * z1)*(
t -
x[0]) + (y0 / h[0] - h[0] / 6 * z0)*(
x[1] -
t);
105 res = (z2*pow((
t -
x[1]), 3) + z1*pow((
x[2] -
t), 3)) / (6 * h[1]) + (y2 / h[1] - h[1] / 6 * z2)*(
t -
x[1]) + (y1 / h[1] - h[1] / 6 * z1)*(
x[2] -
t);
108 res = (z3*pow((
t -
x[2]), 3) + z2*pow((
x[3] -
t), 3)) / (6 * h[2]) + (y3 / h[2] - h[2] / 6 * z3)*(
t -
x[2]) + (y2 / h[2] - h[2] / 6 * z2)*(
x[3] -
t);
113 template <
typename NUMTYPE,
class VECTORLIKE,
int NUM_POINTS>
122 const size_t N =
x.size();
125 const NUMTYPE x_min =
x.minimum();
126 Eigen::Matrix<NUMTYPE, 2, NUM_POINTS> Xt;
128 for (
size_t i=0;i<N;i++)
130 Xt.set_unsafe(0,i, 1);
131 Xt.set_unsafe(1,i,
x[i]-x_min);
134 const auto B = ((Xt*Xt.transpose()).
inv().eval()*Xt*
y).eval();
137 NUMTYPE ret = B[0] + B[1]*(
t-x_min);
147 template <
class VECTORLIKE1,
class VECTORLIKE2,
class VECTORLIKE3,
int NUM_POINTS>
150 const VECTORLIKE3 &
x,
151 const VECTORLIKE3 &
y,
160 const size_t N =
x.size();
163 typedef typename VECTORLIKE3::value_type NUM;
164 const NUM x_min =
x.minimum();
165 Eigen::Matrix<NUM, 2, NUM_POINTS> Xt;
167 for (
size_t i=0;i<N;i++)
169 Xt.set_unsafe(0,i, 1);
170 Xt.set_unsafe(1,i,
x[i]-x_min);
173 const auto B = ((Xt*Xt.transpose()).
inv().eval()*Xt*
y).eval();
176 const size_t tsN =
size_t(ts.size());
179 for (
size_t k=0;k<tsN;k++)
180 outs[k] = B[0] + B[1]*(ts[k]-x_min);
182 for (
size_t k=0;k<tsN;k++)
NUMTYPE leastSquareLinearFit(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates or extrapolates using a least-square linear fit of the set of values "x" and "y"...
T interpolate(const T &x, const VECTOR &ys, const T &x0, const T &x1)
Interpolate a data sequence "ys" ranging from "x0" to "x1" (equally spaced), to obtain the approximat...
T wrapToPi(T a)
Modifies the given angle to translate it into the ]-pi,pi] range.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
NUMTYPE spline(const NUMTYPE t, const VECTORLIKE &x, const VECTORLIKE &y, bool wrap2pi=false)
Interpolates the value of a function in a point "t" given 4 SORTED points where "t" is between the tw...
EIGEN_STRONG_INLINE PlainObject inv() const