26 const size_t horizon,
const double ts,
const Eigen::MatrixXd& ego,
27 const Eigen::MatrixXd& xWS,
const Eigen::MatrixXd& uWS,
28 const Eigen::MatrixXd& l_warm_up,
const Eigen::MatrixXd& n_warm_up,
29 const Eigen::MatrixXd& x0,
const Eigen::MatrixXd& xf,
30 const Eigen::MatrixXd& last_time_u,
const std::vector<double>& XYbounds,
31 const Eigen::MatrixXi& obstacles_edges_num,
const size_t obstacles_num,
32 const Eigen::MatrixXd& obstacles_A,
const Eigen::MatrixXd& obstacles_b,
38 l_warm_up_(l_warm_up),
39 n_warm_up_(n_warm_up),
42 last_time_u_(last_time_u),
44 obstacles_edges_num_(obstacles_edges_num),
45 obstacles_A_(obstacles_A),
46 obstacles_b_(obstacles_b) {
47 ACHECK(horizon < std::numeric_limits<int>::max())
48 <<
"Invalid cast on horizon in open space planner";
49 horizon_ =
static_cast<int>(horizon);
50 ADEBUG <<
"horizon length: " << horizon_;
51 ACHECK(obstacles_num < std::numeric_limits<int>::max())
52 <<
"Invalid cast on obstacles_num in open space planner";
54 obstacles_num_ =
static_cast<int>(obstacles_num);
55 w_ev_ = ego_(1, 0) + ego_(3, 0);
56 l_ev_ = ego_(0, 0) + ego_(2, 0);
57 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
58 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
59 obstacles_edges_sum_ = obstacles_edges_num_.sum();
60 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
61 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
62 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
63 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
64 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
66 state_start_index_ = 0;
67 control_start_index_ = 4 * (horizon_ + 1);
68 time_start_index_ = control_start_index_ + 2 * horizon_;
69 l_start_index_ = time_start_index_ + (horizon_ + 1);
70 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
72 distance_approach_config_ =
74 weight_state_x_ = distance_approach_config_.weight_x();
75 weight_state_y_ = distance_approach_config_.weight_y();
76 weight_state_phi_ = distance_approach_config_.weight_phi();
77 weight_state_v_ = distance_approach_config_.weight_v();
78 weight_input_steer_ = distance_approach_config_.weight_steer();
79 weight_input_a_ = distance_approach_config_.weight_a();
80 weight_rate_steer_ = distance_approach_config_.weight_steer_rate();
81 weight_rate_a_ = distance_approach_config_.weight_a_rate();
82 weight_stitching_steer_ = distance_approach_config_.weight_steer_stitching();
83 weight_stitching_a_ = distance_approach_config_.weight_a_stitching();
84 weight_first_order_time_ =
85 distance_approach_config_.weight_first_order_time();
86 weight_second_order_time_ =
87 distance_approach_config_.weight_second_order_time();
88 min_safety_distance_ = distance_approach_config_.min_safety_distance();
91 max_speed_forward_ = distance_approach_config_.max_speed_forward();
92 max_speed_reverse_ = distance_approach_config_.max_speed_reverse();
93 max_acceleration_forward_ =
94 distance_approach_config_.max_acceleration_forward();
95 max_acceleration_reverse_ =
96 distance_approach_config_.max_acceleration_reverse();
97 min_time_sample_scaling_ =
98 distance_approach_config_.min_time_sample_scaling();
99 max_time_sample_scaling_ =
100 distance_approach_config_.max_time_sample_scaling();
103 use_fix_time_ = distance_approach_config_.use_fix_time();
105 enable_constraint_check_ =
106 distance_approach_config_.enable_constraint_check();
107 enable_jacobian_ad_ = distance_approach_config_.enable_jacobian_ad();
111 int& n,
int& m,
int& nnz_jac_g,
int& nnz_h_lag,
112 IndexStyleEnum& index_style) {
115 int n1 = 4 * (horizon_ + 1);
118 int n2 = 2 * horizon_;
121 int n3 = horizon_ + 1;
129 int m1 = 4 * horizon_;
137 num_of_variables_ = n1 + n2 + n3;
138 num_of_constraints_ = m1 + m2 + m3 + (num_of_variables_ - (horizon_ + 1) + 2);
141 n = num_of_variables_;
142 ADEBUG <<
"num_of_variables_ " << num_of_variables_;
144 m = num_of_constraints_;
145 ADEBUG <<
"num_of_constraints_ " << num_of_constraints_;
149 index_style = IndexStyleEnum::C_STYLE;
154 int n,
double* x_l,
double* x_u,
int m,
double* g_l,
double* g_u) {
155 ADEBUG <<
"get_bounds_info";
156 ACHECK(XYbounds_.size() == 4)
157 <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
162 int variable_index = 0;
163 for (
int i = 0; i < 4; ++i) {
170 for (
int i = 1; i < horizon_; ++i) {
172 x_l[variable_index] = -2e19;
173 x_u[variable_index] = 2e19;
176 x_l[variable_index + 1] = -2e19;
177 x_u[variable_index + 1] = 2e19;
180 x_l[variable_index + 2] = -2e19;
181 x_u[variable_index + 2] = 2e19;
184 x_l[variable_index + 3] = -2e19;
185 x_u[variable_index + 3] = 2e19;
191 for (
int i = 0; i < 4; ++i) {
192 x_l[variable_index + i] = -2e19;
193 x_u[variable_index + i] = 2e19;
196 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
199 for (
int i = 0; i < horizon_; ++i) {
201 x_l[variable_index] = -2e19;
202 x_u[variable_index] = 2e19;
205 x_l[variable_index + 1] = -2e19;
206 x_u[variable_index + 1] = 2e19;
210 ADEBUG <<
"variable_index after adding control variables : "
214 for (
int i = 0; i < horizon_ + 1; ++i) {
215 x_l[variable_index] = -2e19;
216 x_u[variable_index] = 2e19;
219 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
220 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
226 int constraint_index = 0;
227 for (
int i = 0; i < 4 * horizon_; ++i) {
231 constraint_index += 4 * horizon_;
233 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: "
238 for (
int i = 0; i < horizon_; ++i) {
239 g_l[constraint_index] = -max_steer_rate_;
240 g_u[constraint_index] = max_steer_rate_;
244 ADEBUG <<
"constraint_index after adding steering rate constraints: "
248 for (
int i = 0; i < horizon_; ++i) {
249 g_l[constraint_index] = 0.0;
250 g_u[constraint_index] = 0.0;
254 ADEBUG <<
"constraint_index after adding time constraints: "
262 g_l[constraint_index] = x0_(0, 0);
263 g_u[constraint_index] = x0_(0, 0);
264 g_l[constraint_index + 1] = x0_(1, 0);
265 g_u[constraint_index + 1] = x0_(1, 0);
266 g_l[constraint_index + 2] = x0_(2, 0);
267 g_u[constraint_index + 2] = x0_(2, 0);
268 g_l[constraint_index + 3] = x0_(3, 0);
269 g_u[constraint_index + 3] = x0_(3, 0);
270 constraint_index += 4;
272 for (
int i = 1; i < horizon_; ++i) {
273 g_l[constraint_index] = XYbounds_[0];
274 g_u[constraint_index] = XYbounds_[1];
275 g_l[constraint_index + 1] = XYbounds_[2];
276 g_u[constraint_index + 1] = XYbounds_[3];
277 g_l[constraint_index + 2] = -max_speed_reverse_;
278 g_u[constraint_index + 2] = max_speed_forward_;
279 constraint_index += 3;
283 g_l[constraint_index] = xf_(0, 0);
284 g_u[constraint_index] = xf_(0, 0);
285 g_l[constraint_index + 1] = xf_(1, 0);
286 g_u[constraint_index + 1] = xf_(1, 0);
287 g_l[constraint_index + 2] = xf_(2, 0);
288 g_u[constraint_index + 2] = xf_(2, 0);
289 g_l[constraint_index + 3] = xf_(3, 0);
290 g_u[constraint_index + 3] = xf_(3, 0);
291 constraint_index += 4;
293 for (
int i = 0; i < horizon_; ++i) {
294 g_l[constraint_index] = -max_steer_angle_;
295 g_u[constraint_index] = max_steer_angle_;
296 g_l[constraint_index + 1] = -max_acceleration_reverse_;
297 g_u[constraint_index + 1] = max_acceleration_forward_;
298 constraint_index += 2;
301 for (
int i = 0; i < horizon_ + 1; ++i) {
302 if (!use_fix_time_) {
303 g_l[constraint_index] = min_time_sample_scaling_;
304 g_u[constraint_index] = max_time_sample_scaling_;
306 g_l[constraint_index] = 1.0;
307 g_u[constraint_index] = 1.0;
312 ADEBUG <<
"constraint_index after adding obstacles constraints: "
314 ADEBUG <<
"get_bounds_info_ out";
319 int n,
bool init_x,
double* x,
bool init_z,
double* z_L,
double* z_U,
int m,
320 bool init_lambda,
double* lambda) {
321 ADEBUG <<
"get_starting_point";
322 ACHECK(init_x) <<
"Warm start init_x setting failed";
324 CHECK_EQ(horizon_, uWS_.cols());
325 CHECK_EQ(horizon_ + 1, xWS_.cols());
328 for (
int i = 0; i < horizon_ + 1; ++i) {
330 for (
int j = 0; j < 4; ++j) {
331 x[index + j] = xWS_(j, i);
336 for (
int i = 0; i < horizon_; ++i) {
338 x[control_start_index_ + index] = uWS_(0, i);
339 x[control_start_index_ + index + 1] = uWS_(1, i);
343 for (
int i = 0; i < horizon_ + 1; ++i) {
344 x[time_start_index_ + i] =
345 0.5 * (min_time_sample_scaling_ + max_time_sample_scaling_);
356 ADEBUG <<
"get_starting_point out";
371 gradient(
tag_f, n, x, grad_f);
386 int* iRow,
int* jCol,
388 if (values ==
nullptr) {
389 ADEBUG <<
"nnz_jac: " << nnz_jac;
391 for (
int idx = 0; idx < nnz_jac; idx++) {
392 iRow[idx] = rind_g[idx];
393 jCol[idx] = cind_g[idx];
397 sparse_jac(
tag_g, m, n, 1, x, &nnz_jac, &rind_g, &cind_g, &jacval,
399 for (
int idx = 0; idx < nnz_jac; idx++) {
400 values[idx] = jacval[idx];
407 int n,
const double* x,
bool new_x,
int m,
int nele_jac,
int* iRow,
408 int* jCol,
double* values) {
409 AERROR <<
"not ready ATM!";
414 int n,
const double* x,
bool new_x,
double obj_factor,
int m,
415 const double* lambda,
bool new_lambda,
int nele_hess,
int* iRow,
int* jCol,
417 if (values ==
nullptr) {
421 for (
int idx = 0; idx < nnz_L; idx++) {
422 iRow[idx] = rind_L[idx];
423 jCol[idx] = cind_L[idx];
429 obj_lam[0] = obj_factor;
431 for (
int idx = 0; idx < m; idx++) {
432 obj_lam[1 + idx] = lambda[idx];
435 set_param_vec(
tag_L, m + 1, obj_lam);
436 sparse_hess(
tag_L, n, 1,
const_cast<double*
>(x), &nnz_L, &rind_L, &cind_L,
437 &hessval, options_L);
439 for (
int idx = 0; idx < nnz_L; idx++) {
440 values[idx] = hessval[idx];
448 Ipopt::SolverReturn status,
int n,
const double* x,
const double* z_L,
449 const double* z_U,
int m,
const double* g,
const double* lambda,
450 double obj_value,
const Ipopt::IpoptData* ip_data,
451 Ipopt::IpoptCalculatedQuantities* ip_cq) {
452 int state_index = state_start_index_;
453 int control_index = control_start_index_;
454 int time_index = time_start_index_;
455 int dual_l_index = l_start_index_;
456 int dual_n_index = n_start_index_;
459 if (enable_constraint_check_) {
460 ADEBUG <<
"final resolution constraint checking";
468 for (
int i = 0; i < horizon_; ++i) {
469 state_result_(0, i) = x[state_index];
470 state_result_(1, i) = x[state_index + 1];
471 state_result_(2, i) = x[state_index + 2];
472 state_result_(3, i) = x[state_index + 3];
473 control_result_(0, i) = x[control_index];
474 control_result_(1, i) = x[control_index + 1];
475 time_result_(0, i) = ts_ * x[time_index];
476 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
477 dual_l_result_(j, i) = x[dual_l_index + j];
479 for (
int k = 0; k < 4 * obstacles_num_; k++) {
480 dual_n_result_(k, i) = x[dual_n_index + k];
485 dual_l_index += obstacles_edges_sum_;
486 dual_n_index += 4 * obstacles_num_;
488 state_result_(0, 0) = x0_(0, 0);
489 state_result_(1, 0) = x0_(1, 0);
490 state_result_(2, 0) = x0_(2, 0);
491 state_result_(3, 0) = x0_(3, 0);
493 state_result_(0, horizon_) = xf_(0, 0);
494 state_result_(1, horizon_) = xf_(1, 0);
495 state_result_(2, horizon_) = xf_(2, 0);
496 state_result_(3, horizon_) = xf_(3, 0);
498 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
499 dual_l_result_(j, horizon_) = 0.0;
501 for (
int k = 0; k < 4 * obstacles_num_; k++) {
502 dual_n_result_(k, horizon_) = 0.0;
517 Eigen::MatrixXd* state_result, Eigen::MatrixXd* control_result,
518 Eigen::MatrixXd* time_result, Eigen::MatrixXd* dual_l_result,
519 Eigen::MatrixXd* dual_n_result)
const {
520 ADEBUG <<
"get_optimization_results";
521 *state_result = state_result_;
522 *control_result = control_result_;
523 *time_result = time_result_;
524 *dual_l_result = dual_l_result_;
525 *dual_n_result = dual_n_result_;
530 CHECK_EQ(state_result_.cols(), xWS_.cols());
531 CHECK_EQ(state_result_.rows(), xWS_.rows());
532 double state_diff_max = 0.0;
533 for (
int i = 0; i < horizon_ + 1; ++i) {
534 for (
int j = 0; j < 4; ++j) {
536 std::max(std::abs(xWS_(j, i) - state_result_(j, i)), state_diff_max);
541 CHECK_EQ(control_result_.cols(), uWS_.cols());
542 CHECK_EQ(control_result_.rows(), uWS_.rows());
543 double control_diff_max = 0.0;
544 for (
int i = 0; i < horizon_; ++i) {
545 control_diff_max = std::max(std::abs(uWS_(0, i) - control_result_(0, i)),
547 control_diff_max = std::max(std::abs(uWS_(1, i) - control_result_(1, i)),
554 CHECK_EQ(dual_l_result_.cols(), l_warm_up_.cols());
555 CHECK_EQ(dual_l_result_.rows(), l_warm_up_.rows());
556 double l_diff_max = 0.0;
557 for (
int i = 0; i < horizon_ + 1; ++i) {
558 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
559 l_diff_max = std::max(std::abs(l_warm_up_(j, i) - dual_l_result_(j, i)),
565 CHECK_EQ(n_warm_up_.cols(), dual_n_result_.cols());
566 CHECK_EQ(n_warm_up_.rows(), dual_n_result_.rows());
567 double n_diff_max = 0.0;
568 for (
int i = 0; i < horizon_ + 1; ++i) {
569 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
570 n_diff_max = std::max(std::abs(n_warm_up_(j, i) - dual_n_result_(j, i)),
575 ADEBUG <<
"state_diff_max: " << state_diff_max;
576 ADEBUG <<
"control_diff_max: " << control_diff_max;
577 ADEBUG <<
"dual_l_diff_max: " << l_diff_max;
578 ADEBUG <<
"dual_n_diff_max: " << n_diff_max;
590 DCHECK(ts_ != 0) <<
"ts in distance_approach_ is 0";
591 int control_index = control_start_index_;
592 int time_index = time_start_index_;
593 int state_index = state_start_index_;
600 for (
int i = 0; i < horizon_ + 1; ++i) {
601 T x1_diff = x[state_index] - xWS_(0, i);
602 T x2_diff = x[state_index + 1] - xWS_(1, i);
603 T x3_diff = x[state_index + 2] - xWS_(2, i);
604 T x4_abs = x[state_index + 3];
605 *obj_value += weight_state_x_ * x1_diff * x1_diff +
606 weight_state_y_ * x2_diff * x2_diff +
607 weight_state_phi_ * x3_diff * x3_diff +
608 weight_state_v_ * x4_abs * x4_abs;
613 for (
int i = 0; i < horizon_; ++i) {
614 *obj_value += weight_input_steer_ * x[control_index] * x[control_index] +
615 weight_input_a_ * x[control_index + 1] * x[control_index + 1];
620 control_index = control_start_index_;
621 T last_time_steer_rate =
622 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
624 (x[control_index + 1] - last_time_u_(1, 0)) / x[time_index] / ts_;
626 weight_stitching_steer_ * last_time_steer_rate * last_time_steer_rate +
627 weight_stitching_a_ * last_time_a_rate * last_time_a_rate;
631 for (
int i = 0; i < horizon_ - 1; ++i) {
633 (x[control_index + 2] - x[control_index]) / x[time_index] / ts_;
635 (x[control_index + 3] - x[control_index + 1]) / x[time_index] / ts_;
636 *obj_value += weight_rate_steer_ * steering_rate * steering_rate +
637 weight_rate_a_ * a_rate * a_rate;
643 time_index = time_start_index_;
644 for (
int i = 0; i < horizon_ + 1; ++i) {
645 T first_order_penalty = weight_first_order_time_ * x[time_index];
646 T second_order_penalty =
647 weight_second_order_time_ * x[time_index] * x[time_index];
648 *obj_value += first_order_penalty + second_order_penalty;
658 int state_index = state_start_index_;
661 int control_index = control_start_index_;
664 int time_index = time_start_index_;
666 int constraint_index = 0;
669 for (
int i = 0; i < horizon_; ++i) {
671 g[constraint_index] =
674 ts_ * x[time_index] *
675 (x[state_index + 3] +
676 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
677 cos(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
679 tan(x[control_index]) / wheelbase_));
682 g[constraint_index + 1] =
684 (x[state_index + 1] +
685 ts_ * x[time_index] *
686 (x[state_index + 3] +
687 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
688 sin(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
690 tan(x[control_index]) / wheelbase_));
693 g[constraint_index + 2] =
695 (x[state_index + 2] +
696 ts_ * x[time_index] *
697 (x[state_index + 3] +
698 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
699 tan(x[control_index]) / wheelbase_);
702 g[constraint_index + 3] =
704 (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
707 constraint_index += 4;
712 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
718 control_index = control_start_index_;
719 time_index = time_start_index_;
722 g[constraint_index] =
723 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
728 for (
int i = 1; i < horizon_; ++i) {
729 g[constraint_index] =
730 (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
737 time_index = time_start_index_;
738 for (
int i = 0; i < horizon_; ++i) {
739 g[constraint_index] = x[time_index + 1] - x[time_index];
744 ADEBUG <<
"constraint_index after adding time constraints "
750 state_index = state_start_index_;
753 state_index = state_start_index_;
754 control_index = control_start_index_;
755 time_index = time_start_index_;
758 g[constraint_index] = x[state_index];
759 g[constraint_index + 1] = x[state_index + 1];
760 g[constraint_index + 2] = x[state_index + 2];
761 g[constraint_index + 3] = x[state_index + 3];
762 constraint_index += 4;
766 for (
int i = 1; i < horizon_; ++i) {
767 g[constraint_index] = x[state_index];
768 g[constraint_index + 1] = x[state_index + 1];
769 g[constraint_index + 2] = x[state_index + 3];
770 constraint_index += 3;
775 g[constraint_index] = x[state_index];
776 g[constraint_index + 1] = x[state_index + 1];
777 g[constraint_index + 2] = x[state_index + 2];
778 g[constraint_index + 3] = x[state_index + 3];
779 constraint_index += 4;
782 for (
int i = 0; i < horizon_; ++i) {
783 g[constraint_index] = x[control_index];
784 g[constraint_index + 1] = x[control_index + 1];
785 constraint_index += 2;
789 for (
int i = 0; i < horizon_ + 1; ++i) {
790 g[constraint_index] = x[time_index];
795 ADEBUG <<
"constraint_index after adding variable box constraints updated: "
800 int m,
const double* g) {
810 const double delta_v = 1e-4;
811 for (
int idx = 0; idx < n; ++idx) {
812 x_u_tmp[idx] = x_u_tmp[idx] + delta_v;
813 x_l_tmp[idx] = x_l_tmp[idx] - delta_v;
814 if (x[idx] > x_u_tmp[idx] || x[idx] < x_l_tmp[idx]) {
815 AINFO <<
"x idx unfeasible: " << idx <<
", x: " << x[idx]
816 <<
", lower: " << x_l_tmp[idx] <<
", upper: " << x_u_tmp[idx];
821 int m1 = 4 * horizon_;
824 int m2 = m1 + horizon_;
827 int m3 = m2 + horizon_;
837 int m6 = m5 + 3 * (horizon_ - 1);
843 int m8 = m7 + 2 * horizon_;
846 int m9 = m8 + (horizon_ + 1);
854 CHECK_EQ(m9, num_of_constraints_);
856 AINFO <<
"dynamics constatins to: " << m1;
857 AINFO <<
"control rate constraints (only steering) to: " << m2;
858 AINFO <<
"sampling time equality constraints to: " << m3;
859 AINFO <<
"start conf constraints to: " << m5;
860 AINFO <<
"constraints on x,y,v to: " << m6;
861 AINFO <<
"end constraints to: " << m7;
862 AINFO <<
"control bnd to: " << m8;
863 AINFO <<
"time interval constraints to: " << m9;
864 AINFO <<
"total constraints: " << num_of_constraints_;
866 for (
int idx = 0; idx < m; ++idx) {
867 if (g[idx] > g_u_tmp[idx] + delta_v || g[idx] < g_l_tmp[idx] - delta_v) {
868 AINFO <<
"constratins idx unfeasible: " << idx <<
", g: " << g[idx]
869 <<
", lower: " << g_l_tmp[idx] <<
", upper: " << g_u_tmp[idx];
878 std::vector<double> xp(n);
879 std::vector<double> lamp(m);
880 std::vector<double> zl(m);
881 std::vector<double> zu(m);
882 std::vector<adouble> xa(n);
883 std::vector<adouble> g(m);
884 std::vector<double> lam(m);
889 obj_lam =
new double[m + 1];
893 for (
int idx = 0; idx < n; idx++) {
901 for (
int idx = 0; idx < n; idx++) {
905 for (
int idx = 0; idx < m; idx++) {
911 for (
int idx = 0; idx < n; idx++) {
914 for (
int idx = 0; idx < m; idx++) {
919 obj_value *= mkparam(sig);
921 for (
int idx = 0; idx < m; idx++) {
922 obj_value += g[idx] * mkparam(lam[idx]);
936 sparse_jac(
tag_g, m, n, 0, &xp[0], &nnz_jac, &rind_g, &cind_g, &jacval,
938 *nnz_jac_g = nnz_jac;
946 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval,
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 bool enable_initial_final_check
optional DistanceApproachConfig distance_approach_config