256 ADEBUG <<
"get_bounds_info";
257 ACHECK(XYbounds_.size() == 4) <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
262 int variable_index = 0;
263 for (
int i = 0; i < 4; ++i) {
270 for (
int i = 1; i < horizon_; ++i) {
272 x_l[variable_index] = -2e19;
273 x_u[variable_index] = 2e19;
276 x_l[variable_index + 1] = -2e19;
277 x_u[variable_index + 1] = 2e19;
280 x_l[variable_index + 2] = -2e19;
281 x_u[variable_index + 2] = 2e19;
284 x_l[variable_index + 3] = -2e19;
285 x_u[variable_index + 3] = 2e19;
291 for (
int i = 0; i < 4; ++i) {
292 x_l[variable_index + i] = -2e19;
293 x_u[variable_index + i] = 2e19;
296 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
299 for (
int i = 0; i < horizon_; ++i) {
301 x_l[variable_index] = -2e19;
302 x_u[variable_index] = 2e19;
305 x_l[variable_index + 1] = -2e19;
306 x_u[variable_index + 1] = 2e19;
310 ADEBUG <<
"variable_index after adding control variables : " << variable_index;
313 for (
int i = 0; i < horizon_ + 1; ++i) {
314 x_l[variable_index] = -2e19;
315 x_u[variable_index] = 2e19;
318 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
319 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
323 for (
int i = 0; i < horizon_ + 1; ++i) {
324 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
325 x_l[variable_index] = 0.0;
326 x_u[variable_index] = 2e19;
330 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
333 for (
int i = 0; i < horizon_ + 1; ++i) {
334 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
335 x_l[variable_index] = 0.0;
336 x_u[variable_index] = 2e19;
341 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
347 int constraint_index = 0;
348 for (
int i = 0; i < 4 * horizon_; ++i) {
352 constraint_index += 4 * horizon_;
354 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: " << constraint_index;
358 for (
int i = 0; i < horizon_; ++i) {
359 g_l[constraint_index] = -max_steer_rate_;
360 g_u[constraint_index] = max_steer_rate_;
364 ADEBUG <<
"constraint_index after adding steering rate constraints: " << constraint_index;
367 for (
int i = 0; i < horizon_; ++i) {
368 g_l[constraint_index] = 0.0;
369 g_u[constraint_index] = 0.0;
373 ADEBUG <<
"constraint_index after adding time constraints: " << constraint_index;
377 for (
int i = 0; i < horizon_ + 1; ++i) {
378 for (
int j = 0; j < obstacles_num_; ++j) {
380 g_l[constraint_index] = -2e19;
381 g_u[constraint_index] = 1.0;
384 g_l[constraint_index + 1] = 0.0;
385 g_u[constraint_index + 1] = 0.0;
386 g_l[constraint_index + 2] = 0.0;
387 g_u[constraint_index + 2] = 0.0;
390 g_l[constraint_index + 3] = min_safety_distance_;
391 g_u[constraint_index + 3] = 2e19;
392 constraint_index += 4;
398 g_l[constraint_index] = x0_(0, 0);
399 g_u[constraint_index] = x0_(0, 0);
400 g_l[constraint_index + 1] = x0_(1, 0);
401 g_u[constraint_index + 1] = x0_(1, 0);
402 g_l[constraint_index + 2] = x0_(2, 0);
403 g_u[constraint_index + 2] = x0_(2, 0);
404 g_l[constraint_index + 3] = x0_(3, 0);
405 g_u[constraint_index + 3] = x0_(3, 0);
406 constraint_index += 4;
408 for (
int i = 1; i < horizon_; ++i) {
409 g_l[constraint_index] = XYbounds_[0];
410 g_u[constraint_index] = XYbounds_[1];
411 g_l[constraint_index + 1] = XYbounds_[2];
412 g_u[constraint_index + 1] = XYbounds_[3];
413 g_l[constraint_index + 2] = -max_speed_reverse_;
414 g_u[constraint_index + 2] = max_speed_forward_;
415 constraint_index += 3;
419 g_l[constraint_index] = xf_(0, 0);
420 g_u[constraint_index] = xf_(0, 0);
421 g_l[constraint_index + 1] = xf_(1, 0);
422 g_u[constraint_index + 1] = xf_(1, 0);
423 g_l[constraint_index + 2] = xf_(2, 0);
424 g_u[constraint_index + 2] = xf_(2, 0);
425 g_l[constraint_index + 3] = xf_(3, 0);
426 g_u[constraint_index + 3] = xf_(3, 0);
427 constraint_index += 4;
429 for (
int i = 0; i < horizon_; ++i) {
430 g_l[constraint_index] = -max_steer_angle_;
431 g_u[constraint_index] = max_steer_angle_;
432 g_l[constraint_index + 1] = -max_acceleration_reverse_;
433 g_u[constraint_index + 1] = max_acceleration_forward_;
434 constraint_index += 2;
437 for (
int i = 0; i < horizon_ + 1; ++i) {
438 if (!use_fix_time_) {
439 g_l[constraint_index] = min_time_sample_scaling_;
440 g_u[constraint_index] = max_time_sample_scaling_;
442 g_l[constraint_index] = 1.0;
443 g_u[constraint_index] = 1.0;
448 for (
int i = 0; i < lambda_horizon_; ++i) {
449 g_l[constraint_index] = 0.0;
450 g_u[constraint_index] = 2e19;
454 for (
int i = 0; i < miu_horizon_; ++i) {
455 g_l[constraint_index] = 0.0;
456 g_u[constraint_index] = 2e19;
460 ADEBUG <<
"constraint_index after adding obstacles constraints: " << constraint_index;
461 ADEBUG <<
"get_bounds_info_ out";
635 CHECK_EQ(n, num_of_variables_) <<
"No. of variables wrong in eval_jac_g. n : " << n;
636 CHECK_EQ(m, num_of_constraints_) <<
"No. of constraints wrong in eval_jac_g. n : " << m;
638 if (values ==
nullptr) {
640 int constraint_index = 0;
641 int state_index = state_start_index_;
642 int control_index = control_start_index_;
643 int time_index = time_start_index_;
646 for (
int i = 0; i < horizon_; ++i) {
648 iRow[nz_index] = state_index;
649 jCol[nz_index] = state_index;
652 iRow[nz_index] = state_index;
653 jCol[nz_index] = state_index + 2;
656 iRow[nz_index] = state_index;
657 jCol[nz_index] = state_index + 3;
660 iRow[nz_index] = state_index;
661 jCol[nz_index] = state_index + 4;
665 iRow[nz_index] = state_index;
666 jCol[nz_index] = control_index;
669 iRow[nz_index] = state_index;
670 jCol[nz_index] = control_index + 1;
674 iRow[nz_index] = state_index;
675 jCol[nz_index] = time_index;
679 iRow[nz_index] = state_index + 1;
680 jCol[nz_index] = state_index + 1;
683 iRow[nz_index] = state_index + 1;
684 jCol[nz_index] = state_index + 2;
687 iRow[nz_index] = state_index + 1;
688 jCol[nz_index] = state_index + 3;
691 iRow[nz_index] = state_index + 1;
692 jCol[nz_index] = state_index + 5;
696 iRow[nz_index] = state_index + 1;
697 jCol[nz_index] = control_index;
700 iRow[nz_index] = state_index + 1;
701 jCol[nz_index] = control_index + 1;
705 iRow[nz_index] = state_index + 1;
706 jCol[nz_index] = time_index;
710 iRow[nz_index] = state_index + 2;
711 jCol[nz_index] = state_index + 2;
714 iRow[nz_index] = state_index + 2;
715 jCol[nz_index] = state_index + 3;
718 iRow[nz_index] = state_index + 2;
719 jCol[nz_index] = state_index + 6;
723 iRow[nz_index] = state_index + 2;
724 jCol[nz_index] = control_index;
727 iRow[nz_index] = state_index + 2;
728 jCol[nz_index] = control_index + 1;
732 iRow[nz_index] = state_index + 2;
733 jCol[nz_index] = time_index;
737 iRow[nz_index] = state_index + 3;
738 jCol[nz_index] = state_index + 3;
741 iRow[nz_index] = state_index + 3;
742 jCol[nz_index] = state_index + 7;
746 iRow[nz_index] = state_index + 3;
747 jCol[nz_index] = control_index + 1;
751 iRow[nz_index] = state_index + 3;
752 jCol[nz_index] = time_index;
758 constraint_index += 4;
762 control_index = control_start_index_;
763 state_index = state_start_index_;
764 time_index = time_start_index_;
767 iRow[nz_index] = constraint_index;
768 jCol[nz_index] = control_index;
772 iRow[nz_index] = constraint_index;
773 jCol[nz_index] = time_index;
780 for (
int i = 1; i < horizon_; ++i) {
782 iRow[nz_index] = constraint_index;
783 jCol[nz_index] = control_index - 2;
787 iRow[nz_index] = constraint_index;
788 jCol[nz_index] = control_index;
792 iRow[nz_index] = constraint_index;
793 jCol[nz_index] = time_index;
803 time_index = time_start_index_;
805 for (
int i = 0; i < horizon_; ++i) {
807 iRow[nz_index] = constraint_index;
808 jCol[nz_index] = time_index;
812 iRow[nz_index] = constraint_index;
813 jCol[nz_index] = time_index + 1;
822 state_index = state_start_index_;
823 int l_index = l_start_index_;
824 int n_index = n_start_index_;
826#pragma omp parallel for schedule(dynamic, 1) num_threads(4)
827 for (
int iter = 0; iter < (horizon_ + 1) * obstacles_num_; iter++) {
828 int i = iter / obstacles_num_;
829 int j = iter % obstacles_num_;
830 int current_edges_num = obstacles_edges_num_(j, 0);
831 int nz_index_tmp = nz_index;
832 int l_index_tmp = l_index;
834 for (
int jj = 0; jj < obstacles_num_; ++jj) {
836 nz_index_tmp += 4 * (i + 1) * obstacles_edges_num_(jj, 0);
837 nz_index_tmp += 13 * (i + 1);
838 l_index_tmp += (i + 1) * obstacles_edges_num_(jj, 0);
840 nz_index_tmp += 4 * i * obstacles_edges_num_(jj, 0);
841 nz_index_tmp += 13 * i;
842 l_index_tmp += i * obstacles_edges_num_(jj, 0);
845 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
846 int constraint_index_tmp = constraint_index + (i * obstacles_num_ + j) * 4;
847 int state_index_tmp = state_index + i * 4;
850 for (
int k = 0; k < current_edges_num; ++k) {
852 iRow[nz_index_tmp] = constraint_index_tmp;
853 jCol[nz_index_tmp] = l_index_tmp + k;
859 iRow[nz_index_tmp] = constraint_index_tmp + 1;
860 jCol[nz_index_tmp] = state_index_tmp + 2;
864 for (
int k = 0; k < current_edges_num; ++k) {
865 iRow[nz_index_tmp] = constraint_index_tmp + 1;
866 jCol[nz_index_tmp] = l_index_tmp + k;
871 iRow[nz_index_tmp] = constraint_index_tmp + 1;
872 jCol[nz_index_tmp] = n_index_tmp;
875 iRow[nz_index_tmp] = constraint_index_tmp + 1;
876 jCol[nz_index_tmp] = n_index_tmp + 2;
881 iRow[nz_index_tmp] = constraint_index_tmp + 2;
882 jCol[nz_index_tmp] = state_index_tmp + 2;
886 for (
int k = 0; k < current_edges_num; ++k) {
887 iRow[nz_index_tmp] = constraint_index_tmp + 2;
888 jCol[nz_index_tmp] = l_index_tmp + k;
893 iRow[nz_index_tmp] = constraint_index_tmp + 2;
894 jCol[nz_index_tmp] = n_index_tmp + 1;
897 iRow[nz_index_tmp] = constraint_index_tmp + 2;
898 jCol[nz_index_tmp] = n_index_tmp + 3;
903 iRow[nz_index_tmp] = constraint_index_tmp + 3;
904 jCol[nz_index_tmp] = state_index_tmp;
907 iRow[nz_index_tmp] = constraint_index_tmp + 3;
908 jCol[nz_index_tmp] = state_index_tmp + 1;
911 iRow[nz_index_tmp] = constraint_index_tmp + 3;
912 jCol[nz_index_tmp] = state_index_tmp + 2;
916 for (
int k = 0; k < current_edges_num; ++k) {
917 iRow[nz_index_tmp] = constraint_index_tmp + 3;
918 jCol[nz_index_tmp] = l_index_tmp + k;
923 for (
int k = 0; k < 4; ++k) {
924 iRow[nz_index_tmp] = constraint_index_tmp + 3;
925 jCol[nz_index_tmp] = n_index_tmp + k;
930 for (
int jj = 0; jj < obstacles_num_; ++jj) {
931 nz_index += 4 * (horizon_ + 1) * obstacles_edges_num_(jj, 0);
932 nz_index += 13 * (horizon_ + 1);
934 constraint_index += 4 * (horizon_ + 1) * obstacles_num_;
935 state_index += 4 * (horizon_ + 1);
938 state_index = state_start_index_;
939 control_index = control_start_index_;
940 time_index = time_start_index_;
941 l_index = l_start_index_;
942 n_index = n_start_index_;
945 iRow[nz_index] = constraint_index;
946 jCol[nz_index] = state_index;
948 iRow[nz_index] = constraint_index + 1;
949 jCol[nz_index] = state_index + 1;
951 iRow[nz_index] = constraint_index + 2;
952 jCol[nz_index] = state_index + 2;
954 iRow[nz_index] = constraint_index + 3;
955 jCol[nz_index] = state_index + 3;
957 constraint_index += 4;
960 for (
int i = 1; i < horizon_; ++i) {
961 iRow[nz_index] = constraint_index;
962 jCol[nz_index] = state_index;
964 iRow[nz_index] = constraint_index + 1;
965 jCol[nz_index] = state_index + 1;
967 iRow[nz_index] = constraint_index + 2;
968 jCol[nz_index] = state_index + 3;
970 constraint_index += 3;
975 iRow[nz_index] = constraint_index;
976 jCol[nz_index] = state_index;
978 iRow[nz_index] = constraint_index + 1;
979 jCol[nz_index] = state_index + 1;
981 iRow[nz_index] = constraint_index + 2;
982 jCol[nz_index] = state_index + 2;
984 iRow[nz_index] = constraint_index + 3;
985 jCol[nz_index] = state_index + 3;
987 constraint_index += 4;
990 for (
int i = 0; i < horizon_; ++i) {
991 iRow[nz_index] = constraint_index;
992 jCol[nz_index] = control_index;
994 iRow[nz_index] = constraint_index + 1;
995 jCol[nz_index] = control_index + 1;
997 constraint_index += 2;
1001 for (
int i = 0; i < horizon_ + 1; ++i) {
1002 iRow[nz_index] = constraint_index;
1003 jCol[nz_index] = time_index;
1009 for (
int i = 0; i < lambda_horizon_; ++i) {
1010 iRow[nz_index] = constraint_index;
1011 jCol[nz_index] = l_index;
1017 for (
int i = 0; i < miu_horizon_; ++i) {
1018 iRow[nz_index] = constraint_index;
1019 jCol[nz_index] = n_index;
1025 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1026 CHECK_EQ(constraint_index,
static_cast<int>(m));
1028 std::fill(values, values + nele_jac, 0.0);
1031 int time_index = time_start_index_;
1032 int state_index = state_start_index_;
1033 int control_index = control_start_index_;
1037 for (
int i = 0; i < horizon_; ++i) {
1038 values[nz_index] = -1.0;
1041 values[nz_index] = x[time_index] * ts_
1042 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1043 * std::sin(x[state_index + 2]
1044 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1048 values[nz_index] = -1.0
1049 * (x[time_index] * ts_
1052 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1054 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1055 * (-1) * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1058 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1062 values[nz_index] = 1.0;
1065 values[nz_index] = x[time_index] * ts_
1066 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1067 * std::sin(x[state_index + 2]
1068 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1070 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1071 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_;
1074 values[nz_index] = -1.0
1075 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1078 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1082 values[nz_index] = -1.0
1083 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1086 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1088 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1091 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1093 - x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1094 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1097 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1101 values[nz_index] = -1.0;
1104 values[nz_index] = -1.0
1105 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1108 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1112 values[nz_index] = -1.0
1113 * (x[time_index] * ts_
1116 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1118 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1119 * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1122 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1126 values[nz_index] = 1.0;
1129 values[nz_index] = -1.0
1130 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1133 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1135 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1136 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1139 values[nz_index] = -1.0
1140 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1143 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1147 values[nz_index] = -1.0
1148 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1151 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1153 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1156 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1158 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1159 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1162 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1166 values[nz_index] = -1.0;
1169 values[nz_index] = -1.0 * x[time_index] * ts_ * std::tan(x[control_index]) / wheelbase_;
1172 values[nz_index] = 1.0;
1175 values[nz_index] = -1.0
1176 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1177 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1180 values[nz_index] = -1.0
1181 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 * std::tan(x[control_index])
1185 values[nz_index] = -1.0
1186 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1187 * std::tan(x[control_index]) / wheelbase_
1188 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] * std::tan(x[control_index])
1192 values[nz_index] = -1.0;
1195 values[nz_index] = 1.0;
1198 values[nz_index] = -1.0 * ts_ * x[time_index];
1201 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
1210 control_index = control_start_index_;
1211 state_index = state_start_index_;
1212 time_index = time_start_index_;
1217 values[nz_index] = 1.0 / x[time_index] / ts_;
1221 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) / x[time_index] / x[time_index] / ts_;
1226 for (
int i = 1; i < horizon_; ++i) {
1229 values[nz_index] = -1.0 / x[time_index] / ts_;
1233 values[nz_index] = 1.0 / x[time_index] / ts_;
1237 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) / x[time_index] / x[time_index] / ts_;
1244 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : " << nz_index
1245 <<
" nele_jac : " << nele_jac;
1248 time_index = time_start_index_;
1249 for (
int i = 0; i < horizon_; ++i) {
1251 values[nz_index] = -1.0;
1255 values[nz_index] = 1.0;
1261 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : " << nz_index <<
" nele_jac : " << nele_jac;
1266 state_index = state_start_index_;
1267 int l_index = l_start_index_;
1268 int n_index = n_start_index_;
1270#pragma omp parallel for schedule(dynamic, 1) num_threads(4)
1271 for (
int iter = 0; iter < (horizon_ + 1) * obstacles_num_; iter++) {
1272 int i = iter / obstacles_num_;
1273 int j = iter % obstacles_num_;
1275 int current_edges_num = obstacles_edges_num_(j, 0);
1276 int edges_counter = 0;
1277 int nz_index_tmp = nz_index;
1278 int l_index_tmp = l_index;
1281 for (
int jj = 0; jj < obstacles_num_; ++jj) {
1283 nz_index_tmp += 4 * (i + 1) * obstacles_edges_num_(jj, 0);
1284 nz_index_tmp += 13 * (i + 1);
1285 l_index_tmp += (i + 1) * obstacles_edges_num_(jj, 0);
1286 edges_counter += obstacles_edges_num_(jj, 0);
1288 nz_index_tmp += 4 * i * obstacles_edges_num_(jj, 0);
1289 nz_index_tmp += 13 * i;
1290 l_index_tmp += i * obstacles_edges_num_(jj, 0);
1293 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
1294 int state_index_tmp = state_index + i * 4;
1296 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
1297 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
1302 for (
int k = 0; k < current_edges_num; ++k) {
1304 tmp1 += Aj(k, 0) * x[l_index_tmp + k];
1305 tmp2 += Aj(k, 1) * x[l_index_tmp + k];
1309 for (
int k = 0; k < current_edges_num; ++k) {
1311 values[nz_index_tmp] = 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
1317 values[nz_index_tmp]
1318 = -std::sin(x[state_index_tmp + 2]) * tmp1 + std::cos(x[state_index_tmp + 2]) * tmp2;
1322 for (
int k = 0; k < current_edges_num; ++k) {
1323 values[nz_index_tmp] = std::cos(x[state_index_tmp + 2]) * Aj(k, 0)
1324 + std::sin(x[state_index_tmp + 2]) * Aj(k, 1);
1329 values[nz_index_tmp] = 1.0;
1332 values[nz_index_tmp] = -1.0;
1337 values[nz_index_tmp]
1338 = -std::cos(x[state_index_tmp + 2]) * tmp1 - std::sin(x[state_index_tmp + 2]) * tmp2;
1342 for (
int k = 0; k < current_edges_num; ++k) {
1343 values[nz_index_tmp] = -std::sin(x[state_index_tmp + 2]) * Aj(k, 0)
1344 + std::cos(x[state_index_tmp + 2]) * Aj(k, 1);
1349 values[nz_index_tmp] = 1.0;
1352 values[nz_index_tmp] = -1.0;
1358 for (
int k = 0; k < 4; ++k) {
1359 tmp3 += -g_[k] * x[n_index_tmp + k];
1362 for (
int k = 0; k < current_edges_num; ++k) {
1363 tmp4 += bj(k, 0) * x[l_index_tmp + k];
1367 values[nz_index_tmp] = tmp1;
1370 values[nz_index_tmp] = tmp2;
1373 values[nz_index_tmp] = -std::sin(x[state_index_tmp + 2]) * offset_ * tmp1
1374 + std::cos(x[state_index_tmp + 2]) * offset_ * tmp2;
1378 for (
int k = 0; k < current_edges_num; ++k) {
1379 values[nz_index_tmp] = (x[state_index_tmp] + std::cos(x[state_index_tmp + 2]) * offset_) * Aj(k, 0)
1380 + (x[state_index_tmp + 1] + std::sin(x[state_index_tmp + 2]) * offset_) * Aj(k, 1)
1386 for (
int k = 0; k < 4; ++k) {
1387 values[nz_index_tmp] = -g_[k];
1392 for (
int jj = 0; jj < obstacles_num_; ++jj) {
1393 nz_index += 4 * (horizon_ + 1) * obstacles_edges_num_(jj, 0);
1394 nz_index += 13 * (horizon_ + 1);
1398 state_index = state_start_index_;
1399 control_index = control_start_index_;
1400 time_index = time_start_index_;
1401 l_index = l_start_index_;
1402 n_index = n_start_index_;
1405 values[nz_index] = 1.0;
1407 values[nz_index] = 1.0;
1409 values[nz_index] = 1.0;
1411 values[nz_index] = 1.0;
1414 for (
int i = 1; i < horizon_; ++i) {
1415 values[nz_index] = 1.0;
1417 values[nz_index] = 1.0;
1419 values[nz_index] = 1.0;
1424 values[nz_index] = 1.0;
1426 values[nz_index] = 1.0;
1428 values[nz_index] = 1.0;
1430 values[nz_index] = 1.0;
1433 for (
int i = 0; i < horizon_; ++i) {
1434 values[nz_index] = 1.0;
1436 values[nz_index] = 1.0;
1440 for (
int i = 0; i < horizon_ + 1; ++i) {
1441 values[nz_index] = 1.0;
1445 for (
int i = 0; i < lambda_horizon_; ++i) {
1446 values[nz_index] = 1.0;
1450 for (
int i = 0; i < miu_horizon_; ++i) {
1451 values[nz_index] = 1.0;
1455 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
1456 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1459 ADEBUG <<
"eval_jac_g done";
1473 CHECK_EQ(n, num_of_variables_) <<
"No. of variables wrong in eval_jac_g. n : " << n;
1474 CHECK_EQ(m, num_of_constraints_) <<
"No. of constraints wrong in eval_jac_g. n : " << m;
1476 if (values ==
nullptr) {
1478 int constraint_index = 0;
1479 int state_index = state_start_index_;
1480 int control_index = control_start_index_;
1481 int time_index = time_start_index_;
1484 for (
int i = 0; i < horizon_; ++i) {
1486 iRow[nz_index] = state_index;
1487 jCol[nz_index] = state_index;
1490 iRow[nz_index] = state_index;
1491 jCol[nz_index] = state_index + 2;
1494 iRow[nz_index] = state_index;
1495 jCol[nz_index] = state_index + 3;
1498 iRow[nz_index] = state_index;
1499 jCol[nz_index] = state_index + 4;
1503 iRow[nz_index] = state_index;
1504 jCol[nz_index] = control_index;
1507 iRow[nz_index] = state_index;
1508 jCol[nz_index] = control_index + 1;
1512 iRow[nz_index] = state_index;
1513 jCol[nz_index] = time_index;
1517 iRow[nz_index] = state_index + 1;
1518 jCol[nz_index] = state_index + 1;
1521 iRow[nz_index] = state_index + 1;
1522 jCol[nz_index] = state_index + 2;
1525 iRow[nz_index] = state_index + 1;
1526 jCol[nz_index] = state_index + 3;
1529 iRow[nz_index] = state_index + 1;
1530 jCol[nz_index] = state_index + 5;
1534 iRow[nz_index] = state_index + 1;
1535 jCol[nz_index] = control_index;
1538 iRow[nz_index] = state_index + 1;
1539 jCol[nz_index] = control_index + 1;
1543 iRow[nz_index] = state_index + 1;
1544 jCol[nz_index] = time_index;
1548 iRow[nz_index] = state_index + 2;
1549 jCol[nz_index] = state_index + 2;
1552 iRow[nz_index] = state_index + 2;
1553 jCol[nz_index] = state_index + 3;
1556 iRow[nz_index] = state_index + 2;
1557 jCol[nz_index] = state_index + 6;
1561 iRow[nz_index] = state_index + 2;
1562 jCol[nz_index] = control_index;
1565 iRow[nz_index] = state_index + 2;
1566 jCol[nz_index] = control_index + 1;
1570 iRow[nz_index] = state_index + 2;
1571 jCol[nz_index] = time_index;
1575 iRow[nz_index] = state_index + 3;
1576 jCol[nz_index] = state_index + 3;
1579 iRow[nz_index] = state_index + 3;
1580 jCol[nz_index] = state_index + 7;
1584 iRow[nz_index] = state_index + 3;
1585 jCol[nz_index] = control_index + 1;
1589 iRow[nz_index] = state_index + 3;
1590 jCol[nz_index] = time_index;
1596 constraint_index += 4;
1600 control_index = control_start_index_;
1601 state_index = state_start_index_;
1602 time_index = time_start_index_;
1605 iRow[nz_index] = constraint_index;
1606 jCol[nz_index] = control_index;
1610 iRow[nz_index] = constraint_index;
1611 jCol[nz_index] = time_index;
1618 for (
int i = 1; i < horizon_; ++i) {
1620 iRow[nz_index] = constraint_index;
1621 jCol[nz_index] = control_index - 2;
1625 iRow[nz_index] = constraint_index;
1626 jCol[nz_index] = control_index;
1630 iRow[nz_index] = constraint_index;
1631 jCol[nz_index] = time_index;
1641 time_index = time_start_index_;
1643 for (
int i = 0; i < horizon_; ++i) {
1645 iRow[nz_index] = constraint_index;
1646 jCol[nz_index] = time_index;
1650 iRow[nz_index] = constraint_index;
1651 jCol[nz_index] = time_index + 1;
1660 state_index = state_start_index_;
1661 int l_index = l_start_index_;
1662 int n_index = n_start_index_;
1663 for (
int i = 0; i < horizon_ + 1; ++i) {
1664 for (
int j = 0; j < obstacles_num_; ++j) {
1665 int current_edges_num = obstacles_edges_num_(j, 0);
1668 for (
int k = 0; k < current_edges_num; ++k) {
1670 iRow[nz_index] = constraint_index;
1671 jCol[nz_index] = l_index + k;
1677 iRow[nz_index] = constraint_index + 1;
1678 jCol[nz_index] = state_index + 2;
1682 for (
int k = 0; k < current_edges_num; ++k) {
1683 iRow[nz_index] = constraint_index + 1;
1684 jCol[nz_index] = l_index + k;
1689 iRow[nz_index] = constraint_index + 1;
1690 jCol[nz_index] = n_index;
1693 iRow[nz_index] = constraint_index + 1;
1694 jCol[nz_index] = n_index + 2;
1699 iRow[nz_index] = constraint_index + 2;
1700 jCol[nz_index] = state_index + 2;
1704 for (
int k = 0; k < current_edges_num; ++k) {
1705 iRow[nz_index] = constraint_index + 2;
1706 jCol[nz_index] = l_index + k;
1711 iRow[nz_index] = constraint_index + 2;
1712 jCol[nz_index] = n_index + 1;
1715 iRow[nz_index] = constraint_index + 2;
1716 jCol[nz_index] = n_index + 3;
1721 iRow[nz_index] = constraint_index + 3;
1722 jCol[nz_index] = state_index;
1725 iRow[nz_index] = constraint_index + 3;
1726 jCol[nz_index] = state_index + 1;
1729 iRow[nz_index] = constraint_index + 3;
1730 jCol[nz_index] = state_index + 2;
1734 for (
int k = 0; k < current_edges_num; ++k) {
1735 iRow[nz_index] = constraint_index + 3;
1736 jCol[nz_index] = l_index + k;
1741 for (
int k = 0; k < 4; ++k) {
1742 iRow[nz_index] = constraint_index + 3;
1743 jCol[nz_index] = n_index + k;
1748 l_index += current_edges_num;
1750 constraint_index += 4;
1756 state_index = state_start_index_;
1757 control_index = control_start_index_;
1758 time_index = time_start_index_;
1759 l_index = l_start_index_;
1760 n_index = n_start_index_;
1763 iRow[nz_index] = constraint_index;
1764 jCol[nz_index] = state_index;
1766 iRow[nz_index] = constraint_index + 1;
1767 jCol[nz_index] = state_index + 1;
1769 iRow[nz_index] = constraint_index + 2;
1770 jCol[nz_index] = state_index + 2;
1772 iRow[nz_index] = constraint_index + 3;
1773 jCol[nz_index] = state_index + 3;
1775 constraint_index += 4;
1778 for (
int i = 1; i < horizon_; ++i) {
1779 iRow[nz_index] = constraint_index;
1780 jCol[nz_index] = state_index;
1782 iRow[nz_index] = constraint_index + 1;
1783 jCol[nz_index] = state_index + 1;
1785 iRow[nz_index] = constraint_index + 2;
1786 jCol[nz_index] = state_index + 3;
1788 constraint_index += 3;
1793 iRow[nz_index] = constraint_index;
1794 jCol[nz_index] = state_index;
1796 iRow[nz_index] = constraint_index + 1;
1797 jCol[nz_index] = state_index + 1;
1799 iRow[nz_index] = constraint_index + 2;
1800 jCol[nz_index] = state_index + 2;
1802 iRow[nz_index] = constraint_index + 3;
1803 jCol[nz_index] = state_index + 3;
1805 constraint_index += 4;
1808 for (
int i = 0; i < horizon_; ++i) {
1809 iRow[nz_index] = constraint_index;
1810 jCol[nz_index] = control_index;
1812 iRow[nz_index] = constraint_index + 1;
1813 jCol[nz_index] = control_index + 1;
1815 constraint_index += 2;
1819 for (
int i = 0; i < horizon_ + 1; ++i) {
1820 iRow[nz_index] = constraint_index;
1821 jCol[nz_index] = time_index;
1827 for (
int i = 0; i < lambda_horizon_; ++i) {
1828 iRow[nz_index] = constraint_index;
1829 jCol[nz_index] = l_index;
1835 for (
int i = 0; i < miu_horizon_; ++i) {
1836 iRow[nz_index] = constraint_index;
1837 jCol[nz_index] = n_index;
1843 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1844 CHECK_EQ(constraint_index,
static_cast<int>(m));
1846 std::fill(values, values + nele_jac, 0.0);
1849 int time_index = time_start_index_;
1850 int state_index = state_start_index_;
1851 int control_index = control_start_index_;
1856 for (
int i = 0; i < horizon_; ++i) {
1857 values[nz_index] = -1.0;
1860 values[nz_index] = x[time_index] * ts_
1861 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1862 * std::sin(x[state_index + 2]
1863 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1867 values[nz_index] = -1.0
1868 * (x[time_index] * ts_
1871 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1873 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1874 * (-1) * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1877 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1881 values[nz_index] = 1.0;
1884 values[nz_index] = x[time_index] * ts_
1885 * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1886 * std::sin(x[state_index + 2]
1887 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1889 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1890 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_;
1893 values[nz_index] = -1.0
1894 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1897 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1901 values[nz_index] = -1.0
1902 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1905 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1907 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1910 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1912 - x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1913 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1916 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1920 values[nz_index] = -1.0;
1923 values[nz_index] = -1.0
1924 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1927 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1931 values[nz_index] = -1.0
1932 * (x[time_index] * ts_
1935 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1937 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1938 * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1941 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1945 values[nz_index] = 1.0;
1948 values[nz_index] = -1.0
1949 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1952 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1954 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1955 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1958 values[nz_index] = -1.0
1959 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1962 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1966 values[nz_index] = -1.0
1967 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1970 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1972 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1975 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1977 + x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1978 * x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) / wheelbase_
1981 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1985 values[nz_index] = -1.0;
1988 values[nz_index] = -1.0 * x[time_index] * ts_ * std::tan(x[control_index]) / wheelbase_;
1991 values[nz_index] = 1.0;
1994 values[nz_index] = -1.0
1995 * (x[time_index] * ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1996 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1999 values[nz_index] = -1.0
2000 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 * std::tan(x[control_index])
2004 values[nz_index] = -1.0
2005 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
2006 * std::tan(x[control_index]) / wheelbase_
2007 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] * std::tan(x[control_index])
2011 values[nz_index] = -1.0;
2014 values[nz_index] = 1.0;
2017 values[nz_index] = -1.0 * ts_ * x[time_index];
2020 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
2029 control_index = control_start_index_;
2030 state_index = state_start_index_;
2031 time_index = time_start_index_;
2036 values[nz_index] = 1.0 / x[time_index] / ts_;
2040 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) / x[time_index] / x[time_index] / ts_;
2045 for (
int i = 1; i < horizon_; ++i) {
2048 values[nz_index] = -1.0 / x[time_index] / ts_;
2052 values[nz_index] = 1.0 / x[time_index] / ts_;
2056 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) / x[time_index] / x[time_index] / ts_;
2063 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : " << nz_index
2064 <<
" nele_jac : " << nele_jac;
2067 time_index = time_start_index_;
2068 for (
int i = 0; i < horizon_; ++i) {
2070 values[nz_index] = -1.0;
2074 values[nz_index] = 1.0;
2080 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : " << nz_index <<
" nele_jac : " << nele_jac;
2085 state_index = state_start_index_;
2086 int l_index = l_start_index_;
2087 int n_index = n_start_index_;
2089 for (
int i = 0; i < horizon_ + 1; ++i) {
2090 int edges_counter = 0;
2091 for (
int j = 0; j < obstacles_num_; ++j) {
2092 int current_edges_num = obstacles_edges_num_(j, 0);
2093 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
2094 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
2099 for (
int k = 0; k < current_edges_num; ++k) {
2101 tmp1 += Aj(k, 0) * x[l_index + k];
2102 tmp2 += Aj(k, 1) * x[l_index + k];
2106 for (
int k = 0; k < current_edges_num; ++k) {
2108 values[nz_index] = 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
2114 values[nz_index] = -std::sin(x[state_index + 2]) * tmp1 + std::cos(x[state_index + 2]) * tmp2;
2118 for (
int k = 0; k < current_edges_num; ++k) {
2119 values[nz_index] = std::cos(x[state_index + 2]) * Aj(k, 0)
2120 + std::sin(x[state_index + 2]) * Aj(k, 1);
2125 values[nz_index] = 1.0;
2128 values[nz_index] = -1.0;
2133 values[nz_index] = -std::cos(x[state_index + 2]) * tmp1 - std::sin(x[state_index + 2]) * tmp2;
2137 for (
int k = 0; k < current_edges_num; ++k) {
2138 values[nz_index] = -std::sin(x[state_index + 2]) * Aj(k, 0)
2139 + std::cos(x[state_index + 2]) * Aj(k, 1);
2144 values[nz_index] = 1.0;
2147 values[nz_index] = -1.0;
2153 for (
int k = 0; k < 4; ++k) {
2154 tmp3 += -g_[k] * x[n_index + k];
2157 for (
int k = 0; k < current_edges_num; ++k) {
2158 tmp4 += bj(k, 0) * x[l_index + k];
2162 values[nz_index] = tmp1;
2165 values[nz_index] = tmp2;
2168 values[nz_index] = -std::sin(x[state_index + 2]) * offset_ * tmp1
2169 + std::cos(x[state_index + 2]) * offset_ * tmp2;
2173 for (
int k = 0; k < current_edges_num; ++k) {
2174 values[nz_index] = (x[state_index] + std::cos(x[state_index + 2]) * offset_) * Aj(k, 0)
2175 + (x[state_index + 1] + std::sin(x[state_index + 2]) * offset_) * Aj(k, 1)
2181 for (
int k = 0; k < 4; ++k) {
2182 values[nz_index] = -g_[k];
2187 edges_counter += current_edges_num;
2188 l_index += current_edges_num;
2195 state_index = state_start_index_;
2196 control_index = control_start_index_;
2197 time_index = time_start_index_;
2198 l_index = l_start_index_;
2199 n_index = n_start_index_;
2202 values[nz_index] = 1.0;
2204 values[nz_index] = 1.0;
2206 values[nz_index] = 1.0;
2208 values[nz_index] = 1.0;
2211 for (
int i = 1; i < horizon_; ++i) {
2212 values[nz_index] = 1.0;
2214 values[nz_index] = 1.0;
2216 values[nz_index] = 1.0;
2221 values[nz_index] = 1.0;
2223 values[nz_index] = 1.0;
2225 values[nz_index] = 1.0;
2227 values[nz_index] = 1.0;
2230 for (
int i = 0; i < horizon_; ++i) {
2231 values[nz_index] = 1.0;
2233 values[nz_index] = 1.0;
2237 for (
int i = 0; i < horizon_ + 1; ++i) {
2238 values[nz_index] = 1.0;
2242 for (
int i = 0; i < lambda_horizon_; ++i) {
2243 values[nz_index] = 1.0;
2247 for (
int i = 0; i < miu_horizon_; ++i) {
2248 values[nz_index] = 1.0;
2252 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
2253 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
2256 ADEBUG <<
"eval_jac_g done";
2505 ADEBUG <<
"eval_constraints";
2507 int state_index = state_start_index_;
2510 int control_index = control_start_index_;
2513 int time_index = time_start_index_;
2515 int constraint_index = 0;
2518 for (
int i = 0; i < horizon_; ++i) {
2522 g[constraint_index] = x[state_index + 4]
2524 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
2525 * cos(x[state_index + 2]
2526 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
2529 g[constraint_index + 1] = x[state_index + 5]
2530 - (x[state_index + 1]
2531 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
2532 * sin(x[state_index + 2]
2533 + ts_ * x[time_index] * 0.5 * x[state_index + 3] * tan(x[control_index])
2537 g[constraint_index + 2] = x[state_index + 6]
2538 - (x[state_index + 2]
2539 + ts_ * x[time_index] * (x[state_index + 3] + ts_ * x[time_index] * 0.5 * x[control_index + 1])
2540 * tan(x[control_index]) / wheelbase_);
2543 g[constraint_index + 3]
2544 = x[state_index + 7] - (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
2547 constraint_index += 4;
2552 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
2554 << constraint_index;
2558 control_index = control_start_index_;
2559 time_index = time_start_index_;
2562 g[constraint_index] = (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
2567 for (
int i = 1; i < horizon_; ++i) {
2568 g[constraint_index] = (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
2575 time_index = time_start_index_;
2576 for (
int i = 0; i < horizon_; ++i) {
2577 g[constraint_index] = x[time_index + 1] - x[time_index];
2582 ADEBUG <<
"constraint_index after adding time constraints "
2584 << constraint_index;
2588 state_index = state_start_index_;
2589 int l_index = l_start_index_;
2590 int n_index = n_start_index_;
2592 for (
int i = 0; i < horizon_ + 1; ++i) {
2593 int edges_counter = 0;
2594 for (
int j = 0; j < obstacles_num_; ++j) {
2595 int current_edges_num = obstacles_edges_num_(j, 0);
2596 Eigen::MatrixXd Aj = obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
2597 Eigen::MatrixXd bj = obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
2602 for (
int k = 0; k < current_edges_num; ++k) {
2604 tmp1 += Aj(k, 0) * x[l_index + k];
2605 tmp2 += Aj(k, 1) * x[l_index + k];
2607 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
2610 g[constraint_index + 1]
2611 = x[n_index] - x[n_index + 2] + cos(x[state_index + 2]) * tmp1 + sin(x[state_index + 2]) * tmp2;
2613 g[constraint_index + 2]
2614 = x[n_index + 1] - x[n_index + 3] - sin(x[state_index + 2]) * tmp1 + cos(x[state_index + 2]) * tmp2;
2618 for (
int k = 0; k < 4; ++k) {
2619 tmp3 += -g_[k] * x[n_index + k];
2623 for (
int k = 0; k < current_edges_num; ++k) {
2624 tmp4 += bj(k, 0) * x[l_index + k];
2627 g[constraint_index + 3] = tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1
2628 + (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 - tmp4;
2631 edges_counter += current_edges_num;
2632 l_index += current_edges_num;
2634 constraint_index += 4;
2638 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
2640 << constraint_index;
2643 state_index = state_start_index_;
2644 control_index = control_start_index_;
2645 time_index = time_start_index_;
2646 l_index = l_start_index_;
2647 n_index = n_start_index_;
2650 g[constraint_index] = x[state_index];
2651 g[constraint_index + 1] = x[state_index + 1];
2652 g[constraint_index + 2] = x[state_index + 2];
2653 g[constraint_index + 3] = x[state_index + 3];
2654 constraint_index += 4;
2658 for (
int i = 1; i < horizon_; ++i) {
2659 g[constraint_index] = x[state_index];
2660 g[constraint_index + 1] = x[state_index + 1];
2661 g[constraint_index + 2] = x[state_index + 3];
2662 constraint_index += 3;
2667 g[constraint_index] = x[state_index];
2668 g[constraint_index + 1] = x[state_index + 1];
2669 g[constraint_index + 2] = x[state_index + 2];
2670 g[constraint_index + 3] = x[state_index + 3];
2671 constraint_index += 4;
2674 for (
int i = 0; i < horizon_; ++i) {
2675 g[constraint_index] = x[control_index];
2676 g[constraint_index + 1] = x[control_index + 1];
2677 constraint_index += 2;
2681 for (
int i = 0; i < horizon_ + 1; ++i) {
2682 g[constraint_index] = x[time_index];
2687 for (
int i = 0; i < lambda_horizon_; ++i) {
2688 g[constraint_index] = x[l_index];
2693 for (
int i = 0; i < miu_horizon_; ++i) {
2694 g[constraint_index] = x[n_index];