Aikido
Spline.hpp
Go to the documentation of this file.
1 #ifndef AIKIDO_COMMON_SPLINE_HPP_
2 #define AIKIDO_COMMON_SPLINE_HPP_
3 
4 #include <cstddef>
5 #include <memory>
6 #include <vector>
7 
8 #include <Eigen/Core>
9 #include <Eigen/QR>
10 #include <Eigen/Sparse>
11 #include <Eigen/StdVector>
12 
13 namespace aikido {
14 namespace common {
15 
32 template <
33  class _Scalar = double,
34  class _Index = int,
35  _Index _NumCoefficients = Eigen::Dynamic,
36  _Index _NumOutputs = Eigen::Dynamic,
37  _Index _NumKnots = Eigen::Dynamic>
38 class SplineND
39 {
40 public:
41  using Scalar = _Scalar;
42  using Index = _Index;
43 
44  static constexpr Index NumCoefficientsAtCompileTime = _NumCoefficients;
45  static constexpr Index NumOutputsAtCompileTime = _NumOutputs;
46  static constexpr Index NumKnotsAtCompileTime = _NumKnots;
47  static constexpr Index NumSegmentsAtCompileTime
48  = (_NumKnots != Eigen::Dynamic) ? (NumKnotsAtCompileTime - 1)
49  : Eigen::Dynamic;
50  static constexpr Index DimensionAtCompileTime
51  = (NumSegmentsAtCompileTime != Eigen::Dynamic
52  && _NumCoefficients != Eigen::Dynamic)
54  : Eigen::Dynamic;
55 
56  using TimeVector = Eigen::Matrix<Scalar, NumKnotsAtCompileTime, 1>;
57  using SolutionMatrix = Eigen::
58  Matrix<Scalar, NumOutputsAtCompileTime, NumCoefficientsAtCompileTime>;
59  using OutputVector = Eigen::Matrix<Scalar, NumOutputsAtCompileTime, 1>;
60  using SolutionMatrices
61  = std::vector<SolutionMatrix, Eigen::aligned_allocator<SolutionMatrix> >;
62 
64  SplineND() = default;
65 
75  SplineND(
76  const TimeVector& _times,
77  const std::vector<
79  Eigen::aligned_allocator<SolutionMatrix> >& _solution);
80 
81  // Default copy and move semantics.
82  SplineND(SplineND&& _other) = default;
83  SplineND(const SplineND& _other) = default;
84  SplineND& operator=(SplineND&& _other) = default;
85  SplineND& operator=(const SplineND& _other) = default;
86 
92  void setTime(Index _index, Scalar _t);
93 
97  void setTimes(TimeVector&& _t);
98 
102  void setTimes(const TimeVector& _t);
103 
107  const TimeVector& getTimes() const;
108 
112  const SolutionMatrices& getCoefficients() const;
113 
117  Index getNumKnots() const;
118 
122  Index getNumOutputs() const;
123 
127  Index getNumDerivatives() const;
128 
132  Index getNumCoefficients() const;
133 
138  Scalar getDuration() const;
139 
144  Index getSegmentIndex(Scalar _t) const;
145 
153  OutputVector evaluate(Scalar _t, Index _derivative = 0) const;
154 
155 private:
156  using CoefficientVector
157  = Eigen::Matrix<Scalar, NumCoefficientsAtCompileTime, 1>;
158  using CoefficientMatrix = Eigen::Matrix<
159  Scalar,
162 
165 
166 public:
167  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(TimeVector::NeedsToAlign)
168 };
169 
185 template <
186  class _Scalar = double,
187  class _Index = int,
188  _Index _NumCoefficients = Eigen::Dynamic,
189  _Index _NumOutputs = Eigen::Dynamic,
190  _Index _NumKnots = Eigen::Dynamic>
192 {
193 public:
194  using Scalar = _Scalar;
195  using Index = _Index;
196 
197  static constexpr Index NumCoefficientsAtCompileTime = _NumCoefficients;
198  static constexpr Index NumOutputsAtCompileTime = _NumOutputs;
199  static constexpr Index NumKnotsAtCompileTime = _NumKnots;
200  static constexpr Index NumSegmentsAtCompileTime
201  = (_NumKnots != Eigen::Dynamic) ? (NumKnotsAtCompileTime - 1)
202  : Eigen::Dynamic;
203  static constexpr Index DimensionAtCompileTime
204  = (NumSegmentsAtCompileTime != Eigen::Dynamic
205  && _NumCoefficients != Eigen::Dynamic)
207  : Eigen::Dynamic;
208 
209  using TimeVector = Eigen::Matrix<Scalar, NumKnotsAtCompileTime, 1>;
210  using OutputVector = Eigen::Matrix<Scalar, NumOutputsAtCompileTime, 1>;
211  using OutputMatrix = Eigen::
212  Matrix<Scalar, NumCoefficientsAtCompileTime, NumOutputsAtCompileTime>;
213  using CoefficientVector
214  = Eigen::Matrix<Scalar, NumCoefficientsAtCompileTime, 1>;
215  using CoefficientMatrix = Eigen::Matrix<
216  Scalar,
219  using ProblemMatrix = Eigen::SparseMatrix<Scalar, 0, Index>;
220  using ProblemVector
221  = Eigen::Matrix<Scalar, DimensionAtCompileTime, NumOutputsAtCompileTime>;
222  using SolutionMatrix = Eigen::
223  Matrix<Scalar, NumOutputsAtCompileTime, NumCoefficientsAtCompileTime>;
224  using Spline
226 
236  explicit SplineProblem(const TimeVector& _times);
237 
248  const TimeVector& _times, Index _numCoefficients, Index _numOutputs);
249 
250  // Default copy and move semantics.
251  SplineProblem(SplineProblem&& _other) = default;
252  SplineProblem(const SplineProblem& _other) = default;
253  SplineProblem& operator=(SplineProblem&& _other) = default;
254  SplineProblem& operator=(const SplineProblem& _other) = default;
255 
258 
267 
277  Index _knot, Index _derivative, const OutputVector& _value);
278 
285  void addContinuityConstraint(Index _knot, Index _derivative);
286 
293  Spline fit();
294 
298  Index getNumKnots() const;
299 
303  Index getNumOutputs() const;
304 
309  Scalar getDuration() const;
310 
311 private:
317 
319 
324 
325  std::vector<
327  Eigen::aligned_allocator<SolutionMatrix> >
328  mSolution; // length _NumSegments
329 
330 public:
331  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(
332  CoefficientMatrix::NeedsToAlign || TimeVector::NeedsToAlign
333  || ProblemMatrix::NeedsToAlign || ProblemVector::NeedsToAlign)
334 };
335 
336 } // namespace common
337 } // namespace aikido
338 
339 #include "detail/Spline-impl.hpp"
340 
341 #endif // AIKIDO_COMMON_SPLINE_HPP_
aikido::common::SplineND::getCoefficients
const SolutionMatrices & getCoefficients() const
Gets polynomial coefficients for all segments.
Definition: Spline-impl.hpp:84
aikido::common::SplineProblem::mB
ProblemVector mB
Definition: Spline.hpp:323
aikido::common::SplineProblem::createTimeVector
static CoefficientVector createTimeVector(Scalar _t, Index _i, Index _n)
Creates a vector of the form [ 1, t, t^2, ... t^_n ].
Definition: Spline-impl.hpp:382
aikido::common::SplineND::CoefficientVector
Eigen::Matrix< Scalar, NumCoefficientsAtCompileTime, 1 > CoefficientVector
Definition: Spline.hpp:157
aikido::common::SplineND::OutputVector
Eigen::Matrix< Scalar, NumOutputsAtCompileTime, 1 > OutputVector
Definition: Spline.hpp:59
aikido::common::SplineProblem::ProblemVector
Eigen::Matrix< Scalar, DimensionAtCompileTime, NumOutputsAtCompileTime > ProblemVector
Definition: Spline.hpp:221
aikido::common::SplineProblem::fit
Spline fit()
Fit a spline given the constraints on added to this object.
Definition: Spline-impl.hpp:412
aikido::common::SplineProblem::TimeVector
Eigen::Matrix< Scalar, NumKnotsAtCompileTime, 1 > TimeVector
Definition: Spline.hpp:209
aikido::common::SplineProblem::DimensionAtCompileTime
static constexpr Index DimensionAtCompileTime
Definition: Spline.hpp:204
aikido::common::SplineND::getDuration
Scalar getDuration() const
Gets the duration of the spline.
Definition: Spline-impl.hpp:154
aikido::common::SplineND::getNumCoefficients
Index getNumCoefficients() const
Gets the number of polynomial coefficients in each segment.
Definition: Spline-impl.hpp:125
aikido::common::SplineND::NumOutputsAtCompileTime
static constexpr Index NumOutputsAtCompileTime
Definition: Spline.hpp:45
aikido::common::SplineND::SplineND
SplineND()=default
Constructs an empty spline.
aikido::common::SplineProblem::CoefficientVector
Eigen::Matrix< Scalar, NumCoefficientsAtCompileTime, 1 > CoefficientVector
Definition: Spline.hpp:214
aikido::common::SplineProblem::NumSegmentsAtCompileTime
static constexpr Index NumSegmentsAtCompileTime
Definition: Spline.hpp:201
aikido
Format of serialized trajectory in YAML.
Definition: algorithm.hpp:4
aikido::common::SplineProblem::mNumSegments
Index mNumSegments
Definition: Spline.hpp:313
aikido::common::SplineND::TimeVector
Eigen::Matrix< Scalar, NumKnotsAtCompileTime, 1 > TimeVector
Definition: Spline.hpp:56
aikido::common::SplineProblem::SplineProblem
SplineProblem(const TimeVector &_times)
Constructs a spline fitting problem with the knot points at the specified times.
Definition: Spline-impl.hpp:242
aikido::common::SplineProblem::NumOutputsAtCompileTime
static constexpr Index NumOutputsAtCompileTime
Definition: Spline.hpp:198
aikido::common::SplineProblem::mCoefficientMatrix
CoefficientMatrix mCoefficientMatrix
Definition: Spline.hpp:318
aikido::common::SplineND::setTimes
void setTimes(TimeVector &&_t)
Sets the times of all knot points.
Definition: Spline-impl.hpp:48
aikido::common::SplineProblem::mNumOutputs
Index mNumOutputs
Definition: Spline.hpp:315
aikido::common::SplineProblem::OutputMatrix
Eigen::Matrix< Scalar, NumCoefficientsAtCompileTime, NumOutputsAtCompileTime > OutputMatrix
Definition: Spline.hpp:212
aikido::common::SplineProblem::Index
_Index Index
Definition: Spline.hpp:195
aikido::common::SplineProblem::getDuration
Scalar getDuration() const
Gets the duration of the spline.
Definition: Spline-impl.hpp:503
aikido::common::SplineProblem::operator=
SplineProblem & operator=(SplineProblem &&_other)=default
aikido::common::SplineProblem::Scalar
_Scalar Scalar
Definition: Spline.hpp:194
aikido::common::SplineND::Index
_Index Index
Definition: Spline.hpp:42
aikido::common::SplineND::getNumKnots
Index getNumKnots() const
Gets the number of knot points.
Definition: Spline-impl.hpp:96
Spline-impl.hpp
aikido::common::SplineProblem::addConstantConstraint
void addConstantConstraint(Index _knot, Index _derivative, const OutputVector &_value)
Adds a constraint that the _derivative-th order derivative of knot point _knot should equal _value.
Definition: Spline-impl.hpp:290
aikido::common::SplineND::DimensionAtCompileTime
static constexpr Index DimensionAtCompileTime
Definition: Spline.hpp:51
aikido::common::SplineND::CoefficientMatrix
Eigen::Matrix< Scalar, NumCoefficientsAtCompileTime, NumCoefficientsAtCompileTime > CoefficientMatrix
Definition: Spline.hpp:161
aikido::common::SplineProblem::getNumKnots
Index getNumKnots() const
Gets the number of knot points.
Definition: Spline-impl.hpp:479
aikido::common::SplineND::SolutionMatrix
Eigen::Matrix< Scalar, NumOutputsAtCompileTime, NumCoefficientsAtCompileTime > SolutionMatrix
Definition: Spline.hpp:58
aikido::common::SplineProblem::SolutionMatrix
Eigen::Matrix< Scalar, NumOutputsAtCompileTime, NumCoefficientsAtCompileTime > SolutionMatrix
Definition: Spline.hpp:223
aikido::common::SplineND::mSolution
SolutionMatrices mSolution
Definition: Spline.hpp:164
aikido::common::SplineProblem::mTimes
TimeVector mTimes
Definition: Spline.hpp:321
aikido::common::SplineND::getNumDerivatives
Index getNumDerivatives() const
Gets an upperbound on the number of non-zero derivatives.
Definition: Spline-impl.hpp:142
aikido::common::SplineProblem::OutputVector
Eigen::Matrix< Scalar, NumOutputsAtCompileTime, 1 > OutputVector
Definition: Spline.hpp:210
aikido::common::SplineND::setTime
void setTime(Index _index, Scalar _t)
Sets the time of the _index-th knot point.
Definition: Spline-impl.hpp:35
aikido::common::SplineProblem::NumCoefficientsAtCompileTime
static constexpr Index NumCoefficientsAtCompileTime
Definition: Spline.hpp:197
aikido::common::SplineProblem::mSolution
std::vector< SolutionMatrix, Eigen::aligned_allocator< SolutionMatrix > > mSolution
Definition: Spline.hpp:328
aikido::common::SplineProblem::createCoefficientMatrix
static CoefficientMatrix createCoefficientMatrix(Index _n)
Creates the _n by _n matrix of derivative coefficients for a polynomial with _n coefficients.
Definition: Spline-impl.hpp:452
aikido::common::SplineND::getSegmentIndex
Index getSegmentIndex(Scalar _t) const
Gets the index of the segment that contains time _t.
Definition: Spline-impl.hpp:170
aikido::common::SplineProblem::ProblemMatrix
Eigen::SparseMatrix< Scalar, 0, Index > ProblemMatrix
Definition: Spline.hpp:219
aikido::common::SplineProblem::mNumCoefficients
Index mNumCoefficients
Definition: Spline.hpp:314
aikido::common::SplineProblem::mNumKnots
Index mNumKnots
Definition: Spline.hpp:312
aikido::common::SplineND
An arbitrary dimensional polynomial spline.
Definition: Spline.hpp:38
aikido::common::SplineND::operator=
SplineND & operator=(SplineND &&_other)=default
aikido::common::SplineProblem::addContinuityConstraint
void addContinuityConstraint(Index _knot, Index _derivative)
Adds a continuity constraint on the _derivative-th order derivative at knot point _knot.
Definition: Spline-impl.hpp:344
aikido::common::SplineND::NumSegmentsAtCompileTime
static constexpr Index NumSegmentsAtCompileTime
Definition: Spline.hpp:48
aikido::common::SplineND::SolutionMatrices
std::vector< SolutionMatrix, Eigen::aligned_allocator< SolutionMatrix > > SolutionMatrices
Definition: Spline.hpp:61
aikido::common::SplineProblem::getNumOutputs
Index getNumOutputs() const
Gets the number of outputs points.
Definition: Spline-impl.hpp:491
aikido::common::SplineProblem
Utility for fitting splines given constraints on function value, derivative value,...
Definition: Spline.hpp:191
aikido::common::SplineND::evaluate
OutputVector evaluate(Scalar _t, Index _derivative=0) const
Evaluate the _derivative-th order of the spline at time _t.
Definition: Spline-impl.hpp:197
aikido::common::SplineProblem::mDimension
Index mDimension
Definition: Spline.hpp:316
aikido::common::SplineProblem::CoefficientMatrix
Eigen::Matrix< Scalar, NumCoefficientsAtCompileTime, NumCoefficientsAtCompileTime > CoefficientMatrix
Definition: Spline.hpp:218
aikido::common::SplineND::NumCoefficientsAtCompileTime
static constexpr Index NumCoefficientsAtCompileTime
Definition: Spline.hpp:44
aikido::common::SplineND::getTimes
const TimeVector & getTimes() const
Gets times of all knot points.
Definition: Spline-impl.hpp:72
aikido::common::SplineND::NumKnotsAtCompileTime
static constexpr Index NumKnotsAtCompileTime
Definition: Spline.hpp:46
aikido::common::SplineND::Scalar
_Scalar Scalar
Definition: Spline.hpp:41
aikido::common::SplineND::getNumOutputs
Index getNumOutputs() const
Gets the number of outputs points.
Definition: Spline-impl.hpp:108
aikido::common::SplineProblem::NumKnotsAtCompileTime
static constexpr Index NumKnotsAtCompileTime
Definition: Spline.hpp:199
aikido::common::SplineND::mTimes
TimeVector mTimes
Definition: Spline.hpp:163
aikido::common::SplineProblem::mRowIndex
Index mRowIndex
Definition: Spline.hpp:320
aikido::common::SplineProblem::mA
ProblemMatrix mA
Definition: Spline.hpp:322