570 {
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;
576
577 if (values == nullptr) {
578 int nz_index = 0;
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_;
583
584
585 for (int i = 0; i < horizon_; ++i) {
586
587 iRow[nz_index] = state_index;
588 jCol[nz_index] = state_index;
589 ++nz_index;
590
591 iRow[nz_index] = state_index;
592 jCol[nz_index] = state_index + 2;
593 ++nz_index;
594
595 iRow[nz_index] = state_index;
596 jCol[nz_index] = state_index + 3;
597 ++nz_index;
598
599 iRow[nz_index] = state_index;
600 jCol[nz_index] = state_index + 4;
601 ++nz_index;
602
603
604 iRow[nz_index] = state_index;
605 jCol[nz_index] = control_index;
606 ++nz_index;
607
608 iRow[nz_index] = state_index;
609 jCol[nz_index] = control_index + 1;
610 ++nz_index;
611
612
613 iRow[nz_index] = state_index;
614 jCol[nz_index] = time_index;
615 ++nz_index;
616
617
618 iRow[nz_index] = state_index + 1;
619 jCol[nz_index] = state_index + 1;
620 ++nz_index;
621
622 iRow[nz_index] = state_index + 1;
623 jCol[nz_index] = state_index + 2;
624 ++nz_index;
625
626 iRow[nz_index] = state_index + 1;
627 jCol[nz_index] = state_index + 3;
628 ++nz_index;
629
630 iRow[nz_index] = state_index + 1;
631 jCol[nz_index] = state_index + 5;
632 ++nz_index;
633
634
635 iRow[nz_index] = state_index + 1;
636 jCol[nz_index] = control_index;
637 ++nz_index;
638
639 iRow[nz_index] = state_index + 1;
640 jCol[nz_index] = control_index + 1;
641 ++nz_index;
642
643
644 iRow[nz_index] = state_index + 1;
645 jCol[nz_index] = time_index;
646 ++nz_index;
647
648
649 iRow[nz_index] = state_index + 2;
650 jCol[nz_index] = state_index + 2;
651 ++nz_index;
652
653 iRow[nz_index] = state_index + 2;
654 jCol[nz_index] = state_index + 3;
655 ++nz_index;
656
657 iRow[nz_index] = state_index + 2;
658 jCol[nz_index] = state_index + 6;
659 ++nz_index;
660
661
662 iRow[nz_index] = state_index + 2;
663 jCol[nz_index] = control_index;
664 ++nz_index;
665
666 iRow[nz_index] = state_index + 2;
667 jCol[nz_index] = control_index + 1;
668 ++nz_index;
669
670
671 iRow[nz_index] = state_index + 2;
672 jCol[nz_index] = time_index;
673 ++nz_index;
674
675
676 iRow[nz_index] = state_index + 3;
677 jCol[nz_index] = state_index + 3;
678 ++nz_index;
679
680 iRow[nz_index] = state_index + 3;
681 jCol[nz_index] = state_index + 7;
682 ++nz_index;
683
684
685 iRow[nz_index] = state_index + 3;
686 jCol[nz_index] = control_index + 1;
687 ++nz_index;
688
689
690 iRow[nz_index] = state_index + 3;
691 jCol[nz_index] = time_index;
692 ++nz_index;
693
694 state_index += 4;
695 control_index += 2;
696 time_index++;
697 constraint_index += 4;
698 }
699
700
701 control_index = control_start_index_;
702 state_index = state_start_index_;
703 time_index = time_start_index_;
704
705
706 iRow[nz_index] = constraint_index;
707 jCol[nz_index] = control_index;
708 ++nz_index;
709
710
711 iRow[nz_index] = constraint_index;
712 jCol[nz_index] = time_index;
713 ++nz_index;
714
715 control_index += 2;
716 time_index++;
717 constraint_index++;
718
719 for (int i = 1; i < horizon_; ++i) {
720
721 iRow[nz_index] = constraint_index;
722 jCol[nz_index] = control_index - 2;
723 ++nz_index;
724
725
726 iRow[nz_index] = constraint_index;
727 jCol[nz_index] = control_index;
728 ++nz_index;
729
730
731 iRow[nz_index] = constraint_index;
732 jCol[nz_index] = time_index;
733 ++nz_index;
734
735
736 control_index += 2;
737 constraint_index++;
738 time_index++;
739 }
740
741
742 time_index = time_start_index_;
743
744 for (int i = 0; i < horizon_; ++i) {
745
746 iRow[nz_index] = constraint_index;
747 jCol[nz_index] = time_index;
748 ++nz_index;
749
750
751 iRow[nz_index] = constraint_index;
752 jCol[nz_index] = time_index + 1;
753 ++nz_index;
754
755 time_index++;
756 constraint_index++;
757 }
758
759
760
761 state_index = state_start_index_;
762 int l_index = l_start_index_;
763 int n_index = n_start_index_;
764
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;
772
773 for (int jj = 0; jj < obstacles_num_; ++jj) {
774 if (jj < j) {
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);
778 } else {
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);
782 }
783 }
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;
788
789
790 for (int k = 0; k < current_edges_num; ++k) {
791
792 iRow[nz_index_tmp] = constraint_index_tmp;
793 jCol[nz_index_tmp] = l_index_tmp + k;
794 ++nz_index_tmp;
795 }
796
797
798
799 iRow[nz_index_tmp] = constraint_index_tmp + 1;
800 jCol[nz_index_tmp] = state_index_tmp + 2;
801 ++nz_index_tmp;
802
803
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;
807 ++nz_index_tmp;
808 }
809
810
811 iRow[nz_index_tmp] = constraint_index_tmp + 1;
812 jCol[nz_index_tmp] = n_index_tmp;
813 ++nz_index_tmp;
814
815 iRow[nz_index_tmp] = constraint_index_tmp + 1;
816 jCol[nz_index_tmp] = n_index_tmp + 2;
817 ++nz_index_tmp;
818
819
820
821 iRow[nz_index_tmp] = constraint_index_tmp + 2;
822 jCol[nz_index_tmp] = state_index_tmp + 2;
823 ++nz_index_tmp;
824
825
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;
829 ++nz_index_tmp;
830 }
831
832
833 iRow[nz_index_tmp] = constraint_index_tmp + 2;
834 jCol[nz_index_tmp] = n_index_tmp + 1;
835 ++nz_index_tmp;
836
837 iRow[nz_index_tmp] = constraint_index_tmp + 2;
838 jCol[nz_index_tmp] = n_index_tmp + 3;
839 ++nz_index_tmp;
840
841
842
843 iRow[nz_index_tmp] = constraint_index_tmp + 3;
844 jCol[nz_index_tmp] = state_index_tmp;
845 ++nz_index_tmp;
846
847 iRow[nz_index_tmp] = constraint_index_tmp + 3;
848 jCol[nz_index_tmp] = state_index_tmp + 1;
849 ++nz_index_tmp;
850
851 iRow[nz_index_tmp] = constraint_index_tmp + 3;
852 jCol[nz_index_tmp] = state_index_tmp + 2;
853 ++nz_index_tmp;
854
855
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;
859 ++nz_index_tmp;
860 }
861
862
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;
866 ++nz_index_tmp;
867 }
868 }
869
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);
873 }
874 constraint_index += 4 * (horizon_ + 1) * obstacles_num_;
875 state_index += 4 * (horizon_ + 1);
876
877
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_;
883
884
885 iRow[nz_index] = constraint_index;
886 jCol[nz_index] = state_index;
887 nz_index++;
888 iRow[nz_index] = constraint_index + 1;
889 jCol[nz_index] = state_index + 1;
890 nz_index++;
891 iRow[nz_index] = constraint_index + 2;
892 jCol[nz_index] = state_index + 2;
893 nz_index++;
894 iRow[nz_index] = constraint_index + 3;
895 jCol[nz_index] = state_index + 3;
896 nz_index++;
897 constraint_index += 4;
898 state_index += 4;
899
900 for (int i = 1; i < horizon_; ++i) {
901 iRow[nz_index] = constraint_index;
902 jCol[nz_index] = state_index;
903 nz_index++;
904 iRow[nz_index] = constraint_index + 1;
905 jCol[nz_index] = state_index + 1;
906 nz_index++;
907 iRow[nz_index] = constraint_index + 2;
908 jCol[nz_index] = state_index + 3;
909 nz_index++;
910 constraint_index += 3;
911 state_index += 4;
912 }
913
914
915 iRow[nz_index] = constraint_index;
916 jCol[nz_index] = state_index;
917 nz_index++;
918 iRow[nz_index] = constraint_index + 1;
919 jCol[nz_index] = state_index + 1;
920 nz_index++;
921 iRow[nz_index] = constraint_index + 2;
922 jCol[nz_index] = state_index + 2;
923 nz_index++;
924 iRow[nz_index] = constraint_index + 3;
925 jCol[nz_index] = state_index + 3;
926 nz_index++;
927 constraint_index += 4;
928 state_index += 4;
929
930 for (int i = 0; i < horizon_; ++i) {
931 iRow[nz_index] = constraint_index;
932 jCol[nz_index] = control_index;
933 nz_index++;
934 iRow[nz_index] = constraint_index + 1;
935 jCol[nz_index] = control_index + 1;
936 nz_index++;
937 constraint_index += 2;
938 control_index += 2;
939 }
940
941 for (int i = 0; i < horizon_ + 1; ++i) {
942 iRow[nz_index] = constraint_index;
943 jCol[nz_index] = time_index;
944 nz_index++;
945 constraint_index++;
946 time_index++;
947 }
948
949 for (int i = 0; i < lambda_horizon_; ++i) {
950 iRow[nz_index] = constraint_index;
951 jCol[nz_index] = l_index;
952 nz_index++;
953 constraint_index++;
954 l_index++;
955 }
956
957 for (int i = 0; i < miu_horizon_; ++i) {
958 iRow[nz_index] = constraint_index;
959 jCol[nz_index] = n_index;
960 nz_index++;
961 constraint_index++;
962 n_index++;
963 }
964
965 CHECK_EQ(nz_index, static_cast<int>(nele_jac));
966 CHECK_EQ(constraint_index, static_cast<int>(m));
967 } else {
968 std::fill(values, values + nele_jac, 0.0);
969 int nz_index = 0;
970
971 int time_index = time_start_index_;
972 int state_index = state_start_index_;
973 int control_index = control_start_index_;
974
975
976
977 for (int i = 0; i < horizon_; ++i) {
978 values[nz_index] = -1.0;
979 ++nz_index;
980
981 values[nz_index] =
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_);
988 ++nz_index;
989
990 values[nz_index] =
991 -1.0 *
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]) /
1000 wheelbase_ *
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_));
1004 ++nz_index;
1005
1006 values[nz_index] = 1.0;
1007 ++nz_index;
1008
1009 values[nz_index] =
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])) /
1018 wheelbase_;
1019 ++nz_index;
1020
1021 values[nz_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_));
1026 ++nz_index;
1027
1028 values[nz_index] =
1029 -1.0 *
1030 (ts_ *
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]) /
1044 wheelbase_ *
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_));
1048 ++nz_index;
1049
1050 values[nz_index] = -1.0;
1051 ++nz_index;
1052
1053 values[nz_index] =
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_));
1060 ++nz_index;
1061
1062 values[nz_index] =
1063 -1.0 *
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]) /
1072 wheelbase_ *
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_));
1076 ++nz_index;
1077
1078 values[nz_index] = 1.0;
1079 ++nz_index;
1080
1081 values[nz_index] =
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])) /
1090 wheelbase_);
1091 ++nz_index;
1092
1093 values[nz_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_));
1098 ++nz_index;
1099
1100 values[nz_index] =
1101 -1.0 *
1102 (ts_ *
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]) /
1116 wheelbase_ *
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_));
1120 ++nz_index;
1121
1122 values[nz_index] = -1.0;
1123 ++nz_index;
1124
1125 values[nz_index] = -1.0 * x[time_index] * ts_ *
1126 std::tan(x[control_index]) / wheelbase_;
1127 ++nz_index;
1128
1129 values[nz_index] = 1.0;
1130 ++nz_index;
1131
1132 values[nz_index] =
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])) /
1137 wheelbase_);
1138 ++nz_index;
1139
1140 values[nz_index] =
1141 -1.0 * (x[time_index] * ts_ * x[time_index] * ts_ * 0.5 *
1142 std::tan(x[control_index]) / wheelbase_);
1143 ++nz_index;
1144
1145 values[nz_index] =
1146 -1.0 * (ts_ *
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_);
1152 ++nz_index;
1153
1154 values[nz_index] = -1.0;
1155 ++nz_index;
1156
1157 values[nz_index] = 1.0;
1158 ++nz_index;
1159
1160 values[nz_index] = -1.0 * ts_ * x[time_index];
1161 ++nz_index;
1162
1163 values[nz_index] = -1.0 * ts_ * x[control_index + 1];
1164 ++nz_index;
1165
1166 state_index += 4;
1167 control_index += 2;
1168 time_index++;
1169 }
1170
1171
1172 control_index = control_start_index_;
1173 state_index = state_start_index_;
1174 time_index = time_start_index_;
1175
1176
1177
1178
1179 values[nz_index] = 1.0 / x[time_index] / ts_;
1180 ++nz_index;
1181
1182
1183 values[nz_index] = -1.0 * (x[control_index] - last_time_u_(0, 0)) /
1184 x[time_index] / x[time_index] / ts_;
1185 ++nz_index;
1186 time_index++;
1187 control_index += 2;
1188
1189 for (int i = 1; i < horizon_; ++i) {
1190
1191
1192 values[nz_index] = -1.0 / x[time_index] / ts_;
1193 ++nz_index;
1194
1195
1196 values[nz_index] = 1.0 / x[time_index] / ts_;
1197 ++nz_index;
1198
1199
1200 values[nz_index] = -1.0 * (x[control_index] - x[control_index - 2]) /
1201 x[time_index] / x[time_index] / ts_;
1202 ++nz_index;
1203
1204 control_index += 2;
1205 time_index++;
1206 }
1207
1208 ADEBUG <<
"After fulfilled control rate constraints derivative, nz_index : "
1209 << nz_index << " nele_jac : " << nele_jac;
1210
1211
1212 time_index = time_start_index_;
1213 for (int i = 0; i < horizon_; ++i) {
1214
1215 values[nz_index] = -1.0;
1216 ++nz_index;
1217
1218
1219 values[nz_index] = 1.0;
1220 ++nz_index;
1221
1222 time_index++;
1223 }
1224
1225 ADEBUG <<
"After fulfilled time constraints derivative, nz_index : "
1226 << nz_index << " nele_jac : " << nele_jac;
1227
1228
1229
1230
1231 state_index = state_start_index_;
1232 int l_index = l_start_index_;
1233 int n_index = n_start_index_;
1234
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_;
1239
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;
1244
1245
1246 for (int jj = 0; jj < obstacles_num_; ++jj) {
1247 if (jj < j) {
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);
1252 } else {
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);
1256 }
1257 }
1258 int n_index_tmp = n_index + (i * obstacles_num_ + j) * 4;
1259 int state_index_tmp = state_index + i * 4;
1260
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);
1265
1266
1267 double tmp1 = 0;
1268 double tmp2 = 0;
1269 for (int k = 0; k < current_edges_num; ++k) {
1270
1271 tmp1 += Aj(k, 0) * x[l_index_tmp + k];
1272 tmp2 += Aj(k, 1) * x[l_index_tmp + k];
1273 }
1274
1275
1276 for (int k = 0; k < current_edges_num; ++k) {
1277
1278 values[nz_index_tmp] =
1279 2 * tmp1 * Aj(k, 0) + 2 * tmp2 * Aj(k, 1);
1280 ++nz_index_tmp;
1281 }
1282
1283
1284
1285 values[nz_index_tmp] = -std::sin(x[state_index_tmp + 2]) * tmp1 +
1286 std::cos(x[state_index_tmp + 2]) * tmp2;
1287 ++nz_index_tmp;
1288
1289
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);
1294 ++nz_index_tmp;
1295 }
1296
1297
1298 values[nz_index_tmp] = 1.0;
1299 ++nz_index_tmp;
1300
1301 values[nz_index_tmp] = -1.0;
1302 ++nz_index_tmp;
1303
1304
1305
1306 values[nz_index_tmp] = -std::cos(x[state_index_tmp + 2]) * tmp1 -
1307 std::sin(x[state_index_tmp + 2]) * tmp2;
1308 ++nz_index_tmp;
1309
1310
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);
1315 ++nz_index_tmp;
1316 }
1317
1318
1319 values[nz_index_tmp] = 1.0;
1320 ++nz_index_tmp;
1321
1322 values[nz_index_tmp] = -1.0;
1323 ++nz_index_tmp;
1324
1325
1326 double tmp3 = 0.0;
1327 double tmp4 = 0.0;
1328 for (int k = 0; k < 4; ++k) {
1329 tmp3 += -g_[k] * x[n_index_tmp + k];
1330 }
1331
1332 for (int k = 0; k < current_edges_num; ++k) {
1333 tmp4 += bj(k, 0) * x[l_index_tmp + k];
1334 }
1335
1336
1337 values[nz_index_tmp] = tmp1;
1338 ++nz_index_tmp;
1339
1340 values[nz_index_tmp] = tmp2;
1341 ++nz_index_tmp;
1342
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;
1346 ++nz_index_tmp;
1347
1348
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_) *
1352 Aj(k, 0) +
1353 (x[state_index_tmp + 1] +
1354 std::sin(x[state_index_tmp + 2]) * offset_) *
1355 Aj(k, 1) -
1356 bj(k, 0);
1357 ++nz_index_tmp;
1358 }
1359
1360
1361 for (int k = 0; k < 4; ++k) {
1362 values[nz_index_tmp] = -g_[k];
1363 ++nz_index_tmp;
1364 }
1365 }
1366
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);
1370 }
1371
1372
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_;
1378
1379
1380 values[nz_index] = 1.0;
1381 nz_index++;
1382 values[nz_index] = 1.0;
1383 nz_index++;
1384 values[nz_index] = 1.0;
1385 nz_index++;
1386 values[nz_index] = 1.0;
1387 nz_index++;
1388
1389 for (int i = 1; i < horizon_; ++i) {
1390 values[nz_index] = 1.0;
1391 nz_index++;
1392 values[nz_index] = 1.0;
1393 nz_index++;
1394 values[nz_index] = 1.0;
1395 nz_index++;
1396 }
1397
1398
1399 values[nz_index] = 1.0;
1400 nz_index++;
1401 values[nz_index] = 1.0;
1402 nz_index++;
1403 values[nz_index] = 1.0;
1404 nz_index++;
1405 values[nz_index] = 1.0;
1406 nz_index++;
1407
1408 for (int i = 0; i < horizon_; ++i) {
1409 values[nz_index] = 1.0;
1410 nz_index++;
1411 values[nz_index] = 1.0;
1412 nz_index++;
1413 }
1414
1415 for (int i = 0; i < horizon_ + 1; ++i) {
1416 values[nz_index] = 1.0;
1417 nz_index++;
1418 }
1419
1420 for (int i = 0; i < lambda_horizon_; ++i) {
1421 values[nz_index] = 1.0;
1422 nz_index++;
1423 }
1424
1425 for (int i = 0; i < miu_horizon_; ++i) {
1426 values[nz_index] = 1.0;
1427 nz_index++;
1428 }
1429
1430 ADEBUG <<
"eval_jac_g, fulfilled obstacle constraint values";
1431 CHECK_EQ(nz_index, static_cast<int>(nele_jac));
1432 }
1433
1434 ADEBUG <<
"eval_jac_g done";
1435 return true;
1436}