25#include <initializer_list>
44template <
size_t Order,
size_t Pieces>
47 static constexpr size_t order = Order;
48 static constexpr size_t pieces = Pieces;
60 Parameters(std::initializer_list<double> coefficientValues,
61 std::initializer_list<double> intervalValues,
double centerValue)
63 if (coefficientValues.size() != pieces * (order + 1) ||
64 intervalValues.size() != pieces + 1) {
65 throw std::invalid_argument(
66 "PiecewisePolynomial parameter dimensions do not match template "
69 auto coefficient = coefficientValues.begin();
71 for (
double& value : piece) value = *coefficient++;
73 std::copy(intervalValues.begin(), intervalValues.end(),
80 : parameters_(parameters) {}
83 double getCenter()
const override {
return parameters_.center; }
86 double getBeginning()
const override {
return parameters_.intervals.front(); }
89 double getEnd()
const override {
return parameters_.intervals.back(); }
96 return parameters_.intervals;
107 if (derivative > order) {
108 if (H) (*H)(0, 0) = 0.0;
112 t = std::max(parameters_.
intervals.front(),
113 std::min(t, parameters_.
intervals.back()));
115 for (
size_t piece = 0; piece < pieces; ++piece) {
116 if (t <= parameters_.
intervals[piece + 1]) {
117 double powerOfT = 1.0;
119 for (
size_t exponent = derivative; exponent <= order; ++exponent) {
120 size_t powerRule = 1;
121 for (
size_t count = 0; count < derivative; ++count) {
122 powerRule *= exponent - count;
125 powerRule * powerOfT * parameters_.coefficients[piece][exponent];
133 if (H) (*H)(0, 0) = 0.0;
Continuous kernels for convolution-based trajectory models.
Global functions in a separate testing namespace.
Definition chartTesting.h:28
OptionalJacobian is an Eigen::Ref like class that can take be constructed using either a fixed size o...
Definition OptionalJacobian.h:40
Interface for a compactly supported continuous convolution kernel.
Definition KernelBase.h:27
double getEnd() const override
Return the last boundary of the kernel support.
Definition PiecewisePolynomial.h:89
double evaluate(double t, OptionalJacobian< 1, 1 > H={}) const override
Evaluate the selected polynomial piece and optionally its slope.
Definition PiecewisePolynomial.h:100
const std::array< double, pieces+1 > & getIntervals() const
Return interval boundaries, primarily for validation and visualization.
Definition PiecewisePolynomial.h:95
double evaluateDerivative(size_t derivative, double t, OptionalJacobian< 1, 1 > H={}) const override
Evaluate an analytic derivative and optionally the next derivative.
Definition PiecewisePolynomial.h:105
double getBeginning() const override
Return the first boundary of the kernel support.
Definition PiecewisePolynomial.h:86
double getCenter() const override
Return the representative center of the kernel support.
Definition PiecewisePolynomial.h:83
size_t getValidDerivatives() const override
Return the largest derivative order available analytically.
Definition PiecewisePolynomial.h:92
PiecewisePolynomial(const Parameters ¶meters)
Construct a kernel from fixed-size coefficient data.
Definition PiecewisePolynomial.h:79
Coefficients, interval boundaries, and center defining the kernel.
Definition PiecewisePolynomial.h:51
Parameters(std::initializer_list< double > coefficientValues, std::initializer_list< double > intervalValues, double centerValue)
Construct from row-major coefficients and ascending boundaries.
Definition PiecewisePolynomial.h:60
std::array< std::array< double, order+1 >, pieces > coefficients
Polynomial coefficients indexed by piece, then ascending power.
Definition PiecewisePolynomial.h:53
std::array< double, pieces+1 > intervals
Monotonically increasing boundaries for the polynomial pieces.
Definition PiecewisePolynomial.h:55
double center
Representative center of the complete kernel support.
Definition PiecewisePolynomial.h:57