36 : t_knots_(t_knots), spline_order_(order) {
40 2 * (spline_order_ + 1) * (
static_cast<uint32_t
>(t_knots.size()) - 1);
45 const Eigen::MatrixXd& constraint_matrix,
46 const Eigen::MatrixXd& constraint_boundary) {
47 return inequality_constraint_.
AddConstraint(constraint_matrix,
52 const Eigen::MatrixXd& constraint_matrix,
53 const Eigen::MatrixXd& constraint_boundary) {
64 const std::vector<double>& t_coord,
const std::vector<double>& angle,
65 const std::vector<Vec2d>& ref_point,
66 const std::vector<double>& longitudinal_bound,
67 const std::vector<double>& lateral_bound) {
68 if (t_coord.size() != angle.size() || angle.size() != ref_point.size() ||
69 ref_point.size() != lateral_bound.size() ||
70 lateral_bound.size() != longitudinal_bound.size()) {
73 Eigen::MatrixXd affine_inequality =
74 Eigen::MatrixXd::Zero(4 * t_coord.size(), total_param_);
75 Eigen::MatrixXd affine_boundary =
76 Eigen::MatrixXd::Zero(4 * t_coord.size(), 1);
77 for (uint32_t i = 0; i < t_coord.size(); ++i) {
78 const double d_lateral = SignDistance(ref_point[i], angle[i]);
79 const double d_longitudinal =
80 SignDistance(ref_point[i], angle[i] - M_PI / 2.0);
81 const uint32_t index = FindIndex(t_coord[i]);
82 const double rel_t = t_coord[i] - t_knots_[index];
83 const uint32_t index_offset = 2 * index * (spline_order_ + 1);
84 std::vector<double> longi_coef = AffineCoef(angle[i], rel_t);
85 std::vector<double> longitudinal_coef =
86 AffineCoef(angle[i] - M_PI / 2, rel_t);
87 for (uint32_t j = 0; j < 2 * (spline_order_ + 1); ++j) {
89 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
91 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
93 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
95 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
98 affine_boundary(4 * i, 0) = d_lateral - lateral_bound[i];
99 affine_boundary(4 * i + 1, 0) = -d_lateral - lateral_bound[i];
100 affine_boundary(4 * i + 2, 0) = d_longitudinal - longitudinal_bound[i];
101 affine_boundary(4 * i + 3, 0) = -d_longitudinal - longitudinal_bound[i];
107 const std::vector<double>& t_coord,
const std::vector<double>& angle,
108 const std::vector<Vec2d>& ref_point,
109 const std::vector<double>& longitudinal_bound,
110 const std::vector<double>& lateral_bound) {
111 if (t_coord.size() != angle.size() || angle.size() != ref_point.size() ||
112 ref_point.size() != lateral_bound.size() ||
113 lateral_bound.size() != longitudinal_bound.size()) {
116 Eigen::MatrixXd affine_inequality =
117 Eigen::MatrixXd::Zero(4 * t_coord.size(), total_param_);
118 Eigen::MatrixXd affine_boundary =
119 Eigen::MatrixXd::Zero(4 * t_coord.size(), 1);
120 for (uint32_t i = 0; i < t_coord.size(); ++i) {
121 const double d_lateral = SignDistance(ref_point[i], angle[i]);
122 const double d_longitudinal =
123 SignDistance(ref_point[i], angle[i] - M_PI / 2.0);
124 const uint32_t index = FindIndex(t_coord[i]);
125 const double rel_t = t_coord[i] - t_knots_[index];
126 const uint32_t index_offset = 2 * index * (spline_order_ + 1);
127 std::vector<double> longi_coef = AffineDerivativeCoef(angle[i], rel_t);
128 std::vector<double> longitudinal_coef =
129 AffineDerivativeCoef(angle[i] - M_PI / 2, rel_t);
130 for (uint32_t j = 0; j < 2 * (spline_order_ + 1); ++j) {
132 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
134 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
136 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
138 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
141 affine_boundary(4 * i, 0) = d_lateral - lateral_bound[i];
142 affine_boundary(4 * i + 1, 0) = -d_lateral - lateral_bound[i];
143 affine_boundary(4 * i + 2, 0) = d_longitudinal - longitudinal_bound[i];
144 affine_boundary(4 * i + 3, 0) = -d_longitudinal - longitudinal_bound[i];
150 const std::vector<double>& t_coord,
const std::vector<double>& angle,
151 const std::vector<Vec2d>& ref_point,
152 const std::vector<double>& longitudinal_bound,
153 const std::vector<double>& lateral_bound) {
154 if (t_coord.size() != angle.size() || angle.size() != ref_point.size() ||
155 ref_point.size() != lateral_bound.size() ||
156 lateral_bound.size() != longitudinal_bound.size()) {
159 Eigen::MatrixXd affine_inequality =
160 Eigen::MatrixXd::Zero(4 * t_coord.size(), total_param_);
161 Eigen::MatrixXd affine_boundary =
162 Eigen::MatrixXd::Zero(4 * t_coord.size(), 1);
163 for (uint32_t i = 0; i < t_coord.size(); ++i) {
164 const double d_lateral = SignDistance(ref_point[i], angle[i]);
165 const double d_longitudinal =
166 SignDistance(ref_point[i], angle[i] - M_PI / 2.0);
167 const uint32_t index = FindIndex(t_coord[i]);
168 const double rel_t = t_coord[i] - t_knots_[index];
169 const uint32_t index_offset = 2 * index * (spline_order_ + 1);
170 std::vector<double> longi_coef =
171 AffineSecondDerivativeCoef(angle[i], rel_t);
172 std::vector<double> longitudinal_coef =
173 AffineSecondDerivativeCoef(angle[i] - M_PI / 2, rel_t);
174 for (uint32_t j = 0; j < 2 * (spline_order_ + 1); ++j) {
176 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
178 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
180 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
182 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
185 affine_boundary(4 * i, 0) = d_lateral - lateral_bound[i];
186 affine_boundary(4 * i + 1, 0) = -d_lateral - lateral_bound[i];
187 affine_boundary(4 * i + 2, 0) = d_longitudinal - longitudinal_bound[i];
188 affine_boundary(4 * i + 3, 0) = -d_longitudinal - longitudinal_bound[i];
194 const std::vector<double>& t_coord,
const std::vector<double>& angle,
195 const std::vector<Vec2d>& ref_point,
196 const std::vector<double>& longitudinal_bound,
197 const std::vector<double>& lateral_bound) {
198 if (t_coord.size() != angle.size() || angle.size() != ref_point.size() ||
199 ref_point.size() != lateral_bound.size() ||
200 lateral_bound.size() != longitudinal_bound.size()) {
203 Eigen::MatrixXd affine_inequality =
204 Eigen::MatrixXd::Zero(4 * t_coord.size(), total_param_);
205 Eigen::MatrixXd affine_boundary =
206 Eigen::MatrixXd::Zero(4 * t_coord.size(), 1);
207 for (uint32_t i = 0; i < t_coord.size(); ++i) {
208 const double d_lateral = SignDistance(ref_point[i], angle[i]);
209 const double d_longitudinal =
210 SignDistance(ref_point[i], angle[i] - M_PI / 2.0);
211 const uint32_t index = FindIndex(t_coord[i]);
212 const double rel_t = t_coord[i] - t_knots_[index];
213 const uint32_t index_offset = 2 * index * (spline_order_ + 1);
214 std::vector<double> longi_coef = AffineThirdDerivativeCoef(angle[i], rel_t);
215 std::vector<double> longitudinal_coef =
216 AffineThirdDerivativeCoef(angle[i] - M_PI / 2, rel_t);
217 for (uint32_t j = 0; j < 2 * (spline_order_ + 1); ++j) {
219 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
221 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
223 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
225 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
228 affine_boundary(4 * i, 0) = d_lateral - lateral_bound[i];
229 affine_boundary(4 * i + 1, 0) = -d_lateral - lateral_bound[i];
230 affine_boundary(4 * i + 2, 0) = d_longitudinal - longitudinal_bound[i];
231 affine_boundary(4 * i + 3, 0) = -d_longitudinal - longitudinal_bound[i];
238 const uint32_t index = FindIndex(t);
239 const double rel_t = t - t_knots_[index];
240 std::vector<double> coef = PolyCoef(rel_t);
241 return AddPointKthOrderDerivativeConstraint(t, x, y, coef);
247 const size_t index = FindIndex(t);
248 const double rel_t = t - t_knots_[index];
249 std::vector<double> coef = SecondDerivativeCoef(rel_t);
250 return AddPointKthOrderDerivativeConstraint(t, ddx, ddy, coef);
256 const size_t index = FindIndex(t);
257 const double rel_t = t - t_knots_[index];
258 std::vector<double> coef = ThirdDerivativeCoef(rel_t);
259 return AddPointKthOrderDerivativeConstraint(t, dddx, dddy, coef);
262bool Spline2dConstraint::AddPointKthOrderDerivativeConstraint(
263 const double t,
const double x_kth_derivative,
264 const double y_kth_derivative,
const std::vector<double>& coef) {
265 const uint32_t num_params = spline_order_ + 1;
266 Eigen::MatrixXd affine_equality = Eigen::MatrixXd::Zero(2, total_param_);
267 Eigen::MatrixXd affine_boundary = Eigen::MatrixXd::Zero(2, 1);
268 affine_boundary << x_kth_derivative, y_kth_derivative;
269 const size_t index = FindIndex(t);
270 const size_t index_offset = index * 2 * num_params;
271 for (
size_t i = 0; i < num_params; ++i) {
272 affine_equality(0, i + index_offset) = coef[i];
273 affine_equality(1, i + num_params + index_offset) = coef[i];
279 const double angle) {
280 const uint32_t index = FindIndex(t);
281 const uint32_t num_params = spline_order_ + 1;
282 const uint32_t index_offset = index * 2 * num_params;
283 const double rel_t = t - t_knots_[index];
286 Eigen::MatrixXd affine_equality = Eigen::MatrixXd::Zero(1, total_param_);
287 Eigen::MatrixXd affine_boundary = Eigen::MatrixXd::Zero(1, 1);
288 std::vector<double> line_derivative_coef = AffineDerivativeCoef(angle, rel_t);
289 for (uint32_t i = 0; i < line_derivative_coef.size(); ++i) {
290 affine_equality(0, i + index_offset) = line_derivative_coef[i];
294 Eigen::MatrixXd affine_inequality = Eigen::MatrixXd::Zero(2, total_param_);
295 const Eigen::MatrixXd affine_inequality_boundary =
296 Eigen::MatrixXd::Zero(2, 1);
297 std::vector<double> t_coef = DerivativeCoef(rel_t);
300 double normalized_angle = fmod(angle, M_PI * 2);
301 if (normalized_angle < 0) {
302 normalized_angle += M_PI * 2;
305 if (normalized_angle > (M_PI / 2) && normalized_angle < (M_PI * 1.5)) {
309 if (normalized_angle >= M_PI) {
313 for (uint32_t i = 0; i < t_coef.size(); ++i) {
314 affine_inequality(0, i + index_offset) = t_coef[i] * x_sign;
315 affine_inequality(1, i + index_offset + num_params) = t_coef[i] * y_sign;
325 if (t_knots_.size() < 3) {
328 Eigen::MatrixXd affine_equality =
329 Eigen::MatrixXd::Zero(2 * (t_knots_.size() - 2), total_param_);
330 Eigen::MatrixXd affine_boundary =
331 Eigen::MatrixXd::Zero(2 * (t_knots_.size() - 2), 1);
332 for (uint32_t i = 0; i + 2 < t_knots_.size(); ++i) {
333 const double rel_t = t_knots_[i + 1] - t_knots_[i];
334 const uint32_t num_params = spline_order_ + 1;
335 const uint32_t index_offset = 2 * i * num_params;
336 std::vector<double> power_t = PolyCoef(rel_t);
338 for (uint32_t j = 0; j < num_params; ++j) {
339 affine_equality(2 * i, j + index_offset) = power_t[j];
340 affine_equality(2 * i + 1, j + index_offset + num_params) = power_t[j];
342 affine_equality(2 * i, index_offset + 2 * num_params) = -1.0;
343 affine_equality(2 * i + 1, index_offset + 3 * num_params) = -1.0;
350 if (t_knots_.size() < 3) {
353 Eigen::MatrixXd affine_equality =
354 Eigen::MatrixXd::Zero(4 * (t_knots_.size() - 2), total_param_);
355 Eigen::MatrixXd affine_boundary =
356 Eigen::MatrixXd::Zero(4 * (t_knots_.size() - 2), 1);
358 for (uint32_t i = 0; i + 2 < t_knots_.size(); ++i) {
359 const double rel_t = t_knots_[i + 1] - t_knots_[i];
360 const uint32_t num_params = spline_order_ + 1;
361 const uint32_t index_offset = 2 * i * num_params;
362 std::vector<double> power_t = PolyCoef(rel_t);
363 std::vector<double> derivative_t = DerivativeCoef(rel_t);
364 for (uint32_t j = 0; j < num_params; ++j) {
365 affine_equality(4 * i, j + index_offset) = power_t[j];
366 affine_equality(4 * i + 1, j + index_offset) = derivative_t[j];
367 affine_equality(4 * i + 2, j + index_offset + num_params) = power_t[j];
368 affine_equality(4 * i + 3, j + index_offset + num_params) =
371 affine_equality(4 * i, index_offset + 2 * num_params) = -1.0;
372 affine_equality(4 * i + 1, index_offset + 2 * num_params + 1) = -1.0;
373 affine_equality(4 * i + 2, index_offset + 3 * num_params) = -1.0;
374 affine_equality(4 * i + 3, index_offset + 3 * num_params + 1) = -1.0;
381 if (t_knots_.size() < 3) {
384 Eigen::MatrixXd affine_equality =
385 Eigen::MatrixXd::Zero(6 * (t_knots_.size() - 2), total_param_);
386 Eigen::MatrixXd affine_boundary =
387 Eigen::MatrixXd::Zero(6 * (t_knots_.size() - 2), 1);
389 for (uint32_t i = 0; i + 2 < t_knots_.size(); ++i) {
390 const double rel_t = t_knots_[i + 1] - t_knots_[i];
391 const uint32_t num_params = spline_order_ + 1;
392 const uint32_t index_offset = 2 * i * num_params;
393 std::vector<double> power_t = PolyCoef(rel_t);
394 std::vector<double> derivative_t = DerivativeCoef(rel_t);
395 std::vector<double> second_derivative_t = SecondDerivativeCoef(rel_t);
396 for (uint32_t j = 0; j < num_params; ++j) {
397 affine_equality(6 * i, j + index_offset) = power_t[j];
398 affine_equality(6 * i + 1, j + index_offset) = derivative_t[j];
399 affine_equality(6 * i + 2, j + index_offset) = second_derivative_t[j];
400 affine_equality(6 * i + 3, j + index_offset + num_params) = power_t[j];
401 affine_equality(6 * i + 4, j + index_offset + num_params) =
403 affine_equality(6 * i + 5, j + index_offset + num_params) =
404 second_derivative_t[j];
406 affine_equality(6 * i, index_offset + 2 * num_params) = -1.0;
407 affine_equality(6 * i + 1, index_offset + 2 * num_params + 1) = -1.0;
408 affine_equality(6 * i + 2, index_offset + 2 * num_params + 2) = -2.0;
409 affine_equality(6 * i + 3, index_offset + 3 * num_params) = -1.0;
410 affine_equality(6 * i + 4, index_offset + 3 * num_params + 1) = -1.0;
411 affine_equality(6 * i + 5, index_offset + 3 * num_params + 2) = -2.0;
418 if (t_knots_.size() < 3) {
421 Eigen::MatrixXd affine_equality =
422 Eigen::MatrixXd::Zero(8 * (t_knots_.size() - 2), total_param_);
423 Eigen::MatrixXd affine_boundary =
424 Eigen::MatrixXd::Zero(8 * (t_knots_.size() - 2), 1);
426 for (uint32_t i = 0; i + 2 < t_knots_.size(); ++i) {
427 const double rel_t = t_knots_[i + 1] - t_knots_[i];
428 const uint32_t num_params = spline_order_ + 1;
429 const uint32_t index_offset = 2 * i * num_params;
430 std::vector<double> power_t = PolyCoef(rel_t);
431 std::vector<double> derivative_t = DerivativeCoef(rel_t);
432 std::vector<double> second_derivative_t = SecondDerivativeCoef(rel_t);
433 std::vector<double> third_derivative_t = ThirdDerivativeCoef(rel_t);
434 for (uint32_t j = 0; j < num_params; ++j) {
435 affine_equality(8 * i, j + index_offset) = power_t[j];
436 affine_equality(8 * i + 1, j + index_offset) = derivative_t[j];
437 affine_equality(8 * i + 2, j + index_offset) = second_derivative_t[j];
438 affine_equality(8 * i + 3, j + index_offset) = third_derivative_t[j];
439 affine_equality(8 * i + 4, j + index_offset + num_params) = power_t[j];
440 affine_equality(8 * i + 5, j + index_offset + num_params) =
442 affine_equality(8 * i + 6, j + index_offset + num_params) =
443 second_derivative_t[j];
444 affine_equality(8 * i + 7, j + index_offset + num_params) =
445 third_derivative_t[j];
447 affine_equality(8 * i, index_offset + 2 * num_params) = -1.0;
448 affine_equality(8 * i + 1, index_offset + 2 * num_params + 1) = -1.0;
449 affine_equality(8 * i + 2, index_offset + 2 * num_params + 2) = -2.0;
450 affine_equality(8 * i + 3, index_offset + 2 * num_params + 3) = -6.0;
451 affine_equality(8 * i + 4, index_offset + 3 * num_params) = -1.0;
452 affine_equality(8 * i + 5, index_offset + 3 * num_params + 1) = -1.0;
453 affine_equality(8 * i + 6, index_offset + 3 * num_params + 2) = -2.0;
454 affine_equality(8 * i + 7, index_offset + 3 * num_params + 3) = -6.0;
463 return inequality_constraint_;
467 return equality_constraint_;
470uint32_t Spline2dConstraint::FindIndex(
const double t)
const {
471 auto upper_bound = std::upper_bound(t_knots_.begin() + 1, t_knots_.end(), t);
472 return std::min(
static_cast<uint32_t
>(t_knots_.size() - 1),
473 static_cast<uint32_t
>(upper_bound - t_knots_.begin())) -
477std::vector<double> Spline2dConstraint::AffineCoef(
const double angle,
478 const double t)
const {
479 const uint32_t num_params = spline_order_ + 1;
480 std::vector<double> result(num_params * 2, 0.0);
483 for (uint32_t i = 0; i < num_params; ++i) {
485 result[i + num_params] = y_coef;
492std::vector<double> Spline2dConstraint::AffineDerivativeCoef(
493 const double angle,
const double t)
const {
494 const uint32_t num_params = spline_order_ + 1;
495 std::vector<double> result(num_params * 2, 0.0);
498 std::vector<double> power_t = PolyCoef(t);
499 for (uint32_t i = 1; i < num_params; ++i) {
500 result[i] = x_coef * power_t[i - 1] * i;
501 result[i + num_params] = y_coef * power_t[i - 1] * i;
506std::vector<double> Spline2dConstraint::AffineSecondDerivativeCoef(
507 const double angle,
const double t)
const {
508 const uint32_t num_params = spline_order_ + 1;
509 std::vector<double> result(num_params * 2, 0.0);
512 std::vector<double> power_t = PolyCoef(t);
513 for (uint32_t i = 2; i < num_params; ++i) {
514 result[i] = x_coef * power_t[i - 2] * i * (i - 1);
515 result[i + num_params] = y_coef * power_t[i - 2] * i * (i - 1);
520std::vector<double> Spline2dConstraint::AffineThirdDerivativeCoef(
521 const double angle,
const double t)
const {
522 const uint32_t num_params = spline_order_ + 1;
523 std::vector<double> result(num_params * 2, 0.0);
526 std::vector<double> power_t = PolyCoef(t);
527 for (uint32_t i = 3; i < num_params; ++i) {
528 result[i] = x_coef * power_t[i - 3] * i * (i - 1) * (i - 2);
529 result[i + num_params] = y_coef * power_t[i - 3] * i * (i - 1) * (i - 2);
534double Spline2dConstraint::SignDistance(
const Vec2d& xy_point,
535 const double angle)
const {
537 xy_point.x(), xy_point.y(),
542std::vector<double> Spline2dConstraint::PolyCoef(
const double t)
const {
543 std::vector<double> result(spline_order_ + 1, 1.0);
544 for (uint32_t i = 1; i < result.size(); ++i) {
545 result[i] = result[i - 1] * t;
550std::vector<double> Spline2dConstraint::DerivativeCoef(
const double t)
const {
551 std::vector<double> result(spline_order_ + 1, 0.0);
552 std::vector<double> power_t = PolyCoef(t);
553 for (uint32_t i = 1; i < result.size(); ++i) {
554 result[i] = power_t[i - 1] * i;
559std::vector<double> Spline2dConstraint::SecondDerivativeCoef(
560 const double t)
const {
561 std::vector<double> result(spline_order_ + 1, 0.0);
562 std::vector<double> power_t = PolyCoef(t);
563 for (uint32_t i = 2; i < result.size(); ++i) {
564 result[i] = power_t[i - 2] * i * (i - 1);
569std::vector<double> Spline2dConstraint::ThirdDerivativeCoef(
570 const double t)
const {
571 std::vector<double> result(spline_order_ + 1, 0.0);
572 std::vector<double> power_t = PolyCoef(t);
573 for (uint32_t i = 3; i < result.size(); ++i) {
574 result[i] = power_t[i - 3] * i * (i - 1) * (i - 2);
Defines the templated Angle class.
static Angle from_rad(const double value)
Constructs an Angle object from an angle in radians (factory).
Implements a class of 2-dimensional vectors.
bool AddConstraint(const Eigen::MatrixXd &constraint_matrix, const Eigen::MatrixXd &constraint_boundary)
void SetIsEquality(const double is_equality)
bool AddSecondDerivativeSmoothConstraint()
bool AddPointThirdDerivativeConstraint(const double t, const double dddx, const double dddy)
bool AddEqualityConstraint(const Eigen::MatrixXd &constraint_matrix, const Eigen::MatrixXd &constraint_boundary)
bool Add2dThirdDerivativeBoundary(const std::vector< double > &t_coord, const std::vector< double > &angle, const std::vector< apollo::common::math::Vec2d > &ref_point, const std::vector< double > &longitudinal_bound, const std::vector< double > &lateral_bound)
const AffineConstraint & equality_constraint() const
bool Add2dBoundary(const std::vector< double > &t_coord, const std::vector< double > &angle, const std::vector< apollo::common::math::Vec2d > &ref_point, const std::vector< double > &longitudinal_bound, const std::vector< double > &lateral_bound)
: inequality boundary constraints if no boundary, do specify either by std::infinity or let vector....
bool AddDerivativeSmoothConstraint()
bool AddPointSecondDerivativeConstraint(const double t, const double ddx, const double ddy)
bool AddInequalityConstraint(const Eigen::MatrixXd &constraint_matrix, const Eigen::MatrixXd &constraint_boundary)
bool AddPointAngleConstraint(const double t, const double angle)
bool Add2dDerivativeBoundary(const std::vector< double > &t_coord, const std::vector< double > &angle, const std::vector< apollo::common::math::Vec2d > &ref_point, const std::vector< double > &longitudinal_bound, const std::vector< double > &lateral_bound)
bool Add2dSecondDerivativeBoundary(const std::vector< double > &t_coord, const std::vector< double > &angle, const std::vector< apollo::common::math::Vec2d > &ref_point, const std::vector< double > &longitudinal_bound, const std::vector< double > &lateral_bound)
bool AddSmoothConstraint()
Spline2dConstraint(const std::vector< double > &t_knots, const uint32_t order)
const AffineConstraint & inequality_constraint() const
: output interface inequality constraint
bool AddPointConstraint(const double t, const double x, const double y)
bool AddThirdDerivativeSmoothConstraint()
Planning module main class.
Math-related util functions.
double InnerProd(const Vec2d &start_point, const Vec2d &end_point_1, const Vec2d &end_point_2)
Inner product between two 2-D vectors from the common start point, and end at two other points.