30 #ifndef HPP_CORE_TIME_PARAMETERIZATION_PIECEWISE_POLYNOMIAL_HH
31 #define HPP_CORE_TIME_PARAMETERIZATION_PIECEWISE_POLYNOMIAL_HH
33 #include <hpp/constraints/differentiable-function.hh>
41 namespace timeParameterization {
51 typedef Eigen::Matrix<value_type, NbCoeffs, Eigen::Dynamic, Eigen::ColMajor>
53 typedef Eigen::Matrix<value_type, Eigen::Dynamic, 1>
Vector_t;
62 : parameters_(parameters),
63 breakpoints_(breakpoints.data(),
64 breakpoints.data() + breakpoints.size()) {
65 assert(
size_type(breakpoints_.size()) == parameters_.cols() + 1);
66 assert(parameters_.rows() == NbCoeffs);
68 for (
size_type j = 0; j < parameters_.cols(); ++j) {
70 assert(breakpoints_[j] > breakpoints_[j - 1]);
72 for (
size_type i = 0; i < parameters_.rows(); ++i) {
73 assert(parameters_(i, j) < std::numeric_limits<value_type>::infinity());
74 assert(parameters_(i, j) >
75 -std::numeric_limits<value_type>::infinity());
82 const std::vector<value_type>&
breakpoints()
const {
return breakpoints_; }
111 const size_t seg_index = findPolynomialIndex(t);
112 const auto& poly_coeffs = parameters_.col(seg_index);
115 for (
size_type i = 1; i < poly_coeffs.size(); ++i) {
117 res += poly_coeffs[i] * tn;
126 if (order >= parameters_.rows())
return 0;
128 if (parameters_.rows() > MaxOrder)
129 throw std::invalid_argument(
130 "Cannot compute the derivative of order greater than 10.");
131 typedef path::binomials<MaxOrder> Binomials_t;
132 const Binomials_t::Factorials_t& factors = Binomials_t::factorials();
134 const size_t seg_index = findPolynomialIndex(t);
135 const auto& poly_coeffs = parameters_.col(seg_index);
139 for (
size_type i = order; i < poly_coeffs.size(); ++i) {
140 res +=
value_type(factors[i] / factors[i - order]) * poly_coeffs[i] * tn;
146 size_t findPolynomialIndex(
value_type& t)
const {
151 auto breakpointIter = std::lower_bound(
152 breakpoints_.begin(), breakpoints_.end(), t, std::less_equal<double>());
153 if (breakpointIter == breakpoints_.begin()) {
155 assert(t < breakpoints_[0]);
158 index = breakpoints_.size();
159 }
else if (breakpointIter == breakpoints_.end()) {
160 if (t > breakpoints_.back())
161 index = breakpoints_.size();
163 index = breakpoints_.size() - 2;
165 index = std::distance(breakpoints_.begin(), breakpointIter) - 1;
167 if (index == breakpoints_.size()) {
168 std::ostringstream oss;
169 oss <<
"Position " << t <<
" is outside of range [ " << breakpoints_[0]
170 <<
", " << breakpoints_[breakpoints_.size() - 1] <<
']';
171 throw std::invalid_argument(oss.str());
174 t -= breakpoints_[index];
182 ParameterMatrix_t parameters_;
183 std::vector<value_type> breakpoints_;
185 bool startAtZero_ =
false;
Definition: time-parameterization.hh:37
Definition: piecewise-polynomial.hh:44
Eigen::Matrix< value_type, Eigen::Dynamic, 1 > Vector_t
Definition: piecewise-polynomial.hh:53
void polynomialsStartAtZero(bool startAtZero)
See the corresponding getter.
Definition: piecewise-polynomial.hh:107
value_type value(const value_type &t) const
Computes .
Definition: piecewise-polynomial.hh:89
Eigen::Matrix< value_type, NbCoeffs, Eigen::Dynamic, Eigen::ColMajor > ParameterMatrix_t
Definition: piecewise-polynomial.hh:52
const std::vector< value_type > & breakpoints() const
Definition: piecewise-polynomial.hh:82
PiecewisePolynomial(const ParameterMatrix_t ¶meters, const Vector_t &breakpoints)
Definition: piecewise-polynomial.hh:60
const ParameterMatrix_t & parameters() const
Definition: piecewise-polynomial.hh:80
TimeParameterizationPtr_t copy() const
Definition: piecewise-polynomial.hh:84
bool polynomialsStartAtZero() const
Definition: piecewise-polynomial.hh:104
value_type derivative(const value_type &t, const size_type &order) const
Computes .
Definition: piecewise-polynomial.hh:92
#define HPP_CORE_DLLAPI
Definition: config.hh:88
shared_ptr< TimeParameterization > TimeParameterizationPtr_t
Definition: fwd.hh:189
pinocchio::value_type value_type
Definition: fwd.hh:174
pinocchio::size_type size_type
Definition: fwd.hh:173
Definition: bi-rrt-planner.hh:35