28 const Eigen::MatrixXd& ego,
29 const Eigen::MatrixXd& xWS,
30 const Eigen::MatrixXd& uWS,
31 const Eigen::MatrixXd& l_warm_up,
32 const Eigen::MatrixXd& n_warm_up,
33 const Eigen::MatrixXd& x0,
34 const Eigen::MatrixXd& xf,
35 const Eigen::MatrixXd& last_time_u,
36 const std::vector<double>& XYbounds,
37 const Eigen::MatrixXi& obstacles_edges_num,
38 const size_t obstacles_num,
39 const Eigen::MatrixXd& obstacles_A,
40 const Eigen::MatrixXd& obstacles_b,
46 l_warm_up_(l_warm_up),
47 n_warm_up_(n_warm_up),
50 last_time_u_(last_time_u),
52 obstacles_edges_num_(obstacles_edges_num),
53 obstacles_A_(obstacles_A),
54 obstacles_b_(obstacles_b) {
55 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
56 horizon_ =
static_cast<int>(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_);
70 state_start_index_ = 0;
71 control_start_index_ = 4 * (horizon_ + 1);
72 time_start_index_ = control_start_index_ + 2 * horizon_;
73 l_start_index_ = time_start_index_ + (horizon_ + 1);
74 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
77 weight_state_x_ = distance_approach_config_.weight_x();
78 weight_state_y_ = distance_approach_config_.weight_y();
79 weight_state_phi_ = distance_approach_config_.weight_phi();
80 weight_state_v_ = distance_approach_config_.weight_v();
81 weight_input_steer_ = distance_approach_config_.weight_steer();
82 weight_input_a_ = distance_approach_config_.weight_a();
83 weight_rate_steer_ = distance_approach_config_.weight_steer_rate();
84 weight_rate_a_ = distance_approach_config_.weight_a_rate();
85 weight_stitching_steer_ = distance_approach_config_.weight_steer_stitching();
86 weight_stitching_a_ = distance_approach_config_.weight_a_stitching();
87 weight_first_order_time_ = distance_approach_config_.weight_first_order_time();
88 weight_second_order_time_ = distance_approach_config_.weight_second_order_time();
89 weight_end_state_ = distance_approach_config_.weight_end_state();
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_ =
true;
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 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
140 obstacles_num_ =
static_cast<int>(obstacles_num);
141 w_ev_ = ego_(1, 0) + ego_(3, 0);
142 l_ev_ = ego_(0, 0) + ego_(2, 0);
143 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
144 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
145 obstacles_edges_sum_ = obstacles_edges_num_.sum();
146 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
147 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
148 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
149 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
150 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
151 state_start_index_ = 0;
152 control_start_index_ = 4 * (horizon_ + 1);
153 time_start_index_ = control_start_index_ + 2 * horizon_;
154 l_start_index_ = time_start_index_ + (horizon_ + 1);
155 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
157 weight_state_x_ = distance_approach_config_.
weight_x();
158 weight_state_y_ = distance_approach_config_.
weight_y();
159 weight_state_phi_ = distance_approach_config_.
weight_phi();
160 weight_state_v_ = distance_approach_config_.
weight_v();
161 weight_input_steer_ = distance_approach_config_.
weight_steer();
162 weight_input_a_ = distance_approach_config_.
weight_a();
179 use_fix_time_ = distance_approach_config_.
use_fix_time();
182 enable_jacobian_ad_ =
true;
190 IndexStyleEnum& index_style) {
193 int n1 = 4 * (horizon_ + 1);
196 int n2 = 2 * horizon_;
199 int n3 = horizon_ + 1;
202 lambda_horizon_ = obstacles_edges_num_.sum() * (horizon_ + 1);
203 ADEBUG <<
"lambda_horizon_: " << lambda_horizon_;
205 miu_horizon_ = obstacles_num_ * 4 * (horizon_ + 1);
206 ADEBUG <<
"miu_horizon_: " << miu_horizon_;
209 int m1 = 4 * horizon_;
215 int m4 = 4 * obstacles_num_ * (horizon_ + 1);
217 num_of_variables_ = n1 + n2 + n3 + lambda_horizon_ + miu_horizon_;
218 num_of_constraints_ = m1 + m2 + m3 + m4 + (num_of_variables_ - (horizon_ + 1) + 2);
221 n = num_of_variables_;
222 ADEBUG <<
"num_of_variables_ " << num_of_variables_;
224 m = num_of_constraints_;
225 ADEBUG <<
"num_of_constraints_ " << num_of_constraints_;
229 if (!enable_jacobian_ad_) {
231 for (
int i = 0; i < horizon_ + 1; ++i) {
232 for (
int j = 0; j < obstacles_num_; ++j) {
233 int current_edges_num = obstacles_edges_num_(j, 0);
234 tmp += current_edges_num * 4 + 9 + 4;
237 nnz_jac_g = 24 * horizon_ + 3 * horizon_ + 2 * horizon_ + tmp - 1 + (num_of_variables_ - (horizon_ + 1) + 2);
240 index_style = IndexStyleEnum::C_STYLE;
251 ADEBUG <<
"get_bounds_info";
252 ACHECK(XYbounds_.size() == 4) <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
257 int variable_index = 0;
258 for (
int i = 0; i < 4; ++i) {
265 for (
int i = 1; i < horizon_; ++i) {
267 x_l[variable_index] = -2e19;
268 x_u[variable_index] = 2e19;
271 x_l[variable_index + 1] = -2e19;
272 x_u[variable_index + 1] = 2e19;
275 x_l[variable_index + 2] = -2e19;
276 x_u[variable_index + 2] = 2e19;
279 x_l[variable_index + 3] = -2e19;
280 x_u[variable_index + 3] = 2e19;
286 for (
int i = 0; i < 4; ++i) {
287 x_l[variable_index + i] = -2e19;
288 x_u[variable_index + i] = 2e19;
291 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
294 for (
int i = 0; i < horizon_; ++i) {
296 x_l[variable_index] = -2e19;
297 x_u[variable_index] = 2e19;
300 x_l[variable_index + 1] = -2e19;
301 x_u[variable_index + 1] = 2e19;
305 ADEBUG <<
"variable_index after adding control variables : " << variable_index;
308 for (
int i = 0; i < horizon_ + 1; ++i) {
309 x_l[variable_index] = -2e19;
310 x_u[variable_index] = 2e19;
313 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
314 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
318 for (
int i = 0; i < horizon_ + 1; ++i) {
319 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
320 x_l[variable_index] = 0.0;
321 x_u[variable_index] = 2e19;
325 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
328 for (
int i = 0; i < horizon_ + 1; ++i) {
329 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
330 x_l[variable_index] = 0.0;
331 x_u[variable_index] = 2e19;
336 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
342 int constraint_index = 0;
343 for (
int i = 0; i < 4 * horizon_; ++i) {
347 constraint_index += 4 * horizon_;
349 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: " << constraint_index;
353 for (
int i = 0; i < horizon_; ++i) {
354 g_l[constraint_index] = -max_steer_rate_;
355 g_u[constraint_index] = max_steer_rate_;
359 ADEBUG <<
"constraint_index after adding steering rate constraints: " << constraint_index;
362 for (
int i = 0; i < horizon_; ++i) {
363 g_l[constraint_index] = 0.0;
364 g_u[constraint_index] = 0.0;
368 ADEBUG <<
"constraint_index after adding time constraints: " << constraint_index;
372 for (
int i = 0; i < horizon_ + 1; ++i) {
373 for (
int j = 0; j < obstacles_num_; ++j) {
375 g_l[constraint_index] = -2e19;
376 g_u[constraint_index] = 1.0;
379 g_l[constraint_index + 1] = 0.0;
380 g_u[constraint_index + 1] = 0.0;
381 g_l[constraint_index + 2] = 0.0;
382 g_u[constraint_index + 2] = 0.0;
385 g_l[constraint_index + 3] = min_safety_distance_;
386 g_u[constraint_index + 3] = 2e19;
387 constraint_index += 4;
393 g_l[constraint_index] = x0_(0, 0);
394 g_u[constraint_index] = x0_(0, 0);
395 g_l[constraint_index + 1] = x0_(1, 0);
396 g_u[constraint_index + 1] = x0_(1, 0);
397 g_l[constraint_index + 2] = x0_(2, 0);
398 g_u[constraint_index + 2] = x0_(2, 0);
399 g_l[constraint_index + 3] = x0_(3, 0);
400 g_u[constraint_index + 3] = x0_(3, 0);
401 constraint_index += 4;
403 for (
int i = 1; i < horizon_; ++i) {
404 g_l[constraint_index] = XYbounds_[0];
405 g_u[constraint_index] = XYbounds_[1];
406 g_l[constraint_index + 1] = XYbounds_[2];
407 g_u[constraint_index + 1] = XYbounds_[3];
408 g_l[constraint_index + 2] = -max_speed_reverse_;
409 g_u[constraint_index + 2] = max_speed_forward_;
410 constraint_index += 3;
414 g_l[constraint_index] = -2e19;
415 g_u[constraint_index] = 2e19;
416 g_l[constraint_index + 1] = -2e19;
417 g_u[constraint_index + 1] = 2e19;
418 g_l[constraint_index + 2] = -2e19;
419 g_u[constraint_index + 2] = 2e19;
420 g_l[constraint_index + 3] = -2e19;
421 g_u[constraint_index + 3] = 2e19;
422 constraint_index += 4;
424 for (
int i = 0; i < horizon_; ++i) {
425 g_l[constraint_index] = -max_steer_angle_;
426 g_u[constraint_index] = max_steer_angle_;
427 g_l[constraint_index + 1] = -max_acceleration_reverse_;
428 g_u[constraint_index + 1] = max_acceleration_forward_;
429 constraint_index += 2;
432 for (
int i = 0; i < horizon_ + 1; ++i) {
433 if (!use_fix_time_) {
434 g_l[constraint_index] = min_time_sample_scaling_;
435 g_u[constraint_index] = max_time_sample_scaling_;
437 g_l[constraint_index] = 1.0;
438 g_u[constraint_index] = 1.0;
443 for (
int i = 0; i < lambda_horizon_; ++i) {
444 g_l[constraint_index] = 0.0;
445 g_u[constraint_index] = 2e19;
449 for (
int i = 0; i < miu_horizon_; ++i) {
450 g_l[constraint_index] = 0.0;
451 g_u[constraint_index] = 2e19;
455 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
456 ADEBUG <<
"get_bounds_info_ out";
470 ADEBUG <<
"get_starting_point";
471 ACHECK(init_x) <<
"Warm start init_x setting failed";
473 CHECK_EQ(horizon_, uWS_.cols());
474 CHECK_EQ(horizon_ + 1, xWS_.cols());
477 for (
int i = 0; i < horizon_ + 1; ++i) {
479 for (
int j = 0; j < 4; ++j) {
480 x[index + j] = xWS_(j, i);
485 for (
int i = 0; i < horizon_; ++i) {
487 x[control_start_index_ + index] = uWS_(0, i);
488 x[control_start_index_ + index + 1] = uWS_(1, i);
492 for (
int i = 0; i < horizon_ + 1; ++i) {
493 x[time_start_index_ + i] = 0.5 * (min_time_sample_scaling_ + max_time_sample_scaling_);
497 for (
int i = 0; i < horizon_ + 1; ++i) {
498 int index = i * obstacles_edges_sum_;
499 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
500 x[l_start_index_ + index + j] = l_warm_up_(j, i);
505 for (
int i = 0; i < horizon_ + 1; ++i) {
506 int index = i * 4 * obstacles_num_;
507 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
508 x[n_start_index_ + index + j] = n_warm_up_(j, i);
511 ADEBUG <<
"get_starting_point out";
615 Ipopt::SolverReturn status,
622 const double* lambda,
624 const Ipopt::IpoptData* ip_data,
625 Ipopt::IpoptCalculatedQuantities* ip_cq) {
626 int state_index = state_start_index_;
627 int control_index = control_start_index_;
628 int time_index = time_start_index_;
629 int dual_l_index = l_start_index_;
630 int dual_n_index = n_start_index_;
633 if (enable_constraint_check_) {
634 ADEBUG <<
"final resolution constraint checking";
642 for (
int i = 0; i < horizon_; ++i) {
643 state_result_(0, i) = x[state_index];
644 state_result_(1, i) = x[state_index + 1];
645 state_result_(2, i) = x[state_index + 2];
646 state_result_(3, i) = x[state_index + 3];
647 control_result_(0, i) = x[control_index];
648 control_result_(1, i) = x[control_index + 1];
649 time_result_(0, i) = ts_ * x[time_index];
650 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
651 dual_l_result_(j, i) = x[dual_l_index + j];
653 for (
int k = 0; k < 4 * obstacles_num_; k++) {
654 dual_n_result_(k, i) = x[dual_n_index + k];
659 dual_l_index += obstacles_edges_sum_;
660 dual_n_index += 4 * obstacles_num_;
662 state_result_(0, 0) = x0_(0, 0);
663 state_result_(1, 0) = x0_(1, 0);
664 state_result_(2, 0) = x0_(2, 0);
665 state_result_(3, 0) = x0_(3, 0);
667 state_result_(0, horizon_) = xf_(0, 0);
668 state_result_(1, horizon_) = xf_(1, 0);
669 state_result_(2, horizon_) = xf_(2, 0);
670 state_result_(3, horizon_) = xf_(3, 0);
672 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
673 dual_l_result_(j, horizon_) = x[dual_l_index + j];
675 for (
int k = 0; k < 4 * obstacles_num_; k++) {
676 dual_n_result_(k, horizon_) = x[dual_n_index + k];
680 if (enable_jacobian_ad_) {
691 Eigen::MatrixXd* state_result,
692 Eigen::MatrixXd* control_result,
693 Eigen::MatrixXd* time_result,
694 Eigen::MatrixXd* dual_l_result,
695 Eigen::MatrixXd* dual_n_result)
const {
696 ADEBUG <<
"get_optimization_results";
697 *state_result = state_result_;
698 *control_result = control_result_;
699 *time_result = time_result_;
700 *dual_l_result = dual_l_result_;
701 *dual_n_result = dual_n_result_;
706 CHECK_EQ(state_result_.cols(), xWS_.cols());
707 CHECK_EQ(state_result_.rows(), xWS_.rows());
708 double state_diff_max = 0.0;
709 for (
int i = 0; i < horizon_ + 1; ++i) {
710 for (
int j = 0; j < 4; ++j) {
711 state_diff_max = std::max(std::abs(xWS_(j, i) - state_result_(j, i)), state_diff_max);
716 CHECK_EQ(control_result_.cols(), uWS_.cols());
717 CHECK_EQ(control_result_.rows(), uWS_.rows());
718 double control_diff_max = 0.0;
719 for (
int i = 0; i < horizon_; ++i) {
720 control_diff_max = std::max(std::abs(uWS_(0, i) - control_result_(0, i)), control_diff_max);
721 control_diff_max = std::max(std::abs(uWS_(1, i) - control_result_(1, i)), control_diff_max);
727 CHECK_EQ(dual_l_result_.cols(), l_warm_up_.cols());
728 CHECK_EQ(dual_l_result_.rows(), l_warm_up_.rows());
729 double l_diff_max = 0.0;
730 for (
int i = 0; i < horizon_ + 1; ++i) {
731 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
732 l_diff_max = std::max(std::abs(l_warm_up_(j, i) - dual_l_result_(j, i)), l_diff_max);
737 CHECK_EQ(n_warm_up_.cols(), dual_n_result_.cols());
738 CHECK_EQ(n_warm_up_.rows(), dual_n_result_.rows());
739 double n_diff_max = 0.0;
740 for (
int i = 0; i < horizon_ + 1; ++i) {
741 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
742 n_diff_max = std::max(std::abs(n_warm_up_(j, i) - dual_n_result_(j, i)), n_diff_max);
746 ADEBUG <<
"state_diff_max: " << state_diff_max;
747 ADEBUG <<
"control_diff_max: " << control_diff_max;
748 ADEBUG <<
"dual_l_diff_max: " << l_diff_max;
749 ADEBUG <<
"dual_n_diff_max: " << n_diff_max;
760 DCHECK(ts_ != 0) <<
"ts in distance_approach_ is 0";
761 int control_index = control_start_index_;
762 int time_index = time_start_index_;
763 int state_index = state_start_index_;
770 for (
int i = 0; i < horizon_ + 1; ++i) {
771 T x1_diff = x[state_index] - xWS_(0, i);
772 T x2_diff = x[state_index + 1] - xWS_(1, i);
773 T x3_diff = x[state_index + 2] - xWS_(2, i);
774 T x4_abs = x[state_index + 3];
775 *obj_value += weight_state_x_ * x1_diff * x1_diff + weight_state_y_ * x2_diff * x2_diff
776 + weight_state_phi_ * x3_diff * x3_diff + weight_state_v_ * x4_abs * x4_abs;
781 for (
int i = 0; i < horizon_; ++i) {
782 *obj_value += weight_input_steer_ * x[control_index] * x[control_index]
783 + weight_input_a_ * x[control_index + 1] * x[control_index + 1];
788 control_index = control_start_index_;
789 T last_time_steer_rate = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
790 T last_time_a_rate = (x[control_index + 1] - last_time_u_(1, 0)) / x[time_index] / ts_;
791 *obj_value += weight_stitching_steer_ * last_time_steer_rate * last_time_steer_rate
792 + weight_stitching_a_ * last_time_a_rate * last_time_a_rate;
796 for (
int i = 0; i < horizon_ - 1; ++i) {
797 T steering_rate = (x[control_index + 2] - x[control_index]) / x[time_index] / ts_;
798 T a_rate = (x[control_index + 3] - x[control_index + 1]) / x[time_index] / ts_;
799 *obj_value += weight_rate_steer_ * steering_rate * steering_rate + weight_rate_a_ * a_rate * a_rate;
805 time_index = time_start_index_;
806 for (
int i = 0; i < horizon_ + 1; ++i) {
807 T first_order_penalty = weight_first_order_time_ * x[time_index];
808 T second_order_penalty = weight_second_order_time_ * x[time_index] * x[time_index];
809 *obj_value += first_order_penalty + second_order_penalty;
814 for (
int i = 0; i < 4; ++i) {
815 *obj_value += weight_end_state_ * (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0))
816 * (x[state_start_index_ + 4 * horizon_ + i] - xf_(i, 0));
823 int state_index = state_start_index_;
826 int control_index = control_start_index_;
829 int time_index = time_start_index_;
831 int constraint_index = 0;
834 for (
int i = 0; i < horizon_; ++i) {
836 g[constraint_index] = x[state_index + 4]
838 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
839 * cos(x[state_index + 2]
840 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
844 g[constraint_index + 1] = x[state_index + 5]
845 - (x[state_index + 1]
846 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
847 * sin(x[state_index + 2]
848 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
852 g[constraint_index + 2] = x[state_index + 6]
853 - (x[state_index + 2]
854 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
855 * tan(x[control_index]) / wheelbase_);
858 g[constraint_index + 3]
859 = x[state_index + 7] - (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
862 constraint_index += 4;
867 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
873 control_index = control_start_index_;
874 time_index = time_start_index_;
877 g[constraint_index] = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
882 for (
int i = 1; i < horizon_; ++i) {
883 g[constraint_index] = (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
890 time_index = time_start_index_;
891 for (
int i = 0; i < horizon_; ++i) {
892 g[constraint_index] = x[time_index + 1] - x[time_index];
897 ADEBUG <<
"constraint_index after adding time constraints "
903 state_index = state_start_index_;
904 int l_index = l_start_index_;
905 int n_index = n_start_index_;
907 for (
int i = 0; i < horizon_ + 1; ++i) {
908 int edges_counter = 0;
909 for (
int j = 0; j < obstacles_num_; ++j) {
910 int current_edges_num = obstacles_edges_num_(j, 0);
911 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
912 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
917 for (
int k = 0; k < current_edges_num; ++k) {
919 tmp1 += Aj(k, 0) * x[l_index + k];
920 tmp2 += Aj(k, 1) * x[l_index + k];
922 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
925 g[constraint_index + 1]
926 = x[n_index] - x[n_index + 2] + cos(x[state_index + 2]) * tmp1 + sin(x[state_index + 2]) * tmp2;
928 g[constraint_index + 2]
929 = x[n_index + 1] - x[n_index + 3] - sin(x[state_index + 2]) * tmp1 + cos(x[state_index + 2]) * tmp2;
933 for (
int k = 0; k < 4; ++k) {
934 tmp3 += -g_[k] * x[n_index + k];
938 for (
int k = 0; k < current_edges_num; ++k) {
939 tmp4 += bj(k, 0) * x[l_index + k];
942 g[constraint_index + 3] = tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1
943 + (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 - tmp4;
946 edges_counter += current_edges_num;
947 l_index += current_edges_num;
949 constraint_index += 4;
953 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
958 state_index = state_start_index_;
959 control_index = control_start_index_;
960 time_index = time_start_index_;
961 l_index = l_start_index_;
962 n_index = n_start_index_;
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;
973 for (
int i = 1; i < horizon_; ++i) {
974 g[constraint_index] = x[state_index];
975 g[constraint_index + 1] = x[state_index + 1];
976 g[constraint_index + 2] = x[state_index + 3];
977 constraint_index += 3;
982 g[constraint_index] = x[state_index];
983 g[constraint_index + 1] = x[state_index + 1];
984 g[constraint_index + 2] = x[state_index + 2];
985 g[constraint_index + 3] = x[state_index + 3];
986 constraint_index += 4;
989 for (
int i = 0; i < horizon_; ++i) {
990 g[constraint_index] = x[control_index];
991 g[constraint_index + 1] = x[control_index + 1];
992 constraint_index += 2;
996 for (
int i = 0; i < horizon_ + 1; ++i) {
997 g[constraint_index] = x[time_index];
1002 for (
int i = 0; i < lambda_horizon_; ++i) {
1003 g[constraint_index] = x[l_index];
1008 for (
int i = 0; i < miu_horizon_; ++i) {
1009 g[constraint_index] = x[n_index];
1025 const double delta_v = 1e-4;
1026 for (
int idx = 0; idx < n; ++idx) {
1027 x_u_tmp[idx] = x_u_tmp[idx] + delta_v;
1028 x_l_tmp[idx] = x_l_tmp[idx] - delta_v;
1029 if (x[idx] > x_u_tmp[idx] || x[idx] < x_l_tmp[idx]) {
1030 AINFO <<
"x idx unfeasible: " << idx <<
", x: " << x[idx] <<
", lower: " << x_l_tmp[idx]
1031 <<
", upper: " << x_u_tmp[idx];
1036 int m1 = 4 * horizon_;
1039 int m2 = m1 + horizon_;
1042 int m3 = m2 + horizon_;
1045 int m4 = m3 + 4 * obstacles_num_ * (horizon_ + 1);
1049 int m5 = m4 + 3 + 1;
1052 int m6 = m5 + 3 * (horizon_ - 1);
1055 int m7 = m6 + 3 + 1;
1058 int m8 = m7 + 2 * horizon_;
1061 int m9 = m8 + (horizon_ + 1);
1064 int m10 = m9 + lambda_horizon_;
1067 int m11 = m10 + miu_horizon_;
1069 CHECK_EQ(m11, num_of_constraints_);
1071 AINFO <<
"dynamics constatins to: " << m1;
1072 AINFO <<
"control rate constraints (only steering) to: " << m2;
1073 AINFO <<
"sampling time equality constraints to: " << m3;
1074 AINFO <<
"obstacle constraints to: " << m4;
1075 AINFO <<
"start conf constraints to: " << m5;
1076 AINFO <<
"constraints on x,y,v to: " << m6;
1077 AINFO <<
"end constraints to: " << m7;
1078 AINFO <<
"control bnd to: " << m8;
1079 AINFO <<
"time interval constraints to: " << m9;
1080 AINFO <<
"lambda constraints to: " << m10;
1081 AINFO <<
"miu constraints to: " << m11;
1082 AINFO <<
"total constraints: " << num_of_constraints_;
1084 for (
int idx = 0; idx < m; ++idx) {
1085 if (g[idx] > g_u_tmp[idx] + delta_v || g[idx] < g_l_tmp[idx] - delta_v) {
1086 AINFO <<
"constratins idx unfeasible: " << idx <<
", g: " << g[idx] <<
", lower: " << g_l_tmp[idx]
1087 <<
", upper: " << g_u_tmp[idx];
1094 std::vector<double> xp(n);
1095 std::vector<double> lamp(m);
1096 std::vector<double> zl(m);
1097 std::vector<double> zu(m);
1098 std::vector<adouble> xa(n);
1099 std::vector<adouble> g(m);
1100 std::vector<double> lam(m);
1105 obj_lam =
new double[m + 1];
1109 for (
int idx = 0; idx < n; idx++) {
1110 xa[idx] <<= xp[idx];
1113 obj_value >>= dummy;
1117 for (
int idx = 0; idx < n; idx++) {
1118 xa[idx] <<= xp[idx];
1121 for (
int idx = 0; idx < m; idx++) {
1127 for (
int idx = 0; idx < n; idx++) {
1128 xa[idx] <<= xp[idx];
1130 for (
int idx = 0; idx < m; idx++) {
1135 obj_value *= mkparam(sig);
1137 for (
int idx = 0; idx < m; idx++) {
1138 obj_value += g[idx] * mkparam(lam[idx]);
1140 obj_value >>= dummy;
1144 if (enable_jacobian_ad_) {
1153 sparse_jac(
tag_g, m, n, 0, &xp[0], &nnz_jac, &rind_g, &cind_g, &jacval, options_g);
1154 *nnz_jac_g = nnz_jac;
1163 sparse_hess(
tag_L, n, 0, &xp[0], &nnz_L, &rind_L, &cind_L, &hessval, options_L);