Apollo 11.0
自动驾驶开放平台
spline_2d_constraint.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
22
23#include <algorithm>
24
25#include "cyber/common/log.h"
28
29namespace apollo {
30namespace planning {
31
33
34Spline2dConstraint::Spline2dConstraint(const std::vector<double>& t_knots,
35 const uint32_t order)
36 : t_knots_(t_knots), spline_order_(order) {
37 inequality_constraint_.SetIsEquality(false);
38 equality_constraint_.SetIsEquality(true);
39 total_param_ =
40 2 * (spline_order_ + 1) * (static_cast<uint32_t>(t_knots.size()) - 1);
41}
42
43// direct method
45 const Eigen::MatrixXd& constraint_matrix,
46 const Eigen::MatrixXd& constraint_boundary) {
47 return inequality_constraint_.AddConstraint(constraint_matrix,
48 constraint_boundary);
49}
50
52 const Eigen::MatrixXd& constraint_matrix,
53 const Eigen::MatrixXd& constraint_boundary) {
54 return equality_constraint_.AddConstraint(constraint_matrix,
55 constraint_boundary);
56}
57
58// preset method
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()) {
71 return false;
72 }
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) {
88 // upper longi
89 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
90 // lower longi
91 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
92 // upper longitudinal
93 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
94 // lower longitudinal
95 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
96 }
97
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];
102 }
103 return AddInequalityConstraint(affine_inequality, affine_boundary);
104}
105
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()) {
114 return false;
115 }
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) {
131 // upper longi
132 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
133 // lower longi
134 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
135 // upper longitudinal
136 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
137 // lower longitudinal
138 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
139 }
140
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];
145 }
146 return AddInequalityConstraint(affine_inequality, affine_boundary);
147}
148
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()) {
157 return false;
158 }
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) {
175 // upper longi
176 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
177 // lower longi
178 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
179 // upper longitudinal
180 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
181 // lower longitudinal
182 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
183 }
184
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];
189 }
190 return AddInequalityConstraint(affine_inequality, affine_boundary);
191}
192
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()) {
201 return false;
202 }
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) {
218 // upper longi
219 affine_inequality(4 * i, index_offset + j) = longi_coef[j];
220 // lower longi
221 affine_inequality(4 * i + 1, index_offset + j) = -longi_coef[j];
222 // upper longitudinal
223 affine_inequality(4 * i + 2, index_offset + j) = longitudinal_coef[j];
224 // lower longitudinal
225 affine_inequality(4 * i + 3, index_offset + j) = -longitudinal_coef[j];
226 }
227
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];
232 }
233 return AddInequalityConstraint(affine_inequality, affine_boundary);
234}
235
236bool Spline2dConstraint::AddPointConstraint(const double t, const double x,
237 const double y) {
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);
242}
243
245 const double ddx,
246 const double ddy) {
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);
251}
252
254 const double dddx,
255 const double dddy) {
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);
260}
261
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];
274 }
275 return AddEqualityConstraint(affine_equality, affine_boundary);
276}
277
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];
284
285 // add equality constraint
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];
291 }
292
293 // add inequality constraint
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);
298 int x_sign = 1;
299 int y_sign = 1;
300 double normalized_angle = fmod(angle, M_PI * 2);
301 if (normalized_angle < 0) {
302 normalized_angle += M_PI * 2;
303 }
304
305 if (normalized_angle > (M_PI / 2) && normalized_angle < (M_PI * 1.5)) {
306 x_sign = -1;
307 }
308
309 if (normalized_angle >= M_PI) {
310 y_sign = -1;
311 }
312
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;
316 }
317 if (!AddEqualityConstraint(affine_equality, affine_boundary)) {
318 return false;
319 }
320 return AddInequalityConstraint(affine_inequality, affine_inequality_boundary);
321}
322
323// guarantee up to values are joint
325 if (t_knots_.size() < 3) {
326 return false;
327 }
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);
337
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];
341 }
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;
344 }
345 return AddEqualityConstraint(affine_equality, affine_boundary);
346}
347
348// guarantee up to derivative are joint
350 if (t_knots_.size() < 3) {
351 return true;
352 }
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);
357
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) =
369 derivative_t[j];
370 }
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;
375 }
376 return AddEqualityConstraint(affine_equality, affine_boundary);
377}
378
379// guarantee up to second order derivative are joint
381 if (t_knots_.size() < 3) {
382 return true;
383 }
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);
388
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) =
402 derivative_t[j];
403 affine_equality(6 * i + 5, j + index_offset + num_params) =
404 second_derivative_t[j];
405 }
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;
412 }
413 return AddEqualityConstraint(affine_equality, affine_boundary);
414}
415
416// guarantee up to third order derivative are joint
418 if (t_knots_.size() < 3) {
419 return false;
420 }
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);
425
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) =
441 derivative_t[j];
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];
446 }
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;
455 }
456 return AddEqualityConstraint(affine_equality, affine_boundary);
457}
458
463 return inequality_constraint_;
464}
465
467 return equality_constraint_;
468}
469
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())) -
474 1;
475}
476
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);
481 double x_coef = -common::math::sin(common::math::Angle16::from_rad(angle));
483 for (uint32_t i = 0; i < num_params; ++i) {
484 result[i] = x_coef;
485 result[i + num_params] = y_coef;
486 x_coef *= t;
487 y_coef *= t;
488 }
489 return result;
490}
491
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);
496 double x_coef = -common::math::sin(common::math::Angle16::from_rad(angle));
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;
502 }
503 return result;
504}
505
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);
510 double x_coef = -common::math::sin(common::math::Angle16::from_rad(angle));
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);
516 }
517 return result;
518}
519
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);
524 double x_coef = -common::math::sin(common::math::Angle16::from_rad(angle));
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);
530 }
531 return result;
532}
533
534double Spline2dConstraint::SignDistance(const Vec2d& xy_point,
535 const double angle) const {
537 xy_point.x(), xy_point.y(),
540}
541
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;
546 }
547 return result;
548}
549
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;
555 }
556 return result;
557}
558
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);
565 }
566 return result;
567}
568
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);
575 }
576 return result;
577}
578
579} // namespace planning
580} // namespace apollo
Defines the templated Angle class.
static Angle from_rad(const double value)
Constructs an Angle object from an angle in radians (factory).
Definition angle.h:78
Implements a class of 2-dimensional vectors.
Definition vec2d.h:42
bool AddConstraint(const Eigen::MatrixXd &constraint_matrix, const Eigen::MatrixXd &constraint_boundary)
void SetIsEquality(const double is_equality)
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 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)
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)
Planning module main class.
Math-related util functions.
float cos(Angle16 a)
Definition angle.cc:42
float sin(Angle16 a)
Definition angle.cc:25
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.
Definition math_utils.cc:33
class register implement
Definition arena_queue.h:37