27 const Eigen::MatrixXd& ego,
28 const Eigen::MatrixXd& xWS,
29 const Eigen::MatrixXd& uWS,
30 const Eigen::MatrixXd& l_warm_up,
31 const Eigen::MatrixXd& n_warm_up,
32 const Eigen::MatrixXd& x0,
33 const Eigen::MatrixXd& xf,
34 const Eigen::MatrixXd& last_time_u,
35 const std::vector<double>& XYbounds,
36 const Eigen::MatrixXi& obstacles_edges_num,
37 const size_t obstacles_num,
38 const Eigen::MatrixXd& obstacles_A,
39 const Eigen::MatrixXd& obstacles_b,
45 l_warm_up_(l_warm_up),
46 n_warm_up_(n_warm_up),
49 last_time_u_(last_time_u),
51 obstacles_edges_num_(obstacles_edges_num),
52 obstacles_A_(obstacles_A),
53 obstacles_b_(obstacles_b) {
54 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
55 horizon_ =
static_cast<int>(horizon);
56 ADEBUG <<
"horizon length: " << horizon_;
57 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
59 obstacles_num_ =
static_cast<int>(obstacles_num);
60 w_ev_ = ego_(1, 0) + ego_(3, 0);
61 l_ev_ = ego_(0, 0) + ego_(2, 0);
62 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
63 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
64 obstacles_edges_sum_ = obstacles_edges_num_.sum();
65 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
66 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
67 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
68 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
69 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
71 state_start_index_ = 0;
72 control_start_index_ = 4 * (horizon_ + 1);
73 time_start_index_ = control_start_index_ + 2 * horizon_;
74 l_start_index_ = time_start_index_ + (horizon_ + 1);
75 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
78 weight_state_x_ = distance_approach_config_.weight_x();
79 weight_state_y_ = distance_approach_config_.weight_y();
80 weight_state_phi_ = distance_approach_config_.weight_phi();
81 weight_state_v_ = distance_approach_config_.weight_v();
82 weight_input_steer_ = distance_approach_config_.weight_steer();
83 weight_input_a_ = distance_approach_config_.weight_a();
84 weight_rate_steer_ = distance_approach_config_.weight_steer_rate();
85 weight_rate_a_ = distance_approach_config_.weight_a_rate();
86 weight_stitching_steer_ = distance_approach_config_.weight_steer_stitching();
87 weight_stitching_a_ = distance_approach_config_.weight_a_stitching();
88 weight_first_order_time_ = distance_approach_config_.weight_first_order_time();
89 weight_second_order_time_ = distance_approach_config_.weight_second_order_time();
90 min_safety_distance_ = distance_approach_config_.min_safety_distance();
92 max_speed_forward_ = distance_approach_config_.max_speed_forward();
93 max_speed_reverse_ = distance_approach_config_.max_speed_reverse();
94 max_acceleration_forward_ = distance_approach_config_.max_acceleration_forward();
95 max_acceleration_reverse_ = distance_approach_config_.max_acceleration_reverse();
96 min_time_sample_scaling_ = distance_approach_config_.min_time_sample_scaling();
97 max_time_sample_scaling_ = distance_approach_config_.max_time_sample_scaling();
99 use_fix_time_ = distance_approach_config_.use_fix_time();
101 enable_constraint_check_ = distance_approach_config_.enable_constraint_check();
102 enable_jacobian_ad_ = distance_approach_config_.enable_jacobian_ad();
106 const size_t horizon,
108 const Eigen::MatrixXd& ego,
109 const Eigen::MatrixXd& xWS,
110 const Eigen::MatrixXd& uWS,
111 const Eigen::MatrixXd& l_warm_up,
112 const Eigen::MatrixXd& n_warm_up,
113 const Eigen::MatrixXd& x0,
114 const Eigen::MatrixXd& xf,
115 const Eigen::MatrixXd& last_time_u,
116 const std::vector<double>& XYbounds,
117 const Eigen::MatrixXi& obstacles_edges_num,
118 const size_t obstacles_num,
119 const Eigen::MatrixXd& obstacles_A,
120 const Eigen::MatrixXd& obstacles_b,
126 l_warm_up_(l_warm_up),
127 n_warm_up_(n_warm_up),
130 last_time_u_(last_time_u),
132 obstacles_edges_num_(obstacles_edges_num),
133 obstacles_A_(obstacles_A),
134 obstacles_b_(obstacles_b),
135 distance_approach_config_(distance_approach_config) {
136 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
137 horizon_ =
static_cast<int>(horizon);
138 ADEBUG <<
"horizon length: " << horizon_;
139 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
141 obstacles_num_ =
static_cast<int>(obstacles_num);
142 w_ev_ = ego_(1, 0) + ego_(3, 0);
143 l_ev_ = ego_(0, 0) + ego_(2, 0);
144 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
145 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
146 obstacles_edges_sum_ = obstacles_edges_num_.sum();
147 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
148 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
149 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
150 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
151 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
153 state_start_index_ = 0;
154 control_start_index_ = 4 * (horizon_ + 1);
155 time_start_index_ = control_start_index_ + 2 * horizon_;
156 l_start_index_ = time_start_index_ + (horizon_ + 1);
157 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
159 weight_state_x_ = distance_approach_config_.
weight_x();
160 weight_state_y_ = distance_approach_config_.
weight_y();
161 weight_state_phi_ = distance_approach_config_.
weight_phi();
162 weight_state_v_ = distance_approach_config_.
weight_v();
163 weight_input_steer_ = distance_approach_config_.
weight_steer();
164 weight_input_a_ = distance_approach_config_.
weight_a();
180 use_fix_time_ = distance_approach_config_.
use_fix_time();
191 IndexStyleEnum& index_style) {
194 int n1 = 4 * (horizon_ + 1);
197 int n2 = 2 * horizon_;
200 int n3 = horizon_ + 1;
208 int m1 = 4 * horizon_;
216 num_of_variables_ = n1 + n2 + n3;
217 num_of_constraints_ = m1 + m2 + m3 + (num_of_variables_ - (horizon_ + 1) + 2);
220 n = num_of_variables_;
221 ADEBUG <<
"num_of_variables_ " << num_of_variables_;
223 m = num_of_constraints_;
224 ADEBUG <<
"num_of_constraints_ " << num_of_constraints_;
228 index_style = IndexStyleEnum::C_STYLE;
239 ADEBUG <<
"get_bounds_info";
240 ACHECK(XYbounds_.size() == 4) <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
245 int variable_index = 0;
246 for (
int i = 0; i < 4; ++i) {
253 for (
int i = 1; i < horizon_; ++i) {
255 x_l[variable_index] = -2e19;
256 x_u[variable_index] = 2e19;
259 x_l[variable_index + 1] = -2e19;
260 x_u[variable_index + 1] = 2e19;
263 x_l[variable_index + 2] = -2e19;
264 x_u[variable_index + 2] = 2e19;
267 x_l[variable_index + 3] = -2e19;
268 x_u[variable_index + 3] = 2e19;
274 for (
int i = 0; i < 4; ++i) {
275 x_l[variable_index + i] = -2e19;
276 x_u[variable_index + i] = 2e19;
279 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
282 for (
int i = 0; i < horizon_; ++i) {
284 x_l[variable_index] = -2e19;
285 x_u[variable_index] = 2e19;
288 x_l[variable_index + 1] = -2e19;
289 x_u[variable_index + 1] = 2e19;
293 ADEBUG <<
"variable_index after adding control variables : " << variable_index;
296 for (
int i = 0; i < horizon_ + 1; ++i) {
297 x_l[variable_index] = -2e19;
298 x_u[variable_index] = 2e19;
301 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
302 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
308 int constraint_index = 0;
309 for (
int i = 0; i < 4 * horizon_; ++i) {
313 constraint_index += 4 * horizon_;
315 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: " << constraint_index;
319 for (
int i = 0; i < horizon_; ++i) {
320 g_l[constraint_index] = -max_steer_rate_;
321 g_u[constraint_index] = max_steer_rate_;
325 ADEBUG <<
"constraint_index after adding steering rate constraints: " << constraint_index;
328 for (
int i = 0; i < horizon_; ++i) {
329 g_l[constraint_index] = 0.0;
330 g_u[constraint_index] = 0.0;
334 ADEBUG <<
"constraint_index after adding time constraints: " << constraint_index;
341 g_l[constraint_index] = x0_(0, 0);
342 g_u[constraint_index] = x0_(0, 0);
343 g_l[constraint_index + 1] = x0_(1, 0);
344 g_u[constraint_index + 1] = x0_(1, 0);
345 g_l[constraint_index + 2] = x0_(2, 0);
346 g_u[constraint_index + 2] = x0_(2, 0);
347 g_l[constraint_index + 3] = x0_(3, 0);
348 g_u[constraint_index + 3] = x0_(3, 0);
349 constraint_index += 4;
351 for (
int i = 1; i < horizon_; ++i) {
352 g_l[constraint_index] = XYbounds_[0];
353 g_u[constraint_index] = XYbounds_[1];
354 g_l[constraint_index + 1] = XYbounds_[2];
355 g_u[constraint_index + 1] = XYbounds_[3];
356 g_l[constraint_index + 2] = -max_speed_reverse_;
357 g_u[constraint_index + 2] = max_speed_forward_;
358 constraint_index += 3;
362 g_l[constraint_index] = xf_(0, 0);
363 g_u[constraint_index] = xf_(0, 0);
364 g_l[constraint_index + 1] = xf_(1, 0);
365 g_u[constraint_index + 1] = xf_(1, 0);
366 g_l[constraint_index + 2] = xf_(2, 0);
367 g_u[constraint_index + 2] = xf_(2, 0);
368 g_l[constraint_index + 3] = xf_(3, 0);
369 g_u[constraint_index + 3] = xf_(3, 0);
370 constraint_index += 4;
372 for (
int i = 0; i < horizon_; ++i) {
373 g_l[constraint_index] = -max_steer_angle_;
374 g_u[constraint_index] = max_steer_angle_;
375 g_l[constraint_index + 1] = -max_acceleration_reverse_;
376 g_u[constraint_index + 1] = max_acceleration_forward_;
377 constraint_index += 2;
380 for (
int i = 0; i < horizon_ + 1; ++i) {
381 if (!use_fix_time_) {
382 g_l[constraint_index] = min_time_sample_scaling_;
383 g_u[constraint_index] = max_time_sample_scaling_;
385 g_l[constraint_index] = 1.0;
386 g_u[constraint_index] = 1.0;
391 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
392 ADEBUG <<
"get_bounds_info_ out";
406 ADEBUG <<
"get_starting_point";
407 ACHECK(init_x) <<
"Warm start init_x setting failed";
409 CHECK_EQ(horizon_, uWS_.cols());
410 CHECK_EQ(horizon_ + 1, xWS_.cols());
413 for (
int i = 0; i < horizon_ + 1; ++i) {
415 for (
int j = 0; j < 4; ++j) {
416 x[index + j] = xWS_(j, i);
421 for (
int i = 0; i < horizon_; ++i) {
423 x[control_start_index_ + index] = uWS_(0, i);
424 x[control_start_index_ + index + 1] = uWS_(1, i);
428 for (
int i = 0; i < horizon_ + 1; ++i) {
429 x[time_start_index_ + i] = 0.5 * (min_time_sample_scaling_ + max_time_sample_scaling_);
440 ADEBUG <<
"get_starting_point out";
450 gradient(
tag_f, n, x, grad_f);
469 if (values ==
nullptr) {
470 ADEBUG <<
"nnz_jac: " << nnz_jac;
472 for (
int idx = 0; idx < nnz_jac; idx++) {
473 iRow[idx] = rind_g[idx];
474 jCol[idx] = cind_g[idx];
478 sparse_jac(
tag_g, m, n, 1, x, &nnz_jac, &rind_g, &cind_g, &jacval, options_g);
479 for (
int idx = 0; idx < nnz_jac; idx++) {
480 values[idx] = jacval[idx];
495 AERROR <<
"not ready ATM!";
505 const double* lambda,
511 if (values ==
nullptr) {
515 for (
int idx = 0; idx < nnz_L; idx++) {
516 iRow[idx] = rind_L[idx];
517 jCol[idx] = cind_L[idx];
523 obj_lam[0] = obj_factor;
525 for (
int idx = 0; idx < m; idx++) {
526 obj_lam[1 + idx] = lambda[idx];
529 set_param_vec(
tag_L, m + 1, obj_lam);
530 sparse_hess(
tag_L, n, 1,
const_cast<double*
>(x), &nnz_L, &rind_L, &cind_L, &hessval, options_L);
532 for (
int idx = 0; idx < nnz_L; idx++) {
533 values[idx] = hessval[idx];
541 Ipopt::SolverReturn status,
548 const double* lambda,
550 const Ipopt::IpoptData* ip_data,
551 Ipopt::IpoptCalculatedQuantities* ip_cq) {
552 int state_index = state_start_index_;
553 int control_index = control_start_index_;
554 int time_index = time_start_index_;
555 int dual_l_index = l_start_index_;
556 int dual_n_index = n_start_index_;
559 if (enable_constraint_check_) {
560 ADEBUG <<
"final resolution constraint checking";
568 for (
int i = 0; i < horizon_; ++i) {
569 state_result_(0, i) = x[state_index];
570 state_result_(1, i) = x[state_index + 1];
571 state_result_(2, i) = x[state_index + 2];
572 state_result_(3, i) = x[state_index + 3];
573 control_result_(0, i) = x[control_index];
574 control_result_(1, i) = x[control_index + 1];
575 time_result_(0, i) = ts_ * x[time_index];
576 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
577 dual_l_result_(j, i) = x[dual_l_index + j];
579 for (
int k = 0; k < 4 * obstacles_num_; k++) {
580 dual_n_result_(k, i) = x[dual_n_index + k];
585 dual_l_index += obstacles_edges_sum_;
586 dual_n_index += 4 * obstacles_num_;
588 state_result_(0, 0) = x0_(0, 0);
589 state_result_(1, 0) = x0_(1, 0);
590 state_result_(2, 0) = x0_(2, 0);
591 state_result_(3, 0) = x0_(3, 0);
593 state_result_(0, horizon_) = xf_(0, 0);
594 state_result_(1, horizon_) = xf_(1, 0);
595 state_result_(2, horizon_) = xf_(2, 0);
596 state_result_(3, horizon_) = xf_(3, 0);
598 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
599 dual_l_result_(j, horizon_) = 0.0;
601 for (
int k = 0; k < 4 * obstacles_num_; k++) {
602 dual_n_result_(k, horizon_) = 0.0;
617 Eigen::MatrixXd* state_result,
618 Eigen::MatrixXd* control_result,
619 Eigen::MatrixXd* time_result,
620 Eigen::MatrixXd* dual_l_result,
621 Eigen::MatrixXd* dual_n_result)
const {
622 ADEBUG <<
"get_optimization_results";
623 *state_result = state_result_;
624 *control_result = control_result_;
625 *time_result = time_result_;
626 *dual_l_result = dual_l_result_;
627 *dual_n_result = dual_n_result_;
632 CHECK_EQ(state_result_.cols(), xWS_.cols());
633 CHECK_EQ(state_result_.rows(), xWS_.rows());
634 double state_diff_max = 0.0;
635 for (
int i = 0; i < horizon_ + 1; ++i) {
636 for (
int j = 0; j < 4; ++j) {
637 state_diff_max = std::max(std::abs(xWS_(j, i) - state_result_(j, i)), state_diff_max);
642 CHECK_EQ(control_result_.cols(), uWS_.cols());
643 CHECK_EQ(control_result_.rows(), uWS_.rows());
644 double control_diff_max = 0.0;
645 for (
int i = 0; i < horizon_; ++i) {
646 control_diff_max = std::max(std::abs(uWS_(0, i) - control_result_(0, i)), control_diff_max);
647 control_diff_max = std::max(std::abs(uWS_(1, i) - control_result_(1, i)), control_diff_max);
653 CHECK_EQ(dual_l_result_.cols(), l_warm_up_.cols());
654 CHECK_EQ(dual_l_result_.rows(), l_warm_up_.rows());
655 double l_diff_max = 0.0;
656 for (
int i = 0; i < horizon_ + 1; ++i) {
657 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
658 l_diff_max = std::max(std::abs(l_warm_up_(j, i) - dual_l_result_(j, i)), l_diff_max);
663 CHECK_EQ(n_warm_up_.cols(), dual_n_result_.cols());
664 CHECK_EQ(n_warm_up_.rows(), dual_n_result_.rows());
665 double n_diff_max = 0.0;
666 for (
int i = 0; i < horizon_ + 1; ++i) {
667 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
668 n_diff_max = std::max(std::abs(n_warm_up_(j, i) - dual_n_result_(j, i)), n_diff_max);
672 ADEBUG <<
"state_diff_max: " << state_diff_max;
673 ADEBUG <<
"control_diff_max: " << control_diff_max;
674 ADEBUG <<
"dual_l_diff_max: " << l_diff_max;
675 ADEBUG <<
"dual_n_diff_max: " << n_diff_max;
686 DCHECK(ts_ != 0) <<
"ts in distance_approach_ is 0";
687 int control_index = control_start_index_;
688 int time_index = time_start_index_;
689 int state_index = state_start_index_;
696 for (
int i = 0; i < horizon_ + 1; ++i) {
697 T x1_diff = x[state_index] - xWS_(0, i);
698 T x2_diff = x[state_index + 1] - xWS_(1, i);
699 T x3_diff = x[state_index + 2] - xWS_(2, i);
700 T x4_abs = x[state_index + 3];
701 *obj_value += weight_state_x_ * x1_diff * x1_diff + weight_state_y_ * x2_diff * x2_diff
702 + weight_state_phi_ * x3_diff * x3_diff + weight_state_v_ * x4_abs * x4_abs;
707 for (
int i = 0; i < horizon_; ++i) {
708 *obj_value += weight_input_steer_ * x[control_index] * x[control_index]
709 + weight_input_a_ * x[control_index + 1] * x[control_index + 1];
714 control_index = control_start_index_;
715 T last_time_steer_rate = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
716 T last_time_a_rate = (x[control_index + 1] - last_time_u_(1, 0)) / x[time_index] / ts_;
717 *obj_value += weight_stitching_steer_ * last_time_steer_rate * last_time_steer_rate
718 + weight_stitching_a_ * last_time_a_rate * last_time_a_rate;
722 for (
int i = 0; i < horizon_ - 1; ++i) {
723 T steering_rate = (x[control_index + 2] - x[control_index]) / x[time_index] / ts_;
724 T a_rate = (x[control_index + 3] - x[control_index + 1]) / x[time_index] / ts_;
725 *obj_value += weight_rate_steer_ * steering_rate * steering_rate + weight_rate_a_ * a_rate * a_rate;
731 time_index = time_start_index_;
732 for (
int i = 0; i < horizon_ + 1; ++i) {
733 T first_order_penalty = weight_first_order_time_ * x[time_index];
734 T second_order_penalty = weight_second_order_time_ * x[time_index] * x[time_index];
735 *obj_value += first_order_penalty + second_order_penalty;
743 int state_index = state_start_index_;
746 int control_index = control_start_index_;
749 int time_index = time_start_index_;
751 int constraint_index = 0;
754 for (
int i = 0; i < horizon_; ++i) {
756 g[constraint_index] = x[state_index + 4]
758 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
759 * cos(x[state_index + 2]
760 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
764 g[constraint_index + 1] = x[state_index + 5]
765 - (x[state_index + 1]
766 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
767 * sin(x[state_index + 2]
768 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
772 g[constraint_index + 2] = x[state_index + 6]
773 - (x[state_index + 2]
774 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
775 * tan(x[control_index]) / wheelbase_);
778 g[constraint_index + 3]
779 = x[state_index + 7] - (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
782 constraint_index += 4;
787 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
793 control_index = control_start_index_;
794 time_index = time_start_index_;
797 g[constraint_index] = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
802 for (
int i = 1; i < horizon_; ++i) {
803 g[constraint_index] = (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
810 time_index = time_start_index_;
811 for (
int i = 0; i < horizon_; ++i) {
812 g[constraint_index] = x[time_index + 1] - x[time_index];
817 ADEBUG <<
"constraint_index after adding time constraints "
823 state_index = state_start_index_;
826 state_index = state_start_index_;
827 control_index = control_start_index_;
828 time_index = time_start_index_;
831 g[constraint_index] = x[state_index];
832 g[constraint_index + 1] = x[state_index + 1];
833 g[constraint_index + 2] = x[state_index + 2];
834 g[constraint_index + 3] = x[state_index + 3];
835 constraint_index += 4;
839 for (
int i = 1; i < horizon_; ++i) {
840 g[constraint_index] = x[state_index];
841 g[constraint_index + 1] = x[state_index + 1];
842 g[constraint_index + 2] = x[state_index + 3];
843 constraint_index += 3;
848 g[constraint_index] = x[state_index];
849 g[constraint_index + 1] = x[state_index + 1];
850 g[constraint_index + 2] = x[state_index + 2];
851 g[constraint_index + 3] = x[state_index + 3];
852 constraint_index += 4;
855 for (
int i = 0; i < horizon_; ++i) {
856 g[constraint_index] = x[control_index];
857 g[constraint_index + 1] = x[control_index + 1];
858 constraint_index += 2;
862 for (
int i = 0; i < horizon_ + 1; ++i) {
863 g[constraint_index] = x[time_index];
868 ADEBUG <<
"constraint_index after adding variable box constraints updated: " << constraint_index;
881 const double delta_v = 1e-4;
882 for (
int idx = 0; idx < n; ++idx) {
883 x_u_tmp[idx] = x_u_tmp[idx] + delta_v;
884 x_l_tmp[idx] = x_l_tmp[idx] - delta_v;
885 if (x[idx] > x_u_tmp[idx] || x[idx] < x_l_tmp[idx]) {
886 AINFO <<
"x idx unfeasible: " << idx <<
", x: " << x[idx] <<
", lower: " << x_l_tmp[idx]
887 <<
", upper: " << x_u_tmp[idx];
892 int m1 = 4 * horizon_;
895 int m2 = m1 + horizon_;
898 int m3 = m2 + horizon_;
908 int m6 = m5 + 3 * (horizon_ - 1);
914 int m8 = m7 + 2 * horizon_;
917 int m9 = m8 + (horizon_ + 1);
925 CHECK_EQ(m9, num_of_constraints_);
927 AINFO <<
"dynamics constatins to: " << m1;
928 AINFO <<
"control rate constraints (only steering) to: " << m2;
929 AINFO <<
"sampling time equality constraints to: " << m3;
930 AINFO <<
"start conf constraints to: " << m5;
931 AINFO <<
"constraints on x,y,v to: " << m6;
932 AINFO <<
"end constraints to: " << m7;
933 AINFO <<
"control bnd to: " << m8;
934 AINFO <<
"time interval constraints to: " << m9;
935 AINFO <<
"total constraints: " << num_of_constraints_;
937 for (
int idx = 0; idx < m; ++idx) {
938 if (g[idx] > g_u_tmp[idx] + delta_v || g[idx] < g_l_tmp[idx] - delta_v) {
939 AINFO <<
"constratins idx unfeasible: " << idx <<
", g: " << g[idx] <<
", lower: " << g_l_tmp[idx]
940 <<
", upper: " << g_u_tmp[idx];
947 std::vector<double> xp(n);
948 std::vector<double> lamp(m);
949 std::vector<double> zl(m);
950 std::vector<double> zu(m);
951 std::vector<adouble> xa(n);
952 std::vector<adouble> g(m);
953 std::vector<double> lam(m);
958 obj_lam =
new double[m + 1];
962 for (
int idx = 0; idx < n; idx++) {
970 for (
int idx = 0; idx < n; idx++) {
974 for (
int idx = 0; idx < m; idx++) {
980 for (
int idx = 0; idx < n; idx++) {
983 for (
int idx = 0; idx < m; idx++) {
988 obj_value *= mkparam(sig);
990 for (
int idx = 0; idx < m; idx++) {
991 obj_value += g[idx] * mkparam(lam[idx]);
1005 sparse_jac(
tag_g, m, n, 0, &xp[0], &nnz_jac, &rind_g, &cind_g, &jacval, options_g);
1006 *nnz_jac_g = nnz_jac;
1014 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval, options_L);
void finalize_solution(Ipopt::SolverReturn status, int n, const double *x, const double *z_L, const double *z_U, int m, const double *g, const double *lambda, double obj_value, const Ipopt::IpoptData *ip_data, Ipopt::IpoptCalculatedQuantities *ip_cq) override
This method is called when the algorithm is complete so the TNLP can store/write the solution
void get_optimization_results(Eigen::MatrixXd *state_result, Eigen::MatrixXd *control_result, Eigen::MatrixXd *time_result, Eigen::MatrixXd *dual_l_result, Eigen::MatrixXd *dual_n_result) const override
bool eval_h(int n, const double *x, bool new_x, double obj_factor, int m, const double *lambda, bool new_lambda, int nele_hess, int *iRow, int *jCol, double *values) override
Method to return: 1) The structure of the hessian of the lagrangian (if "values" is nullptr) 2) The v...
bool eval_grad_f(int n, const double *x, bool new_x, double *grad_f) override
Method to return the gradient of the objective
bool eval_g(int n, const double *x, bool new_x, int m, double *g) override
Method to return the constraint residuals
bool get_starting_point(int n, bool init_x, double *x, bool init_z, double *z_L, double *z_U, int m, bool init_lambda, double *lambda) override
Method to return the starting point for the algorithm
void eval_obj(int n, const T *x, T *obj_value)
Template to return the objective value
bool eval_f(int n, const double *x, bool new_x, double &obj_value) override
Method to return the objective value
void eval_constraints(int n, const T *x, int m, T *g)
Template to compute constraints
void generate_tapes(int n, int m, int *nnz_jac_g, int *nnz_h_lag)
Method to generate the required tapes by ADOL-C
DistanceApproachIPOPTFixedDualInterface(const size_t horizon, const double ts, const Eigen::MatrixXd &ego, const Eigen::MatrixXd &xWS, const Eigen::MatrixXd &uWS, const Eigen::MatrixXd &l_warm_up, const Eigen::MatrixXd &n_warm_up, const Eigen::MatrixXd &x0, const Eigen::MatrixXd &xf, const Eigen::MatrixXd &last_time_u, const std::vector< double > &XYbounds, const Eigen::MatrixXi &obstacles_edges_num, const size_t obstacles_num, const Eigen::MatrixXd &obstacles_A, const Eigen::MatrixXd &obstacles_b, const PlannerOpenSpaceConfig &planner_open_space_config)
bool eval_jac_g_ser(int n, const double *x, bool new_x, int m, int nele_jac, int *iRow, int *jCol, double *values) override
bool get_bounds_info(int n, double *x_l, double *x_u, int m, double *g_l, double *g_u) override
Method to return the bounds for my problem
bool eval_jac_g(int n, const double *x, bool new_x, int m, int nele_jac, int *iRow, int *jCol, double *values) override
Method to return: 1) The structure of the jacobian (if "values" is nullptr) 2) The values of the jaco...
bool get_nlp_info(int &n, int &m, int &nnz_jac_g, int &nnz_h_lag, IndexStyleEnum &index_style) override
Method to return some info about the nlp
bool check_g(int n, const double *x, int m, const double *g)
Check unfeasible constraints for further study
Planning module main class.
optional double max_steer_angle
optional double steer_ratio
optional double max_steer_angle_rate
optional double wheel_base
optional bool enable_check_initial_state
optional double weight_second_order_time
optional bool use_fix_time
optional double max_speed_forward
optional double weight_first_order_time
optional double min_safety_distance
optional double max_acceleration_forward
optional double max_acceleration_reverse
optional double weight_steer
optional double weight_phi
optional double max_time_sample_scaling
optional bool enable_jacobian_ad
optional bool enable_initial_final_check
optional double min_time_sample_scaling
optional double weight_a_rate
optional bool enable_constraint_check
optional double weight_a_stitching
optional double weight_steer_stitching
optional double weight_steer_rate
optional double max_speed_reverse
optional DistanceApproachConfig distance_approach_config