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 ACHECK(obstacles_num < std::numeric_limits<int>::max())
51 <<
"Invalid cast on obstacles_num in open space planner";
53 obstacles_num_ =
static_cast<int>(obstacles_num);
54 w_ev_ = ego_(1, 0) + ego_(3, 0);
55 l_ev_ = ego_(0, 0) + ego_(2, 0);
56 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
57 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
58 obstacles_edges_sum_ = obstacles_edges_num_.sum();
59 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
60 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
61 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
62 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
63 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
64 state_start_index_ = 0;
65 control_start_index_ = 4 * (horizon_ + 1);
66 time_start_index_ = control_start_index_ + 2 * horizon_;
67 l_start_index_ = time_start_index_ + (horizon_ + 1);
68 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
70 distance_approach_config_ =
72 weight_state_x_ = distance_approach_config_.weight_x();
73 weight_state_y_ = distance_approach_config_.weight_y();
74 weight_state_phi_ = distance_approach_config_.weight_phi();
75 weight_state_v_ = distance_approach_config_.weight_v();
76 weight_input_steer_ = distance_approach_config_.weight_steer();
77 weight_input_a_ = distance_approach_config_.weight_a();
78 weight_rate_steer_ = distance_approach_config_.weight_steer_rate();
79 weight_rate_a_ = distance_approach_config_.weight_a_rate();
80 weight_stitching_steer_ = distance_approach_config_.weight_steer_stitching();
81 weight_stitching_a_ = distance_approach_config_.weight_a_stitching();
82 weight_first_order_time_ =
83 distance_approach_config_.weight_first_order_time();
84 weight_second_order_time_ =
85 distance_approach_config_.weight_second_order_time();
86 weight_end_state_ = distance_approach_config_.weight_end_state();
87 min_safety_distance_ = distance_approach_config_.min_safety_distance();
90 max_speed_forward_ = distance_approach_config_.max_speed_forward();
91 max_speed_reverse_ = distance_approach_config_.max_speed_reverse();
92 max_acceleration_forward_ =
93 distance_approach_config_.max_acceleration_forward();
94 max_acceleration_reverse_ =
95 distance_approach_config_.max_acceleration_reverse();
96 min_time_sample_scaling_ =
97 distance_approach_config_.min_time_sample_scaling();
98 max_time_sample_scaling_ =
99 distance_approach_config_.max_time_sample_scaling();
102 use_fix_time_ = distance_approach_config_.use_fix_time();
104 enable_constraint_check_ =
105 distance_approach_config_.enable_constraint_check();
106 enable_jacobian_ad_ =
true;
110 int& n,
int& m,
int& nnz_jac_g,
int& nnz_h_lag,
111 IndexStyleEnum& index_style) {
114 int n1 = 4 * (horizon_ + 1);
117 int n2 = 2 * horizon_;
120 int n3 = horizon_ + 1;
123 lambda_horizon_ = obstacles_edges_num_.sum() * (horizon_ + 1);
124 ADEBUG <<
"lambda_horizon_: " << lambda_horizon_;
126 miu_horizon_ = obstacles_num_ * 4 * (horizon_ + 1);
127 ADEBUG <<
"miu_horizon_: " << miu_horizon_;
130 int m1 = 4 * horizon_;
136 int m4 = 4 * obstacles_num_ * (horizon_ + 1);
138 num_of_variables_ = n1 + n2 + n3 + lambda_horizon_ + miu_horizon_;
139 num_of_constraints_ =
140 m1 + m2 + m3 + m4 + (num_of_variables_ - (horizon_ + 1) + 2);
143 n = num_of_variables_;
144 ADEBUG <<
"num_of_variables_ " << num_of_variables_;
146 m = num_of_constraints_;
147 ADEBUG <<
"num_of_constraints_ " << num_of_constraints_;
151 if (!enable_jacobian_ad_) {
153 for (
int i = 0; i < horizon_ + 1; ++i) {
154 for (
int j = 0; j < obstacles_num_; ++j) {
155 int current_edges_num = obstacles_edges_num_(j, 0);
156 tmp += current_edges_num * 4 + 9 + 4;
159 nnz_jac_g = 24 * horizon_ + 3 * horizon_ + 2 * horizon_ + tmp - 1 +
160 (num_of_variables_ - (horizon_ + 1) + 2);
163 index_style = IndexStyleEnum::C_STYLE;
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;
264 int constraint_index = 0;
265 for (
int i = 0; i < 4 * horizon_; ++i) {
269 constraint_index += 4 * horizon_;
271 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: "
276 for (
int i = 0; i < horizon_; ++i) {
277 g_l[constraint_index] = -max_steer_rate_;
278 g_u[constraint_index] = max_steer_rate_;
282 ADEBUG <<
"constraint_index after adding steering rate constraints: "
286 for (
int i = 0; i < horizon_; ++i) {
287 g_l[constraint_index] = 0.0;
288 g_u[constraint_index] = 0.0;
292 ADEBUG <<
"constraint_index after adding time constraints: "
297 for (
int i = 0; i < horizon_ + 1; ++i) {
298 for (
int j = 0; j < obstacles_num_; ++j) {
300 g_l[constraint_index] = -2e19;
301 g_u[constraint_index] = 1.0;
304 g_l[constraint_index + 1] = 0.0;
305 g_u[constraint_index + 1] = 0.0;
306 g_l[constraint_index + 2] = 0.0;
307 g_u[constraint_index + 2] = 0.0;
310 g_l[constraint_index + 3] = min_safety_distance_;
311 g_u[constraint_index + 3] = 2e19;
312 constraint_index += 4;
318 g_l[constraint_index] = x0_(0, 0);
319 g_u[constraint_index] = x0_(0, 0);
320 g_l[constraint_index + 1] = x0_(1, 0);
321 g_u[constraint_index + 1] = x0_(1, 0);
322 g_l[constraint_index + 2] = x0_(2, 0);
323 g_u[constraint_index + 2] = x0_(2, 0);
324 g_l[constraint_index + 3] = x0_(3, 0);
325 g_u[constraint_index + 3] = x0_(3, 0);
326 constraint_index += 4;
328 for (
int i = 1; i < horizon_; ++i) {
329 g_l[constraint_index] = XYbounds_[0];
330 g_u[constraint_index] = XYbounds_[1];
331 g_l[constraint_index + 1] = XYbounds_[2];
332 g_u[constraint_index + 1] = XYbounds_[3];
333 g_l[constraint_index + 2] = -max_speed_reverse_;
334 g_u[constraint_index + 2] = max_speed_forward_;
335 constraint_index += 3;
339 g_l[constraint_index] = -2e19;
340 g_u[constraint_index] = 2e19;
341 g_l[constraint_index + 1] = -2e19;
342 g_u[constraint_index + 1] = 2e19;
343 g_l[constraint_index + 2] = -2e19;
344 g_u[constraint_index + 2] = 2e19;
345 g_l[constraint_index + 3] = -2e19;
346 g_u[constraint_index + 3] = 2e19;
347 constraint_index += 4;
349 for (
int i = 0; i < horizon_; ++i) {
350 g_l[constraint_index] = -max_steer_angle_;
351 g_u[constraint_index] = max_steer_angle_;
352 g_l[constraint_index + 1] = -max_acceleration_reverse_;
353 g_u[constraint_index + 1] = max_acceleration_forward_;
354 constraint_index += 2;
357 for (
int i = 0; i < horizon_ + 1; ++i) {
358 if (!use_fix_time_) {
359 g_l[constraint_index] = min_time_sample_scaling_;
360 g_u[constraint_index] = max_time_sample_scaling_;
362 g_l[constraint_index] = 1.0;
363 g_u[constraint_index] = 1.0;
368 for (
int i = 0; i < lambda_horizon_; ++i) {
369 g_l[constraint_index] = 0.0;
370 g_u[constraint_index] = 2e19;
374 for (
int i = 0; i < miu_horizon_; ++i) {
375 g_l[constraint_index] = 0.0;
376 g_u[constraint_index] = 2e19;
380 ADEBUG <<
"constraint_index after adding obstacles constraints: "
382 ADEBUG <<
"get_bounds_info_ out";
387 int n,
bool init_x,
double* x,
bool init_z,
double* z_L,
double* z_U,
int m,
388 bool init_lambda,
double* lambda) {
389 ADEBUG <<
"get_starting_point";
390 ACHECK(init_x) <<
"Warm start init_x setting failed";
392 CHECK_EQ(horizon_, uWS_.cols());
393 CHECK_EQ(horizon_ + 1, xWS_.cols());
396 for (
int i = 0; i < horizon_ + 1; ++i) {
398 for (
int j = 0; j < 4; ++j) {
399 x[index + j] = xWS_(j, i);
404 for (
int i = 0; i < horizon_; ++i) {
406 x[control_start_index_ + index] = uWS_(0, i);
407 x[control_start_index_ + index + 1] = uWS_(1, i);
411 for (
int i = 0; i < horizon_ + 1; ++i) {
412 x[time_start_index_ + i] =
413 0.5 * (min_time_sample_scaling_ + max_time_sample_scaling_);
417 for (
int i = 0; i < horizon_ + 1; ++i) {
418 int index = i * obstacles_edges_sum_;
419 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
420 x[l_start_index_ + index + j] = l_warm_up_(j, i);
425 for (
int i = 0; i < horizon_ + 1; ++i) {
426 int index = i * 4 * obstacles_num_;
427 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
428 x[n_start_index_ + index + j] = n_warm_up_(j, i);
431 ADEBUG <<
"get_starting_point out";
525 Ipopt::SolverReturn status,
int n,
const double* x,
const double* z_L,
526 const double* z_U,
int m,
const double* g,
const double* lambda,
527 double obj_value,
const Ipopt::IpoptData* ip_data,
528 Ipopt::IpoptCalculatedQuantities* ip_cq) {
529 int state_index = state_start_index_;
530 int control_index = control_start_index_;
531 int time_index = time_start_index_;
532 int dual_l_index = l_start_index_;
533 int dual_n_index = n_start_index_;
536 if (enable_constraint_check_) {
537 ADEBUG <<
"final resolution constraint checking";
545 for (
int i = 0; i < horizon_; ++i) {
546 state_result_(0, i) = x[state_index];
547 state_result_(1, i) = x[state_index + 1];
548 state_result_(2, i) = x[state_index + 2];
549 state_result_(3, i) = x[state_index + 3];
550 control_result_(0, i) = x[control_index];
551 control_result_(1, i) = x[control_index + 1];
552 time_result_(0, i) = ts_ * x[time_index];
553 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
554 dual_l_result_(j, i) = x[dual_l_index + j];
556 for (
int k = 0; k < 4 * obstacles_num_; k++) {
557 dual_n_result_(k, i) = x[dual_n_index + k];
562 dual_l_index += obstacles_edges_sum_;
563 dual_n_index += 4 * obstacles_num_;
565 state_result_(0, 0) = x0_(0, 0);
566 state_result_(1, 0) = x0_(1, 0);
567 state_result_(2, 0) = x0_(2, 0);
568 state_result_(3, 0) = x0_(3, 0);
570 state_result_(0, horizon_) = xf_(0, 0);
571 state_result_(1, horizon_) = xf_(1, 0);
572 state_result_(2, horizon_) = xf_(2, 0);
573 state_result_(3, horizon_) = xf_(3, 0);
575 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
576 dual_l_result_(j, horizon_) = x[dual_l_index + j];
578 for (
int k = 0; k < 4 * obstacles_num_; k++) {
579 dual_n_result_(k, horizon_) = x[dual_n_index + k];
583 if (enable_jacobian_ad_) {
594 Eigen::MatrixXd* state_result, Eigen::MatrixXd* control_result,
595 Eigen::MatrixXd* time_result, Eigen::MatrixXd* dual_l_result,
596 Eigen::MatrixXd* dual_n_result)
const {
597 ADEBUG <<
"get_optimization_results";
598 *state_result = state_result_;
599 *control_result = control_result_;
600 *time_result = time_result_;
601 *dual_l_result = dual_l_result_;
602 *dual_n_result = dual_n_result_;
607 CHECK_EQ(state_result_.cols(), xWS_.cols());
608 CHECK_EQ(state_result_.rows(), xWS_.rows());
609 double state_diff_max = 0.0;
610 for (
int i = 0; i < horizon_ + 1; ++i) {
611 for (
int j = 0; j < 4; ++j) {
613 std::max(std::abs(xWS_(j, i) - state_result_(j, i)), state_diff_max);
618 CHECK_EQ(control_result_.cols(), uWS_.cols());
619 CHECK_EQ(control_result_.rows(), uWS_.rows());
620 double control_diff_max = 0.0;
621 for (
int i = 0; i < horizon_; ++i) {
622 control_diff_max = std::max(std::abs(uWS_(0, i) - control_result_(0, i)),
624 control_diff_max = std::max(std::abs(uWS_(1, i) - control_result_(1, i)),
631 CHECK_EQ(dual_l_result_.cols(), l_warm_up_.cols());
632 CHECK_EQ(dual_l_result_.rows(), l_warm_up_.rows());
633 double l_diff_max = 0.0;
634 for (
int i = 0; i < horizon_ + 1; ++i) {
635 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
636 l_diff_max = std::max(std::abs(l_warm_up_(j, i) - dual_l_result_(j, i)),
642 CHECK_EQ(n_warm_up_.cols(), dual_n_result_.cols());
643 CHECK_EQ(n_warm_up_.rows(), dual_n_result_.rows());
644 double n_diff_max = 0.0;
645 for (
int i = 0; i < horizon_ + 1; ++i) {
646 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
647 n_diff_max = std::max(std::abs(n_warm_up_(j, i) - dual_n_result_(j, i)),
652 ADEBUG <<
"state_diff_max: " << state_diff_max;
653 ADEBUG <<
"control_diff_max: " << control_diff_max;
654 ADEBUG <<
"dual_l_diff_max: " << l_diff_max;
655 ADEBUG <<
"dual_n_diff_max: " << n_diff_max;
667 DCHECK(ts_ != 0) <<
"ts in distance_approach_ is 0";
668 int control_index = control_start_index_;
669 int time_index = time_start_index_;
670 int state_index = state_start_index_;
677 for (
int i = 0; i < horizon_ + 1; ++i) {
678 T x1_diff = x[state_index] - xWS_(0, i);
679 T x2_diff = x[state_index + 1] - xWS_(1, i);
680 T x3_diff = x[state_index + 2] - xWS_(2, i);
681 T x4_abs = x[state_index + 3];
682 *obj_value += weight_state_x_ * x1_diff * x1_diff +
683 weight_state_y_ * x2_diff * x2_diff +
684 weight_state_phi_ * x3_diff * x3_diff +
685 weight_state_v_ * x4_abs * x4_abs;
690 for (
int i = 0; i < horizon_; ++i) {
691 *obj_value += weight_input_steer_ * x[control_index] * x[control_index] +
692 weight_input_a_ * x[control_index + 1] * x[control_index + 1];
697 control_index = control_start_index_;
698 T last_time_steer_rate =
699 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
701 (x[control_index + 1] - last_time_u_(1, 0)) / x[time_index] / ts_;
703 weight_stitching_steer_ * last_time_steer_rate * last_time_steer_rate +
704 weight_stitching_a_ * last_time_a_rate * last_time_a_rate;
708 for (
int i = 0; i < horizon_ - 1; ++i) {
710 (x[control_index + 2] - x[control_index]) / x[time_index] / ts_;
712 (x[control_index + 3] - x[control_index + 1]) / x[time_index] / ts_;
713 *obj_value += weight_rate_steer_ * steering_rate * steering_rate +
714 weight_rate_a_ * a_rate * a_rate;
720 time_index = time_start_index_;
721 for (
int i = 0; i < horizon_ + 1; ++i) {
722 T first_order_penalty = weight_first_order_time_ * x[time_index];
723 T second_order_penalty =
724 weight_second_order_time_ * x[time_index] * x[time_index];
725 *obj_value += first_order_penalty + second_order_penalty;
730 for (
int i = 0; i < 4; ++i) {
731 *obj_value += weight_end_state_ *
732 (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0)) *
733 (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0));
741 int state_index = state_start_index_;
744 int control_index = control_start_index_;
747 int time_index = time_start_index_;
749 int constraint_index = 0;
752 for (
int i = 0; i < horizon_; ++i) {
754 g[constraint_index] =
757 ts_ * x[time_index] *
758 (x[state_index + 3] +
759 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
760 cos(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
762 tan(x[control_index]) / wheelbase_));
765 g[constraint_index + 1] =
767 (x[state_index + 1] +
768 ts_ * x[time_index] *
769 (x[state_index + 3] +
770 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
771 sin(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
773 tan(x[control_index]) / wheelbase_));
776 g[constraint_index + 2] =
778 (x[state_index + 2] +
779 ts_ * x[time_index] *
780 (x[state_index + 3] +
781 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
782 tan(x[control_index]) / wheelbase_);
785 g[constraint_index + 3] =
787 (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
790 constraint_index += 4;
795 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
801 control_index = control_start_index_;
802 time_index = time_start_index_;
805 g[constraint_index] =
806 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
811 for (
int i = 1; i < horizon_; ++i) {
812 g[constraint_index] =
813 (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
820 time_index = time_start_index_;
821 for (
int i = 0; i < horizon_; ++i) {
822 g[constraint_index] = x[time_index + 1] - x[time_index];
827 ADEBUG <<
"constraint_index after adding time constraints "
833 state_index = state_start_index_;
834 int l_index = l_start_index_;
835 int n_index = n_start_index_;
837 for (
int i = 0; i < horizon_ + 1; ++i) {
838 int edges_counter = 0;
839 for (
int j = 0; j < obstacles_num_; ++j) {
840 int current_edges_num = obstacles_edges_num_(j, 0);
842 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
844 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
849 for (
int k = 0; k < current_edges_num; ++k) {
851 tmp1 += Aj(k, 0) * x[l_index + k];
852 tmp2 += Aj(k, 1) * x[l_index + k];
854 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
857 g[constraint_index + 1] = x[n_index] - x[n_index + 2] +
858 cos(x[state_index + 2]) * tmp1 +
859 sin(x[state_index + 2]) * tmp2;
861 g[constraint_index + 2] = x[n_index + 1] - x[n_index + 3] -
862 sin(x[state_index + 2]) * tmp1 +
863 cos(x[state_index + 2]) * tmp2;
867 for (
int k = 0; k < 4; ++k) {
868 tmp3 += -g_[k] * x[n_index + k];
872 for (
int k = 0; k < current_edges_num; ++k) {
873 tmp4 += bj(k, 0) * x[l_index + k];
876 g[constraint_index + 3] =
877 tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1 +
878 (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 -
882 edges_counter += current_edges_num;
883 l_index += current_edges_num;
885 constraint_index += 4;
889 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
894 state_index = state_start_index_;
895 control_index = control_start_index_;
896 time_index = time_start_index_;
897 l_index = l_start_index_;
898 n_index = n_start_index_;
901 g[constraint_index] = x[state_index];
902 g[constraint_index + 1] = x[state_index + 1];
903 g[constraint_index + 2] = x[state_index + 2];
904 g[constraint_index + 3] = x[state_index + 3];
905 constraint_index += 4;
909 for (
int i = 1; i < horizon_; ++i) {
910 g[constraint_index] = x[state_index];
911 g[constraint_index + 1] = x[state_index + 1];
912 g[constraint_index + 2] = x[state_index + 3];
913 constraint_index += 3;
918 g[constraint_index] = x[state_index];
919 g[constraint_index + 1] = x[state_index + 1];
920 g[constraint_index + 2] = x[state_index + 2];
921 g[constraint_index + 3] = x[state_index + 3];
922 constraint_index += 4;
925 for (
int i = 0; i < horizon_; ++i) {
926 g[constraint_index] = x[control_index];
927 g[constraint_index + 1] = x[control_index + 1];
928 constraint_index += 2;
932 for (
int i = 0; i < horizon_ + 1; ++i) {
933 g[constraint_index] = x[time_index];
938 for (
int i = 0; i < lambda_horizon_; ++i) {
939 g[constraint_index] = x[l_index];
944 for (
int i = 0; i < miu_horizon_; ++i) {
945 g[constraint_index] = x[n_index];
952 int m,
const double* g) {
962 const double delta_v = 1e-4;
963 for (
int idx = 0; idx < n; ++idx) {
964 x_u_tmp[idx] = x_u_tmp[idx] + delta_v;
965 x_l_tmp[idx] = x_l_tmp[idx] - delta_v;
966 if (x[idx] > x_u_tmp[idx] || x[idx] < x_l_tmp[idx]) {
967 AINFO <<
"x idx unfeasible: " << idx <<
", x: " << x[idx]
968 <<
", lower: " << x_l_tmp[idx] <<
", upper: " << x_u_tmp[idx];
973 int m1 = 4 * horizon_;
976 int m2 = m1 + horizon_;
979 int m3 = m2 + horizon_;
982 int m4 = m3 + 4 * obstacles_num_ * (horizon_ + 1);
989 int m6 = m5 + 3 * (horizon_ - 1);
995 int m8 = m7 + 2 * horizon_;
998 int m9 = m8 + (horizon_ + 1);
1001 int m10 = m9 + lambda_horizon_;
1004 int m11 = m10 + miu_horizon_;
1006 CHECK_EQ(m11, num_of_constraints_);
1008 AINFO <<
"dynamics constatins to: " << m1;
1009 AINFO <<
"control rate constraints (only steering) to: " << m2;
1010 AINFO <<
"sampling time equality constraints to: " << m3;
1011 AINFO <<
"obstacle constraints to: " << m4;
1012 AINFO <<
"start conf constraints to: " << m5;
1013 AINFO <<
"constraints on x,y,v to: " << m6;
1014 AINFO <<
"end constraints to: " << m7;
1015 AINFO <<
"control bnd to: " << m8;
1016 AINFO <<
"time interval constraints to: " << m9;
1017 AINFO <<
"lambda constraints to: " << m10;
1018 AINFO <<
"miu constraints to: " << m11;
1019 AINFO <<
"total constraints: " << num_of_constraints_;
1021 for (
int idx = 0; idx < m; ++idx) {
1022 if (g[idx] > g_u_tmp[idx] + delta_v || g[idx] < g_l_tmp[idx] - delta_v) {
1023 AINFO <<
"constratins idx unfeasible: " << idx <<
", g: " << g[idx]
1024 <<
", lower: " << g_l_tmp[idx] <<
", upper: " << g_u_tmp[idx];
1033 std::vector<double> xp(n);
1034 std::vector<double> lamp(m);
1035 std::vector<double> zl(m);
1036 std::vector<double> zu(m);
1037 std::vector<adouble> xa(n);
1038 std::vector<adouble> g(m);
1039 std::vector<double> lam(m);
1044 obj_lam =
new double[m + 1];
1048 for (
int idx = 0; idx < n; idx++) {
1049 xa[idx] <<= xp[idx];
1052 obj_value >>= dummy;
1056 for (
int idx = 0; idx < n; idx++) {
1057 xa[idx] <<= xp[idx];
1060 for (
int idx = 0; idx < m; idx++) {
1066 for (
int idx = 0; idx < n; idx++) {
1067 xa[idx] <<= xp[idx];
1069 for (
int idx = 0; idx < m; idx++) {
1074 obj_value *= mkparam(sig);
1076 for (
int idx = 0; idx < m; idx++) {
1077 obj_value += g[idx] * mkparam(lam[idx]);
1079 obj_value >>= dummy;
1083 if (enable_jacobian_ad_) {
1092 sparse_jac(
tag_g, m, n, 0, &xp[0], &nnz_jac, &rind_g, &cind_g, &jacval,
1094 *nnz_jac_g = nnz_jac;
1103 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval,