178 ADEBUG <<
"get_bounds_info";
179 ACHECK(XYbounds_.size() == 4)
180 <<
"XYbounds_ size is not 4, but" << XYbounds_.size();
185 int variable_index = 0;
186 for (
int i = 0; i < 4; ++i) {
193 for (
int i = 1; i < horizon_; ++i) {
195 x_l[variable_index] = -2e19;
196 x_u[variable_index] = 2e19;
199 x_l[variable_index + 1] = -2e19;
200 x_u[variable_index + 1] = 2e19;
203 x_l[variable_index + 2] = -2e19;
204 x_u[variable_index + 2] = 2e19;
207 x_l[variable_index + 3] = -2e19;
208 x_u[variable_index + 3] = 2e19;
214 for (
int i = 0; i < 4; ++i) {
215 x_l[variable_index + i] = -2e19;
216 x_u[variable_index + i] = 2e19;
219 ADEBUG <<
"variable_index after adding state variables : " << variable_index;
222 for (
int i = 0; i < horizon_; ++i) {
224 x_l[variable_index] = -2e19;
225 x_u[variable_index] = 2e19;
228 x_l[variable_index + 1] = -2e19;
229 x_u[variable_index + 1] = 2e19;
233 ADEBUG <<
"variable_index after adding control variables : "
237 for (
int i = 0; i < horizon_ + 1; ++i) {
238 x_l[variable_index] = -2e19;
239 x_u[variable_index] = 2e19;
242 ADEBUG <<
"variable_index after adding sample time : " << variable_index;
243 ADEBUG <<
"sample time fix time status is : " << use_fix_time_;
247 for (
int i = 0; i < horizon_ + 1; ++i) {
248 for (
int j = 0; j < obstacles_edges_sum_; ++j) {
249 x_l[variable_index] = 0.0;
250 x_u[variable_index] = 2e19;
254 ADEBUG <<
"variable_index after adding lagrange l : " << variable_index;
257 for (
int i = 0; i < horizon_ + 1; ++i) {
258 for (
int j = 0; j < 4 * obstacles_num_; ++j) {
259 x_l[variable_index] = 0.0;
260 x_u[variable_index] = 2e19;
265 ADEBUG <<
"variable_index after adding lagrange n : " << variable_index;
271 int constraint_index = 0;
272 for (
int i = 0; i < 4 * horizon_; ++i) {
276 constraint_index += 4 * horizon_;
278 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints: "
283 for (
int i = 0; i < horizon_; ++i) {
284 g_l[constraint_index] = -max_steer_rate_;
285 g_u[constraint_index] = max_steer_rate_;
289 ADEBUG <<
"constraint_index after adding steering rate constraints: "
293 for (
int i = 0; i < horizon_; ++i) {
294 g_l[constraint_index] = 0.0;
295 g_u[constraint_index] = 0.0;
299 ADEBUG <<
"constraint_index after adding time constraints: "
304 for (
int i = 0; i < horizon_ + 1; ++i) {
305 for (
int j = 0; j < obstacles_num_; ++j) {
307 g_l[constraint_index] = -2e19;
308 g_u[constraint_index] = 1.0;
311 g_l[constraint_index + 1] = 0.0;
312 g_u[constraint_index + 1] = 0.0;
313 g_l[constraint_index + 2] = 0.0;
314 g_u[constraint_index + 2] = 0.0;
317 g_l[constraint_index + 3] = min_safety_distance_;
318 g_u[constraint_index + 3] = 2e19;
319 constraint_index += 4;
325 g_l[constraint_index] = x0_(0, 0);
326 g_u[constraint_index] = x0_(0, 0);
327 g_l[constraint_index + 1] = x0_(1, 0);
328 g_u[constraint_index + 1] = x0_(1, 0);
329 g_l[constraint_index + 2] = x0_(2, 0);
330 g_u[constraint_index + 2] = x0_(2, 0);
331 g_l[constraint_index + 3] = x0_(3, 0);
332 g_u[constraint_index + 3] = x0_(3, 0);
333 constraint_index += 4;
335 for (
int i = 1; i < horizon_; ++i) {
336 g_l[constraint_index] = XYbounds_[0];
337 g_u[constraint_index] = XYbounds_[1];
338 g_l[constraint_index + 1] = XYbounds_[2];
339 g_u[constraint_index + 1] = XYbounds_[3];
340 g_l[constraint_index + 2] = -max_speed_reverse_;
341 g_u[constraint_index + 2] = max_speed_forward_;
342 constraint_index += 3;
346 g_l[constraint_index] = xf_(0, 0);
347 g_u[constraint_index] = xf_(0, 0);
348 g_l[constraint_index + 1] = xf_(1, 0);
349 g_u[constraint_index + 1] = xf_(1, 0);
350 g_l[constraint_index + 2] = xf_(2, 0);
351 g_u[constraint_index + 2] = xf_(2, 0);
352 g_l[constraint_index + 3] = xf_(3, 0);
353 g_u[constraint_index + 3] = xf_(3, 0);
354 constraint_index += 4;
356 for (
int i = 0; i < horizon_; ++i) {
357 g_l[constraint_index] = -max_steer_angle_;
358 g_u[constraint_index] = max_steer_angle_;
359 g_l[constraint_index + 1] = -max_acceleration_reverse_;
360 g_u[constraint_index + 1] = max_acceleration_forward_;
361 constraint_index += 2;
364 for (
int i = 0; i < horizon_ + 1; ++i) {
365 if (!use_fix_time_) {
366 g_l[constraint_index] = min_time_sample_scaling_;
367 g_u[constraint_index] = max_time_sample_scaling_;
369 g_l[constraint_index] = 1.0;
370 g_u[constraint_index] = 1.0;
375 for (
int i = 0; i < lambda_horizon_; ++i) {
376 g_l[constraint_index] = 0.0;
377 g_u[constraint_index] = 2e19;
381 for (
int i = 0; i < miu_horizon_; ++i) {
382 g_l[constraint_index] = 0.0;
383 g_u[constraint_index] = 2e19;
387 ADEBUG <<
"constraint_index after adding obstacles constraints: "
389 ADEBUG <<
"get_bounds_info_ out";
568 int nele_jac,
int* iRow,
572 CHECK_EQ(n, num_of_variables_)
573 <<
"No. of variables wrong in eval_jac_g. n : " << n;
574 CHECK_EQ(m, num_of_constraints_)
575 <<
"No. of constraints wrong in eval_jac_g. n : " << m;
577 if (values ==
nullptr) {
579 int constraint_index = 0;
580 int state_index = state_start_index_;
581 int control_index = control_start_index_;
582 int time_index = time_start_index_;
585 for (
int i = 0; i < horizon_; ++i) {
587 iRow[nz_index] = state_index;
588 jCol[nz_index] = state_index;
591 iRow[nz_index] = state_index;
592 jCol[nz_index] = state_index + 2;
595 iRow[nz_index] = state_index;
596 jCol[nz_index] = state_index + 3;
599 iRow[nz_index] = state_index;
600 jCol[nz_index] = state_index + 4;
604 iRow[nz_index] = state_index;
605 jCol[nz_index] = control_index;
608 iRow[nz_index] = state_index;
609 jCol[nz_index] = control_index + 1;
613 iRow[nz_index] = state_index;
614 jCol[nz_index] = time_index;
618 iRow[nz_index] = state_index + 1;
619 jCol[nz_index] = state_index + 1;
622 iRow[nz_index] = state_index + 1;
623 jCol[nz_index] = state_index + 2;
626 iRow[nz_index] = state_index + 1;
627 jCol[nz_index] = state_index + 3;
630 iRow[nz_index] = state_index + 1;
631 jCol[nz_index] = state_index + 5;
635 iRow[nz_index] = state_index + 1;
636 jCol[nz_index] = control_index;
639 iRow[nz_index] = state_index + 1;
640 jCol[nz_index] = control_index + 1;
644 iRow[nz_index] = state_index + 1;
645 jCol[nz_index] = time_index;
649 iRow[nz_index] = state_index + 2;
650 jCol[nz_index] = state_index + 2;
653 iRow[nz_index] = state_index + 2;
654 jCol[nz_index] = state_index + 3;
657 iRow[nz_index] = state_index + 2;
658 jCol[nz_index] = state_index + 6;
662 iRow[nz_index] = state_index + 2;
663 jCol[nz_index] = control_index;
666 iRow[nz_index] = state_index + 2;
667 jCol[nz_index] = control_index + 1;
671 iRow[nz_index] = state_index + 2;
672 jCol[nz_index] = time_index;
676 iRow[nz_index] = state_index + 3;
677 jCol[nz_index] = state_index + 3;
680 iRow[nz_index] = state_index + 3;
681 jCol[nz_index] = state_index + 7;
685 iRow[nz_index] = state_index + 3;
686 jCol[nz_index] = control_index + 1;
690 iRow[nz_index] = state_index + 3;
691 jCol[nz_index] = time_index;
697 constraint_index += 4;
701 control_index = control_start_index_;
702 state_index = state_start_index_;
703 time_index = time_start_index_;
706 iRow[nz_index] = constraint_index;
707 jCol[nz_index] = control_index;
711 iRow[nz_index] = constraint_index;
712 jCol[nz_index] = time_index;
719 for (
int i = 1; i < horizon_; ++i) {
721 iRow[nz_index] = constraint_index;
722 jCol[nz_index] = control_index - 2;
726 iRow[nz_index] = constraint_index;
727 jCol[nz_index] = control_index;
731 iRow[nz_index] = constraint_index;
732 jCol[nz_index] = time_index;
742 time_index = time_start_index_;
744 for (
int i = 0; i < horizon_; ++i) {
746 iRow[nz_index] = constraint_index;
747 jCol[nz_index] = time_index;
751 iRow[nz_index] = constraint_index;
752 jCol[nz_index] = time_index + 1;
761 state_index = state_start_index_;
762 int l_index = l_start_index_;
763 int n_index = n_start_index_;
765#pragma omp parallel for schedule(dynamic, 1) num_threads(4)
766 for (
int iter = 0; iter < (horizon_ + 1) * obstacles_num_; iter++) {
767 int i = iter / obstacles_num_;
768 int j = iter % obstacles_num_;
769 int current_edges_num = obstacles_edges_num_(j, 0);
770 int nz_index_tmp = nz_index;
771 int l_index_tmp = l_index;
773 for (
int jj = 0; jj < obstacles_num_; ++jj) {
775 nz_index_tmp += 4 * (i + 1) * obstacles_edges_num_(jj, 0);
776 nz_index_tmp += 13 * (i + 1);
777 l_index_tmp += (i + 1) * obstacles_edges_num_(jj, 0);
779 nz_index_tmp += 4 * i * obstacles_edges_num_(jj, 0);
780 nz_index_tmp += 13 * i;
781 l_index_tmp += i * obstacles_edges_num_(jj, 0);
784 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
785 int constraint_index_tmp =
786 constraint_index + (i * obstacles_num_ + j) * 4;
787 int state_index_tmp = state_index + i * 4;
790 for (
int k = 0; k < current_edges_num; ++k) {
792 iRow[nz_index_tmp] = constraint_index_tmp;
793 jCol[nz_index_tmp] = l_index_tmp + k;
799 iRow[nz_index_tmp] = constraint_index_tmp + 1;
800 jCol[nz_index_tmp] = state_index_tmp + 2;
804 for (
int k = 0; k < current_edges_num; ++k) {
805 iRow[nz_index_tmp] = constraint_index_tmp + 1;
806 jCol[nz_index_tmp] = l_index_tmp + k;
811 iRow[nz_index_tmp] = constraint_index_tmp + 1;
812 jCol[nz_index_tmp] = n_index_tmp;
815 iRow[nz_index_tmp] = constraint_index_tmp + 1;
816 jCol[nz_index_tmp] = n_index_tmp + 2;
821 iRow[nz_index_tmp] = constraint_index_tmp + 2;
822 jCol[nz_index_tmp] = state_index_tmp + 2;
826 for (
int k = 0; k < current_edges_num; ++k) {
827 iRow[nz_index_tmp] = constraint_index_tmp + 2;
828 jCol[nz_index_tmp] = l_index_tmp + k;
833 iRow[nz_index_tmp] = constraint_index_tmp + 2;
834 jCol[nz_index_tmp] = n_index_tmp + 1;
837 iRow[nz_index_tmp] = constraint_index_tmp + 2;
838 jCol[nz_index_tmp] = n_index_tmp + 3;
843 iRow[nz_index_tmp] = constraint_index_tmp + 3;
844 jCol[nz_index_tmp] = state_index_tmp;
847 iRow[nz_index_tmp] = constraint_index_tmp + 3;
848 jCol[nz_index_tmp] = state_index_tmp + 1;
851 iRow[nz_index_tmp] = constraint_index_tmp + 3;
852 jCol[nz_index_tmp] = state_index_tmp + 2;
856 for (
int k = 0; k < current_edges_num; ++k) {
857 iRow[nz_index_tmp] = constraint_index_tmp + 3;
858 jCol[nz_index_tmp] = l_index_tmp + k;
863 for (
int k = 0; k < 4; ++k) {
864 iRow[nz_index_tmp] = constraint_index_tmp + 3;
865 jCol[nz_index_tmp] = n_index_tmp + k;
870 for (
int jj = 0; jj < obstacles_num_; ++jj) {
871 nz_index += 4 * (horizon_ + 1) * obstacles_edges_num_(jj, 0);
872 nz_index += 13 * (horizon_ + 1);
874 constraint_index += 4 * (horizon_ + 1) * obstacles_num_;
875 state_index += 4 * (horizon_ + 1);
878 state_index = state_start_index_;
879 control_index = control_start_index_;
880 time_index = time_start_index_;
881 l_index = l_start_index_;
882 n_index = n_start_index_;
885 iRow[nz_index] = constraint_index;
886 jCol[nz_index] = state_index;
888 iRow[nz_index] = constraint_index + 1;
889 jCol[nz_index] = state_index + 1;
891 iRow[nz_index] = constraint_index + 2;
892 jCol[nz_index] = state_index + 2;
894 iRow[nz_index] = constraint_index + 3;
895 jCol[nz_index] = state_index + 3;
897 constraint_index += 4;
900 for (
int i = 1; i < horizon_; ++i) {
901 iRow[nz_index] = constraint_index;
902 jCol[nz_index] = state_index;
904 iRow[nz_index] = constraint_index + 1;
905 jCol[nz_index] = state_index + 1;
907 iRow[nz_index] = constraint_index + 2;
908 jCol[nz_index] = state_index + 3;
910 constraint_index += 3;
915 iRow[nz_index] = constraint_index;
916 jCol[nz_index] = state_index;
918 iRow[nz_index] = constraint_index + 1;
919 jCol[nz_index] = state_index + 1;
921 iRow[nz_index] = constraint_index + 2;
922 jCol[nz_index] = state_index + 2;
924 iRow[nz_index] = constraint_index + 3;
925 jCol[nz_index] = state_index + 3;
927 constraint_index += 4;
930 for (
int i = 0; i < horizon_; ++i) {
931 iRow[nz_index] = constraint_index;
932 jCol[nz_index] = control_index;
934 iRow[nz_index] = constraint_index + 1;
935 jCol[nz_index] = control_index + 1;
937 constraint_index += 2;
941 for (
int i = 0; i < horizon_ + 1; ++i) {
942 iRow[nz_index] = constraint_index;
943 jCol[nz_index] = time_index;
949 for (
int i = 0; i < lambda_horizon_; ++i) {
950 iRow[nz_index] = constraint_index;
951 jCol[nz_index] = l_index;
957 for (
int i = 0; i < miu_horizon_; ++i) {
958 iRow[nz_index] = constraint_index;
959 jCol[nz_index] = n_index;
965 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
966 CHECK_EQ(constraint_index,
static_cast<int>(m));
968 std::fill(values, values + nele_jac, 0.0);
971 int time_index = time_start_index_;
972 int state_index = state_start_index_;
973 int control_index = control_start_index_;
977 for (
int i = 0; i < horizon_; ++i) {
978 values[nz_index] = -1.0;
982 x[time_index] * ts_ *
983 (x[state_index + 3] +
984 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
985 std::sin(x[state_index + 2] +
986 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
987 std::tan(x[control_index]) / wheelbase_);
992 (x[time_index] * ts_ *
993 std::cos(x[state_index + 2] +
994 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
995 std::tan(x[control_index]) / wheelbase_) +
996 x[time_index] * ts_ *
997 (x[state_index + 3] +
998 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
999 (-1) * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) /
1001 std::sin(x[state_index + 2] +
1002 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1003 std::tan(x[control_index]) / wheelbase_));
1006 values[nz_index] = 1.0;
1010 x[time_index] * ts_ *
1011 (x[state_index + 3] +
1012 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1013 std::sin(x[state_index + 2] +
1014 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1015 std::tan(x[control_index]) / wheelbase_) *
1016 x[time_index] * ts_ * 0.5 * x[state_index + 3] /
1017 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1022 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1023 std::cos(x[state_index + 2] +
1024 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1025 std::tan(x[control_index]) / wheelbase_));
1031 (x[state_index + 3] +
1032 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1033 std::cos(x[state_index + 2] +
1034 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1035 std::tan(x[control_index]) / wheelbase_) +
1036 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
1037 std::cos(x[state_index + 2] +
1038 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1039 std::tan(x[control_index]) / wheelbase_) -
1040 x[time_index] * ts_ *
1041 (x[state_index + 3] +
1042 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1043 x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) /
1045 std::sin(x[state_index + 2] +
1046 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1047 std::tan(x[control_index]) / wheelbase_));
1050 values[nz_index] = -1.0;
1054 -1.0 * (x[time_index] * ts_ *
1055 (x[state_index + 3] +
1056 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1057 std::cos(x[state_index + 2] +
1058 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1059 std::tan(x[control_index]) / wheelbase_));
1064 (x[time_index] * ts_ *
1065 std::sin(x[state_index + 2] +
1066 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1067 std::tan(x[control_index]) / wheelbase_) +
1068 x[time_index] * ts_ *
1069 (x[state_index + 3] +
1070 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1071 x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) /
1073 std::cos(x[state_index + 2] +
1074 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1075 std::tan(x[control_index]) / wheelbase_));
1078 values[nz_index] = 1.0;
1082 -1.0 * (x[time_index] * ts_ *
1083 (x[state_index + 3] +
1084 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1085 std::cos(x[state_index + 2] +
1086 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1087 std::tan(x[control_index]) / wheelbase_) *
1088 x[time_index] * ts_ * 0.5 * x[state_index + 3] /
1089 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1094 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1095 std::sin(x[state_index + 2] +
1096 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1097 std::tan(x[control_index]) / wheelbase_));
1103 (x[state_index + 3] +
1104 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1105 std::sin(x[state_index + 2] +
1106 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1107 std::tan(x[control_index]) / wheelbase_) +
1108 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
1109 std::sin(x[state_index + 2] +
1110 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1111 std::tan(x[control_index]) / wheelbase_) +
1112 x[time_index] * ts_ *
1113 (x[state_index + 3] +
1114 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1115 x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) /
1117 std::cos(x[state_index + 2] +
1118 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1119 std::tan(x[control_index]) / wheelbase_));
1122 values[nz_index] = -1.0;
1125 values[nz_index] = -1.0 * x[time_index] * ts_ *
1126 std::tan(x[control_index]) / wheelbase_;
1129 values[nz_index] = 1.0;
1133 -1.0 * (x[time_index] * ts_ *
1134 (x[state_index + 3] +
1135 x[time_index] * ts_ * 0.5 * x[control_index + 1]) /
1136 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1141 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1142 std::tan(x[control_index]) / wheelbase_);
1147 (x[state_index + 3] +
1148 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1149 std::tan(x[control_index]) / wheelbase_ +
1150 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
1151 std::tan(x[control_index]) / wheelbase_);
1154 values[nz_index] = -1.0;
1157 values[nz_index] = 1.0;
1160 values[nz_index] = -1.0 * ts_ * x[time_index];
1163 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
1172 control_index = control_start_index_;
1173 state_index = state_start_index_;
1174 time_index = time_start_index_;
1179 values[nz_index] = 1.0 / x[time_index] / ts_;
1183 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) /
1184 x[time_index] / x[time_index] / ts_;
1189 for (
int i = 1; i < horizon_; ++i) {
1192 values[nz_index] = -1.0 / x[time_index] / ts_;
1196 values[nz_index] = 1.0 / x[time_index] / ts_;
1200 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) /
1201 x[time_index] / x[time_index] / ts_;
1208 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : "
1209 << nz_index <<
" nele_jac : " << nele_jac;
1212 time_index = time_start_index_;
1213 for (
int i = 0; i < horizon_; ++i) {
1215 values[nz_index] = -1.0;
1219 values[nz_index] = 1.0;
1225 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : "
1226 << nz_index <<
" nele_jac : " << nele_jac;
1231 state_index = state_start_index_;
1232 int l_index = l_start_index_;
1233 int n_index = n_start_index_;
1235#pragma omp parallel for schedule(dynamic, 1) num_threads(4)
1236 for (
int iter = 0; iter < (horizon_ + 1) * obstacles_num_; iter++) {
1237 int i = iter / obstacles_num_;
1238 int j = iter % obstacles_num_;
1240 int current_edges_num = obstacles_edges_num_(j, 0);
1241 int edges_counter = 0;
1242 int nz_index_tmp = nz_index;
1243 int l_index_tmp = l_index;
1246 for (
int jj = 0; jj < obstacles_num_; ++jj) {
1248 nz_index_tmp += 4 * (i + 1) * obstacles_edges_num_(jj, 0);
1249 nz_index_tmp += 13 * (i + 1);
1250 l_index_tmp += (i + 1) * obstacles_edges_num_(jj, 0);
1251 edges_counter += obstacles_edges_num_(jj, 0);
1253 nz_index_tmp += 4 * i * obstacles_edges_num_(jj, 0);
1254 nz_index_tmp += 13 * i;
1255 l_index_tmp += i * obstacles_edges_num_(jj, 0);
1258 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
1259 int state_index_tmp = state_index + i * 4;
1261 Eigen::MatrixXd Aj =
1262 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
1263 Eigen::MatrixXd bj =
1264 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
1269 for (
int k = 0; k < current_edges_num; ++k) {
1271 tmp1 += Aj(k, 0) * x[l_index_tmp + k];
1272 tmp2 += Aj(k, 1) * x[l_index_tmp + k];
1276 for (
int k = 0; k < current_edges_num; ++k) {
1278 values[nz_index_tmp] =
1279 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
1285 values[nz_index_tmp] = -std::sin(x[state_index_tmp + 2]) * tmp1 +
1286 std::cos(x[state_index_tmp + 2]) * tmp2;
1290 for (
int k = 0; k < current_edges_num; ++k) {
1291 values[nz_index_tmp] =
1292 std::cos(x[state_index_tmp + 2]) * Aj(k, 0) +
1293 std::sin(x[state_index_tmp + 2]) * Aj(k, 1);
1298 values[nz_index_tmp] = 1.0;
1301 values[nz_index_tmp] = -1.0;
1306 values[nz_index_tmp] = -std::cos(x[state_index_tmp + 2]) * tmp1 -
1307 std::sin(x[state_index_tmp + 2]) * tmp2;
1311 for (
int k = 0; k < current_edges_num; ++k) {
1312 values[nz_index_tmp] =
1313 -std::sin(x[state_index_tmp + 2]) * Aj(k, 0) +
1314 std::cos(x[state_index_tmp + 2]) * Aj(k, 1);
1319 values[nz_index_tmp] = 1.0;
1322 values[nz_index_tmp] = -1.0;
1328 for (
int k = 0; k < 4; ++k) {
1329 tmp3 += -g_[k] * x[n_index_tmp + k];
1332 for (
int k = 0; k < current_edges_num; ++k) {
1333 tmp4 += bj(k, 0) * x[l_index_tmp + k];
1337 values[nz_index_tmp] = tmp1;
1340 values[nz_index_tmp] = tmp2;
1343 values[nz_index_tmp] =
1344 -std::sin(x[state_index_tmp + 2]) * offset_ * tmp1 +
1345 std::cos(x[state_index_tmp + 2]) * offset_ * tmp2;
1349 for (
int k = 0; k < current_edges_num; ++k) {
1350 values[nz_index_tmp] =
1351 (x[state_index_tmp] + std::cos(x[state_index_tmp + 2]) * offset_) *
1353 (x[state_index_tmp + 1] +
1354 std::sin(x[state_index_tmp + 2]) * offset_) *
1361 for (
int k = 0; k < 4; ++k) {
1362 values[nz_index_tmp] = -g_[k];
1367 for (
int jj = 0; jj < obstacles_num_; ++jj) {
1368 nz_index += 4 * (horizon_ + 1) * obstacles_edges_num_(jj, 0);
1369 nz_index += 13 * (horizon_ + 1);
1373 state_index = state_start_index_;
1374 control_index = control_start_index_;
1375 time_index = time_start_index_;
1376 l_index = l_start_index_;
1377 n_index = n_start_index_;
1380 values[nz_index] = 1.0;
1382 values[nz_index] = 1.0;
1384 values[nz_index] = 1.0;
1386 values[nz_index] = 1.0;
1389 for (
int i = 1; i < horizon_; ++i) {
1390 values[nz_index] = 1.0;
1392 values[nz_index] = 1.0;
1394 values[nz_index] = 1.0;
1399 values[nz_index] = 1.0;
1401 values[nz_index] = 1.0;
1403 values[nz_index] = 1.0;
1405 values[nz_index] = 1.0;
1408 for (
int i = 0; i < horizon_; ++i) {
1409 values[nz_index] = 1.0;
1411 values[nz_index] = 1.0;
1415 for (
int i = 0; i < horizon_ + 1; ++i) {
1416 values[nz_index] = 1.0;
1420 for (
int i = 0; i < lambda_horizon_; ++i) {
1421 values[nz_index] = 1.0;
1425 for (
int i = 0; i < miu_horizon_; ++i) {
1426 values[nz_index] = 1.0;
1430 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
1431 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1434 ADEBUG <<
"eval_jac_g done";
1440 int nele_jac,
int* iRow,
1444 CHECK_EQ(n, num_of_variables_)
1445 <<
"No. of variables wrong in eval_jac_g. n : " << n;
1446 CHECK_EQ(m, num_of_constraints_)
1447 <<
"No. of constraints wrong in eval_jac_g. n : " << m;
1449 if (values ==
nullptr) {
1451 int constraint_index = 0;
1452 int state_index = state_start_index_;
1453 int control_index = control_start_index_;
1454 int time_index = time_start_index_;
1457 for (
int i = 0; i < horizon_; ++i) {
1459 iRow[nz_index] = state_index;
1460 jCol[nz_index] = state_index;
1463 iRow[nz_index] = state_index;
1464 jCol[nz_index] = state_index + 2;
1467 iRow[nz_index] = state_index;
1468 jCol[nz_index] = state_index + 3;
1471 iRow[nz_index] = state_index;
1472 jCol[nz_index] = state_index + 4;
1476 iRow[nz_index] = state_index;
1477 jCol[nz_index] = control_index;
1480 iRow[nz_index] = state_index;
1481 jCol[nz_index] = control_index + 1;
1485 iRow[nz_index] = state_index;
1486 jCol[nz_index] = time_index;
1490 iRow[nz_index] = state_index + 1;
1491 jCol[nz_index] = state_index + 1;
1494 iRow[nz_index] = state_index + 1;
1495 jCol[nz_index] = state_index + 2;
1498 iRow[nz_index] = state_index + 1;
1499 jCol[nz_index] = state_index + 3;
1502 iRow[nz_index] = state_index + 1;
1503 jCol[nz_index] = state_index + 5;
1507 iRow[nz_index] = state_index + 1;
1508 jCol[nz_index] = control_index;
1511 iRow[nz_index] = state_index + 1;
1512 jCol[nz_index] = control_index + 1;
1516 iRow[nz_index] = state_index + 1;
1517 jCol[nz_index] = time_index;
1521 iRow[nz_index] = state_index + 2;
1522 jCol[nz_index] = state_index + 2;
1525 iRow[nz_index] = state_index + 2;
1526 jCol[nz_index] = state_index + 3;
1529 iRow[nz_index] = state_index + 2;
1530 jCol[nz_index] = state_index + 6;
1534 iRow[nz_index] = state_index + 2;
1535 jCol[nz_index] = control_index;
1538 iRow[nz_index] = state_index + 2;
1539 jCol[nz_index] = control_index + 1;
1543 iRow[nz_index] = state_index + 2;
1544 jCol[nz_index] = time_index;
1548 iRow[nz_index] = state_index + 3;
1549 jCol[nz_index] = state_index + 3;
1552 iRow[nz_index] = state_index + 3;
1553 jCol[nz_index] = state_index + 7;
1557 iRow[nz_index] = state_index + 3;
1558 jCol[nz_index] = control_index + 1;
1562 iRow[nz_index] = state_index + 3;
1563 jCol[nz_index] = time_index;
1569 constraint_index += 4;
1573 control_index = control_start_index_;
1574 state_index = state_start_index_;
1575 time_index = time_start_index_;
1578 iRow[nz_index] = constraint_index;
1579 jCol[nz_index] = control_index;
1583 iRow[nz_index] = constraint_index;
1584 jCol[nz_index] = time_index;
1591 for (
int i = 1; i < horizon_; ++i) {
1593 iRow[nz_index] = constraint_index;
1594 jCol[nz_index] = control_index - 2;
1598 iRow[nz_index] = constraint_index;
1599 jCol[nz_index] = control_index;
1603 iRow[nz_index] = constraint_index;
1604 jCol[nz_index] = time_index;
1614 time_index = time_start_index_;
1616 for (
int i = 0; i < horizon_; ++i) {
1618 iRow[nz_index] = constraint_index;
1619 jCol[nz_index] = time_index;
1623 iRow[nz_index] = constraint_index;
1624 jCol[nz_index] = time_index + 1;
1633 state_index = state_start_index_;
1634 int l_index = l_start_index_;
1635 int n_index = n_start_index_;
1636 for (
int i = 0; i < horizon_ + 1; ++i) {
1637 for (
int j = 0; j < obstacles_num_; ++j) {
1638 int current_edges_num = obstacles_edges_num_(j, 0);
1641 for (
int k = 0; k < current_edges_num; ++k) {
1643 iRow[nz_index] = constraint_index;
1644 jCol[nz_index] = l_index + k;
1650 iRow[nz_index] = constraint_index + 1;
1651 jCol[nz_index] = state_index + 2;
1655 for (
int k = 0; k < current_edges_num; ++k) {
1656 iRow[nz_index] = constraint_index + 1;
1657 jCol[nz_index] = l_index + k;
1662 iRow[nz_index] = constraint_index + 1;
1663 jCol[nz_index] = n_index;
1666 iRow[nz_index] = constraint_index + 1;
1667 jCol[nz_index] = n_index + 2;
1672 iRow[nz_index] = constraint_index + 2;
1673 jCol[nz_index] = state_index + 2;
1677 for (
int k = 0; k < current_edges_num; ++k) {
1678 iRow[nz_index] = constraint_index + 2;
1679 jCol[nz_index] = l_index + k;
1684 iRow[nz_index] = constraint_index + 2;
1685 jCol[nz_index] = n_index + 1;
1688 iRow[nz_index] = constraint_index + 2;
1689 jCol[nz_index] = n_index + 3;
1694 iRow[nz_index] = constraint_index + 3;
1695 jCol[nz_index] = state_index;
1698 iRow[nz_index] = constraint_index + 3;
1699 jCol[nz_index] = state_index + 1;
1702 iRow[nz_index] = constraint_index + 3;
1703 jCol[nz_index] = state_index + 2;
1707 for (
int k = 0; k < current_edges_num; ++k) {
1708 iRow[nz_index] = constraint_index + 3;
1709 jCol[nz_index] = l_index + k;
1714 for (
int k = 0; k < 4; ++k) {
1715 iRow[nz_index] = constraint_index + 3;
1716 jCol[nz_index] = n_index + k;
1721 l_index += current_edges_num;
1723 constraint_index += 4;
1729 state_index = state_start_index_;
1730 control_index = control_start_index_;
1731 time_index = time_start_index_;
1732 l_index = l_start_index_;
1733 n_index = n_start_index_;
1736 iRow[nz_index] = constraint_index;
1737 jCol[nz_index] = state_index;
1739 iRow[nz_index] = constraint_index + 1;
1740 jCol[nz_index] = state_index + 1;
1742 iRow[nz_index] = constraint_index + 2;
1743 jCol[nz_index] = state_index + 2;
1745 iRow[nz_index] = constraint_index + 3;
1746 jCol[nz_index] = state_index + 3;
1748 constraint_index += 4;
1751 for (
int i = 1; i < horizon_; ++i) {
1752 iRow[nz_index] = constraint_index;
1753 jCol[nz_index] = state_index;
1755 iRow[nz_index] = constraint_index + 1;
1756 jCol[nz_index] = state_index + 1;
1758 iRow[nz_index] = constraint_index + 2;
1759 jCol[nz_index] = state_index + 3;
1761 constraint_index += 3;
1766 iRow[nz_index] = constraint_index;
1767 jCol[nz_index] = state_index;
1769 iRow[nz_index] = constraint_index + 1;
1770 jCol[nz_index] = state_index + 1;
1772 iRow[nz_index] = constraint_index + 2;
1773 jCol[nz_index] = state_index + 2;
1775 iRow[nz_index] = constraint_index + 3;
1776 jCol[nz_index] = state_index + 3;
1778 constraint_index += 4;
1781 for (
int i = 0; i < horizon_; ++i) {
1782 iRow[nz_index] = constraint_index;
1783 jCol[nz_index] = control_index;
1785 iRow[nz_index] = constraint_index + 1;
1786 jCol[nz_index] = control_index + 1;
1788 constraint_index += 2;
1792 for (
int i = 0; i < horizon_ + 1; ++i) {
1793 iRow[nz_index] = constraint_index;
1794 jCol[nz_index] = time_index;
1800 for (
int i = 0; i < lambda_horizon_; ++i) {
1801 iRow[nz_index] = constraint_index;
1802 jCol[nz_index] = l_index;
1808 for (
int i = 0; i < miu_horizon_; ++i) {
1809 iRow[nz_index] = constraint_index;
1810 jCol[nz_index] = n_index;
1816 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
1817 CHECK_EQ(constraint_index,
static_cast<int>(m));
1819 std::fill(values, values + nele_jac, 0.0);
1822 int time_index = time_start_index_;
1823 int state_index = state_start_index_;
1824 int control_index = control_start_index_;
1829 for (
int i = 0; i < horizon_; ++i) {
1830 values[nz_index] = -1.0;
1834 x[time_index] * ts_ *
1835 (x[state_index + 3] +
1836 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1837 std::sin(x[state_index + 2] +
1838 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1839 std::tan(x[control_index]) / wheelbase_);
1844 (x[time_index] * ts_ *
1845 std::cos(x[state_index + 2] +
1846 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1847 std::tan(x[control_index]) / wheelbase_) +
1848 x[time_index] * ts_ *
1849 (x[state_index + 3] +
1850 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1851 (-1) * x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) /
1853 std::sin(x[state_index + 2] +
1854 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1855 std::tan(x[control_index]) / wheelbase_));
1858 values[nz_index] = 1.0;
1862 x[time_index] * ts_ *
1863 (x[state_index + 3] +
1864 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1865 std::sin(x[state_index + 2] +
1866 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1867 std::tan(x[control_index]) / wheelbase_) *
1868 x[time_index] * ts_ * 0.5 * x[state_index + 3] /
1869 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1874 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1875 std::cos(x[state_index + 2] +
1876 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1877 std::tan(x[control_index]) / wheelbase_));
1883 (x[state_index + 3] +
1884 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1885 std::cos(x[state_index + 2] +
1886 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1887 std::tan(x[control_index]) / wheelbase_) +
1888 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
1889 std::cos(x[state_index + 2] +
1890 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1891 std::tan(x[control_index]) / wheelbase_) -
1892 x[time_index] * ts_ *
1893 (x[state_index + 3] +
1894 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1895 x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) /
1897 std::sin(x[state_index + 2] +
1898 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1899 std::tan(x[control_index]) / wheelbase_));
1902 values[nz_index] = -1.0;
1906 -1.0 * (x[time_index] * ts_ *
1907 (x[state_index + 3] +
1908 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1909 std::cos(x[state_index + 2] +
1910 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1911 std::tan(x[control_index]) / wheelbase_));
1916 (x[time_index] * ts_ *
1917 std::sin(x[state_index + 2] +
1918 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1919 std::tan(x[control_index]) / wheelbase_) +
1920 x[time_index] * ts_ *
1921 (x[state_index + 3] +
1922 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1923 x[time_index] * ts_ * 0.5 * std::tan(x[control_index]) /
1925 std::cos(x[state_index + 2] +
1926 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1927 std::tan(x[control_index]) / wheelbase_));
1930 values[nz_index] = 1.0;
1934 -1.0 * (x[time_index] * ts_ *
1935 (x[state_index + 3] +
1936 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1937 std::cos(x[state_index + 2] +
1938 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1939 std::tan(x[control_index]) / wheelbase_) *
1940 x[time_index] * ts_ * 0.5 * x[state_index + 3] /
1941 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1946 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1947 std::sin(x[state_index + 2] +
1948 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1949 std::tan(x[control_index]) / wheelbase_));
1955 (x[state_index + 3] +
1956 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1957 std::sin(x[state_index + 2] +
1958 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1959 std::tan(x[control_index]) / wheelbase_) +
1960 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
1961 std::sin(x[state_index + 2] +
1962 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1963 std::tan(x[control_index]) / wheelbase_) +
1964 x[time_index] * ts_ *
1965 (x[state_index + 3] +
1966 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
1967 x[state_index + 3] * ts_ * 0.5 * std::tan(x[control_index]) /
1969 std::cos(x[state_index + 2] +
1970 x[time_index] * ts_ * 0.5 * x[state_index + 3] *
1971 std::tan(x[control_index]) / wheelbase_));
1974 values[nz_index] = -1.0;
1977 values[nz_index] = -1.0 * x[time_index] * ts_ *
1978 std::tan(x[control_index]) / wheelbase_;
1981 values[nz_index] = 1.0;
1985 -1.0 * (x[time_index] * ts_ *
1986 (x[state_index + 3] +
1987 x[time_index] * ts_ * 0.5 * x[control_index + 1]) /
1988 (std::cos(x[control_index]) * std::cos(x[control_index])) /
1993 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1994 std::tan(x[control_index]) / wheelbase_);
1999 (x[state_index + 3] +
2000 x[time_index] * ts_ * 0.5 * x[control_index + 1]) *
2001 std::tan(x[control_index]) / wheelbase_ +
2002 x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1] *
2003 std::tan(x[control_index]) / wheelbase_);
2006 values[nz_index] = -1.0;
2009 values[nz_index] = 1.0;
2012 values[nz_index] = -1.0 * ts_ * x[time_index];
2015 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
2024 control_index = control_start_index_;
2025 state_index = state_start_index_;
2026 time_index = time_start_index_;
2031 values[nz_index] = 1.0 / x[time_index] / ts_;
2035 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) /
2036 x[time_index] / x[time_index] / ts_;
2041 for (
int i = 1; i < horizon_; ++i) {
2044 values[nz_index] = -1.0 / x[time_index] / ts_;
2048 values[nz_index] = 1.0 / x[time_index] / ts_;
2052 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) /
2053 x[time_index] / x[time_index] / ts_;
2060 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : "
2061 << nz_index <<
" nele_jac : " << nele_jac;
2064 time_index = time_start_index_;
2065 for (
int i = 0; i < horizon_; ++i) {
2067 values[nz_index] = -1.0;
2071 values[nz_index] = 1.0;
2077 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : "
2078 << nz_index <<
" nele_jac : " << nele_jac;
2083 state_index = state_start_index_;
2084 int l_index = l_start_index_;
2085 int n_index = n_start_index_;
2087 for (
int i = 0; i < horizon_ + 1; ++i) {
2088 int edges_counter = 0;
2089 for (
int j = 0; j < obstacles_num_; ++j) {
2090 int current_edges_num = obstacles_edges_num_(j, 0);
2091 Eigen::MatrixXd Aj =
2092 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
2093 Eigen::MatrixXd bj =
2094 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) {
2109 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
2115 values[nz_index] = -std::sin(x[state_index + 2]) * tmp1 +
2116 std::cos(x[state_index + 2]) * tmp2;
2120 for (
int k = 0; k < current_edges_num; ++k) {
2121 values[nz_index] = std::cos(x[state_index + 2]) * Aj(k, 0) +
2122 std::sin(x[state_index + 2]) * Aj(k, 1);
2127 values[nz_index] = 1.0;
2130 values[nz_index] = -1.0;
2135 values[nz_index] = -std::cos(x[state_index + 2]) * tmp1 -
2136 std::sin(x[state_index + 2]) * tmp2;
2140 for (
int k = 0; k < current_edges_num; ++k) {
2141 values[nz_index] = -std::sin(x[state_index + 2]) * Aj(k, 0) +
2142 std::cos(x[state_index + 2]) * Aj(k, 1);
2147 values[nz_index] = 1.0;
2150 values[nz_index] = -1.0;
2156 for (
int k = 0; k < 4; ++k) {
2157 tmp3 += -g_[k] * x[n_index + k];
2160 for (
int k = 0; k < current_edges_num; ++k) {
2161 tmp4 += bj(k, 0) * x[l_index + k];
2165 values[nz_index] = tmp1;
2168 values[nz_index] = tmp2;
2172 -std::sin(x[state_index + 2]) * offset_ * tmp1 +
2173 std::cos(x[state_index + 2]) * offset_ * tmp2;
2177 for (
int k = 0; k < current_edges_num; ++k) {
2179 (x[state_index] + std::cos(x[state_index + 2]) * offset_) *
2181 (x[state_index + 1] + std::sin(x[state_index + 2]) * offset_) *
2188 for (
int k = 0; k < 4; ++k) {
2189 values[nz_index] = -g_[k];
2194 edges_counter += current_edges_num;
2195 l_index += current_edges_num;
2202 state_index = state_start_index_;
2203 control_index = control_start_index_;
2204 time_index = time_start_index_;
2205 l_index = l_start_index_;
2206 n_index = n_start_index_;
2209 values[nz_index] = 1.0;
2211 values[nz_index] = 1.0;
2213 values[nz_index] = 1.0;
2215 values[nz_index] = 1.0;
2218 for (
int i = 1; i < horizon_; ++i) {
2219 values[nz_index] = 1.0;
2221 values[nz_index] = 1.0;
2223 values[nz_index] = 1.0;
2228 values[nz_index] = 1.0;
2230 values[nz_index] = 1.0;
2232 values[nz_index] = 1.0;
2234 values[nz_index] = 1.0;
2237 for (
int i = 0; i < horizon_; ++i) {
2238 values[nz_index] = 1.0;
2240 values[nz_index] = 1.0;
2244 for (
int i = 0; i < horizon_ + 1; ++i) {
2245 values[nz_index] = 1.0;
2249 for (
int i = 0; i < lambda_horizon_; ++i) {
2250 values[nz_index] = 1.0;
2254 for (
int i = 0; i < miu_horizon_; ++i) {
2255 values[nz_index] = 1.0;
2259 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
2260 CHECK_EQ(nz_index,
static_cast<int>(nele_jac));
2263 ADEBUG <<
"eval_jac_g done";
2514 ADEBUG <<
"eval_constraints";
2516 int state_index = state_start_index_;
2519 int control_index = control_start_index_;
2522 int time_index = time_start_index_;
2524 int constraint_index = 0;
2527 for (
int i = 0; i < horizon_; ++i) {
2531 g[constraint_index] =
2532 x[state_index + 4] -
2534 ts_ * x[time_index] *
2535 (x[state_index + 3] +
2536 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
2537 cos(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
2538 x[state_index + 3] *
2539 tan(x[control_index]) / wheelbase_));
2541 g[constraint_index + 1] =
2542 x[state_index + 5] -
2543 (x[state_index + 1] +
2544 ts_ * x[time_index] *
2545 (x[state_index + 3] +
2546 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
2547 sin(x[state_index + 2] + ts_ * x[time_index] * 0.5 *
2548 x[state_index + 3] *
2549 tan(x[control_index]) / wheelbase_));
2552 g[constraint_index + 2] =
2553 x[state_index + 6] -
2554 (x[state_index + 2] +
2555 ts_ * x[time_index] *
2556 (x[state_index + 3] +
2557 ts_ * x[time_index] * 0.5 * x[control_index + 1]) *
2558 tan(x[control_index]) / wheelbase_);
2561 g[constraint_index + 3] =
2562 x[state_index + 7] -
2563 (x[state_index + 3] + ts_ * x[time_index] * x[control_index + 1]);
2566 constraint_index += 4;
2571 ADEBUG <<
"constraint_index after adding Euler forward dynamics constraints "
2573 << constraint_index;
2577 control_index = control_start_index_;
2578 time_index = time_start_index_;
2581 g[constraint_index] =
2582 (x[control_index] - last_time_u_(0, 0)) / x[time_index] / ts_;
2587 for (
int i = 1; i < horizon_; ++i) {
2588 g[constraint_index] =
2589 (x[control_index] - x[control_index - 2]) / x[time_index] / ts_;
2596 time_index = time_start_index_;
2597 for (
int i = 0; i < horizon_; ++i) {
2598 g[constraint_index] = x[time_index + 1] - x[time_index];
2603 ADEBUG <<
"constraint_index after adding time constraints "
2605 << constraint_index;
2609 state_index = state_start_index_;
2610 int l_index = l_start_index_;
2611 int n_index = n_start_index_;
2613 for (
int i = 0; i < horizon_ + 1; ++i) {
2614 int edges_counter = 0;
2615 for (
int j = 0; j < obstacles_num_; ++j) {
2616 int current_edges_num = obstacles_edges_num_(j, 0);
2617 Eigen::MatrixXd Aj =
2618 obstacles_A_.block(edges_counter, 0, current_edges_num, 2);
2619 Eigen::MatrixXd bj =
2620 obstacles_b_.block(edges_counter, 0, current_edges_num, 1);
2625 for (
int k = 0; k < current_edges_num; ++k) {
2627 tmp1 += Aj(k, 0) * x[l_index + k];
2628 tmp2 += Aj(k, 1) * x[l_index + k];
2630 g[constraint_index] = tmp1 * tmp1 + tmp2 * tmp2;
2633 g[constraint_index + 1] = x[n_index] - x[n_index + 2] +
2634 cos(x[state_index + 2]) * tmp1 +
2635 sin(x[state_index + 2]) * tmp2;
2637 g[constraint_index + 2] = x[n_index + 1] - x[n_index + 3] -
2638 sin(x[state_index + 2]) * tmp1 +
2639 cos(x[state_index + 2]) * tmp2;
2643 for (
int k = 0; k < 4; ++k) {
2644 tmp3 += -g_[k] * x[n_index + k];
2648 for (
int k = 0; k < current_edges_num; ++k) {
2649 tmp4 += bj(k, 0) * x[l_index + k];
2652 g[constraint_index + 3] =
2653 tmp3 + (x[state_index] + cos(x[state_index + 2]) * offset_) * tmp1 +
2654 (x[state_index + 1] + sin(x[state_index + 2]) * offset_) * tmp2 -
2658 edges_counter += current_edges_num;
2659 l_index += current_edges_num;
2661 constraint_index += 4;
2665 ADEBUG <<
"constraint_index after obstacles avoidance constraints "
2667 << constraint_index;
2670 state_index = state_start_index_;
2671 control_index = control_start_index_;
2672 time_index = time_start_index_;
2673 l_index = l_start_index_;
2674 n_index = n_start_index_;
2677 g[constraint_index] = x[state_index];
2678 g[constraint_index + 1] = x[state_index + 1];
2679 g[constraint_index + 2] = x[state_index + 2];
2680 g[constraint_index + 3] = x[state_index + 3];
2681 constraint_index += 4;
2685 for (
int i = 1; i < horizon_; ++i) {
2686 g[constraint_index] = x[state_index];
2687 g[constraint_index + 1] = x[state_index + 1];
2688 g[constraint_index + 2] = x[state_index + 3];
2689 constraint_index += 3;
2694 g[constraint_index] = x[state_index];
2695 g[constraint_index + 1] = x[state_index + 1];
2696 g[constraint_index + 2] = x[state_index + 2];
2697 g[constraint_index + 3] = x[state_index + 3];
2698 constraint_index += 4;
2701 for (
int i = 0; i < horizon_; ++i) {
2702 g[constraint_index] = x[control_index];
2703 g[constraint_index + 1] = x[control_index + 1];
2704 constraint_index += 2;
2708 for (
int i = 0; i < horizon_ + 1; ++i) {
2709 g[constraint_index] = x[time_index];
2714 for (
int i = 0; i < lambda_horizon_; ++i) {
2715 g[constraint_index] = x[l_index];
2720 for (
int i = 0; i < miu_horizon_; ++i) {
2721 g[constraint_index] = x[n_index];