633 {
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;
637
638 if (values == nullptr) {
639 int nz_index = 0;
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_;
644
645
646 for (int i = 0; i < horizon_; ++i) {
647
648 iRow[nz_index] = state_index;
649 jCol[nz_index] = state_index;
650 ++nz_index;
651
652 iRow[nz_index] = state_index;
653 jCol[nz_index] = state_index + 2;
654 ++nz_index;
655
656 iRow[nz_index] = state_index;
657 jCol[nz_index] = state_index + 3;
658 ++nz_index;
659
660 iRow[nz_index] = state_index;
661 jCol[nz_index] = state_index + 4;
662 ++nz_index;
663
664
665 iRow[nz_index] = state_index;
666 jCol[nz_index] = control_index;
667 ++nz_index;
668
669 iRow[nz_index] = state_index;
670 jCol[nz_index] = control_index + 1;
671 ++nz_index;
672
673
674 iRow[nz_index] = state_index;
675 jCol[nz_index] = time_index;
676 ++nz_index;
677
678
679 iRow[nz_index] = state_index + 1;
680 jCol[nz_index] = state_index + 1;
681 ++nz_index;
682
683 iRow[nz_index] = state_index + 1;
684 jCol[nz_index] = state_index + 2;
685 ++nz_index;
686
687 iRow[nz_index] = state_index + 1;
688 jCol[nz_index] = state_index + 3;
689 ++nz_index;
690
691 iRow[nz_index] = state_index + 1;
692 jCol[nz_index] = state_index + 5;
693 ++nz_index;
694
695
696 iRow[nz_index] = state_index + 1;
697 jCol[nz_index] = control_index;
698 ++nz_index;
699
700 iRow[nz_index] = state_index + 1;
701 jCol[nz_index] = control_index + 1;
702 ++nz_index;
703
704
705 iRow[nz_index] = state_index + 1;
706 jCol[nz_index] = time_index;
707 ++nz_index;
708
709
710 iRow[nz_index] = state_index + 2;
711 jCol[nz_index] = state_index + 2;
712 ++nz_index;
713
714 iRow[nz_index] = state_index + 2;
715 jCol[nz_index] = state_index + 3;
716 ++nz_index;
717
718 iRow[nz_index] = state_index + 2;
719 jCol[nz_index] = state_index + 6;
720 ++nz_index;
721
722
723 iRow[nz_index] = state_index + 2;
724 jCol[nz_index] = control_index;
725 ++nz_index;
726
727 iRow[nz_index] = state_index + 2;
728 jCol[nz_index] = control_index + 1;
729 ++nz_index;
730
731
732 iRow[nz_index] = state_index + 2;
733 jCol[nz_index] = time_index;
734 ++nz_index;
735
736
737 iRow[nz_index] = state_index + 3;
738 jCol[nz_index] = state_index + 3;
739 ++nz_index;
740
741 iRow[nz_index] = state_index + 3;
742 jCol[nz_index] = state_index + 7;
743 ++nz_index;
744
745
746 iRow[nz_index] = state_index + 3;
747 jCol[nz_index] = control_index + 1;
748 ++nz_index;
749
750
751 iRow[nz_index] = state_index + 3;
752 jCol[nz_index] = time_index;
753 ++nz_index;
754
755 state_index += 4;
756 control_index += 2;
757 time_index++;
758 constraint_index += 4;
759 }
760
761
762 control_index = control_start_index_;
763 state_index = state_start_index_;
764 time_index = time_start_index_;
765
766
767 iRow[nz_index] = constraint_index;
768 jCol[nz_index] = control_index;
769 ++nz_index;
770
771
772 iRow[nz_index] = constraint_index;
773 jCol[nz_index] = time_index;
774 ++nz_index;
775
776 control_index += 2;
777 time_index++;
778 constraint_index++;
779
780 for (int i = 1; i < horizon_; ++i) {
781
782 iRow[nz_index] = constraint_index;
783 jCol[nz_index] = control_index - 2;
784 ++nz_index;
785
786
787 iRow[nz_index] = constraint_index;
788 jCol[nz_index] = control_index;
789 ++nz_index;
790
791
792 iRow[nz_index] = constraint_index;
793 jCol[nz_index] = time_index;
794 ++nz_index;
795
796
797 control_index += 2;
798 constraint_index++;
799 time_index++;
800 }
801
802
803 time_index = time_start_index_;
804
805 for (int i = 0; i < horizon_; ++i) {
806
807 iRow[nz_index] = constraint_index;
808 jCol[nz_index] = time_index;
809 ++nz_index;
810
811
812 iRow[nz_index] = constraint_index;
813 jCol[nz_index] = time_index + 1;
814 ++nz_index;
815
816 time_index++;
817 constraint_index++;
818 }
819
820
821
822 state_index = state_start_index_;
823 int l_index = l_start_index_;
824 int n_index = n_start_index_;
825
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;
833
834 for (int jj = 0; jj < obstacles_num_; ++jj) {
835 if (jj < j) {
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);
839 } else {
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);
843 }
844 }
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;
848
849
850 for (int k = 0; k < current_edges_num; ++k) {
851
852 iRow[nz_index_tmp] = constraint_index_tmp;
853 jCol[nz_index_tmp] = l_index_tmp + k;
854 ++nz_index_tmp;
855 }
856
857
858
859 iRow[nz_index_tmp] = constraint_index_tmp + 1;
860 jCol[nz_index_tmp] = state_index_tmp + 2;
861 ++nz_index_tmp;
862
863
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;
867 ++nz_index_tmp;
868 }
869
870
871 iRow[nz_index_tmp] = constraint_index_tmp + 1;
872 jCol[nz_index_tmp] = n_index_tmp;
873 ++nz_index_tmp;
874
875 iRow[nz_index_tmp] = constraint_index_tmp + 1;
876 jCol[nz_index_tmp] = n_index_tmp + 2;
877 ++nz_index_tmp;
878
879
880
881 iRow[nz_index_tmp] = constraint_index_tmp + 2;
882 jCol[nz_index_tmp] = state_index_tmp + 2;
883 ++nz_index_tmp;
884
885
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;
889 ++nz_index_tmp;
890 }
891
892
893 iRow[nz_index_tmp] = constraint_index_tmp + 2;
894 jCol[nz_index_tmp] = n_index_tmp + 1;
895 ++nz_index_tmp;
896
897 iRow[nz_index_tmp] = constraint_index_tmp + 2;
898 jCol[nz_index_tmp] = n_index_tmp + 3;
899 ++nz_index_tmp;
900
901
902
903 iRow[nz_index_tmp] = constraint_index_tmp + 3;
904 jCol[nz_index_tmp] = state_index_tmp;
905 ++nz_index_tmp;
906
907 iRow[nz_index_tmp] = constraint_index_tmp + 3;
908 jCol[nz_index_tmp] = state_index_tmp + 1;
909 ++nz_index_tmp;
910
911 iRow[nz_index_tmp] = constraint_index_tmp + 3;
912 jCol[nz_index_tmp] = state_index_tmp + 2;
913 ++nz_index_tmp;
914
915
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;
919 ++nz_index_tmp;
920 }
921
922
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;
926 ++nz_index_tmp;
927 }
928 }
929
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);
933 }
934 constraint_index += 4 * (horizon_ + 1) * obstacles_num_;
935 state_index += 4 * (horizon_ + 1);
936
937
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_;
943
944
945 iRow[nz_index] = constraint_index;
946 jCol[nz_index] = state_index;
947 nz_index++;
948 iRow[nz_index] = constraint_index + 1;
949 jCol[nz_index] = state_index + 1;
950 nz_index++;
951 iRow[nz_index] = constraint_index + 2;
952 jCol[nz_index] = state_index + 2;
953 nz_index++;
954 iRow[nz_index] = constraint_index + 3;
955 jCol[nz_index] = state_index + 3;
956 nz_index++;
957 constraint_index += 4;
958 state_index += 4;
959
960 for (int i = 1; i < horizon_; ++i) {
961 iRow[nz_index] = constraint_index;
962 jCol[nz_index] = state_index;
963 nz_index++;
964 iRow[nz_index] = constraint_index + 1;
965 jCol[nz_index] = state_index + 1;
966 nz_index++;
967 iRow[nz_index] = constraint_index + 2;
968 jCol[nz_index] = state_index + 3;
969 nz_index++;
970 constraint_index += 3;
971 state_index += 4;
972 }
973
974
975 iRow[nz_index] = constraint_index;
976 jCol[nz_index] = state_index;
977 nz_index++;
978 iRow[nz_index] = constraint_index + 1;
979 jCol[nz_index] = state_index + 1;
980 nz_index++;
981 iRow[nz_index] = constraint_index + 2;
982 jCol[nz_index] = state_index + 2;
983 nz_index++;
984 iRow[nz_index] = constraint_index + 3;
985 jCol[nz_index] = state_index + 3;
986 nz_index++;
987 constraint_index += 4;
988 state_index += 4;
989
990 for (int i = 0; i < horizon_; ++i) {
991 iRow[nz_index] = constraint_index;
992 jCol[nz_index] = control_index;
993 nz_index++;
994 iRow[nz_index] = constraint_index + 1;
995 jCol[nz_index] = control_index + 1;
996 nz_index++;
997 constraint_index += 2;
998 control_index += 2;
999 }
1000
1001 for (int i = 0; i < horizon_ + 1; ++i) {
1002 iRow[nz_index] = constraint_index;
1003 jCol[nz_index] = time_index;
1004 nz_index++;
1005 constraint_index++;
1006 time_index++;
1007 }
1008
1009 for (int i = 0; i < lambda_horizon_; ++i) {
1010 iRow[nz_index] = constraint_index;
1011 jCol[nz_index] = l_index;
1012 nz_index++;
1013 constraint_index++;
1014 l_index++;
1015 }
1016
1017 for (int i = 0; i < miu_horizon_; ++i) {
1018 iRow[nz_index] = constraint_index;
1019 jCol[nz_index] = n_index;
1020 nz_index++;
1021 constraint_index++;
1022 n_index++;
1023 }
1024
1025 CHECK_EQ(nz_index, static_cast<int>(nele_jac));
1026 CHECK_EQ(constraint_index, static_cast<int>(m));
1027 } else {
1028 std::fill(values, values + nele_jac, 0.0);
1029 int nz_index = 0;
1030
1031 int time_index = time_start_index_;
1032 int state_index = state_start_index_;
1033 int control_index = control_start_index_;
1034
1035
1036
1037 for (int i = 0; i < horizon_; ++i) {
1038 values[nz_index] = -1.0;
1039 ++nz_index;
1040
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])
1045 / wheelbase_);
1046 ++nz_index;
1047
1048 values[nz_index] = -1.0
1049 * (x[time_index] * ts_
1050 * std::cos(
1051 x[state_index + 2]
1052 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1053 / wheelbase_)
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_
1056 * std::sin(
1057 x[state_index + 2]
1058 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1059 / wheelbase_));
1060 ++nz_index;
1061
1062 values[nz_index] = 1.0;
1063 ++nz_index;
1064
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])
1069 / wheelbase_)
1070 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1071 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_;
1072 ++nz_index;
1073
1074 values[nz_index] = -1.0
1075 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1076 * std::cos(
1077 x[state_index + 2]
1078 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1079 / wheelbase_));
1080 ++nz_index;
1081
1082 values[nz_index] = -1.0
1083 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1084 * std::cos(
1085 x[state_index + 2]
1086 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1087 / wheelbase_)
1088 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1089 * std::cos(
1090 x[state_index + 2]
1091 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1092 / wheelbase_)
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_
1095 * std::sin(
1096 x[state_index + 2]
1097 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1098 / wheelbase_));
1099 ++nz_index;
1100
1101 values[nz_index] = -1.0;
1102 ++nz_index;
1103
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])
1106 * std::cos(
1107 x[state_index + 2]
1108 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1109 / wheelbase_));
1110 ++nz_index;
1111
1112 values[nz_index] = -1.0
1113 * (x[time_index] * ts_
1114 * std::sin(
1115 x[state_index + 2]
1116 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1117 / wheelbase_)
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_
1120 * std::cos(
1121 x[state_index + 2]
1122 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1123 / wheelbase_));
1124 ++nz_index;
1125
1126 values[nz_index] = 1.0;
1127 ++nz_index;
1128
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])
1131 * std::cos(
1132 x[state_index + 2]
1133 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1134 / wheelbase_)
1135 * x[time_index] * ts_ * 0.5 * x[state_index + 3]
1136 / (std::cos(x[control_index]) * std::cos(x[control_index])) / wheelbase_);
1137 ++nz_index;
1138
1139 values[nz_index] = -1.0
1140 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5
1141 * std::sin(
1142 x[state_index + 2]
1143 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1144 / wheelbase_));
1145 ++nz_index;
1146
1147 values[nz_index] = -1.0
1148 * (ts_ * (x[state_index + 3] + x[time_index] * ts_ * 0.5 * x[control_index + 1])
1149 * std::sin(
1150 x[state_index + 2]
1151 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1152 / wheelbase_)
1153 + x[time_index] * ts_ * ts_ * 0.5 * x[control_index + 1]
1154 * std::sin(
1155 x[state_index + 2]
1156 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1157 / wheelbase_)
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_
1160 * std::cos(
1161 x[state_index + 2]
1162 + x[time_index] * ts_ * 0.5 * x[state_index + 3] * std::tan(x[control_index])
1163 / wheelbase_));
1164 ++nz_index;
1165
1166 values[nz_index] = -1.0;
1167 ++nz_index;
1168
1169 values[nz_index] = -1.0 * x[time_index] * ts_ * std::tan(x[control_index]) / wheelbase_;
1170 ++nz_index;
1171
1172 values[nz_index] = 1.0;
1173 ++nz_index;
1174
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_);
1178 ++nz_index;
1179
1180 values[nz_index] = -1.0
1181 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 * std::tan(x[control_index])
1182 / wheelbase_);
1183 ++nz_index;
1184
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])
1189 / wheelbase_);
1190 ++nz_index;
1191
1192 values[nz_index] = -1.0;
1193 ++nz_index;
1194
1195 values[nz_index] = 1.0;
1196 ++nz_index;
1197
1198 values[nz_index] = -1.0 * ts_ * x[time_index];
1199 ++nz_index;
1200
1201 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
1202 ++nz_index;
1203
1204 state_index += 4;
1205 control_index += 2;
1206 time_index++;
1207 }
1208
1209
1210 control_index = control_start_index_;
1211 state_index = state_start_index_;
1212 time_index = time_start_index_;
1213
1214
1215
1216
1217 values[nz_index] = 1.0 / x[time_index] / ts_;
1218 ++nz_index;
1219
1220
1221 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) / x[time_index] / x[time_index] / ts_;
1222 ++nz_index;
1223 time_index++;
1224 control_index += 2;
1225
1226 for (int i = 1; i < horizon_; ++i) {
1227
1228
1229 values[nz_index] = -1.0 / x[time_index] / ts_;
1230 ++nz_index;
1231
1232
1233 values[nz_index] = 1.0 / x[time_index] / ts_;
1234 ++nz_index;
1235
1236
1237 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) / x[time_index] / x[time_index] / ts_;
1238 ++nz_index;
1239
1240 control_index += 2;
1241 time_index++;
1242 }
1243
1244 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : " << nz_index
1245 << " nele_jac : " << nele_jac;
1246
1247
1248 time_index = time_start_index_;
1249 for (int i = 0; i < horizon_; ++i) {
1250
1251 values[nz_index] = -1.0;
1252 ++nz_index;
1253
1254
1255 values[nz_index] = 1.0;
1256 ++nz_index;
1257
1258 time_index++;
1259 }
1260
1261 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : " << nz_index <<
" nele_jac : " << nele_jac;
1262
1263
1264
1265
1266 state_index = state_start_index_;
1267 int l_index = l_start_index_;
1268 int n_index = n_start_index_;
1269
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_;
1274
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;
1279
1280
1281 for (int jj = 0; jj < obstacles_num_; ++jj) {
1282 if (jj < j) {
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);
1287 } else {
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);
1291 }
1292 }
1293 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
1294 int state_index_tmp = state_index + i * 4;
1295
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);
1298
1299
1300 double tmp1 = 0;
1301 double tmp2 = 0;
1302 for (int k = 0; k < current_edges_num; ++k) {
1303
1304 tmp1 += Aj(k, 0) * x[l_index_tmp + k];
1305 tmp2 += Aj(k, 1) * x[l_index_tmp + k];
1306 }
1307
1308
1309 for (int k = 0; k < current_edges_num; ++k) {
1310
1311 values[nz_index_tmp] = 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
1312 ++nz_index_tmp;
1313 }
1314
1315
1316
1317 values[nz_index_tmp]
1318 = -std::sin(x[state_index_tmp + 2]) * tmp1 + std::cos(x[state_index_tmp + 2]) * tmp2;
1319 ++nz_index_tmp;
1320
1321
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);
1325 ++nz_index_tmp;
1326 }
1327
1328
1329 values[nz_index_tmp] = 1.0;
1330 ++nz_index_tmp;
1331
1332 values[nz_index_tmp] = -1.0;
1333 ++nz_index_tmp;
1334
1335
1336
1337 values[nz_index_tmp]
1338 = -std::cos(x[state_index_tmp + 2]) * tmp1 - std::sin(x[state_index_tmp + 2]) * tmp2;
1339 ++nz_index_tmp;
1340
1341
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);
1345 ++nz_index_tmp;
1346 }
1347
1348
1349 values[nz_index_tmp] = 1.0;
1350 ++nz_index_tmp;
1351
1352 values[nz_index_tmp] = -1.0;
1353 ++nz_index_tmp;
1354
1355
1356 double tmp3 = 0.0;
1357 double tmp4 = 0.0;
1358 for (int k = 0; k < 4; ++k) {
1359 tmp3 += -g_[k] * x[n_index_tmp + k];
1360 }
1361
1362 for (int k = 0; k < current_edges_num; ++k) {
1363 tmp4 += bj(k, 0) * x[l_index_tmp + k];
1364 }
1365
1366
1367 values[nz_index_tmp] = tmp1;
1368 ++nz_index_tmp;
1369
1370 values[nz_index_tmp] = tmp2;
1371 ++nz_index_tmp;
1372
1373 values[nz_index_tmp] = -std::sin(x[state_index_tmp + 2]) * offset_ * tmp1
1374 + std::cos(x[state_index_tmp + 2]) * offset_ * tmp2;
1375 ++nz_index_tmp;
1376
1377
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)
1381 - bj(k, 0);
1382 ++nz_index_tmp;
1383 }
1384
1385
1386 for (int k = 0; k < 4; ++k) {
1387 values[nz_index_tmp] = -g_[k];
1388 ++nz_index_tmp;
1389 }
1390 }
1391
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);
1395 }
1396
1397
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_;
1403
1404
1405 values[nz_index] = 1.0;
1406 nz_index++;
1407 values[nz_index] = 1.0;
1408 nz_index++;
1409 values[nz_index] = 1.0;
1410 nz_index++;
1411 values[nz_index] = 1.0;
1412 nz_index++;
1413
1414 for (int i = 1; i < horizon_; ++i) {
1415 values[nz_index] = 1.0;
1416 nz_index++;
1417 values[nz_index] = 1.0;
1418 nz_index++;
1419 values[nz_index] = 1.0;
1420 nz_index++;
1421 }
1422
1423
1424 values[nz_index] = 1.0;
1425 nz_index++;
1426 values[nz_index] = 1.0;
1427 nz_index++;
1428 values[nz_index] = 1.0;
1429 nz_index++;
1430 values[nz_index] = 1.0;
1431 nz_index++;
1432
1433 for (int i = 0; i < horizon_; ++i) {
1434 values[nz_index] = 1.0;
1435 nz_index++;
1436 values[nz_index] = 1.0;
1437 nz_index++;
1438 }
1439
1440 for (int i = 0; i < horizon_ + 1; ++i) {
1441 values[nz_index] = 1.0;
1442 nz_index++;
1443 }
1444
1445 for (int i = 0; i < lambda_horizon_; ++i) {
1446 values[nz_index] = 1.0;
1447 nz_index++;
1448 }
1449
1450 for (int i = 0; i < miu_horizon_; ++i) {
1451 values[nz_index] = 1.0;
1452 nz_index++;
1453 }
1454
1455 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
1456 CHECK_EQ(nz_index, static_cast<int>(nele_jac));
1457 }
1458
1459 ADEBUG <<
"eval_jac_g done";
1460 return true;
1461}