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 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_ = distance_approach_config_.max_acceleration_forward();
94 max_acceleration_reverse_ = distance_approach_config_.max_acceleration_reverse();
95 min_time_sample_scaling_ = distance_approach_config_.min_time_sample_scaling();
96 max_time_sample_scaling_ = distance_approach_config_.max_time_sample_scaling();
98 use_fix_time_ = distance_approach_config_.use_fix_time();
100 enable_constraint_check_ = distance_approach_config_.enable_constraint_check();
101 enable_jacobian_ad_ = distance_approach_config_.enable_jacobian_ad();
105 const size_t horizon,
107 const Eigen::MatrixXd& ego,
108 const Eigen::MatrixXd& xWS,
109 const Eigen::MatrixXd& uWS,
110 const Eigen::MatrixXd& l_warm_up,
111 const Eigen::MatrixXd& n_warm_up,
112 const Eigen::MatrixXd& x0,
113 const Eigen::MatrixXd& xf,
114 const Eigen::MatrixXd& last_time_u,
115 const std::vector<double>& XYbounds,
116 const Eigen::MatrixXi& obstacles_edges_num,
117 const size_t obstacles_num,
118 const Eigen::MatrixXd& obstacles_A,
119 const Eigen::MatrixXd& obstacles_b,
125 l_warm_up_(l_warm_up),
126 n_warm_up_(n_warm_up),
129 last_time_u_(last_time_u),
131 obstacles_edges_num_(obstacles_edges_num),
132 obstacles_A_(obstacles_A),
133 obstacles_b_(obstacles_b),
134 distance_approach_config_(distance_approach_config) {
135 ACHECK(horizon < std::numeric_limits<int>::max()) <<
"Invalid cast on horizon in open space planner";
136 horizon_ =
static_cast<int>(horizon);
137 ACHECK(obstacles_num < std::numeric_limits<int>::max()) <<
"Invalid cast on obstacles_num in open space planner";
139 obstacles_num_ =
static_cast<int>(obstacles_num);
140 w_ev_ = ego_(1, 0) + ego_(3, 0);
141 l_ev_ = ego_(0, 0) + ego_(2, 0);
142 g_ = {l_ev_ / 2, w_ev_ / 2, l_ev_ / 2, w_ev_ / 2};
143 offset_ = (ego_(0, 0) + ego_(2, 0)) / 2 - ego_(2, 0);
144 obstacles_edges_sum_ = obstacles_edges_num_.sum();
145 state_result_ = Eigen::MatrixXd::Zero(4, horizon_ + 1);
146 dual_l_result_ = Eigen::MatrixXd::Zero(obstacles_edges_sum_, horizon_ + 1);
147 dual_n_result_ = Eigen::MatrixXd::Zero(4 * obstacles_num_, horizon_ + 1);
148 control_result_ = Eigen::MatrixXd::Zero(2, horizon_);
149 time_result_ = Eigen::MatrixXd::Zero(1, horizon_);
150 state_start_index_ = 0;
151 control_start_index_ = 4 * (horizon_ + 1);
152 time_start_index_ = control_start_index_ + 2 * horizon_;
153 l_start_index_ = time_start_index_ + (horizon_ + 1);
154 n_start_index_ = l_start_index_ + obstacles_edges_sum_ * (horizon_ + 1);
156 weight_state_x_ = distance_approach_config_.
weight_x();
157 weight_state_y_ = distance_approach_config_.
weight_y();
158 weight_state_phi_ = distance_approach_config_.
weight_phi();
159 weight_state_v_ = distance_approach_config_.
weight_v();
160 weight_input_steer_ = distance_approach_config_.
weight_steer();
161 weight_input_a_ = distance_approach_config_.
weight_a();
177 use_fix_time_ = distance_approach_config_.
use_fix_time();
243 ADEBUG <<
"get_bounds_info";
244 ACHECK(XYbounds_.size() == 4) <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
249 int variable_index = 0;
250 for (
int i = 0; i < 4; ++i) {
257 for (
int i = 1; i < horizon_; ++i) {
259 x_l[variable_index] = -2e19;
260 x_u[variable_index] = 2e19;
263 x_l[variable_index + 1] = -2e19;
264 x_u[variable_index + 1] = 2e19;
267 x_l[variable_index + 2] = -2e19;
268 x_u[variable_index + 2] = 2e19;
271 x_l[variable_index + 3] = -2e19;
272 x_u[variable_index + 3] = 2e19;
278 for (
int i = 0; i < 4; ++i) {
279 x_l[variable_index + i] = -2e19;
280 x_u[variable_index + i] = 2e19;
283 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
286 for (
int i = 0; i < horizon_; ++i) {
288 x_l[variable_index] = -2e19;
289 x_u[variable_index] = 2e19;
292 x_l[variable_index + 1] = -2e19;
293 x_u[variable_index + 1] = 2e19;
297 ADEBUG <<
"variable_index after adding control variables : " << variable_index;
300 for (
int i = 0; i < horizon_ + 1; ++i) {
301 x_l[variable_index] = -2e19;
302 x_u[variable_index] = 2e19;
305 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
306 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
310 for (
int i = 0; i < horizon_ + 1; ++i) {
311 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
312 x_l[variable_index] = 0.0;
313 x_u[variable_index] = 2e19;
317 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
320 for (
int i = 0; i < horizon_ + 1; ++i) {
321 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
322 x_l[variable_index] = 0.0;
323 x_u[variable_index] = 2e19;
328 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
334 int constraint_index = 0;
335 for (
int i = 0; i < 4 * horizon_; ++i) {
339 constraint_index += 4 * horizon_;
341 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: " << constraint_index;
345 for (
int i = 0; i < horizon_; ++i) {
346 g_l[constraint_index] = -max_steer_rate_;
347 g_u[constraint_index] = max_steer_rate_;
351 ADEBUG <<
"constraint_index after adding steering rate constraints: " << constraint_index;
354 for (
int i = 0; i < horizon_; ++i) {
355 g_l[constraint_index] = 0.0;
356 g_u[constraint_index] = 0.0;
360 ADEBUG <<
"constraint_index after adding time constraints: " << constraint_index;
364 for (
int i = 0; i < horizon_ + 1; ++i) {
365 for (
int j = 0; j < obstacles_num_; ++j) {
367 g_l[constraint_index] = -2e19;
368 g_u[constraint_index] = 1.0;
371 g_l[constraint_index + 1] = 0.0;
372 g_u[constraint_index + 1] = 0.0;
373 g_l[constraint_index + 2] = 0.0;
374 g_u[constraint_index + 2] = 0.0;
377 g_l[constraint_index + 3] = min_safety_distance_;
378 g_u[constraint_index + 3] = 2e19;
379 constraint_index += 4;
385 g_l[constraint_index] = x0_(0, 0);
386 g_u[constraint_index] = x0_(0, 0);
387 g_l[constraint_index + 1] = x0_(1, 0);
388 g_u[constraint_index + 1] = x0_(1, 0);
389 g_l[constraint_index + 2] = x0_(2, 0);
390 g_u[constraint_index + 2] = x0_(2, 0);
391 g_l[constraint_index + 3] = x0_(3, 0);
392 g_u[constraint_index + 3] = x0_(3, 0);
393 constraint_index += 4;
395 for (
int i = 1; i < horizon_; ++i) {
396 g_l[constraint_index] = XYbounds_[0];
397 g_u[constraint_index] = XYbounds_[1];
398 g_l[constraint_index + 1] = XYbounds_[2];
399 g_u[constraint_index + 1] = XYbounds_[3];
400 g_l[constraint_index + 2] = -max_speed_reverse_;
401 g_u[constraint_index + 2] = max_speed_forward_;
402 constraint_index += 3;
406 g_l[constraint_index] = xf_(0, 0);
407 g_u[constraint_index] = xf_(0, 0);
408 g_l[constraint_index + 1] = xf_(1, 0);
409 g_u[constraint_index + 1] = xf_(1, 0);
410 g_l[constraint_index + 2] = xf_(2, 0);
411 g_u[constraint_index + 2] = xf_(2, 0);
412 g_l[constraint_index + 3] = xf_(3, 0);
413 g_u[constraint_index + 3] = xf_(3, 0);
414 constraint_index += 4;
416 for (
int i = 0; i < horizon_; ++i) {
417 g_l[constraint_index] = -max_steer_angle_;
418 g_u[constraint_index] = max_steer_angle_;
419 g_l[constraint_index + 1] = -max_acceleration_reverse_;
420 g_u[constraint_index + 1] = max_acceleration_forward_;
421 constraint_index += 2;
424 for (
int i = 0; i < horizon_ + 1; ++i) {
425 if (!use_fix_time_) {
426 g_l[constraint_index] = min_time_sample_scaling_;
427 g_u[constraint_index] = max_time_sample_scaling_;
429 g_l[constraint_index] = 1.0;
430 g_u[constraint_index] = 1.0;
435 for (
int i = 0; i < lambda_horizon_; ++i) {
436 g_l[constraint_index] = 0.0;
437 g_u[constraint_index] = 2e19;
441 for (
int i = 0; i < miu_horizon_; ++i) {
442 g_l[constraint_index] = 0.0;
443 g_u[constraint_index] = 2e19;
447 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
448 ADEBUG <<
"get_bounds_info_ out";
562 CHECK_EQ(n, num_of_variables_) <<
"No. of variables wrong in eval_jac_g. n : " << n;
563 CHECK_EQ(m, num_of_constraints_) <<
"No. of constraints wrong in eval_jac_g. n : " << m;
565 if (values ==
nullptr) {
567 int constraint_index = 0;
568 int state_index = state_start_index_;
569 int control_index = control_start_index_;
570 int time_index = time_start_index_;
573 for (
int i = 0; i < horizon_; ++i) {
575 iRow[nz_index] = state_index;
576 jCol[nz_index] = state_index;
579 iRow[nz_index] = state_index;
580 jCol[nz_index] = state_index + 2;
583 iRow[nz_index] = state_index;
584 jCol[nz_index] = state_index + 3;
587 iRow[nz_index] = state_index;
588 jCol[nz_index] = state_index + 4;
592 iRow[nz_index] = state_index;
593 jCol[nz_index] = control_index;
596 iRow[nz_index] = state_index;
597 jCol[nz_index] = control_index + 1;
601 iRow[nz_index] = state_index;
602 jCol[nz_index] = time_index;
606 iRow[nz_index] = state_index + 1;
607 jCol[nz_index] = state_index + 1;
610 iRow[nz_index] = state_index + 1;
611 jCol[nz_index] = state_index + 2;
614 iRow[nz_index] = state_index + 1;
615 jCol[nz_index] = state_index + 3;
618 iRow[nz_index] = state_index + 1;
619 jCol[nz_index] = state_index + 5;
623 iRow[nz_index] = state_index + 1;
624 jCol[nz_index] = control_index;
627 iRow[nz_index] = state_index + 1;
628 jCol[nz_index] = control_index + 1;
632 iRow[nz_index] = state_index + 1;
633 jCol[nz_index] = time_index;
637 iRow[nz_index] = state_index + 2;
638 jCol[nz_index] = state_index + 2;
641 iRow[nz_index] = state_index + 2;
642 jCol[nz_index] = state_index + 3;
645 iRow[nz_index] = state_index + 2;
646 jCol[nz_index] = state_index + 6;
650 iRow[nz_index] = state_index + 2;
651 jCol[nz_index] = control_index;
654 iRow[nz_index] = state_index + 2;
655 jCol[nz_index] = control_index + 1;
659 iRow[nz_index] = state_index + 2;
660 jCol[nz_index] = time_index;
664 iRow[nz_index] = state_index + 3;
665 jCol[nz_index] = state_index + 3;
668 iRow[nz_index] = state_index + 3;
669 jCol[nz_index] = state_index + 7;
673 iRow[nz_index] = state_index + 3;
674 jCol[nz_index] = control_index + 1;
678 iRow[nz_index] = state_index + 3;
679 jCol[nz_index] = time_index;
685 constraint_index += 4;
689 control_index = control_start_index_;
690 state_index = state_start_index_;
691 time_index = time_start_index_;
694 iRow[nz_index] = constraint_index;
695 jCol[nz_index] = control_index;
699 iRow[nz_index] = constraint_index;
700 jCol[nz_index] = time_index;
707 for (
int i = 1; i < horizon_; ++i) {
709 iRow[nz_index] = constraint_index;
710 jCol[nz_index] = control_index - 2;
714 iRow[nz_index] = constraint_index;
715 jCol[nz_index] = control_index;
719 iRow[nz_index] = constraint_index;
720 jCol[nz_index] = time_index;
730 time_index = time_start_index_;
732 for (
int i = 0; i < horizon_; ++i) {
734 iRow[nz_index] = constraint_index;
735 jCol[nz_index] = time_index;
739 iRow[nz_index] = constraint_index;
740 jCol[nz_index] = time_index + 1;
749 state_index = state_start_index_;
750 int l_index = l_start_index_;
751 int n_index = n_start_index_;
752 for (
int i = 0; i < horizon_ + 1; ++i) {
753 for (
int j = 0; j < obstacles_num_; ++j) {
754 int current_edges_num = obstacles_edges_num_(j, 0);
757 for (
int k = 0; k < current_edges_num; ++k) {
759 iRow[nz_index] = constraint_index;
760 jCol[nz_index] = l_index + k;
766 iRow[nz_index] = constraint_index + 1;
767 jCol[nz_index] = state_index + 2;
771 for (
int k = 0; k < current_edges_num; ++k) {
772 iRow[nz_index] = constraint_index + 1;
773 jCol[nz_index] = l_index + k;
778 iRow[nz_index] = constraint_index + 1;
779 jCol[nz_index] = n_index;
782 iRow[nz_index] = constraint_index + 1;
783 jCol[nz_index] = n_index + 2;
788 iRow[nz_index] = constraint_index + 2;
789 jCol[nz_index] = state_index + 2;
793 for (
int k = 0; k < current_edges_num; ++k) {
794 iRow[nz_index] = constraint_index + 2;
795 jCol[nz_index] = l_index + k;
800 iRow[nz_index] = constraint_index + 2;
801 jCol[nz_index] = n_index + 1;
804 iRow[nz_index] = constraint_index + 2;
805 jCol[nz_index] = n_index + 3;
810 iRow[nz_index] = constraint_index + 3;
811 jCol[nz_index] = state_index;
814 iRow[nz_index] = constraint_index + 3;
815 jCol[nz_index] = state_index + 1;
818 iRow[nz_index] = constraint_index + 3;
819 jCol[nz_index] = state_index + 2;
823 for (
int k = 0; k < current_edges_num; ++k) {
824 iRow[nz_index] = constraint_index + 3;
825 jCol[nz_index] = l_index + k;
830 for (
int k = 0; k < 4; ++k) {
831 iRow[nz_index] = constraint_index + 3;
832 jCol[nz_index] = n_index + k;
837 l_index += current_edges_num;
839 constraint_index += 4;
845 state_index = state_start_index_;
846 control_index = control_start_index_;
847 time_index = time_start_index_;
848 l_index = l_start_index_;
849 n_index = n_start_index_;
852 iRow[nz_index] = constraint_index;
853 jCol[nz_index] = state_index;
855 iRow[nz_index] = constraint_index + 1;
856 jCol[nz_index] = state_index + 1;
858 iRow[nz_index] = constraint_index + 2;
859 jCol[nz_index] = state_index + 2;
861 iRow[nz_index] = constraint_index + 3;
862 jCol[nz_index] = state_index + 3;
864 constraint_index += 4;
867 for (
int i = 1; i < horizon_; ++i) {
868 iRow[nz_index] = constraint_index;
869 jCol[nz_index] = state_index;
871 iRow[nz_index] = constraint_index + 1;
872 jCol[nz_index] = state_index + 1;
874 iRow[nz_index] = constraint_index + 2;
875 jCol[nz_index] = state_index + 3;
877 constraint_index += 3;
882 iRow[nz_index] = constraint_index;
883 jCol[nz_index] = state_index;
885 iRow[nz_index] = constraint_index + 1;
886 jCol[nz_index] = state_index + 1;
888 iRow[nz_index] = constraint_index + 2;
889 jCol[nz_index] = state_index + 2;
891 iRow[nz_index] = constraint_index + 3;
892 jCol[nz_index] = state_index + 3;
894 constraint_index += 4;
897 for (
int i = 0; i < horizon_; ++i) {
898 iRow[nz_index] = constraint_index;
899 jCol[nz_index] = control_index;
901 iRow[nz_index] = constraint_index + 1;
902 jCol[nz_index] = control_index + 1;
904 constraint_index += 2;
908 for (
int i = 0; i < horizon_ + 1; ++i) {
909 iRow[nz_index] = constraint_index;
910 jCol[nz_index] = time_index;
916 for (
int i = 0; i < lambda_horizon_; ++i) {
917 iRow[nz_index] = constraint_index;
918 jCol[nz_index] = l_index;
924 for (
int i = 0; i < miu_horizon_; ++i) {
925 iRow[nz_index] = constraint_index;
926 jCol[nz_index] = n_index;
932 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
933 CHECK_EQ(constraint_index,
static_cast<int>(m));
935 std::fill(values, values + nele_jac, 0.0);
938 int time_index = time_start_index_;
939 int state_index = state_start_index_;
940 int control_index = control_start_index_;
945 for (
int i = 0; i < horizon_; ++i) {
946 values[nz_index] = -1.0;
949 values[nz_index] = x[time_index] * ts_
950 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
951 * std::sin(x[state_index + 2]
952 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
956 values[nz_index] = -1.0
957 * (x[time_index] * ts_
960 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
962 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
963 * (-1) * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
966 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
970 values[nz_index] = 1.0;
973 values[nz_index] = x[time_index] * ts_
974 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
975 * std::sin(x[state_index + 2]
976 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
978 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
979 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_;
982 values[nz_index] = -1.0
983 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
986 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
990 values[nz_index] = -1.0
991 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
994 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
996 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
999 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1001 - x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1002 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1005 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1009 values[nz_index] = -1.0;
1012 values[nz_index] = -1.0
1013 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1016 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1020 values[nz_index] = -1.0
1021 * (x[time_index] * ts_
1024 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1026 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1027 * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1030 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1034 values[nz_index] = 1.0;
1037 values[nz_index] = -1.0
1038 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1041 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1043 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1044 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1047 values[nz_index] = -1.0
1048 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1051 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1055 values[nz_index] = -1.0
1056 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1059 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1061 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1064 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1066 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1067 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1070 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1074 values[nz_index] = -1.0;
1077 values[nz_index] = -1.0 * x[time_index] * ts_ * std::tan(x[control_index]) / wheelbase_;
1080 values[nz_index] = 1.0;
1083 values[nz_index] = -1.0
1084 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1085 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1088 values[nz_index] = -1.0
1089 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 * std::tan(x[control_index])
1093 values[nz_index] = -1.0
1094 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1095 * std::tan(x[control_index]) / wheelbase_
1096 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] * std::tan(x[control_index])
1100 values[nz_index] = -1.0;
1103 values[nz_index] = 1.0;
1106 values[nz_index] = -1.0 * ts_ * x[time_index];
1109 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
1118 control_index = control_start_index_;
1119 state_index = state_start_index_;
1120 time_index = time_start_index_;
1125 values[nz_index] = 1.0 / x[time_index] / ts_;
1129 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) / x[time_index] / x[time_index] / ts_;
1134 for (
int i = 1; i < horizon_; ++i) {
1137 values[nz_index] = -1.0 / x[time_index] / ts_;
1141 values[nz_index] = 1.0 / x[time_index] / ts_;
1145 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) / x[time_index] / x[time_index] / ts_;
1152 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : " << nz_index
1153 <<
" nele_jac : " << nele_jac;
1156 time_index = time_start_index_;
1157 for (
int i = 0; i < horizon_; ++i) {
1159 values[nz_index] = -1.0;
1163 values[nz_index] = 1.0;
1169 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : " << nz_index <<
" nele_jac : " << nele_jac;
1174 state_index = state_start_index_;
1175 int l_index = l_start_index_;
1176 int n_index = n_start_index_;
1178 for (
int i = 0; i < horizon_ + 1; ++i) {
1179 int edges_counter = 0;
1180 for (
int j = 0; j < obstacles_num_; ++j) {
1181 int current_edges_num = obstacles_edges_num_(j, 0);
1182 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
1183 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
1188 for (
int k = 0; k < current_edges_num; ++k) {
1190 tmp1 += Aj(k, 0) * x[l_index + k];
1191 tmp2 += Aj(k, 1) * x[l_index + k];
1195 for (
int k = 0; k < current_edges_num; ++k) {
1197 values[nz_index] = 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
1203 values[nz_index] = -std::sin(x[state_index + 2]) * tmp1 + std::cos(x[state_index + 2]) * tmp2;
1207 for (
int k = 0; k < current_edges_num; ++k) {
1208 values[nz_index] = std::cos(x[state_index + 2]) * Aj(k, 0)
1209 + std::sin(x[state_index + 2]) * Aj(k, 1);
1214 values[nz_index] = 1.0;
1217 values[nz_index] = -1.0;
1222 values[nz_index] = -std::cos(x[state_index + 2]) * tmp1 - std::sin(x[state_index + 2]) * tmp2;
1226 for (
int k = 0; k < current_edges_num; ++k) {
1227 values[nz_index] = -std::sin(x[state_index + 2]) * Aj(k, 0)
1228 + std::cos(x[state_index + 2]) * Aj(k, 1);
1233 values[nz_index] = 1.0;
1236 values[nz_index] = -1.0;
1242 for (
int k = 0; k < 4; ++k) {
1243 tmp3 += -g_[k] * x[n_index + k];
1246 for (
int k = 0; k < current_edges_num; ++k) {
1247 tmp4 += bj(k, 0) * x[l_index + k];
1251 values[nz_index] = tmp1;
1254 values[nz_index] = tmp2;
1257 values[nz_index] = -std::sin(x[state_index + 2]) * offset_ * tmp1
1258 + std::cos(x[state_index + 2]) * offset_ * tmp2;
1262 for (
int k = 0; k < current_edges_num; ++k) {
1263 values[nz_index] = (x[state_index] + std::cos(x[state_index + 2]) * offset_) * Aj(k, 0)
1264 + (x[state_index + 1] + std::sin(x[state_index + 2]) * offset_) * Aj(k, 1)
1270 for (
int k = 0; k < 4; ++k) {
1271 values[nz_index] = -g_[k];
1276 edges_counter += current_edges_num;
1277 l_index += current_edges_num;
1284 state_index = state_start_index_;
1285 control_index = control_start_index_;
1286 time_index = time_start_index_;
1287 l_index = l_start_index_;
1288 n_index = n_start_index_;
1291 values[nz_index] = 1.0;
1293 values[nz_index] = 1.0;
1295 values[nz_index] = 1.0;
1297 values[nz_index] = 1.0;
1300 for (
int i = 1; i < horizon_; ++i) {
1301 values[nz_index] = 1.0;
1303 values[nz_index] = 1.0;
1305 values[nz_index] = 1.0;
1310 values[nz_index] = 1.0;
1312 values[nz_index] = 1.0;
1314 values[nz_index] = 1.0;
1316 values[nz_index] = 1.0;
1319 for (
int i = 0; i < horizon_; ++i) {
1320 values[nz_index] = 1.0;
1322 values[nz_index] = 1.0;
1326 for (
int i = 0; i < horizon_ + 1; ++i) {
1327 values[nz_index] = 1.0;
1331 for (
int i = 0; i < lambda_horizon_; ++i) {
1332 values[nz_index] = 1.0;
1336 for (
int i = 0; i < miu_horizon_; ++i) {
1337 values[nz_index] = 1.0;
1341 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
1342 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1345 ADEBUG <<
"eval_jac_g done";
1593 int state_index = state_start_index_;
1596 int control_index = control_start_index_;
1599 int time_index = time_start_index_;
1601 int constraint_index = 0;
1604 for (
int i = 0; i < horizon_; ++i) {
1606 g[constraint_index] = x[state_index + 4]
1608 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
1609 * cos(x[state_index + 2]
1610 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
1627 g[constraint_index + 1] = x[state_index + 5]
1628 - (x[state_index + 1]
1629 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
1630 * sin(x[state_index + 2]
1631 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
1647 g[constraint_index + 2] = x[state_index + 6]
1648 - (x[state_index + 2]
1649 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
1650 * tan(x[control_index]) / wheelbase_);
1668 g[constraint_index + 3]
1669 = x[state_index + 7] - (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
1678 constraint_index += 4;
1683 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
1685 << constraint_index;
1689 control_index = control_start_index_;
1690 time_index = time_start_index_;
1693 g[constraint_index] = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
1698 for (
int i = 1; i < horizon_; ++i) {
1699 g[constraint_index] = (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
1706 time_index = time_start_index_;
1707 for (
int i = 0; i < horizon_; ++i) {
1708 g[constraint_index] = x[time_index + 1] - x[time_index];
1713 ADEBUG <<
"constraint_index after adding time constraints "
1715 << constraint_index;
1719 state_index = state_start_index_;
1720 int l_index = l_start_index_;
1721 int n_index = n_start_index_;
1723 for (
int i = 0; i < horizon_ + 1; ++i) {
1724 int edges_counter = 0;
1725 for (
int j = 0; j < obstacles_num_; ++j) {
1726 int current_edges_num = obstacles_edges_num_(j, 0);
1727 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
1728 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
1733 for (
int k = 0; k < current_edges_num; ++k) {
1735 tmp1 += Aj(k, 0) * x[l_index + k];
1736 tmp2 += Aj(k, 1) * x[l_index + k];
1738 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
1741 g[constraint_index + 1]
1742 = x[n_index] - x[n_index + 2] + cos(x[state_index + 2]) * tmp1 + sin(x[state_index + 2]) * tmp2;
1744 g[constraint_index + 2]
1745 = x[n_index + 1] - x[n_index + 3] - sin(x[state_index + 2]) * tmp1 + cos(x[state_index + 2]) * tmp2;
1749 for (
int k = 0; k < 4; ++k) {
1750 tmp3 += -g_[k] * x[n_index + k];
1754 for (
int k = 0; k < current_edges_num; ++k) {
1755 tmp4 += bj(k, 0) * x[l_index + k];
1758 g[constraint_index + 3] = tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1
1759 + (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 - tmp4;
1762 edges_counter += current_edges_num;
1763 l_index += current_edges_num;
1765 constraint_index += 4;
1769 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
1771 << constraint_index;
1774 state_index = state_start_index_;
1775 control_index = control_start_index_;
1776 time_index = time_start_index_;
1777 l_index = l_start_index_;
1778 n_index = n_start_index_;
1781 g[constraint_index] = x[state_index];
1782 g[constraint_index + 1] = x[state_index + 1];
1783 g[constraint_index + 2] = x[state_index + 2];
1784 g[constraint_index + 3] = x[state_index + 3];
1785 constraint_index += 4;
1789 for (
int i = 1; i < horizon_; ++i) {
1790 g[constraint_index] = x[state_index];
1791 g[constraint_index + 1] = x[state_index + 1];
1792 g[constraint_index + 2] = x[state_index + 3];
1793 constraint_index += 3;
1798 g[constraint_index] = x[state_index];
1799 g[constraint_index + 1] = x[state_index + 1];
1800 g[constraint_index + 2] = x[state_index + 2];
1801 g[constraint_index + 3] = x[state_index + 3];
1802 constraint_index += 4;
1805 for (
int i = 0; i < horizon_; ++i) {
1806 g[constraint_index] = x[control_index];
1807 g[constraint_index + 1] = x[control_index + 1];
1808 constraint_index += 2;
1812 for (
int i = 0; i < horizon_ + 1; ++i) {
1813 g[constraint_index] = x[time_index];
1818 for (
int i = 0; i < lambda_horizon_; ++i) {
1819 g[constraint_index] = x[l_index];
1824 for (
int i = 0; i < miu_horizon_; ++i) {
1825 g[constraint_index] = x[n_index];