gtsam
Loading...
Searching...
No Matches
PiecewisePolynomial.h
Go to the documentation of this file.
1/* ----------------------------------------------------------------------------
2
3 * GTSAM Copyright 2010, Georgia Tech Research Corporation,
4 * Atlanta, Georgia 30332-0415
5 * All Rights Reserved
6 * Authors: Frank Dellaert, et al. (see THANKS for the full author list)
7
8 * See LICENSE for the license information
9
10 * -------------------------------------------------------------------------- */
11
17
18#pragma once
19
21
22#include <algorithm>
23#include <array>
24#include <cstddef>
25#include <initializer_list>
26#include <stdexcept>
27
28namespace gtsam {
29
44template <size_t Order, size_t Pieces>
46 public:
47 static constexpr size_t order = Order;
48 static constexpr size_t pieces = Pieces;
49
51 struct Parameters {
53 std::array<std::array<double, order + 1>, pieces> coefficients{};
55 std::array<double, pieces + 1> intervals{};
57 double center = 0.0;
58
60 Parameters(std::initializer_list<double> coefficientValues,
61 std::initializer_list<double> intervalValues, double centerValue)
62 : center(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 "
67 "arguments");
68 }
69 auto coefficient = coefficientValues.begin();
70 for (auto& piece : coefficients) {
71 for (double& value : piece) value = *coefficient++;
72 }
73 std::copy(intervalValues.begin(), intervalValues.end(),
74 intervals.begin());
75 }
76 };
77
79 explicit PiecewisePolynomial(const Parameters& parameters)
80 : parameters_(parameters) {}
81
83 double getCenter() const override { return parameters_.center; }
84
86 double getBeginning() const override { return parameters_.intervals.front(); }
87
89 double getEnd() const override { return parameters_.intervals.back(); }
90
92 size_t getValidDerivatives() const override { return order; }
93
95 const std::array<double, pieces + 1>& getIntervals() const {
96 return parameters_.intervals;
97 }
98
100 double evaluate(double t, OptionalJacobian<1, 1> H = {}) const override {
101 return evaluateDerivative(0, t, H);
102 }
103
105 double evaluateDerivative(size_t derivative, double t,
106 OptionalJacobian<1, 1> H = {}) const override {
107 if (derivative > order) {
108 if (H) (*H)(0, 0) = 0.0;
109 return 0.0;
110 }
111
112 t = std::max(parameters_.intervals.front(),
113 std::min(t, parameters_.intervals.back()));
114
115 for (size_t piece = 0; piece < pieces; ++piece) {
116 if (t <= parameters_.intervals[piece + 1]) {
117 double powerOfT = 1.0;
118 double result = 0.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;
123 }
124 result +=
125 powerRule * powerOfT * parameters_.coefficients[piece][exponent];
126 powerOfT *= t;
127 }
128 if (H) (*H)(0, 0) = evaluateDerivative(derivative + 1, t);
129 return result;
130 }
131 }
132
133 if (H) (*H)(0, 0) = 0.0;
134 return 0.0;
135 }
136
137 private:
138 const Parameters parameters_;
139};
140
141} // namespace gtsam
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 &parameters)
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