27 const size_t horizon,
const double ts,
const Eigen::MatrixXd& ego,
28 const Eigen::MatrixXd& xWS,
const Eigen::MatrixXd& uWS,
29 const Eigen::MatrixXd& l_warm_up,
const Eigen::MatrixXd& n_warm_up,
30 const Eigen::MatrixXd& s_warm_up,
const Eigen::MatrixXd& x0,
31 const Eigen::MatrixXd& xf,
const Eigen::MatrixXd& last_time_u,
32 const std::vector<double>& XYbounds,
33 const Eigen::MatrixXi& obstacles_edges_num,
const size_t obstacles_num,
34 const Eigen::MatrixXd& obstacles_A,
const Eigen::MatrixXd& obstacles_b,
40 l_warm_up_(l_warm_up),
41 n_warm_up_(n_warm_up),
42 slack_warm_up_(s_warm_up),
45 last_time_u_(last_time_u),
47 obstacles_edges_num_(obstacles_edges_num),
48 obstacles_A_(obstacles_A),
49 obstacles_b_(obstacles_b) {
50 ACHECK(horizon < std::numeric_limits<int>::max())
51 <<
"Invalid cast on horizon in open space planner";
52 horizon_ =
static_cast<int>(horizon);
53 ACHECK(obstacles_num < std::numeric_limits<int>::max())
54 <<
"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 slack_result_ = Eigen::MatrixXd::Zero(obstacles_num_, horizon_ + 1);
69 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
70 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
72 state_start_index_ = 0;
73 control_start_index_ = 4 * (horizon_ + 1);
74 time_start_index_ = control_start_index_ + 2 * horizon_;
75 l_start_index_ = time_start_index_ + (horizon_ + 1);
76 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
77 slack_index_ = n_start_index_ + 4 * obstacles_num_ * (horizon_ + 1);
79 distance_approach_config_ =
81 weight_state_x_ = distance_approach_config_.weight_x();
82 weight_state_y_ = distance_approach_config_.weight_y();
83 weight_state_phi_ = distance_approach_config_.weight_phi();
84 weight_state_v_ = distance_approach_config_.weight_v();
85 weight_input_steer_ = distance_approach_config_.weight_steer();
86 weight_input_a_ = distance_approach_config_.weight_a();
87 weight_rate_steer_ = distance_approach_config_.weight_steer_rate();
88 weight_rate_a_ = distance_approach_config_.weight_a_rate();
89 weight_stitching_steer_ = distance_approach_config_.weight_steer_stitching();
90 weight_stitching_a_ = distance_approach_config_.weight_a_stitching();
91 weight_first_order_time_ =
92 distance_approach_config_.weight_first_order_time();
93 weight_second_order_time_ =
94 distance_approach_config_.weight_second_order_time();
95 weight_end_state_ = distance_approach_config_.weight_end_state();
96 weight_slack_ = distance_approach_config_.weight_slack();
98 min_safety_distance_ = distance_approach_config_.min_safety_distance();
101 max_speed_forward_ = distance_approach_config_.max_speed_forward();
102 max_speed_reverse_ = distance_approach_config_.max_speed_reverse();
103 max_acceleration_forward_ =
104 distance_approach_config_.max_acceleration_forward();
105 max_acceleration_reverse_ =
106 distance_approach_config_.max_acceleration_reverse();
107 min_time_sample_scaling_ =
108 distance_approach_config_.min_time_sample_scaling();
109 max_time_sample_scaling_ =
110 distance_approach_config_.max_time_sample_scaling();
113 use_fix_time_ = distance_approach_config_.use_fix_time();
115 enable_constraint_check_ =
116 distance_approach_config_.enable_constraint_check();
117 enable_jacobian_ad_ =
true;
170 int n,
double* x_l,
double* x_u,
int m,
double* g_l,
double* g_u) {
171 ADEBUG <<
"get_bounds_info";
172 ACHECK(XYbounds_.size() == 4)
173 <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
178 int variable_index = 0;
179 for (
int i = 0; i < 4; ++i) {
186 for (
int i = 1; i < horizon_; ++i) {
188 x_l[variable_index] = -2e19;
189 x_u[variable_index] = 2e19;
192 x_l[variable_index + 1] = -2e19;
193 x_u[variable_index + 1] = 2e19;
196 x_l[variable_index + 2] = -2e19;
197 x_u[variable_index + 2] = 2e19;
200 x_l[variable_index + 3] = -2e19;
201 x_u[variable_index + 3] = 2e19;
207 for (
int i = 0; i < 4; ++i) {
208 x_l[variable_index + i] = -2e19;
209 x_u[variable_index + i] = 2e19;
212 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
215 for (
int i = 0; i < horizon_; ++i) {
217 x_l[variable_index] = -2e19;
218 x_u[variable_index] = 2e19;
221 x_l[variable_index + 1] = -2e19;
222 x_u[variable_index + 1] = 2e19;
226 ADEBUG <<
"variable_index after adding control variables : "
230 for (
int i = 0; i < horizon_ + 1; ++i) {
231 x_l[variable_index] = -2e19;
232 x_u[variable_index] = 2e19;
235 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
236 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
240 for (
int i = 0; i < horizon_ + 1; ++i) {
241 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
242 x_l[variable_index] = 0.0;
243 x_u[variable_index] = 2e19;
247 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
250 for (
int i = 0; i < horizon_ + 1; ++i) {
251 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
252 x_l[variable_index] = 0.0;
253 x_u[variable_index] = 2e19;
258 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
261 for (
int i = 0; i < horizon_ + 1; ++i) {
262 for (
int j = 0; j < obstacles_num_; ++j) {
263 x_l[variable_index] = 0.0;
264 x_u[variable_index] = 2e19;
268 ADEBUG <<
"variable_index after adding slack s: " << variable_index;
274 int constraint_index = 0;
275 for (
int i = 0; i < 4 * horizon_; ++i) {
279 constraint_index += 4 * horizon_;
281 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: "
286 for (
int i = 0; i < horizon_; ++i) {
287 g_l[constraint_index] = -max_steer_rate_;
288 g_u[constraint_index] = max_steer_rate_;
292 ADEBUG <<
"constraint_index after adding steering rate constraints: "
296 for (
int i = 0; i < horizon_; ++i) {
297 g_l[constraint_index] = 0.0;
298 g_u[constraint_index] = 0.0;
302 ADEBUG <<
"constraint_index after adding time constraints: "
307 for (
int i = 0; i < horizon_ + 1; ++i) {
308 for (
int j = 0; j < obstacles_num_; ++j) {
310 g_l[constraint_index] = -2e19;
311 g_u[constraint_index] = 1.0;
314 g_l[constraint_index + 1] = 0.0;
315 g_u[constraint_index + 1] = 0.0;
316 g_l[constraint_index + 2] = 0.0;
317 g_u[constraint_index + 2] = 0.0;
320 g_l[constraint_index + 3] = 0.0;
321 g_u[constraint_index + 3] = 2e19;
322 constraint_index += 4;
328 g_l[constraint_index] = x0_(0, 0);
329 g_u[constraint_index] = x0_(0, 0);
330 g_l[constraint_index + 1] = x0_(1, 0);
331 g_u[constraint_index + 1] = x0_(1, 0);
332 g_l[constraint_index + 2] = x0_(2, 0);
333 g_u[constraint_index + 2] = x0_(2, 0);
334 g_l[constraint_index + 3] = x0_(3, 0);
335 g_u[constraint_index + 3] = x0_(3, 0);
336 constraint_index += 4;
338 for (
int i = 1; i < horizon_; ++i) {
339 g_l[constraint_index] = XYbounds_[0];
340 g_u[constraint_index] = XYbounds_[1];
341 g_l[constraint_index + 1] = XYbounds_[2];
342 g_u[constraint_index + 1] = XYbounds_[3];
343 g_l[constraint_index + 2] = -max_speed_reverse_;
344 g_u[constraint_index + 2] = max_speed_forward_;
345 constraint_index += 3;
349 g_l[constraint_index] = -2e19;
350 g_u[constraint_index] = 2e19;
351 g_l[constraint_index + 1] = -2e19;
352 g_u[constraint_index + 1] = 2e19;
353 g_l[constraint_index + 2] = -2e19;
354 g_u[constraint_index + 2] = 2e19;
355 g_l[constraint_index + 3] = -2e19;
356 g_u[constraint_index + 3] = 2e19;
357 constraint_index += 4;
359 for (
int i = 0; i < horizon_; ++i) {
360 g_l[constraint_index] = -max_steer_angle_;
361 g_u[constraint_index] = max_steer_angle_;
362 g_l[constraint_index + 1] = -max_acceleration_reverse_;
363 g_u[constraint_index + 1] = max_acceleration_forward_;
364 constraint_index += 2;
367 for (
int i = 0; i < horizon_ + 1; ++i) {
368 if (!use_fix_time_) {
369 g_l[constraint_index] = min_time_sample_scaling_;
370 g_u[constraint_index] = max_time_sample_scaling_;
372 g_l[constraint_index] = 1.0;
373 g_u[constraint_index] = 1.0;
378 for (
int i = 0; i < lambda_horizon_; ++i) {
379 g_l[constraint_index] = 0.0;
380 g_u[constraint_index] = 2e19;
384 for (
int i = 0; i < miu_horizon_; ++i) {
385 g_l[constraint_index] = 0.0;
386 g_u[constraint_index] = 2e19;
390 for (
int i = 0; i < slack_horizon_; ++i) {
391 g_l[constraint_index] = 0.0;
392 g_u[constraint_index] = 2e19;
396 ADEBUG <<
"constraint_index after adding obstacles constraints: "
398 ADEBUG <<
"get_bounds_info_ out";
403 int n,
bool init_x,
double* x,
bool init_z,
double* z_L,
double* z_U,
int m,
404 bool init_lambda,
double* lambda) {
405 ADEBUG <<
"get_starting_point";
406 ACHECK(init_x) <<
"Warm start init_x setting failed";
408 CHECK_EQ(horizon_, uWS_.cols());
409 CHECK_EQ(horizon_ + 1, xWS_.cols());
412 for (
int i = 0; i < horizon_ + 1; ++i) {
414 for (
int j = 0; j < 4; ++j) {
415 x[index + j] = xWS_(j, i);
420 for (
int i = 0; i < horizon_; ++i) {
422 x[control_start_index_ + index] = uWS_(0, i);
423 x[control_start_index_ + index + 1] = uWS_(1, i);
427 for (
int i = 0; i < horizon_ + 1; ++i) {
428 x[time_start_index_ + i] =
429 0.5 * (min_time_sample_scaling_ + max_time_sample_scaling_);
433 for (
int i = 0; i < horizon_ + 1; ++i) {
434 int index = i * obstacles_edges_sum_;
435 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
436 x[l_start_index_ + index + j] = l_warm_up_(j, i);
441 for (
int i = 0; i < horizon_ + 1; ++i) {
442 int index = i * 4 * obstacles_num_;
443 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
444 x[n_start_index_ + index + j] = n_warm_up_(j, i);
449 for (
int i = 0; i < horizon_ + 1; ++i) {
450 int index = i * obstacles_num_;
451 for (
int j = 0; j < obstacles_num_; ++j) {
452 x[slack_index_ + index + j] = slack_warm_up_(j, i);
456 ADEBUG <<
"get_starting_point out";
549 Ipopt::SolverReturn status,
int n,
const double* x,
const double* z_L,
550 const double* z_U,
int m,
const double* g,
const double* lambda,
551 double obj_value,
const Ipopt::IpoptData* ip_data,
552 Ipopt::IpoptCalculatedQuantities* ip_cq) {
553 int state_index = state_start_index_;
554 int control_index = control_start_index_;
555 int time_index = time_start_index_;
556 int dual_l_index = l_start_index_;
557 int dual_n_index = n_start_index_;
558 int slack_index = slack_index_;
561 if (enable_constraint_check_) {
562 ADEBUG <<
"final resolution constraint checking";
571 for (
int i = 0; i < horizon_; ++i) {
572 state_result_(0, i) = x[state_index];
573 state_result_(1, i) = x[state_index + 1];
574 state_result_(2, i) = x[state_index + 2];
575 state_result_(3, i) = x[state_index + 3];
576 control_result_(0, i) = x[control_index];
577 control_result_(1, i) = x[control_index + 1];
578 time_result_(0, i) = ts_ * x[time_index];
580 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
581 dual_l_result_(j, i) = x[dual_l_index + j];
583 for (
int k = 0; k < 4 * obstacles_num_; ++k) {
584 dual_n_result_(k, i) = x[dual_n_index + k];
586 for (
int l = 0; l < obstacles_num_; ++l) {
587 slack_result_(l, i) = x[slack_index + l];
593 dual_l_index += obstacles_edges_sum_;
594 dual_n_index += 4 * obstacles_num_;
595 slack_index += obstacles_num_;
597 state_result_(0, 0) = x0_(0, 0);
598 state_result_(1, 0) = x0_(1, 0);
599 state_result_(2, 0) = x0_(2, 0);
600 state_result_(3, 0) = x0_(3, 0);
602 state_result_(0, horizon_) = xf_(0, 0);
603 state_result_(1, horizon_) = xf_(1, 0);
604 state_result_(2, horizon_) = xf_(2, 0);
605 state_result_(3, horizon_) = xf_(3, 0);
607 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
608 dual_l_result_(j, horizon_) = x[dual_l_index + j];
610 for (
int k = 0; k < 4 * obstacles_num_; ++k) {
611 dual_n_result_(k, horizon_) = x[dual_n_index + k];
613 for (
int l = 0; l < obstacles_num_; ++l) {
614 slack_result_(l, horizon_) = x[slack_index + l];
619 if (enable_jacobian_ad_) {
630 Eigen::MatrixXd* state_result, Eigen::MatrixXd* control_result,
631 Eigen::MatrixXd* time_result, Eigen::MatrixXd* dual_l_result,
632 Eigen::MatrixXd* dual_n_result)
const {
634 ADEBUG <<
"get_optimization_results";
635 *state_result = state_result_;
636 *control_result = control_result_;
637 *time_result = time_result_;
638 *dual_l_result = dual_l_result_;
639 *dual_n_result = dual_n_result_;
644 CHECK_EQ(state_result_.cols(), xWS_.cols());
645 CHECK_EQ(state_result_.rows(), xWS_.rows());
646 double state_diff_max = 0.0;
647 for (
int i = 0; i < horizon_ + 1; ++i) {
648 for (
int j = 0; j < 4; ++j) {
650 std::max(std::abs(xWS_(j, i) - state_result_(j, i)), state_diff_max);
655 CHECK_EQ(control_result_.cols(), uWS_.cols());
656 CHECK_EQ(control_result_.rows(), uWS_.rows());
657 double control_diff_max = 0.0;
658 for (
int i = 0; i < horizon_; ++i) {
659 control_diff_max = std::max(std::abs(uWS_(0, i) - control_result_(0, i)),
661 control_diff_max = std::max(std::abs(uWS_(1, i) - control_result_(1, i)),
668 CHECK_EQ(dual_l_result_.cols(), l_warm_up_.cols());
669 CHECK_EQ(dual_l_result_.rows(), l_warm_up_.rows());
670 double l_diff_max = 0.0;
671 for (
int i = 0; i < horizon_ + 1; ++i) {
672 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
673 l_diff_max = std::max(std::abs(l_warm_up_(j, i) - dual_l_result_(j, i)),
679 CHECK_EQ(n_warm_up_.cols(), dual_n_result_.cols());
680 CHECK_EQ(n_warm_up_.rows(), dual_n_result_.rows());
681 double n_diff_max = 0.0;
682 for (
int i = 0; i < horizon_ + 1; ++i) {
683 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
684 n_diff_max = std::max(std::abs(n_warm_up_(j, i) - dual_n_result_(j, i)),
689 ADEBUG <<
"state_diff_max: " << state_diff_max;
690 ADEBUG <<
"control_diff_max: " << control_diff_max;
691 ADEBUG <<
"dual_l_diff_max: " << l_diff_max;
692 ADEBUG <<
"dual_n_diff_max: " << n_diff_max;
704 DCHECK(ts_ != 0) <<
"ts in distance_approach_ is 0";
705 int control_index = control_start_index_;
706 int time_index = time_start_index_;
707 int state_index = state_start_index_;
714 for (
int i = 0; i < horizon_ + 1; ++i) {
715 T x1_diff = x[state_index] - xWS_(0, i);
716 T x2_diff = x[state_index + 1] - xWS_(1, i);
717 T x3_diff = x[state_index + 2] - xWS_(2, i);
718 T x4_abs = x[state_index + 3];
719 *obj_value += weight_state_x_ * x1_diff * x1_diff +
720 weight_state_y_ * x2_diff * x2_diff +
721 weight_state_phi_ * x3_diff * x3_diff +
722 weight_state_v_ * x4_abs * x4_abs;
727 for (
int i = 0; i < horizon_; ++i) {
728 *obj_value += weight_input_steer_ * x[control_index] * x[control_index] +
729 weight_input_a_ * x[control_index + 1] * x[control_index + 1];
734 control_index = control_start_index_;
735 T last_time_steer_rate =
736 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
738 (x[control_index + 1] - last_time_u_(1, 0)) / x[time_index] / ts_;
740 weight_stitching_steer_ * last_time_steer_rate * last_time_steer_rate +
741 weight_stitching_a_ * last_time_a_rate * last_time_a_rate;
745 for (
int i = 0; i < horizon_ - 1; ++i) {
747 (x[control_index + 2] - x[control_index]) / x[time_index] / ts_;
749 (x[control_index + 3] - x[control_index + 1]) / x[time_index] / ts_;
750 *obj_value += weight_rate_steer_ * steering_rate * steering_rate +
751 weight_rate_a_ * a_rate * a_rate;
757 time_index = time_start_index_;
758 for (
int i = 0; i < horizon_ + 1; ++i) {
759 T first_order_penalty = weight_first_order_time_ * x[time_index];
760 T second_order_penalty =
761 weight_second_order_time_ * x[time_index] * x[time_index];
762 *obj_value += first_order_penalty + second_order_penalty;
767 for (
int i = 0; i < 4; ++i) {
768 *obj_value += weight_end_state_ *
769 (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0)) *
770 (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0));
774 for (
int i = 0; i < slack_horizon_; ++i) {
775 *obj_value += weight_slack_ * x[slack_index_ + i];
785 int state_index = state_start_index_;
788 int control_index = control_start_index_;
791 int time_index = time_start_index_;
793 int constraint_index = 0;
796 for (
int i = 0; i < horizon_; ++i) {
798 g[constraint_index] =
801 ts_ * x[time_index] *
802 (x[state_index + 3] +
803 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
804 cos(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
806 tan(x[control_index]) / wheelbase_));
809 g[constraint_index + 1] =
811 (x[state_index + 1] +
812 ts_ * x[time_index] *
813 (x[state_index + 3] +
814 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
815 sin(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
817 tan(x[control_index]) / wheelbase_));
820 g[constraint_index + 2] =
822 (x[state_index + 2] +
823 ts_ * x[time_index] *
824 (x[state_index + 3] +
825 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
826 tan(x[control_index]) / wheelbase_);
829 g[constraint_index + 3] =
831 (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
834 constraint_index += 4;
839 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
845 control_index = control_start_index_;
846 time_index = time_start_index_;
849 g[constraint_index] =
850 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
855 for (
int i = 1; i < horizon_; ++i) {
856 g[constraint_index] =
857 (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
864 time_index = time_start_index_;
865 for (
int i = 0; i < horizon_; ++i) {
866 g[constraint_index] = x[time_index + 1] - x[time_index];
871 ADEBUG <<
"constraint_index after adding time constraints "
877 state_index = state_start_index_;
878 int l_index = l_start_index_;
879 int n_index = n_start_index_;
880 int s_index = slack_index_;
882 for (
int i = 0; i < horizon_ + 1; ++i) {
883 int edges_counter = 0;
884 for (
int j = 0; j < obstacles_num_; ++j) {
885 int current_edges_num = obstacles_edges_num_(j, 0);
887 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
889 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
894 for (
int k = 0; k < current_edges_num; ++k) {
896 tmp1 += Aj(k, 0) * x[l_index + k];
897 tmp2 += Aj(k, 1) * x[l_index + k];
899 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
902 g[constraint_index + 1] = x[n_index] - x[n_index + 2] +
903 cos(x[state_index + 2]) * tmp1 +
904 sin(x[state_index + 2]) * tmp2;
906 g[constraint_index + 2] = x[n_index + 1] - x[n_index + 3] -
907 sin(x[state_index + 2]) * tmp1 +
908 cos(x[state_index + 2]) * tmp2;
912 for (
int k = 0; k < 4; ++k) {
913 tmp3 += -g_[k] * x[n_index + k];
917 for (
int k = 0; k < current_edges_num; ++k) {
918 tmp4 += bj(k, 0) * x[l_index + k];
921 g[constraint_index + 3] =
922 tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1 +
923 (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 -
927 edges_counter += current_edges_num;
928 l_index += current_edges_num;
930 constraint_index += 4;
935 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
940 state_index = state_start_index_;
941 control_index = control_start_index_;
942 time_index = time_start_index_;
943 l_index = l_start_index_;
944 n_index = n_start_index_;
945 s_index = slack_index_;
948 g[constraint_index] = x[state_index];
949 g[constraint_index + 1] = x[state_index + 1];
950 g[constraint_index + 2] = x[state_index + 2];
951 g[constraint_index + 3] = x[state_index + 3];
952 constraint_index += 4;
956 for (
int i = 1; i < horizon_; ++i) {
957 g[constraint_index] = x[state_index];
958 g[constraint_index + 1] = x[state_index + 1];
959 g[constraint_index + 2] = x[state_index + 3];
960 constraint_index += 3;
965 g[constraint_index] = x[state_index];
966 g[constraint_index + 1] = x[state_index + 1];
967 g[constraint_index + 2] = x[state_index + 2];
968 g[constraint_index + 3] = x[state_index + 3];
969 constraint_index += 4;
972 for (
int i = 0; i < horizon_; ++i) {
973 g[constraint_index] = x[control_index];
974 g[constraint_index + 1] = x[control_index + 1];
975 constraint_index += 2;
979 for (
int i = 0; i < horizon_ + 1; ++i) {
980 g[constraint_index] = x[time_index];
985 for (
int i = 0; i < lambda_horizon_; ++i) {
986 g[constraint_index] = x[l_index];
991 for (
int i = 0; i < miu_horizon_; ++i) {
992 g[constraint_index] = x[n_index];
997 for (
int i = 0; i < slack_horizon_; ++i) {
998 g[constraint_index] = x[s_index];
1017 const double delta_v = 1e-4;
1018 for (
int idx = 0; idx < n; ++idx) {
1019 x_u_tmp[idx] = x_u_tmp[idx] + delta_v;
1020 x_l_tmp[idx] = x_l_tmp[idx] - delta_v;
1021 if (x[idx] > x_u_tmp[idx] || x[idx] < x_l_tmp[idx]) {
1022 AINFO <<
"x idx unfeasible: " << idx <<
", x: " << x[idx]
1023 <<
", lower: " << x_l_tmp[idx] <<
", upper: " << x_u_tmp[idx];
1028 int m1 = 4 * horizon_;
1031 int m2 = m1 + horizon_;
1034 int m3 = m2 + horizon_;
1037 int m4 = m3 + 4 * obstacles_num_ * (horizon_ + 1);
1041 int m5 = m4 + 3 + 1;
1044 int m6 = m5 + 3 * (horizon_ - 1);
1047 int m7 = m6 + 3 + 1;
1050 int m8 = m7 + 2 * horizon_;
1053 int m9 = m8 + (horizon_ + 1);
1056 int m10 = m9 + lambda_horizon_;
1059 int m11 = m10 + miu_horizon_;
1062 int m12 = m11 + slack_horizon_;
1064 CHECK_EQ(m12, num_of_constraints_);
1066 AINFO <<
"dynamics constatins to: " << m1;
1067 AINFO <<
"control rate constraints (only steering) to: " << m2;
1068 AINFO <<
"sampling time equality constraints to: " << m3;
1069 AINFO <<
"obstacle constraints to: " << m4;
1070 AINFO <<
"start conf constraints to: " << m5;
1071 AINFO <<
"constraints on x,y,v to: " << m6;
1072 AINFO <<
"end constraints to: " << m7;
1073 AINFO <<
"control bnd to: " << m8;
1074 AINFO <<
"time interval constraints to: " << m9;
1075 AINFO <<
"lambda constraints to: " << m10;
1076 AINFO <<
"miu constraints to: " << m11;
1077 AINFO <<
"slack constraint to: " << m12;
1078 AINFO <<
"total constraints: " << num_of_constraints_;
1080 for (
int idx = 0; idx < m; ++idx) {
1081 if (g[idx] > g_u_tmp[idx] + delta_v || g[idx] < g_l_tmp[idx] - delta_v) {
1082 AINFO <<
"constratins idx unfeasible: " << idx <<
", g: " << g[idx]
1083 <<
", lower: " << g_l_tmp[idx] <<
", upper: " << g_u_tmp[idx];
1090 int n,
int m,
int* nnz_jac_g,
int* nnz_h_lag) {
1091 std::vector<double> xp(n);
1092 std::vector<double> lamp(m);
1093 std::vector<double> zl(m);
1094 std::vector<double> zu(m);
1095 std::vector<adouble> xa(n);
1096 std::vector<adouble> g(m);
1097 std::vector<double> lam(m);
1102 obj_lam =
new double[m + 1];
1106 for (
int idx = 0; idx < n; idx++) {
1107 xa[idx] <<= xp[idx];
1110 obj_value >>= dummy;
1114 for (
int idx = 0; idx < n; idx++) {
1115 xa[idx] <<= xp[idx];
1118 for (
int idx = 0; idx < m; idx++) {
1124 for (
int idx = 0; idx < n; idx++) {
1125 xa[idx] <<= xp[idx];
1127 for (
int idx = 0; idx < m; idx++) {
1132 obj_value *= mkparam(sig);
1134 for (
int idx = 0; idx < m; idx++) {
1135 obj_value += g[idx] * mkparam(lam[idx]);
1137 obj_value >>= dummy;
1141 if (enable_jacobian_ad_) {
1150 sparse_jac(
tag_g, m, n, 0, &xp[0], &nnz_jac, &rind_g, &cind_g, &jacval,
1152 *nnz_jac_g = nnz_jac;
1161 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval,