From 61401600b8b0f5ea12ad9e01f8cbe2ee4563ed90 Mon Sep 17 00:00:00 2001 From: Mathieu Bresciani Date: Thu, 23 Jan 2025 04:41:08 +0100 Subject: [PATCH] Refactor magnetometer fusion and add mag_type "init" (#3532) * Refactor magnetometer fusion and add mag_type "init" * Prettier and typos * subedit and local image * Clarify magnetometer measurements --------- Co-authored-by: Hamish Willee --- .../ekf/ekf_mag_type_selection_tree.png | Bin 0 -> 37646 bytes en/advanced_config/tuning_the_ecl_ekf.md | 60 ++++++++++++------ 2 files changed, 40 insertions(+), 20 deletions(-) create mode 100644 assets/config/ekf/ekf_mag_type_selection_tree.png diff --git a/assets/config/ekf/ekf_mag_type_selection_tree.png b/assets/config/ekf/ekf_mag_type_selection_tree.png new file mode 100644 index 0000000000000000000000000000000000000000..27ce0e3a273ce28b06eff615ef8852feb70c24a1 GIT binary patch literal 37646 zcma&Nbx>Q~7dDC&C{o-C6e~_~mr^LwLV=>8l;G~}?oKHLcZWbI?(S|yi@Uq)O?ZFb zH+Sw|cjgSqS$nUwp66L>@10~0q2J}DG11PP}}RJJy9aMramgfq6Xwlw@;uWx5)Xk~9=?Qo3P`VkHe5$^jp70Ku4XTy>H z=jWTKxJ1sDTBvVjZ37N58C<}WiH*|@bohQZJSP7B{@$v7&&|~Xo0x0v-@?iLGYtvZ z^Fj0O{WCE!nMcQgg}v*_?K6QwJd}`Q%Yjk#_T2R|l$uJ(I@c?>=lfHl=(*?9;mcls z|FGzPhqpMyG&saeC5CLn+t-|_OMS=B!1B%Y(|gLee{-qoL0$WB=%Txq568FnN*IL#r?g(ek(4Rxhz|_CM_#pG<}9mqYQ`0Ol?;Ce9*JBvI;EP zIC*~VJ34rNJ`oNcdU$$nUAg?bcl#a*?q)8XS|2i#Aglg?^kz6bXY%BEw;DNkCR+LZ zL6fscN8|I|I%wz^j>E--mkfi=R5WLW*KY_%$mw!CzJBMK&7m4S?Oyig4-6hE7QWhk% z9JxKZzQj(3&rfHpF8#YWFW=gLBL#$y-dIlzE4(KI4)rux(Oo_~WC9t8;o%O)z{DJq z8`oECAE=%Gj!EOdDff3iuN4nRd~I~%E3+4wI6YCYj%-Zu(g!Le4oLpM9qNd(l4f7M+rHaN2*NHD%loxW-E|K{Nze!TJTgM{kS)h_n8RK4$lE;*yW z?SBscJ1h=!@JMbMpPJvE8yOuOFbT+a)0e;9UocASQf2!E z5Rww$_}x7p4qwLUhv4GI(PU$msS7Cm-)&%UaDIGH`N~adZkC^mQ+telfrq+n*{W{N zbZcQ;)_{Qa>!Imgjr_<8|kLbd-{&C3g)^vg&@sgUQop04j zVe2G3-utwQj*$EYZeoPy%A$DFPy6@JDsgE|(?|ZDvvV_n@8IAl;l4_UskqD^q*;Db z{_(cg`fjs|w&)u(K7Aav4dLv-Aa|1lrBjlwrJ8Zo_X>U~-yKetZzg0t3D~r;nT=ii zQ53wScyz?Ab;x4agcWlH)L~rI{88vq9DD3SgZ#F-GyJwWbHtU~0tJ%4&?lDMWv%ZY zMEf?Ut}ZUT)3=?|w>8B+WqoJBM++4H|GpIJDE}5vH1F@W{q%tW5aSe?L(&Uhy-*=k ztzj9YmSR2F)&428&#X_MOMn*mbz!}kQwe-dh4EI; zmU(sP)_XGCzZDFVQuI1n$>3jQSw@0v=NJV1tc4_&KB^Xxa|3CEAgRuh1|~8>m9|Z$ zY_9Qo+bgpl)?agDCxIdU{;f9W)mjXaAww*H!daU8M{n4)MfHp{$37RNuyv6PZY zGaRU@N*jy&3wdg_8N!X#F9BcBMcn#W>TjGS4VMq%;P@DuyU*1vKKE5NRnK zIwlKe)(&n-)i(1vqYDm!|$&wb>H-cZWW zeISqy37bL|JnUl-|FOFjLCYa`iZRiH76Ij+J4g@3HNxHXsi28Vaca zZLy@QSY}UHFM^taL=tttENk4p<;R|0+^$s{ok<+NlloSq=Sy)0FclV^s5>g~|Fjl=6pxC%DM{4b7B`uZZMcZxk z#UOdjn=mC)@uSq{*$V1uW+a~&P0sgP_3l3o`HUl!#5)d@I}*)WNxVTcdm!|_7{x+Q z0slBTx_m|^8bacn__$Jn{z#fGm8~L738}1}O^mmRA7p}i)9Fl*(h37raL_S_f_%7b zZKZTSNo93xe)Gy_eDXd;(1(uRGC2r=I&rekxM3-W?T`sNZ@1bcg?DF>B5{@LC-}ux ze)KV@)TA=@b4!8-Q!=5F84+^Wf3gWEEGc8O>TCO|g8+#l&r`+5SuDv^y8hmpk=u#LwY3y*QwF}KF#S__I44>G>2Wd%(%@VL zmz-kWIZVyfEW7EpCL}W3SqW2 zaUhfa;13&ixl_iWV`%ZY{(`K23P#-=vX&7jPEy@>>6b4RWvPg%HHu5&APxS&=8&_M zuC9dDC98zVXAbj<)<^>fTe;lgq||YVfB*7#C&WjQ-A<2hEu8RXlSPr>f;|-4Dmxf* zKQLR?LZYW*hK=rQ{}n9M3id#fT8_vqL%h6zJgZd-r%l@U03>db}j4~#Tb0ZZ_tGnt}{ecNa) zTF0KYxLTp>pD1=uJbHg6Tk$JNUm(uJj8wDbxl}aJbcrjbFK4DqQPiD?M3Q{~)$`R9 zAoawGeRG=0n-^Ow*k~5Zge(|djO|bi6c%K(yA7sM zqo6Wq{8$jQ9q_IBLRJXiD|;A$+vL>U3bKDYK(5YN2hgE&W(WNvs20)DJ}LE7^lDA} zrN~g5`pP(TYNFe@3CE#WW3$cceOLd#!p)|n=5>Dhqv}|IT*N2a#yf+3*+!Y2mK&ls zWr@H;lw7Y_3DI>Y$HeD%JDd4g))C^({W3O#?>OnBsCHCt{nq0i-aOlgFwRNXH~AMK z3?8BG3JK{0?noM$ZV*}=*AB=U@A@P@dL{gua<4pKA|;VLY3jtJa!fZ*66qWKsTiJr zu4F6mLk#olyR4`xPiAn(-D%7_yCzpB$wQOF&oqO#i9p}R_TJBt3y?zlTWe+e^tcAz zd4G+hH^w_WCTBy0Vg&cVqk;)LCkrDZ}SmrI((J@NhP|X!PzxdtipBYA9{eq(*~nKVV-F9)f^ig^Vc(D zw<4@ic!By93GQucqBE?EQ`3Cwa}PhQfQ^zeA7TmL&TeYDfAVzKn9WWcj3OOs+}%s? zZwg8>?Og`#Z`umJJX?;22{peOMT;w;lTA-=4(98dM^IA@#Q-<{uBbX5-7 znQKV$%GiBSLf{%<-8?QvvCk9$bj}QHbY2VnsOuqKK6>3!k9%e(Id&j^}p%V);-M@9gL4C zab3^1M#Uu&;ysJb>`Y?z>myon&O@8B+Kb_)1qyY&g2E*Flfe`Ct0)%?znRE=ri029 z#2-&YFFOW+=Z%uhkGaW5`w2O5Uiqvw+l(kXxl)&@DQd@m$HLEJIS_jSAVO^Uz4TJ) zIlDK^OKm0ZL*BJi=sf+h-~7#PE={*KAS~nfBRG(V3)D@#y0X2Nl-^$|d5aP&)km^SIo7z@(!9csKU-^RX0FmN|p!_i$Q8K>s2S^JS8&20iB z-1s;kDpYIY+jqV@Zr1n6Ohi%G%2i!xOu%V3g{VL$Ds}`IEZU+5p>>&m6v|46sH@Pz>$5|wYLh68*8FcUK zD~I1tA`f-QaDLvRf_Io0yT>wiTML+PpZl}-a3i5WHXm)h`id70eYeJgWF*d<;PJ~KrtV|Eg=avE^Flv+Lom=(biq z(xFtYZuAr+AlQ6%Wpt*>$*PSaXmI$3DUuwN$z=Qs7$LFx(|XrhafO$(Ts^V~n^>|M zNh)i1g2Q;?!Tejny1S{RM$TTtlxClB2C1kl~~YS$_ZOV#wSXu;2Wkeza`& zvpWmgcuoz7!`%0+Trt1pxSSjj@2HjTjAlah=QI`TN-No!d&e_^unIl zg?SNzvfW@6E-jg>kme4Cswd8{Dg7+``O4unAI@PAAUt|0I2;jVv+}DK0zGs3`Rua- z_f;G3MBM?TcvGMtg`R+)JwPEtBwq#&Z zJ~-)~=UPtLmY*x4GtGGEJayai9lx+ez|}@waXQ-^P&LIT$q@KsfJ&gclEI*1)vcz7IDmXAMM+Gm!Pe3%HCWN8y{YJbE|$@{&$62fk7$ktrG^|U=C zWRgjW@Vl%1x^pLgF%N`I6gsjQ&!vX2r!O3<)glg}i2t{L%3GCc@AR=E`lCz5vO7f? zy*Cq+#kPW=P^;H{)OMSmk~jdXTGO$nrc!qze#vv_qVR6yquc3~OLPdA9(EK{mD{p% zWX>#curCL&LzV9FczPGkCkRKzQb2BIeQm9vh2Cb3;9|F{G5(~!cTOG{wPm~N+l=RT@o^#aSi{QO0)jof+a~I()&wyBxmETuk@0P+RmF; z(gY2H3>a!GQ}oihEOi}v+=NkjazOq;x5_T1^04v}G{yC;VtHveO`a{Cj4Ebw1Mk4$ z3YEVI^Y(@cG&#{>Hm`cJ+NyZ7ZK0>AFx`AIs~w=lMkR}r94mlHbrFtI+Sahbl!;4K zEhk+8Nm*);TnC999y<*bE4^E-#W5oL`k3c(b$|o@5(S${arw|XSem_$=9nOfdO8V;6_<-HwX(ehU%MF#OMm~IqI(7vh9_JfTox{lVD(> z8*4<0m_2RI7e0TsgmHzXByAt!(Rqw01FpjL&l~uk+X+O^6%)*`{FqId%!uoX*)BU( zE6E@(O~uK9DvkY#%#50gdwABLuLiQ`K}1T2r>73JD+2%*-op4_R7jfrN{ZdXln*3u zfD5{X)AHZ#1U-V2q@&u(yF8z%{C7uQdD>hy!j&^Ptp>dvnP~dnmw9h5hS&irY*Lb> zdy4=uC@M@f(|%0mLWRii`eKn%)f*}pBekh26G-K%c(d}W{NkV?*Oi(g@CWNNQhgG| zYP1RH4e(+9!Nhd8AQOn;Ro8*N{kgkU ztJ|@yn}TWGsFpo`)ueT5U!`3{>DZyGZ-uGSVm2q+ISYNcFs=Oi*JF5VoYWBsE)-(d zi)I~b>7QPsmq^@w5tEu)25>E-g*K9Pv6k7=sh`_GECe8GEVPf!6iDp^d-xvy`Zq+q zE-lo6hv~a6smQgEb6Gq(r6|vj!pfwdzQ#<)3?Ns zF8#~^JN&G|E3>amQ1lKiP1=Xr*cgCZH#P^L$KQO@*CEo~1ho7rTXm^ls`MPXDstl) zD_K2md52d99ND>2*JY|s3u{I>k({H0wYVKmF)}_OCe=@3+Oz1I)KRZ-{Mx(n5GyKN zd4pS=BU?N`wC9nddwEnqvm>)g5r^^WNG7T($IZ5-Q2#m z29b8^@2ctZWP9w$yPZhQS`n0^cSnau*2`P|%<6ED-+kX-bAJGFD66(qBZzYAziOmU#xSF&>yeIlm5HR5g>Vu}x>CD*Y0uXT z=k#w?NZgA)F=U#jZ$&2A-Hi0(JI5;Scd8%RqBA1d8wAfV&=BpDjeMColD{HGWv?u? znsz?tunOyvke7Q_ZdMYWP5BPx;^3u0j$7(E19CD6D5x|`N2w`W?+3YknAv|)B+~OQ z#k7OCuet4n_ZpapML@%Y>w!{@oY$K%bOyRC#fk!Q=WPU~!gM_o?;W(TOes^N{?K`J zUZnp)4?`K>bz{fMUt)aQejs!-5yigAE_O1XOy>*sSx~N12@01U4l?u(>Wvv5?2KLz zYplSbo7CHBYT35i#Q^^edY;no$Kvm4qzrL@C$)- z!vSgaUckG3N+n02vo@;LZ1lyqc!Ty-e(j>OhzzbO!3_uHDzFUkL`eY+N zIZLqtZILx1ecH^;YLO>eS?A{^tODrj-&ALI?bjpJpK?auBr>u==MIx{Q9<$cLb7>f z)0s+2YePFI5=j<~HhDfL;Aqaz^lct-eAHM8)uLv&M8TT#$-O*M;+@hPz@N|lmYP7sHhc_J2pHl0Z>7VD zg-O)YLfO|`DL?`wz=lhNNhiM?mkUY~0R%Ovzf1k}lFH{thy=gt>6i*f1cH1(b}mf~ zXhZ04zOU)y9#fuo5S)gVuQ7@-@jHs(Nc~*U3bJAkP#a6l zKL3XA&;{-(psD(Rug^#$2;c;nnAf^+y8LDo3bw(U4doQ(JFGL{RQ!5m%6(e6>3k?= z^NJZ129c1TWLXl+4`SAUu8HTlkHKJalYc1NE0H+0{t;1swk)JHxSr}T7T@J8f2-AW zMC<5WdqoC8%a}~>^EAa-FL4s{k2uZetoywMtL34l34QzG6kU5(Nux#=svw?ivQaRz zVub2XeB0&L=fB+%kSmJSLHJQ$bkT*Qk>gwdz%#fPedgaD%Dd6c3;5{me=LcZ_tt}| zy+SVZ#@_UHa&qM9*3Tbp#ux1wf+M3pEG_?=cBERo+7vLx($As9n8InAC)%Il4eN{+v;M1Y+J;To;`8`obvBHRf^Uoi`Rd|*G#|GhAIa#~mrT(6?QFdzrr z5tLm~k|-dkMEaH(t)?2vqjxsfn=C3@z>fIE)8;g*u}`JFh2zmNBzXyWjmDV;9k>e&=WG5>%%O*w4qm0txFOL`5WcRe*em5Dq|c=x6lz&XZX!e zE*PbBDq9_KH-EqK!3Kl{ByLt7#uOd}tB0+QfOe7Ivhp5ka0PhxryG$n1j3(Kx6u^eEMIPE%+mB~N~PS4XY88AmzqKUoKoZCkqGp#!Lg zCKc8T!E5b2@6LGDX=Fq><2seu1d|GQH@;6-ApR{dDrhb*zdF?Yo1Z6$XCK z0FNnR#m0n2xbMh`$2}})433z%b@LrMXap!B0^k+@nk4KQQJof$_n1clxT(vfK1dKbXwwABke+VF_I0c2`J zNbWEiDPL>Oy|zwf(1hR0J@;%svAK*#f*1{|$*zPw{rOIfd_I9ASVDkDgPqp!@Lme! zRa)Qd{~HVPGS@eLcv;{cjc%DCbx=>YIGi3lByh~G+a zW*PrZU9znIl5FKK2_Qlrf2>@1zPbJv>voV^!n%{FbURBBs=(>~xjFP(QbdC@mUtu? z#K#LofBw!Y5fqII*e@PyiX>xokLP94jKP~Z$l8JSq|~N3M?A+?&v{*Ez%3LLKIF?7 z68bBQ>%6$NWzK+xAhO)583mRg`p|PeeYC4FzuZ#IP*nFAaCCiKf zH?j;EY-PwqdPUQ*k`AN&bonc={U1 zjVAJJe0-pnA~?$LwUJ^^rjDu`iYP@0*26qan$@Ma-@#S1`A5z(fkO3oZ|LdWhF zsJCaeo~h^eUsXNy)-!8IqOTuD&xN<~#)~yBs*wZA@O>FCvU}XXgaWoy z+15UV=g;Iad(U@K!_zqNb*6iP?y~gVI6K)l82x%IlfyOpG4HC?@Yp70Npua#7q$y32eMQlWsnCzjNTi3>tX5(O_C+N7a%dzR3e^Y zTkL!#z(E6z`PI&E)o-Ck1ja(yEnpBG*P+3%n;i;N=FFD+C^@M&B3l*zUQtiAp{wDX z%t5V(OAf|x17kqUGOFpOib&-+w^q0Mc^NF~AoX>IkLTBB{8eEf6cP(4m7uA@OvvOH@=DK;C+4!yXij zJ`pq+OG=UP|DPL`m$p?{xp)`OIp~*S1jur1H~MW79eNm~;*PHj!ZsMuK^y)ULbJsz zbt&u29WG(_>l+?$GwhQ$A;~M-fLEw9VaS0P{v&^)VP;%F5Q!w%pTC0|!-$u}{EHgK zHA*5>E4#18u?#)Max^(7gLC1Eu^&ktK=y*!cARQqB$D*D0hcxf z$`O*#PB@b-CXrMpyvLDN|CNp(UalwgA5n!hOns|0)I^dpg^0pruAMl7PN+J?J0yWD zS2R(7c(dyLRWRMi(M@%2eChq`daNOzJ2cH%IHhCibH98;x=!PEz)&>d$RAXd`% z&0=BK<)fs*LZ}NTD`HExaYyKt+|+GQ{oq)j&~d_UV0sf8(ZNQV7)qnV1hT`A;aZ`G z>e}7g#}GoJqqeYVd4?wr#rw?%e6=D51?E3nhNXqcDTE44@(aAOE=OfY`FBYA1IZx} z0td`u{si!Wj1e>-IK0|H1Hw0mLvLYb*zJoMHVbBk-DbX+|2O*L`#&pm5_B@m7dlBh zw5;|2JPQB~|G%*R|DtbAfh;YWN^~3fY*!3pU;twGidV;W5_p{MQDg}W6I|GF81>U& z16+G%?OB6-K>c7dKbcOB$ML{XI>8_GP+D!N4GmQ?ict$6C(947JU#WR9|n?S2+^R3 z+4CS$m*;If#~DQn-u2R{WL`WPqv9~SM$=PceO=pk<%hF*y+0UWVKy4UA+|$DFMhR< zKA22?xZ?x>Mjy}p;#o^EZb^ae>W@6M93TM&WW+E%(xe-YnR|+G&ncmB zzmixU?>QvWL-frVp%Rn^&Me5%*Bu$&K*oWZe;+kESo$UJKSL_Xb_Sq~$C;b}g!#2w zSrFC=sO4`XGfksXAB1JF2c<@%OD~hz{ut5)YJavh9P425%4A-1axgqw1Z9)m4q3H& zRE8N=Fcsi7Xbfp&GAr-x;S`$H-jt=ZGsYtTK|YYSiHKguZZ>jgtLQw91{VO&*NhBR*lG!rD=bpjx0hlv_6{6cY}99gt&i^# zO)W-p`)7f%O(i)6MRMjj#ON?ugd&L4K!s9Gv8|(Y6LfG8v}N$${?MBeNtI%twRa9H zhcWbGk*TMg2#ModmEgQ22O+s2OoJucsl5V+$95K{ zFVxNjFFE?ynmd8X)0*!F)Lf~Zt*>2we1|fk6b->;9wzDQpK2aCGx{%2)5>MFd2;Xe z$Q)@+$U<}J!tg{kG*$h3&P;Hg6?^aT9$|eWy-e^MD4}1>;1Ite-yICa$*0O-FxJ8S z=)~Wpg4OU3-VcDeoaNYhp>A~;BG!>PiBQ$^2+W}Z1y)7cpT`M#XKLszImJTx%@d>t zMBVDT@o%A0^dT$ij+S6P-7w_Mb@T&%sW&X#|k zw>j+On?gicpL%^i`c4h&pplk-a8~N0rrpCt{hTB1#twF*$VagA4y?IMam{4r+a6{G z9Vln)fn|!Hx8`8-L4IV!(B<}0;S|> z%5KSAqsx65AJ=o5m&AKm~&jW^nD8P`C~~jK|@oQSa-{Hz_8O0`M|xu zor3Y|8**4(93?_Q)A+JA-Q|z+stLQ>ewg0cZ2a^JZ=6*a2c3)eMvEoB<%u?~2=wG9?X4raJKr#eCE(X%uR^^ugxdMWUzkxSlhY zhl^6Fm;QWzhf}5>)Ks<0RN^)j^0S#GcQO0+WBlVEL}9ymuAg_T^yFJ*3!R$BLJch} zk4$Eu^4Z-=xWexI1W)xPUzkTtw*1WBu;ch)S3?^n)|keh6)z3_3YK&)stJB5~#-T{EKUx65Tam>d%z2O{`5yp5e`@DrEOkpw zPFQ;d{6USFk6ohC;}l)`AkK7Z(kbuQT{e)eo&B`&`ti%m>^%LFoBX0Cn4&2!1AiJa zXKKQ9%A=|waRizA0saizGZMq23L$|l4y1{s^2KJ|y{g$n1saQYkh3%Uy@A&F{ttg; zFG&qnAhT-d!8{L3g*2WAMHdcvUG~nh1TSl>a*|P@fwK;`_VBB!Dwf6ES^m@JCDUhZ zK$*8j>2U%6X0_v9SXo&H!3;tx8?WZxcq2f*&~#she(eB{zDSKEAp)x7ke_UvI?uF` z+O~s%b+++|LUsc%j$ODA1BhKlqMA^u6bF=YUOm0$99I=~u9e{+gtBL+fgdm2KIpHj zb{VEB*Hwy6=QvtzT4l@r{a9yPwF2(U?szn7_E;sl<1)8yPD_Hs-N>~Hi=qFwHB83P zs-;`#XGOE7XE?OF{+qr1dVD>8dm22dS(lJz9+aK!F(q)^OPd32bmf!q6rn26tR!D; zBKG)B;_~`$*g+<}gR|@C-KJgaeZJ}{%t``NvqIXGbxtH~W;04|>1f3sO`a#B2 zW9A%9smkwbp$ z!J{DXgy6jWYbHA|jYw#xp7X`**QAsmnOO)iUMWXpFkJ$7f(hk=?F_OQl4B*+_b{ z>loI6*!mLFdMq5puO!; z-2E2S@dTkimV+|De^$no@lgIM<9*Z_k+zrP0m$53uB^W{r7nFF9(3fU*yceYM^QYv ztI$6rmId~ub3g?IFniBzpa6@gJU!%8?KgFejkoKcltl$793QXE@h0B^zB=8+%46jI zG)>XSi!}SdtavE6#6jIbuo`COa$5cOVRBK;LS4-9=a0$Zudxm3ri(06SxT7>GnW2* zUW=y%gniX`$jWlJrc)z2F7US?q_)Va?$C@Rc?c>{00f6 zUp&(=TS=}X&I>`HI;)GDcQAZ=JOi%o$ovE+j@{?xmMF#sEv^PV=Qouot5I2W)k2&= z5$(p0(&x>+C|FZ(aygBq7spvuux2$zX1b@R!>9C=rGb`@*PfVBzDXy0N4?G(>jpW< zsIoj1AGu=7s}D(ZemTx*Osy26{JhSe6p63H>oqFwHa3~q-186*h87UbCou3E-M^K? zudxso?($z^KYa4U2v#%0%oZI(@S84Z)VnQiw^3NJz(vr9PbG2)A&*?bL#-w;OETSn zoOaM{`s*f0!0D8qQeU6%yrBId%7h7vaY;<26NNmIv*Y?4|b;~r92^q<IS4wu-vE!FSo6p7drND%N zN;Us_SBHS&4`guI+7iBVr#;r{a!KzGfx4sz!HvkjT+Ux5lBOId&(e3ZY8o!{i0w7G z3eq_*c3*_nMF+b9LYU!5M9B^!V(^PqCp32&N15iz2Jr%6ZSO2#J;Wbh{P^#EmKi7D z(2E$(#Fz;=3zF1N=e?`-X6~KAm$|E~PuqvAnqq!{cFr$SX=zld2iU>0da5gCo$w*| zdKORN#>H%bYMnL)Rjl;?>+*lr!jmoVnxWS{TgBdiuS;B+(fq%A8xs`ykpV`YK4-fc zqWGNBpL8g!psl6d5>RV@?|)=EaFJxRsaAg@JCz^Li%@TWLEl5Ii35qyKFt)?C>VyT zyJ!;|D-FQ(1Nw~ppbt7gjJ zxWzQ2xx%CHc91tHXmw8+{Ufc6FEi@b#a?fhN;x4zQ99*TF!(h&w2KGEK(zT=VchPB z)^!LNlDc4#e@AB33P4^mKnA|-t&wG;T3MzBF$<>_lLFVqP zS}`dHAq>C*E-terq8>E6Q&824SD3xX1%zGqJC%XWIvQ&A%5AoFI90+s$Xn+nHzQo} zpkh5#+2$W~tAo{G?(akS(t8Fk9nER-K{8a;54fJ^&!Uc+oLo zb99~F$Q$YNOBS|Lryev3^}RN-Ct}hIf)qnl_r4gXZ>pB5K5WcJZk+S9C{3bNFgi^# z0|5~sXMtX1IyGsY6%NGHHEyJE7W?09j~#~3lVXjZMRbia8+94qlJ6Xi!gi4HVqAk? z{gaR8_xpsXn*6g*i*Goj>YTgHk2epcEzPy)xbN(?kSlOx}nI| zCzYYlrNj9aLL3fn&urO^agJgwBCAJ_G8IaMZtHdbU>w`(CA+inj{K&j4;C87w%cHT z%#!x4X+j&8%5OE1Cz-It0u^O}Q9ga{fWnW#>lKbWt8HJza9-`-j`Omfj`D#(g;;Vz zFnQE9Icg~Kk$K*B!L#Z2lfgqW+(CoPt|3zS$-)jf9{eS3W-9x-TQSpF>^?aO-`HTF z|3E?0`y-39u>TwM7VI8Kji#g;2WYl`yT}_c$9uY5aj|dk!c~3^J&JkyxH-8~jjpS*Tv@ASST+R)}|r5DX#D~94SrwLT!L1VW2GHbb3eu~Ho z`yA%(NNcl6V$HNZz=bgt$^2Dt{Fm>$ob*PFQplFrbk{iYn}&yFy&5LzpNsBt?l(PO zJz8fy_ZY~(>w)lAaG9ZEG9}t}mw6uuU@ztMWE6p&X>IaC_z3FGFg`o3GaW_KIbbj1 zLT0*u;=x)6flHHr|Ijw!lMMgGTjo|XVM=Ng^!WDV!QKIc z=2k7PRA|}2D;)&-vP4@!LHYNB-QX?|^%B0Vp?w}Y)6YW}E*#z5+3rB*mQ$|piB@aD zvw^`{?L<1qSj`h;Ta&?2zNP~K^^$HMQ=lJ6z&afSW!bw7J!hN9Ex3R%7v-+0jWUU3 zF0KCN0I8YEwGPCxVexS$I)jK{2wdYMAEoFJw(8TSW1a$GeB7wLZ zBKsRq2up+Nl)6&FQrix(&1kf?eVKi59`5JfbhEN*QuPtn6!D)LXbx*1lji@KptQ36 zsULPUN(Ynq#^#lB^Cmlz$OtnHEd>8GKYQv;v2)Ao&hLwL15s^94OKnGP*&h#J;tN- z(Dn%n^Eh+>duC-&>r_9{Xb+=%@5SWC?x__2f3&&?SOlnlQ?VHf>#@9qLjZU)#^ye- zhVZDOl2kNWRiB49P{f56vTDvnoo^#s0n_M`XcEx@7FQ@r2YGyij|_sB`m96o3MJfq z|50RwBx38Al1giWUW5{uz96@dH{@e5%wBW+sjMv{;fT5F6ClPQUTUQ|XK=_+u#o5o zIQ_CQ^u99{w#BHPtf2)d_R#dWy#}P8=2sMZ8p?8@e7hDJP`lS5Dao+$H>Tbj8(PsT zKUJx_AM+Uf_~i=^MT@AE#_FY2)yS3w>;q)S6xfXCBFp~V17F{@E2W_(mHF*easPID zK&u|nNPf*o!uSu=*G1aVj)tH>XFLSHfN*HzQENtm(ZnJM$O+r_e{slP_v3|-=Av)Ta^q!hq}F6)!op*`n7#`|LFqV~z}L@!HK9h;u zZBY<&IIBYN|Ay?&4J5vhHT}-eGXT7iiTR}L9i4Z5!U&emWEB3x=lGZWuqKF1z*+$Q zu&|pvYD-CNYK8blSzF;CRDWkg$K14*>|^Bv#lvRFRuA+Wi~^}rnQCZwOG&2C{}k8> z)GPUebBlfU>4+Z~W`~k|hGP5t6M2j6Ix6RJYRTq=h$q;0@LRX(0wUSswtjA=O7jr; zyK$~R0?R~6zJ*v%= zQIWG-kE6#Y4~UK2@{)5jraO;{b2QMTxYgsNiYlRJ6u2Qc&f+W)VXJDp%<|}6<6@9u zc0{dz$JSFPnCbN#zq9Fu0PZr&)RD&1Y$wp9%>WbXKU&0UB67H86>Z6sK5ytv76{uR zCM3H>+D@IG?eI1IS!&ofTAap#7|^=Za|ZdOdT4<7q)9pnG}}Ro%D#KdzdX`nRj_)1LHj?COAv-ENn7 z5Z>@sy(A5t45Gbt*Wec@1V1o$PI$S7xmSbIaV0>Q!<|zzQq!a17Cs#8?yZwd?%W^7 zwU!V~)krL5^9o=CirLXC!HO>GA1~$;WlF*TNZmdy9;O6evr;4hJ>82~-mFjDu3PJ3 zK#S3?iX8i^^knrpzn3n2LgG`VF%5yGO*{NR!Ecz)Fii|+hkOT24 zMz2IAFBW-g=?k7eG7L{ed_&>FmzatAF1d*|;nuj1q_8RtI5CyRmj4z$QRZV;)`O;e z1yGJl#Mh^_El~UNHW8fdh(QROms}BGR=jCY0*0LA`X=E*wT0U5y8Nx2KcC2KtEkE# za?z^6Aa6!ENL}=+C!`~2Fk=o)@m$Qc!J5w=cdT0-?-(+JITWW3(+{++N1z|Mq=WYh zhLL{s6$~R8v9-fSatEEMPJS1Z9~vYzbzlwIxi;g!gad(HH3z~Z_zjE*oe-3?;~m5XVm%DA}5zYvyypJKEeRl zF#x2ANP3nOf>PAH&nS4x8&0u0wcg>sMEni*HzQYn-q$^@soflDKZ|}dvMvV028ykJ zD{Qk@bvIxAyfZA!@Dl0ffJxVL_~1WPh6&tXh=FJ{Px~oh(Kb;5Jz#G^WtEF)e#e)w z%`XtTfMO?@^8obh_#f;4BMsF0|5E4w%Jd2#j09aa76ySE&DpQ+W(3nwUa<07<410b zy!-Eleo!wl(4c5oVqI1=|%ikbNfVO zvKLN~4q6I`Z(g`dsg3!(ET?*$kw#c0!J7RDZ*5?{OhmZm_5eu~*EcW84^#;G>K4xz zt!i5XgI@?l4eM0NWQP3>k|ib3Xn~7HdLfcX*jiCM05I(*Krc2`v-aynfRTM8+g70F zb3Ta7dQ%EXR;z7nWEtvw>7woT<6t_qN0BU9I?e7WE9Z598Oi&Xi~#|I4WO@i2^o@8 zZ>kyl=aGr&V0NDFqEb_bMpD1>d}eRiyfT?mJlRHK#+M<--Pj^!>x<+JxU2pa_x+%3wRcmfukq0k?KiKwcEd#0+bsR#04GA~{@3R;s1!i4EKm!{r|Pj``9o=eJ* zQkHKtE-3Y)?_9z_1#)fUc!E`yo27!N+!zd{q4r*`Z~c8Sty;e{pBP{g2@|GJ(x{JU zJuVnO9;AlH-K`Fr2x>=?0mrhH%dD2=y?zT*moqs;#pMpK<{eWin7wNx-hiv z!OQ+Hfs%r9G&eiSeTAk0c1?07VxUO!OOD&BFNpT$4orV{{>qJ6mggh9lY2pUkUT{1 zY(=23n9QQXBNmMA#0^`9s!Crk{sHtr9T)O^V%Gs^_Al0{YP@NgS#_v*dk%OGHksJ} z9nL^>R8yUr)-I-76%DyD;48kDjC;i-W4#`41P;VMfnPWL`H$+J+3p19&_{YgP;d#| zjtf=f%L&*ZE*N~ls;FI{?A=!9i06>0BlU9X1D6m4-Z_}blqg~IWT#~6rv-BS7ut^b z!!FB6C|ZFJR0-CAaU_`jMD%pM{x!77_M6+5<8osn)vls1v(3brE`xs2$dvq604i8N z5$VGSP6eJ0%%LnA*1O=y$#bH^{C8Q3-Dm_F3&VElb^?f?yT&FT0A4#sSr+QpXXY2R zy=wwnU(BE{OQ~U2)qGNjxBUNUt68$VdTTc%X56*9Sqf8?r~a?h&+}t!MsvdyV?HHl z;}P%!JjFaEwsoFF+#l=3q<&ToMn4QHd*u$^bzBbYzk6v~jRu1^6Ny=fWBbn&OG_>F zy>9xgWm?DgI!edehGmEU$ol&fRER8xO;n{Ge+PejKCLpfw~qH-nKzwmxx4@IQqM^4 z{XtZFn}E!ua5n z=g2;%?@46Ms9XMMwmuL%>zc9`(avA3My1m=t6jbB zp?mRoCI$gT$d0J-{dw+RH0{@Mu{V)oNjhm(Y#TLC1Kjr%nqoGw!q5CwV;V*av^DV}Z*ztufoP=0-d2U@P0 z72zhQ_{oEi@TQoyc`Ig1-G+1_Q%ynEX@Kt9KOxfv&Pbls{C_Ebl?fgTBtXThxyJx( z4wb)FA4L$#q?=#?cR%QQ4lcD!fkxBKyw~R$_l{hfeezw)Pxgm?7?uvMUh-yti2b)P zM`@s);=W`9Qcvy&Cd7od2%- zR>^??l~)MAwJil;WK`{5wD|nW9{~uOWFYp8V)~QW`V>=q)UwU(6CBnr%ODhCXoM`h zpD)~rM)N6Z!-;%?GMql35usITEbHL~MbGte5Ue(e z=#eQITy~cYl2$sjRoS7;>730}KXhDI);^uwmZ>iO&&yj&r90K6WMY?{OT+_&rB7HI z<5q8du?axfznOpcWFpTBHaW1%Hh5U3XUy!KKd^E%fh?8`Y5P1_3I`dg-=^_UJg9cy zHj7E{bFUd;JmA~zho;vhjCk!8>CczCCGcz0mwEiQ zB@Q^yAbGVVcp>HddGXCX?{YvKc2f#NlQg2Jf^_<84Qxoyit*`DLiwDjzn!#6sYPz#?E$^E9cV1Puq9J=fU~rvfV?$Cxb`t9HGdGWzuvb-@NQDDdZV< zikvLf0QH4OE4)&DgkXQf={MxE{UfBMOYM}Pp~??@E7)&J@F!wphz&L1p=?S&CZyAj z2#yeRAc*n?izvuq?hI4=loTn=x^~&I@L%{QV555cr5}T}fvn_5=jJ)==3Ao%5(^&k zujrOca!9EmFMTh6dabnf%B=4DjJM?z!+6_{{`!GbkcINRAoWm)U9f5JEdQ2Lah&KR za>R($YGy{ksenEEt?g5LG#2OxZ7eX{5c}l*Z?_Tv@>WW&SK|Ajj+;>cwh%@IqHAXP zz2hcB8J*p%a*ehrONq$~b&NI}=blAMYPh%7@Q);#uDTIKAsX+<1O-kslz2$a3!R@N zMpVU(Q9L2mA9_s13dHY>-G`Qc*@gb)&I560cnkP;O(2o%!}Z2J<@<;MV7=1mWU2bL zbH=X%?RgBn#-~B)eOE_`p+18pJ(eQdOQ8Fazl(E>W4^`1R2d*AnYjPu*t!IAzThh$ zDCId_sKB)BOC>+t;`E3r{iL9vt1xU`uKLuvo)2|g>6dYqfQ3JPja3g2 z&Uq8h5)CXBI!R?`aCP8g%YwCg$Aa~S_q2tYP<)7lfK^- z+%_X63aZT$Q@`w;n;|!0SvcV8&9%iu30>{&eVXJ<_BZQFQ?*r&GS|7-AMH~Lh|r=?;T&o&o;;>hm;dZ>l=RRAnil;FK1`L69jJ^Kv?6E6 zXMfxkSkCLXjQjpZ1NtuJA0Ouz44s7H4J2OfEa=~B3s?6HJ?vY*wRyu*O7%&YFQSqj z5?seM`!=Pkjv-~z96(KU_n6;H>_*PDD(Q{zSIlnUo#--rU}K4vOYXI&_ghaVh3kWbE#0`+)bAVF zZSqHIY}I0qCyPaobs$|(mM{?LD1`i{T;0ZI0@K~>p8-x_N(+1ZoAhT(^M_uOVM@Z> z)}z7Eu8{srb^l`7R6xhTmi=LrFAK@+fG@-ZHAZgg0NkIh!`+e7z(HBb9h4ZeH$c9;6EWt4TqNIn<^nKNL#@|hfisL@~>}& z1)@?fpGa-?bGuuV^P4mA~F(kkfblcey}-1c%Y-YH1yvY~{bkvG~&ea|I1}2CF%|%G|E2 zIa+F-RsX3J66p^6SVo%tggTyyEdTAKu+$=V8=6n)5_4_ZhH(B`BSTZ0+{sG~s3u?L z`t-n5E8&sRfBOKBmL0HRY2>U?saRu4#f8^@icU~6nFTdll7RRN z)vr+&-haqgvg39emZr=)e0NVWgRlnwB|&JpU8!Ly&HA*aagqjR@6}(d{lQ9w{F1!N zVwE@mAf}3{Dr5BNe?XAtnUv8@T1O29XvS+A?#4X)cQ`wr(ZGW}ys~N*YA;P|5B+bC zf~rr7L+x19Wvqgl*4Tr7{e#?qDyLUtx2jpt+mdklpXg;BM%R~O9VAZRKBt0cLpx z8sU|ka9Bpg??)W3xXu2_5o2LO6*yo8!vC#i5nxy23^y@0iWBPF&_fJBf3G^^Crzuy zWrVr^*5Ch8#^U4CNqRN@=L^1a<8CfuK11aDzr(;IG~31s_y2+9Wi+6sc>8|4zoEM| zB8u4dJ|+1Mw|zs)_%HkpIKbu4vQfm?8A9<%?uUq(=PU97Wp{#^n;go3k9@RYC?37q2s${oMQUbd9QP= zt@*O=TL1qsB4hQ3jLE0(!H8DPyPr4ehz`#@_c&86fCYTj?CucCDA6E_ozcDjnkYB7ea_r2p3g3}CRzy-9V+tJpHe z`*IbZvO=pAYs1=nmj4<@17St|&Dc%`F1?BG_cT_jtv^5B?mIeSwEY`uYz%3FES9Io z2Sn)3=G-&K?`PjL*m!1Q=wH%*{M-5HZMw=CkW}v~WK6C7cWF~{{u}Gx#wr^8xVl=6 zi}$Yu{J>uy(8pJeY5(EHxN$W1o2=#^cYypzbIgqYKtlO{)9L=Vg!$H>|D$65U-i6y z8rENO{h#wXG5=FLugpE#d)1iUqnpO{%kp|16<$Vu0KrBF<&AJDy?CWw;t*b=+N+H^ z2OAW2&u2OjKX$9>H+cm#_Sr=;&X;^>C^5b0QW*W+*~lHc`5jE6Lg8%}?!-cn>*aAM zRo9^0PG(>$gOnFI`Sw3re9(6`oLnCdmIQQ293L+Z5d6tGhrIQX6|@bnJN zRN1hwQ_U`fJRxqwdmJ4;mstgv`c27FfYa zXogIb54_vKdqTJ4Fnqk{a!-RNUDpV>M;0~Mcl&FWMkkMUt1aQvl~zDpO-WRFX0_+E*}%LNoQ@N`nG6KQc*p-@2B2#UcmTk+RduIHSO#tw*Dg!_n@QVLD2O zk#6H|%HO^EbBtnRK8Q4ooh71F7@_g6iXH!a2iv(t8;k@!9i;|J;n^l7nwd?lsbxk- zr|&J`pO?M8zWw+a-pe^aBsJG&^Ovl46#+YdTm)CpFf4T->oN;{tD?v!OlzmE1mnv< zma`TJ{?f}|AmBHJpmL!!wdMvTu_u|Lxx)P7kc!>EcK(S0J%X24-61)Wt|YF$FUa`w z^X)yAJVXCkk0yd*dV9OM&tukLFPVp@M#{b;y*9;o#GbcX3KNVbr*4l{3p#EFxAeBV zj#+u+?oIh4U_#AK!ac)2KlRxnzSue~P0zLX9C92N zcrBJ$W#O=(oSxjAqWbuUM@>R>yxGEvNQe!5n@yl}Ra2=N8z5Er@=K9kXUnNqj@lkT z8-|+3rj=^^UAMDRuZfsL6Ks?5`+%$;YzEGZw5-ikMQN2}JXUTT*Fk_O0^Z&EHl*ca z6gBBk1$=YL>mfmpI{jE|RYE`0Ju%;o~sK?H^n&3o0-vT)MD$^;{$blC^DEc3X>qkY?C$&WTd#=ZcA|6uiNOm5Ie{+9<;EIPlM5*aZuwB z8Zh|$dbyz2<~7l)LqO>3Dcrc<8j0lOw!_AMG{DpTXG+9+9sGK^?mtOo6M1GO=zb@; zvpPg1dk|IKlKSG~X{oz~6ii^>8v6_m}MQ>?tQ?Qg; zF=&VH<}$~{n|bpwB4wz1E>1WDSxCHfwmFuPxbsG|y!{m#y>dLZ-L?ILtLUQ2hi1cI^+ zBsdbVThX@t4noLmysRE>ouj{F^l8RJ1r{iB&oSSz`t72m`$*0+CfIr|0&j0Pw$xpDG`BXg(E}9}mR`BEky0u)Ny4@AmzhE!A zoRHdc*b0%24SRfUplno-LSRP5ak)8}IuqKKOj9q)Cib17iIVxbbN3xUi zwYmDWABC3_Z}Nf$^(T;U=%%#qWu6dR8W^zd4eR%99wxkm7+ytzkGQQ^pAuFZxifu`|zF<&XWz0iA0E-)wo@?`SC@ zoGytDXVfffP(UJjD|pBr1Nq#Jdd#C_#@9QfpUpQIKm%=9>f}*#zH}2Vd)Ru7&%W`h zvVTlKwa?XvUn#)ga}IF_s1w|H(;Bh)b52`htBx)&z+_lvpQnxbkYe*^#y{dM%oEgI=AmQ0ON|$@>{Q5F0 z7=^?go#1 zGOivbqynV%^)}`mG|>uJUW+JlKhSQ%QgBjyOZ6H1!}~fd*zR{I=30k0VV_cQ z1Bb&?)Mcktw@M?ydpc4`jl{9`u(wp^A>&&q((70w#m=XBU!9xYFJU9&01I73{6+25 z*sN`Z&XA*?{m7pE2H%EfQw%r(VA2!bYEQd0dWVc2?b1S8$aTf0-7MWa<^}OcNn!bw;uGJ%6 z%~hnU1?#LC2rppaBn>x7j-7UwT4*b*!E(^z0!h#>!m&0i?MOXp_n#=^XoKw|%A;dz ztB;YLbZsXbyp&q;iZ&3Wi<9=P;)F#CU-a`VL8MeK&#=l}A{dYPh<3L$Elr1kEwP>M z2a3j*w^S#!%6Bse64yVJHoP4ti(7D^mT@Vv^HyVyylq12bhv@2D}^+xq>!H3Apvf9B5)_>P;vGcH6p`}pg*|HAjZz|8!nJwQ4jHRx10c+ z2!(Y!=qrA}DR7v47w*xhHKCRt7V?Gq^c|=yIeEJ=@i(fJ!ls?y(lBRB&eug4#Ze!uH5rCA4fmb7QPM<}7-@A?1OR7QI5oRsNPC?VSU(&j<*l8Vy)0ofF7t%z2pu!i)2x6?ob@AzEY@VoKVMj1l zhX*darQQ8rnA$`w$XelA$UD)jzjAG#%G4>{YJEQI=jMsWGS4Ho`S8l=EL*Gd$f(HR z9ibriRmhM`fbVc18(kUkdoIcDYLun+aa3{sx{`q9`3%OW=*OCq76g?cc}mEDI&C00 z>?J?<8%;@CH_>9_g(1-Wy)i7%yBh`=Zm|0e8T#AdP*FM%9${N;45`V!?^xihQ`W74 zsy23JF~l-nIGV4fncWij9@vM;Lm2v8>-z0b@0)0RS(TY_rMSwm*B9g@0)a04i7bUL zF#z_cx-w-xa{(DBT_+`Xc;~bDP2#R(PW{#gtz0!C*j5B9voCv zm~u-+=r|_uW$qJbGk<$+f1y(?T=3q#Bkt2BC6_UY@oYLWX!l^ZIq&HY!$II^R^diH z*CS>!oBbmyfXEalY>bVNP;Wx0Vd!VRaC+qai$P+Zjeui#s{3Y-`_@P%U*n(VqOF&f z-0eFq)3ahr;p$hjkPo9x?+#h2oLV3{++GPAM;#&i_)O0+t>BojtyqQ=oO*JJ_p zIzxI3PTi(w1IAX>$or5)e~JuZ3eUV&nfxe$huoluy|0d?l{W3@q}rIwraNb05-nrlhRZLa#nxUQsmh?&O!3nr&nOQle=I$f)4VD3OPA!f!)$ zhnXNLwX*Sb-ru8bNlmgmb)qAT&zA@hja|%R6izZtykBIZN(1Ac_Z5jB?1)^opsbyOPNPB<7TNG0gljQ%P$Kx(el*E*i-b-e?Uzry(QGEI#MQ~H~ zVOwr(0bA>%p23ueb5dTFtqiHzAq(aP2YE&kUq`=X7LdGMepY&TT2*e2-o-|> zZ&5*!Nrb%nH~uP#Gz!hZ{;#-WDol=NrW^k|7hrIrY|qe{COGl@Qc60QZnzxlz)NT;pdMf2vf8|ofIU4z0=aM6C51@j9^qVmn}QZ+NDb{Rq@f^34nyMH>D zv7k(YVT(ovMg_0lZ@4KCzb2aSL0B0+`LB2OB?N-|*sW%!YI_jh0a5p$y??IjUWRU1 z{<%f$pMtm29m-OuJFE-)^J8P^(?GVQFUeMJDc z#zRgw05&uY%`ahUdy>rjpBn)u8Wa|bK)2*Pk1CE{QKWuBtsC=>*$txKtOpfOpI~$g z!(EzE*=GmLw(M%R@EmDr{}eWH#x~~!=Mb=NcuxEAk942~8=GaDJazY)-!w}HaZqT9 zpUE_$cdDHev*)6BPhJKltk|o;TR6)pZOc~_DXPY}-p;QQNoMUC)w#ORc<7_5bsH_z zM%MGtuTpIw5WVFl?^L{KgnkVDR(8J@yKz+SuT)9&%?5g6NQlhLT8raR=5@=D47WFo zNyaV+wd0qeuH0mfk}~e3Xw&5l1n$X{?I&z-Mhc*CiRUz-=<=}TDWw~83FnunmXo~q zx3{u$PE2uu*NvMb74T+AIbvY8iS}oddJ8dDv08N6c?-IC)WxnQtC#Vvw=f<+trza^ zVDXdwaNGT=Qwps+vo+q~Y8hMOs;|LjCMB>SrCKW}b3NI5@t$0>U1_`8wb5ev9U^_U zKT#7Oy(&R=IW4w)#)CG6-@zcw;H6tDUW>{;lT*U+6}3CI6UogOPn>~0hX&;dg-g#b zfTe40P$htZ%_pag6ACDc3FoC1B{5)IHm1R3^;2;Wo%m~+Dj2L~4$3q1v@Fm=k8fUj zRXL-}2#FrjpCsF3!FYAR7bQUfrYTNN=0E`fh{g>bdj5dNsHhaXhFo@N2-R6E*H%ab zEJz-lw0UF!4<(mfap^5@*SkWzo^Kiag#eOJGtIIg^B1O{iJ|QM-orF@wO^osJX`Ne z5={^Mz*^f;-r6eF4T(4;(n{N!z4nm#(3FpmlkrAxpL(N!_zeV>p$kIl7>zuAv_H|` z0e9`;5OFN@w~9=uT=v2}G)xE}gNUIUdnh2=dIH|@H~z(3c;NPuYvK#imxA1mPXk+a z`FZIwomr(n2>k%JweSu8`V=V*E|v8vxt+7xHu=#|f4*B%>a=P|&$^myRrtP;un7VL zl)QnLJkh$1nMBD!^vBIple1$)uc}|nbTK+HJ4AOv*9S0)?|_+(G5!FGkg#H&^X2t7 zC0B$rAT5h{ARHQ~Tw`wQX-Ag15$^q6>hXk8;PK$q#M@4dBSYsD2@f52yGu$pw6&NVQ_M&AGlZ@` zo^4gAuenLRma|MZ*+YTDHIBfpzC#R~Gp-{|?iR#95fma@a z0lH+!UwUsqA;G_zm_N`oY%zxRu7mG}K$oeoM7Gl03 z36>A8mmgd*#uMeKK0eAskE@9qj|KJdIX#WsP!G6Gq9E6bLIF2Yy~x7c6J2ZdHEw^T zlChurnfe|qyf)@;4ym`H>H>8>idKBH!n)d<1Z}C;5x-5>5Wq4@0--nIhuGW;!#eKn zcb>#JWsr+x1@BJ%iO98CQ$o95e|;}a6rju!ZLHmM*@t@{0$7OZeA1J^`9dZ)3;G+jf>mb#D`_;X;2{k5H-B*hnZxz}{MBhQI{r%3!`~qF8{gtj@fQ4;mc@s zoC#x0>+`2yk5)nsWWF;pDUuUnwA6L16R!{(SI!T{3_dh81xz*R>8n0_&ORmn;k;$w z#%yY*IQ`!TetTHiiXD=HcMsa*zSj?%Cl@SL@3iY6hYEUZ@~E@!Cvp=9%L{oL!o;WW zzWXxhH~D z#J!|;CMckyg&CdAK-D>cqfUhlb>Nu3GAhSKr7h6JNB2e_%F=rN%Do+5yqfR7%11|6 zf&o?T)=9N9Xn}hsjb0n)!2=4gHcM6x$i#u>6=XJiUceK@Qp<^n(@#vgltCn@j-F2a zGKSNq(y|A6{fGztv^`s($+ZMwIdx}iR5Y&TeP$5(%`AleE| z&hMlNpQD|_-Ik5XrHuZvwH(VD;<0nh{!5%^@{))4QWEd|jMi^jw#r}}}9T3d5 zwn}7tm!PW3l4m(}3cj}(>N#@KcAqyxtu}6;YmwH%f)tt;b;(l;P~Dt21kzsh|IkMB zxFK1Dt74A=4gszWsrt7g3%wZLf=43`pLlH2QV zF>L=`kZC0Ja!!jkrDjS_mlrqY`E<|x;#e8-+uET>SANMQ9hLlb13Lsu2*XYsn%EAC zlRHsWHT7P|tAIZ$+4A@%w6EH&bGE5x_4@I%fGi>gxeP}Xb>}QZiC;JI5~KX>uIe1L zguRxLuLFYD3NPjW2xB?~9pc7<#B3GY#x7^Z3;vg6j!ke|Jj#Kn8H*2hazAsvzc$0SXmh8o4L|Tk0_i%C|JdM8yGZ`ZP=KIcAUJiuVOr#ydEb{xrxEeg_} zQJvAQFW(DAK52EhtiI<#XAFB=$?9+-4p;3{(cSxx+ft1mi^{oVr`@D#nKb1z3&Yi7 zI5MuBF&bD6-{>M~#9`6-h_RHGxF?g&T~|0mvCo}lo4Ws9t-x^Er`?xD07lZ(iffA`qj4zu}^O5>HL95rb+Z{%zR57p6z<2;*kR0%U?NH}p#U5TZf zT@DEq*@uQMz_n7m8^^gMCr4prKFoU#N;#~x40m`YeXvqI2(X;J{W=Hsok?ea&{~Zs zUNAiP-a!QGijTvWH(S*m+5Jl=P>^cTW8q0F!{GRsY4J%(+{sUgEvAcbrhd76^aEfd zzGE9$2!trm==WO~ieqq@I|6Y;ati_sf_9jrz%MIJb${X zelP7_caFG!|DlCRPcPH+>^$w-^SljdIyL<8YO?sG_X(Am$i3u+b1+Jf(ihQ7YTKf2 zdTLfG3VZzUn{ZVzpdG_%ubEF-5l1OuUpoo?m7 zB(-`g>mVnpyx3ta-Xpx0wku=_7_{(?9MBE-A>!`JqZ0CW=NdWS?PBEyc5L^p-pb<; zX+&iMhC3ssv`Mg$s8JpqNijvmZJZtqk#wR)+;nX+NIymfry58ceJ3@*cplBi>TKZp zEUXPjoo3?Odb65|Goi3HHtaq71Q$$+N$ueHnUV(QCHcX}`(X;%)g@}4cIQL@Xwk=F z`8sH^vo!o&|5eDs!aN*@eMP&veXIrm96#xi5Wcy-R<-*rulIsO&^e;GA<&mZGU~7I z5Wv2F#_2V4GZ|Caz1DEX(}rNgaF{c7x8*<1A?*%+3535k zNn_9v`5ExVT5DUAr>v<(K!jV>jLr(K?3bJ$?=p<<42aUf7AT=6MZ?xSLfPdc@#3Et zlVv2hT`T53SHqX>3jet^reitD;={+FAiEKM9xvH1Xr;KL6jENyN<)i80Z>Sn7$A9L z{-K*r$>nuqIf|-DAh25R0RC4`Yt_`eo5%%MD#b3+?H4_r7UuzizElf@acW#yvLWx- zRa}3cJ7eh2XdMPMhaFMhw^UU>Z^%P@LSgW(q#e~vyDBlq_P2Zs0|2K8?R6#Edfxp0%d ze&t0g_1pVeQ6EoyxjMTQ)t{qd4KY@!Iicu;YpVg^A$ssFyR&_yJTKx(g(s2M2_#~c zT3PNIAF(>WffF5t0w6Y|v39kPaAYKMZSRhy68WqIuz$P=t8+sM&6NKt7#q5qwPz7V z*}x&C=xEERu7pb5N`TKqy=MGz8O{i;q(KkIO6t?<}05^{Z<-v9gdXt}7ss$IC zmC4))R+w)c)LVS%a4MgR?raVX1MT;P1nuMh4}bi*PFl1`HV5#rWEV5Yh0OXR?y(8n z;qP{SN4rtOA9kvUiPBAkIiSZn@8*i3Bz>S|h9rzwT+Ff|*-4eII z3a&x~^s=`4oMhL0<{F7Jf8YlPe1zHhB(?@XQSvvV{~_Gy$jJAq5aI|Xd^5k*bZOV% zcRKFFl%MVR$z_pF!j)3o0i4-*=og$hsk2{5Ypil-^FcsOv>c>GQ9|QA7bhgU=KjY5 z{~Hbp8Cs}hJVeH}crj59=&mMsx%KF(rX~zfA*A0e~bi%tjVLM_%*TYr0Qx z=66C};*yVj{EUofeM29_ATj(Q&?d=go`0~-HsE(B%&8>UE5mm&?{S)x`dfKHHb6E$ zhJBD&=MYW}bDoY78>xWFPo`5R4@aI{L8D52LSvdJr$_^WuW0f|Jl!@tn4u(d7O#=Z@8 zQe_^vD=q1&GgcK35-27C$08LUTj-wO=`V40uEZ-ag#EAp$J?VWmBS{cGZ{L4hYrBW{BJTGhas(e zsDW^8)MK?TQI?u)oGKpXqoN1ddAPI#EbZt_&(iXHvg^uW)@)X%UG4FETs{2Ax)s>x zSWE=!1X!j`OXK!tC$xEQZx{GvAvOjvPKE@yOWdGJpZ}-^6p8U`_Ynvs@Y3f6T>YHd zR6QsuF)GPb60APKr7A}w?Msi-L0&U?M7a=fE84Nw2UO+%g1@dAi~ zCCyH5;^va?thJawpBw=IQa3gbJcUW|nebo=#icfGlTRU}@~jeNo-jRBr`->kKm&IY z!!1zuw}NOfP1>*Jo$q*l;Q}!x3!KoSAx8XDiDrx%m9OEuK2EiQIb(pqFWT5BEMH7+ zsG0m>vISSKQ2|~u12YObY?uK}!il^ZEuEW-NgjaD4n#xC^5TyR@T2_MVo*PS!~mSs zlxwcqQ3i>ASX9=OxCJu>U7EL*?-=}$XND{KDV{o2{Jkl5U-6CS1-zy}y7=GGqArPV zj9rUSoGk-{us>f_#9;LJx1PRX)DqAUaC2 z)9y2DH}OdVE^PAGHzd z2w#fw%}tCRIpk+HAKbqY+H!xGP|<~itY;W}H#w;2rGG208l#evxPvmE zVMh0^=W9CkI~{LMy*4fc(}!v~V9-m(VC{=_xa^RA_(^gSM2eFotO|>v*ojU*>Cm#r zgNCxgb+=<-0vSG03>bLyhjE{znar{X2G8f%$4NY#n3=f(i=%8wk$Kmu?qo`>7e#5# zGekd#DpN4-y^a7CzHJa{9c5F=PgKqYOao^_4|kJ~O=Pea5k0{p=ObT$Wq*E&+Kc2A z&Mi+T5U|R-sKJ?G=N;_c>~|65Jsv@qS!@1DyVBu{Ad#p_qE38 z$Lt5GJ(pms|&UB!7bT?#Y^$UXMK1nNxAF>DAr z%9zW#&d0d2z=6~@XetbvlaGq2Fzr0-6KjcNjDnTm@NwFliB#-iQTMDz?Kl3!^f%+Y zhnVAhicp6ABfWLRK4A%ACxZBcoi-KvXPG>UBpQ5Q z&Mb+1D)|1fB{d3>%Nkqc=#pPfHqK=o-|MaGIB>`u`KQpnp3}MaLO}!rvkne2&&t`o zR?Sy%(Al4?fM($k-ps!0stQhGyIZ3Ki=q5WyID*QFhVG}kHVWxgue1oEf~NRMs6t9 zAUYBGbi}@euwLW26gN_QdmJf$tG3 zM))8kZ>KN>^}@^bLpDVQ6k7;&!azr6qumn)ylKQ^bR81NI(8v|v>{_RrtpZcbYs>D z^Kc?UHE8HchX7h`bA4{ZIHkF*jRRa(3zYfn^M9__7waBqIr!$>t?zACc+G>kl(4fs zn;DwaH( zg1`0l@#!Fs1CB`J0HUnjaseU;bIL-QLWo5}&Q!B>ZA~hXOfJAYXpYe7pjx&Uv*n?F zj=YxzFW|e6_Tct5f_S(n{nCtgd-l4lcT&g@#df%CsYuA>W6Kcl^*jIJv5(gE60k5p zw2xh@h9Qv#G)g!sLRw89KZ_8(KKP4F7z7UOY$33GcPS6$ zl{>u!ezuG*Akq=Y6%2Qv`BY~dh7KAeMM5qC`c)S-gimS*y7D8y9nmy0(4J|tLB79g zy)%fj``MqxQ0M3rRBV|yJksD_Vb!{!w!)k>Mw;8#GHB8{>w+n>;nug98r{H4+@7s0 z8-+cB1P5nLUwfS%t|Mrsp?Hn`Rw6zi<;Po%rr+o!r~(STm?a;HjxMX;0t{d;8t-g0 zQUe*`9;*?D*QC)`hV~Rzfg5nz?bl$y46e+AUK5?d%dc67(C$SYcLPn#eGL zQPL))k6S)WD9{IN2xV|>8qOWfEaVXG$_Qkw^{1;7L*a47e8t_I5LQsOLyH6%wQ&Qq z@^qzZ0V8q&ad!DGm`+oV8DiV;HPEgjct5AD_)XhDg$0B`} zMh;{kae^0bb=y0=C4-<#F1x6(BKKK^;7^#{Eaj)VwSKFg4~X8AKbgVl!Iux;!5pgN zx|fPdvJIpO8g%*Hm<7y%=Ca14lu2`z{y;yF0rzhT0)@RyDm>w!$bZ+IIZ*hISB&8Q5B{ZPbkr9m1k|zEfBp< z#V8~9V&20=#Az- zQImGRiH6z-1pv3Z;Ha)URXlZMA^_%dqYPpR*$s5F1;lg%rKD~o`6SUOvRC6T3b#jd+v2VOln|}q)Q>PO;Q<$Z;n!>M7P!@aS=_M;GSY}!6SmLC zhU;*}e+HpYCTKGmWk<-^_%C%P;sRr=)Irk9Vsz}FO~;yf-b1u-gaR*a5GE>}uAEn1 z1GL^$Mo|h(8(nI=3_zlyl_8v@cy+7+{Wv?e#)Iaqx>Q~A%KKi-#AUX+MCMd+PzK zi(K!OT!TL+i4sMpnmA%IctUPE@>dJG&+(JLmA&2WhD;#93wm0h$91i3+9Lqw~ zt43c!{Q_3BJm=vLIiJJMAsL-(7*ar0vxglWU_E;Wd`1`MsF3m&xr5Spik7;lgoRX9 zhE_h+$ZEx^F>2_W|GpXuOYdUompkV;t<=qwpR4fl_$~Lz{v=INNgrC&@?gwA%o4+; zCai*r^-_gzTe0%vCiYTcom9%^c56! zAtblDCzMXqX3d)j3k)uoMYaG=VXxN@w}L7@udAkdom@Knnn%I5h|Z2rfM42 zF>|#3uK<(_YxG`d#^66bbGc7_XjvC-`dP)n8K23cSI&A0?>SamVFG8!hd#$eR&{hi zV;feRdSxluI#Iq$*J7#rE(RZABJkQvMU&Fsyv6Oz{ z#ybb#W9`Ld<|DApcH>gA6TdGq;A#}td!2ZJ{@`Q_{>d#`Ati+eD-YN@%?hli6~6Qh zf-8EN#;?Phgri^iPb`W|ZubAKB-lRwrcP60b%U*28n%bOK0ecKSN$Me*xKaLdMMkd zv%oaHKo8lWYm=)lu2|l)>}Nw{!#P@-Pc0N(Sf;f??r+e1=yOsJsF~DDiuvKWk1A#7 z1i0#`RFvNwdRJiuSvg#pe{;x7s#0K$ybEJW`1RM}?Y3c%oLM1t#(<9(ln1lef)K+I zxXrraJMsRQ5`K}#)q8#)mKY`V4rU?%UPS11;q~ z^<7JJ^&0sZZZBI;UzPhlRyU6=EYn(HBBDzk^!ZTLJ=aLpon=_IYxB<~=`aAmf-85A zg2gT65ZU;S$CddvO6_%*RB^yd7S6N5V0DYK`KK5akve0ger3hWzhv;&S?;Bw_2x`*`$gi%@*4UPWu<%l%#+SNzwh z8;#PNWF9^JRsV<{htG~strOvDL@o89`X=ikqBc&BrpJAFVwzqK!vm}!)0Q;W?=^^_ zIT}mr>HS`E@rM=d54wzr~^f$C{ z62x2x4vMRW0k+cycuSKWQV7>Ympbr0Q$Y@Xy^1b1GO=&mm~T=A{o+e@V0 z%~a}@$p_z&w5-?v>j}pFaiVjE*(9VVj5kEj-d;HTWF#n z-)KhUV=E5+HoD;~6E)Xmu&b3-wXd80k?Zo+q^orErnUUw3w^Pwb=sguj`ZePQ%|l7 zYG^R?X%O#zks|^`&)>W;gBe4`2v(-)6{37WFJ$HfZWLA1^d5%!&3$};__!&$vWlTd zS1re;*ksT7wS0?vr7O@~N<~;hu#SRxLP))s*)h<Z4~a ztQDDoG3z9?e~3HO@>CgJIksqYWy!h@$GREm>U&HRX7+~M=*p5u49v0keauNYIR$i; zm6f!m<>f$EwjWtFfLK^Wzn`Yo*#=!52D2#11x`j~-u3NKFc_g)7o3YbGnlifGEI-0 zdLQ3xFe2yjxKUJ1(|d?*b}+U%Fb$00YmYCB_zaVQmN zYDXQY(^zwII)sV;HpAAwlM!Na{f6F!~uveL;$G0e1nm(KN z?FC9jS5`5!&gjZP>XnN}D5d(~WK+`VkWKmT8k%yN6@=4lT^?WZMZs52TCVxdLw34y zZYj|f4ntOY1_M9-{nCtdRa&ksc{jR(k{mA!tK@dD^l5&i;tvC=X9vrz27}e`ox`yrT5+W_ECCuF?VL^FXl{hDx;!T+h)^yb4xu^A$>`SxIJPr4x{B{$iOXL% zoZR||SLn*B);ZHvHZLt7apVP$^Xf9Xs!Y?9e;G|VqN^IBtLev?P4QWz)75kee>V1$ z?|vvJiOCa3Q;DN!8io%uHqskPOu%B`rlk4V=x}Iq%1&3#EpmSFqw;c$YLBw@6Ic5~ zXc)~zS8eaHO}WvtY$WAMSIK2ltZ(t?R%U**2t;Jo_h^4A(TmG1%xUZ3#4)z>T{pTi zP7BY#&Tl+o|7vQTi*==pqtYgTZ?aogm1uhKx0cAmJ<(N7SyyVQYA=;_wd<~&GJbSF z;GMzs7sYita2P;T&H)Spj+}!qp0VG{v@7QpH9tC|49ngLk{G$XVixVnXu}JLyY9J4 z?aCf8`%Zy55V!$RC7Vti7S;iFCUN~%t1Dd@fsU33^rU%9NR?9O3(Nzu6)l%gO=NlNGE&AY8H<;%?0LDm{oCC*W*4W^oLAP9c z?kx~OE1Cx8O5lNk*z>b_1;%4{raM*~zh$lC`Ng-vnTyjWrKIeM*k+qrrwN8C2wge$ zq|;Abwb1FRLQSubG2eVce4s|@Dp;3vRhkytqt*a#F*v1axCicTuDyX+@DMHk2Oh}z z8W+qutu0p>x>~0RhDJoz5>7XRBnOwtcP|2COGsI^lVfF?UVC@QynZ`)ddFlfT33A0 zez~MB=?bRB?q^VuhJayxaQOCx_wM+_+Oxoma-2+2H{ z>*CWY&kjxuhlIldZbv)Nl~I|dheviM&9dd@E-Fzu+`i9Wn5L+HL1!p zJ>&GH{+`@h@7JPdkPpWcQvt$tMpx4Hyz@1qoUV-c5y(k5nWNGwUd4ecd0fceafRq= zoh}#_pL_xTjiAF1@YEUC{3q?RX?k;jcB8$P_Njr*^*ZCj<1y>J&@mL#viuS}hXBg{ zN#FHb^mtkGT-`Yjr0InR1%Ibgvn1gn_;2DQX$%O}L3+c*dGN`{cd%z6*zWU8{rJ!b z1j4-ASo5-1rVlZ51Tu@fL&g<>K=3w>--mEtmA8#RAP~Hap+S;e2?T;auz-euKp+qZ z1OkCTAP@)y0)apv5C{YUfj}S-2m}IwKp+qZ1OkCTAP@)y0)a4h{0l5#l8!KsGk*X8 N002ovPDHLkV1lb0GqL~x literal 0 HcmV?d00001 diff --git a/en/advanced_config/tuning_the_ecl_ekf.md b/en/advanced_config/tuning_the_ecl_ekf.md index 9cdf9dd64459..e59bac38da5a 100644 --- a/en/advanced_config/tuning_the_ecl_ekf.md +++ b/en/advanced_config/tuning_the_ecl_ekf.md @@ -127,26 +127,46 @@ This minimum data set is required for all EKF modes of operation. Other sensor d ### Magnetometer -Three axis body fixed magnetometer data (or external vision system pose data) at a minimum rate of 5Hz is required. - -Magnetometer data can be used in two ways: - -- Magnetometer measurements are converted to a yaw angle using the tilt estimate and magnetic declination. - The yaw angle is then used as an observation by the EKF. - - This method is less accurate and does not allow for learning of body frame field offsets, however it is more robust to magnetic anomalies and large start-up gyro biases. - - It is the default method used during start-up and on ground. -- The XYZ magnetometer readings are used as separate observations. - - This method is more accurate but requires that the magnetometer biases are correctly estimated. - - The biases are observable while the drone is rotating and the true heading is observable when the vehicle is accelerating (linear acceleration). - - Since the biases can change and are only observable when moving, it is safer to switch back to heading fusion when not moving. - - It assumes the earth magnetic field environment only changes slowly and performs less well when there are significant external magnetic anomalies. - - This is the default method used when the vehicle is moving. - -The logic used to select these modes is set by the [EKF2_MAG_TYPE](../advanced_config/parameter_reference.md#EKF2_MAG_TYPE) parameter. -The default 'Automatic' mode (`EKF2_MAG_TYPE=0`) is recommended as it uses the more robust magnetometer yaw on the ground, and more accurate 3-axis magnetometer when moving. -Setting '3-axis' mode all the time (`EKF2_MAG_TYPE=2`) is more error-prone, and requires that all the IMUs are well calibrated. - -The option is available to operate without a magnetometer, either by replacing it using [yaw from a dual antenna GPS](#yaw-measurements) or using the IMU measurements and GPS velocity data to [estimate yaw from vehicle movement](#yaw-from-gps-velocity). +Three axis body fixed magnetometer data at a minimum rate of 5Hz is required to be considered by the estimator. + +::: info + +- The magnetometer **biases** are only observable while the drone is rotating +- The true heading is observable when the vehicle is accelerating (linear acceleration) while absolute position or velocity measurements are fused (e.g. GPS). + This means that magnetometer heading measurements are optional after initialization if those conditions are met often enough to constrain the heading drift (caused by gyro bias). + +::: + +Magnetometer data fusion can be configured using [EKF2_MAG_TYPE](../advanced_config/parameter_reference.md#EKF2_MAG_TYPE): + +0. Automatic: + - The magnetometer readings only affect the heading estimate before arming, and the whole attitude after arming. + - Heading and tilt errors are compensated when using this method. + - Incorrect magnetic field measurements can degrade the tilt estimate. + - The magnetometer biases are estimated whenever observable. +1. Magnetic heading: + - Only the heading is corrected. + The tilt estimate is never affected by incorrect magnetic field measurements. + - Tilt errors that could arise when flying without velocity/position aiding are not corrected when using this method. + - The magnetometer biases are estimated whenever observable. +2. Deprecated +3. Deprecated +4. Deprecated +5. None: + - Magnetometer data is never used. + This is useful when the data can never be trusted (e.g.: high current close to the sensor, external anomalies). + - The estimator will use other sources of heading: [GPS heading](#yaw-measurements) or external vision. + - When using GPS measurements without another source of heading, the heading can only be initialized after sufficient horizontal acceleration. + See [Estimate yaw from vehicle movement](#yaw-from-gps-velocity) below. +6. Init only: + - Magnetometer data is only used to initialize the heading estimate. + This is useful when the data can be used before arming but not afterwards (e.g.: high current after the vehicle is armed). + - After initialization, the heading is constrained using other observations. + - Unlike mag type `None`, when combined with GPS measurements, this method allows position controlled modes to run directly during takeoff. + +The following selection tree can be used to select the right option: + +![EKF mag type selection tree](../../assets/config/ekf/ekf_mag_type_selection_tree.png) ### Height