yafl.c 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883
  1. /*******************************************************************************
  2. Copyright 2021 anonimous <shkolnick-kun@gmail.com> and contributors.
  3. Licensed under the Apache License, Version 2.0 (the "License");
  4. you may not use this file except in compliance with the License.
  5. You may obtain a copy of the License at
  6. http://www.apache.org/licenses/LICENSE-2.0
  7. Unless required by applicable law or agreed to in writing,
  8. software distributed under the License is distributed on an "AS IS" BASIS,
  9. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  10. See the License for the specific language governing permissions
  11. and limitations under the License.
  12. ******************************************************************************/
  13. #include <string.h>
  14. #include "yafl.h"
  15. #define _FX (self->f)
  16. #define _HX (self->h)
  17. #define _ZRF (self->zrf)
  18. #define _X (self->x)
  19. #define _Y (self->y)
  20. #define _UP (self->Up)
  21. #define _DP (self->Dp)
  22. #define _UQ (self->Uq)
  23. #define _DQ (self->Dq)
  24. #define _UR (self->Ur)
  25. #define _DR (self->Dr)
  26. #define _NX (self->Nx)
  27. #define _NZ (self->Nz)
  28. /*=============================================================================
  29. Base UDEKF
  30. =============================================================================*/
  31. #define _JFX (((yaflEKFBaseSt *)self)->jf)
  32. #define _JHX (((yaflEKFBaseSt *)self)->jh)
  33. #define _HY (((yaflEKFBaseSt *)self)->H)
  34. #define _W (((yaflEKFBaseSt *)self)->W)
  35. #define _D (((yaflEKFBaseSt *)self)->D)
  36. yaflStatusEn yafl_ekf_base_predict(yaflKalmanBaseSt * self)
  37. {
  38. yaflStatusEn status = YAFL_ST_OK;
  39. yaflInt i;
  40. yaflInt nx2;
  41. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  42. YAFL_CHECK(_UP, YAFL_ST_INV_ARG_1);
  43. YAFL_CHECK(_DP, YAFL_ST_INV_ARG_1);
  44. YAFL_CHECK(_UQ, YAFL_ST_INV_ARG_1);
  45. YAFL_CHECK(_DQ, YAFL_ST_INV_ARG_1);
  46. YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);
  47. YAFL_CHECK(_W, YAFL_ST_INV_ARG_1);
  48. YAFL_CHECK(_D, YAFL_ST_INV_ARG_1);
  49. nx2 = _NX * 2;
  50. /*Default f(x) = x*/
  51. if (0 == _FX)
  52. {
  53. YAFL_CHECK(0 == _JFX, YAFL_ST_INV_ARG_1);
  54. for (i = 0; i < _NX; i++)
  55. {
  56. yaflInt j;
  57. yaflInt nci;
  58. nci = nx2 * i;
  59. for (j = 0; j < _NX; j++)
  60. {
  61. _W[nci + j] = (i != j) ? 0.0 : 1.0;
  62. }
  63. }
  64. }
  65. else
  66. {
  67. //yaflFloat * x;
  68. /*Must have some Jacobian function*/
  69. YAFL_CHECK(_JFX, YAFL_ST_INV_ARG_1);
  70. //x = self->x;
  71. YAFL_TRY(status, _FX(self, _X, _X)); /* x = f(x_old, ...) */
  72. YAFL_TRY(status, _JFX(self, _W, _X)); /* Place F(x, ...)=df/dx to W */
  73. }
  74. /* Now W = (F|***) */
  75. YAFL_TRY(status, \
  76. YAFL_MATH_BSET_BU(nx2, 0, _NX, _W, _NX, _NX, nx2, 0, 0, _W, _UP));
  77. /* Now W = (F|FUp) */
  78. YAFL_TRY(status, yafl_math_bset_u(nx2, _W, _NX, _UQ));
  79. /* Now W = (Uq|FUp) */
  80. /* D = concatenate([Dq, Dp]) */
  81. i = _NX*sizeof(yaflFloat);
  82. memcpy((void *) _D, (void *)_DQ, i);
  83. memcpy((void *)(_D + _NX), (void *)_DP, i);
  84. /* Up, Dp = MWGSU(w, d)*/
  85. YAFL_TRY(status, yafl_math_mwgsu(_NX, nx2, _UP, _DP, _W, _D));
  86. return status;
  87. }
  88. /*---------------------------------------------------------------------------*/
  89. yaflStatusEn yafl_ekf_base_update(yaflKalmanBaseSt * self, yaflFloat * z, yaflKalmanScalarUpdateP scalar_update)
  90. {
  91. yaflStatusEn status = YAFL_ST_OK;
  92. yaflInt j;
  93. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  94. YAFL_CHECK(_HX, YAFL_ST_INV_ARG_1);
  95. YAFL_CHECK(_X, YAFL_ST_INV_ARG_1);
  96. YAFL_CHECK(_Y, YAFL_ST_INV_ARG_1);
  97. YAFL_CHECK(_UR, YAFL_ST_INV_ARG_1);
  98. YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1);
  99. YAFL_CHECK(_NZ > 0, YAFL_ST_INV_ARG_1);
  100. YAFL_CHECK(_JHX, YAFL_ST_INV_ARG_1);
  101. YAFL_CHECK(_HY, YAFL_ST_INV_ARG_1);
  102. YAFL_CHECK(z, YAFL_ST_INV_ARG_2);
  103. YAFL_CHECK(scalar_update, YAFL_ST_INV_ARG_3);
  104. YAFL_TRY(status, _HX(self, _Y, _X)); /* self.y = h(x,...) */
  105. YAFL_TRY(status, _JHX(self, _HY, _X)); /* self.H = jh(x,...) */
  106. if (0 == _ZRF)
  107. {
  108. /*Default residual*/
  109. for (j = 0; j < _NZ; j++)
  110. {
  111. _Y[j] = z[j] - _Y[j];
  112. }
  113. }
  114. else
  115. {
  116. /*zrf must be aware of self internal structure*/
  117. YAFL_TRY(status, _ZRF(self, _Y, z, _Y)); /* self.y = zrf(z, h(x,...)) */
  118. }
  119. /* Decorrelate measurement noise */
  120. YAFL_TRY(status, yafl_math_ruv(_NZ, _Y, _UR));
  121. YAFL_TRY(status, yafl_math_rum(_NZ, _NX, _HY, _UR));
  122. /* Do scalar updates */
  123. for (j = 0; j < _NZ; j++)
  124. {
  125. YAFL_TRY(status, scalar_update(self, j));
  126. }
  127. return status;
  128. }
  129. /*=============================================================================
  130. Bierman filter
  131. =============================================================================*/
  132. static inline yaflStatusEn \
  133. _bierman_update_body(yaflInt nx, yaflFloat * x, yaflFloat * u, \
  134. yaflFloat * d, yaflFloat * f, yaflFloat * v, \
  135. yaflFloat r, yaflFloat nu, yaflFloat ac, \
  136. yaflFloat gdot)
  137. {
  138. yaflStatusEn status = YAFL_ST_OK;
  139. yaflInt j;
  140. yaflInt k;
  141. yaflInt nxk;
  142. YAFL_CHECK(x, YAFL_ST_INV_ARG_2);
  143. YAFL_CHECK(u, YAFL_ST_INV_ARG_3);
  144. YAFL_CHECK(d, YAFL_ST_INV_ARG_4);
  145. YAFL_CHECK(f, YAFL_ST_INV_ARG_5);
  146. YAFL_CHECK(v, YAFL_ST_INV_ARG_6);
  147. for (k = 0, nxk = 0; k < nx; nxk += k++)
  148. {
  149. yaflFloat a;
  150. yaflFloat fk;
  151. yaflFloat vk;
  152. fk = gdot * f[k];
  153. /*Correct v in place*/
  154. vk = ac * v[k];
  155. v[k] = vk;
  156. a = r + fk * vk;
  157. /*Correct d in place*/
  158. d[k] *= ac * r / a;
  159. #define p fk /*No need for separate p variable*/
  160. p = - fk / r;
  161. for (j = 0; j < k; j++)
  162. {
  163. yaflFloat ujk;
  164. yaflFloat vj;
  165. ujk = u[j + nxk];
  166. vj = v[j];
  167. u[j + nxk] = ujk + p * vj;
  168. v[j] = vj + ujk * vk;
  169. }
  170. #undef p /*Don't need p any more...*/
  171. r = a;
  172. }
  173. /*
  174. Now we must do:
  175. x += K * nu
  176. Since:
  177. r == a
  178. then we have:
  179. K == v / a == v / r
  180. and so:
  181. K * nu == (v / r) * nu == v / r * nu == v * (nu / r)
  182. Finally we get:
  183. x += v * (nu / r)
  184. */
  185. YAFL_TRY(status, yafl_math_add_vxn(nx, x, v, nu / r));
  186. return status;
  187. }
  188. /*---------------------------------------------------------------------------*/
  189. #define _SCALAR_UPDATE_ARGS_CHECKS() \
  190. do { \
  191. YAFL_CHECK(self->Nz > i, YAFL_ST_INV_ARG_2); \
  192. YAFL_CHECK(self, YAFL_ST_INV_ARG_1); \
  193. } while (0)
  194. /*---------------------------------------------------------------------------*/
  195. #define _EKF_BIERMAN_SELF_INTERNALS_CHECKS() \
  196. do { \
  197. YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1); \
  198. YAFL_CHECK(_UP, YAFL_ST_INV_ARG_1); \
  199. YAFL_CHECK(_DP, YAFL_ST_INV_ARG_1); \
  200. YAFL_CHECK(_HY, YAFL_ST_INV_ARG_1); \
  201. YAFL_CHECK(_Y, YAFL_ST_INV_ARG_1); \
  202. YAFL_CHECK(_DR, YAFL_ST_INV_ARG_1); \
  203. YAFL_CHECK(_D, YAFL_ST_INV_ARG_1); \
  204. } while (0)
  205. /*---------------------------------------------------------------------------*/
  206. yaflStatusEn yafl_ekf_bierman_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  207. {
  208. yaflStatusEn status = YAFL_ST_OK;
  209. yaflFloat * h;
  210. _SCALAR_UPDATE_ARGS_CHECKS();
  211. _EKF_BIERMAN_SELF_INTERNALS_CHECKS();
  212. h = _HY + _NX * i;
  213. /* f = h.dot(Up) */
  214. # define f _D
  215. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  216. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  217. #define v h /*Don't need h any more, use it to store v*/
  218. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  219. YAFL_TRY(status, \
  220. _bierman_update_body(_NX, _X, _UP, _DP, f, v, _DR[i], _Y[i], \
  221. 1.0, 1.0));
  222. # undef v /*Don't nee v any more*/
  223. # undef f
  224. return status;
  225. }
  226. /*=============================================================================
  227. Joseph filter
  228. =============================================================================*/
  229. static inline yaflStatusEn \
  230. _joseph_update_body(yaflInt nx, yaflFloat * x, yaflFloat * u, \
  231. yaflFloat * d, yaflFloat * f, yaflFloat * v, \
  232. yaflFloat * k, yaflFloat * w, yaflFloat nu, \
  233. yaflFloat a2, yaflFloat s, yaflFloat ac, \
  234. yaflFloat gdot)
  235. {
  236. yaflStatusEn status = YAFL_ST_OK;
  237. yaflInt nx1;
  238. YAFL_CHECK(x, YAFL_ST_INV_ARG_2);
  239. YAFL_CHECK(u, YAFL_ST_INV_ARG_3);
  240. YAFL_CHECK(d, YAFL_ST_INV_ARG_4);
  241. YAFL_CHECK(f, YAFL_ST_INV_ARG_5);
  242. YAFL_CHECK(v, YAFL_ST_INV_ARG_6);
  243. YAFL_CHECK(k, YAFL_ST_INV_ARG_7);
  244. YAFL_CHECK(w, YAFL_ST_INV_ARG_8);
  245. YAFL_CHECK(s > 0, YAFL_ST_INV_ARG_11);
  246. nx1 = nx + 1;
  247. /* k = Up.dot(v * ac / s) = Up.dot(v) * (ac / s) */
  248. /*May be used in place*/
  249. YAFL_TRY(status, yafl_math_set_vxn(nx, v, v, ac / s));
  250. YAFL_TRY(status, yafl_math_set_uv(nx, k, u, v));
  251. # define D v
  252. /*Set W and D*/
  253. /*May be used in place*/
  254. YAFL_TRY(status, yafl_math_set_vxn(nx, f, f, gdot));
  255. /*How about yafl_math_bset_vvtxn ?*/
  256. YAFL_TRY(status, yafl_math_bset_vvt(nx1, w, nx, k, f));
  257. YAFL_TRY(status, yafl_math_bsub_u(nx1, w, nx, u));
  258. /* Now w is (gdot*kf - Up|***) */
  259. YAFL_TRY(status, YAFL_MATH_BSET_V(nx1, 0, nx, w, nx, k));
  260. /* Now w is (gdot*kf - Up|k) */
  261. /* D = concatenate([ac * Dp, np.array([gdot * alpha**2])]) */
  262. YAFL_TRY(status, yafl_math_set_vxn(nx, D, d, ac));
  263. D[nx] = gdot * a2;
  264. /* Up, Dp = MWGSU(W, D)*/
  265. YAFL_TRY(status, yafl_math_mwgsu(nx, nx1, u, d, w, D));
  266. /* x += k * nu */
  267. YAFL_TRY(status, yafl_math_add_vxn(nx, x, k, nu));
  268. # undef D /*Don't nee D any more*/
  269. return status;
  270. }
  271. /*---------------------------------------------------------------------------*/
  272. #define _EKF_JOSEPH_SELF_INTERNALS_CHECKS() \
  273. do { \
  274. YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1); \
  275. YAFL_CHECK(_UP, YAFL_ST_INV_ARG_1); \
  276. YAFL_CHECK(_DP, YAFL_ST_INV_ARG_1); \
  277. YAFL_CHECK(_HY, YAFL_ST_INV_ARG_1); \
  278. YAFL_CHECK(_Y, YAFL_ST_INV_ARG_1); \
  279. YAFL_CHECK(_DR, YAFL_ST_INV_ARG_1); \
  280. YAFL_CHECK(_W, YAFL_ST_INV_ARG_1); \
  281. YAFL_CHECK(_D, YAFL_ST_INV_ARG_1); \
  282. } while (0)
  283. /*---------------------------------------------------------------------------*/
  284. yaflStatusEn yafl_ekf_joseph_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  285. {
  286. yaflStatusEn status = YAFL_ST_OK;
  287. yaflFloat s = 0.0;
  288. yaflFloat * f;
  289. yaflFloat * h;
  290. _SCALAR_UPDATE_ARGS_CHECKS();
  291. _EKF_JOSEPH_SELF_INTERNALS_CHECKS();
  292. # define v _D
  293. f = v + _NX;
  294. h = _HY + _NX * i;
  295. /* f = h.dot(Up) */
  296. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  297. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  298. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  299. # define r _DR[i]
  300. /* s = r + f.dot(v)*/
  301. YAFL_TRY(status, yafl_math_vtv(_NX, &s, f, v));
  302. s += r;
  303. /*K = Up.dot(v/s) = Up.dot(v)/s*/
  304. # define K h /*Don't need h any more, use it to store K*/
  305. YAFL_TRY(status, \
  306. _joseph_update_body(_NX, _X, _UP, _DP, f, v, K, _W, _Y[i], r, \
  307. s, 1.0, 1.0));
  308. # undef K /*Don't nee K any more*/
  309. # undef r
  310. # undef v
  311. return status;
  312. }
  313. /*=============================================================================
  314. Adaptive Bierman filter
  315. =============================================================================*/
  316. static inline yaflStatusEn \
  317. _adaptive_correction(yaflInt nx, yaflFloat * res_ac, yaflFloat * res_s, \
  318. yaflFloat * f, yaflFloat * v, yaflFloat r, \
  319. yaflFloat nu, yaflFloat gdot, yaflFloat chi2)
  320. {
  321. yaflStatusEn status = YAFL_ST_OK;
  322. yaflFloat c = 0.0;
  323. yaflFloat ac;
  324. yaflFloat s;
  325. YAFL_CHECK(res_ac, YAFL_ST_INV_ARG_1);
  326. YAFL_CHECK(f, YAFL_ST_INV_ARG_3);
  327. YAFL_CHECK(v, YAFL_ST_INV_ARG_4);
  328. YAFL_CHECK(chi2 > 0, YAFL_ST_INV_ARG_8);
  329. /* s = alpha**2 + gdot * f.dot(v)*/
  330. YAFL_TRY(status, yafl_math_vtv(nx, &c, f, v));
  331. c *= gdot;
  332. s = r + c;
  333. /* Divergence test */
  334. ac = gdot * (nu * (nu / chi2)) - s;
  335. if (ac > 0.0)
  336. {
  337. /*Adaptive correction factor*/
  338. ac = ac / c + 1.0;
  339. /*Corrected s*/
  340. s = ac * c + r;
  341. status |= YAFL_ST_MSK_ANOMALY; /*Anomaly detected!*/
  342. }
  343. else
  344. {
  345. ac = 1.0;
  346. }
  347. *res_ac = ac;
  348. if (res_s)
  349. {
  350. *res_s = s;
  351. }
  352. return status;
  353. }
  354. /*---------------------------------------------------------------------------*/
  355. yaflStatusEn yafl_ekf_adaptive_bierman_update_scalar(yaflKalmanBaseSt * self, \
  356. yaflInt i)
  357. {
  358. yaflStatusEn status = YAFL_ST_OK;
  359. yaflFloat ac = 1.0;
  360. yaflFloat nu = 0.0;
  361. yaflFloat * h;
  362. _SCALAR_UPDATE_ARGS_CHECKS();
  363. _EKF_BIERMAN_SELF_INTERNALS_CHECKS();
  364. nu = _Y[i];
  365. h = _HY + _NX * i;
  366. /* f = h.dot(Up) */
  367. # define f _D
  368. //f = self->D;
  369. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  370. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  371. # define v _HY /*Don't need h any more, use it to store v*/
  372. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  373. # define r _DR[i]
  374. YAFL_TRY(status, \
  375. _adaptive_correction(_NX, &ac, 0, f, v, r, nu, 1.0, \
  376. ((yaflEKFAdaptiveSt *)self)->chi2));
  377. YAFL_TRY(status, \
  378. _bierman_update_body(_NX, _X, _UP, _DP, f, v, r, nu, ac, 1.0));
  379. # undef r
  380. # undef v /*Don't nee v any more*/
  381. # undef f
  382. return status;
  383. }
  384. /*=============================================================================
  385. Adaptive Joseph filter
  386. =============================================================================*/
  387. yaflStatusEn \
  388. yafl_ekf_adaptive_joseph_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  389. {
  390. yaflStatusEn status = YAFL_ST_OK;
  391. yaflFloat s = 1.0;
  392. yaflFloat ac = 1.0;
  393. yaflFloat nu = 0.0;
  394. yaflFloat * h;
  395. yaflFloat * f;
  396. _SCALAR_UPDATE_ARGS_CHECKS();
  397. _EKF_JOSEPH_SELF_INTERNALS_CHECKS();
  398. h = _HY + _NX * i;
  399. # define v _D
  400. f = v + _NX;
  401. nu = _Y[i];
  402. /* f = h.dot(Up) */
  403. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  404. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  405. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  406. # define r _DR[i]
  407. YAFL_TRY(status, \
  408. _adaptive_correction(_NX, &ac, &s, f, v, r, nu, 1.0, \
  409. ((yaflEKFAdaptiveSt *)self)->chi2));
  410. /* K = Up.dot(v * ac / s) = Up.dot(v) * (ac / s) */
  411. # define K h /*Don't need h any more, use it to store K*/
  412. YAFL_TRY(status, \
  413. _joseph_update_body(_NX, _X, _UP, _DP, f, v, K, _W, nu, r, s, \
  414. ac, 1.0));
  415. # undef K /*Don't nee K any more*/
  416. # undef r
  417. # undef v
  418. return status;
  419. }
  420. /*=============================================================================
  421. WARNING!!!
  422. DO NOT USE THIS variant of Adaptive Joseph filter !!!
  423. It was implemented to show some flaws of the corresponding algorithm!
  424. =============================================================================*/
  425. yaflStatusEn \
  426. yafl_ekf_do_not_use_this_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  427. {
  428. yaflStatusEn status = YAFL_ST_OK;
  429. yaflFloat c = 0.0;
  430. yaflFloat s = 0.0;
  431. yaflInt nx;
  432. yaflInt nx1;
  433. yaflFloat * d;
  434. yaflFloat * u;
  435. yaflFloat * h;
  436. yaflFloat * f;
  437. yaflFloat * v;
  438. yaflFloat * w;
  439. yaflFloat nu;
  440. yaflFloat r;
  441. yaflFloat ac;
  442. _SCALAR_UPDATE_ARGS_CHECKS();
  443. nx = _NX;
  444. _EKF_JOSEPH_SELF_INTERNALS_CHECKS();
  445. nx1 = nx + 1;
  446. d = _DP;
  447. u = _UP;
  448. h = _HY + nx * i;
  449. v = _D;
  450. f = v + nx;
  451. w = _W;
  452. nu = _Y[i];
  453. r = _DR[i];
  454. /* f = h.dot(Up) */
  455. YAFL_TRY(status, yafl_math_set_vtu(nx, f, h, u));
  456. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  457. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, d, f));
  458. /* s = r + f.dot(v)*/
  459. YAFL_TRY(status, yafl_math_vtv(nx, &c, f, v));
  460. s = c + r;
  461. /* Divergence test */
  462. ac = (nu * (nu / (((yaflEKFAdaptiveSt *)self)->chi2))) - s;
  463. if (ac > 0.0)
  464. {
  465. /*Adaptive correction with no limitations approach*/
  466. YAFL_TRY(status, yafl_math_set_uv(nx, f, u, v));
  467. YAFL_TRY(status, yafl_math_udu_up(nx, u, d, (ac / c) / c, f));
  468. /*Recompute f,v,s*/
  469. /* f = h.dot(Up) */
  470. YAFL_TRY(status, yafl_math_set_vtu(nx, f, h, u));
  471. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  472. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, d, f));
  473. /* s = r + f.dot(v)*/
  474. YAFL_TRY(status, yafl_math_vtv(nx, &c, f, v));
  475. s = c + r;
  476. }
  477. /* K = Up.dot(v * ac / s) = Up.dot(v) * (ac / s) */
  478. #define K h /*Don't need h any more, use it to store K*/
  479. #define D v
  480. YAFL_TRY(status, yafl_math_set_uv(nx, K, u, v));
  481. YAFL_TRY(status, yafl_math_set_vrn(nx, K, K, s)); /*May be used in place*/
  482. /*Set W and D*/
  483. YAFL_TRY(status, yafl_math_bset_vvt(nx1, w, nx, K, f));
  484. YAFL_TRY(status, yafl_math_bsub_u(nx1, w, nx, u));
  485. /* Now w is (Kf - Up|***) */
  486. YAFL_TRY(status, YAFL_MATH_BSET_V(nx1, 0, nx, w, nx, K));
  487. /* Now w is (Kf - Up|K) */
  488. /* D = concatenate([Dp, np.array([r])]) */
  489. memcpy((void *)D, (void *)d, nx * sizeof(yaflFloat));
  490. D[nx] = r;
  491. /* Up, Dp = MWGSU(W, D)*/
  492. YAFL_TRY(status, yafl_math_mwgsu(nx, nx1, u, d, w, D));
  493. /* self.x += K * nu */
  494. YAFL_TRY(status, yafl_math_add_vxn(nx, _X, K, nu));
  495. #undef D /*Don't nee D any more*/
  496. #undef K /*Don't nee K any more*/
  497. return status;
  498. }
  499. /*=============================================================================
  500. Robust Bierman filter
  501. =============================================================================*/
  502. static inline yaflStatusEn \
  503. _scalar_robustify(yaflKalmanBaseSt * self, \
  504. yaflKalmanRobFuncP g, yaflKalmanRobFuncP gdot, \
  505. yaflFloat * gdot_res, yaflFloat * nu, yaflFloat r05)
  506. {
  507. yaflFloat tmp;
  508. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  509. YAFL_CHECK(gdot_res, YAFL_ST_INV_ARG_3);
  510. YAFL_CHECK(nu, YAFL_ST_INV_ARG_4);
  511. if (g)
  512. {
  513. tmp = *nu / r05;
  514. *nu = r05 * g(self, tmp);
  515. YAFL_CHECK(gdot, YAFL_ST_INV_ARG_1);
  516. tmp = gdot(self, tmp);
  517. }
  518. else
  519. {
  520. tmp = 1.0;
  521. }
  522. *gdot_res = tmp;
  523. /*Detect glitches and return*/
  524. if (tmp < YAFL_EPS)
  525. {
  526. return YAFL_ST_MSK_GLITCH_LARGE;
  527. }
  528. if (tmp < (1.0 - 2.0*YAFL_EPS))
  529. {
  530. return YAFL_ST_MSK_GLITCH_SMALL;
  531. }
  532. return YAFL_ST_OK;
  533. }
  534. #define _SCALAR_ROBUSTIFY(_self, _gdot_res, _nu, _r05) \
  535. _scalar_robustify(self, \
  536. ((yaflEKFRobustSt *)self)->g, \
  537. ((yaflEKFRobustSt *)self)->gdot, \
  538. _gdot_res, _nu, _r05)
  539. /*---------------------------------------------------------------------------*/
  540. yaflStatusEn \
  541. yafl_ekf_robust_bierman_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  542. {
  543. yaflStatusEn status = YAFL_ST_OK;
  544. yaflFloat gdot = 1.0;
  545. yaflFloat nu = 0.0;
  546. yaflFloat r05;
  547. yaflFloat * h;
  548. _SCALAR_UPDATE_ARGS_CHECKS();
  549. _EKF_BIERMAN_SELF_INTERNALS_CHECKS();
  550. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  551. nu = _Y[i];
  552. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  553. h = _HY + _NX * i;
  554. /* f = h.dot(Up) */
  555. # define f _D
  556. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  557. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  558. # define v h /*Don't need h any more, use it to store v*/
  559. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  560. YAFL_TRY(status, \
  561. _bierman_update_body(_NX, _X, _UP, _DP, f, v, r05 * r05, nu, \
  562. 1.0, gdot));
  563. # undef v /*Don't nee v any more*/
  564. # undef f
  565. return status;
  566. }
  567. /*=============================================================================
  568. Robust Joseph filter
  569. =============================================================================*/
  570. yaflStatusEn \
  571. yafl_ekf_robust_joseph_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  572. {
  573. yaflStatusEn status = YAFL_ST_OK;
  574. yaflFloat gdot = 0.0;
  575. yaflFloat s = 0.0;
  576. yaflFloat nu = 0.0;
  577. yaflFloat r05;
  578. yaflFloat * h;
  579. yaflFloat * f;
  580. _SCALAR_UPDATE_ARGS_CHECKS();
  581. _EKF_JOSEPH_SELF_INTERNALS_CHECKS();
  582. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  583. nu = _Y[i];
  584. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  585. r05 *= r05;
  586. # define A2 r05 /*Now it is r = alpha**2 */
  587. h = _HY + _NX * i;
  588. # define v _D
  589. f = v + _NX;
  590. /* f = h.dot(Up) */
  591. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  592. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  593. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  594. /* s = alpha**2 + gdot * f.dot(v)*/
  595. YAFL_TRY(status, yafl_math_vtv(_NX, &s, f, v));
  596. s = A2 + gdot * s;
  597. /*K = Up.dot(v/s) = Up.dot(v)/s*/
  598. # define K h /*Don't need h any more, use it to store K*/
  599. YAFL_TRY(status, \
  600. _joseph_update_body(_NX, _X, _UP, _DP, f, v, K, _W, nu, A2, s, \
  601. 1.0, gdot));
  602. # undef K /*Don't nee K any more*/
  603. # undef v
  604. # undef A2 /*Don't nee A2 any more*/
  605. return status;
  606. }
  607. /*=============================================================================
  608. Adaptive robust Bierman filter
  609. =============================================================================*/
  610. yaflStatusEn \
  611. yafl_ekf_adaptive_robust_bierman_update_scalar(yaflKalmanBaseSt * self, \
  612. yaflInt i)
  613. {
  614. yaflStatusEn status = YAFL_ST_OK;
  615. yaflFloat gdot = 1.0;
  616. yaflFloat ac = 1.0;
  617. yaflFloat nu = 0.0;
  618. yaflFloat r05;
  619. yaflFloat * h;
  620. _SCALAR_UPDATE_ARGS_CHECKS();
  621. _EKF_BIERMAN_SELF_INTERNALS_CHECKS();
  622. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  623. nu = _Y[i];
  624. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  625. r05 *= r05;
  626. # define A2 r05 /*Now it is r = alpha**2 */
  627. h = _HY + _NX * i;
  628. /* f = h.dot(Up) */
  629. # define f _D
  630. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  631. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  632. # define v h /*Don't need h any more, use it to store v*/
  633. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  634. YAFL_TRY(status, \
  635. _adaptive_correction(_NX, &ac, 0, f, v, A2, nu, gdot, \
  636. ((yaflEKFAdaptiveRobustSt *)self)->chi2));
  637. YAFL_TRY(status, _bierman_update_body(_NX, _X, _UP, _DP, f, v, A2, nu, \
  638. ac, gdot));
  639. # undef v /*Don't nee v any more*/
  640. # undef f
  641. # undef A2 /*Don't nee A2 any more*/
  642. return status;
  643. }
  644. /*=============================================================================
  645. Adaptive robust Joseph filter
  646. =============================================================================*/
  647. yaflStatusEn \
  648. yafl_ekf_adaptive_robust_joseph_update_scalar(yaflKalmanBaseSt * self, \
  649. yaflInt i)
  650. {
  651. yaflStatusEn status = YAFL_ST_OK;
  652. yaflFloat gdot = 1.0;
  653. yaflFloat ac = 1.0;
  654. yaflFloat s = 0.0;
  655. yaflFloat * h;
  656. yaflFloat * f;
  657. yaflFloat r05;
  658. yaflFloat nu;
  659. _SCALAR_UPDATE_ARGS_CHECKS();
  660. _EKF_JOSEPH_SELF_INTERNALS_CHECKS();
  661. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  662. nu = _Y[i];
  663. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  664. r05 *= r05;
  665. # define A2 r05 /*Now it is r = alpha**2 */
  666. h = _HY + _NX * i;
  667. # define v _D
  668. f = v + _NX;
  669. /* f = h.dot(Up) */
  670. YAFL_TRY(status, yafl_math_set_vtu(_NX, f, h, _UP));
  671. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  672. YAFL_TRY(status, YAFL_MATH_SET_DV(_NX, v, _DP, f));
  673. YAFL_TRY(status, \
  674. _adaptive_correction(_NX, &ac, &s, f, v, A2, nu, gdot, \
  675. ((yaflEKFAdaptiveRobustSt *)self)->chi2));
  676. /* K = Up.dot(v * ac / s) = Up.dot(v) * (ac / s) */
  677. # define K h /*Don't need h any more, use it to store K*/
  678. YAFL_TRY(status, \
  679. _joseph_update_body(_NX, _X, _UP, _DP, f, v, K, _W, nu, A2, s, \
  680. ac, gdot));
  681. # undef K /*Don't nee K any more*/
  682. # undef v
  683. # undef A2 /*Don't nee A2 any more*/
  684. return status;
  685. }
  686. /*------------------------------------------------------------------------------
  687. Undef EKF stuff
  688. ------------------------------------------------------------------------------*/
  689. #undef _SCALAR_ROBUSTIFY
  690. #undef _JFX
  691. #undef _JHX
  692. #undef _HY
  693. #undef _W
  694. #undef _D
  695. /*=============================================================================
  696. Basic UD-factorized UKF functions
  697. =============================================================================*/
  698. #define _KALMAN_SELF ((yaflKalmanBaseSt *)self)
  699. #define _UFX (_KALMAN_SELF->f)
  700. #define _UHX (_KALMAN_SELF->h)
  701. #define _UZRF (_KALMAN_SELF->zrf)
  702. #define _UX (_KALMAN_SELF->x)
  703. #define _UY (_KALMAN_SELF->y)
  704. #define _UUP (_KALMAN_SELF->Up)
  705. #define _UDP (_KALMAN_SELF->Dp)
  706. #define _UUQ (_KALMAN_SELF->Uq)
  707. #define _UDQ (_KALMAN_SELF->Dq)
  708. #define _UUR (_KALMAN_SELF->Ur)
  709. #define _UDR (_KALMAN_SELF->Dr)
  710. #define _UNX (_KALMAN_SELF->Nx)
  711. #define _UNZ (_KALMAN_SELF->Nz)
  712. /*UKF stuff*/
  713. #define _XRF (self->xrf)
  714. #define _XMF (self->xmf)
  715. #define _ZMF (self->zmf)
  716. #define _ZP (self->zp)
  717. #define _SX (self->Sx)
  718. #define _PZX (self->Pzx)
  719. #define _SIGMAS_X (self->sigmas_x)
  720. #define _SIGMAS_Z (self->sigmas_z)
  721. #define _WM (self->wm)
  722. #define _WC (self->wc)
  723. /*---------------------------------------------------------------------------*/
  724. static inline yaflStatusEn _compute_res(yaflKalmanBaseSt * self, yaflInt sz, \
  725. yaflKalmanResFuncP rf, yaflFloat * res, \
  726. yaflFloat * sigma, yaflFloat * pivot)
  727. {
  728. yaflStatusEn status = YAFL_ST_OK;
  729. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  730. YAFL_CHECK(res, YAFL_ST_INV_ARG_4);
  731. YAFL_CHECK(sigma, YAFL_ST_INV_ARG_5);
  732. YAFL_CHECK(pivot, YAFL_ST_INV_ARG_6);
  733. if (rf)
  734. {
  735. /*rf must be aware of sp and the current transform*/
  736. /* res = self.rf(sigma, pivot) */
  737. YAFL_TRY(status, rf(self, res, sigma, pivot));
  738. }
  739. else
  740. {
  741. yaflInt j;
  742. for (j = 0; j < sz; j++)
  743. {
  744. res[j] = sigma[j] - pivot[j];
  745. }
  746. }
  747. return status;
  748. }
  749. /*---------------------------------------------------------------------------*/
  750. static yaflStatusEn _unscented_transform(yaflUKFBaseSt * self, \
  751. yaflInt res_sz, \
  752. yaflFloat * res_v, \
  753. yaflFloat * res_u, \
  754. yaflFloat * res_d, \
  755. yaflFloat * sp, \
  756. yaflFloat * sigmas, \
  757. yaflFloat * noise_u, \
  758. yaflFloat * noise_d, \
  759. yaflKalmanFuncP mf, \
  760. yaflKalmanResFuncP rf)
  761. {
  762. yaflStatusEn status = YAFL_ST_OK;
  763. yaflInt np;
  764. yaflInt i;
  765. yaflUKFSigmaSt * sp_info;
  766. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  767. YAFL_CHECK(res_sz > 0, YAFL_ST_INV_ARG_2);
  768. YAFL_CHECK(res_u, YAFL_ST_INV_ARG_4);
  769. YAFL_CHECK(res_d, YAFL_ST_INV_ARG_5);
  770. YAFL_CHECK(sp, YAFL_ST_INV_ARG_6);
  771. if (noise_u)
  772. {
  773. YAFL_CHECK(noise_d, YAFL_ST_INV_ARG_9);
  774. }
  775. YAFL_CHECK(_WM, YAFL_ST_INV_ARG_1);
  776. YAFL_CHECK(_WC, YAFL_ST_INV_ARG_1);
  777. sp_info = self->sp_info;
  778. YAFL_CHECK(sp_info, YAFL_ST_INV_ARG_1);
  779. np = sp_info->np;
  780. YAFL_CHECK(np > 1, YAFL_ST_INV_ARG_1);
  781. if (mf)
  782. {
  783. /*mf must be aware of the current transform details...*/
  784. YAFL_CHECK(res_v, YAFL_ST_INV_ARG_3);
  785. YAFL_CHECK(sigmas, YAFL_ST_INV_ARG_7);
  786. YAFL_TRY(status, mf(_KALMAN_SELF, res_v, sigmas));
  787. }
  788. else
  789. {
  790. YAFL_TRY(status, yafl_math_set_vtm(np, res_sz, res_v, _WM, sigmas));
  791. }
  792. if (noise_u)
  793. {
  794. YAFL_CHECK(noise_d, YAFL_ST_INV_ARG_8);
  795. /*res_u, res_d = noise_u.copy(), noise_d.copy()*/
  796. memcpy((void *)res_u, (void *)noise_u, (res_sz * (res_sz - 1)) / 2 * sizeof(yaflFloat));
  797. memcpy((void *)res_d, (void *)noise_d, res_sz * sizeof(yaflFloat));
  798. }
  799. else
  800. {
  801. /* Zero res_u and res_d */
  802. for (i = res_sz - 1; i >= 0; i--)
  803. {
  804. res_d[i] = 0.0;
  805. }
  806. for (i = ((res_sz * (res_sz - 1)) / 2) - 1; i >= 0; i--)
  807. {
  808. res_u[i] = 0.0;
  809. }
  810. }
  811. for (i = 0; i < np; i++)
  812. {
  813. yaflFloat wci;
  814. YAFL_TRY(status, _compute_res(_KALMAN_SELF, res_sz, rf , sp, \
  815. sigmas + res_sz * i, res_v));
  816. /*Update res_u and res_d*/
  817. /*wc should be sorted in descending order*/
  818. wci = _WC[i];
  819. if (wci >= 0.0)
  820. {
  821. YAFL_TRY(status, \
  822. yafl_math_udu_up(res_sz, res_u, res_d, wci, sp));
  823. }
  824. else
  825. {
  826. YAFL_TRY(status, \
  827. yafl_math_udu_down(res_sz, res_u, res_d, -wci, sp));
  828. }
  829. }
  830. return status;
  831. }
  832. /*---------------------------------------------------------------------------*/
  833. yaflStatusEn yafl_ukf_base_predict(yaflUKFBaseSt * self)
  834. {
  835. yaflStatusEn status = YAFL_ST_OK;
  836. yaflInt np;
  837. yaflInt i;
  838. yaflUKFSigmaSt * sp_info;
  839. /*Check some params and generate sigma points*/
  840. YAFL_TRY(status, yafl_ukf_gen_sigmas(self)); /*Self is checked here*/
  841. YAFL_CHECK(_UNX, YAFL_ST_INV_ARG_1);
  842. YAFL_CHECK(_SIGMAS_X, YAFL_ST_INV_ARG_1);
  843. YAFL_CHECK(self->sp_info, YAFL_ST_INV_ARG_1);
  844. sp_info = self->sp_info;
  845. YAFL_CHECK(sp_info->np > 1, YAFL_ST_INV_ARG_1);
  846. np = sp_info->np;
  847. /*Compute process sigmas*/
  848. YAFL_CHECK(_UFX, YAFL_ST_INV_ARG_1);
  849. if (_UFX)
  850. {
  851. for (i = 0; i < np; i++)
  852. {
  853. yaflFloat * sigmai;
  854. sigmai = _SIGMAS_X + _UNX * i;
  855. YAFL_TRY(status, _UFX(_KALMAN_SELF, sigmai, sigmai));
  856. }
  857. }
  858. /*Predict x, Up, Dp*/
  859. YAFL_TRY(status, \
  860. _unscented_transform(self, _UNX, _UX, _UUP, _UDP, _SX, _SIGMAS_X, \
  861. _UUQ, _UDQ, _XMF, _XRF));
  862. return status;
  863. }
  864. /*---------------------------------------------------------------------------*/
  865. yaflStatusEn yafl_ukf_base_update(yaflUKFBaseSt * self, yaflFloat * z, \
  866. yaflKalmanScalarUpdateP scalar_update)
  867. {
  868. yaflStatusEn status = YAFL_ST_OK;
  869. yaflInt np;
  870. yaflInt nx;
  871. yaflInt nz;
  872. yaflInt i;
  873. yaflUKFSigmaSt * sp_info; /*Sigma point generator info*/
  874. YAFL_CHECK(scalar_update, YAFL_ST_INV_ARG_3);
  875. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  876. YAFL_CHECK(_UHX, YAFL_ST_INV_ARG_1);
  877. YAFL_CHECK(_UX, YAFL_ST_INV_ARG_1);
  878. YAFL_CHECK(_UY, YAFL_ST_INV_ARG_1);
  879. YAFL_CHECK(_UUP, YAFL_ST_INV_ARG_1);
  880. YAFL_CHECK(_UUR, YAFL_ST_INV_ARG_1);
  881. nx = _UNX;
  882. YAFL_CHECK(nx, YAFL_ST_INV_ARG_1);
  883. nz = _UNZ;
  884. YAFL_CHECK(nz, YAFL_ST_INV_ARG_1);
  885. YAFL_CHECK(_ZP, YAFL_ST_INV_ARG_1);
  886. YAFL_CHECK(_SX, YAFL_ST_INV_ARG_1);
  887. YAFL_CHECK(_PZX, YAFL_ST_INV_ARG_1);
  888. YAFL_CHECK(_SIGMAS_X, YAFL_ST_INV_ARG_1);
  889. YAFL_CHECK(_SIGMAS_Z, YAFL_ST_INV_ARG_1);
  890. YAFL_CHECK(_WC, YAFL_ST_INV_ARG_1);
  891. sp_info = self->sp_info;
  892. YAFL_CHECK(sp_info, YAFL_ST_INV_ARG_1);
  893. np = sp_info->np;
  894. YAFL_CHECK(np > 1, YAFL_ST_INV_ARG_1);
  895. YAFL_CHECK(z, YAFL_ST_INV_ARG_2);
  896. /* Compute measurement sigmas */
  897. for (i = 0; i < np; i++)
  898. {
  899. YAFL_TRY(status, _UHX(_KALMAN_SELF, _SIGMAS_Z + nz * i, \
  900. _SIGMAS_X + nx * i));
  901. }
  902. /* Compute zp*/
  903. if (_ZMF)
  904. {
  905. /*mf must be aware of the current transform details...*/
  906. YAFL_TRY(status, _ZMF(_KALMAN_SELF, _ZP, _SIGMAS_Z));
  907. }
  908. else
  909. {
  910. YAFL_TRY(status, yafl_math_set_vtm(np, nz, _ZP, _WM, _SIGMAS_Z));
  911. }
  912. /* Compute Pzx */
  913. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, _UY, _SIGMAS_Z, _ZP));
  914. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, _SIGMAS_X, _UX));
  915. YAFL_TRY(status, yafl_math_set_vvtxn(nz, nx, _PZX, _UY, _SX, _WC[0]));
  916. for (i = 1; i < np; i++)
  917. {
  918. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, _UY, \
  919. _SIGMAS_Z + nz * i, _ZP));
  920. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, \
  921. _SIGMAS_X + nx * i, _UX));
  922. YAFL_TRY(status, yafl_math_add_vvtxn(nz, nx, _PZX, _UY, _SX, _WC[i]));
  923. }
  924. /*Compute innovation*/
  925. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, _UY, z, _ZP));
  926. /* Decorrelate measurements*/
  927. YAFL_TRY(status, yafl_math_ruv(nz, _UY, _UUR));
  928. YAFL_TRY(status, yafl_math_rum(nz, nx, _PZX, _UUR));
  929. # ifndef YAFL_USE_FAST_UKF
  930. for (i = 0; i < nz; i++)
  931. {
  932. yaflFloat * h;
  933. h = _PZX + nx * i;
  934. YAFL_TRY(status, yafl_math_ruv (nx, h, _UUP));
  935. YAFL_TRY(status, YAFL_MATH_SET_RDV(nx, h, _UDP, h));
  936. YAFL_TRY(status, yafl_math_rutv (nx, h, _UUP));
  937. }
  938. # endif/*YAFL_USE_FAST_UKF*/
  939. /*Now we can do scalar updates*/
  940. for (i = 0; i < nz; i++)
  941. {
  942. # ifdef YAFL_USE_FAST_UKF
  943. /*
  944. Compute v[i] for Bierman/Joseph style scalar updates:
  945. v[i] = linalg.inv(Up).dot(Pzx[i].T)
  946. It's cheaper than computing _unscented_transform.
  947. */
  948. YAFL_TRY(status, yafl_math_ruv(nx, _PZX + nx * i, _UUP));
  949. # endif/*YAFL_USE_FAST_UKF*/
  950. YAFL_TRY(status, scalar_update(_KALMAN_SELF, i));
  951. }
  952. return status;
  953. }
  954. /*=============================================================================
  955. Bierman UKF
  956. =============================================================================*/
  957. #define _UKF_SELF ((yaflUKFBaseSt *)self)
  958. #define _UPZX (_UKF_SELF->Pzx)
  959. #define _USX (_UKF_SELF->Sx)
  960. #define _UKF_BIERMAN_SELF_INTERNALS_CHECKS() \
  961. do { \
  962. YAFL_CHECK(_NX > 1, YAFL_ST_INV_ARG_1); \
  963. YAFL_CHECK(_UP, YAFL_ST_INV_ARG_1); \
  964. YAFL_CHECK(_DP, YAFL_ST_INV_ARG_1); \
  965. YAFL_CHECK(_UPZX, YAFL_ST_INV_ARG_1); \
  966. YAFL_CHECK(_USX, YAFL_ST_INV_ARG_1); \
  967. YAFL_CHECK(_Y, YAFL_ST_INV_ARG_1); \
  968. YAFL_CHECK(_DR, YAFL_ST_INV_ARG_1); \
  969. } while (0)
  970. /*---------------------------------------------------------------------------*/
  971. yaflStatusEn yafl_ukf_bierman_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  972. {
  973. yaflStatusEn status = YAFL_ST_OK;
  974. yaflInt nx;
  975. yaflFloat * v;
  976. _SCALAR_UPDATE_ARGS_CHECKS();
  977. nx = _NX;
  978. _UKF_BIERMAN_SELF_INTERNALS_CHECKS();
  979. v = _UPZX + nx * i;/*h is stored in v*/
  980. # define f _USX
  981. # ifdef YAFL_USE_FAST_UKF
  982. /* f = linalg.inv(Dp).dot(v)*/
  983. YAFL_TRY(status, YAFL_MATH_SET_RDV(nx, f, _DP, v));
  984. # else /*YAFL_USE_FAST_UKF*/
  985. /* f = h.T.dot(Up) */
  986. YAFL_TRY(status, yafl_math_set_vtu(nx, f, v, _UP));
  987. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  988. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, _DP, f));
  989. # endif/*YAFL_USE_FAST_UKF*/
  990. YAFL_TRY(status, \
  991. _bierman_update_body(nx, _X, _UP, _DP, f, v, _DR[i], _Y[i], \
  992. 1.0, 1.0));
  993. # undef f
  994. return status;
  995. }
  996. /*=============================================================================
  997. Adaptive Bierman UKF
  998. =============================================================================*/
  999. yaflStatusEn yafl_ukf_adaptive_bierman_update_scalar(yaflKalmanBaseSt * self, yaflInt i)
  1000. {
  1001. yaflStatusEn status = YAFL_ST_OK;
  1002. yaflInt nx;
  1003. yaflFloat * v;
  1004. yaflFloat nu;
  1005. yaflFloat r;
  1006. yaflFloat ac;
  1007. _SCALAR_UPDATE_ARGS_CHECKS();
  1008. nx = _NX;
  1009. _UKF_BIERMAN_SELF_INTERNALS_CHECKS();
  1010. v = _UPZX + nx * i;/*h is stored in v*/
  1011. # define f _USX
  1012. # ifdef YAFL_USE_FAST_UKF
  1013. /* f = linalg.inv(Dp).dot(v)*/
  1014. YAFL_TRY(status, YAFL_MATH_SET_RDV(nx, f, _DP, v));
  1015. # else /*YAFL_USE_FAST_UKF*/
  1016. /* f = h.T.dot(Up) */
  1017. YAFL_TRY(status, yafl_math_set_vtu(nx, f, v, _UP));
  1018. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  1019. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, _DP, f));
  1020. # endif/*YAFL_USE_FAST_UKF*/
  1021. nu = self->y[i];
  1022. r = self->Dr[i];
  1023. YAFL_TRY(status, \
  1024. _adaptive_correction(nx, &ac, 0, f, v, r, nu, 1.0, \
  1025. ((yaflUKFAdaptivedSt *)self)->chi2));
  1026. YAFL_TRY(status, \
  1027. _bierman_update_body(nx, _X, _UP, _DP, f, v, r, _Y[i], ac, 1.0));
  1028. # undef f
  1029. return status;
  1030. }
  1031. /*=============================================================================
  1032. Robust Bierman UKF
  1033. =============================================================================*/
  1034. #define _SCALAR_ROBUSTIFY(_self, _gdot_res, _nu, _r05) \
  1035. _scalar_robustify(self, \
  1036. ((yaflUKFRobustSt *)self)->g, \
  1037. ((yaflUKFRobustSt *)self)->gdot, \
  1038. _gdot_res, _nu, _r05)
  1039. yaflStatusEn yafl_ukf_robust_bierman_update_scalar(yaflKalmanBaseSt * self, \
  1040. yaflInt i)
  1041. {
  1042. yaflStatusEn status = YAFL_ST_OK;
  1043. yaflInt nx;
  1044. yaflFloat gdot = 1.0;
  1045. yaflFloat nu = 0.0;
  1046. yaflFloat r05;
  1047. yaflFloat * v;
  1048. _SCALAR_UPDATE_ARGS_CHECKS();
  1049. nx = _NX;
  1050. _UKF_BIERMAN_SELF_INTERNALS_CHECKS();
  1051. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  1052. nu = _Y[i];
  1053. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  1054. v = _UPZX + nx * i;/*h is stored in v*/
  1055. # define f _USX
  1056. # ifdef YAFL_USE_FAST_UKF
  1057. /* f = linalg.inv(Dp).dot(v)*/
  1058. YAFL_TRY(status, YAFL_MATH_SET_RDV(nx, f, _DP, v));
  1059. # else /*YAFL_USE_FAST_UKF*/
  1060. /* f = h.T.dot(Up) */
  1061. YAFL_TRY(status, yafl_math_set_vtu(nx, f, v, _UP));
  1062. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  1063. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, _DP, f));
  1064. # endif/*YAFL_USE_FAST_UKF*/
  1065. YAFL_TRY(status, \
  1066. _bierman_update_body(nx, _X, _UP, _DP, f, v, r05 * r05, nu, \
  1067. 1.0, gdot));
  1068. # undef f
  1069. return status;
  1070. }
  1071. /*=============================================================================
  1072. Adaptive robust Bierman UKF
  1073. =============================================================================*/
  1074. yaflStatusEn \
  1075. yafl_ukf_adaptive_robust_bierman_update_scalar(yaflKalmanBaseSt * self, \
  1076. yaflInt i)
  1077. {
  1078. yaflStatusEn status = YAFL_ST_OK;
  1079. yaflInt nx;
  1080. yaflFloat gdot = 1.0;
  1081. yaflFloat ac = 1.0;
  1082. yaflFloat nu = 0.0;
  1083. yaflFloat r05;
  1084. yaflFloat * v;
  1085. _SCALAR_UPDATE_ARGS_CHECKS();
  1086. nx = _NX;
  1087. _UKF_BIERMAN_SELF_INTERNALS_CHECKS();
  1088. r05 = _DR[i]; /* alpha = r**0.5 is stored in Dr*/
  1089. nu = _Y[i];
  1090. YAFL_TRY(status, _SCALAR_ROBUSTIFY(self, &gdot, &nu, r05));
  1091. r05 *= r05;
  1092. # define A2 r05 /*Now it is r = alpha**2 */
  1093. v = _UPZX + nx * i;/*h is stored in v*/
  1094. # define f _USX
  1095. # ifdef YAFL_USE_FAST_UKF
  1096. /* f = linalg.inv(Dp).dot(v)*/
  1097. YAFL_TRY(status, YAFL_MATH_SET_RDV(nx, f, _DP, v));
  1098. # else /*YAFL_USE_FAST_UKF*/
  1099. /* f = h.T.dot(Up) */
  1100. YAFL_TRY(status, yafl_math_set_vtu(nx, f, v, _UP));
  1101. /* v = f.dot(Dp).T = Dp.dot(f.T).T */
  1102. YAFL_TRY(status, YAFL_MATH_SET_DV(nx, v, _DP, f));
  1103. # endif/*YAFL_USE_FAST_UKF*/
  1104. YAFL_TRY(status, \
  1105. _adaptive_correction(nx, &ac, 0, f, v, A2, nu, gdot, \
  1106. ((yaflUKFAdaptiveRobustSt *)self)->chi2));
  1107. YAFL_TRY(status, \
  1108. _bierman_update_body(nx, _X, _UP, _DP, f, v, A2, nu, ac, gdot));
  1109. # undef f
  1110. # undef A2 /*Don't nee A2 any more*/
  1111. return status;
  1112. }
  1113. /*=============================================================================
  1114. Full UKF, not a sequential square root version of UKF
  1115. =============================================================================*/
  1116. #define _UUS (((yaflUKFSt *)self)->Us)
  1117. #define _UDS (((yaflUKFSt *)self)->Ds)
  1118. yaflStatusEn yafl_ukf_update(yaflUKFBaseSt * self, yaflFloat * z)
  1119. {
  1120. yaflStatusEn status = YAFL_ST_OK;
  1121. yaflInt np;
  1122. yaflInt nz;
  1123. yaflInt nx;
  1124. yaflInt i;
  1125. yaflUKFSigmaSt * sp_info; /*Sigma point generator info*/
  1126. yaflFloat * y;
  1127. yaflFloat * ds;
  1128. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  1129. YAFL_CHECK(_UHX, YAFL_ST_INV_ARG_1);
  1130. YAFL_CHECK(_UX, YAFL_ST_INV_ARG_1);
  1131. y = _UY;
  1132. YAFL_CHECK(y, YAFL_ST_INV_ARG_1);
  1133. YAFL_CHECK(_UUP, YAFL_ST_INV_ARG_1);
  1134. YAFL_CHECK(_UDP, YAFL_ST_INV_ARG_1);
  1135. nx = _UNX;
  1136. YAFL_CHECK(nx, YAFL_ST_INV_ARG_1);
  1137. nz = _UNZ;
  1138. YAFL_CHECK(nz, YAFL_ST_INV_ARG_1);
  1139. YAFL_CHECK(_SIGMAS_X, YAFL_ST_INV_ARG_1);
  1140. YAFL_CHECK(_SIGMAS_Z, YAFL_ST_INV_ARG_1);
  1141. YAFL_CHECK(_WC, YAFL_ST_INV_ARG_1);
  1142. YAFL_CHECK(self->sp_info, YAFL_ST_INV_ARG_1);
  1143. sp_info = self->sp_info;
  1144. YAFL_CHECK(sp_info->np > 1, YAFL_ST_INV_ARG_1);
  1145. np = sp_info->np;
  1146. YAFL_CHECK(_PZX, YAFL_ST_INV_ARG_1);
  1147. YAFL_CHECK(_SX, YAFL_ST_INV_ARG_1);
  1148. YAFL_CHECK(_ZP, YAFL_ST_INV_ARG_1);
  1149. YAFL_CHECK(_UUS, YAFL_ST_INV_ARG_1);
  1150. ds = _UDS;
  1151. YAFL_CHECK(ds, YAFL_ST_INV_ARG_1);
  1152. YAFL_CHECK(z, YAFL_ST_INV_ARG_2);
  1153. /* Compute measurement sigmas */
  1154. for (i = 0; i < np; i++)
  1155. {
  1156. YAFL_TRY(status, _UHX(_KALMAN_SELF, _SIGMAS_Z + nz * i, \
  1157. _SIGMAS_X + nx * i));
  1158. }
  1159. /* Compute zp, Us, Ds */
  1160. YAFL_TRY(status, \
  1161. _unscented_transform(self, nz, _ZP, _UUS, ds, y, _SIGMAS_Z, \
  1162. _UUR, _UDR, _ZMF, _UZRF));
  1163. /* Compute Pzx */
  1164. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, _SIGMAS_Z, _ZP));
  1165. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, _SIGMAS_X, _UX));
  1166. YAFL_TRY(status, yafl_math_set_vvtxn(nz, nx, _PZX, y, _SX, _WC[0]));
  1167. for (i = 1; i < np; i++)
  1168. {
  1169. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, \
  1170. _SIGMAS_Z + nz * i, _ZP));
  1171. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, \
  1172. _SIGMAS_X + nx * i, _UX));
  1173. YAFL_TRY(status, yafl_math_add_vvtxn(nz, nx, _PZX, y, _SX, _WC[i]));
  1174. }
  1175. /*Compute innovation*/
  1176. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, z, _ZP));
  1177. /* Decorrelate measurements*/
  1178. YAFL_TRY(status, yafl_math_ruv(nz, y, _UUS));
  1179. YAFL_TRY(status, yafl_math_rum(nz, nx, _PZX, _UUS));
  1180. /*Now we can do scalar updates*/
  1181. for (i = 0; i < nz; i++)
  1182. {
  1183. yaflFloat * pzxi;
  1184. pzxi = _PZX + nx * i;
  1185. /*
  1186. self.x += K * y[i]
  1187. K * y[i] = Pzx[i].T / ds[i] * y[i] = Pzx[i].T * (y[i] / ds[i])
  1188. self.x += Pzx[i].T * (y[i] / ds[i])
  1189. */
  1190. YAFL_TRY(status, yafl_math_add_vxn(nx, _UX, pzxi, y[i] / ds[i]));
  1191. /*
  1192. P -= K.dot(S.dot(K.T))
  1193. K.dot(S.dot(K.T)) = (Pzx[i].T / ds[i] * ds[i]).outer(Pzx[i] / ds[i]))
  1194. K.dot(S.dot(K.T)) = (Pzx[i].T).outer(Pzx[i]) / ds[i]
  1195. P -= (Pzx[i].T).outer(Pzx[i]) / ds[i]
  1196. Up, Dp = udu(P)
  1197. */
  1198. YAFL_TRY(status, yafl_math_udu_down(nx, _UUP, _UDP, 1.0 / ds[i], pzxi));
  1199. }
  1200. return status;
  1201. }
  1202. /*=============================================================================
  1203. Full adaptive UKF, not a sequential square root version of UKF
  1204. =============================================================================*/
  1205. static inline yaflStatusEn _ukf_compute_md(yaflUKFBaseSt * self, yaflFloat * z, yaflFloat * md)
  1206. {
  1207. yaflStatusEn status = YAFL_ST_OK;
  1208. yaflInt i;
  1209. yaflInt nz;
  1210. yaflFloat dist;
  1211. yaflFloat * y;
  1212. yaflFloat * ds;
  1213. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  1214. YAFL_CHECK(_UUS, YAFL_ST_INV_ARG_1);
  1215. ds = _UDS;
  1216. YAFL_CHECK(ds, YAFL_ST_INV_ARG_1);
  1217. nz = _UNZ;
  1218. YAFL_CHECK(nz, YAFL_ST_INV_ARG_1);
  1219. y = _UY;
  1220. YAFL_CHECK(y, YAFL_ST_INV_ARG_1);
  1221. YAFL_CHECK(z, YAFL_ST_INV_ARG_2);
  1222. YAFL_CHECK(md, YAFL_ST_INV_ARG_3);
  1223. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, z, _ZP));
  1224. YAFL_TRY(status, yafl_math_ruv(nz, y, _UUS));
  1225. dist = 0;
  1226. for (i = 0; i < nz; i++)
  1227. {
  1228. /* Since ds is positive definite we won't check values. */
  1229. dist += y[i] * y[i] / ds[i];
  1230. }
  1231. *md = dist;
  1232. return status;
  1233. }
  1234. yaflStatusEn yafl_ukf_adaptive_update(yaflUKFBaseSt * self, yaflFloat * z)
  1235. {
  1236. yaflStatusEn status = YAFL_ST_OK;
  1237. yaflInt np;
  1238. yaflInt nz;
  1239. yaflInt nx;
  1240. yaflInt i;
  1241. yaflUKFSigmaSt * sp_info; /*Sigma point generator info*/
  1242. yaflFloat delta;
  1243. yaflFloat * y;
  1244. yaflFloat * ds;
  1245. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  1246. YAFL_CHECK(_UHX, YAFL_ST_INV_ARG_1);
  1247. YAFL_CHECK(_UX, YAFL_ST_INV_ARG_1);
  1248. y = _UY;
  1249. YAFL_CHECK(y, YAFL_ST_INV_ARG_1);
  1250. YAFL_CHECK(_UUP, YAFL_ST_INV_ARG_1);
  1251. YAFL_CHECK(_UDP, YAFL_ST_INV_ARG_1);
  1252. nx = _UNX;
  1253. YAFL_CHECK(nx, YAFL_ST_INV_ARG_1);
  1254. nz = _UNZ;
  1255. YAFL_CHECK(nz, YAFL_ST_INV_ARG_1);
  1256. YAFL_CHECK(_SIGMAS_X, YAFL_ST_INV_ARG_1);
  1257. YAFL_CHECK(_SIGMAS_Z, YAFL_ST_INV_ARG_1);
  1258. YAFL_CHECK(_WC, YAFL_ST_INV_ARG_1);
  1259. YAFL_CHECK(self->sp_info, YAFL_ST_INV_ARG_1);
  1260. sp_info = self->sp_info;
  1261. YAFL_CHECK(sp_info->np > 1, YAFL_ST_INV_ARG_1);
  1262. np = sp_info->np;
  1263. YAFL_CHECK(_PZX, YAFL_ST_INV_ARG_1);
  1264. YAFL_CHECK(_SX, YAFL_ST_INV_ARG_1);
  1265. YAFL_CHECK(_ZP, YAFL_ST_INV_ARG_1);
  1266. YAFL_CHECK(_UUS, YAFL_ST_INV_ARG_1);
  1267. ds = _UDS;
  1268. YAFL_CHECK(ds, YAFL_ST_INV_ARG_1);
  1269. YAFL_CHECK(z, YAFL_ST_INV_ARG_2);
  1270. /* Compute measurement sigmas */
  1271. for (i = 0; i < np; i++)
  1272. {
  1273. YAFL_TRY(status, _UHX(_KALMAN_SELF, _SIGMAS_Z + nz * i, \
  1274. _SIGMAS_X + nx * i));
  1275. }
  1276. /* Compute zp, Us, Ds */
  1277. YAFL_TRY(status, \
  1278. _unscented_transform(self, nz, _ZP, _UUS, ds, y, _SIGMAS_Z, \
  1279. _UUR, _UDR, _ZMF, _UZRF));
  1280. /* Divergence test */
  1281. YAFL_TRY(status, _ukf_compute_md(self, z, &delta));
  1282. # define _CHI2 (((yaflUKFFullAdapiveSt *)self)->chi2)
  1283. if (delta > _CHI2)
  1284. {
  1285. /* Adaptive correction */
  1286. yaflFloat ac;
  1287. /* Compute correction factor, we don't need old _ZP and _SIGMAS_Z now*/
  1288. YAFL_TRY(status, \
  1289. _unscented_transform(self, nz, _ZP, _UUS, ds, y, _SIGMAS_Z, \
  1290. 0, 0, _ZMF, _UZRF));
  1291. YAFL_TRY(status, _ukf_compute_md(self, z, &ac));
  1292. ac *= 1.0 / _CHI2 - 1.0 / delta;
  1293. /* Correct _UDP*/
  1294. YAFL_TRY(status, yafl_math_set_vxn(nx, _UDP, _UDP, 1.0 + ac));
  1295. /* Generate new sigmas */
  1296. YAFL_TRY(status, yafl_ukf_gen_sigmas(self));
  1297. /* Now begin update with new _SIGMAS_X */
  1298. /* Recompute measurement sigmas */
  1299. for (i = 0; i < np; i++)
  1300. {
  1301. YAFL_TRY(status, _UHX(_KALMAN_SELF, _SIGMAS_Z + nz * i, \
  1302. _SIGMAS_X + nx * i));
  1303. }
  1304. /* Recompute zp, Us, Ds */
  1305. YAFL_TRY(status, \
  1306. _unscented_transform(self, nz, _ZP, _UUS, ds, y, _SIGMAS_Z, \
  1307. _UUR, _UDR, _ZMF, _UZRF));
  1308. /* Recompute innovation*/
  1309. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, z, _ZP));
  1310. /* Decorrelate measurements part 1*/
  1311. YAFL_TRY(status, yafl_math_ruv(nz, y, _UUS));
  1312. }
  1313. # undef _CHI2
  1314. /* Compute Pzx */
  1315. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, _SIGMAS_Z, _ZP));
  1316. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, _SIGMAS_X, _UX));
  1317. YAFL_TRY(status, yafl_math_set_vvtxn(nz, nx, _PZX, y, _SX, _WC[0]));
  1318. for (i = 1; i < np; i++)
  1319. {
  1320. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, \
  1321. _SIGMAS_Z + nz * i, _ZP));
  1322. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nx, _XRF, _SX, \
  1323. _SIGMAS_X + nx * i, _UX));
  1324. YAFL_TRY(status, yafl_math_add_vvtxn(nz, nx, _PZX, y, _SX, _WC[i]));
  1325. }
  1326. /*Compute innovation*/
  1327. YAFL_TRY(status, _compute_res(_KALMAN_SELF, nz, _UZRF, y, z, _ZP));
  1328. /* Decorrelate measurements*/
  1329. YAFL_TRY(status, yafl_math_ruv(nz, y, _UUS));
  1330. YAFL_TRY(status, yafl_math_rum(nz, nx, _PZX, _UUS));
  1331. /*Now we can do scalar updates*/
  1332. for (i = 0; i < nz; i++)
  1333. {
  1334. yaflFloat * pzxi;
  1335. pzxi = _PZX + nx * i;
  1336. /*
  1337. self.x += K * y[i]
  1338. K * y[i] = Pzx[i].T / ds[i] * y[i] = Pzx[i].T * (y[i] / ds[i])
  1339. self.x += Pzx[i].T * (y[i] / ds[i])
  1340. */
  1341. YAFL_TRY(status, yafl_math_add_vxn(nx, _UX, pzxi, y[i] / ds[i]));
  1342. /*
  1343. P -= K.dot(S.dot(K.T))
  1344. K.dot(S.dot(K.T)) = (Pzx[i].T / ds[i] * ds[i]).outer(Pzx[i] / ds[i]))
  1345. K.dot(S.dot(K.T)) = (Pzx[i].T).outer(Pzx[i]) / ds[i]
  1346. P -= (Pzx[i].T).outer(Pzx[i]) / ds[i]
  1347. Up, Dp = udu(P)
  1348. */
  1349. YAFL_TRY(status, yafl_math_udu_down(nx, _UUP, _UDP, 1.0 / ds[i], pzxi));
  1350. }
  1351. return status;
  1352. }
  1353. /*=============================================================================
  1354. Van der Merwe sigma points generator
  1355. =============================================================================*/
  1356. static yaflStatusEn _merwe_compute_weights(yaflUKFBaseSt * self)
  1357. {
  1358. yaflStatusEn status = YAFL_ST_OK;
  1359. yaflInt np;
  1360. yaflInt nx;
  1361. yaflInt i;
  1362. yaflFloat * wc;
  1363. yaflFloat * wm;
  1364. yaflUKFSigmaSt * sp_info;
  1365. yaflFloat lambda;
  1366. yaflFloat alpha;
  1367. yaflFloat c;
  1368. yaflFloat d;
  1369. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  1370. nx = _UNX;
  1371. YAFL_CHECK(_UNX, YAFL_ST_INV_ARG_1);
  1372. YAFL_CHECK(_WM, YAFL_ST_INV_ARG_1);
  1373. wm = _WM;
  1374. YAFL_CHECK(_WC, YAFL_ST_INV_ARG_1);
  1375. wc = _WC;
  1376. YAFL_CHECK(self->sp_info, YAFL_ST_INV_ARG_1);
  1377. sp_info = self->sp_info;
  1378. YAFL_CHECK(sp_info->np, YAFL_ST_INV_ARG_1);
  1379. np = sp_info->np - 1; /*Achtung!!!*/
  1380. alpha = ((yaflUKFMerweSt *)sp_info)->alpha;
  1381. alpha *= alpha;
  1382. #define ALPHA2 alpha
  1383. lambda = ALPHA2 * (nx + ((yaflUKFMerweSt *)sp_info)->kappa) - nx;
  1384. d = lambda / (nx + lambda);
  1385. wm[np] = d;
  1386. wc[np] = d + (1.0 - ALPHA2 + ((yaflUKFMerweSt *)sp_info)->beta);
  1387. c = 0.5 / (nx + lambda);
  1388. for (i = np - 1; i >= 0; i--)
  1389. {
  1390. wm[i] = c;
  1391. wc[i] = c;
  1392. }
  1393. #undef ALPHA2
  1394. return status;
  1395. }
  1396. /*---------------------------------------------------------------------------*/
  1397. static inline yaflStatusEn _add_delta(yaflUKFBaseSt * self, \
  1398. yaflUKFSigmaAddP addf, yaflInt sz, \
  1399. yaflFloat * delta, yaflFloat * pivot, \
  1400. yaflFloat mult)
  1401. {
  1402. yaflStatusEn status = YAFL_ST_OK;
  1403. if (addf)
  1404. {
  1405. /* addf must be aware of self internal structure*/
  1406. /* delta = self.addf(delta, pivot, mult) */
  1407. YAFL_TRY(status, addf(self, delta, pivot, mult));
  1408. }
  1409. else
  1410. {
  1411. yaflInt j;
  1412. for (j = 0; j < sz; j++)
  1413. {
  1414. delta[j] = pivot[j] + mult * delta[j];
  1415. }
  1416. }
  1417. return status;
  1418. }
  1419. /*---------------------------------------------------------------------------*/
  1420. static yaflStatusEn _merwe_generate_points(yaflUKFBaseSt * self)
  1421. {
  1422. yaflStatusEn status = YAFL_ST_OK;
  1423. yaflInt nx;
  1424. yaflInt i;
  1425. yaflFloat * x;
  1426. yaflFloat * sigmas_x;
  1427. yaflFloat * dp;
  1428. yaflUKFSigmaSt * sp_info;
  1429. yaflUKFSigmaAddP addf;
  1430. yaflFloat lambda_p_n;
  1431. yaflFloat alpha;
  1432. YAFL_CHECK(self, YAFL_ST_INV_ARG_1);
  1433. nx = _UNX;
  1434. YAFL_CHECK(nx, YAFL_ST_INV_ARG_1);
  1435. x = _UX;
  1436. YAFL_CHECK(x, YAFL_ST_INV_ARG_1);
  1437. YAFL_CHECK(_UUP, YAFL_ST_INV_ARG_1);
  1438. dp = _UDP;
  1439. YAFL_CHECK(dp, YAFL_ST_INV_ARG_1);
  1440. sigmas_x = _SIGMAS_X;
  1441. YAFL_CHECK(sigmas_x, YAFL_ST_INV_ARG_1);
  1442. YAFL_CHECK(self->sp_info, YAFL_ST_INV_ARG_1);
  1443. sp_info = self->sp_info;
  1444. alpha = ((yaflUKFMerweSt *)sp_info)->alpha;
  1445. lambda_p_n = alpha * alpha * (nx + ((yaflUKFMerweSt *)sp_info)->kappa);
  1446. YAFL_TRY(status, yafl_math_bset_ut(nx, sigmas_x, nx, _UUP));
  1447. memcpy((void *)(sigmas_x + nx * nx), (void *)sigmas_x, \
  1448. nx * nx * sizeof(yaflFloat));
  1449. addf = sp_info->addf;
  1450. for (i = 0; i < nx; i++)
  1451. {
  1452. yaflFloat mult;
  1453. mult = YAFL_SQRT(dp[i] * lambda_p_n);
  1454. YAFL_TRY(status, \
  1455. _add_delta(self, addf, nx, sigmas_x + nx * i, x, mult));
  1456. YAFL_TRY(status, \
  1457. _add_delta(self, addf, nx, sigmas_x + nx * (nx + i), x, - mult));
  1458. }
  1459. memcpy((void *)(sigmas_x + 2 * nx * nx), (void *)x, nx * sizeof(yaflFloat));
  1460. return status;
  1461. }
  1462. /*---------------------------------------------------------------------------*/
  1463. const yaflUKFSigmaMethodsSt yafl_ukf_merwe_spm =
  1464. {
  1465. .wf = _merwe_compute_weights,
  1466. .spgf = _merwe_generate_points
  1467. };
  1468. /*=============================================================================
  1469. Undef UKF stuff
  1470. =============================================================================*/
  1471. #undef _KALMAN_SELF
  1472. #undef _UFX
  1473. #undef _UHX
  1474. #undef _UZRF
  1475. #undef _UX
  1476. #undef _UY
  1477. #undef _UUP
  1478. #undef _UDP
  1479. #undef _UUQ
  1480. #undef _UDQ
  1481. #undef _UUR
  1482. #undef _UDR
  1483. #undef _UNX
  1484. #undef _UNZ
  1485. /*----------------------------------------------------------------------------*/
  1486. #undef _UKF_SELF
  1487. #undef _UPZX
  1488. #undef _USX
  1489. /*----------------------------------------------------------------------------*/
  1490. #undef _SCALAR_ROBUSTIFY
  1491. /*----------------------------------------------------------------------------*/
  1492. #undef _UUS
  1493. #undef _UDS
  1494. /*=============================================================================
  1495. Undef Kalman filter stuff
  1496. =============================================================================*/
  1497. #undef _FX
  1498. #undef _HX
  1499. #undef _ZRF
  1500. #undef _X
  1501. #undef _Y
  1502. #undef _UP
  1503. #undef _DP
  1504. #undef _UQ
  1505. #undef _DQ
  1506. #undef _UR
  1507. #undef _DR
  1508. #undef _NX
  1509. #undef _NZ