esekfom.hpp 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977
  1. /*
  2. * Copyright (c) 2019--2023, The University of Hong Kong
  3. * All rights reserved.
  4. *
  5. * Author: Dongjiao HE <hdj65822@connect.hku.hk>
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions
  9. * are met:
  10. *
  11. * * Redistributions of source code must retain the above copyright
  12. * notice, this list of conditions and the following disclaimer.
  13. * * Redistributions in binary form must reproduce the above
  14. * copyright notice, this list of conditions and the following
  15. * disclaimer in the documentation and/or other materials provided
  16. * with the distribution.
  17. * * Neither the name of the Universitaet Bremen nor the names of its
  18. * contributors may be used to endorse or promote products derived
  19. * from this software without specific prior written permission.
  20. *
  21. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  22. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  23. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  24. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  25. * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  26. * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  27. * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  28. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  29. * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  30. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  31. * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  32. * POSSIBILITY OF SUCH DAMAGE.
  33. */
  34. #ifndef ESEKFOM_EKF_HPP
  35. #define ESEKFOM_EKF_HPP
  36. #include <vector>
  37. #include <cstdlib>
  38. #include <boost/bind.hpp>
  39. #include <Eigen/Core>
  40. #include <Eigen/Geometry>
  41. #include <Eigen/Dense>
  42. #include <Eigen/Sparse>
  43. #include "../mtk/types/vect.hpp"
  44. #include "../mtk/types/SOn.hpp"
  45. #include "../mtk/types/S2.hpp"
  46. #include "../mtk/startIdx.hpp"
  47. #include "../mtk/build_manifold.hpp"
  48. #include "util.hpp"
  49. //#define USE_sparse
  50. namespace esekfom {
  51. using namespace Eigen;
  52. //used for iterated error state EKF update
  53. //for the aim to calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  54. //applied for measurement as a manifold.
  55. template<typename S, typename M, int measurement_noise_dof = M::DOF>
  56. struct share_datastruct
  57. {
  58. bool valid;
  59. bool converge;
  60. M z;
  61. Eigen::Matrix<typename S::scalar, M::DOF, measurement_noise_dof> h_v;
  62. Eigen::Matrix<typename S::scalar, M::DOF, S::DOF> h_x;
  63. Eigen::Matrix<typename S::scalar, measurement_noise_dof, measurement_noise_dof> R;
  64. };
  65. //used for iterated error state EKF update
  66. //for the aim to calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  67. //applied for measurement as an Eigen matrix whose dimension is changing
  68. template<typename T>
  69. struct dyn_share_datastruct
  70. {
  71. bool valid;
  72. bool converge;
  73. Eigen::Matrix<T, Eigen::Dynamic, 1> z;
  74. Eigen::Matrix<T, Eigen::Dynamic, 1> h; // estimate measurement (h) 残差
  75. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> h_v;
  76. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> h_x; // partial differention matrices
  77. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> R;
  78. };
  79. //used for iterated error state EKF update
  80. //for the aim to calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  81. //applied for measurement as a dynamic manifold whose dimension or type is changing
  82. template<typename T>
  83. struct dyn_runtime_share_datastruct
  84. {
  85. bool valid;
  86. bool converge;
  87. //Z z;
  88. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> h_v;
  89. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> h_x;
  90. Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> R;
  91. };
  92. //状态量,噪声,输入状态量
  93. template<typename state, int process_noise_dof, typename input = state, typename measurement=state, int measurement_noise_dof=0>
  94. class esekf{
  95. typedef esekf self;
  96. enum{
  97. n = state::DOF, m = state::DIM, l = measurement::DOF
  98. };
  99. public:
  100. typedef typename state::scalar scalar_type;
  101. typedef Matrix<scalar_type, n, n> cov;
  102. typedef Matrix<scalar_type, m, n> cov_;
  103. typedef SparseMatrix<scalar_type> spMt;
  104. typedef Matrix<scalar_type, n, 1> vectorized_state;
  105. typedef Matrix<scalar_type, m, 1> flatted_state;
  106. typedef flatted_state processModel(state &, const input &);
  107. typedef Eigen::Matrix<scalar_type, m, n> processMatrix1(state &, const input &);
  108. typedef Eigen::Matrix<scalar_type, m, process_noise_dof> processMatrix2(state &, const input &);
  109. typedef Eigen::Matrix<scalar_type, process_noise_dof, process_noise_dof> processnoisecovariance;
  110. typedef measurement measurementModel(state &, bool &);
  111. typedef measurement measurementModel_share(state &, share_datastruct<state, measurement, measurement_noise_dof> &);
  112. typedef Eigen::Matrix<scalar_type, Eigen::Dynamic, 1> measurementModel_dyn(state &, bool &);
  113. //typedef Eigen::Matrix<scalar_type, Eigen::Dynamic, 1> measurementModel_dyn_share(state &, dyn_share_datastruct<scalar_type> &);
  114. typedef void measurementModel_dyn_share(state &, dyn_share_datastruct<scalar_type> &);
  115. typedef Eigen::Matrix<scalar_type ,l, n> measurementMatrix1(state &, bool&);
  116. typedef Eigen::Matrix<scalar_type , Eigen::Dynamic, n> measurementMatrix1_dyn(state &, bool&);
  117. typedef Eigen::Matrix<scalar_type ,l, measurement_noise_dof> measurementMatrix2(state &, bool&);
  118. typedef Eigen::Matrix<scalar_type ,Eigen::Dynamic, Eigen::Dynamic> measurementMatrix2_dyn(state &, bool&);
  119. typedef Eigen::Matrix<scalar_type, measurement_noise_dof, measurement_noise_dof> measurementnoisecovariance;
  120. typedef Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> measurementnoisecovariance_dyn;
  121. esekf(const state &x = state(),
  122. const cov &P = cov::Identity()): x_(x), P_(P){
  123. #ifdef USE_sparse
  124. SparseMatrix<scalar_type> ref(n, n);
  125. ref.setIdentity();
  126. l_ = ref;
  127. f_x_2 = ref;
  128. f_x_1 = ref;
  129. #endif
  130. };
  131. //receive system-specific models and their differentions.
  132. //for measurement as a manifold.
  133. void init(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, measurementModel h_in, measurementMatrix1 h_x_in, measurementMatrix2 h_v_in, int maximum_iteration, scalar_type limit_vector[n])
  134. {
  135. f = f_in;
  136. f_x = f_x_in;
  137. f_w = f_w_in;
  138. h = h_in;
  139. h_x = h_x_in;
  140. h_v = h_v_in;
  141. maximum_iter = maximum_iteration;
  142. for(int i=0; i<n; i++)
  143. {
  144. limit[i] = limit_vector[i];
  145. }
  146. x_.build_S2_state();
  147. x_.build_SO3_state();
  148. x_.build_vect_state();
  149. }
  150. //receive system-specific models and their differentions.
  151. //for measurement as an Eigen matrix whose dimention is chaing.
  152. void init_dyn(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, measurementModel_dyn h_in, measurementMatrix1_dyn h_x_in, measurementMatrix2_dyn h_v_in, int maximum_iteration, scalar_type limit_vector[n])
  153. {
  154. f = f_in;
  155. f_x = f_x_in;
  156. f_w = f_w_in;
  157. h_dyn = h_in;
  158. h_x_dyn = h_x_in;
  159. h_v_dyn = h_v_in;
  160. maximum_iter = maximum_iteration;
  161. for(int i=0; i<n; i++)
  162. {
  163. limit[i] = limit_vector[i];
  164. }
  165. x_.build_S2_state();
  166. x_.build_SO3_state();
  167. x_.build_vect_state();
  168. }
  169. //receive system-specific models and their differentions.
  170. //for measurement as a dynamic manifold whose dimension or type is changing.
  171. void init_dyn_runtime(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, measurementMatrix1_dyn h_x_in, measurementMatrix2_dyn h_v_in, int maximum_iteration, scalar_type limit_vector[n])
  172. {
  173. f = f_in;
  174. f_x = f_x_in;
  175. f_w = f_w_in;
  176. h_x_dyn = h_x_in;
  177. h_v_dyn = h_v_in;
  178. maximum_iter = maximum_iteration;
  179. for(int i=0; i<n; i++)
  180. {
  181. limit[i] = limit_vector[i];
  182. }
  183. x_.build_S2_state();
  184. x_.build_SO3_state();
  185. x_.build_vect_state();
  186. }
  187. //receive system-specific models and their differentions
  188. //for measurement as a manifold.
  189. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function (h_share_in).
  190. void init_share(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, measurementModel_share h_share_in, int maximum_iteration, scalar_type limit_vector[n])
  191. {
  192. f = f_in;
  193. f_x = f_x_in;
  194. f_w = f_w_in;
  195. h_share = h_share_in;
  196. maximum_iter = maximum_iteration;
  197. for(int i=0; i<n; i++)
  198. {
  199. limit[i] = limit_vector[i];
  200. }
  201. x_.build_S2_state();
  202. x_.build_SO3_state();
  203. x_.build_vect_state();
  204. }
  205. //receive system-specific models and their differentions
  206. //for measurement as an Eigen matrix whose dimension is changing.
  207. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function (h_dyn_share_in).
  208. void init_dyn_share(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, measurementModel_dyn_share h_dyn_share_in, int maximum_iteration, scalar_type limit_vector[n])
  209. {
  210. f = f_in;
  211. f_x = f_x_in;
  212. f_w = f_w_in;
  213. h_dyn_share = h_dyn_share_in;
  214. maximum_iter = maximum_iteration;
  215. for(int i=0; i<n; i++)
  216. {
  217. limit[i] = limit_vector[i];
  218. }
  219. x_.build_S2_state();
  220. x_.build_SO3_state();
  221. x_.build_vect_state();
  222. }
  223. //receive system-specific models and their differentions
  224. //for measurement as a dynamic manifold whose dimension or type is changing.
  225. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function (h_dyn_share_in).
  226. //for any scenarios where it is needed
  227. void init_dyn_runtime_share(processModel f_in, processMatrix1 f_x_in, processMatrix2 f_w_in, int maximum_iteration, scalar_type limit_vector[n])
  228. {
  229. f = f_in;
  230. f_x = f_x_in;
  231. f_w = f_w_in;
  232. maximum_iter = maximum_iteration;
  233. for(int i=0; i<n; i++)
  234. {
  235. limit[i] = limit_vector[i];
  236. }
  237. x_.build_S2_state();
  238. x_.build_SO3_state();
  239. x_.build_vect_state();
  240. }
  241. // iterated error state EKF propogation
  242. void predict(double &dt, processnoisecovariance &Q, const input &i_in){
  243. flatted_state f_ = f(x_, i_in);
  244. cov_ f_x_ = f_x(x_, i_in);
  245. cov f_x_final;
  246. Matrix<scalar_type, m, process_noise_dof> f_w_ = f_w(x_, i_in);
  247. Matrix<scalar_type, n, process_noise_dof> f_w_final;
  248. state x_before = x_;
  249. x_.oplus(f_, dt);
  250. F_x1 = cov::Identity();
  251. for (std::vector<std::pair<std::pair<int, int>, int> >::iterator it = x_.vect_state.begin(); it != x_.vect_state.end(); it++) {
  252. int idx = (*it).first.first;
  253. int dim = (*it).first.second;
  254. int dof = (*it).second;
  255. for(int i = 0; i < n; i++){
  256. for(int j=0; j<dof; j++)
  257. {f_x_final(idx+j, i) = f_x_(dim+j, i);}
  258. }
  259. for(int i = 0; i < process_noise_dof; i++){
  260. for(int j=0; j<dof; j++)
  261. {f_w_final(idx+j, i) = f_w_(dim+j, i);}
  262. }
  263. }
  264. Matrix<scalar_type, 3, 3> res_temp_SO3;
  265. MTK::vect<3, scalar_type> seg_SO3;
  266. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  267. int idx = (*it).first;
  268. int dim = (*it).second;
  269. for(int i = 0; i < 3; i++){
  270. seg_SO3(i) = -1 * f_(dim + i) * dt;
  271. }
  272. MTK::SO3<scalar_type> res;
  273. res.w() = MTK::exp<scalar_type, 3>(res.vec(), seg_SO3, scalar_type(1/2));
  274. #ifdef USE_sparse
  275. res_temp_SO3 = res.toRotationMatrix();
  276. for(int i = 0; i < 3; i++){
  277. for(int j = 0; j < 3; j++){
  278. f_x_1.coeffRef(idx + i, idx + j) = res_temp_SO3(i, j);
  279. }
  280. }
  281. #else
  282. F_x1.template block<3, 3>(idx, idx) = res.toRotationMatrix();
  283. #endif
  284. res_temp_SO3 = MTK::A_matrix(seg_SO3);
  285. for(int i = 0; i < n; i++){
  286. f_x_final. template block<3, 1>(idx, i) = res_temp_SO3 * (f_x_. template block<3, 1>(dim, i));
  287. }
  288. for(int i = 0; i < process_noise_dof; i++){
  289. f_w_final. template block<3, 1>(idx, i) = res_temp_SO3 * (f_w_. template block<3, 1>(dim, i));
  290. }
  291. }
  292. Matrix<scalar_type, 2, 3> res_temp_S2;
  293. Matrix<scalar_type, 2, 2> res_temp_S2_;
  294. MTK::vect<3, scalar_type> seg_S2;
  295. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  296. int idx = (*it).first;
  297. int dim = (*it).second;
  298. for(int i = 0; i < 3; i++){
  299. seg_S2(i) = f_(dim + i) * dt;
  300. }
  301. MTK::vect<2, scalar_type> vec = MTK::vect<2, scalar_type>::Zero();
  302. MTK::SO3<scalar_type> res;
  303. res.w() = MTK::exp<scalar_type, 3>(res.vec(), seg_S2, scalar_type(1/2));
  304. Eigen::Matrix<scalar_type, 2, 3> Nx;
  305. Eigen::Matrix<scalar_type, 3, 2> Mx;
  306. x_.S2_Nx_yy(Nx, idx);
  307. x_before.S2_Mx(Mx, vec, idx);
  308. #ifdef USE_sparse
  309. res_temp_S2_ = Nx * res.toRotationMatrix() * Mx;
  310. for(int i = 0; i < 2; i++){
  311. for(int j = 0; j < 2; j++){
  312. f_x_1.coeffRef(idx + i, idx + j) = res_temp_S2_(i, j);
  313. }
  314. }
  315. #else
  316. F_x1.template block<2, 2>(idx, idx) = Nx * res.toRotationMatrix() * Mx;
  317. #endif
  318. Eigen::Matrix<scalar_type, 3, 3> x_before_hat;
  319. x_before.S2_hat(x_before_hat, idx);
  320. res_temp_S2 = -Nx * res.toRotationMatrix() * x_before_hat*MTK::A_matrix(seg_S2).transpose();
  321. for(int i = 0; i < n; i++){
  322. f_x_final. template block<2, 1>(idx, i) = res_temp_S2 * (f_x_. template block<3, 1>(dim, i));
  323. }
  324. for(int i = 0; i < process_noise_dof; i++){
  325. f_w_final. template block<2, 1>(idx, i) = res_temp_S2 * (f_w_. template block<3, 1>(dim, i));
  326. }
  327. }
  328. #ifdef USE_sparse
  329. f_x_1.makeCompressed();
  330. spMt f_x2 = f_x_final.sparseView();
  331. spMt f_w1 = f_w_final.sparseView();
  332. spMt xp = f_x_1 + f_x2 * dt;
  333. P_ = xp * P_ * xp.transpose() + (f_w1 * dt) * Q * (f_w1 * dt).transpose();
  334. #else
  335. F_x1 += f_x_final * dt;
  336. P_ = (F_x1) * P_ * (F_x1).transpose() + (dt * f_w_final) * Q * (dt * f_w_final).transpose();//更新协方差矩阵
  337. #endif
  338. }
  339. //iterated error state EKF update for measurement as a manifold.
  340. void update_iterated(measurement& z, measurementnoisecovariance &R) {
  341. if(!(is_same<typename measurement::scalar, scalar_type>())){
  342. std::cerr << "the scalar type of measurment must be the same as the state" << std::endl;
  343. std::exit(100);
  344. }
  345. int t = 0;
  346. bool converg = true;
  347. bool valid = true;
  348. state x_propagated = x_;
  349. cov P_propagated = P_;
  350. for(int i=-1; i<maximum_iter; i++)
  351. {
  352. vectorized_state dx, dx_new;
  353. x_.boxminus(dx, x_propagated);
  354. dx_new = dx;
  355. #ifdef USE_sparse
  356. spMt h_x_ = h_x(x_, valid).sparseView();
  357. spMt h_v_ = h_v(x_, valid).sparseView();
  358. spMt R_ = R.sparseView();
  359. #else
  360. Matrix<scalar_type, l, n> h_x_ = h_x(x_, valid);
  361. Matrix<scalar_type, l, Eigen::Dynamic> h_v_ = h_v(x_, valid);
  362. #endif
  363. if(! valid)
  364. {
  365. continue;
  366. }
  367. P_ = P_propagated;
  368. Matrix<scalar_type, 3, 3> res_temp_SO3;
  369. MTK::vect<3, scalar_type> seg_SO3;
  370. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  371. int idx = (*it).first;
  372. int dim = (*it).second;
  373. for(int i = 0; i < 3; i++){
  374. seg_SO3(i) = dx(idx+i);
  375. }
  376. res_temp_SO3 = A_matrix(seg_SO3).transpose();
  377. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx.template block<3, 1>(idx, 0);
  378. for(int i = 0; i < n; i++){
  379. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  380. }
  381. for(int i = 0; i < n; i++){
  382. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  383. }
  384. }
  385. Matrix<scalar_type, 2, 2> res_temp_S2;
  386. MTK::vect<2, scalar_type> seg_S2;
  387. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  388. int idx = (*it).first;
  389. int dim = (*it).second;
  390. for(int i = 0; i < 2; i++){
  391. seg_S2(i) = dx(idx + i);
  392. }
  393. Eigen::Matrix<scalar_type, 2, 3> Nx;
  394. Eigen::Matrix<scalar_type, 3, 2> Mx;
  395. x_.S2_Nx_yy(Nx, idx);
  396. x_propagated.S2_Mx(Mx, seg_S2, idx);
  397. res_temp_S2 = Nx * Mx;
  398. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx.template block<2, 1>(idx, 0);
  399. for(int i = 0; i < n; i++){
  400. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  401. }
  402. for(int i = 0; i < n; i++){
  403. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  404. }
  405. }
  406. Matrix<scalar_type, n, l> K_;
  407. if(n > l)
  408. {
  409. #ifdef USE_sparse
  410. Matrix<scalar_type, l, l> K_temp = h_x_ * P_ * h_x_.transpose();
  411. spMt R_temp = h_v_ * R_ * h_v_.transpose();
  412. K_temp += R_temp;
  413. K_ = P_ * h_x_.transpose() * K_temp.inverse();
  414. #else
  415. K_= P_ * h_x_.transpose() * (h_x_ * P_ * h_x_.transpose() + h_v_ * R * h_v_.transpose()).inverse();
  416. #endif
  417. }
  418. else
  419. {
  420. #ifdef USE_sparse
  421. measurementnoisecovariance b = measurementnoisecovariance::Identity();
  422. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  423. solver.compute(R_);
  424. measurementnoisecovariance R_in_temp = solver.solve(b);
  425. spMt R_in = R_in_temp.sparseView();
  426. spMt K_temp = h_x_.transpose() * R_in * h_x_;
  427. cov P_temp = P_.inverse();
  428. P_temp += K_temp;
  429. K_ = P_temp.inverse() * h_x_.transpose() * R_in;
  430. #else
  431. measurementnoisecovariance R_in = (h_v_*R*h_v_.transpose()).inverse();
  432. K_ = (h_x_.transpose() * R_in * h_x_ + P_.inverse()).inverse() * h_x_.transpose() * R_in;
  433. #endif
  434. }
  435. Matrix<scalar_type, l, 1> innovation;
  436. z.boxminus(innovation, h(x_, valid));
  437. cov K_x = K_ * h_x_;
  438. Matrix<scalar_type, n, 1> dx_ = K_ * innovation + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  439. state x_before = x_;
  440. x_.boxplus(dx_);
  441. converg = true;
  442. for(int i = 0; i < n ; i++)
  443. {
  444. if(std::fabs(dx_[i]) > limit[i])
  445. {
  446. converg = false;
  447. break;
  448. }
  449. }
  450. if(converg) t++;
  451. if(t > 1 || i == maximum_iter - 1)
  452. {
  453. L_ = P_;
  454. Matrix<scalar_type, 3, 3> res_temp_SO3;
  455. MTK::vect<3, scalar_type> seg_SO3;
  456. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  457. int idx = (*it).first;
  458. for(int i = 0; i < 3; i++){
  459. seg_SO3(i) = dx_(i + idx);
  460. }
  461. res_temp_SO3 = A_matrix(seg_SO3).transpose();
  462. for(int i = 0; i < n; i++){
  463. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  464. }
  465. if(n > l)
  466. {
  467. for(int i = 0; i < l; i++){
  468. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  469. }
  470. }
  471. else
  472. {
  473. for(int i = 0; i < n; i++){
  474. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  475. }
  476. }
  477. for(int i = 0; i < n; i++){
  478. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  479. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  480. }
  481. }
  482. Matrix<scalar_type, 2, 2> res_temp_S2;
  483. MTK::vect<2, scalar_type> seg_S2;
  484. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  485. int idx = (*it).first;
  486. for(int i = 0; i < 2; i++){
  487. seg_S2(i) = dx_(i + idx);
  488. }
  489. Eigen::Matrix<scalar_type, 2, 3> Nx;
  490. Eigen::Matrix<scalar_type, 3, 2> Mx;
  491. x_.S2_Nx_yy(Nx, idx);
  492. x_propagated.S2_Mx(Mx, seg_S2, idx);
  493. res_temp_S2 = Nx * Mx;
  494. for(int i = 0; i < n; i++){
  495. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  496. }
  497. if(n > l)
  498. {
  499. for(int i = 0; i < l; i++){
  500. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  501. }
  502. }
  503. else
  504. {
  505. for(int i = 0; i < n; i++){
  506. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  507. }
  508. }
  509. for(int i = 0; i < n; i++){
  510. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  511. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  512. }
  513. }
  514. if(n > l)
  515. {
  516. P_ = L_ - K_ * h_x_ * P_;
  517. }
  518. else
  519. {
  520. P_ = L_ - K_x * P_;
  521. }
  522. return;
  523. }
  524. }
  525. }
  526. //iterated error state EKF update for measurement as a manifold.
  527. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  528. void update_iterated_share() {
  529. if(!(is_same<typename measurement::scalar, scalar_type>())){
  530. std::cerr << "the scalar type of measurment must be the same as the state" << std::endl;
  531. std::exit(100);
  532. }
  533. int t = 0;
  534. share_datastruct<state, measurement, measurement_noise_dof> _share;
  535. _share.valid = true;
  536. _share.converge = true;
  537. state x_propagated = x_;
  538. cov P_propagated = P_;
  539. for(int i=-1; i<maximum_iter; i++)
  540. {
  541. vectorized_state dx, dx_new;
  542. x_.boxminus(dx, x_propagated);
  543. dx_new = dx;
  544. measurement h = h_share(x_, _share);
  545. measurement z = _share.z;
  546. measurementnoisecovariance R = _share.R;
  547. #ifdef USE_sparse
  548. spMt h_x_ = _share.h_x.sparseView();
  549. spMt h_v_ = _share.h_v.sparseView();
  550. spMt R_ = _share.R.sparseView();
  551. #else
  552. Matrix<scalar_type, l, n> h_x_ = _share.h_x;
  553. Matrix<scalar_type, l, Eigen::Dynamic> h_v_ = _share.h_v;
  554. #endif
  555. if(! _share.valid)
  556. {
  557. continue;
  558. }
  559. P_ = P_propagated;
  560. Matrix<scalar_type, 3, 3> res_temp_SO3;
  561. MTK::vect<3, scalar_type> seg_SO3;
  562. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  563. int idx = (*it).first;
  564. int dim = (*it).second;
  565. for(int i = 0; i < 3; i++){
  566. seg_SO3(i) = dx(idx+i);
  567. }
  568. res_temp_SO3 = A_matrix(seg_SO3).transpose();
  569. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx.template block<3, 1>(idx, 0);
  570. for(int i = 0; i < n; i++){
  571. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  572. }
  573. for(int i = 0; i < n; i++){
  574. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  575. }
  576. }
  577. Matrix<scalar_type, 2, 2> res_temp_S2;
  578. MTK::vect<2, scalar_type> seg_S2;
  579. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  580. int idx = (*it).first;
  581. int dim = (*it).second;
  582. for(int i = 0; i < 2; i++){
  583. seg_S2(i) = dx(idx + i);
  584. }
  585. Eigen::Matrix<scalar_type, 2, 3> Nx;
  586. Eigen::Matrix<scalar_type, 3, 2> Mx;
  587. x_.S2_Nx_yy(Nx, idx);
  588. x_propagated.S2_Mx(Mx, seg_S2, idx);
  589. res_temp_S2 = Nx * Mx;
  590. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx.template block<2, 1>(idx, 0);
  591. for(int i = 0; i < n; i++){
  592. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  593. }
  594. for(int i = 0; i < n; i++){
  595. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  596. }
  597. }
  598. Matrix<scalar_type, n, l> K_;
  599. if(n > l)
  600. {
  601. #ifdef USE_sparse
  602. Matrix<scalar_type, l, l> K_temp = h_x_ * P_ * h_x_.transpose();
  603. spMt R_temp = h_v_ * R_ * h_v_.transpose();
  604. K_temp += R_temp;
  605. K_ = P_ * h_x_.transpose() * K_temp.inverse();
  606. #else
  607. K_= P_ * h_x_.transpose() * (h_x_ * P_ * h_x_.transpose() + h_v_ * R * h_v_.transpose()).inverse();
  608. #endif
  609. }
  610. else
  611. {
  612. #ifdef USE_sparse
  613. measurementnoisecovariance b = measurementnoisecovariance::Identity();
  614. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  615. solver.compute(R_);
  616. measurementnoisecovariance R_in_temp = solver.solve(b);
  617. spMt R_in = R_in_temp.sparseView();
  618. spMt K_temp = h_x_.transpose() * R_in * h_x_;
  619. cov P_temp = P_.inverse();
  620. P_temp += K_temp;
  621. K_ = P_temp.inverse() * h_x_.transpose() * R_in;
  622. #else
  623. measurementnoisecovariance R_in = (h_v_*R*h_v_.transpose()).inverse();
  624. K_ = (h_x_.transpose() * R_in * h_x_ + P_.inverse()).inverse() * h_x_.transpose() * R_in;
  625. #endif
  626. }
  627. Matrix<scalar_type, l, 1> innovation;
  628. z.boxminus(innovation, h);
  629. cov K_x = K_ * h_x_;
  630. Matrix<scalar_type, n, 1> dx_ = K_ * innovation + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  631. state x_before = x_;
  632. x_.boxplus(dx_);
  633. _share.converge = true;
  634. for(int i = 0; i < n ; i++)
  635. {
  636. if(std::fabs(dx_[i]) > limit[i])
  637. {
  638. _share.converge = false;
  639. break;
  640. }
  641. }
  642. if(_share.converge) t++;
  643. if(t > 1 || i == maximum_iter - 1)
  644. {
  645. L_ = P_;
  646. Matrix<scalar_type, 3, 3> res_temp_SO3;
  647. MTK::vect<3, scalar_type> seg_SO3;
  648. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  649. int idx = (*it).first;
  650. for(int i = 0; i < 3; i++){
  651. seg_SO3(i) = dx_(i + idx);
  652. }
  653. res_temp_SO3 = A_matrix(seg_SO3).transpose();
  654. for(int i = 0; i < n; i++){
  655. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  656. }
  657. if(n > l)
  658. {
  659. for(int i = 0; i < l; i++){
  660. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  661. }
  662. }
  663. else
  664. {
  665. for(int i = 0; i < n; i++){
  666. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  667. }
  668. }
  669. for(int i = 0; i < n; i++){
  670. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  671. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  672. }
  673. }
  674. Matrix<scalar_type, 2, 2> res_temp_S2;
  675. MTK::vect<2, scalar_type> seg_S2;
  676. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  677. int idx = (*it).first;
  678. for(int i = 0; i < 2; i++){
  679. seg_S2(i) = dx_(i + idx);
  680. }
  681. Eigen::Matrix<scalar_type, 2, 3> Nx;
  682. Eigen::Matrix<scalar_type, 3, 2> Mx;
  683. x_.S2_Nx_yy(Nx, idx);
  684. x_propagated.S2_Mx(Mx, seg_S2, idx);
  685. res_temp_S2 = Nx * Mx;
  686. for(int i = 0; i < n; i++){
  687. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  688. }
  689. if(n > l)
  690. {
  691. for(int i = 0; i < l; i++){
  692. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  693. }
  694. }
  695. else
  696. {
  697. for(int i = 0; i < n; i++){
  698. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  699. }
  700. }
  701. for(int i = 0; i < n; i++){
  702. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  703. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  704. }
  705. }
  706. if(n > l)
  707. {
  708. P_ = L_ - K_ * h_x_ * P_;
  709. }
  710. else
  711. {
  712. P_ = L_ - K_x * P_;
  713. }
  714. return;
  715. }
  716. }
  717. }
  718. //iterated error state EKF update for measurement as an Eigen matrix whose dimension is changing.
  719. void update_iterated_dyn(Eigen::Matrix<scalar_type, Eigen::Dynamic, 1> z, measurementnoisecovariance_dyn R) {
  720. int t = 0;
  721. bool valid = true;
  722. bool converg = true;
  723. state x_propagated = x_;
  724. cov P_propagated = P_;
  725. int dof_Measurement;
  726. int dof_Measurement_noise = R.rows();
  727. for(int i=-1; i<maximum_iter; i++)
  728. {
  729. valid = true;
  730. #ifdef USE_sparse
  731. spMt h_x_ = h_x_dyn(x_, valid).sparseView();
  732. spMt h_v_ = h_v_dyn(x_, valid).sparseView();
  733. spMt R_ = R.sparseView();
  734. #else
  735. Matrix<scalar_type, Eigen::Dynamic, n> h_x_ = h_x_dyn(x_, valid);
  736. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_v_ = h_v_dyn(x_, valid);
  737. #endif
  738. Matrix<scalar_type, Eigen::Dynamic, 1> h_ = h_dyn(x_, valid);
  739. dof_Measurement = h_.rows();
  740. vectorized_state dx, dx_new;
  741. x_.boxminus(dx, x_propagated);
  742. dx_new = dx;
  743. if(! valid)
  744. {
  745. continue;
  746. }
  747. P_ = P_propagated;
  748. Matrix<scalar_type, 3, 3> res_temp_SO3;
  749. MTK::vect<3, scalar_type> seg_SO3;
  750. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  751. int idx = (*it).first;
  752. int dim = (*it).second;
  753. for(int i = 0; i < 3; i++){
  754. seg_SO3(i) = dx(idx+i);
  755. }
  756. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  757. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx_new.template block<3, 1>(idx, 0);
  758. for(int i = 0; i < n; i++){
  759. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  760. }
  761. for(int i = 0; i < n; i++){
  762. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  763. }
  764. }
  765. Matrix<scalar_type, 2, 2> res_temp_S2;
  766. MTK::vect<2, scalar_type> seg_S2;
  767. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  768. int idx = (*it).first;
  769. int dim = (*it).second;
  770. for(int i = 0; i < 2; i++){
  771. seg_S2(i) = dx(idx + i);
  772. }
  773. Eigen::Matrix<scalar_type, 2, 3> Nx;
  774. Eigen::Matrix<scalar_type, 3, 2> Mx;
  775. x_.S2_Nx_yy(Nx, idx);
  776. x_propagated.S2_Mx(Mx, seg_S2, idx);
  777. res_temp_S2 = Nx * Mx;
  778. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx_new.template block<2, 1>(idx, 0);
  779. for(int i = 0; i < n; i++){
  780. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  781. }
  782. for(int i = 0; i < n; i++){
  783. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  784. }
  785. }
  786. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_;
  787. if(n > dof_Measurement)
  788. {
  789. #ifdef USE_sparse
  790. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_temp = h_x_ * P_ * h_x_.transpose();
  791. spMt R_temp = h_v_ * R_ * h_v_.transpose();
  792. K_temp += R_temp;
  793. K_ = P_ * h_x_.transpose() * K_temp.inverse();
  794. #else
  795. K_= P_ * h_x_.transpose() * (h_x_ * P_ * h_x_.transpose() + h_v_ * R * h_v_.transpose()).inverse();
  796. #endif
  797. }
  798. else
  799. {
  800. #ifdef USE_sparse
  801. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> b = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Identity(dof_Measurement_noise, dof_Measurement_noise);
  802. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  803. solver.compute(R_);
  804. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in_temp = solver.solve(b);
  805. spMt R_in = R_in_temp.sparseView();
  806. spMt K_temp = h_x_.transpose() * R_in * h_x_;
  807. cov P_temp = P_.inverse();
  808. P_temp += K_temp;
  809. K_ = P_temp.inverse() * h_x_.transpose() * R_in;
  810. #else
  811. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in = (h_v_*R*h_v_.transpose()).inverse();
  812. K_ = (h_x_.transpose() * R_in * h_x_ + P_.inverse()).inverse() * h_x_.transpose() * R_in;
  813. #endif
  814. }
  815. cov K_x = K_ * h_x_;
  816. Matrix<scalar_type, n, 1> dx_ = K_ * (z - h_) + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  817. state x_before = x_;
  818. x_.boxplus(dx_);
  819. converg = true;
  820. for(int i = 0; i < n ; i++)
  821. {
  822. if(std::fabs(dx_[i]) > limit[i])
  823. {
  824. converg = false;
  825. break;
  826. }
  827. }
  828. if(converg) t++;
  829. if(t > 1 || i == maximum_iter - 1)
  830. {
  831. L_ = P_;
  832. std::cout << "iteration time:" << t << "," << i << std::endl;
  833. Matrix<scalar_type, 3, 3> res_temp_SO3;
  834. MTK::vect<3, scalar_type> seg_SO3;
  835. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  836. int idx = (*it).first;
  837. for(int i = 0; i < 3; i++){
  838. seg_SO3(i) = dx_(i + idx);
  839. }
  840. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  841. for(int i = 0; i < n; i++){
  842. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  843. }
  844. if(n > dof_Measurement)
  845. {
  846. for(int i = 0; i < dof_Measurement; i++){
  847. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  848. }
  849. }
  850. else
  851. {
  852. for(int i = 0; i < n; i++){
  853. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  854. }
  855. }
  856. for(int i = 0; i < n; i++){
  857. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  858. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  859. }
  860. }
  861. Matrix<scalar_type, 2, 2> res_temp_S2;
  862. MTK::vect<2, scalar_type> seg_S2;
  863. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  864. int idx = (*it).first;
  865. for(int i = 0; i < 2; i++){
  866. seg_S2(i) = dx_(i + idx);
  867. }
  868. Eigen::Matrix<scalar_type, 2, 3> Nx;
  869. Eigen::Matrix<scalar_type, 3, 2> Mx;
  870. x_.S2_Nx_yy(Nx, idx);
  871. x_propagated.S2_Mx(Mx, seg_S2, idx);
  872. res_temp_S2 = Nx * Mx;
  873. for(int i = 0; i < n; i++){
  874. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  875. }
  876. if(n > dof_Measurement)
  877. {
  878. for(int i = 0; i < dof_Measurement; i++){
  879. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  880. }
  881. }
  882. else
  883. {
  884. for(int i = 0; i < n; i++){
  885. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  886. }
  887. }
  888. for(int i = 0; i < n; i++){
  889. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  890. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  891. }
  892. }
  893. if(n > dof_Measurement)
  894. {
  895. P_ = L_ - K_*h_x_*P_;
  896. }
  897. else
  898. {
  899. P_ = L_ - K_x * P_;
  900. }
  901. return;
  902. }
  903. }
  904. }
  905. //iterated error state EKF update for measurement as an Eigen matrix whose dimension is changing.
  906. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  907. void update_iterated_dyn_share() {
  908. int t = 0;
  909. dyn_share_datastruct<scalar_type> dyn_share;
  910. dyn_share.valid = true;
  911. dyn_share.converge = true;
  912. state x_propagated = x_;
  913. cov P_propagated = P_;
  914. int dof_Measurement;
  915. int dof_Measurement_noise;
  916. for(int i=-1; i<maximum_iter; i++)
  917. {
  918. dyn_share.valid = true;
  919. h_dyn_share (x_, dyn_share);
  920. //Matrix<scalar_type, Eigen::Dynamic, 1> h = h_dyn_share (x_, dyn_share);
  921. Matrix<scalar_type, Eigen::Dynamic, 1> z = dyn_share.z;
  922. Matrix<scalar_type, Eigen::Dynamic, 1> h = dyn_share.h;
  923. #ifdef USE_sparse
  924. spMt h_x = dyn_share.h_x.sparseView();
  925. spMt h_v = dyn_share.h_v.sparseView();
  926. spMt R_ = dyn_share.R.sparseView();
  927. #else
  928. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R = dyn_share.R;
  929. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_x = dyn_share.h_x;
  930. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_v = dyn_share.h_v;
  931. #endif
  932. dof_Measurement = h_x.rows();
  933. dof_Measurement_noise = dyn_share.R.rows();
  934. vectorized_state dx, dx_new;
  935. x_.boxminus(dx, x_propagated);
  936. dx_new = dx;
  937. if(! (dyn_share.valid))
  938. {
  939. continue;
  940. }
  941. P_ = P_propagated;
  942. Matrix<scalar_type, 3, 3> res_temp_SO3;
  943. MTK::vect<3, scalar_type> seg_SO3;
  944. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  945. int idx = (*it).first;
  946. int dim = (*it).second;
  947. for(int i = 0; i < 3; i++){
  948. seg_SO3(i) = dx(idx+i);
  949. }
  950. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  951. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx_new.template block<3, 1>(idx, 0);
  952. for(int i = 0; i < n; i++){
  953. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  954. }
  955. for(int i = 0; i < n; i++){
  956. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  957. }
  958. }
  959. Matrix<scalar_type, 2, 2> res_temp_S2;
  960. MTK::vect<2, scalar_type> seg_S2;
  961. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  962. int idx = (*it).first;
  963. int dim = (*it).second;
  964. for(int i = 0; i < 2; i++){
  965. seg_S2(i) = dx(idx + i);
  966. }
  967. Eigen::Matrix<scalar_type, 2, 3> Nx;
  968. Eigen::Matrix<scalar_type, 3, 2> Mx;
  969. x_.S2_Nx_yy(Nx, idx);
  970. x_propagated.S2_Mx(Mx, seg_S2, idx);
  971. res_temp_S2 = Nx * Mx;
  972. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx_new.template block<2, 1>(idx, 0);
  973. for(int i = 0; i < n; i++){
  974. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  975. }
  976. for(int i = 0; i < n; i++){
  977. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  978. }
  979. }
  980. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_;
  981. if(n > dof_Measurement)
  982. {
  983. #ifdef USE_sparse
  984. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_temp = h_x * P_ * h_x.transpose();
  985. spMt R_temp = h_v * R_ * h_v.transpose();
  986. K_temp += R_temp;
  987. K_ = P_ * h_x.transpose() * K_temp.inverse();
  988. #else
  989. K_= P_ * h_x.transpose() * (h_x * P_ * h_x.transpose() + h_v * R * h_v.transpose()).inverse();
  990. #endif
  991. }
  992. else
  993. {
  994. #ifdef USE_sparse
  995. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> b = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Identity(dof_Measurement_noise, dof_Measurement_noise);
  996. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  997. solver.compute(R_);
  998. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in_temp = solver.solve(b);
  999. spMt R_in = R_in_temp.sparseView();
  1000. spMt K_temp = h_x.transpose() * R_in * h_x;
  1001. cov P_temp = P_.inverse();
  1002. P_temp += K_temp;
  1003. K_ = P_temp.inverse() * h_x.transpose() * R_in;
  1004. #else
  1005. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in = (h_v*R*h_v.transpose()).inverse();
  1006. K_ = (h_x.transpose() * R_in * h_x + P_.inverse()).inverse() * h_x.transpose() * R_in;
  1007. #endif
  1008. }
  1009. cov K_x = K_ * h_x;
  1010. Matrix<scalar_type, n, 1> dx_ = K_ * (z - h) + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  1011. state x_before = x_;
  1012. x_.boxplus(dx_);
  1013. dyn_share.converge = true;
  1014. for(int i = 0; i < n ; i++)
  1015. {
  1016. if(std::fabs(dx_[i]) > limit[i])
  1017. {
  1018. dyn_share.converge = false;
  1019. break;
  1020. }
  1021. }
  1022. if(dyn_share.converge) t++;
  1023. if(t > 1 || i == maximum_iter - 1)
  1024. {
  1025. L_ = P_;
  1026. std::cout << "iteration time:" << t << "," << i << std::endl;
  1027. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1028. MTK::vect<3, scalar_type> seg_SO3;
  1029. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1030. int idx = (*it).first;
  1031. for(int i = 0; i < 3; i++){
  1032. seg_SO3(i) = dx_(i + idx);
  1033. }
  1034. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1035. for(int i = 0; i < int(n); i++){
  1036. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1037. }
  1038. if(n > dof_Measurement)
  1039. {
  1040. for(int i = 0; i < dof_Measurement; i++){
  1041. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  1042. }
  1043. }
  1044. else
  1045. {
  1046. for(int i = 0; i < n; i++){
  1047. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  1048. }
  1049. }
  1050. for(int i = 0; i < n; i++){
  1051. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1052. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1053. }
  1054. }
  1055. Matrix<scalar_type, 2, 2> res_temp_S2;
  1056. MTK::vect<2, scalar_type> seg_S2;
  1057. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1058. int idx = (*it).first;
  1059. for(int i = 0; i < 2; i++){
  1060. seg_S2(i) = dx_(i + idx);
  1061. }
  1062. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1063. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1064. x_.S2_Nx_yy(Nx, idx);
  1065. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1066. res_temp_S2 = Nx * Mx;
  1067. for(int i = 0; i < n; i++){
  1068. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1069. }
  1070. if(n > dof_Measurement)
  1071. {
  1072. for(int i = 0; i < dof_Measurement; i++){
  1073. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  1074. }
  1075. }
  1076. else
  1077. {
  1078. for(int i = 0; i < n; i++){
  1079. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  1080. }
  1081. }
  1082. for(int i = 0; i < n; i++){
  1083. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1084. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1085. }
  1086. }
  1087. if(n > dof_Measurement)
  1088. {
  1089. P_ = L_ - K_*h_x*P_;
  1090. }
  1091. else
  1092. {
  1093. P_ = L_ - K_x * P_;
  1094. }
  1095. return;
  1096. }
  1097. }
  1098. }
  1099. //iterated error state EKF update for measurement as a dynamic manifold, whose dimension or type is changing.
  1100. //the measurement and the measurement model are received in a dynamic manner.
  1101. template<typename measurement_runtime, typename measurementModel_runtime>
  1102. void update_iterated_dyn_runtime(measurement_runtime z, measurementnoisecovariance_dyn R, measurementModel_runtime h_runtime) {
  1103. int t = 0;
  1104. bool valid = true;
  1105. bool converg = true;
  1106. state x_propagated = x_;
  1107. cov P_propagated = P_;
  1108. int dof_Measurement;
  1109. int dof_Measurement_noise;
  1110. for(int i=-1; i<maximum_iter; i++)
  1111. {
  1112. valid = true;
  1113. #ifdef USE_sparse
  1114. spMt h_x_ = h_x_dyn(x_, valid).sparseView();
  1115. spMt h_v_ = h_v_dyn(x_, valid).sparseView();
  1116. spMt R_ = R.sparseView();
  1117. #else
  1118. Matrix<scalar_type, Eigen::Dynamic, n> h_x_ = h_x_dyn(x_, valid);
  1119. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_v_ = h_v_dyn(x_, valid);
  1120. #endif
  1121. measurement_runtime h_ = h_runtime(x_, valid);
  1122. dof_Measurement = measurement_runtime::DOF;
  1123. dof_Measurement_noise = R.rows();
  1124. vectorized_state dx, dx_new;
  1125. x_.boxminus(dx, x_propagated);
  1126. dx_new = dx;
  1127. if(! valid)
  1128. {
  1129. continue;
  1130. }
  1131. P_ = P_propagated;
  1132. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1133. MTK::vect<3, scalar_type> seg_SO3;
  1134. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1135. int idx = (*it).first;
  1136. int dim = (*it).second;
  1137. for(int i = 0; i < 3; i++){
  1138. seg_SO3(i) = dx(idx+i);
  1139. }
  1140. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1141. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx_new.template block<3, 1>(idx, 0);
  1142. for(int i = 0; i < n; i++){
  1143. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1144. }
  1145. for(int i = 0; i < n; i++){
  1146. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1147. }
  1148. }
  1149. Matrix<scalar_type, 2, 2> res_temp_S2;
  1150. MTK::vect<2, scalar_type> seg_S2;
  1151. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1152. int idx = (*it).first;
  1153. int dim = (*it).second;
  1154. for(int i = 0; i < 2; i++){
  1155. seg_S2(i) = dx(idx + i);
  1156. }
  1157. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1158. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1159. x_.S2_Nx_yy(Nx, idx);
  1160. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1161. res_temp_S2 = Nx * Mx;
  1162. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx_new.template block<2, 1>(idx, 0);
  1163. for(int i = 0; i < n; i++){
  1164. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1165. }
  1166. for(int i = 0; i < n; i++){
  1167. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1168. }
  1169. }
  1170. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_;
  1171. if(n > dof_Measurement)
  1172. {
  1173. #ifdef USE_sparse
  1174. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_temp = h_x_ * P_ * h_x_.transpose();
  1175. spMt R_temp = h_v_ * R_ * h_v_.transpose();
  1176. K_temp += R_temp;
  1177. K_ = P_ * h_x_.transpose() * K_temp.inverse();
  1178. #else
  1179. K_= P_ * h_x_.transpose() * (h_x_ * P_ * h_x_.transpose() + h_v_ * R * h_v_.transpose()).inverse();
  1180. #endif
  1181. }
  1182. else
  1183. {
  1184. #ifdef USE_sparse
  1185. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> b = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Identity(dof_Measurement_noise, dof_Measurement_noise);
  1186. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  1187. solver.compute(R_);
  1188. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in_temp = solver.solve(b);
  1189. spMt R_in = R_in_temp.sparseView();
  1190. spMt K_temp = h_x_.transpose() * R_in * h_x_;
  1191. cov P_temp = P_.inverse();
  1192. P_temp += K_temp;
  1193. K_ = P_temp.inverse() * h_x_.transpose() * R_in;
  1194. #else
  1195. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in = (h_v_*R*h_v_.transpose()).inverse();
  1196. K_ = (h_x_.transpose() * R_in * h_x_ + P_.inverse()).inverse() * h_x_.transpose() * R_in;
  1197. #endif
  1198. }
  1199. cov K_x = K_ * h_x_;
  1200. Eigen::Matrix<scalar_type, measurement_runtime::DOF, 1> innovation;
  1201. z.boxminus(innovation, h_);
  1202. Matrix<scalar_type, n, 1> dx_ = K_ * innovation + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  1203. state x_before = x_;
  1204. x_.boxplus(dx_);
  1205. converg = true;
  1206. for(int i = 0; i < n ; i++)
  1207. {
  1208. if(std::fabs(dx_[i]) > limit[i])
  1209. {
  1210. converg = false;
  1211. break;
  1212. }
  1213. }
  1214. if(converg) t++;
  1215. if(t > 1 || i == maximum_iter - 1)
  1216. {
  1217. L_ = P_;
  1218. std::cout << "iteration time:" << t << "," << i << std::endl;
  1219. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1220. MTK::vect<3, scalar_type> seg_SO3;
  1221. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1222. int idx = (*it).first;
  1223. for(int i = 0; i < 3; i++){
  1224. seg_SO3(i) = dx_(i + idx);
  1225. }
  1226. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1227. for(int i = 0; i < n; i++){
  1228. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1229. }
  1230. if(n > dof_Measurement)
  1231. {
  1232. for(int i = 0; i < dof_Measurement; i++){
  1233. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  1234. }
  1235. }
  1236. else
  1237. {
  1238. for(int i = 0; i < n; i++){
  1239. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  1240. }
  1241. }
  1242. for(int i = 0; i < n; i++){
  1243. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1244. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1245. }
  1246. }
  1247. Matrix<scalar_type, 2, 2> res_temp_S2;
  1248. MTK::vect<2, scalar_type> seg_S2;
  1249. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1250. int idx = (*it).first;
  1251. for(int i = 0; i < 2; i++){
  1252. seg_S2(i) = dx_(i + idx);
  1253. }
  1254. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1255. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1256. x_.S2_Nx_yy(Nx, idx);
  1257. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1258. res_temp_S2 = Nx * Mx;
  1259. for(int i = 0; i < n; i++){
  1260. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1261. }
  1262. if(n > dof_Measurement)
  1263. {
  1264. for(int i = 0; i < dof_Measurement; i++){
  1265. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  1266. }
  1267. }
  1268. else
  1269. {
  1270. for(int i = 0; i < n; i++){
  1271. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  1272. }
  1273. }
  1274. for(int i = 0; i < n; i++){
  1275. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1276. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1277. }
  1278. }
  1279. if(n > dof_Measurement)
  1280. {
  1281. P_ = L_ - K_*h_x_*P_;
  1282. }
  1283. else
  1284. {
  1285. P_ = L_ - K_x * P_;
  1286. }
  1287. return;
  1288. }
  1289. }
  1290. }
  1291. //iterated error state EKF update for measurement as a dynamic manifold, whose dimension or type is changing.
  1292. //the measurement and the measurement model are received in a dynamic manner.
  1293. //calculate measurement (z), estimate measurement (h), partial differention matrices (h_x, h_v) and the noise covariance (R) at the same time, by only one function.
  1294. template<typename measurement_runtime, typename measurementModel_dyn_runtime_share>
  1295. void update_iterated_dyn_runtime_share(measurement_runtime z, measurementModel_dyn_runtime_share h) {
  1296. int t = 0;
  1297. dyn_runtime_share_datastruct<scalar_type> dyn_share;
  1298. dyn_share.valid = true;
  1299. dyn_share.converge = true;
  1300. state x_propagated = x_;
  1301. cov P_propagated = P_;
  1302. int dof_Measurement;
  1303. int dof_Measurement_noise;
  1304. for(int i=-1; i<maximum_iter; i++)
  1305. {
  1306. dyn_share.valid = true;
  1307. measurement_runtime h_ = h(x_, dyn_share);
  1308. //measurement_runtime z = dyn_share.z;
  1309. #ifdef USE_sparse
  1310. spMt h_x = dyn_share.h_x.sparseView();
  1311. spMt h_v = dyn_share.h_v.sparseView();
  1312. spMt R_ = dyn_share.R.sparseView();
  1313. #else
  1314. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R = dyn_share.R;
  1315. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_x = dyn_share.h_x;
  1316. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_v = dyn_share.h_v;
  1317. #endif
  1318. dof_Measurement = measurement_runtime::DOF;
  1319. dof_Measurement_noise = dyn_share.R.rows();
  1320. vectorized_state dx, dx_new;
  1321. x_.boxminus(dx, x_propagated);
  1322. dx_new = dx;
  1323. if(! (dyn_share.valid))
  1324. {
  1325. continue;
  1326. }
  1327. P_ = P_propagated;
  1328. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1329. MTK::vect<3, scalar_type> seg_SO3;
  1330. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1331. int idx = (*it).first;
  1332. int dim = (*it).second;
  1333. for(int i = 0; i < 3; i++){
  1334. seg_SO3(i) = dx(idx+i);
  1335. }
  1336. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1337. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx_new.template block<3, 1>(idx, 0);
  1338. for(int i = 0; i < n; i++){
  1339. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1340. }
  1341. for(int i = 0; i < n; i++){
  1342. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1343. }
  1344. }
  1345. Matrix<scalar_type, 2, 2> res_temp_S2;
  1346. MTK::vect<2, scalar_type> seg_S2;
  1347. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1348. int idx = (*it).first;
  1349. int dim = (*it).second;
  1350. for(int i = 0; i < 2; i++){
  1351. seg_S2(i) = dx(idx + i);
  1352. }
  1353. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1354. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1355. x_.S2_Nx_yy(Nx, idx);
  1356. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1357. res_temp_S2 = Nx * Mx;
  1358. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx_new.template block<2, 1>(idx, 0);
  1359. for(int i = 0; i < n; i++){
  1360. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1361. }
  1362. for(int i = 0; i < n; i++){
  1363. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1364. }
  1365. }
  1366. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_;
  1367. if(n > dof_Measurement)
  1368. {
  1369. #ifdef USE_sparse
  1370. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_temp = h_x * P_ * h_x.transpose();
  1371. spMt R_temp = h_v * R_ * h_v.transpose();
  1372. K_temp += R_temp;
  1373. K_ = P_ * h_x.transpose() * K_temp.inverse();
  1374. #else
  1375. K_= P_ * h_x.transpose() * (h_x * P_ * h_x.transpose() + h_v * R * h_v.transpose()).inverse();
  1376. #endif
  1377. }
  1378. else
  1379. {
  1380. #ifdef USE_sparse
  1381. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> b = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Identity(dof_Measurement_noise, dof_Measurement_noise);
  1382. Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  1383. solver.compute(R_);
  1384. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in_temp = solver.solve(b);
  1385. spMt R_in =R_in_temp.sparseView();
  1386. spMt K_temp = h_x.transpose() * R_in * h_x;
  1387. cov P_temp = P_.inverse();
  1388. P_temp += K_temp;
  1389. K_ = P_temp.inverse() * h_x.transpose() * R_in;
  1390. #else
  1391. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in = (h_v*R*h_v.transpose()).inverse();
  1392. K_ = (h_x.transpose() * R_in * h_x + P_.inverse()).inverse() * h_x.transpose() * R_in;
  1393. #endif
  1394. }
  1395. cov K_x = K_ * h_x;
  1396. Eigen::Matrix<scalar_type, measurement_runtime::DOF, 1> innovation;
  1397. z.boxminus(innovation, h_);
  1398. Matrix<scalar_type, n, 1> dx_ = K_ * innovation + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new;
  1399. state x_before = x_;
  1400. x_.boxplus(dx_);
  1401. dyn_share.converge = true;
  1402. for(int i = 0; i < n ; i++)
  1403. {
  1404. if(std::fabs(dx_[i]) > limit[i])
  1405. {
  1406. dyn_share.converge = false;
  1407. break;
  1408. }
  1409. }
  1410. if(dyn_share.converge) t++;
  1411. if(t > 1 || i == maximum_iter - 1)
  1412. {
  1413. L_ = P_;
  1414. std::cout << "iteration time:" << t << "," << i << std::endl;
  1415. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1416. MTK::vect<3, scalar_type> seg_SO3;
  1417. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1418. int idx = (*it).first;
  1419. for(int i = 0; i < 3; i++){
  1420. seg_SO3(i) = dx_(i + idx);
  1421. }
  1422. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1423. for(int i = 0; i < int(n); i++){
  1424. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1425. }
  1426. if(n > dof_Measurement)
  1427. {
  1428. for(int i = 0; i < dof_Measurement; i++){
  1429. K_. template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  1430. }
  1431. }
  1432. else
  1433. {
  1434. for(int i = 0; i < n; i++){
  1435. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  1436. }
  1437. }
  1438. for(int i = 0; i < n; i++){
  1439. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1440. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1441. }
  1442. }
  1443. Matrix<scalar_type, 2, 2> res_temp_S2;
  1444. MTK::vect<2, scalar_type> seg_S2;
  1445. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1446. int idx = (*it).first;
  1447. for(int i = 0; i < 2; i++){
  1448. seg_S2(i) = dx_(i + idx);
  1449. }
  1450. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1451. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1452. x_.S2_Nx_yy(Nx, idx);
  1453. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1454. res_temp_S2 = Nx * Mx;
  1455. for(int i = 0; i < n; i++){
  1456. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1457. }
  1458. if(n > dof_Measurement)
  1459. {
  1460. for(int i = 0; i < dof_Measurement; i++){
  1461. K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  1462. }
  1463. }
  1464. else
  1465. {
  1466. for(int i = 0; i < n; i++){
  1467. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  1468. }
  1469. }
  1470. for(int i = 0; i < n; i++){
  1471. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1472. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1473. }
  1474. }
  1475. if(n > dof_Measurement)
  1476. {
  1477. P_ = L_ - K_*h_x * P_;
  1478. }
  1479. else
  1480. {
  1481. P_ = L_ - K_x * P_;
  1482. }
  1483. return;
  1484. }
  1485. }
  1486. }
  1487. //iterated error state EKF update modified for one specific system.
  1488. bool update_iterated_dyn_share_modified(double R, double &solve_time) {
  1489. dyn_share_datastruct<scalar_type> dyn_share;
  1490. dyn_share.valid = true;
  1491. dyn_share.converge = true;
  1492. int t = 0;
  1493. //获取上一次的状态和协方差矩阵
  1494. state x_propagated = x_;
  1495. cov P_propagated = P_;
  1496. int dof_Measurement;
  1497. Matrix<scalar_type, n, 1> K_h;
  1498. Matrix<scalar_type, n, n> K_x;
  1499. vectorized_state dx_new = vectorized_state::Zero();
  1500. for(int i=-1; i<maximum_iter; i++)
  1501. {
  1502. dyn_share.valid = true;
  1503. h_dyn_share(x_, dyn_share); //计算残差与雅可比
  1504. if(! dyn_share.valid)
  1505. {
  1506. continue;
  1507. }
  1508. //Matrix<scalar_type, Eigen::Dynamic, 1> h = h_dyn_share(x_, dyn_share);
  1509. #ifdef USE_sparse
  1510. spMt h_x_ = dyn_share.h_x.sparseView();
  1511. #else
  1512. Eigen::Matrix<scalar_type, Eigen::Dynamic, 12> h_x_ = dyn_share.h_x; // partial differention matrices
  1513. #endif
  1514. double solve_start = omp_get_wtime();
  1515. dof_Measurement = h_x_.rows(); // 观测方程个数m
  1516. vectorized_state dx;
  1517. x_.boxminus(dx, x_propagated); //获取误差dx
  1518. dx_new = dx;
  1519. // 迭代过程不更新协方差矩阵,迭代后更新
  1520. P_ = P_propagated;
  1521. //更新协方差矩阵的传播,更新dx_new
  1522. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1523. MTK::vect<3, scalar_type> seg_SO3;
  1524. for (std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1525. int idx = (*it).first;
  1526. int dim = (*it).second;
  1527. for(int i = 0; i < 3; i++){
  1528. seg_SO3(i) = dx(idx+i);
  1529. }
  1530. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1531. dx_new.template block<3, 1>(idx, 0) = res_temp_SO3 * dx_new.template block<3, 1>(idx, 0);
  1532. for(int i = 0; i < n; i++){
  1533. P_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1534. }
  1535. for(int i = 0; i < n; i++){
  1536. P_. template block<1, 3>(i, idx) =(P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1537. }
  1538. }
  1539. Matrix<scalar_type, 2, 2> res_temp_S2;
  1540. MTK::vect<2, scalar_type> seg_S2;
  1541. for (std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1542. int idx = (*it).first;
  1543. int dim = (*it).second;
  1544. for(int i = 0; i < 2; i++){
  1545. seg_S2(i) = dx(idx + i);
  1546. }
  1547. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1548. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1549. x_.S2_Nx_yy(Nx, idx);
  1550. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1551. res_temp_S2 = Nx * Mx;
  1552. dx_new.template block<2, 1>(idx, 0) = res_temp_S2 * dx_new.template block<2, 1>(idx, 0);
  1553. for(int i = 0; i < n; i++){
  1554. P_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1555. }
  1556. for(int i = 0; i < n; i++){
  1557. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1558. }
  1559. }
  1560. // 如果状态量维度大于观测方程 n > m,不满秩
  1561. if(n > dof_Measurement)
  1562. {
  1563. //#ifdef USE_sparse
  1564. //Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_temp = h_x * P_ * h_x.transpose();
  1565. //spMt R_temp = h_v * R_ * h_v.transpose();
  1566. //K_temp += R_temp;
  1567. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_x_cur = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Zero(dof_Measurement, n);
  1568. h_x_cur.topLeftCorner(dof_Measurement, 12) = h_x_;
  1569. /*
  1570. h_x_cur.col(0) = h_x_.col(0);
  1571. h_x_cur.col(1) = h_x_.col(1);
  1572. h_x_cur.col(2) = h_x_.col(2);
  1573. h_x_cur.col(3) = h_x_.col(3);
  1574. h_x_cur.col(4) = h_x_.col(4);
  1575. h_x_cur.col(5) = h_x_.col(5);
  1576. h_x_cur.col(6) = h_x_.col(6);
  1577. h_x_cur.col(7) = h_x_.col(7);
  1578. h_x_cur.col(8) = h_x_.col(8);
  1579. h_x_cur.col(9) = h_x_.col(9);
  1580. h_x_cur.col(10) = h_x_.col(10);
  1581. h_x_cur.col(11) = h_x_.col(11);
  1582. */
  1583. // 重新计算增益矩阵K
  1584. Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> K_ = P_ * h_x_cur.transpose() * (h_x_cur * P_ * h_x_cur.transpose()/R + Eigen::Matrix<double, Dynamic, Dynamic>::Identity(dof_Measurement, dof_Measurement)).inverse()/R;
  1585. K_h = K_ * dyn_share.h; // K × h
  1586. K_x = K_ * h_x_cur; // K * H
  1587. //#else
  1588. // K_= P_ * h_x.transpose() * (h_x * P_ * h_x.transpose() + h_v * R * h_v.transpose()).inverse();
  1589. //#endif
  1590. }
  1591. else
  1592. {
  1593. #ifdef USE_sparse
  1594. //Eigen::Matrix<scalar_type, n, n> b = Eigen::Matrix<scalar_type, n, n>::Identity();
  1595. //Eigen::SparseQR<Eigen::SparseMatrix<scalar_type>, Eigen::COLAMDOrdering<int>> solver;
  1596. spMt A = h_x_.transpose() * h_x_;
  1597. cov P_temp = (P_/R).inverse();
  1598. P_temp. template block<12, 12>(0, 0) += A;
  1599. P_temp = P_temp.inverse();
  1600. /*
  1601. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_x_cur = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Zero(dof_Measurement, n);
  1602. h_x_cur.col(0) = h_x_.col(0);
  1603. h_x_cur.col(1) = h_x_.col(1);
  1604. h_x_cur.col(2) = h_x_.col(2);
  1605. h_x_cur.col(3) = h_x_.col(3);
  1606. h_x_cur.col(4) = h_x_.col(4);
  1607. h_x_cur.col(5) = h_x_.col(5);
  1608. h_x_cur.col(6) = h_x_.col(6);
  1609. h_x_cur.col(7) = h_x_.col(7);
  1610. h_x_cur.col(8) = h_x_.col(8);
  1611. h_x_cur.col(9) = h_x_.col(9);
  1612. h_x_cur.col(10) = h_x_.col(10);
  1613. h_x_cur.col(11) = h_x_.col(11);
  1614. */
  1615. K_ = P_temp. template block<n, 12>(0, 0) * h_x_.transpose();
  1616. K_x = cov::Zero();
  1617. K_x. template block<n, 12>(0, 0) = P_inv. template block<n, 12>(0, 0) * HTH;
  1618. /*
  1619. solver.compute(R_);
  1620. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> R_in_temp = solver.solve(b);
  1621. spMt R_in =R_in_temp.sparseView();
  1622. spMt K_temp = h_x.transpose() * R_in * h_x;
  1623. cov P_temp = P_.inverse();
  1624. P_temp += K_temp;
  1625. K_ = P_temp.inverse() * h_x.transpose() * R_in;
  1626. */
  1627. #else
  1628. cov P_temp = (P_/R).inverse(); //P^-1
  1629. //Eigen::Matrix<scalar_type, 12, Eigen::Dynamic> h_T = h_x_.transpose();
  1630. Eigen::Matrix<scalar_type, 12, 12> HTH = h_x_.transpose() * h_x_;
  1631. P_temp. template block<12, 12>(0, 0) += HTH;
  1632. /*
  1633. Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic> h_x_cur = Eigen::Matrix<scalar_type, Eigen::Dynamic, Eigen::Dynamic>::Zero(dof_Measurement, n);
  1634. //std::cout << "line 1767" << std::endl;
  1635. h_x_cur.col(0) = h_x_.col(0);
  1636. h_x_cur.col(1) = h_x_.col(1);
  1637. h_x_cur.col(2) = h_x_.col(2);
  1638. h_x_cur.col(3) = h_x_.col(3);
  1639. h_x_cur.col(4) = h_x_.col(4);
  1640. h_x_cur.col(5) = h_x_.col(5);
  1641. h_x_cur.col(6) = h_x_.col(6);
  1642. h_x_cur.col(7) = h_x_.col(7);
  1643. h_x_cur.col(8) = h_x_.col(8);
  1644. h_x_cur.col(9) = h_x_.col(9);
  1645. h_x_cur.col(10) = h_x_.col(10);
  1646. h_x_cur.col(11) = h_x_.col(11);
  1647. */
  1648. cov P_inv = P_temp.inverse(); // (H_T_H + P^-1)^-1
  1649. //std::cout << "line 1781" << std::endl;
  1650. K_h = P_inv. template block<n, 12>(0, 0) * h_x_.transpose() * dyn_share.h; // (H_T_H + P^-1)^-1 * H^T * h(残差) = K * h
  1651. //std::cout << "line 1780" << std::endl;
  1652. //cov HTH_cur = cov::Zero();
  1653. //HTH_cur. template block<12, 12>(0, 0) = HTH;
  1654. K_x.setZero(); // = cov::Zero();
  1655. K_x. template block<n, 12>(0, 0) = P_inv. template block<n, 12>(0, 0) * HTH; //(H_T_H + P^-1)^-1 * H_T_H = KH
  1656. //K_= (h_x_.transpose() * h_x_ + (P_/R).inverse()).inverse()*h_x_.transpose();
  1657. #endif
  1658. }
  1659. //K_x = K_ * h_x_;
  1660. Matrix<scalar_type, n, 1> dx_ = K_h + (K_x - Matrix<scalar_type, n, n>::Identity()) * dx_new; //误差增量后验 K*h + (K*H - I) dx
  1661. state x_before = x_;
  1662. x_.boxplus(dx_); //根据计算得到的误差增量后验,更新状态量
  1663. dyn_share.converge = true;
  1664. for(int i = 0; i < n ; i++)
  1665. {
  1666. if(std::fabs(dx_[i]) > limit[i])
  1667. {
  1668. dyn_share.converge = false;
  1669. break;
  1670. }
  1671. }
  1672. if(dyn_share.converge) t++;
  1673. if(!t && i == maximum_iter - 2)
  1674. {
  1675. dyn_share.converge = true;
  1676. }
  1677. // 最后一次迭代更新协方差矩阵
  1678. if(t > 1 || i == maximum_iter - 1)
  1679. {
  1680. L_ = P_;
  1681. //std::cout << "iteration time" << t << "," << i << std::endl;
  1682. Matrix<scalar_type, 3, 3> res_temp_SO3;
  1683. MTK::vect<3, scalar_type> seg_SO3;
  1684. for(typename std::vector<std::pair<int, int> >::iterator it = x_.SO3_state.begin(); it != x_.SO3_state.end(); it++) {
  1685. int idx = (*it).first;
  1686. for(int i = 0; i < 3; i++){
  1687. seg_SO3(i) = dx_(i + idx);
  1688. }
  1689. res_temp_SO3 = MTK::A_matrix(seg_SO3).transpose();
  1690. for(int i = 0; i < n; i++){
  1691. L_. template block<3, 1>(idx, i) = res_temp_SO3 * (P_. template block<3, 1>(idx, i));
  1692. }
  1693. // if(n > dof_Measurement)
  1694. // {
  1695. // for(int i = 0; i < dof_Measurement; i++){
  1696. // K_.template block<3, 1>(idx, i) = res_temp_SO3 * (K_. template block<3, 1>(idx, i));
  1697. // }
  1698. // }
  1699. // else
  1700. // {
  1701. for(int i = 0; i < 12; i++){
  1702. K_x. template block<3, 1>(idx, i) = res_temp_SO3 * (K_x. template block<3, 1>(idx, i));
  1703. }
  1704. //}
  1705. for(int i = 0; i < n; i++){
  1706. L_. template block<1, 3>(i, idx) = (L_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1707. P_. template block<1, 3>(i, idx) = (P_. template block<1, 3>(i, idx)) * res_temp_SO3.transpose();
  1708. }
  1709. }
  1710. Matrix<scalar_type, 2, 2> res_temp_S2;
  1711. MTK::vect<2, scalar_type> seg_S2;
  1712. for(typename std::vector<std::pair<int, int> >::iterator it = x_.S2_state.begin(); it != x_.S2_state.end(); it++) {
  1713. int idx = (*it).first;
  1714. for(int i = 0; i < 2; i++){
  1715. seg_S2(i) = dx_(i + idx);
  1716. }
  1717. Eigen::Matrix<scalar_type, 2, 3> Nx;
  1718. Eigen::Matrix<scalar_type, 3, 2> Mx;
  1719. x_.S2_Nx_yy(Nx, idx);
  1720. x_propagated.S2_Mx(Mx, seg_S2, idx);
  1721. res_temp_S2 = Nx * Mx;
  1722. for(int i = 0; i < n; i++){
  1723. L_. template block<2, 1>(idx, i) = res_temp_S2 * (P_. template block<2, 1>(idx, i));
  1724. }
  1725. // if(n > dof_Measurement)
  1726. // {
  1727. // for(int i = 0; i < dof_Measurement; i++){
  1728. // K_. template block<2, 1>(idx, i) = res_temp_S2 * (K_. template block<2, 1>(idx, i));
  1729. // }
  1730. // }
  1731. // else
  1732. // {
  1733. for(int i = 0; i < 12; i++){
  1734. K_x. template block<2, 1>(idx, i) = res_temp_S2 * (K_x. template block<2, 1>(idx, i));
  1735. }
  1736. //}
  1737. for(int i = 0; i < n; i++){
  1738. L_. template block<1, 2>(i, idx) = (L_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1739. P_. template block<1, 2>(i, idx) = (P_. template block<1, 2>(i, idx)) * res_temp_S2.transpose();
  1740. }
  1741. }
  1742. P_ = L_ - K_x.template block<n, 12>(0, 0) * P_.template block<12, n>(0, 0);
  1743. solve_time += omp_get_wtime() - solve_start;
  1744. return dyn_share.converge;
  1745. }
  1746. solve_time += omp_get_wtime() - solve_start;
  1747. }
  1748. return dyn_share.converge;
  1749. }
  1750. void change_x(state &input_state)
  1751. {
  1752. x_ = input_state;
  1753. if((!x_.vect_state.size())&&(!x_.SO3_state.size())&&(!x_.S2_state.size()))
  1754. {
  1755. x_.build_S2_state();
  1756. x_.build_SO3_state();
  1757. x_.build_vect_state();
  1758. }
  1759. }
  1760. void change_P(cov &input_cov)
  1761. {
  1762. P_ = input_cov;
  1763. }
  1764. const state& get_x() const {
  1765. return x_;
  1766. }
  1767. const cov& get_P() const {
  1768. return P_;
  1769. }
  1770. private:
  1771. state x_;
  1772. measurement m_;
  1773. cov P_;
  1774. spMt l_;
  1775. spMt f_x_1;
  1776. spMt f_x_2;
  1777. cov F_x1 = cov::Identity();
  1778. cov F_x2 = cov::Identity();
  1779. cov L_ = cov::Identity();
  1780. processModel *f;
  1781. processMatrix1 *f_x;
  1782. processMatrix2 *f_w;
  1783. measurementModel *h;
  1784. measurementMatrix1 *h_x;
  1785. measurementMatrix2 *h_v;
  1786. measurementModel_dyn *h_dyn;
  1787. measurementMatrix1_dyn *h_x_dyn;
  1788. measurementMatrix2_dyn *h_v_dyn;
  1789. measurementModel_share *h_share;
  1790. measurementModel_dyn_share *h_dyn_share;
  1791. int maximum_iter = 0;
  1792. scalar_type limit[n];
  1793. template <typename T>
  1794. T check_safe_update( T _temp_vec )
  1795. {
  1796. T temp_vec = _temp_vec;
  1797. if ( std::isnan( temp_vec(0, 0) ) )
  1798. {
  1799. temp_vec.setZero();
  1800. return temp_vec;
  1801. }
  1802. double angular_dis = temp_vec.block( 0, 0, 3, 1 ).norm() * 57.3;
  1803. double pos_dis = temp_vec.block( 3, 0, 3, 1 ).norm();
  1804. if ( angular_dis >= 20 || pos_dis > 1 )
  1805. {
  1806. printf( "Angular dis = %.2f, pos dis = %.2f\r\n", angular_dis, pos_dis );
  1807. temp_vec.setZero();
  1808. }
  1809. return temp_vec;
  1810. }
  1811. public:
  1812. EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  1813. };
  1814. } // namespace esekfom
  1815. #endif // ESEKFOM_EKF_HPP