28 : x_knots_(x_knots), spline_order_(order) {
29 for (uint32_t i = 1; i < x_knots_.size(); ++i) {
30 splines_.emplace_back(spline_order_);
35 if (splines_.empty()) {
38 uint32_t index = FindIndex(x);
39 return splines_[index](x - x_knots_[index]);
44 if (splines_.empty()) {
47 uint32_t index = FindIndex(x);
48 return splines_[index].Derivative(x - x_knots_[index]);
52 if (splines_.empty()) {
55 uint32_t index = FindIndex(x);
56 return splines_[index].SecondOrderDerivative(x - x_knots_[index]);
60 if (splines_.empty()) {
63 uint32_t index = FindIndex(x);
64 return splines_[index].ThirdOrderDerivative(x - x_knots_[index]);
68 const uint32_t order) {
69 const uint32_t num_params = order + 1;
71 if (x_knots_.size() * num_params !=
72 num_params +
static_cast<uint32_t
>(param_matrix.rows())) {
75 for (uint32_t i = 0; i < splines_.size(); ++i) {
76 std::vector<double> spline_piece(num_params, 0.0);
77 for (uint32_t j = 0; j < num_params; ++j) {
78 spline_piece[j] = param_matrix(i * num_params + j, 0);
80 splines_[i].SetParams(spline_piece);
82 spline_order_ = order;
92uint32_t Spline1d::FindIndex(
const double x)
const {
93 auto upper_bound = std::upper_bound(x_knots_.begin() + 1, x_knots_.end(), x);
95 static_cast<uint32_t
>(std::distance(x_knots_.begin(), upper_bound));
96 if (dis < x_knots_.size()) {
99 return static_cast<uint32_t
>(x_knots_.size()) - 2;
double operator()(const double x) const
Spline1d(const std::vector< double > &x_knots, const uint32_t order)
double SecondOrderDerivative(const double x) const
const std::vector< Spline1dSeg > & splines() const
uint32_t spline_order() const
double Derivative(const double x) const
const std::vector< double > & x_knots() const
double ThirdOrderDerivative(const double x) const
bool SetSplineSegs(const Eigen::MatrixXd ¶m_matrix, const uint32_t order)
Planning module main class.
: piecewise smoothing spline class