esekfom.hpp 67 KB

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