diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.pdf b/figs/detail_control_decoupling_control_jacobian_CoK.pdf deleted file mode 100644 index ce87fbc..0000000 Binary files a/figs/detail_control_decoupling_control_jacobian_CoK.pdf and /dev/null differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.png b/figs/detail_control_decoupling_control_jacobian_CoK.png deleted file mode 100644 index 00f0891..0000000 Binary files a/figs/detail_control_decoupling_control_jacobian_CoK.png and /dev/null differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.svg b/figs/detail_control_decoupling_control_jacobian_CoK.svg deleted file mode 100644 index 5229023..0000000 --- a/figs/detail_control_decoupling_control_jacobian_CoK.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.pdf b/figs/detail_control_decoupling_control_jacobian_CoM.pdf deleted file mode 100644 index 555da28..0000000 Binary files a/figs/detail_control_decoupling_control_jacobian_CoM.pdf and /dev/null differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.png b/figs/detail_control_decoupling_control_jacobian_CoM.png deleted file mode 100644 index e2b2cc7..0000000 Binary files a/figs/detail_control_decoupling_control_jacobian_CoM.png and /dev/null differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.svg b/figs/detail_control_decoupling_control_jacobian_CoM.svg deleted file mode 100644 index 76b7bc4..0000000 --- a/figs/detail_control_decoupling_control_jacobian_CoM.svg +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/figs/detail_control_decoupling_control_struts.pdf b/figs/detail_control_decoupling_control_struts.pdf deleted file mode 100644 index afe1f6a..0000000 Binary files a/figs/detail_control_decoupling_control_struts.pdf and /dev/null differ diff --git a/figs/detail_control_decoupling_control_struts.png b/figs/detail_control_decoupling_control_struts.png deleted file mode 100644 index 1ad9723..0000000 Binary files a/figs/detail_control_decoupling_control_struts.png and /dev/null differ diff --git a/figs/detail_control_decoupling_control_struts.svg b/figs/detail_control_decoupling_control_struts.svg deleted file mode 100644 index 167dc15..0000000 --- a/figs/detail_control_decoupling_control_struts.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/figs/detail_control_decoupling_coupled_plant_bode.pdf b/figs/detail_control_decoupling_coupled_plant_bode.pdf index 64c4237..b276f7d 100644 --- a/figs/detail_control_decoupling_coupled_plant_bode.pdf +++ b/figs/detail_control_decoupling_coupled_plant_bode.pdf @@ -3,7 +3,7 @@ 1 0 obj << /Producer (Apache FOP Version 2.4.0-SNAPSHOT: PDFDocumentGraphics2D) -/CreationDate (D:20250409143805+02'00') +/CreationDate (D:20250413160906+02'00') >> endobj 2 0 obj @@ -3141,292 +3141,278 @@ endobj 524 0 obj << /Length 525 0 R /Filter /FlateDecode >> stream -xˮ,r$8?_@K|?VT4q%4t﷙\wQuvŃt?H_w!__p_/|?gw˵kE!p%)F?/߽/_x.'~_o׿~(+Ů[7]Jwo|ΛW%]?ǛVUZէOzHɻ|t>׏n?XF7m$~nBK2_[)c*>If `N|G7u>IjEWMf+(s68飛V:O$~n"e>IrE,Ir%e\?IrM+*'M+n0T,ۏ>.$!Iͥwg -jн=?oq~f*?uiZn-8On>[;Ep}mb}ڑ5ZEZ?xD/|$~}7Պcؿrs;R&oBqڷPسJ? 9{@~^Cp6iZXo87 eI!} C&Y=oR{H7>bPI.!}XC&MBydwMO"!}@DzRd[(M!}C&']>z\7yMA!=執PΙXSc^| ӫ߱\nz96LS@x,%Wcᩖ_<$ի_\z)6kRs-՗@xA?Ox=;y ZӫﰃVs g@x.] %W_aT'ZwsI>~`g/~2\H WιӏzH_gߏVBnB6Sߊ>JsZ\ 9x??e[O4h_x;o~o~y/+$@ØFZHd{:$J=HW]b~4 iE$L ҶwxmxiD6qUYs7QB6 -ęWY'Ogƻj\Ω>p/<׈%tY Ώ÷!.̄ebA-WD±!dT&׮C f'\Az w t`hz ᘉɦg Taq -a`fh>! ,gC6Ca_rmJ :hb+_ Nyk6G1 jPRq xvC2M/:b`{!N\]!:M Ƨ mUN69t{_j%O\x5lJ!b߀>C\*l xAb -L_(ɈYVIԧ&炵XEڒ^,~0$ĕbR_S 0D58]~3՘@?`P)e׻"SSecO_E:w[8!̺VthpBE%.K UD"1С \4NZg޶(szUwʜPo s20[bZ:9!tHsBYGTr;AuadJ:TZ `'?4Ź"ʼ\>JAI(>&xiNF8C|'E'ZDBp7tQ{ -wr(s"MeC`D!HZ!GDlA" AId1NeСjλPʸ U橨2jO*cP1h1H$"̉ Ƃ¼WJ قA0/z349VRFm(s"p]mxj̻ZYR eԘ`颐 d -sE'*MSݗiP ts -8BSKR>:ހaΥq`y~1B/cfw@%a\3G/E2OLC|JcU y ,*FFR &6C4eA'iUN(ͱPЀ@spef_`aRILʡ14ϥ3 S?V쮺Hs 0eI]6x^p "͛.R^ZʋiN_!BȪiKVChUa:bJ2njюAF *ZLn< -siHU%y*fMfrYu9X0ڲhx:~@\atq$D]KlrF]!.:ţTyh BNt9мp}: 8E?91a│6]IC]U.c`@eJi.PX\.-\']VA.\&3Va0\R 7,?Bj-e{q(25Ao͐C3c0<%,@9\_G[srdqB(ǜ%"CCT1V)gGzAD9Tz!0|a_؀TƗQHҤWQU.;U:D9ېv24y5K.MM(j/"S>E0)[Ⱥ /Siji"u9-&c)GpPPhJ ]?sŠ)恰ŔgT$/ }"3R^*B&459MTx{yhBFV&#Z2hjr@,?M^P%n cӈ()/^3à^jlMQ^(EU&(7tBR1c,ޱk:1:-3C32h) O4԰L^J(/RW-aHhr@yLuN MQ^XU8ŧC -j,T*(oT#7o*|Ѡ9.fBS&ULAU^C\,ASgNd.BdB<0ϰ.%9 2=ty:脦.gnomezr1pTY'y`O4N_-CD <,$U5.$-IΦ˥΀¢_Gǔ;M{P E$`*.0A3\ε!j!J%.@^ SM]Yx٠. -Ua(*Ye3o*gZ:b|gr))QΡ1D9u=~hrܠzi!,(MJz+R$Mh*rvZ/T4ney(ީ}L;C pp yg,p9J[CK]Z`@S*}T(=kJ:J!y#;}@َUva:EN@"AuqrZƺ::Ӆ_ XyܱASg1]ƤPlh%ki,'ϢGgl +n0"AS3kY :Σ|+z̘z*/>4P {*]U&8yђkjGf0t5ex2&DI$thrnvI :4y.e;0<59K/=w4+3@SU30}LYg_EG~Jd7J=ʅ~bgKeyX9$ LUް5k8Y)ow8'swN0iU9| -X'ըgpqd@-Q0\b.N%HB卛QL;.gwN2CY,*. 7)3E0ltᮝS2}.1$4uy†lsi :r ]}Uy}.UдC;\eE3* , \ pz+ F;]KzLn9a@Bղb#|_ʀLg)/. Uj!L{N.ga\wW~"G:%X?b輽Ĥq%F)4@cabeG}C,4׹${Ibѡ9ƳX6%;rk4tt'*1TQTd}x-Zj?{@+}җm0[a?BS3h^tvc4h30ŞgEpܘkt#hCA 7'tTP("{VPY36t(w:n+r+tg܊ZVQϲ7JK8ZEڽvV:5XMBɧ8MʴvwXGp:+C)]OW%tә2cg.!ʢm&IYP5^u_(Vae_h)Z0},Tʺ4͠Oo"zg)LSá~<#P,wW"$iGH*ʍw[4TjJ{<ꝫnjطCs`UšW Ӱ~]Ʋ1Kж`*N5ݗMhwMk-;%Q麧,t -d!%9ȈZ^~g&2#jMRbhY g=_YY%L%dX"eaSS ]9}xUu|7lyDTagJSsѧ#Oˮ f^v2 R <At+,6&hJEb3P ۝5NDH"v{F0u}|o3+{*$-ꞎM n-c{座Q(a˦R0Nx.SOfWl+%FlE:螀ܢeiKڞP9ONm/;PyMz -3Ml.'Yצ'h^岻PqĆRx}/P1IC -3a*jى -4j3]N/schf%m3l|ܿƗM0A^kȇT'wSsW)LfL/[Qq -VXҐf:_vb.qfJ P J_bæ'V1ڡeGȎ+6žlI7æ'V!e~}ٔZòTv6,M,~Sٗ -mյؔ1 Ħ'Fu_WIٙDh~n?ns,lrJ #* l~bɱM t8=rImؔX {Py53I'gư)QjА܄YcڟXf-SyO!H!C'Q|cY?Dnݝ>M&ߊf_v4E3Hm{,!6?seIkb<6]`O?q' kvu}QIvAaO[TdOr:81-Qi5HZv+ZIPKb~TRTXL\&k_O),ꟙc*C3hءeMaŴJU-Se[lq1RCpEўO^54nE4tqZ@p2CaN}~ sܸPeD_0>MZkvzsJ,;t|qVg{e)2V;᮪B/ts7-c4rg(Xsr@#C^ϗt'8//vlaO~9oW uq$ex_,IlC&T6 >fC=OWXTH2feޏoH7eCz s3J 8M -͏X90㸙pKvQHr:}t{NL_Pk\x&N+-G7s -W;ˈ׏nİIv`v'7isZf8e6b!l/$.ωssh$ 73pVM/|xƒw&sU(Fasch>G\[ o Q׏n?Z;%y ^?IjVV0G7[ӞG7ۭ.v~Mv2dħn?[.aar.n?[UYIJ~tݪ`3hM疫vIx{媝.uh6壛-Wcnq޴\n?\޸'Ly|tj maRy5}! Irkno,f&myH[]X|:V׏n>GǛss\l-P{0s 0?A!aaRbK76!&vғ懭I\C)3qK`y!uP_Q`Rf.mun$̒A`~f-k~9p?t 4&> ;&v=[ -gg~3u G 3uiL'}3uL3ui G]3u -L'̀?_d~X?`熽שo/vr3>s:;P=槞aVHkww>u {4 - I/с׫d_ Żpw-qJ.ğ$~ \K7^Fca ij%nK]!}C&eMzoS{(ߤ7>EMzz5c|PɃ!}C&M{雼&缷Uv[H$I!}\C&MR}[H%Io"][(V'JOl <^= ٫W\/{H6 -e/s}Axz!WdB-/Wcul;^= ۫\X{46 j^s!Ax*z?Osի@xнzϕWob"Il ~@z-^8Ur?rkp)#?Olϩ~|< %=$IYmg̵÷zz[}¹f/to.  7;W/|oCI+Pŷ:"{&[n=q^Ş޷z{&yu'qoLzzfy¸+{N;| 'uKro&uromL.Pnh|y7ly~ܷ: s\y$ycz:"j3مc7+O$α91}f"9Zb碇[J.^÷QH&gcF'zmKUr,8ϧ.G嫔<]c )<+a7ʁQ.޹ͪ17yOngxqߝE&DSuJa7έҽ926;ϱP6,GI+bPB0b]$5Dұd`XĔI\uc&•U谌ɓh0,dҰ  cO}%I4XgaV>` &P{mR>.v# VI)鼍(D1ab֗dd cnja-![g+q:FҺIg<{ÚBjVzM:9K̐ I1׌1Q AF?޲aX#T2 -8'   +3W)vX|`nHW!/ϖ<VE5=^+`wm cp6) HShAb0 38HSIoa*se0A= ̴K'FHT/cqɉĮ%2bE6Dm<&ca-:Gasvy$xYE&n .@0nAY7 /1{rF+f6o&CT7*|HlJ:+̒=c%X{kN68Rlp+PbSB*Fl72 ٜ2J \˱C(9 )@ZETSKv.>PpiKo뤕 'd#JҸ3:Ǣ>F^/۪'ͪkޚBXdE~97'X'qO%j;Nb]hlÉ5H4 ,,l0~5.mߛ&VX #IA{ј2eH^yA?CPI`H{.ݞSb0T6Z%HKJ xť]*&0^`S0 C:AxIx6+Lg6mJ -w,.Nu| K}:xlZ8Wb:dشƷ(c ` ueW8 -YXK6 -QJB>[VtЌٱB*k_\V6yovl/үK f2{2_Al>ݸwƣ~V)mni״ wf_Ӄg+dD[W}#wUY0.8[kjP -FSX%I:U:_lҮdEUBt )UHJa1ȩQMe %f ˜ɑWܗV)*D>/ &oXtfʵ=cJSyYٳ]d&N.!]AM"N pGG '5)BfSS9F$toMlptA @kE{qx\k G:)#rFAMnm4 nb_Ji#aL?HpweO5ؔ20bFSvdPsG6 ^![R{vSf\Q\2(M5_$8xˍ1t w@ Wjhl㊗,a 0N/wAcGl8^5c!?51t, /8fQ_>Pe؜SnBKl 3y&06HԠ%Ac* IHY!JFad+^$tfO 5W΋G(ihT4KB -NucڡIt-pAX9teۃAX{0\|Y |9wFB25x, 5o3.Rx$fBy<(rLGo,JL-N4P- EδepBSd -tyyPp;ay924 -ן +%VRbQd>梃WŶmċ\f~};qx <.-j9h8-:aA[@_U8LzsO*;Hڰ+VyFܭk.ä0iv\)ńF aMj0\ M {[L@ԩ~â^gƧ P`+u?Lw$T/ 6r4,zT41N̻bBFi0:e1J*Ʌ\ bTw-P?-*LPlD?z˱+}c]F.STR*80Փ&T56lla_1!fk&Z4bPd&,0&bɐJ9{9{{”çl ƒmA)*\V7V7s+*HL#a; HIbTg0u*lmP 10xJ j mAc`Dgחn7˳1Da@X*lBᅺUŸ&),|8T[aQFԗ3\-T=m!jsV37$N̸ 3<Li ::ܠل"td6>ljRxsP¥ͬ @'θ&xL$%^RqWVd:^>^|D&i\k$SM$^FVMf4p#3ap4eZ0ǵHⰲ{eXT!p3S̪.ϰM(:]-gs\\ -&o {PʻД1 -dbH$)wH)Ivڞb@y7q1OW/34,9<4775tL'ӡ&Rw݉{`%jLVr0c[.>O`x C񄥲eBI|-0X)A*`:CL׊A`ZJ ;LA0e 0?ީQng V*:0^`Yg8Z-+!X]pLR"6y8/R(= Ҩ Lj@OIaF^Hl U(k 3=jKF\h0 JJJ#_Fo|cĢgb\a<` b6/k8a1G(Y#̉wȊSWn`AVܵG8&]ŝl^ - 5dkPFøNW`>6J0,]EQ`#1 :2Ѹksj`d.D -C,3߬a&=ײVb ,Mxʒ7LvIY>s%OҙR;Y̒"o{dsҙ$fX-3߫BxUp%ZKђupOP0&RME^ay&AVfUbAcG _n"2'>c to3G9>LC()L:GxYrQASШ`\Z,5[7̴.ffs0%ybɜ>ff1&*U,NZ GեIblZh(ܚ·"nHr뀸^w'ڤYbu:ZD3ꖤhPv6+,JX^X$5֚cuLx=|!eVHAU`ǔق` 9n):93 EZZqU;@IX#VeVԨd|.fXgI/T"Ǔ5!kAadі *@4s*X*봬9Q#%v\ -! r($38Q3Ё C rQ3F1!B@C20L,%Na$&^*sR^Hwj#rRzY09t)bx:# u/i`x<|a,$Xe81Kl\5FN~V$ՌSRʩE?ҁu}R -#~c Ireއ`p5+0JZq@V`F*ynˁiRlA4+Z Z< jsp߃ -^Y]0yu_lxv  p}wJ׿.ccs4ߜ-*| rQ7'o~N}.4cxw,Ѝy1X?fKᨗ28}t9̑~&f'2?)iG1e~gɺ~ty.m`|8}ty_8̾壻ϻzu:?//]6G]6 7A2^?܎1{vnr <:ϟ~nXtr?fґyL4r?gqxB)>}vEX]],=^?=%gw?h0/s]loen>M󬨺g76 ~>}v6_):N?:B~>.g' FGG$;!h;?:ю#r{xjw.G;!@L)Ȼt')!B9%dܓCCkv9.g |:]n-:?8N?k3ԺܞVGM;^G r$'Zr~tPh.ǴrB%5G'' v|4'Zs`~tPh.GБsB%EG'' |>h‘~hNќ?Nh?cV:X/ZC(ԗFQ!~4r!j]^~=M]|&wy]oRhe^{\yi<.`s/ys'@w#EW_d6l <^} JثT{=6.! ?}9vPiSAx.}3vP+f_|-s)\A;llIvPe_| #U9fCWxn<}gWK¹%s{ܑ.g!^xԖDpɗYwA7{W/;`g7iϤ;|oўIwxa젽n^^8fs/~ o웝 ɚt_6]d/[r/ǽ#|"z[٫/⧳*)51Jy[]s#ϑN*][rբ+ LnY:]_ $/Kο'6I ?j OϾl\ cK̓BEj ww) -WQ}d-k,N&vt'5+;1(VCQg;sA%^ l'[ͧ]X<Tw%s;2^SF\84`w$=ؗ-9~|=e֢ʞq/$Mx(d^=wvc.5t=jXbŘ>u|m9y TƝr}MOr'N"31Rl 8.٬T56{ST, }@ ;z=}td3 h-)2r},'T%+3I֥/ϰбOQ vdd0ҥcBhvA=e),,㊫6lǃ8xF>T"-obG?+8F7x_ ->h60.XK+6hց?J6ܩi| ^^qf<{Qy5Xƣأ6H%&1hl8`k wÑrb۬]=*{jX]HOS¦u,W.xoұB06UvaGX,&6{N$r)O0LM6B$*0v#n}` bC$Zػ ;apاbl ξ1Ps0F'\Z1Ot"."k[s"xx K\b"l,3%.YKiЮ0h4[(ntI<̃_ck4]Aη»ʵy - UaGILBV3HH=2vjÖ9me.E7bKob=<2]6FmC;;X.N* ^bG{(v;@l]ouj"0s1l>Nmx̹ ,%]qu>:Qt!=T S#fNY۹$Og mڃ6zX-yvPE]0{}{ aYd#)vFv}Ե1t+f EAcw(myӦ#7!0`GxݰVW%lLo#LlD&~3UÈ1Q ;Z~x 4tKƖкwx)ikäZa=KON/1@Ԍ̾AN -["@G;'6`hsʓ!ٸ,^φU`]ٳK}fXJ^Oͱ jj,{bX}mlx%R;CnWOkJ6K)vOO$G*NlJHyPxl*Zha^ȗ~Z%i ftv_wK tn(A;{fM/3JGΡ/K-EM/mϾ{.jxUb+7T.Ae_y~`%L`t{TKs91}餎U4ѝ\ t иdCkv&jt tk:W6]AfÇr`Be`%`kDHXצG@Y gn3r&.n2-gJ( -rx#Ҹ2=tBesM9ՠkp r7?GKi`000 N6وxc[[X 6]1[XMߊC.Q_>Ab -ܬZ68X\`@`HC'ow%>` K>BiI3L= W 2cz!n=8,-<T+,aGt cv|:[fK^~֗ʨbp `$.PJ"JE8 HOWʥ1Ka`%Vlt3l5@\T Ufa`9 F+vΙbHRXhSe@'#ӫ@ sRᏏ&f @Z ݆-0 h Uug߫'PYammk XG~4׏ @~}:3u' :ٮa\N cqt qnq`!@^n'\x*_2\e-ɍo~!ϡ&D?'sbsZ0-*O [Mn(K/M܀ -CSRzazzL2PcY) /1nK\Jo\fР`/IĦfd F/ vY'`*zB39@Ep;N+̭ft'5rN# eIE]0,NVX26p'af^6tS St ` -B6Ƽ*1Q?`2#;ࠌGHxc*i#te8 c^12GBPebG@HLԗzy?|tfgqFdv1 _x$ kZiC AZ4%M8}0ưtg0,$DC_>YS) w.ގ7mK'-`;%qHa_lƲN@xyK LeF`8\M60/3X)g&ƥ]l<CdFld Ŏmx1?|$byQ~ljT ƝjVtѸ>v"oq`G 0qF i楖Kd)1x&0{E-ޣEj]8{cK3S|7 6KlKނ3c%{ +_l0:4%sp0:[%h]/rɃEdn%礥;3K (' -hn;Qh~8FE1ab60(b"t 60ዳW\$qoq`;@!Zխr,l*0^w|igaQȴy w `M!]LYp,?lW[3X 6;GE 407,cXp"XYہ5`׬0bvLt#3ac.,2b@֊YGB -GxƟ3?[bW(6Vq1>5ˌa}ţ2Đ%u BħxDM͛9r8r:FbL'YLj83VX^Zk" .+`W~ڨcDؙN˔x_Qo( 2 +xˎ-;r,8_?P) u[  Q7JBC5md0beX(O^bENp??r._Q*X/ +>WďJ1_-9ׯ?U/o_ _#F 3t-oxΛ@}.^Ybj0xKxs>K 4=ok˥{9o1yJyt>97xP[,)8yKxcLV=]sbV}륛-VQ+M륛MVhIk+eLӥmVw^IhE篓t&s]ӥVQltqӥV:On?7\s2On?\'m(e(ӥ劽]M+a_M+,67ez&s˕ӥ-W +U&mqOM+n0T,ۏ>.$!I)rExZd7-7, !tSr0zE m<+ߴ-1~1{˕[e2Ϛrͧ\\ 3X >U,Ƽ^\ K=@6z{ +fPJ^x~WB߷X߳]}:P͂,}= +)hJ^jq uozp=p 7b}bR) ^3`hngR-lUJǐ]Ѽ^Jbػ=o4߳SR**z{*]f x߳U^SkdwpM>[Iɧ.ngJS>{=SMfhrsr'G,jkgpkG?kh-ni-;|#qc_OVsߑ7 ~׾ž=g +nXЇO#z*)I]Fx7=~D,oR{Hn"}w o&o{HI(!&D&'~@DzRd[(O!&7or[HG!&<&[(s􎩱p/s@x.7uWckl %0>'d_i/)hfFX_S'5}ܚAnw3ײQsp PbBy|T\||R\||R\||RRnZ3+ +Q}Ky{PTܼ=rOwj^7? <3OWo+orTL/J^JG5 /5 bISU<>ݥz{T\>)~@x.^ TB?-D$O\?3kje[?L.${3t\G=/vvvH:Ϝ/s^87I_l|hl۰-dqzBzyح>g! ͨ]Fw@Xbz =$9BK`'Ɯ>d^k8aCw0cgzOƅoU!|>A (d]jMJ 6/? Xgb,WJff²r1֠+{"PXrH*D{!zUNn `_ t`hz ᘉɦg Taq +a`fh~ | CYΆ41sm¾@uR[W?lb,Bkf»O]qd_t')B"%_Ct +OOBڪ Zmri|P6SC0! +긻 ꎒf*l:}aubS5>KqDGܽBx*UGO4 +0aR kW)e bSU^<&4FBX;B4f*Fo~|'no;*6S= ++Ǿ@Qz*7T6^-UʅI1 A+*읾&3ŮcV W6e{ 3SMͅWPSuns$&y +?L O S'1VW˨qC"ߴB4@ Z1>aDS:pl c=Qг#y(&Uoӹ (q\ oP +#P=D,NWN ZuIGF-']..kS hLtr~ӚS'u&~:TC˩10y|>%O&e倰Ru., 9dyREW:T1ޠC3YRo/!˱b-E7/>^t`,LsX )a8B|-CFE |B,ό%Y|NB(AAhС3]5M>Ǚ~aZt99\FW7KdeV}`yrUYMѩyLgRxYSVChrHF &aT]` ٠C +}uԃIA[d9X[x9n6!*gRE/KXk7e {CkM*O hFC|hB0lH]#e25yaNXE)/Tt0h\1hJry l1) xtcȌJPf MM`ƞ|Щՠ3 惆C*T(/ 4"JhF ̅柇(0hBSJkUy !A 7x̘"wN'4E9coK} Lzx.Z`Eh HjXpE,<!ʋUK~hT +t3 ^PamJ*/!U.ՠ3'2 +ULA!|2!rgXE +ΒglM]9k L=4Q $)(I_$iv* cy(rZ2 5֍a֙.b0L J4uyKEީdIhqA"ig Cf1낥qPe偡&%w.ܵ zJO۝:FB.^Vؐ=Cw.AG.]˹ +4[`ygAH[Q]s~t;~r˾4uyg"#^2Cw~$e .LJΰ-fWҘj[Toڐ{g(*CHSD=cy- ! i.]tpHsٶ[WP˄y.6EҜ<.chԱpFگ 9.֌R4ID3(g>`W$6,_YY asT3#J9a·>*{Ihڏ!YǎٝYB.XX +âTc8x{ F/]KzLn9a@Bղb#|_ʀLg)/n Uj!L{N.ga\wW~"G:%X?byI>LKK 3V# jShr%4@Xti^#3CsI4 &bqPwXYU c95 mNB*݊ĨE*q2Fn +ML`]ѯ=Sm6hvְkۙ +4[/P:t;1OB4鍙UbVҳ"S8n̵n4pxӍx L:\(`=u+,u :; hpC3nEW-lnragYn%Qj"B^XV&ABɧ8MʴvwXGp:+C)]OW%tә2cg.!ʢm&IYP5^u_(Vae_h)Z0},Tʺ4͠Oo"zg)LSá~<#P,wW"$iGH*ʍw[4TjJ{<ꝫ~rհoO|454{aMv.Aۚ=|w ;t_6)7ahbχ~D랲u_(Nُ̚rw##j{`;.;!õﲳ8[M%wm!>2~v(x< zX?uz?D8)e,Dٰ1tbt>*. `T󲵶~Hly" "4+16lܿ6!驽X˙8"ɰ)eOlq +-Ee9`♯MUO9+u!4Uɢ`NwXA78_aS\dx^$bbSWnj(]LVݲoi+CSuR ;=ҟMD2{}^]3-ڞ{VM(n] v{mX&e)1z3/pŬ&v{Z,zaARԲɰ)).h>HͪLCah{<`ŰE3\W'ejb3/Q~|zElTٍa4%JW"e v{vӅ'~MJ "$Gn;=#κ>>7z_WuϽF{uO&P7u1|rSÀQ0eS)wJ'b +t[Np6X\PtO@ ns%m 'Nwp<& R=C&qX6ғ,tcSJEr]Jq׸IbCsCOM_×M0A^kȇT'wSsW)LfL/[Q+m'ƭZMm!W͘+6uF*͔6GaMO}cCˎԑWl}ْZϧoMOpC_)G:eJkM-lX5Y/ڪk5 )ecjÉMO뾮u)3S~ +X-زFTNTĺc; Pp +-{N 嬓ڰ)ro6u?.jgO .qόaSD! ճJ7Û;?Z $.[O5BBbO,Do<Ʋ*$u4ڛ$+!$vzXT"#v&T–%؄J?fonمJ ƙdءwfWתdf$%1HuNƾ$c +ӲV#[ꉤe7*Y)vGͮKO!HeegĚ¢y<;?SۑꟹXZVLˮT^[M B0;g).?3SZf[ ~zrLysSDϔd䍪DNTK3߲;U#?JXYTݯq3.Nm" +kpBwskUFcC(ܤe*æHCsele`S Mo¨4(nS8˴ YwK>+x>g^Y6:0#7H|p,6īΟT%FKXb^'Vx,aϜwR +pbC3-~s\?5jcKSbCn/ӷ=+KYʗء wUǸ:Yo;;EYβ)2ןš r,+f, cA^+A纼8mruȆ/sǴi"Pbd3qcwo8SBP]HCz!!>?ҟ6s@8;)H+57G-7_woX4bAr/!C;czBҍ6^ .91>q9RMb8q';91[K7sV;ˈK7sb$/GMI<,#ۘwt8AM>$ Mۉ ?z&q}L\۬%"ħK7sbpF6MVPBD:]G\[½ j QK7[ƐGǛs1sWg-P0s 0߰A aaRcK#&vҎ]I\C))q{K`)yuP_zQ`Rg.u F$~ϒA`Ҿg݃k~4p4 & ;&N +{gM~=ui G~=uK'-=unL=u G =uiL'}߳_d~X`^שe/Nr3>s0FzSϰi6˻]x4_$~UOu~p[H+O\?DD< n J.uoR{HIW!mz7iMOQ!&=5cw=ͅ&o{H}!&i9-*-$~`CMr}7=$7>doH$y8F@Ľx'Wdnl <^= Bً7\{Dvb^s=APK@xx΅Wcml <^= ګ\H{0v +h>ใ\{*6+tse՛@xȽzϕW/bA<=l )~Dy>q>)~Bz^I^?"TZH\?"XH[?"TWHY-+Jk%y)^IUu?!q^ GO(ϥ+'Akl L{|R\2>(¸K]kGE(E jQKJ {e|PZ0>~By^)z?vOjk\OrA=s_-BiɅfO!IRuV(ٷ:s^97V_hpnz&[}Bbto PJ+tΤ;|/ȞIwVcO;|mgƟ^6Ğ ޷z {b[n=Sn^޷*0 +}uroD÷zR{[=3oĸ÷z={[n=SnJ,2Z'"g޷=[Bܷz9x6WF4F@lS8e6 ʕGغ[>kTBݜlbAW[ saKI)-ݑk),&ɱخ@c;~JNԥ:|򁧡+wlaX89dw>U9k;%R_.~jLFbYۙywgI4[맸4v @1ӷPOлtL$ƆAIY}񱊯b `0Q^fKhvMI0ڜnBtAoi+jBSmN0aߤ4̍c+rNp1ś&6&I:;H[V1rFgǠܳblJ*^5#6;"lNί)-C3D;얗E҆zMf]s4lV~jRl >4xɳAxly0%%EbiۓSQGX/lOLeEnIJY9~Wؑ1`Qe3GmgTe֒8+ +&jT_t7`}f`&͚JZ Ps=`6 +7Cg S< MRPhv$vWzTNX؋J֦ZVK1/ hĖnL٨ 2m{Zp0 ,GA{:cX}blǾ 3ahzI"T +pnEhna'aM]T&NX%'ܫ%"LC0Q],O˘<9j86< B. +π+0s'`.]үIEAy4*1i7%M1Cԟ_0f1K2 1I#Z5DðÐ񭳋\8uv ibm؉aFHb5 =&M%keOkƘ(q -#Xo<0}Xٌ-*q^@aUVauiG io;FUpvi^YV07g7mTE5==^+ ec [cp_1|J>1m1H &cituS5ggʞ\Y0({{ 3IptP+/KXr%{ ƪXs )Q{IXXo.]. ^Vѡ{d[ ka,oð؎t-x^1o31bPCbŻlK9Åݭ|NM5cZa(ǵ51M!|J]:WhEk/R3 jseҴeaKmњ258 + 1R=C裤},X8vZ׸fd#ކl+M%#Ĩb=x#:aۚ}(m"٠Sh +8p6HF߅ +.;mMA^i@sF=r|Yg؃eGu- eڣ<YlI16f+{{5&.4vQt$ ^~,/,0>izq}6qlMW+jna|Ⱥ+{$hL2N<àСljfc$΃B0 D}gnω)^1*hq-%V.RA/)˅!F $<&3Gp';?K8I`` =ޥ+[aV/Ft[>L U%`!v +G# ~SE)[hFߏ^n*!"=!F]ΥWef()"*!xx,`vA)G޺uľӍ;~g<*wFPxMpSȝ<%Kk%чN:r6s%w謆!Q02ƺ-IҤq`6$+ңRc`DNFZTJRA@N"*``(1[0teL\Ŀ/侴JU%r $x/4VQ'{Sʳʞ]& 35pp 8 jpZM=:?N_0ȍ8BP51 K1K֊ڵ1!U3t45:<[u {RF[-*M75a4䣺-)=gd d }DD-sp|BaԨ~Q'36"<qaE ٍܳ15 "5)Fn2$[n莡lZFBPEcWd qz%K46ÆUc1ӘM\cC@w3Ha%^~ rM`i]-a5W '5h`X*iRV(BYlH 5SBMՆJ+ B%1$ \ =OEnҬU _윻O|P#!]<pVU7 v]] ?*tTp`'mwM«klniþ bB&.Mh%ŠLY` LĒ!sps(ʩ);O;RYUon|VTFFhw)̚*t@ŷI &UnDz1wh1U}B4E*Qa0u8*qb4c\KOjMDFbY仂+f-i^a96ay̘c$MWf̹Νt6~|'4hz 0a{aeʰH1BDNa5N,_k-Tc +EƗA0EKܧEzpy]u8ԽSoR t', ,˘? H3lJ *UFWbH>V Rba +)[@Np;_RՁ:jY` c*A0 0̋y`͔B aFufugBU~zM*3@bc_ +GYc to3G9>LC()L:GxYrQASШ`\Z,5[?Z ?V3Ӻ!"뷗lph0%sE8 @LúW8Fk-1V&9Qh\bpk:$! EW{ݥ`kgiԳ*kΨ[+V)FAk XJ_`hU-x|tLc(i`1[7k`U<4Kz#w >8p 1hX#]ZraUbgp. Wiv+< f: !,L"+ +ԵF2)3X cy/KAТ)bd| ?2Er0h[1 W =^ZTHM1ٕۂ41F8:8<>6g0ZYb2G^o3X`A1fڬ(a zb +dX +0XkJ)&1Y} USFf /&k9=H̙ad-J ֺ]ԭ\j\Mq2,F%cu7:N~B9 )] 0 k& lP#V9R9x Xe}̑B)R )XSF!:!dZ01 ؍bVadZet,q0 S&1~5T# +8oDS9ZDrԯɡKëDyyf8[]%uIÃ[`ќ&*8Xlj\g7@/Xrn/1rj%f"zUN-ِs5["UA_mcH+S4>aX)T:-0 & +3Rs[LBeS ^yb`a8UØPY,9Sx5]a27yU_̪LΞqK䗘It`$C ZLI u X.)J hO6K7fk&옐>ҁj/N1jjb&FRκTC7 1,*0.Ub= %ca3c39:g+߰5I@0L_}ۿH>-Ws@89)ZS:;A nN|{%gF$(ǡ 륻},Py4/X}pKP.d9sdyc]/;(0]/{\Y륻ϻ_vYdQ]{0R$s?KwΕt>_{//t.s8_yt rƭ>kw1̮|&w|nӮ|.s[r>_ܚ6G1^~n<ݎQ}vES]z.en2a|/st. en~æ^]7lgenNo4x/st.6m(Sxڻzï:^=Z^v|[7lvGu|t^au|]nέ7RuBˁv$tfG<;!\vBRAw=7 90?:?Nߴf@9~Ӗ]MKv9`OΕ792?8_Nߴb9~ӎ]#MKv9OΝwT8ц#u}ӒN9(оi37>u^G +SQ/gѢBi$LCo9}{+x|r؟Y<Bq l!o@L 7dո> _o{@.#%-<P~CMz7I=~DҳA}{ݛHD]{w]ߤ7~D]B{Ym!6aMOo".C&hIo.:,t&g~f/>s@x."ϵW?d$l tGo/֓>{%Z}%R}}\v}e\n}%Re}aR]}\V}e|Pp[wkIB7pB7`B7PJ7Bʸ70¸7 J7J7Rns .U'97jy~7LL.4{"q8zW_`ػzaa}kʺjvN+?=W WS|`Zi.օvF -g> {]^/?w}̹btas[쀝Iwx`_=G{&}B{;{yO]ge//v^H7c_'k}ٰKv?lɽXʎ _rbmg NT@קC(ҢĘyzOҢ@ߊ SAwm %'I7ȒMh~x\r==-Ul.xzue9՟fB,J/9KU( Ql'lTfqz6'9XAzzg0ueLltQOPnXk +~|쉖S hoWg>Zԣ3~K*ɰ7h8 +&ցA~r6Ý=؞K:p]V1&=h>{c[[]kc Lz"5K)5nLsp)*{4:Ghr?zaK9> +YÙ=@\ fXz؅(T{ZAA']: 4_Š qU[Uuq]w<] *RCF 7ҵMM<ψI1i@Khw⿵J6ܩi\b@.Ra?t1Xnc4Hxhs59wÑ=rb۬<*;jXįNYϊ7$EߤO`l?>ȱ 7vNxĎ p_*#y4FdԨd3(+I'V鄱1wnɨp$Ž>fة ;>fCpvq5?W?11|%^c]ce}i4v㙴v^+ ;?܋Ah +aG\b׭N-Q$f.Ɵ "vǩmΰ9a:#EDkG:*?"]xO4.S&n}9I{*92HꥳyVK.M0}jfK5^@X>}]atmmG /JxaQ-ְؓhK<8M[ÏdWK{;vf҂Oneð>6cadib#J?N5h@FbP%8vwؽٛ[66տ NjNI&m xY:qzfgvkVU:8"Dvb ydEsMN]M33TzmOS3lbng+:ށ5حEs} +T_T.XJC{z"9Z/qbgKP:UEZC`+C=HЬ)p]NwV&fN5~V=ҞU{9+rcJh=/`\<KVv\.(_- }vsox@vwb!`a4_b!`H Pstئ2WN<-Sp6[M~`!ufrxtlV\i ϫ> |ީURF`M\aA{p`@24S ڂV`rQ4-sG@RKlѾKt۳^[A3~`GVh88UKPW^t *S $yiј>O*\j +I.}ihdCkv&jt h:W6]AfÇr`Be`%`CDHXǦG@Y gn3q&.n6gJ(qrx# ez -q4]:lWY%EVĦKl.3C/;Pfom\-t +Xvl\6]y+9aF~eh)pjt + csuW! bTtĦ[iR0[T. Ѧ%p 006\^T.0)Op a9n)M{d!Nm;86ķet`Ma})H50t-X`sH[\MVڿϱe6lk͟^"#~t# / T2'F9{;26fC9on +~(?`"J kNg`)g۽O |06ƀMIZa4IoW@X[ V8Gal2}\`dS6`ƉJa-ک]bVZ셳&- F?[)`ɭ2frd`8jUy#]cGپz*w}13=L5XfM܂|XWT;{)&YQM3P5\E ~ +Fr ϖI7"v{?l-=2 ad~!+~t%K`^N?NJM1"h@c] Mj+G +Tٴdix]x lzMNPhp\jø6=j^޲ou`ͶH7:xVț4ٚu< L0_Qe6`DbY<i Y+-5_Utx02= +=0'01OH6lLGc( ;\=< +S}o4ltnk[d/:^/+3tfN2 `tf;qOT8K4/}ºŁOzm3yGJ kp5s|pa4䒩G g4^dLqu#P"/ȁϮ34&?C'ljYD(jB=$`02A20klg n.طܘ6mB0 2'F9+ȋe ҭ̓Ocsd,w39vybǸ"^@CĜ){q'e{¨f$M+@cczwxIfZԀ _@ 04Ungo+5v+^E} +fNzɥm * DljL`+`Hau/SPOh&.4u ,9DfU `9A !Xvd151U? aL%m,'AxK34_0Zsؑ `Ҩ!;p4z"`ܳQ*큥DLIZVH(&}I0NF)1,#< <ń*33QЗ,Dgp +v睽0K@zMp tI)Rؗ%[*u1`;fn0H4SQ)׀`{!d. `0p0qi7@;[(.Yf#`^L@2,93GހF_A44Ղq=rG4 kؑ<LBy$pJ iG /}~p ^QhZ-R$_崻*H tے=`.6F Čm0'' wArx;0{u3y$!2ƪΖ-y Z\f y`)~1/Xa<QN "Xw ,&p50? b:<-m`7 +YQD2&@m`3g7H_owB[gQ3ġYXYUaaսL q;"¢Ցi}CƻfiV%X~ +5X˸vxR\#"1`k85`׬0bvLt#3ac.,2b@֊YGB +GxƟ3?[bW(6Vq1>5ˌa}ţ2Đ%u BħxDI͛9r8r:FbL'YLj83VX^Zk" .+`W~ڨcDؙN˔x_Qo( 2 B01%EjE2NBʰ[XW;[x[T -)΄I ׂ SxmGё7A\HZbrڼGkBs϶o(i p8,cNux'猂p12b< E^^t2K1AG5d; /[,.3t,%H@6$O:&lī<EQĂMݩ 8] zr5_uHY:G(!xD -\MԲb+}\mXv6 )żQ% պX rW$? tٴt9ˑ`5x?z70/.yE= 8]p)6Wrwj_-WBx%eq9xV t9qNˠ=`˶*)"ȬcH.>I_`7K<\v3)c@̼[YB\d l9xaMFߏo8wP1!| 19KfA2Z9iI,rVu> ~*`G?*a服{>B}*dp[(S[|t17qqg(l_^?A.¨^>qsY{A,4Z`kp~nH>Js}v JR&3׏s?kQO}v-98Gs}ܮEV獮:ƽ~t]ɜZr:O~nגֲ~t]K,=G۵$tG۵4uz0y&ó ep!Kh89P?07BȂ^>GU rnJz0g -sEM)1Oܣ~.uЁ[Y'?[9ȏɮA|r3KjɨOQfkxはܣ̖AG {pPf˂3$=lY(YcчQ/ܣ̖faSMcܢY3FYx_`BZOQhbBmP/ܣКrq^?G5cceQ/ܣК1SkP%z֌;;=OQhX(|ȃzg֌Gycn#̖y`^>G--=tS'PUX]6s -[>G/e"G2|r8wP\q_Jtw^ q_jsw^+p_rw^Ko_q7ܾ ۾ Vپn!׾T 3횕l?r~:x#7,5| ^(%P^+t7ģsRlyO[793l;pw~:~-^e?*~By>Q>)\ѝ(7)KJ -{|T\}|RRR>~By.>Q>~By.>Q>~⃜WGUO(E''ܟ{Z'=^|a|T8\'~b|R082m0#57;\\;|׽ΟzW}Bf'to̹fs]L+tvN[|oɞIwxYln{&i})Bf;tF3- w3@:fWreқSl @SݙiugfN2rI[+#s[nޜ}5zsb|'כ7gj/F_oNӾ}9G{1{y5P땆|9{;g϶v?"*]4ִiWT6. -U~{uOIL>bO׫_Hq=ݦ? -~{ 45~m_f>蟆LjJKO5=???g緦OQlxvQDxڟߚz?Mla__gcx( aWҌj:u[R&III|k! FSFUQFSFWԢM卭![VZߘL|>d!MiXbMZ~lWAHm$hC:"cEi#/edrݺ^a ąDthYmy9i2Lߝ;2`lg}[kl* CO/M?jX M/BZ\IdCU%K!7ј -4a_F>jsbê)lm%&! 1q))x:6計*2B5ʸO(_P`d7,H!PnZ(!淦Vjͦ'XA#mWZGےWF7)?auiMotRf4ښ+^1\Ay}/F0$ںhnR}G&Ts{ , [5XMBZI=?1bٞS2CoJaL=~hDu9D)jvMR `aᚳ KT5諹e -}Qc}` ڢ<5'ˁ|sZw6Qi%Ss M]FI>=g3IL]YK"en!W7\=QǺ)=o#0fA>`Z[֞|/05rwr,j+"9mc9(HZ|2g*j\\VcE %,(ҞF\` ˍA£bhN>0y7#Sg+!qhyɊU-=]l\Uτ -DC2ĘE:Z95y좣 `rPHJg4֭~qɓ߳Pq~\ =aZ?uj:*{ -X)SV+fx.Q<0ֶz2{T [սFz_yCtbAIT9mB􎦍cr`wX5W)uT454Xф+;8mmWV!i55ݱ |IqbĬ˵(4&2 :yC3 Y+7MlNȐy| S %-B%@F;~>P&[ V%tddW}MWfF7hj4䇗MPЮ9-zZW'h#Oq fzpĶF\wMP" w䑝$8oh8MY1K< x&␀Az+#$dWdG@; ЭT iB40s@wB ڬ, !@WAװa,@='A\d )_ج A:=R HC={MZk{L,lgT|Zpޤ'WT`# -%Z!oqgUփPBӧBI' T#Z7tȻ˫C' @/HSg dz. -Z ,Cz{p lgZQ#, uU P Ǭ6ta7 O!z -RZada2qq'xqyR -OlP[nofw5,_[ HLPBw`P#u-ӂwlg,rg,GĔ{2+ȵ6ţ9 ٽ̚6xY4H v`u˝HHLEffLѦuL9h(jX:h)C&?v**AֆAX#8vZ0 1SFOJ υ"< o6SeM,O~[c87sOCɦ$2ŷ[9` V5Eq`&VEvů];?R8v"FYmc*o,E- -PǤ87LJA5/-Osۊ\vQn5Lt`~*`ED];&j%30k lg8on@l[&Vrkv9nӚ706oX,(:}mqL2L)PFi¨%lR e< -Ҕ\o -E/W79dbM#kMƜ|f&ϷX_ -7^g~ER - S̝1Uw)lvw۹Xѿͣ^qp MP.mwTk w+.k4і8\@9XDa Uqhvan ɀaZdg@"lO6u-wi(}]w0-)ij #bV5 Ԃ{] Wglbp6ƺ{̛cf7r [tB>ڰo>cj\@ ^p݁\@Y=&v.hr˿b1k~hZa4Z1.I ipZPtX"Ix+ .)vPf:눝VO\\AsVO1:6>0K8^ǟ Vd&7G]fFƾA(ՈS`\#G`cs/ .wFsƑ4Oᭁ&- -wV %Ÿ@fENT yi?:sE?:a'.Lݮְɸ@k| XHF띏r" X %:g#TbE3U/y[`DO@ +'6`O/ʗHnWf@#2 5_hR2HĖeï*ʳ  -7;հDDKŚ|kAA`j- dHxPۯ99ܜ| #@Z\*e/Bkb֠B'E54|uq0\Em^g&p˶C#!`u]j#[6_ ' '4**JG4) >~tg&^w#S˩qJd) Xta`rre6؉ ‹.^g\~nv EkhI؞]RNL@].m i&bjCP8<tcWx3Ԛzۯ  (2uKY,|OK8DzX^ЦooM`Dn÷ ҐZMƖ\>UK9)KeAT4J,vd~,e!g,˪ ؞ZF1²Y*VTTZ²kK -PJ5T -d ~^_7V=.\zWkQh_uSSa?k /bY)\7ߡ }2Z ( n͘a>k"t* @ASKy ( /]7[l]O`iݾR؅;Uq)Q'l/K;+Ck` &&>_=p ]Z`GmB-wiDux_w&_䠪Vbr}gS_N"WOYεAlVU6HkCgsߧysmq9YA)*j&Ȗ`h=0Ll+3)`OZ棚~ bWnTDT-b3kc?)>IA$ؽJ~R -4LȈNV~5Si0:D~ve6ne<)6ں3;jYl'J v"`ޭd+#4 nėSaܑ Hs6{[ kav&ys 2JZl{`Giirs\4LNS+SdT($`У5(^L;<ʬA`;(,^DY() 46'|[E \;vUr  -dS@VI26p<gG<$ɳE:Xq=wz)^<TG4kx|> `eMmuCtV?/^U'j{ǮŀSZU=?tE2 c.(gk׿{۲ӭ_٪C9ې8nzG.🜫hꋟ>70_iM3v53k(Hb^ ;9Zl1Ž?uPg%m!jG9X@|x5w"1pya<)m2^̟7o~kd"RkkWn|}1Je*?|j - ~HhL>}_μV@]:m3W!ye-4upV}nh˾7m>vYdl>}n{m{6gCv/}n;ݷ8-kɝ?}Ѫe>}ߧms~r`>>M1!,5m?}gM(F G۾6ݮZQ~sƹPH>}߫U.S 壏m^Mx >}߫5,ѳk;|^u+񺷰}sZH >}߯VmJ{?}IRkG۾:ٟ{ꧏ>}߯;Ky˞\"so|bgܴS{vMۗ>-7-%Hl?}oul,M~zJcL޺lMnfV]hl{&|ӷ56?LVo^ol♶/;z[#ef~_/?6w<6-\G[[~&Vblߺl̃]/'6w$6?i;fg>zUپsCWXl\Tlծzb3v8 -?l̫]obalߺOlЯ]6wv_\3ۅa}aCvtl߹klЯ]+ -b}a3vs.`3vL߹l̫w]"gY!՛f.58#Xwy׻m4?qLe!3~ -*Lw -n?G78>4jK7uekۼKp>?wwyg~P7g~BosϘ&ig˟1M!-.)f1Mߟ1Mdܟ1M!ϱ?b d1M*1Md2t#F?cCFϙGL\e (A^?zKF_}0zRK5ﵾ */~}nK)#F۔y*/O_+0y R*kA'^+?aZ* /~~{O:~赶KFE_ꌟ0z&R`kG^ꇿ?`KZ'^+?b`5MQ[6f/gү'o:}Sb}5l@A`A?^ lV9-/6oԑ1y?ۼU@~`[F//F%gwjoԆؼS$w֓O'J{%w^KFoբ2z=1zk[F//F2z)31zV4t/?Uh~襰 -}*ުgcZ~6zK;w^+Fo2z)U1zfK;X˥8lV-w?{1l*eRbNҧg[Q u &^ث'ף9j .\ͩ݋㺯6bo^l>n>}j镋}9j .\WOp7'/Fbo^>ޜ}5{sb.vSį\\YWOp7/FboN}96|1{s^b.'؛pɜ^؋'؛ps&l~sm%\vahd4ubk`_ -T7a2}-5Xj[\?_nۘbiH"4KZj`~Q+3b$mC]um]'ƅitǚsE"ϗseJFc̷[L)ֺu Tui<;Cdc qq}g]CnKwn&l1zmbu˨!qCB7c -ˮF&SsuurkcBKK/'u=öQڪI?XWmsr3}߬΍Z|Nվ֖K^>8 .U:* %uu5u3F\q60ʹhv4, j|ߜ^5w;s 62L;)hW:kn}^Ny(Mho-O;dy[KgEzUfcKmB)dG -zaB`-Q1 տxbbn˙04Q --;X(64s7mE$ \ẕ%Ye1 -J4:@t<JJXA\4kۿ.-Z=V ɝ0yVI=0JK Za˗9ΨZ`AzC=!f3b.g[RRjAU4 -)Onĥ[nZGRSQܗ-VkO>>1yf9X֌F8|-;~ %7W_]_r Y G#Zlz$ℭe\d&~¶`<'&hPۇ\ub`ά"MUӛӈRl@N̵td:|+9E~u5n_Ңesd 6i -ZgVZF@9'tHP`Ϭ:'W5 *mbk葁@oؼQڱ9f+J|!ĸobܧyjr-0Ǵ̸6ء"}',K V©kzZ "N}`|jB'*P6 2!+ꇮ ]KUf~l!.n\cO+1ըmBw+6մ|xr:5CzCi 4 +hbqʉ禐ﹾ֜^ٵ{ S@ibuJmc -Zu`DyQ1 -6 =;]eu 6;MǢ_ *ѥ S,XOsBcp&-[4g7Mj}<*8W86P4 Gߛ f=2|8ǂ2m`s[yɏaksv):GWw>_%8} U@`"`(Į{aZ -vYXD풼YD\,W@sr\61yf)0glsz)B^\갢2)?ӵ:+]9:C "8L+n1E^Lx7Xz"է32 -L)n--4dn50>"AԪO".FV{=MlJ:EzHpM/0oNrdž՝ăQTp)=vϫ޹m":3Gx-j!BX71 ءYM-UAj9=Bw4V1>lEe'> ^bvps~(gp1"V ꅶ4ua -6 emMSy L6@\4FL.q<(o齙@ɴӜw)60Mm-#0<~ ߞw˱!ahˊkL.TqNiğ NJH3 uDJ1E3urh5m9kwnڎ`Mԧ[&ûvͱ} ,CЮn-`+z,FG XiX#0t-,1*偡HW'xm_k'Mi_CV|762SkO%opWhjr^@L _9̭|0\$ S$jLH/.iXE8m'l"{{M1yZJ[C͐X7!}uZXBe6e@Bm#q50ӛobT9łˠyŚV-BuG80쿆4n&]:1}EAHw -|JۈMj0br3hE:&gd4[pR~eJwWYJ$3oj -l'xN45&Ң0Lnwq 6%Ki8a/L>|j1V M@w~-htrVM,ml01c 䵄=5c77Xl9VLOu/k`Zd;]"ʑ2LAI{I՞1&d ChUc V!9/&n,)0ۂ1|C E񘉼YS%}2] K>j¼a^i%ljJ鶱`X7op&ĴHtw4/jk7AOL֦g4~yu Lam -jx|Ê˞>qhj,D)Tqa_NW߰G*1.3""F^s_A/6|jiuY@obEs@\'Ǡ+ SX4|iI)\ Mj%1 a -'f[#9W> MjR6*?&%w+y $,͗غ%-SP -auCC&fεPR`ƢpݛI'1&u0DaHQy F+kVUI6kpI+k$ט`}צ!+?Ԣ1VZ1HW6+WSAg1Mo*!/-Vw>JbGY -) ,8'1:5cķmRס|1h'taPd7M)#?fE[ lk3Y}1&6c#Rqo.bo;)KɹTbt_\_%_}ױNX|H:m՗Xq͜;B2-m=bWR1bS)RIdj51M-^Oi8Saby kKV'- [`Y~Rd`nk` 5I}Lɵ}jfI}9bC%sJ` z]$6kLuw( _FJif)yErfBԟ3V&s'GXUu-0 -5E|&i"77H'9SrHzﱹ><,fj)y5L|zzs1 -^섬w:@X)ÒFS~5_s.[YaEkGaK|qQ#)qC01K9Zؼ4|`r̊Z`3=0aZmy}\Fw}ㆼ,2 lyM4fK/`^FШĬ61CSwLƲ&l`|LCy~oAoYaֆ-yMЭVJ=(;4h5,:@aj23䛼`b.-Æ)'Dz&4GՀQ)N=9Xy)5eQk`6CWaK7m:<`zU"uGi -ՎL/0u`į06>LΏA$0߿'撲9.tg`wP X GaАguÛ4 -)YǴhK La#y} -:V=o@̯u@0a3c>6[u724V`[[TW:|7 -Y-,t%kbuc(OwY}1BA٫@# - q -fky#/2E%jٱޕMN6ǖ^OIrzd~s\R܇7Xm5:Slۘ-):<!H0c9imڊuYq} JE3LM螊C&Ncs"Ր?eG.֍,}/&XL"oGR߷6*3٧0;@Q--cbNmjm,a؊-?Ui|XD VΠlGc@bS]ASĒY 4J` -;1u9,y+lwb3[$_fwiԌXՠF&d%/7 ]9e6.Y ܺbpd_eF{u؇Fꞏ>}mniͬ8 w/Qmv ¬I>;7ZS.e é5o%A' Xl2W m㋝{{ ޗ()FA4;ȵ9pr&pHFBfˤ^_JR_c]׋u΅FF_ńbUB0 -Z&6N9rDҰ&{%0gA6U٤$VY'yˈ#k9HOOեqđt5@4kP7n`0rmԲF -LnR+6'DXB#laiK~ y>83*RҊv\GGJxνuKQMҽx\(3hU`@d;թbȧ:)};CrSن-P>3eÛm\o#bV0 0=96Z/Tm97 7Rwo co^+_0&'T=եݎ1RsҏTK/_֓ѯQF -#-Mz-\b"Ni^h3) a=ْ4h -/|~20UmV/Pś jgǕC0SG`n* |AyT_`Q=09}E?+QO| $JDٹΥڙU.~0+0SoÑv̯_ 3Zf9#? ~եS~(DMT^nbX=U7W\q3%lڹ~1%O8ͩ+c)`c.qg!bg L>L-aޏC.GF`Nc 5҈h[@HU ɵF6?of-րqovkPtP=V0p-35mEJdI)*Ȣ3}ߓSfg fGn֠мq#~WC -X{[fˋz`m<ǢT74aG`ܡiŞd>Jyկh/U½t#00R5C[2PɓWbn޷ꁸj@ j,f)űUmr+/e `]V]7-]yzu.ҊӰ>'[h5%0AaTSj?cr={&Ѐ_Mt:g-=؞+w,@XSM2}<v - (Y8|FT$`V Xjr_7~hp5sv`6eF1?@諍 5Lr] ?(aef`ͪUf("3lOk[ ;j>n !~soA<+uRJEw1L^wV(L*vQr"1t.hP|?c 8i؉ Č| &i0 ZcTA^ƕ?V.@ٱx QN<*يjjk,%BSH_"gLsdxN:.Q0^;t:7o_Ve-Iq)PΆqY6xc)368b|s݋mL c 7jn/|4I}Cowk) *sK<8~?֜FoGe"ͷ-<r휨Uۍ{iK5K,%0#6Z;ąy(֔cY>l%]b[vr+85#VV9qOVwH:_y%O;sW8'Uo4]H#c6.PS"%q4E<HM ) pa8SbSf, u-| W_ 8v6wNH>S׫TR VBJ01f V3VC86z顿汼V$QZlX9 -23w5k-9[G)bgڒaA㗨m9m{JFc2kD'XaGVu8 W̯f ~:"bwN -,-2Tt&~VF>+FVú;yG:c0LZ t!m2%q#o}NpNm|~`f#F)'2 Ŀ{s+߰>'d+;%?@dTñTAD6_%I0XK [D86CSՔAHhḐ:[3϶VnX 챋y2 .F.kL_-M6I=yٰFYG*?5!km3U,gʁ}sȋ{5B\hW3-AkIZI-A2l5"m">ɋCPgj 1SƱ V/ǕK6a5ZJ s$(Xi* XLj?% 7/\Zfcc>fIfG S0}+$Ua\ Fl/$75R4!c(aj>q^]f5(3sYJ_.,i+2~v_=߬rn.\h=$ ?d->?79_?@nX8HN;v3΋$*m-1HOTў~-7.8["3츉ee߄pVF1gl8Y(Ns,Q%쏾?/MNBY/v9)]މm'0Փ_>"zn$K4-y<٦NG.mhm;m-N*ܰ}s}ۜyPv>v߶M7m7"Gm+ ۮOgv/}n_#=lٶmk\>jJ&0?}ߦoN>~߻RN>~߿Q2~诟}np5n8>"Ł{UL:}n^n:}l{[e|x9/sϭϭ=}/}n~nEq2_>܊.e|yf ؚ^>P.vh{P~j;5sٌJ?pCfꢆ["f^ȍ"-1d3d/ȵE6?@nU%ٌG6?p@nU-"fU5{bfA~UO6wDb,_ -뎎Ae/Ƶ36?eWc3~G*t[f*x\Mc3Cv>ޱ - MwtUٌ?6?oWmoJzF1oIzV#Ql.%Ul.fd1O=E،ߑ.6?p-cߒ06?pMc3~G،]d9wԅUnlQ6?o!;|֕15 G(cyL&>_%mL?.~G 6*:-GL\w1r'a獦rL-FE{ϙ&agʟ1MƟ1MRdß1M!?c0}n!O?d~Fw~8w~*%^{ȷ>ߧ2]!%2])ߤ2]^3B䪝7Izתk&պ_ -x0z-Rk}'^ s>aZHR/չOl<`kG^{>bRׂޯEV~}lzg~}hk!3f/[ORLb/T) ~kE#fe_K1{Z1\>{kftm p/erHhaY>bcS~1Dr]INr# .wj&~}6MfY[uⷌؼQ~lV]-2woS~۾}mީeRbNXU^>\kOF1z)?U\~襖蝢;F5goԎSD~f[1ѥVlV-wFjZ~6z2k!譊[F//FT1z-뽘};{5[O_>J.f`l_>ޝ};/|1o{wRj'ۻsW$b<+{{wjwfZr'@s]8`ONoƶ"`p% .iRu(׾d/fG\6j"6\y2Rh9k傭 -eFyTvxVW$HvȖc-fs y* RۑDBA-zW;`[ALBlkMyp -H _[:zK[ >yh`Ős`w/&DOwN1,m,-0-2\E.%:asv}= fed_ZZ%]n̯H9)*o'wkadPAG{lim[s5H(ZҨôCb̯_j`&/\}`Uyݪi9ȵdli;tAive[0—Vlmh4x/= y&$7⇁ilkf K'̍մM;bS5לRm9=͓T9ʆLi:խXeϩ.kJZI–p~gW@5Ɓb$PtɁi P);li p1pPhCC+G@UA]_3L3cX!c)0uXGiM af8@ޖ(:qB&iؗuHW5AGO0ܦ)-U0Z0OנZcAR ,iTC.B,NE1 s !|6ZdIjPkC4p_4c/IˈifL#@֒Hk i)$yүX7E5LuSR,.vok>.jy&j"m%4V׎4PV˨1gtXMǦF^I 1I T?v*L|x%&*Zm#a2j\KeӸ%!^r枋A]nخ86M3dSg\P.8 [1!Ìk0ym%ts㳓PBFb[4{){ڡ7Us@!rcc&ߕ jA-}\ [y1F |.p%.$CPV񃺴ME pܢ⍲¬]Skfz(.+7mDqzEɇ"e ߲yGK7^s uuJ5yNi jmhݔ93.>1@:VmLt-zkix "ļ2]抰˽Ȃ&k401aGH$nP,k"Hi,yr<^ۦQkQԌA<}"fO+6D -dZUt `}kcg`S 5 \ۯ"\om9@N lc.3bN \c7p=T4p'7S100ͣRE%l+":&ƐmirK9MPay +/`#l1YY1~7;3`pm6O D I&t9AoSҰ䳍gDsP;9`F7j`eTllZ7NTьiMLAa -'A/Wo -̌(ŪEFH?(]nV&)5b7Q&sM %< Dmj̚ -ub;KHZZRynKkPD: ɴlTt92gP}Hq-׃)$\Hf *ZB7l;i;WHp\M`忚Ʀw Go /eorjv!fˢ+(S|2wD崰3=Bٶ+ 8L-03a'g#_F"I @?n;m`OgR6{Ds8!SuVd -5)޲!TTTM{PTjkHSz2җݸZ&"T920;2+"s8 -9"E ĥmpϘ[Cې^$$  MU -<ɑ<$d<Λw`rFf6u׍5$WQNl!-t~ֿݩMKkD?~ Rw+^\MUP`g mIO960E+z󎕃:$;~6k6]N 7L1jiUolpfZȖۯ'H?OFJ> -HX/H.Po5L4#ڽkoYe1PŗW{д7 Dd6Zkj nO;+;H!ȟor69 yɩ:AYjl3ajk6Y<=fƁO`0.|ꔢ9(q`@&BSkN ZnYvjղs$(^T>w"9d&{^LJ H K&(76kSBT.qi; NE jE -sA kܵUZf)74y l4@TӁ3 u>vޠQTzK `&SF309vk?b)6 p4sIY9|,B$UH6&x 7L$8TZɱ-'?rbv6EXHc{(]OWx?3ȿ b^O|CEkp-s{ ^2M< 5'r"mnѸ` i~u{ Nh_k MLh!ؿy+p;諱cj|1GrCL oۉp4  Ѻ%;g -rM:Ge?Bk(Y-dD8όHMh%8zݿwЍn!2h:tǯ -<~$ qu&'xp CgJ5 {1X^ -cְ? CcD0A5Huo;R5k rpxAL;Q$' \ԋ}Kik\s5Hy;dQVDm*ǾkE;֘D9~A62R  XO^Î_2fQWZhZsHTdsJ -,G|)(ux$*Zwe*W<2d&d~p l#ۅ>b=Z=Q!P5bwl'g\=Ba$05TLVߘ$`m3V' ]50r|dP}!l1 l`9;{rcr1/T/zZ<#nL <6~>ivPL2  h+`R -4RcS5:|W`jdR;`R -jX+Dp5* &ȶ˯F泎kj<}  % 5)Lp6,bQe0\"Z<&s &ܓ`r 42pLh -%B* lP Ol'M3uLEc'fW.N65XwaYnA62ZxHzI6[D*'Q#אI6< < ->{fRj̦\۩)YƦ'PLnN Z@g_ldEh3a@^$B,  kOb sstvѷnD,ybc].q3{SbD`cw^Y㭬{S"P>n(fTY'x>AL/R0 GΦ"{(}l{+ |pv5|C|3ʟ=W3%Mp'wT‚[ 'vRے/;ߠ BX\EW1p 0|Slb"(~•z +Q`ݯL;Ai*|Êd]1&x*bO q/|,BJ-<((N8ZLb({8Kj:e-#u(B v5 4OT5Eo}b~a@Xm9#Z",p{Q`إubGU㦁A9<)<ׂy@VZ2#+ 6)6Jger["iÄO-˩4RqꁋSFm -R8jfS -N9mq2&xPĵ -ꅝrAߘ!`\K VvF(I ʍ] oO+>'x*//Vvq?](.FXb8pΘ5ſ?((M?_?@kgZ4zEeo1DZU/$p11 Dlouz!D߳QgQ@->IQwC \QggΧƱS537?gb`?Qvn`͟#ͫ`.m˛qfY> -ڦŇi> -ݭh2m?T۰[7 wۧ>YA՛a*H3l?DS6(bnke29O/}nd*-&ZG۾,luaǶ~2 ̝]>~\-i5/mk _G۾&/>}߯i >}߯eWmkgF>~-:_>}V~c_ݷ\eY}n_+3>}߯dm[m>}Vi]Vn,dizJE֏ܕv·C}?tOg;3D>帖 O>3ix0}#.L zV.3饝/LrLse=]eo2( v'C龞oL4B Z>yqϟ|fgl&-3޸>L̗ϷiaG|Y|.72?e[z*-33_V~}Y O>33_V8t\s'72+L?5-We'7iX>-MӧO>3Co@DG8ϟ|fތ"+3]owej%'֠i= -,L̛):G/k,ϟ|fg sqI=QvԢƥf.3eoBegREͮMkNs>S'6I='Ɨ?wo#&^1yɀ_-؟017Jb iP>Od3Fb?c3F[?d g~~7)ꇌ>7ѫ7yg~~7g~~7G~~& ߤȟ1Mn$ş1M6ߥ1M$23F_Rݏx!jxB R; ע/uOV~)}LK#F/_Jf0z-R+kE"G^JaT>`k'^k>aZX ׊/EO~}/emWWp ת/}|ĵ"KF_s0zRkz~Rk -'^l>bR` ,gZ7!RzM\2RZ7N/s=]} -:hKMF;@~c}mnX}n. >ۗV|ոLo WIo~ 3~~kK]?1~$gPx~(o~???YBL?T]ʚvfKj[֗G/f#Me#9.;[ud [G|=b&/'&o c$؋;G|9bQ;#`?_;^L>v\M:mvpSf7L^M:]vawN0y9Dv6y4^L9Ev롱wN ^M:531\j7L^ΣM:viwL?{1y sgg1z䝃gwL3{1yzdAsϐQ;gna;[uvC{ (- -j`Uo.x5zseFVoٸ}]}`b7Wk|aDz5&+z5zsǫ'x֛;^>q1zscǫ'֛:.F[on}qfч6{/E F`^oy5zs͵F_o.}b撏wIW^ث؛D^m>%ng[;m)O-&[QVlLRyw߬4䋁/eG?+s:ԒkBBZ}?- {KNi1m'|zGg}ƾ}[~kom].*': -) $Uh~}'%z EY-womoCVeU7Ub*4w}Sg.o)3ƚݵ_R_P~5>eկP)衫uߘaeeu,\Oƛւ? CF!Z6ֱ"2an][]d閮.) շѲ :Z.7usjfu%!J\WĞ\ua;WDbwL9\SoH&B;j7!եb|Z ˈ6Ez -ՄdY+SpT{ | ;aȽi0T.l/^džk(Ɔ2 #]xKD"IYֺuLT6\Ak䊑5G*Zd0?G77}ű*kKsMmtAcuX/kP*5c5t [5]SZ1NbKeARZd5(&RECϰdI!(=Tk1s,r\UdO!k0'YMbQ [ 6 4C7-Ԥ7uaSn!bwj<-͚)ifD1׍% k5)̉m1ͅ3Rf`#Xb*I?l؂b2z` i{AU]ɭA5weasND]AH/yjb,k`Go ܺ"Fjj-02iT!_k\.a[im̩цZ8 *h_HGw+عy`wͰ/UrB7ӰUJZFk:1#S - hNJ1eԬQMϵUJ U0 oMYr\IBZъr_4or`<%B [ʺB.ZDJ^.USvO)˭7º. / />Xd@٦TaߢT\`(Eo9a=F0DNtLFe2WC&`Xۮy*95!5S#ZWBӳv躰r>:h3fG,[`23~FEc=`z7fЈZIYv qhd ӲcݴY [5?{F`q5 W=K3Lͥp/@l.WŸUhӷHFb0E`<2UgUq[ycre%CQPV` ml!y7l=4Lض*+v=h[7{VD!\k1SiI[%ͯu,$Y%G)Jaً^7Uݠ2sQ53T;'殙nU0a,׋ O|2a(Ѝj[79𝈅o4DϦ̄ %xa?Xyc]_. 4S)4N輚1q ;p VVh̊e*9hқoCnI6[2 bؤ7Ƶض5iM l6u kIkbs$|-uWz㹠& )`F>?Famxl.=y lgt[|mM][0N̳nQIaE}0v$E7[@/Sۇ^I8Pb%6@E\+زddĠ"i1XE8kRl2T1",}l2bl9Eb^ >8hhؤr:Rؤp1`uUű, -kNah0>fWRxU#XԾMN|mNhRA5RAM 2['#8ްI7^ -b -FW/ +Mb_MPr$h 692u pbI^h@KLcL4Y -0tm Ea4X\&,AI%k z|H0'q`$=̡ l0ҢmԓL7lҀ$mҤ=iW펅T}Ґ͌u6i0.0hDRY4*Jq͡^#6yﻀb@u}T `;1 3xCT5Vחڢ/r{4lbPExU{& `1QJ-E -Э -6yR0IJ@,iM:`0!6ygoMfOZxp"X*XX<+ fIa$jOjyT6<%RbI0* Sn2J E7C pL5vRz\i±DÈ r` Fj`4cա _/h f  7R4\^ -=KԘg/ˊ/aq&,j1hq)×!n`o,y -F͍ aY\T<89{5JVNa@ E2SՔn[d*qb"ʹ dLk g0?E`-8׸ܥ0BŐuJ2VÿNG00 ?u; Y݆nl8 [& +;̿&)щiQ@e*W|ħQaXZjHh`\/^ L -${쀦W~MW/d`S_lDaTl{zH@i(dN.if^i;:VIns5ssR,r HYPB3t7 `< [A_+oԧ[is/{hs򠙘 4X I `[A.y+X3 b׏ *Ȁ7l)D%P & ꒇv 77%mi)& -.Vu >lتrL,!lAdfC]5lV9 aM&St jc \ƁUbѧL[u/ρ - ,7P3{uruˋ\[,6!͂& ILR3o b:5Sva:g[uh,8vIS:*1|6K3)P[L@*6L@*EoA8#PɰUYY [A^(#"RMfȢϓ&?z^93xw/d0 V$'CIRfgqky$7h26XۈÕj*ıo2d]1."K˪Fb饩"RzdJ4ւبI40ՔkybLY\&bVn=C "@ ÀUyAX;9Le"l& c߬H2l,*Hhj7l(f'U6 {3O?/8)Fa e@6oR*RYEE{ dr22Q?u&b c{{ H98vЀ,| &T/U5(ϬdRխMa1,BXZOl2Cu@(3.CƔ< @ VoAC,~@ td~P9t޵~ؤYUPbȔ``,cN jbzrӬ 埝}v*qƟV_i/ِҐy! Lx{4IᔝLw.u.ɋ0.Xj")yF#FqA~~\3-@\><=MA]3[VZcsmp:* '=MT7??Þ˱uf{Q^&5T>G?KdsRc5,&{l;"P/X6űl`4[_>l.D -7Z\r8̨&xp[sٌz G?edx?Wecم5-j$Ye_>r.u?sVX v&zuZ)L !{uC -אc\[Cà]>sVx |ϵZP8|>j _9gL壟>j5o7sZH=n壟>ja7szvG{>k.|\^k -szяes֘ꭵtԷ~.\M䉤RϞ^dȉrrklMsӡ(ջsjI:Mzz߱\prͱ>M"vq͇sݤKEɗKk>'܅,O@ȖM"ҌfdV&],=.}+E%oWSM"3v.,ٟi"bVc,'ϴ:c}rLo52cΟiVY;EgZ~0e2,?k[)a^]>LGwUĔ}tPn$'bb}rL'&8Xdn7SE\>j)`VO]9呣VpoQa|,f\醴ò?^$2K]׋e5?q\e]!?4?s[s= -.5M;x*LSe]?zBK,yB}e"Ҡm0I?#3BI?#<3B@F7>eor ~< 3BF7g~F7g~vF7>シ'~F7g~F7g~Hs.Yo 󏈸>';Ї G1w 2ߗ'{_J~z/}}B譤^{)Ku#Bo5/eO>"B_J_z+ ?!^R/{UKB/O?!^R[K1B >"^gRz{KB/OT?!^KR^[K]B__ -z/~$~DVZ^/Abc "ウV_}7<ڛixOM(DZy^]kՇ@ğEн9YVwQ1yf$\?|tNR+ O -bJmZx[I:qwK@DeuaW( wߑ ثw$,]_D#%i?6N9}#M$}l*M#7@/mgHx׎ lXo~ FyvHo$|g 郃[RbVqY݉{u.$}/ۄ>RaIr=2oB7u0Xi%׿^rnutD.ܑ۩Гo'BvGގι]x;z=vypHNm2ώE}ʢBԝۅ;z?9 =:Bw$vd"܉Y]ѡ#Cr'厄N];rnvG}{9 =:w"~nzt D.ݑyГw'BvG'N];z;Zwzr,mB C}BO2O򝈼ekP"ڵHr{sUl$77\>:r{n&ﳱ7\d>.B -@]Ulu&WO7\>\`r{ssUl͕%77w܄>\Rr{(}(P|ccWO7w\>\r{sMl͵'WO7܄>\tr{sE#lmB"|ٕ]e>\rvYY*#{nkǍ SGq5AJbS16 Z j}h/8Xwd˅mҪhbXuQ>…p_-z#~eiGæ(N}:[%,ű9c҃?W-17v/-eJ[Mة҄^حEXڒ$'ی,X-ǿ3Az _R +m 밾+T/MŲy6[f}ȆNB.9%])ICF -8FJ˥[m 3K,RW9FϞW\a`ձ6J>.䨽% =flGwgՈԁf9_mcr`+pKM3m=a9bcY'n76@r;B{]KpbpUbE5J *6w`nQZ5JSZ %<%& -j5aY6Hz}b 'r!)}wXˀi386V,0?AhљQEhg.,SaoKRg %݇<{6+;I!0ڤL:a{v y0\XW2xX P^~w6xw#6~"4鍂M:AK5sP+Uz1*wX \lژh0H sk}a3aȸҚ 0 *FeXozVmv*QA1l$XzF[0LO5;Dra*;"- -*]RY7+%ɔIhZ8~!#O5bT)Š dh%Ѵ'XfSYb~e<қMz-X-겥UG,8'.[ʏ(Va R+'maڥqctEkOIAxo"<(7`1FvT%r봴U @1AZ&{}KtB?㷀#f4~+ -Ȑ;{p:2txU-@W<\Px;xbF^uS4j3G:M*6nPOcK?DT%▨?zԀJÆ\K1vš@>xpT0Pd0).aoe:=B\.*LweVeOAfb`ΗZI{3z} C` Y SÐ!l -,hz1YtF7n,NEYTmiU(֢Yw,/iQvw@ +SH] -XPvz9X\&gA4#eȄ: V6~I#B+֥z;Xt@JJlE0lFP}Lp,o~Ii-0HDd0!X6EeŤ`:o|)t}1' e5 ;pD#Lw#irFn1Mȓx Br7?$D40hxuġ###yoЖ$Ff2DKi.>ae6^Gδ[91)[]\0x O>6 Th+\:V!V -S.rޢj-)A0fFQ`|qdуe+K^J0TkL-䮯m!i1=VD2ƿqo؂ -1eJ\lHF7IX`` )j޼b{%Cc2d|P0{M =X^u|=]rSK) -1^)|; Kb+S7 VJ \N^X~`PX%{{kJ1lU$-AWo"FV0 ̚9Y5xϑ*1:BUN%im5ݴ8!^&fu88ZѤ`D9Lh0e~ #O #F jKKf< k*l"RLƳnʤK6C<[sLF~bP -JG,˽NCT및%IN1\JQb4XLDf>~EܨwN: Il!xbX*)\aC:1a aA8Tp^g>VJS%I6B584 3tXZ}~_`cNgXEaA%0u30_&{,"#F :Mt9/LRД 1SrQQ:3 !$1nÚ*:4 [KZѬʘ9bc@=؍nAТ2DVz! -/gV`jF1x1Z$͕ A_pAkA dV'IAA`Xdv+CziƟ@ 5Rr(()RkDmR"$oKIFV) -RkDR"S tnJd2}fQ)6%?D&()t8JdۍP^%?f(B(~%O.MQ~tAPo'E(~raPo𣋣D~Snw9QT.wN']DGw;O5'~rǓT.}𣻞Dv?In@𓻟D~P"C wOe=M}t=P}M.SiNNѧ 6/4S1YO\1.~ZW OD׾TxD=5 x[w X 32B/O*niI7)G>Wo&;o&o }7}Z!ϧ?$DCbˠ?%Cb˙?$dSboBM?$9>.O&2ψԟW"Wx`'&BuJ'Du_Jxz/}}BBh ܗj'kr_tz+}}B5:G*|_~z+}}D轤ZgĶF{kE#beψHRZ([9K#Bou/?"^Z {k3bۋb}{kbW"Dl^k+|%g KRoO~."}7??ųHo p_.q<:t"t~.1CWtNDǡ7CWa5:/ii/a˵yjw1L8x?7t"*kyKJGBb@w$DEoD#B85{W$roJ|;J o?kiXHuH;Py+/d|3Jgw@o)}tqc'{YKB{/~ }0]!u^/Ե#&!~Wsxp!z'_B|9ܶ::v"~mztH0EɩClУlGBo.BON Z<8vo6g\>eW'vGGNOBƝۅ;z;wzrD.ܑۉГoGBo'.BObnУn]>ۅ;z?F =:Ow"~|nztHErУssGBo.BO =9'wDn6g]>D!gv'ND2}Pz(Z6m& F'8ٻFb`e}U.f>Կ$r;Eca+A}& 'XڻJbi(}.Zڻ InbkN}*|l7Opww>zro{w]M'7Opww>nr{wU# @Oڮ$& -'x^w{j0s[ZiUϤغ -`dfj\VaؤbւY٩ >K~ݣaE O`&;RYpej5-aWYBf#0Czm*NÜt02L\(Nz5_8̂f$>61kٰe~n=|#?0T cfv2o0卽] k6-chXLfWdvU ;]2L V/ZΫ%sˑ]x Rj!XH]EnQH)T:{_dzVx ZaW(nj\-Xn>dpZy`ٻD -P1ϮֆkjV{ ݉ âNN.g^4V,vPĤW䀊t4Vk8, 3l6CS,h&bNTT ,7%bDkX`EȍO7meb5ӏfF|-"U"?fOԂ[vfXJF%}%΁W4Led?]_[W5M11`ӱs0<[&e`W<~m'6^@ց&ӊË"{° -w&0Ld0,t2́۱=^^34*պwWe0z+l}hu='[e3%yc"wf2â5 -l8O!v"0vВ2 Ktc Pڄbs%6%*m`O0'xkC,bYL+Pt~WL+N[QxڤU:2*)}a0d;n4-Qmz4T^B GđXTa Ksdb љX9iϧX sb`6$.[W=2r󵫱l z6|3 q`pmTM`͟akz`T!4aMLZ &(񸜻-z*]^u~:KQ%À2lr`\ްƵIu$ƆlPU1ؙ~cgv cA&;)Ǥ.b>:~cgCբK_0ڐy^T.0\X0Yk*<5O' l'?~m}hjz xA76Kn{=j:xpTЭ+b;6ˍ$T ZNx|Z|0b -vͰ+P^l-]@]14 %F]FOOJ#+Ҕ^Í -@o"vStîT n -F` <v0`ݰ+IF -nT 2v!D3 ]@I87&j.Dؕ @%ve.v!ō aHaW&a lUbW&o+Е `VkmͰ+p'ˍ  2Xe6Z 7&n^ޘ/Dؕ ْU3ڻ6&@ zC߈6"@ s6"@,bIqA^ë+{'€mb~'ĪpGLbPw]DSl#Hө i#XرbĺlmL,j(mDޱ%&6"  /Pc3b&@xd6yugjkTLX($6&@ ^{Lݰ S["V6,5W" 4b 66P8!տ^H@72B 6#C6 fPu"İ܅F8 Z;Tq;r/ +e3l#< -1"IwbL; 'Xl~/,w5ޖU XBM5%Ym,7o\t@ -*bq% -bGi; (, H1K H9$w@1h Huc`95("vV:sҀH nӕDrh.ܨ`CRiܸc[;{Kƍ 8f0ȡliz7L,7J׎'`TNR"g8(o Ff3R6V͞-`͹,[ 6.I Y"2c3͟pq"I#􎓕.QD\Ha|2o!2; p1(5gƫP#Dv0-.`>Z)7=M`O`N:Lkk's<*[e7"M 7"[Tu E1\&́- '˶ E,+UvLJE/`1?ʹkaz Š]tLe7uĸ ),p7$rbhPOuf(I_戱 `TE%6)%YCBuALm'$Èmzۚ&pt1Tl8H//0pf 1?@u9\,*jrR<+<웬UЀ}Fx6KY9? p#{eqc^,wMVKO -`H27,\̢'l)ul(zcˁiT? hˋevӓy?d'1jY 7JzY1vI"~9iI5oS6 -!,g+pzxlw3IJyx;CW.QX;x"|5ah@hm(-Op3j7Q.kZ0KHRo g+u c~*m$Wiz,,b)n\ӐaqzFr;Fe8<ʐ̋஀Ɇ -[CJs2+K"~% p*e.QT{h|tef'fF:ͣ"UӒ"RnKWte \]hۏIsEchsF!7s\ {Sm?(aoCl"l%J~TZy[a$T`J70㹌09x# 4.n,dH lQ.-LOkZLi$\Xa#M*lܜiY^Y{"M- pYg6X[{Wo28t}Yrq[&'Y[J.1Rn`iށEN¡w`j([0nD` [gKߚ\6vAtg$(8{mWa$kF};A70}.*DYtQwתUu,:E9:] F9x!Sj&`wB(|Mrdo.oX,Z0.xTKpQ.gipqDΰHqrt)2I[5Yد*N!qvbrp]^ -rpcZ孀r@&D#E9<6٧\3 ǺVk~m2hf}rdGr{rd1l 5Av3"OpR;z" X -NYYr`1P4g/A9L]/A)Nʑk*v(G -: -/K5Ei& ݍ182W73 /a&C>6I9AN\g\' X p2f_gn F<_ \BL' u1N,:yMЋlJ}]t"9\#s''圆MAnp6p\$6 NA - ֬NJfZR%8 D7R -8 ZX.d[(E8bAlAl#˦pQaQM$gYR,Ċ\v ~TdyBK*]@~%}Hqkd\cg@:KG;]ØXv˰' X$' (bsmrdSWqh_8)‡lv6 -89A& ߇.<-ґ8|j2ppx3-Kn/qp$F_?om CϐHqcgnᦄ~O%M19]PWnIbGGJt<ё b']%9g 1> -{Y{_?9 +)΄I ׂ SxmGё7A\HZbrڼGkBs϶O(i p8,cNux'猂p12b< E^^t2K1AG5d; /[,.3t,%H@g5H,tLA= wmy2 +X-S+Ap,Hk<ꐲ,&YuP~OgC*KyQ: +8 eW۰#= lRiq9usN#ӫl/j.֓n`^\8zRAp ^Sm`ˑdZJr0Ar㜖A{'(mUR^ EˑY=Ɛ<\|(mq9 n'xx,g[^qf.Y +]*F/8MZ/5(a&gj٥榓q0$-ٵVeBz~9}`^S .'6o7xMH#1Ӻ%"~_wLW'o &A!>eу? '? +:3?>_}= ;^;_ON`s*KGo B1}T(֭όyн<3VaxX<gbV#>5GW(|c\Xh9=0c&VD(/񛯓4 +r.w`钿m^vL^/~YDzt6}7r +d +-^/~](s[p=\snL_^/~i(p_^/~quaXvr/s?o{_}tyMƽ^ܮX1z>sFjtRʘcK5HI^/~nע@}v-;8ӥ]>:{t]tkt>s8ӥZdyhcZdP]ܮ%/)KϽe{t]K=ӥZ +TbtO}v-ifBgڢD60H9{!m=9{o(oc-'yr {#q=EPャ s#N 0=7r``ȼ\EK(%Nyœ"(s7>]G\@ 5 e"+߳[9ɏٮA\G% ʁ~Շd{Yx{2H?vNlYa ^ܣ~ϖ?V}r{,0 nlr:ge!|i^ܣ~Ӛ(GT۠^ܣ~Ӛzq^ܣ~Ӛfɨ+ߴfLZ2Tɠ^ܣ~Ӛqk&8z֌%<‡<+߳fxLʠma0@qMY +u짎"}*{79=$~Dto{HIPo"}fz &뽇to{HIp!&&~DzVg;(I!&3or[HK!&&[(ΎO5./Ŵ;H%/U;H/;HE/u[H/ձ/;He/;H/%[H//H"ۗڗײڗJzڗBڗ //E[H\. ̾n!=>wP\q_Jtw^ q_jsw^+p_rw^Ko_q7ܾ ۾ Vپn!׾T 3횕lr~:x#7,5| ^(%P^+tijsSly_O[93l;pw~:~-^e?*~By>Q>)~_ѝ(7)KJ +{|T\}|RRR>~By.>Q>~By.>Q>~⃜WGUO(E''{Z'=^|a|T8\'~b|R082m0#5;\\;|׽ΟzW}Bb'to̹bsUL+tvN[|/ɞIwxY_ln{&i})Bb;OYs?yHQ$F] ~FO]5G~AILo.u2C`,Fd ;֋#'70WF}$]F`]/>w8e{2zzqړ׋3'7i^=J<)Hl^=ټG[tt}K7!7Uc3[x_[bOML>cO绁/۸n^C'ML~6FTtRSZ*xoMYlOwRD~kg緦^Oy?ײ5f9֌w=|Pf-jGT];oIE_Ms%g.*˨H޳vh16o2:?nUm.dD&BA6M6QPӾ?uſbUZn~lAhm $hE:*}Fj#OKφ6JeaS]]Bf?d6y\ 0}wȀQ8],g@uXE(~~ɰlRjz ZMťD!4z044/eDBMئяZ]ذb~r?axZPjcy+fTD\wNcgJ +V֚Re\'jg/LC(0tv[&tP(71^QSad lA$m+M +ʣIrj~pILnX/5덳ѿ:{-OѦ'W2}ZJn!#A9&MT [B M wWó!^ qv TcΚ&\JfK荂) \\!'V *5K-W3]fLL(pG6lQiZL/ @A^yg*AKs{>ʚJU)f05W`h~V_h"U.&Y 9Vy C4 +ɠjr}+7Mz= j}K2kS&և0(ϲײoBi +C3Sm՗q4lBy?WBҰY3{鳷I7>~Ӓ^h+_C-bŌ雨ES"QivlM|_0pY4r* 2(1>0RkbشhD^ s׋O9!`vj60@(r5zi;u&MkԙC5atyK#GYlh.Ns-m]COg1,m< i>'veCkZ-J@kzjPsrٱMOsN ֦VϧjKK;s9Kc5CmHFs$ 1>ֲ o5.r]cAJ? &ǹ W=*B+1ʕGB|`nG&ơ% Veim:|`3mBz&d4&\]1T +C)hZ#Bl1&]u4!LYqԞ%0:y7Mym=0_q\iY8Y?Nu7 jw`̟2szker=?2S[Z,~>_\<%x`md/2Ѯ V\.63/{As67BĂ2rdMˁ1ֳAXb\k&א%ӄ^躆`9F̈0l1_Y6@tv&Ɓ6.ZWӰbBxpD'J:XYiI; PX9x_lz@ZB%,L]܉0^\ޅT?:aug[]Rw_!< .Co,bQ{lc[&X5OY҈)glKY Z6Og^2k{~1-hG6m4@՗ Њm͙& +8ěy0EZ= 3E<ai h@* +abig6^jf6"P*dX}.ɪN*ljM`y-lԹ{N6mD )U+;-T7OZ֝(~emځmD™0ʂ4D]lCGUye)ȮmT:&DZ`V +*yFh|x%lS+ZD6\OԌѵ}g8LFr`8J6& ig`Vn ئmucZ3s QE'_$ô1r`PYa&^Ҝ!\3-MVک[ru=0C(*4d)Xib| epqX$[AdjxܸX"j6m\V^nk`[/[q\Ho0݊ *Mz!:9bb9:Qb>&l#iU=d[62` ayfd@]`76mô%wẂdLD8gu|0cތӭUǼ)* 1Ks!v9 ԋ9\&{ ܲoabV5OYsCԔ S YWf} Q~R \bЖK#o[>V׿%v*PM~Zˁ Г:bY̫UR1Ng'. IQ[FAfa/%E@Si5"4z_ (*^վ%Sxs`e˳0aoŭ-pd\ 3TZ k@*low ,Yl$ +G9 Ň\ӲJ*bE#U/yk`;DO@ [l@^N!/ .GȀW7~IIʠb\ [BI F[Ы(" (XlW-DKa;A2v2ٞ#Aa_css: F*;c)*ȥ/Bkb֠B'E54|u3\ Eu^G&p:C=!`:u]j"[֧IX%U#zjyv?#`篁m)8Rֱ咗r`&@/~8yvz7sQmہGɣa'%s`[JO*vv?r`Z jwQlmLPNc3V3Vh,:y7]鯷~E\9fΤ7";nuT-w/^<14$7 +y>0Nxe#<@^`lub[9W5h~ /lnE4; `&k0s4!؆6,4@ة:6'i@'++cˁ/>i4NOCfD~iUvhh@'Icát2lj,h)zK[/kA7'czug Xu`eAdQ"Fi XޭUR`{]{lA9۳`)"yIJ dc`zi lc4v\0鷽*&SR`{U0$8W9ȸY*p +"٠4>  XJ-Xlc|9,6}[ lK'ju뾽j*hf_bIYbu+  RRgi5.h&G) -#`YVX0XׂO6?0Rm/24 KR VOdK@~ uc`.ohuwF́AVi?e=#x"^O9;4OfPCT`Aõ5GrEQDA((t)ρAc/ն6_vebVEJTjlI+˔A3ʐء6 e_A,B^DP]s@b%k]]"{QF.|;*GmKM) bs${e ^8݊3ݣZl"YSFE ܷe+#s^>02:@uiLCZ»z`U'j{ǮƀST?|{nuvbe;a̟|PLi_{۲ӭHڭӉ3>ǁ!cuqM]s +C"HPmXJ%LJ7^}n&g7ZGom32znfaa@7Y:WKGWYcdz-ycCШaAO>=~C|]\eܴ5 ֦!+oy)j]X6؇޷}]\7DZMO޷|]Ǽ-l>~Bb{,ް}mtv# v}e+%-ֱ~}m? MBLmsm_i +1d9ajZ,X>zurvϼG۾VrD>~^M\2 ޶]{5q}-l?zuV)&{ڬm_k["Y3l?zuV{ڔ>~~෥޷}ݯ5>u o_kW, /&9=qoc_SZV7)ۇ޶N-)Fl?zuoh,]M~h&cL^l_MnBZcl{&|ӗ36xy}޸Oz=xcf3vl_lW[g>|Cپr1̫/*6W'6۟y}ŵ\lGϼ"al_?l c5fCvVl_MCv] +a}na_;5l\1l?k+}a_;|M/2?>BgK\"(*096n1~-Fn?qxiԖn|ڇyښyaI]sW7 {~I7){6w~o7}ߤo2qm6ߤ1M$1Mߤo2-F0MFߤ1M$1M&Ob<=FIdęqH&t;+|~0z.}蹦js}&UO=>Ua\T{6en0T%T8|S}bR; j0z~**ߧr[~o0F%OUw=?a\TTg|s5SFeOŷ=?`p"[n2AGS4uCdK֋ F2袟3gwd_T4q--"h" IR੊hR9%6/ԑ_1y?ڼT@~`KFOF_%GWj/<Ն?ؼR$g֓w'Jk%WKЏF/բ_2z=0zsKFOF_2z*30zR4t/?Th~詰 +?=+;^gb\~4zS+W+֏F/_2z*U0zfS+X˩8hR%W ?{0z8l^*dT`Jӣ(P:TG.h.|d؋36b/^==}y{qNd.r]O\-\qGwpOFob/?8{2z{qd.;؋C'7pF$~bFb/?8D|2z{qz\ű؋'7p^>L<)Wl^D>ټ3G[٧KrѨiM <9mfdk)\esq\>z ĥZ6OqY0{X6 V!N򺀖u=i^tǪir6PEsA"Go7S`6kpyoW;`^ƛ^s5 1ߜs 03c uhJO%V^i;C#R?&7rn{]L+pe2ɵ +5-. gڗ4KJ[CL6L9>onF$eJ'JKK^>8 4TG^CO۫#BiEs֣ԦadP+Tr%^nށ qf~g`+B"c徺);VSM5L=jT195偕9v5^`uwG LJYvzrvͰi +}\_Kb60yf9X֌F8x5$} K@}6>o& 2M_r 5E+#Zz$[4d&~ºj`<&*h Pۇ\ub`ά UӫSRl@ %t[Ѥd:|[sոmH\TS/[Q+ۛO*HjZ4ʡ>4-s@2A! crSآAţ l2(ЛzA16o/s9%PDbh7`OvTS +"]S0Ɩ{+1 Q]+K9&WNfoTLZW\k@:ri  +.5lA44fWĈcSN<^=W|e|e.kH+C!lUo;UxTD#zcz6f ˏWPց ٣5Pf'`ݼp,BԏfbeɀzNh Τpl&EsCC˰0/ +:bV&[ڬ'FXЖx] L}n+O`#Q;,su. ArosЕ9+L :0BVMԬXѿ피YB,W@urr\-1yj)0glcz)B\ ~4)FkuV;Imczu.jAph:y1Df`k98c gΨ*0W8Ӑ @P}q1ki`Cԡ,"r@}mzi,.vrl^IJk9(a#(ABxvM%0}bXò)x ρ҇f[%C5:Ue7`_9x`;CM: }{"A/dža-31Si9Aq(1Vo`8Y[ FLAq RG S4~Nj_ľmǝNľ|?߱=b`L?TZ4&LR+&fEt Ubt*(SL=&[%$ŔVGIW(^!ZCbޣ5R[FunCjuhfnc>R:]XcDzTbc!5-YUc*iȏY{5H텠>LV_ E(:kǛX1F~Ҁ`r.X1}&w::]l-Wu,&dMucd<4V#y/cӋ]IŰ[r[KMH%w'\4շ$x=EdVr +e`dH귅ٟrl]1M.aZ0mf&Iab.1$m3&L=$ɾFd mS SDm*~u$2adTI7R +Lˌ7˒[$?\a!I1:[d.U$5pSBVӵt_#5:](/dO1MfIٜ5gZ].+I=6׻%ŒQ1e ) X^09\?o.!__՗N'_+#%`X}ʒ/yΉb+ 2q-(LSb_cr!hl~Ml^X>09fEP50֙S0ͶU@RՋzA.9Vmㆼ(2 ?yM]4jK/`^FP/Ĭ61CSsLe L>a][;aulu$O3G6|=-ŭ{3(X1uj1YQS@ݳ{} S8Lqܦ`ZZvldY4ԔH[=dr0'r: Z/;r9YdĬ-{asla$(bv$}[j5P<} iҢۦJrI3LQƇE`^4 h Bо*lĥA1|feR,#y g]K ++)}2"o5IkAWx5lq6>Y FC/ 爜JvòW/Y ܺbpd_eF{q؇F잏>}mni,&f`![k!S`>8u& rxzI|N491YI+N;(R0>BnR6`t8~}YM & z=?HU*#UZLvQ"8׳d Së<RP&d{+f&mc: - +Z/&2p.Uql.&0{j$ 2v*Iuĭz 2jHzw(SbMja\,=SP.6Y-;6oTjXI79f&e68c"%玬1eJ^;Pԓ1a7(ŜVF,5'A Y0Wii,>I4E&kRm  X\6'19p1 ,^vnBz/0c-qTR >n.2A6h`yʟ4y46(P+ 4#9(Ӷ^<ϰ"TN{lhy%^YaP +]d*/8rl%*W=#y:;ŵUϟZ3vj#U;@X XW8F:af CX}5,WJ{,T'֭_ ^3CIe=F߲Eڊ7;o0+;! f{B$O!j<ő'so@sԩift_ɁuH~_T-`ZT$VZݿ,B=oz5ϋdg64Nmg۞Wv/;R}mG(͗dTD=c \/ ["3uNμurYz4c~Yζ4+Q.j@y juYjqs7S6k,\ޜZ0yL"loltpۥ<,r6sܒXYSKXK~,s@FX{4""jU(Frڡ޿;Վbu}Y8Q֕l:"X!2XdX>)Pe5#l~3~ki hܸmw+!q-3E\=tLy:EIcQ*x#0PZ b J2]%μQUTۗ ҪAK^~znS) +*¡5i W1 s7[@\5B eMLűUr+/uw,vݜt: k=yn}NjD ;UQ Nɫa+%%`v@6zf]CP`[S0ށzj>C$Q|C`FI30%jR޹C q,c{X# r-3JF_mDea< HAa;P/3V20 ]Ea3ZYQN>iv:rz9}{N1X*C)(^ `* +(9bJFߎdQ(>NQz>j4lHbF>LZ SZZ1bj 4/__O<ɄSLw-يbjk,%BSH_"gLsdxN:.Q0^;4:7o/+얤(Nvgø,n<WPǿjTiav19EP`ZVarr1_5f/|4I}Cowk) *sK<8v?֜oFo+Ge"oͷ-86s휨Uۍ{iK5K,K`viG@u\dv c1P)Dz|T;K0ŶiW-qjX G0Zp l垬~t'6 J6vǮpNvi rG l\"%q4E<HM * pa8SbSfL u-| g_ 88VI^X4Hi=wa}ͱV1IV'E`1 FSHZ&EyxuJ[džu%ߛ0L]evʥfL8Fx" }  m~m$D "|j W-0b 8(!fv¸Ƙ-XX fXO멅Bb%bÖ L=r+Pu:2~"HYlL[2;h5Q5qOiXl_b[QUΆ$ h_;'uqY: rx+k%#aMݝ<#2[L&FH:@6η>'86F> H]xuzLI Ŀ{s+_>'d[6J6\34c5˃J~ a1/1lbX#KZ+ BFC'Zd>e:y(ůk5BX g.b6UdڻTߓ u~S"a>J*6#\%:L9PoyqO_FK j)9|-v^+3 eճ`"V攭F'4fZEB-PqٰK2qAR*cMXfB +V`JB80V8S'ڏq+Í /h-1 uI/Վ`fV:I,q-TI,?HYӀ4;' `#qǫU8E{W @:P]HmT`{O_Y݊돿Z#d"IYW3_Ύ[t?&w8_/G|e}pH+;[響DVV_}nEm3bc0q=:A9 cM!epO?/YBX/)މm 0>zy.$ݖe'[-'2w\Le޷\Mn!Ǐ޷]۶,nmmsʁcnuv4Q0Ǐ޷>ͭnyǏ޷/VgZI׭4>zuFBmG۾׸nԴ3La?~M+t䏟owv揟oH<?{uGk"_qbz=#a_ry?z^n.y?z4>{^Nni?|\}\}%\}yd ^myՓ"Pv.zN[PXvl{5sьoJ!3u?%c3r:ȥ$l?pAf\Ed3r㏺fG}."OϣNriA~K6Wd1VwuE،bqi,ilƯ(c<hl?ng.*Y긴 +fCv<(Y،_Q<6qiEJKbfSwR'6WDRKfSwR+6WD1|NfXÝԋ1~I،N*fxÝ9W,0l +[ _uUYNmL_e<ؗ{/Lӏ"6~CQ.?e+|1pn-F^?zx'TntmexyTqdo}ߤ1Mn$1M6ߤo2=FOo2MFMwi~?7~1w̞;|37}&o2]&e2Mz&1{JCND жǏn0z=a\T{sSFO%w=>a\T{S)SuFO-7x}쩾ާZ[ z|o1{}l;{g=>b\\{FJ˄o1{*~ +0[̞~Ko1{}l{r n1{}잮?AW~H~:|2{{{u.l/R@fʳ=RGwpWGVo`ql})Mhpg? :\ ~ue6J]b9P.m.= _,T.]T?XpގZ–R{E̱MlV(wСƛiGWdC_)U`r Oiچr` ϻAoˮ sD&hݴ쯀0"բ"{l[6ɤIVQY KMS Lk p[?ϫ~2qŜ]ZCXҳ߃G]jK`ěݑ_oS`/\su #oZZޘqZ90U3UE.Mm0D%Rpg~ZDQ96d ̊]C3ղk1-`r#h ئe FR[[;j.R =z5y 5a`A-/U\oX:Hd$)gZԇ"+j2Rsr{'s C@t*kASՑMC Bjˮrt FxW ,SvNShOzcr#خɆև:V,W(@mϻhE)Xf);2rZXbTl벆+ 8L-03ag#_,F*I aG1nm`OgR[W{ds8!S uVd5)޲!TTTMmPtiKQz0ҧ͸Z&"t920zo;2upN[rD""K1d>\@!+/=):eAHc1d< ª6xL#yHw7~u64W:l)fkkwB8Q0=ֈ~7"@/nW=$'%ܨ`]'9`sl`g[vlѬ˗t%;}&ސ_2<qU1V6 Tvk.B~5Έ L?iGy21 DzBZζ7Iz7udJ XcU\&]A8ES]|yQ4/wւc1X6ZZ78k[A|0j!iF9ȫn 竜Mxb;`r*Pa*یo~f`Z@MdOAqc,.S ߁(p%pg,APZ 5; [2qZ,Qo$#ύp| I˖pm ҇je&XoLl֦\T7p)7&{)^$1P|@?Vcwϱkiu <Rit@svGi,Jg.萗odxnD=P#<\b;0T52ɤh}α{8EXځp,b@G5?" lhG"^MDU dSh;P+Q! |dC-96@7ReYŸ fq;~" ,$B߰- A' <Ѝd{Yӑop6yW:xsGAA9l}tC?) p9:Dg;[6wQ5} Nᨚ_k p'ULh!ؾ+p=諱cj|1GrC l'Gc:鋣 N8ɣ5K"9~#yv P/,$A^N~]FjB+\=(n4 WA;hԭ>~UN7=dN7yH lѵpFG26AuZ]MG\'p'FE1^5vm/=-`ndC ynd4Qd>w!W]ڸ!yYN5:+Ֆr40k2PABp;|hj٩5u`;P})A`4_v+ϣX=Hi5e; F_SDښj;נA=\sN&Ҧs52YcG!Q1A}_O5$ sX{Bja?}'d)n W'/av-uhZsOTdsJ +,G|ZS'pOT gT Tϖћg*L6F }[e[B,knF6Sϸ5z‚A6l]aj.,d#O>A6j l#2Gj`ⲓ @Epyj,kjlɍY') `P Kj,T"<#a$PN52vpnlD[%\jP@* aT#DjQ`߹Fq$ZKlQa0F]~5:\P)m=55HhMi H>`ȶg*5'>k4qǞuk.U#sM D@HA 5!W"mdjhldܘ3{F6,1e'x-<[D uD*'Q#אA6< >{FRj̦\)YƦPLN Z@g_;dE#a@V$BkU @֚-<0 +'6A7m܈Qƺ\bgĈnt#[j%ƛY9D,UmP p/|+^raM;D&^V<ljdf:?{f&JF8 mj()wAN: PQ&_7AAX:17c I\@;w7L WW7FQbo5:2 P"Kk +"uF=-xuVfvUPjNA7U`<C(va^rVcP.mpcٶȵS{êQf.(Ql[je){Z7DF9 OIoh;`\qCrCcr3 `\#7aZIh. +_iAc7y#8hwmu?.# Ct0 ZՌW}®?˯O~A@YKLgXJ%co~efHeom3$!H9<2*0Au O٦qӇ|c3ߜ(rleb?eʞ>E~s`;wjo^en[ 63Gm *h;a?d[ +d>~$k+77ۇ޷  Ͱ}}H +R?. Ǐ޷bjkl>zuT2L9am_K%d}}%~42l?zzݯYC Ǐ޷}ݯ`21l?zuƆi~?|~M~}{ۍa5Lq~?|~MlǏ޷}ݯe6G۾;m0>zvm2ubG۾6G۾זdB7ۇ޷}ݯ-۴^\XHҖXR,J첾m窮s?T3t!)\X<~|٠R-'L\s•\foLprL/2i>e2׃( /oO3}=2m>^'Bi0}=ӟy- +-L?yglY5Zfzpw̗-L|RuZfzp̗-e>^e h|b۵Z>~|i+L?yj{0}=z3 +Zj+O37[2- ӇO37 a#prO37BnL ]DbIa;5(>2G>u8~ϼªeTX>||9ei|=ӟ2x% =׈GaR 7Зzі'J}W3njq|n{'6I=ŧ4qC{߼doHfr ;L2h(!~̾7Y{~7y뛌>a}o2&E}o1zw&}o&}oR&}7}6ߤo2a=Fɍc=FɆb4=FcMFCDmwHajgi0z.}Z2٧[cJf0z.}"HRا6Tn1q.}蹾ڧZ;+jl0z.}S SY-F>j8W>a\T{s SYFŷO7}}*Ľ:ۧ[ +ljn0M|7,散 ĜE#¸oB><[XڋN/vQ̻ԯo\PvŸl-v{qu2n,v{ҿlS\U<۪ܤ7{$D wIu.|z)Wj)/7g07P)cO9/~?/Lx'~2p 0|W {0yaG]1x#aWL>{x(Gx`׎7CfGN]0y:\v4yCeGN]1xSeLM^:MvWN]1xhcWbGN}=';K;t@yK.^%eޔz$b6o`b/nyy;mml%n&;֔3ho\~{D + Ziȓ7/Mg\O_득nYأtXrJ G5}[s?Gh66S}Qa}[?G5}[[|W&krO{!oRGs]=)c(x_?duA{k~aE=Y%nUqg/~*4w}Q3V^zjkw)/l]6 g.H~eT"__wE ]䇕uD}rE6?o"Zj4 ѷ*&ۀ[ emz504<'LtvHaH\tnV3è]B Louؓ+j'[.)' C ]Y]ձ +v9$e*504/eOT=JB.C {Z |;ahi0Ȯj/^ti}EmSi쮺~"v¤մ,M:ٍSh*.5ZЁiJG'ZZe %Da 5a.!?{37}ű"kSuL75:c[Mk}ZJv9IJ26yշs`JŖ&HӄlP A9 tT =&k)tGůP]ȱ$qUB=UP^d6}EE 6lk7lq4%^ Uݩ3WkJ têAńX7‚t04d2u;`5-&!ÆM%NVKHUK3T=zO4H䣁&hik.v-3J&\#AhFjܸ.NC8Z95ZX aXeACntC& {g RE/5 D 0 5TIS7h~`\WCsd=RV!I 5 +C0 9:1RCfL[S66ho2WGnex&͛OɱæesW"E%_Qɺ֫c U]spSCj2Oi^F'Z0yoXy.0dCׂ=F0SH*z-e. F4t40$sCg6{3‡@4".=lg 5'raԡۊ11mnYxye^ ][mǬ& beѓ5eaPF0-;(;LڰY\f_<}*/v5QAELX[\[ Ih22*ru)- Qe8 ł|ŽЏh}5 ceM$=$S\bj#7Zt" +$ܿx<ª*#\fHt&uĐ chp> +tcg> ch+!|'a!dM?1#3!ƿaf^aV^GTЗ+l '5E:@gYXEt^bT3fe)Ќ}؋9`{?촎uBlݱCo2k=g54v*1l:@44EVܯ'sA-@q=V鎵 4dá#M׆ԥ)J񗉭X<떔8ZVPG jORudA>`t` G#X ȭk[ [ 00]d)owUy[ 7lt[ f[FNT6ȼ+<((\ 6xyCUqhkآx6Z3~ó4:^~M88x(5bEZ@jJ0q rЀ}D'VIfN0lQ/=xݾ7`$Xkxaj46x;!"M2o_[u:Tx>6 pbAh@LcLX +0t}6 EV`4Y\&[,AYhy|I0'ib, ̡ l0=ԳLa0lр,?l iW펅T}Ґ͌umh0.0hDr4*Jq͡^#xﻀb@mc6 `;1o 3xCT5Vח/r6F2lbPExU{ `1Q:ʠ-M +Э +zxR0!<Xs [CV l1t^L@*i`+97Ƭn& [L ˱զ-&@BX:.M_U3€l5lsL&#>ӝYpDϓU wh>kq ǂ #>0G. ˅ ͣS;L,G2lSBw!EV6J.0#ʦ``^u +42%LMoP7|{Q41sd`0|H0rxYA0+"Qcb ž,+h0ՠ`~s_Q῱ߪd77 +0lL_ sQzJ$nX9!Up +6(NUW lEܫa * +[n/|E +A,%k1.Y*Ut:1&wiA/Yl6,ͱ`$0oZlHj%] 4 0LGS`cgy?J%1Fp~o lJ7XPCm&MѮkJqu$!L`g ԞڐhҠoEJXtd C6#6E|PuU%'d&VK_fu}H00SG Nv`&됌QdObCuImtHg$Yj+dXB6( [cˑji'VWԿjU|~/Y X(6!7uH[*x f>|>(5Q9.[(}@`Yvǀ92p0P7FUߺxE0~g4Am%>2yK\b:<."/ ĕ9D~IO\0jJpYyy2@G^gUM0 y 0O$>Nw #$8 읮r`b|RpCӓTbOF'aXZjc$4Ys[l/Wy%2=v@\keul Z .l rѰ"ktP}eN6y!J z6l f)h̲Ś_$ CYp f aND s\٪\AY  p2]cB`|.10j^eppMSQR8T'U#x*u +& 10:&x; sTjtl@FTc yb +0bx LQx`~0VV [IRCYxw(WͰMh-,&XTW83O3m&P9'Uz85zf~11&V7G;biŬEVm"C/"@MbR68^ªFWYDU6j m"$آ^Ol@լ!&|s&-d6`KM2HR vr+`m"@//^'t +keE%f`,ZA!ycX]t%oB}TsA+ 1vm˘ +kIXx{5lba!y$n)px#IbЖ lxjخbGv] Ad*Ku~:`6У abH-&SIt' jc A FO]u/ρ ,7P3:n9:MXUD- D|nAB fbY}]Ě)]ɰ]Dxl5W$ ]VsT _ʼn-*08L +7J +416{}3bjk:g6˃+>+ya<(H% uұάTW7I%,"EaPcL==H%kPlUEM:̳ 6bpe>qji)(EmJi"0zzi*{cn=2X%+kAlT"R\j1l"bH1+?& aV<$Ȁi2ubooMH2l"*Hh0l(f'7ɾ {3O?/8)Fa& e@6o76(R*RYEE.{ Jr21Q?u.b c{(;j@G&(R*KIVg +Y@l1vO渙@Z!,p-'Tա> @ T!c~bmkK@r̡f;T@_%@Q81e?!Tm94k_r")ucOYJ\lzr,,􀾍|}.~eU`P0^@LJ-}T/v=I4.,~r˼JW79ْ y/๤G,.EL7Q'x5uhB/p>M_"ߗ-=VbG?=f#Ʋ-{^O\v/& +uYO~.9ޗ`&PZ?lnleY[ {X+s4O\v/>m\}V/ev&suZ)suA +Lה?x_UfYcӠ>:mVkCh"˾J/G6٧~.VkELk!sO\}:Fz3˾ڐ4Dt\}prnkͷNRk~,;k{.G}sZw"HZ,ZA6tSN]\r)Gd~.ڳ8g&=XnpsȾDVn^r,&}Xd߹XdB}WSvD7՗+EE|;|Hqi"|!2 n݃,{\"rEq+7o&=.}o]P,?a )="3vXd߹XdծK [EgZzȾsyL]/3nƔ]>j;WϴaʾuP]. aʾuհP]n"Cvo]<,?kEEzrȾs L]%&uL]. +;SrL] [ϴ]|ջeor ~< 3BF7g~F7g~vF7>シ'~F7g~F7g~Hs.Yo GD\SЇ G1w 2ߗ'^{_J~z-}}B襤Zk)Ku#B/5/eO>"B_J_z) ?!ZR/kUKB/O?!ZRKK1B >"ZgRzkKB/OT?!ZKR^KK]B__ +z-~$~DV:]:>b? ﵡO2_ +?uyGDo~?!ʻr ke^z{hnӡ7*. +%ό 8p?<]4ل'yE]q}-6:xB^ ]x<%wCDcuaW wߑ w׫w$"_D#w%i?6N0}#M$5*Mkۘ7޴@핷fHxׅ r>4@/3PlH +@fnBoƻ#z u ;/[B/NB#z u ;Gn ; sYsBv2#zt˼u//(E޵k, 6*'؛;H.B`co.9 }u"6zEgco9| @>:'؛LB`co19 }"6撳'؛+K.B`co*}, 66P|PB`coB9 }, 6؛kOB`co;}"6憓GۄIC3;|H, 6輬K"‰6ƿt=?ؠwiAMjf/1(Zn~ jEh위_p'V*5=>(F6$=88mrq =/HBlgH`SBz'^Um^KM e46vo&6e34aT6iQ,vb%)ˉbGHl_j(- /)ӶMuXߕ 5Ԯb3I^b!JsՒO`habZP]-ZeǶվM:%ӛg+.8vɘ8G,I[ŃaX1 v4c"9C%4́jzס* WI*1P"͓#65`lrcsƯl +$[(tz84&W%SJ7F<ŞN)`l7IFu>aOɂi' xM,j R}u6~m'c{A tby,2DA]ewўeu+{=GaݳِQ^DhC.,ҞSeKK` i%M[V⫂;I!0ڛLa6pl0D\Z32xT PA~;u*mJ=*]z&"ہfZtP+MZ0V*wvV\՘+H s[z}a3aȸz V0 )\XoGmv*0QQ1l $Xu"-Uhvz0o ~NrcoR^5˔IZ9~1O5bT9FŠ วlh#Ѵ'a͋^0>0x8ut +cZ"3߰f{eK[XdqZ0C0vQ:WOUrKOg^C[òuIF2`}bEx.InbLlJmfi6bjڵY1vM0s]/js&0;#uOSK`>f,!v6ul3aW{m K +ذ)w|l\Al6jyhA%iVDwfpH7ğHAï;1t* Ža`'E7Vq:խ>ӟmAGq`o ;'^Ie56GXF] ?~z +Ͱ\rf@`l0eu, j))Vq'N p{R*g\V]_/=*Cui@\՛`|ۍB]M"azQW;aX ++vpdQ z4em~`\tʇ="mI(vj՝dcyNk0O_^=*ɩ&[TX6oͬorcolW6 T%}1QX_ 2F-LkVR\nl&lf@?9Oll /0pY{Ï:0|Ms,*7tRB8C*!'Qxoz֗) ű1Q`1;nS- )LΌU #KȖX.baae*<܎[0,|oz+<]sk1I$ < cD^x%($.!=d\Giv8p5 V-*n0:hA f*li\^ B둔֙ + zFGѩ6`ڀ v?b?rn' myUق +. +;L{1,B5D%LqW&7Zf20BdTXh3ht=[`QҲZF1Ԩ:C5xat҇'W **F/t`A.T3[dk,=-u@+o!`Vqd`xf.B !bbLaXF3Yv?%4 pP߻gBUlIR1% +.$n.r}isܭ\uCwMުDaxk-#$teOzVRXkcW Z=a0KL!#L@)8tDa51"0Ҹ%bʆ /؍b˴H-ewHI1|JTbJU#aU(MJE`N vb^i  WLsn-XWhIX1UYHJ恾"sqXX8AţXL \*H08Gߠg ,, .BBr` !:qqXTnj_Q`ju/)ʀl۝$:fMZKNM;}oAcg0KMy CQ:kZe-/KAAargZa<gma Q CA׊P.o@W@jV l (E+o; +#G$?X3'abЬ2r13%ظ`w]ҝ=vàwhK\`WD,E&Y߃#6ôB,29aY.eRu;wW c-BFRn/#u~UT7 xD2{=!fqh;E'iB=^]%:h?6 JV̳BC3ăJ~JVjS 4cx ~>xUu~+ n.(<U)F&4H H$X.A ?RVba3҆c?`cyKJkA&( Ҷ);&4xNQS|>INi؁4D8 `B~HC3txh +Gch9!I%rAceNh%,t<g7cd`~ŤX'Q72 :\RLc 1c"1--!Z,]8̳aH3Ϻ&. l A3m>e A)`(Q:N&;U4Nl>,9lTC- 9TĪCϺh]ϴHCǺ Il!xjX*)\aC1yÂ8kRå{xX$+MeڗJ L +Ԁbi-})OT 9큑c- M2|9  C5 +7 +<,8 0IQSL%&"?΀`X#Ƹ5 k^8ԱK؂Xւn` U5T͙Fn$4v3 ]a zxAae@fYE2\%`>Q1($)(Z9b KrAse'qpa_h +Dgi)1bc1 1МYݠ$$B j,`:@A u!aF{ͱZB|[!4Pz~Z&"`{ν0˛ijA|z7A#K" +!gtu-a@- |SnIo|'-KRhvce~&/d{f&d2qӯư2 wXp2TK C[2|S:!V]b90x&ğ08.UKI9%F˟*R^(j^cJ`$nl`Rv*]¯jqnA-J_i_Q\ i :=5X/#ҿ@fg )h]u\Ō?x /?eǣÖ^ +q5R8Y0l+Y?(ܶBދ{.x.^ff'Z)O\7?)8?h ;?y }a$wYf%o;"}BGO\v#:L~.~;_GkXv;.̥0˾wTqceoS>xDv^M˾ߦ^Kߨ^6食˾L,d~.^G'2%su,q~.v~~.~cIu?~_ñG5]%su\%ؗg?~_0^\Z.0M{@DžZ^鳟K@Ag? ̎]鳟K@υ_鳟K@ρg?lߞ-@֘Z- b(DN)%"fěrV7<^ڳ4g>PC"rqs_@ R~(R狤DD:H_.ޝ{D*H/wjS"ƽR],^4[K,~IJ\$?pDo^$?f׻(P"CvJ߹ +J߮wCQ+DzGs5P]wQ~(~^Tۛ(<|.9~'\DnsjN"έN"S wo$?pD[DrsۓP]"ٸuP]nd;1f&ʾu!P M7]w yk:[s1)̀+"65}]L"U8Vʋ^TxD5= xwߌX +2C/O*V،a%hI7)G>Wo&;o&o }}Z!ϧ?$DCbˠ?%Cb˙?$dSb/BM?$9>.O&2ψԟg"Wyz'`'&BuJ'D^u_Jxz-}}BBh ܗj'^kr_tz)}}B9:G^*|_~z)}}D赤ZgF~kkE#beψ=HRZ(K9K#B/u/?"ZZ kk3bb|kkbw"Dju9YxIV$ +lr==`|"۳_͏7O,6 "wZ#n :t?CK7?:twDCo~7k ^ijA.$n+occoFnnhoDĿ#^[*! _$#!|#W@ƩGKԿ"hE@+x7⫄W$dZU[|\Hh%0J獄 +7}v>fGgn<6*dk U#]qoƽ= ;|d^>1jb>8~FU/ۼ[jBon%r$Ω;Bؼ[n ^; s󡵓na5'ީ?+gOٕ8/;B'[GBo%r$Q;B'߼[Gn x; sI;Gnbn^譣n>Bo#z u9/9[B/NB#z\ un1;n ; sNesBv2ƻ#z˼u//hE`a7M>'ٻ{F.bdn}[" ^VٛDR>7{wY#R'" Ғ'8ڻJ.b`i.*}" rڻkIb`k.$}C8$p]>}rk{wE}'W0w7\>qr{{wUݽ&g0H>k;Xܻ+T.Rq,&`ag%͖S ØXΒ#,!~{MAcGRK8Ŭ鲲BHgc1j`ýƏrڜ08†d [ 2b$/0Xa9dP\;HQa?b۽MlTvoC5aPl4zŠj^izƘ a|=JC۲*_'VgSŸ"t097L:& a 0MYa+`eF% +C&֨8٫Ѱ(=UN! Kx!{Nlا9Dwv} +\FBj,;ä-$] E06*&j0 0_.=1aVcNM$i +0I% &͊'x\Ö .o:?Gh%À:brb\εI$l &ƮkLQq0;P1aOӨkSVSCU 27`!cڝ}aԵ`q:Ux#~OE@XT:4{.kn{T0]nIz<~ vƻŨbqX>Uw{m*q t`҇Xhؙ|tD A'[xB՛6I&v&hswH 0薔tQ H#=3&T IRnx *mؙ +A3 ;Sgu( hؙ +aWT fi)XPX40b؉ +Ę$tq&I(^mabg&X{ؙ @؅&g!i@1ȲU~oYL;ZLBg&YmwL?Y/L@}hؙ *sag&5׳MP0G=څ `*m^MX @޽1%["Z9"@ s 8̕'uWbxue h&< ִɹb+pE%DԎ={dsDsDX/%$7:  qJ$&dL̑bH$6< v0h s$X:1s$XGk,$XrI/HeBԭĉွc /Ցѳ`l< X1d}apJ1c1̱J3WB 5E] qyb+̱ LJQ3̱`;3 Fe( rRQgͩt0 +XTjYhv^i ,C4Dp#eN4K`L4`24$y{g(f/h|YED<.Lr'P-\™PꑵF_VKg"9T#v"n+v"p0JjJ"&2(Y.l-iDZ3tI>+v"f%b'"7˥3SVNDwg0ްoC㪯R@nyg&]a'*:kg*avp zLD"|F`(`oh؉ @;cLp{&ӦNL KSz2C2`x(F)L{& L@pj {a*V {YwL_fMg&ͬQ=," + ZN؊Y=8X8'tb>|g][1_@ac6l3uLDfVOaC($Od0| Udo*ЍaydXgR*6($T0]0?jc97[K K4"L/6@N!2l[ T2YL.$i87(s0xی7(*0'Eg<YEQ"9?غbdXz`~SL&@9*@) +d8} +dVr{t VH0GJ,WSׇ,f7`h)8 +#?4:ד$ae9*,gja`ae2$S1As[`~1SLv9Z21,nK0vOαx" a 0AZl8Rк b 0L LEwdd6 DbP3K@bFzx"1M(cC9"$qXiM:Vb6z"-R(V7=`5x^(rs<+оpPK/mts<X8to+xH{U +,IJh@b{V&`gcHV< BLoB,98nuco-S26?[D:uf7 [ %&H@俓L`ݓڀt,̑AcөsT&-T&мũ9 E!pG3̑0ؽMY1̱,o,:Y=ŮX< d<[@G`wB`y :& MW)':R'`Crt\`9X˞ Ċ%cC38&# p00{B=Xp,1^e_r|3qF5) nRxJc1µtXAb6{ܴXlceuYԹ$a2d)l0dLJeb;Op2J wgc 2'CV$!Bql" ٰBb$wzfI j_al1Wͱg#$v0= n`>Z)KHPoc& `Vy'0' IՉm,p  %gQHT+5Si)T!aWE9Әf Lb7] +ò _|!J$$0%7MG#U7cංMKai3p rib407ch*"j̘ nI ҨIV :if9*<5s܁ÖՖ&Ƀ ,4WQciH7}`2 0 n +S[ ՆE ᓙf1IE +q`*IDBiDJV% Ē{9'Ub[N 0;"!{a.18T"Q5 /i*MzAM&^GiXHLJCLY]ŋ=``tG2˘w`Ղ}&ܼy@ږgb!iwc)N[bz:Ųل1&>7g F ܼCNB7 +3 +%<-al$n&|i;Αe!aw0 o ˑbYTU +mIXa4-ȭYfd83̳Yʱxix37Ǘ*'x"-kXE@.=-*!f?[enXUON5S1V*NQV7ˑi0 h+e ӓş`#̒cEd ̃zr۵f-H! 0e +?Oݎ +medifGV0`B-p16sG=Ɍ`on"%P,sG(vd$^f32I?L˂ӢǙFf_:%fHR4bh3h'o򥎘 ϑybp_An:A.tp&,,sH^supsZ`M{S̑w('IG𴤈lt48cIOI7ptQ 4W4ώ 80ldr!ݟf=4W4Vs<qIi(܇QcsއyRß<`sqsF h]6ß,dHNlS.mLOkGgEf4NpY,8LG +97?15++(܄K@ n5 a #%f~dG8z. nѥ%Fq_2ßfmM;0c\iށDю .¡w`j(6[0ڱ܈` Ö;& +l씃`$(4{;0ܵgNPƆ.g|w 8xF 5A) .Q`HtwH|/2'x}q6{< Н&B݌ p 1\ cd +8!wekb^d7Ut9 lf+?Ri"ĸ  Y`\m# %Kb""Mpb6[ժ~.E8fz6PE8r!B1lQ f3p2b>zCl1"}zrn +%y8(e!Vbİ<"al`}R]q -tUP?H1oAqDrѝ.,Zcue3"wx&Alb X6Ю`31C7pRbX[G NlQ|(<9Xv˰.AvI .APŖf( LU_u' СNpQ"Dw6pE\ W{cbsxW}tlQ8|f_%mApj&ډİE:) ج݈&8YG4~;M0ƟFR٬` +E;T\ <1]kRi6: X}`0Sl{[[Gulíӣa"ӭɝ&v9 +7iB&8A:kc9ADPvaxjZ !#&kBsIhߨLv Sj?M9iIlv 3O{3:/onKngb]GLg1cO +57 ,t^=5_LAՈ;F+GO7s(^bv?b5K+?Cס]\*/ <&K 3+p/?.ȟߧ\\ؔ.)[ endstream endobj 525 0 obj -78698 +78670 endobj 526 0 obj [524 0 R] @@ -4906,64 +4892,64 @@ xref 0000028171 00000 n 0000028226 00000 n 0000028281 00000 n -0000107057 00000 n -0000107080 00000 n -0000107107 00000 n -0000124250 00000 n -0000124111 00000 n -0000107305 00000 n -0000107560 00000 n -0000112535 00000 n -0000112513 00000 n -0000112633 00000 n -0000112653 00000 n -0000113142 00000 n -0000112812 00000 n -0000113576 00000 n -0000113597 00000 n -0000113853 00000 n -0000115496 00000 n -0000115474 00000 n -0000115586 00000 n -0000115606 00000 n -0000115997 00000 n -0000115766 00000 n -0000116310 00000 n -0000116331 00000 n -0000116583 00000 n -0000117995 00000 n -0000117973 00000 n -0000118082 00000 n -0000118101 00000 n -0000118492 00000 n -0000118261 00000 n -0000118804 00000 n -0000118825 00000 n -0000119077 00000 n -0000120649 00000 n -0000120627 00000 n -0000120740 00000 n -0000120760 00000 n -0000121151 00000 n -0000120920 00000 n -0000121463 00000 n -0000121484 00000 n -0000121740 00000 n -0000123276 00000 n -0000123254 00000 n -0000123367 00000 n -0000123387 00000 n -0000123778 00000 n -0000123547 00000 n -0000124090 00000 n -0000124173 00000 n +0000107029 00000 n +0000107052 00000 n +0000107079 00000 n +0000124222 00000 n +0000124083 00000 n +0000107277 00000 n +0000107532 00000 n +0000112507 00000 n +0000112485 00000 n +0000112605 00000 n +0000112625 00000 n +0000113114 00000 n +0000112784 00000 n +0000113548 00000 n +0000113569 00000 n +0000113825 00000 n +0000115468 00000 n +0000115446 00000 n +0000115558 00000 n +0000115578 00000 n +0000115969 00000 n +0000115738 00000 n +0000116282 00000 n +0000116303 00000 n +0000116555 00000 n +0000117967 00000 n +0000117945 00000 n +0000118054 00000 n +0000118073 00000 n +0000118464 00000 n +0000118233 00000 n +0000118776 00000 n +0000118797 00000 n +0000119049 00000 n +0000120621 00000 n +0000120599 00000 n +0000120712 00000 n +0000120732 00000 n +0000121123 00000 n +0000120892 00000 n +0000121435 00000 n +0000121456 00000 n +0000121712 00000 n +0000123248 00000 n +0000123226 00000 n +0000123339 00000 n +0000123359 00000 n +0000123750 00000 n +0000123519 00000 n +0000124062 00000 n +0000124145 00000 n trailer << /Root 575 0 R /Info 1 0 R - /ID [ ] + /ID [<53A9179B35E54B8B52EAF353F916CBBD> <53A9179B35E54B8B52EAF353F916CBBD>] /Size 576 >> startxref -133086 +133058 %%EOF diff --git a/figs/detail_control_decoupling_coupled_plant_bode.png b/figs/detail_control_decoupling_coupled_plant_bode.png index 860a76a..2c4b73e 100644 Binary files a/figs/detail_control_decoupling_coupled_plant_bode.png and b/figs/detail_control_decoupling_coupled_plant_bode.png differ diff --git a/matlab/detail_control_1_complementary_filtering.m b/matlab/detail_control_1_complementary_filtering.m index b081707..1559b83 100644 --- a/matlab/detail_control_1_complementary_filtering.m +++ b/matlab/detail_control_1_complementary_filtering.m @@ -69,108 +69,21 @@ H1 = 1 - H2; % The function generateCF can also be used to synthesize the complementary filters. % [H1, H2] = generateCF(W1, W2); -%% Bode plot of the obtained complementary filters +%% Bode plot of the Weighting filters and Obtained complementary filters figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); +plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'color', colors(1,:),'DisplayName', '$|W_1|^{-1}$'); +plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'color', colors(2,:),'DisplayName', '$|W_2|^{-1}$'); +plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5,'DisplayName', '$H_1$'); +plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5,'DisplayName', '$H_2$'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -set(gca, 'XTickLabel',[]); ylabel('Magnitude'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); ylim([8e-4, 20]); -yticks([1e-3, 1e-2, 1e-1, 1, 1e1]); -yticklabels({'', '$10^{-2}$', '', '$10^0$', ''}) +xlim([freqs(1), freqs(end)]); leg = legend('location', 'south', 'FontSize', 8, 'NumColumns', 2); leg.ItemTokenSize(1) = 18; -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -yticks([-180:90:180]); -ylim([-180, 200]) -yticklabels({'-180', '', '0', '', '180'}) - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); - -%% Design of "Closed-loop" complementary filters -% Design of the Weighting Functions -W1 = generateWF('n', 3, 'w0', 2*pi*10, 'G0', 1000, 'Ginf', 1/10, 'Gc', 0.45); -W2 = generateWF('n', 2, 'w0', 2*pi*10, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.45); - -% Generalized plant for "closed-loop" complementary filter synthesis -P = [ W1 0 1; - -W1 W2 -1]; - -% Standard H-Infinity Synthesis -[L, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - -% Complementary filters -H1 = inv(1 + L); -H2 = 1 - H1; - -%% Bode plot of the obtained complementary filters after H-infinity mixed-sensitivity synthesis -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); - -plot(freqs, abs(squeeze(freqresp(L, freqs, 'Hz'))), 'k--', 'DisplayName', '$|L|$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -set(gca, 'XTickLabel',[]); ylabel('Magnitude'); -ylim([1e-3, 1e3]); -yticks([1e-3, 1e-2, 1e-1, 1, 1e1, 1e2, 1e3]); -yticklabels({'', '$10^{-2}$', '', '$10^0$', '', '$10^2$', ''}); -leg = legend('location', 'northeast', 'FontSize', 8, 'NumColumns', 3); -leg.ItemTokenSize(1) = 18; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz'))), '-'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz'))), '-'); -hold off; -set(gca, 'XScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -yticks([-180:90:180]); -ylim([-180, 200]) -yticklabels({'-180', '', '0', '', '180'}) - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); - %% Synthesis of a set of three complementary filters % Design of the Weighting Functions W1 = generateWF('n', 2, 'w0', 2*pi*1, 'G0', 1/10, 'Ginf', 1000, 'Gc', 0.5); @@ -195,45 +108,16 @@ H1 = 1 - H2 - H3; %% Bode plot of the inverse weighting functions and of the three complementary filters obtained using the H-infinity synthesis figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'DisplayName', '$|W_1|^{-1}$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'DisplayName', '$|W_2|^{-1}$'); -set(gca,'ColorOrderIndex',3) -plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'DisplayName', '$|W_3|^{-1}$'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'DisplayName', '$H_1$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'DisplayName', '$H_2$'); -set(gca,'ColorOrderIndex',3) -plot(freqs, abs(squeeze(freqresp(H3, freqs, 'Hz'))), '-', 'DisplayName', '$H_3$'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +plot(freqs, 1./abs(squeeze(freqresp(W1, freqs, 'Hz'))), '--', 'color', colors(1,:),'DisplayName', '$|W_1|^{-1}$'); +plot(freqs, 1./abs(squeeze(freqresp(W2, freqs, 'Hz'))), '--', 'color', colors(2,:),'DisplayName', '$|W_2|^{-1}$'); +plot(freqs, 1./abs(squeeze(freqresp(W3, freqs, 'Hz'))), '--', 'color', colors(3,:),'DisplayName', '$|W_3|^{-1}$'); +plot(freqs, abs(squeeze(freqresp(H1, freqs, 'Hz'))), '-', 'color', [colors(1,:), 0.5], 'linewidth', 2.5,'DisplayName', '$H_1$'); +plot(freqs, abs(squeeze(freqresp(H2, freqs, 'Hz'))), '-', 'color', [colors(2,:), 0.5], 'linewidth', 2.5,'DisplayName', '$H_2$'); +plot(freqs, abs(squeeze(freqresp(H3, freqs, 'Hz'))), '-', 'color', [colors(3,:), 0.5], 'linewidth', 2.5,'DisplayName', '$H_3$'); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -ylabel('Magnitude'); -set(gca, 'XTickLabel',[]); -ylim([1e-4, 20]); -leg = legend('location', 'northeast', 'FontSize', 8); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +xlim([freqs(1), freqs(end)]); ylim([1e-4, 20]); +leg = legend('location', 'southeast', 'FontSize', 8); leg.ItemTokenSize(1) = 18; - -% Phase -ax2 = nexttile; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 180/pi*phase(squeeze(freqresp(H1, freqs, 'Hz')))); -set(gca,'ColorOrderIndex',2) -plot(freqs, 180/pi*phase(squeeze(freqresp(H2, freqs, 'Hz')))); -set(gca,'ColorOrderIndex',3) -plot(freqs, 180/pi*phase(squeeze(freqresp(H3, freqs, 'Hz')))); -hold off; -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -set(gca, 'XScale', 'log'); -yticks([-180:90:180]); ylim([-220, 220]); - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); diff --git a/matlab/detail_control_2_decoupling.m b/matlab/detail_control_2_decoupling.m new file mode 100644 index 0000000..20eb0c6 --- /dev/null +++ b/matlab/detail_control_2_decoupling.m @@ -0,0 +1,248 @@ +%% Clear Workspace and Close figures +clear; close all; clc; + +%% Intialize Laplace variable +s = zpk('s'); + +%% Path for functions, data and scripts +addpath('./src/'); % Path for functions + +%% Colors for the figures +colors = colororder; + +%% Initialize Frequency Vector +freqs = logspace(0, 3, 1000); + +%% Compute Equation of motion +l = 1; h=2; +la = 0.5; % Horizontal position of actuators [m] +ha = 0.2; % Vertical of actuators [m] + +m = 40; % Payload mass [kg] +I = 5; % Payload rotational inertia [kg m^2] + +c = 2e2; % Actuator Damping [N/(m/s)] +k = 1e6; % Actuator Stiffness [N/m] + +% Unit vectors of the actuators +s1 = [1;0]; +s2 = [0;1]; +s3 = [0;1]; + +% Stiffnesss and Damping matrices of the struts +Kr = diag([k,k,k]); +Cr = diag([c,c,c]); + +% Location of the joints with respect to the center of mass +Mb1 = [-l/2;-ha]; +Mb2 = [-la; -h/2]; +Mb3 = [ la; -h/2]; + +% Jacobian matrix (Center of Mass) +J_CoM = [s1', Mb1(1)*s1(2)-Mb1(2)*s1(1); + s2', Mb2(1)*s2(2)-Mb2(2)*s2(1); + s3', Mb3(1)*s3(2)-Mb3(2)*s3(1)]; + +% Mass Matrix in frame {M} +M = diag([m,m,I]); + +% Stiffness Matrix in frame {M} +K = J_CoM'*Kr*J_CoM; + +% Damping Matrix in frame {M} +C = J_CoM'*Cr*J_CoM; + +% Plant in the frame of the struts +G_L = J_CoM*inv(M*s^2 + C*s + K)*J_CoM'; + +figure; +tiledlayout(3, 3, 'TileSpacing', 'Compact', 'Padding', 'None'); + +for out_i = 1:3 + for in_i = 1:3 + nexttile; + plot(freqs, abs(squeeze(freqresp(G_L(out_i,in_i), freqs, 'Hz'))), 'k-', ... + 'DisplayName', sprintf('$\\mathcal{L}_%i/\\tau_%i$', out_i, in_i)); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlim([freqs(1), freqs(end)]); ylim([2e-8, 4e-5]); + xticks([1e0, 1e1, 1e2]) + yticks([1e-7, 1e-6, 1e-5]) + leg = legend('location', 'northeast', 'FontSize', 8); + leg.ItemTokenSize(1) = 18; + + if in_i == 1 + ylabel('Mag. [m/N]') + else + set(gca, 'YTickLabel',[]); + end + + if out_i == 3 + xlabel('Frequency [Hz]') + else + set(gca, 'XTickLabel',[]); + end + end +end + +%% Jacobian Decoupling - Center of Mass +G_CoM = pinv(J_CoM)*G_L*pinv(J_CoM'); +G_CoM.InputName = {'Fx', 'Fy', 'Mz'}; +G_CoM.OutputName = {'Dx', 'Dy', 'Rz'}; + +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(G_CoM(1, 3), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$D_{x,\{M\}}/M_{z,\{M\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoM(3, 1), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$R_{z,\{M\}}/F_{x,\{M\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoM(1, 1), freqs, 'Hz'))), 'color', colors(1,:), 'DisplayName', '$D_{x,\{M\}}/F_{x,\{M\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoM(2, 2), freqs, 'Hz'))), 'color', colors(2,:), 'DisplayName', '$D_{y,\{M\}}/F_{y,\{M\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoM(3, 3), freqs, 'Hz'))), 'color', colors(3,:), 'DisplayName', '$R_{z,\{M\}}/M_{z,\{M\}}$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +ylim([1e-10, 1e-3]); +leg = legend('location', 'southwest', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +%% Jacobian Decoupling - Center of Mass +% Location of the joints with respect to the center of stiffness +Mb1 = [-l/2; 0]; +Mb2 = [-la; -h/2+ha]; +Mb3 = [ la; -h/2+ha]; + +% Jacobian matrix (Center of Stiffness) +J_CoK = [s1', Mb1(1)*s1(2)-Mb1(2)*s1(1); + s2', Mb2(1)*s2(2)-Mb2(2)*s2(1); + s3', Mb3(1)*s3(2)-Mb3(2)*s3(1)]; + +G_CoK = pinv(J_CoK)*G_L*pinv(J_CoK'); +G_CoK.InputName = {'Fx', 'Fy', 'Mz'}; +G_CoK.OutputName = {'Dx', 'Dy', 'Rz'}; + +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(G_CoK(1, 1), freqs, 'Hz'))), 'color', colors(1,:), 'DisplayName', '$D_{x,\{K\}}/F_{x,\{K\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoK(2, 2), freqs, 'Hz'))), 'color', colors(2,:), 'DisplayName', '$D_{y,\{K\}}/F_{y,\{K\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoK(3, 3), freqs, 'Hz'))), 'color', colors(3,:), 'DisplayName', '$R_{z,\{K\}}/M_{z,\{K\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoK(1, 3), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$D_{x,\{K\}}/M_{z,\{K\}}$'); +plot(freqs, abs(squeeze(freqresp(G_CoK(3, 1), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$R_{z,\{K\}}/F_{x,\{K\}}$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Kagnitude'); +ylim([1e-10, 1e-3]); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); +leg.ItemTokenSize(1) = 18; + +%% Modal decoupling +% Compute the eigen vectors +[phi, wi] = eig(M\K); +% Sort the eigen vectors by increasing associated frequency +[~, i] = sort(diag(wi)); +phi = phi(:, i); + +% Plant in the modal space +Gm = inv(phi)*inv(J_CoM)*G_L*inv(J_CoM')*inv(phi'); + +%% Modal decoupled plant +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(Gm(1,1), freqs, 'Hz'))), 'color', colors(1,:), 'DisplayName', '$\mathcal{X}_{m,1}/\tau_{m,1}$'); +plot(freqs, abs(squeeze(freqresp(Gm(2,2), freqs, 'Hz'))), 'color', colors(2,:), 'DisplayName', '$\mathcal{X}_{m,2}/\tau_{m,2}$'); +plot(freqs, abs(squeeze(freqresp(Gm(3,3), freqs, 'Hz'))), 'color', colors(3,:), 'DisplayName', '$\mathcal{X}_{m,3}/\tau_{m,3}$'); +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +ylim([1e-8, 1e-4]); +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +%% SVD Decoupling +wc = 2*pi*100; % Decoupling frequency [rad/s] +% System's response at the decoupling frequency +H1 = evalfr(G_L, j*wc); + +% Real approximation of G(j.wc) +D = pinv(real(H1'*H1)); +H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); + +[U,S,V] = svd(H1); + +Gsvd = inv(U)*G_L*inv(V'); + +figure; +hold on; +for i_in = 1:3 + for i_out = [i_in+1:3] + plot(freqs, abs(squeeze(freqresp(Gsvd(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +plot(freqs, abs(squeeze(freqresp(Gsvd(1, 2), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$G_{SVD}(i,j)\ i \neq j$'); +set(gca,'ColorOrderIndex',1) +for i_in_out = 1:3 + plot(freqs, abs(squeeze(freqresp(Gsvd(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_{SVD}(%d,%d)$', i_in_out, i_in_out)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +ylim([1e-10, 2e-4]); +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +%% Simscape model with relative motion sensor at alternative positions +mdl = 'detail_control_decoupling_test_model'; +open(mdl) + +deq = 0.2; % Length of the actuators [m] + +% Input/Output definition +clear io; io_i = 1; +io(io_i) = linio([mdl, '/F1'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F2'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/F3'], 1, 'openinput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Payload'], 1, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Payload'], 2, 'openoutput'); io_i = io_i + 1; +io(io_i) = linio([mdl, '/Payload'], 3, 'openoutput'); io_i = io_i + 1; + +G_L_alt = linearize(mdl, io); +G_L_alt.InputName = {'F1', 'F2', 'F3'}; +G_L_alt.OutputName = {'d1', 'd2', 'd32'}; + +% SVD Decoupling with the new plant +wc = 2*pi*100; % Decoupling frequency [rad/s] +% System's response at the decoupling frequency +H1 = evalfr(G_L_alt, j*wc); + +% Real approximation of G(j.wc) +D = pinv(real(H1'*H1)); +H1 = pinv(D*real(H1'*diag(exp(j*angle(diag(H1*D*H1.'))/2)))); + +[U,S,V] = svd(H1); + +Gsvd_alt = inv(U)*G_L_alt*inv(V'); + +%% Obtained plant after SVD decoupling - Relative motion sensors are not collocated with the actuators +figure; +hold on; +for i_in = 1:3 + for i_out = [i_in+1:3] + plot(freqs, abs(squeeze(freqresp(Gsvd_alt(i_out, i_in), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'HandleVisibility', 'off'); + end +end +plot(freqs, abs(squeeze(freqresp(Gsvd_alt(1, 2), freqs, 'Hz'))), 'color', [0,0,0,0.2], ... + 'DisplayName', '$G_{SVD}(i,j)\ i \neq j$'); +set(gca,'ColorOrderIndex',1) +for i_in_out = 1:3 + plot(freqs, abs(squeeze(freqresp(Gsvd_alt(i_in_out, i_in_out), freqs, 'Hz'))), 'DisplayName', sprintf('$G_{SVD}(%d,%d)$', i_in_out, i_in_out)); +end +hold off; +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +ylim([5e-11, 7e-5]); +leg = legend('location', 'southwest', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; diff --git a/matlab/detail_control_3_close_loop_shaping.m b/matlab/detail_control_3_close_loop_shaping.m new file mode 100644 index 0000000..e290c06 --- /dev/null +++ b/matlab/detail_control_3_close_loop_shaping.m @@ -0,0 +1,238 @@ +%% Clear Workspace and Close figures +clear; close all; clc; + +%% Intialize Laplace variable +s = zpk('s'); + +%% Path for functions, data and scripts +addpath('./src/'); % Path for functions + +%% Colors for the figures +colors = colororder; + +%% Initialize Frequency Vector +freqs = logspace(-1, 3, 1000); + +%% Analytical Complementary Filters - Effect of alpha +freqs_study = logspace(-2, 2, 1000); +alphas = [0.1, 1, 10]; +w0 = 2*pi*1; +s = tf('s'); + +figure; +hold on; +for i = 1:length(alphas) + alpha = alphas(i); + Hh2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + Hl2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + plot(freqs_study, abs(squeeze(freqresp(Hh2, freqs_study, 'Hz'))), 'color', colors(i,:), 'DisplayName', sprintf('$\\alpha = %g$', alphas(i))); + plot(freqs_study, abs(squeeze(freqresp(Hl2, freqs_study, 'Hz'))), 'color', colors(i,:), 'HandleVisibility', 'off'); +end +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Relative Frequency $\frac{\omega}{\omega_0}$'); ylabel('Magnitude'); +hold off; +ylim([1e-3, 20]); +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +%% Analytical Complementary Filters - Effect of w0 +freqs_study = logspace(-1, 3, 1000); +alpha = [1]; +w0s = [2*pi*1, 2*pi*10, 2*pi*100]; +s = tf('s'); + +figure; +hold on; +for i = 1:length(w0s) + w0 =w0s(i); + Hh2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + Hl2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + plot(freqs_study, abs(squeeze(freqresp(Hh2, freqs_study, 'Hz'))), 'color', colors(i,:), 'DisplayName', sprintf('$\\omega_0 = %g$ Hz', w0/2/pi)); + plot(freqs_study, abs(squeeze(freqresp(Hl2, freqs_study, 'Hz'))), 'color', colors(i,:), 'HandleVisibility', 'off'); +end +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +hold off; +xlim([freqs_study(1), freqs_study(end)]); ylim([1e-3, 20]); +leg = legend('location', 'southeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +%% Test model +freqs = logspace(0, 3, 1000); % Frequency Vector [Hz] + +m = 20; % mass [kg] +k = 1e6; % stiffness [N/m] +c = 1e2; % damping [N/(m/s)] + +% Plant dynamics +G = 1/(m*s^2 + c*s + k); + +% Uncertainty weight +wI = generateWF('n', 2, 'w0', 2*pi*50, 'G0', 0.1, 'Ginf', 10, 'Gc', 1); + +%% Bode plot of the plant with dynamical uncertainty +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +% Magnitude +ax1 = nexttile([2,1]); +hold on; +plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), 'k-', 'DisplayName', 'G'); +plotMagUncertainty(wI, freqs, 'G', G, 'DisplayName', '$\Pi_i$'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Magnitude [m/N]'); set(gca, 'XTickLabel',[]); +ylim([1e-8, 7e-5]); +hold off; +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; + +% Phase +ax2 = nexttile; +hold on; +plotPhaseUncertainty(wI, freqs, 'G', G); +plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz')))), 'k-'); +set(gca,'xscale','log'); +yticks(-360:90:90); +ylim([-270 45]); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); +hold off; + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); + +%% Analytical Complementary Filters +w0 = 2*pi*20; +alpha = 1; + +Hh = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); +Hl = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + +%% Specifications +figure; +hold on; +plot([1, 100], [0.01, 100], ':', 'color', colors(2,:)); +plot([300, 1000], [0.01, 0.01], ':', 'color', colors(1,:)); +plot(freqs, 1./abs(squeeze(freqresp(wI, freqs, 'Hz'))), ':', 'color', colors(1,:)); +plot(freqs, abs(squeeze(freqresp(Hl, freqs, 'Hz'))), '-', 'color', colors(1,:)); +plot(freqs, abs(squeeze(freqresp(Hh, freqs, 'Hz'))), '-', 'color', colors(2,:)); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +hold off; +xlim([freqs(1), freqs(end)]); +ylim([1e-3, 10]); +xticks([0.1, 1, 10, 100, 1000]); + +%% Obtained controller +omega = 2*pi*1000; + +K = 1/(Hh*G) * 1/((1+s/omega+(s/omega)^2)); +K = zpk(minreal(K)); + +%% Bode plot of the controller K +figure; +tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); + +% Magnitude +ax1 = nexttile([2, 1]); +plot(freqs, abs(squeeze(freqresp(K*Hl, freqs, 'Hz'))), 'k-'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Magnitude'); set(gca, 'XTickLabel',[]); +ylim([8e3, 1e8]) + +% Phase +ax2 = nexttile; +plot(freqs, 180/pi*angle(squeeze(freqresp(K*Hl, freqs, 'Hz'))), 'k-'); +set(gca,'xscale','log'); +yticks(-180:45:180); +ylim([-180 45]); +xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); + +linkaxes([ax1,ax2],'x'); +xlim([freqs(1), freqs(end)]); + +num_delta_points = 50; +theta = linspace(0, 2*pi, num_delta_points); +delta_points = exp(1j * theta); + +% Get frequency responses for all components +G_resp = squeeze(freqresp(G, freqs, 'Hz')); +K_resp = squeeze(freqresp(K, freqs, 'Hz')); +Hl_resp = squeeze(freqresp(Hl, freqs, 'Hz')); +wI_resp = squeeze(freqresp(wI, freqs, 'Hz')); + +% Calculate nominal responses +nom_L = G_resp .* K_resp .* Hl_resp; +nom_S = 1 ./ (1 + nom_L); +nom_T = nom_L ./ (1 + nom_L); + +% Store all the points in the complex plane that L can take +loop_region_points = zeros(length(freqs), num_delta_points); + +% Initialize arrays to store magnitude bounds +S_mag_min = ones(length(freqs), 1) * inf; +S_mag_max = zeros(length(freqs), 1); +T_mag_min = ones(length(freqs), 1) * inf; +T_mag_max = zeros(length(freqs), 1); + +% Calculate magnitude bounds for all delta values +for i = 1:num_delta_points + % Perturbed loop gain + loop_perturbed = nom_L .* (1 + wI_resp .* delta_points(i)); + loop_region_points(:,i) = loop_perturbed; + + % Perturbed sensitivity function + S_perturbed = 1 ./ (1 + loop_perturbed); + S_mag = abs(S_perturbed); + + % Update S magnitude bounds + S_mag_min = min(S_mag_min, S_mag); + S_mag_max = max(S_mag_max, S_mag); + + % Perturbed complementary sensitivity function + T_perturbed = loop_perturbed ./ (1 + loop_perturbed); + T_mag = abs(T_perturbed); + + % Update T magnitude bounds + T_mag_min = min(T_mag_min, T_mag); + T_mag_max = max(T_mag_max, T_mag); +end + +% At frequencies where |wI| > 1, T min is zero +T_mag_min(abs(wI_resp)>1) = 1e-10; + +%% Nyquist plot to check Robust Stability +figure; +hold on; +plot(real(squeeze(freqresp(G*K*Hl, freqs, 'Hz'))), imag(squeeze(freqresp(G*K*Hl, freqs, 'Hz'))), 'k', 'DisplayName', '$L(j\omega)$ - Nominal'); +plot(alphaShape(real(loop_region_points(:)), imag(loop_region_points(:)), 0.1), 'FaceColor', [0, 0, 0], 'EdgeColor', 'none', 'FaceAlpha', 0.3, 'DisplayName', '$L(j\omega)$ - $\forall G \in \Pi_i$'); +plot(-1, 0, 'k+', 'MarkerSize', 5, 'HandleVisibility', 'off'); +hold off; +grid on; +axis equal +xlim([-1.4, 0.2]); ylim([-1.2, 0.4]); +xticks(-1.4:0.2:0.2); yticks(-1.2:0.2:0.4); +xlabel('Real Part'); ylabel('Imaginary Part'); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 18; + +%% Robust Performance +figure; +hold on; +plot(freqs, abs(nom_S), 'color', colors(2,:), 'DisplayName', '$|S|$ - Nom.'); +plot(freqs, abs(nom_T), 'color', colors(1,:), 'DisplayName', '$|T|$ - Nom.'); + +patch([freqs, fliplr(freqs)], [S_mag_max', fliplr(S_mag_min')], colors(2,:), 'FaceAlpha', 0.2, 'EdgeColor', 'none', 'HandleVisibility', 'off'); +patch([freqs, fliplr(freqs)], [T_mag_max', fliplr(T_mag_min')], colors(1,:), 'FaceAlpha', 0.2, 'EdgeColor', 'none', 'HandleVisibility', 'off'); + +plot([1, 100], [0.01, 100], ':', 'color', colors(2,:), 'DisplayName', 'Specs.'); +plot([300, 1000], [0.01, 0.01], ':', 'color', colors(1,:), 'DisplayName', 'Specs.'); +plot(freqs, 1./abs(squeeze(freqresp(wI, freqs, 'Hz'))), ':', 'color', colors(1,:), 'HandleVisibility', 'off'); + +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +hold off; +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +xlim([freqs(1), freqs(end)]); +ylim([1e-4, 5]); +xticks([0.1, 1, 10, 100, 1000]); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 3); +leg.ItemTokenSize(1) = 18; diff --git a/matlab/detail_control_decoupling_test_model.slx b/matlab/detail_control_decoupling_test_model.slx index 0712042..cb5209a 100644 Binary files a/matlab/detail_control_decoupling_test_model.slx and b/matlab/detail_control_decoupling_test_model.slx differ diff --git a/nass-control.org b/nass-control.org index 5234691..d260982 100644 --- a/nass-control.org +++ b/nass-control.org @@ -862,6 +862,66 @@ Input usage due to reference signal $r$ is determined by $\big|\frac{u}{r}\big| Proper choice of $|K_r|$ is then useful to limit input usage due to change of reference signal. +*** Tikz Figures + +#+begin_src latex :file detail_control_decoupling_control_struts.pdf +\begin{tikzpicture} + \node[block] (Gl) {$\bm{G}_{\{\mathcal{L}\}}$}; + + % Connections and labels + \draw[<-] (Gl.west) -- ++(-0.8, 0) node[above right]{$\bm{\tau}$}; + \draw[->] (Gl.east) -- ++( 0.8, 0) node[above left]{$\bm{\mathcal{L}}$}; +\end{tikzpicture} +#+end_src + +#+RESULTS: +[[file:figs/detail_control_decoupling_control_struts.png]] + + +#+begin_src latex :file detail_control_decoupling_control_jacobian_CoM.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-\intercal}$}; + \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{M\}}^{-1}$}; + + % Connections and labels + \draw[<-] (Jt.west) -- ++(-1.4, 0) node[above right]{$\bm{\mathcal{F}}_{\{M\}}$}; + \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (Ja.west) node[above left]{$\bm{\mathcal{L}}$}; + \draw[->] (Ja.east) -- ++( 1.4, 0) node[above left]{$\bm{\mathcal{X}}_{\{M\}}$}; + + \begin{scope}[on background layer] + \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=4pt] (Gx) {}; + \node[above] at (Gx.north) {$\bm{G}_{\{M\}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+RESULTS: +[[file:figs/detail_control_decoupling_control_jacobian_CoM.png]] + +#+begin_src latex :file detail_control_decoupling_control_jacobian_CoK.pdf +\begin{tikzpicture} + \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{K\}}^{-\intercal}$}; + \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{K\}}^{-1}$}; + + % Connections and labels + \draw[<-] (Jt.west) -- ++(-1.4, 0) node[above right]{$\bm{\mathcal{F}}_{\{K\}}$}; + \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; + \draw[->] (G.east) -- (Ja.west) node[above left]{$\bm{\mathcal{L}}$}; + \draw[->] (Ja.east) -- ++( 1.4, 0) node[above left]{$\bm{\mathcal{X}}_{\{K\}}$}; + + \begin{scope}[on background layer] + \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=4pt] (Gx) {}; + \node[above] at (Gx.north) {$\bm{G}_{\{K\}}$}; + \end{scope} +\end{tikzpicture} +#+end_src + +#+RESULTS: +[[file:figs/detail_control_decoupling_control_jacobian_CoK.png]] + ** DONE [#A] Fix the outline CLOSED: [2025-04-03 Thu 12:01] @@ -939,10 +999,11 @@ Prefixes: ** DONE [#A] Finish writing "multiple sensor" control section CLOSED: [2025-04-09 Wed 13:55] SCHEDULED: <2025-04-08 Tue> -** TODO [#A] Rework table that compares decoupling strategies -SCHEDULED: <2025-04-13 Sun> +** DONE [#A] Rework table that compares decoupling strategies +CLOSED: [2025-04-13 Sun 17:15] SCHEDULED: <2025-04-13 Sun> -** TODO [#B] Review of control for Stewart platforms? +** DONE [#B] Review of control for Stewart platforms? +CLOSED: [2025-04-13 Sun 17:15] [[file:~/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org::*Control][Control]] @@ -961,7 +1022,6 @@ CLOSED: [2025-04-13 Sun 10:40] Three critical elements for the control of parallel manipulators such as the Nano-Hexapod were identified: effective utilization and combination of multiple sensors, appropriate plant decoupling strategies, and robust controller design for the decoupled system. During the conceptual design phase of the NASS, pragmatic approaches were implemented for each of these elements. - The High Authority Control-Low Authority Control (HAC-LAC) architecture was selected for combining sensors. Control was implemented in the frame of the struts, leveraging the inherent low-frequency decoupling of the plant where all decoupled elements exhibited similar dynamics, thereby simplifying the Single-Input Single-Output (SISO) controller design process. For these decoupled plants, open-loop shaping techniques were employed to tune the individual controllers. @@ -985,10 +1045,9 @@ A method for directly shaping closed-loop transfer functions using complementary ** Introduction :ignore: The literature review of Stewart platforms revealed a wide diversity of designs with various sensor and actuator configurations. -Control objectives (such as active damping, vibration isolation, or precise positioning) dictate specific sensor configurations. -The selection between inertial sensors, force sensors, or relative position sensors is primarily determined by the system's control requirements. +Control objectives (such as active damping, vibration isolation, or precise positioning) directly dictate sensor selection, whether inertial, force, or relative position sensors. -In cases where multiple control objectives must be achieved simultaneously, as is the case for the Nano Active Stabilization System (NASS) where the Stewart platform must both position the sample and provide isolation from micro-station vibrations, combining multiple sensors within the control architecture has been demonstrated to yield significant performance benefits. +In cases where multiple control objectives must be achieved simultaneously, as is the case for the Nano Active Stabilization System (NASS) where the Stewart platform must both position the sample and provide isolation from micro-station vibrations, combining multiple sensors within the control architecture has been demonstrated to yield significant performance benefits [[cite:&hauge04_sensor_contr_space_based_six]]. From the literature, three principal approaches for combining sensors have been identified: High Authority Control-Low Authority Control (HAC-LAC), sensor fusion, and two-sensor control architectures. #+begin_src latex :file detail_control_sensor_arch_hac_lac.pdf @@ -1113,7 +1172,7 @@ From the literature, three principal approaches for combining sensors have been #+end_subfigure #+end_figure -The HAC-LAC approach, implemented during the conceptual phase, employs a dual-loop control strategy in which two control loops utilize different sensors for distinct purposes (Figure ref:fig:detail_control_sensor_arch_hac_lac). +The HAC-LAC approach employs a dual-loop control strategy in which two control loops utilize different sensors for distinct purposes (Figure ref:fig:detail_control_sensor_arch_hac_lac). In [[cite:&li01_simul_vibrat_isolat_point_contr]], vibration isolation is provided by accelerometers collocated with the voice coil actuators, while external rotational sensors are utilized to achieve pointing control. In [[cite:&geng95_intel_contr_system_multip_degree]], force sensors collocated with the magnetostrictive actuators are used for active damping using decentralized IFF, and subsequently accelerometers are employed for adaptive vibration isolation. Similarly, in [[cite:&wang16_inves_activ_vibrat_isolat_stewar]], piezoelectric actuators with collocated force sensors are used in a decentralized manner to provide active damping while accelerometers are implemented in an adaptive feedback loop to suppress periodic vibrations. @@ -1121,7 +1180,7 @@ In [[cite:&xie17_model_contr_hybrid_passiv_activ]], force sensors are integrated The second approach, sensor fusion (illustrated in Figure ref:fig:detail_control_sensor_arch_sensor_fusion), involves filtering signals from two sensors using complementary filters[fn:detail_control_1] and summing them to create an improved sensor signal. In [[cite:&hauge04_sensor_contr_space_based_six]], geophones (used at low frequency) are merged with force sensors (used at high frequency). -It is demonstrated that combining both sensors using sensor fusion can improve performance compared to using the individual sensors independently. +It is demonstrated that combining both sensors using sensor fusion can improve performance compared to using only one of the two sensors. In [[cite:&tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip]], sensor fusion architecture is implemented with an accelerometer and a force sensor. This implementation is shown to simultaneously achieve high damping of structural modes (through the force sensors) while maintaining very low vibration transmissibility (through the accelerometers). @@ -1134,26 +1193,21 @@ A "two-sensor control" approach was proven to perform better than controllers ba A Linear Quadratic Regulator (LQG) was employed to optimize the two-input/one-output controller. Beyond these three main approaches, other control architectures have been proposed for different purposes. -In [[cite:&yang19_dynam_model_decoup_contr_flexib]], a first control loop utilizes force sensors and relative motion sensors to compensate for parasitic stiffness of the flexible joints. +For instance, in [[cite:&yang19_dynam_model_decoup_contr_flexib]], a first control loop utilizes force sensors and relative motion sensors to compensate for parasitic stiffness of the flexible joints. Subsequently, the system is decoupled in the modal space (facilitated by the removal of parasitic stiffness) and accelerometers are employed for vibration isolation. The HAC-LAC architecture was previously investigated during the conceptual phase and successfully implemented to validate the NASS concept, demonstrating excellent performance. At the other end of the spectrum, the two-sensor approach yields greater control design freedom but introduces increased complexity in tuning, and thus was not pursued in this study. This work instead focuses on sensor fusion, which represents a promising middle ground between the proven HAC-LAC approach and the more complex two-sensor control strategy. -A review of sensor fusion is first presented (Section ref:ssec:detail_control_sensor_review), followed by an examination of the fundamental theoretical concepts (Section ref:ssec:detail_control_sensor_fusion_requirements). -In this section, both the robustness of the fusion and the noise characteristics of the resulting "super sensor" are derived and expressed as functions of the complementary filters' norms. -A synthesis method for designing complementary filters that allow to shape their norms is proposed (Section ref:ssec:detail_control_sensor_hinf_method). +A review of sensor fusion is first presented in Section ref:ssec:detail_control_sensor_review. +Then, in Section ref:ssec:detail_control_sensor_fusion_requirements, both the robustness of the fusion and the noise characteristics of the resulting "fused sensor" are derived and expressed as functions of the complementary filters' norms. +A synthesis method for shaping complementary filters is proposed in Section ref:ssec:detail_control_sensor_hinf_method. The investigation is then extended beyond the conventional two-sensor scenario, demonstrating how the proposed complementary filter synthesis can be generalized for applications requiring the fusion of three or more sensors (Section ref:ssec:detail_control_sensor_hinf_three_comp_filters). ** Review of Sensor Fusion <> -Sensors used to measure physical quantities have two primary limitations: measurement accuracy which is compromised by various noise sources (including electrical noise from conditioning electronics), and limited measurement bandwidth. -Sensor fusion offers a solution to these limitations by combining multiple sensors [[cite:&bendat57_optim_filter_indep_measur_two]]. -By strategically selecting sensors with complementary characteristics, a "super sensor" can be created that combines the advantages of each individual sensor. - - Measuring a physical quantity using sensors is always subject to several limitations. First, the accuracy of the measurement is affected by various noise sources, such as electrical noise from the conditioning electronics. Second, the frequency range in which the measurement is relevant is bounded by the bandwidth of the sensor. @@ -1167,7 +1221,7 @@ In other applications, sensor fusion is utilized to obtain an estimate of the me More recently, the fusion of sensors measuring different physical quantities has been proposed to enhance control properties [[cite:&collette15_sensor_fusion_method_high_perfor;&yong16_high_speed_vertic_posit_stage]]. In [[cite:&collette15_sensor_fusion_method_high_perfor]], an inertial sensor used for active vibration isolation is fused with a sensor collocated with the actuator to improve the stability margins of the feedback controller. -On top of Stewart platforms, practical applications of sensor fusion are numerous. +Beyond Stewart platforms, practical applications of sensor fusion are numerous. It is widely implemented for attitude estimation in autonomous vehicles such as unmanned aerial vehicles [[cite:&baerveldt97_low_cost_low_weigh_attit;&corke04_inert_visual_sensin_system_small_auton_helic;&jensen13_basic_uas]] and underwater vehicles [[cite:&pascoal99_navig_system_desig_using_time;&batista10_optim_posit_veloc_navig_filter_auton_vehic]]. Sensor fusion offers significant benefits for high-performance positioning control as demonstrated in [[cite:&shaw90_bandw_enhan_posit_measur_using_measur_accel;&zimmermann92_high_bandw_orien_measur_contr;&min15_compl_filter_desig_angle_estim;&yong16_high_speed_vertic_posit_stage]]. It has also been identified as a key technology for improving the performance of active vibration isolation systems [[cite:&tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip]]. @@ -1183,14 +1237,10 @@ In early implementations of complementary filtering, analog circuits were used t While analog complementary filters remain in use today [[cite:&yong16_high_speed_vertic_posit_stage;&moore19_capac_instr_sensor_fusion_high_bandw_nanop]], digital implementation is now more common as it provides greater flexibility. Various design methods have been developed to optimize complementary filters. -The most straightforward approach utilizes analytical formulas. -Depending on the application, these formulas may be of first order [[cite:&corke04_inert_visual_sensin_system_small_auton_helic;&yeh05_model_contr_hydraul_actuat_two;&yong16_high_speed_vertic_posit_stage]], second order [[cite:&baerveldt97_low_cost_low_weigh_attit;&stoten01_fusion_kinet_data_using_compos_filter;&jensen13_basic_uas]], or higher orders [[cite:&shaw90_bandw_enhan_posit_measur_using_measur_accel;&zimmermann92_high_bandw_orien_measur_contr;&stoten01_fusion_kinet_data_using_compos_filter;&collette15_sensor_fusion_method_high_perfor;&matichard15_seism_isolat_advan_ligo]]. - -Since the characteristics of the super sensor depend on the proper design of complementary filters [[cite:&dehaeze19_compl_filter_shapin_using_synth]], several optimization techniques have been developed. -Some approaches focus on finding optimal parameters for analytical formulas [[cite:&jensen13_basic_uas;&min15_compl_filter_desig_angle_estim;&fonseca15_compl]], while others employ convex optimization tools [[cite:&hua04_polyp_fir_compl_filter_contr_system;&hua05_low_ligo]] such as linear matrix inequalities [[cite:&pascoal99_navig_system_desig_using_time]]. -As demonstrated in [[cite:&plummer06_optim_compl_filter_their_applic_motion_measur]], complementary filter design can be linked to the standard mixed-sensitivity control problem. -Consequently, the powerful tools developed for classical control theory can be applied to complementary filter design. -For example, in [[cite:&jensen13_basic_uas]], the two gains of a Proportional Integral (PI) controller are optimized to minimize super sensor noise. +The most straightforward approach utilizes analytical formulas, which depending on the application may be first order [[cite:&corke04_inert_visual_sensin_system_small_auton_helic;&yeh05_model_contr_hydraul_actuat_two;&yong16_high_speed_vertic_posit_stage]], second order [[cite:&baerveldt97_low_cost_low_weigh_attit;&stoten01_fusion_kinet_data_using_compos_filter;&jensen13_basic_uas]], or higher orders [[cite:&shaw90_bandw_enhan_posit_measur_using_measur_accel;&zimmermann92_high_bandw_orien_measur_contr;&stoten01_fusion_kinet_data_using_compos_filter;&collette15_sensor_fusion_method_high_perfor;&matichard15_seism_isolat_advan_ligo]]. +Since the characteristics of the super sensor depend on proper complementary filter design [[cite:&dehaeze19_compl_filter_shapin_using_synth]], several optimization techniques have emerged—ranging from optimizing parameters for analytical formulas [[cite:&jensen13_basic_uas;&min15_compl_filter_desig_angle_estim;&fonseca15_compl]] to employing convex optimization tools [[cite:&hua04_polyp_fir_compl_filter_contr_system;&hua05_low_ligo]] such as linear matrix inequalities [[cite:&pascoal99_navig_system_desig_using_time]]. +As demonstrated in [[cite:&plummer06_optim_compl_filter_their_applic_motion_measur]], complementary filter design can be linked to the standard mixed-sensitivity control problem, allowing powerful classical control theory tools to be applied. +For example, in [[cite:&jensen13_basic_uas]], two gains of a Proportional Integral (PI) controller are optimized to minimize super sensor noise. All these complementary filter design methods share the common objective of creating a super sensor with desired characteristics, typically in terms of noise and dynamics. As reported in [[cite:&zimmermann92_high_bandw_orien_measur_contr;&plummer06_optim_compl_filter_their_applic_motion_measur]], phase shifts and magnitude bumps in the super sensor dynamics may occur if complementary filters are poorly designed or if sensors are improperly calibrated. @@ -1198,7 +1248,7 @@ Therefore, the robustness of the fusion must be considered when designing comple Despite the numerous design methods proposed in the literature, a simple approach that specifies desired super sensor characteristics while ensuring good fusion robustness has been lacking. Fortunately, both fusion robustness and super sensor characteristics can be linked to complementary filter magnitude [[cite:&dehaeze19_compl_filter_shapin_using_synth]]. -Based on this relationship, the present work introduces an approach to designing complementary filters using $\mathcal{H}_\infty$ synthesis, which enables intuitive shaping of complementary filter magnitude in a straightforward manner. +Based on this relationship, the present work introduces an approach to designing complementary filters using $\mathcal{H}_\infty\text{-synthesis}$, which enables intuitive shaping of complementary filter magnitude in a straightforward manner. ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) @@ -1428,7 +1478,7 @@ The effects of imperfect normalization will be addressed subsequently. In that case, the super sensor output $\hat{x}$ equals $x$ plus the filtered noise from both sensors eqref:eq:detail_control_sensor_estimate_perfect_dyn. From this equation, it is evident that the complementary filters $H_1(s)$ and $H_2(s)$ operate solely on the sensor noise. Thus, this sensor fusion architecture allows filtering of sensor noise without introducing distortion in the measured physical quantity. -This fundamental property necessitates that the two filters must be complementary. +This fundamental property necessitates that the two filters are complementary. \begin{equation}\label{eq:detail_control_sensor_estimate_perfect_dyn} \hat{x} = x + H_1(s) n_1 + H_2(s) n_2 @@ -1450,16 +1500,14 @@ If the two sensors have identical noise characteristics ($\Phi_{n_1}(\omega) = \ This represents the simplest form of sensor fusion using complementary filters. However, sensors typically exhibit high noise levels in different frequency regions. -In such cases, to reduce the noise of the super sensor, the norm $|H_1(j\omega)|$ should be minimized when $\Phi_{n_1}(\omega)$ exceeds $\Phi_{n_2}(\omega)$, and the norm $|H_2(j\omega)|$ should be minimized when $\Phi_{n_2}(\omega)$ exceeds $\Phi_{n_1}(\omega)$. +In such cases, to reduce the noise of the super sensor, $|H_1(j\omega)|$ should be minimized when $\Phi_{n_1}(\omega)$ exceeds $\Phi_{n_2}(\omega)$, and $|H_2(j\omega)|$ should be minimized when $\Phi_{n_2}(\omega)$ exceeds $\Phi_{n_1}(\omega)$. Therefore, by appropriately shaping the norm of the complementary filters, the noise of the super sensor can be minimized. **** Sensor Fusion Robustness In practical systems, sensor normalization is rarely perfect, and condition eqref:eq:detail_control_sensor_perfect_dynamics is not fully satisfied. - To analyze such imperfections, a multiplicative input uncertainty is incorporated into the sensor dynamics (Figure ref:fig:detail_control_sensor_model_uncertainty). The nominal model is the estimated model used for normalization $\hat{G}_i(s)$, $\Delta_i(s)$ is any stable transfer function satisfying $|\Delta_i(j\omega)| \le 1,\ \forall\omega$, and $w_i(s)$ is a weighting transfer function representing the magnitude of uncertainty. -The weight $w_i(s)$ is selected such that the actual sensor dynamics $G_i(j\omega)$ remains within the uncertain region represented by a circle in the complex plane, centered on $1$ with a radius equal to $|w_i(j\omega)|$. Since the nominal sensor dynamics is taken as the normalized filter, the normalized sensor model can be further simplified as shown in Figure ref:fig:detail_control_sensor_model_uncertainty_simplified. @@ -1532,7 +1580,7 @@ Since the nominal sensor dynamics is taken as the normalized filter, the normali #+attr_latex: :width 0.95\linewidth [[file:figs/detail_control_sensor_model_uncertainty.png]] #+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_model_uncertainty_simplified}Simplified sensor model} +#+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_model_uncertainty_simplified}Simplified normalized sensor model} #+attr_latex: :options {0.38\textwidth} #+begin_subfigure #+attr_latex: :width 0.95\linewidth @@ -1544,11 +1592,6 @@ The sensor fusion architecture incorporating sensor models with dynamical uncert The super sensor dynamics eqref:eq:detail_control_sensor_super_sensor_dyn_uncertainty is no longer unity but depends on the sensor dynamical uncertainty weights $w_i(s)$ and the complementary filters $H_i(s)$. The dynamical uncertainty of the super sensor can be graphically represented in the complex plane by a circle centered on $1$ with a radius equal to $|w_1(j\omega) H_1(j\omega)| + |w_2(j\omega) H_2(j\omega)|$ (Figure ref:fig:detail_control_sensor_uncertainty_set_super_sensor). - -The sensor fusion architecture with the sensor models including dynamical uncertainty is shown in Figure ref:fig:detail_control_sensor_fusion_dynamic_uncertainty. -The super sensor dynamics eqref:eq:detail_control_sensor_super_sensor_dyn_uncertainty is no longer equal to $1$ and now depends on the sensor dynamical uncertainty weights $w_i(s)$ as well as on the complementary filters $H_i(s)$. -The dynamical uncertainty of the super sensor can be graphically represented in the complex plane by a circle centered on $1$ with a radius equal to $|w_1(j\omega) H_1(j\omega)| + |w_2(j\omega) H_2(j\omega)|$ (Figure ref:fig:detail_control_sensor_uncertainty_set_super_sensor). - \begin{equation}\label{eq:detail_control_sensor_super_sensor_dyn_uncertainty} \frac{\hat{x}}{x} = 1 + w_1(s) H_1(s) \Delta_1(s) + w_2(s) H_2(s) \Delta_2(s) \end{equation} @@ -1676,7 +1719,7 @@ As it is generally desired to limit the dynamical uncertainty of the super senso As established in Section ref:ssec:detail_control_sensor_fusion_requirements, the super sensor's noise characteristics and robustness are directly dependent on the complementary filters' norm. A synthesis method enabling precise shaping of these norms would therefore offer substantial practical benefits. This section develops such an approach by formulating the design objective as a standard $\mathcal{H}_\infty$ optimization problem. -The methodology for designing appropriate weighting functions (which specify desired complementary filter shapes during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example. +The methodology for designing appropriate weighting functions (which specify desired complementary filter shape during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example. **** Synthesis Objective @@ -1694,8 +1737,7 @@ Weighting transfer functions $W_1(s)$ and $W_2(s)$ are strategically selected to **** Shaping of Complementary Filters using $\mathcal{H}_\infty$ synthesis -The synthesis objective can be readily expressed as a standard $\mathcal{H}_\infty$ optimization problem and solved using widely available computational tools. -Consider the generalized plant $P(s)$ illustrated in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_plant and mathematically described by eqref:eq:detail_control_sensor_generalized_plant. +The synthesis objective can be expressed as a standard $\mathcal{H}_\infty$ optimization problem by considering the generalized plant $P(s)$ illustrated in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_plant and mathematically described by eqref:eq:detail_control_sensor_generalized_plant. \begin{equation}\label{eq:detail_control_sensor_generalized_plant} \begin{bmatrix} z_1 \\ z_2 \\ v \end{bmatrix} = P(s) \begin{bmatrix} w\\u \end{bmatrix}; \quad P(s) = \begin{bmatrix}W_1(s) & -W_1(s) \\ 0 & \phantom{+}W_2(s) \\ 1 & 0 \end{bmatrix} @@ -1764,7 +1806,7 @@ Consider the generalized plant $P(s)$ illustrated in Figure ref:fig:detail_contr #+end_src #+name: fig:detail_control_sensor_h_infinity_robust_fusion -#+caption: Architecture for the $\mathcal{H}_\infty$ synthesis of complementary filters +#+caption: Architecture for the $\mathcal{H}_\infty\text{-synthesis}$ of complementary filters #+attr_latex: :options [htbp] #+begin_figure #+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_h_infinity_robust_fusion_plant}Generalized plant} @@ -1781,13 +1823,13 @@ Consider the generalized plant $P(s)$ illustrated in Figure ref:fig:detail_contr #+end_subfigure #+end_figure -Applying standard $\mathcal{H}_\infty$ synthesis to the generalized plant $P(s)$ is equivalent to finding a stable filter $H_2(s)$ that, based on input $v$, generates an output signal $u$ such that the $\mathcal{H}_\infty$ norm of the system shown in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_fb from $w$ to $[z_1, \ z_2]$ does not exceed unity, as expressed in eqref:eq:detail_control_sensor_hinf_syn_obj. +Applying standard $\mathcal{H}_\infty\text{-synthesis}$ to the generalized plant $P(s)$ is equivalent to finding a stable filter $H_2(s)$ that, based on input $v$, generates an output signal $u$ such that the $\mathcal{H}_\infty$ norm of the system shown in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_fb from $w$ to $[z_1, \ z_2]$ does not exceed unity, as expressed in eqref:eq:detail_control_sensor_hinf_syn_obj. \begin{equation}\label{eq:detail_control_sensor_hinf_syn_obj} \left\|\begin{matrix} \left(1 - H_2(s)\right) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -By defining $H_1(s)$ as the complement of $H_2(s)$ (eqref:eq:detail_control_sensor_definition_H1), the $\mathcal{H}_\infty$ synthesis objective becomes equivalent to eqref:eq:detail_control_sensor_hinf_problem, ensuring that conditions eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are satisfied. +By defining $H_1(s)$ as the complement of $H_2(s)$ eqref:eq:detail_control_sensor_definition_H1, the $\mathcal{H}_\infty\text{-synthesis}$ objective becomes equivalent to eqref:eq:detail_control_sensor_hinf_problem, ensuring that conditions eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are satisfied. \begin{equation}\label{eq:detail_control_sensor_definition_H1} H_1(s) \triangleq 1 - H_2(s) @@ -1797,20 +1839,20 @@ By defining $H_1(s)$ as the complement of $H_2(s)$ (eqref:eq:detail_control_sens \left\|\begin{matrix} H_1(s) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -Therefore, applying $\mathcal{H}_\infty$ synthesis to the standard plant $P(s)$ (eqref:eq:detail_control_sensor_generalized_plant) generates two filters, $H_2(s)$ and $H_1(s) \triangleq 1 - H_2(s)$, that are complementary as required by eqref:eq:detail_control_sensor_comp_filter_problem_form, with norms bounded by the specified constraints in eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2. +Therefore, applying $\mathcal{H}_\infty\text{-synthesis}$ to the standard plant $P(s)$ generates two filters, $H_2(s)$ and $H_1(s) \triangleq 1 - H_2(s)$, that are complementary as required by eqref:eq:detail_control_sensor_comp_filter_problem_form, with norms bounded by the specified constraints in eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2. It should be noted that there exists only an implication (not an equivalence) between the $\mathcal{H}_\infty$ norm condition in eqref:eq:detail_control_sensor_hinf_problem and the initial synthesis objectives in eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2. -Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates (see [[cite:&skogestad07_multiv_feedb_contr,Chap. 2.8.3]]). +Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates [[cite:&skogestad07_multiv_feedb_contr,Chap. 2.8.3]]. **** Weighting Functions Design Weighting functions play a crucial role during synthesis by specifying the maximum allowable norms for the complementary filters. -The proper design of these weighting functions is essential for the successful implementation of the proposed $\mathcal{H}_\infty$ synthesis approach. +The proper design of these weighting functions is essential for the successful implementation of the proposed $\mathcal{H}_\infty\text{-synthesis}$ approach. Three key considerations should guide the design of weighting functions. First, only proper and stable transfer functions should be employed. Second, the order of the weighting functions should remain reasonably small to minimize computational costs associated with solving the optimization problem and to facilitate practical implementation of the filters (as the order of the synthesized filters equals the sum of the weighting functions' orders). -Third, the fundamental limitations imposed by the complementary property (eqref:eq:detail_control_sensor_comp_filter) must be respected, which implies that $|H_1(j\omega)|$ and $|H_2(j\omega)|$ cannot both be made small at the same frequency. +Third, the fundamental limitations imposed by the complementary property eqref:eq:detail_control_sensor_comp_filter must be respected, which implies that $|H_1(j\omega)|$ and $|H_2(j\omega)|$ cannot both be made small at the same frequency. When designing complementary filters, it is typically desirable to specify their slopes, "blending" frequency, and maximum gains at low and high frequencies. To facilitate the expression of these specifications, formula eqref:eq:detail_control_sensor_weight_formula is proposed for the design of weighting functions. @@ -1958,7 +2000,7 @@ exportFig('figs/detail_control_sensor_hinf_filters_results.pdf', 'width', 'half' [[file:figs/detail_control_sensor_hinf_filters_results.png]] #+end_minipage -Standard $\mathcal{H}_\infty$ synthesis is then applied to the generalized plant shown in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_plant. +Standard $\mathcal{H}_\infty\text{-synthesis}$ is then applied to the generalized plant shown in Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_plant. This yields the filter $H_2(s)$ that minimizes the $\mathcal{H}_\infty$ norm from input $w$ to outputs $[z_1,\ z_2]^{\intercal}$. The resulting $\mathcal{H}_\infty$ norm is found to be close to unity, indicating successful synthesis: the norms of the complementary filters remain below the specified upper bounds. This is confirmed by the Bode plots of the obtained complementary filters in Figure ref:fig:detail_control_sensor_hinf_filters_results. @@ -2084,7 +2126,7 @@ The synthesis objective is to compute a set of $n$ stable transfer functions $[H The transfer functions $[W_1(s),\ W_2(s),\ \dots,\ W_n(s)]$ are weights selected to specify the maximum complementary filters' norm during synthesis. This synthesis objective is closely related to the one described in Section ref:ssec:detail_control_sensor_hinf_method, and the proposed synthesis method represents a generalization of the approach previously presented. -A set of $n$ complementary filters can be shaped by applying standard $\mathcal{H}_\infty$ synthesis to the generalized plant $P_n(s)$ described by eqref:eq:detail_control_sensor_generalized_plant_n_filters. +A set of $n$ complementary filters can be shaped by applying standard $\mathcal{H}_\infty\text{-synthesis}$ to the generalized plant $P_n(s)$ described by eqref:eq:detail_control_sensor_generalized_plant_n_filters. \begin{equation}\label{eq:detail_control_sensor_generalized_plant_n_filters} \begin{bmatrix} z_1 \\ \vdots \\ z_n \\ v \end{bmatrix} = P_n(s) \begin{bmatrix} w \\ u_1 \\ \vdots \\ u_{n-1} \end{bmatrix}; \quad @@ -2206,13 +2248,13 @@ Consider the generalized plant $P_3(s)$ shown in Figure ref:fig:detail_control_s #+end_src #+name: fig:detail_control_sensor_comp_filter_three_hinf -#+caption: Architecture for the $\mathcal{H}_\infty$ synthesis of three complementary filters (\subref{fig:detail_control_sensor_comp_filter_three_hinf_fb}). Bode plot of the inverse weighting functions and of the three obtained complementary filters (\subref{fig:detail_control_sensor_three_complementary_filters_results}) +#+caption: Architecture for the $\mathcal{H}_\infty\text{-synthesis}$ of three complementary filters (\subref{fig:detail_control_sensor_comp_filter_three_hinf_fb}). Bode plot of the inverse weighting functions and of the three obtained complementary filters (\subref{fig:detail_control_sensor_three_complementary_filters_results}) #+attr_latex: :options [htbp] #+begin_figure #+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_comp_filter_three_hinf_fb}Generalized plant with the synthesized filter} #+attr_latex: :options {0.48\textwidth} #+begin_subfigure -#+attr_latex: :width 0.95\linewidth +#+attr_latex: :scale 0.9 [[file:figs/detail_control_sensor_comp_filter_three_hinf_fb.png]] #+end_subfigure #+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_three_complementary_filters_results}Weights and obtained filters} @@ -2223,7 +2265,7 @@ Consider the generalized plant $P_3(s)$ shown in Figure ref:fig:detail_control_s #+end_subfigure #+end_figure -Standard $\mathcal{H}_\infty$ synthesis is performed on the generalized plant $P_3(s)$. +Standard $\mathcal{H}_\infty\text{-synthesis}$ is performed on the generalized plant $P_3(s)$. Two filters, $H_2(s)$ and $H_3(s)$, are obtained such that the $\mathcal{H}_\infty$ norm of the closed-loop transfer from $w$ to $[z_1,\ z_2,\ z_3]$ of the system in Figure ref:fig:detail_control_sensor_comp_filter_three_hinf_fb is less than one. Filter $H_1(s)$ is defined using eqref:eq:detail_control_sensor_h1_compl_h2_h3, thus ensuring the complementary property of the obtained set of filters. @@ -2289,8 +2331,8 @@ This approach allows shaping of the filter magnitudes through the use of weighti This capability is particularly valuable in practice since the characteristics of the super sensor are directly linked to the complementary filters' magnitude. Consequently, typical sensor fusion objectives can be effectively translated into requirements on the magnitudes of the filters. -For the Nano Active Stabilization System (NASS), the High Authority Control-Integral Force Feedback (HAC-IFF) strategy was found to perform well and to offer the advantages of being both intuitive to understand and straightforward to tune. -Looking forward, it would be interesting to investigate how sensor fusion (particularly between the force sensor and external metrology) compares to the HAC-IFF approach in terms of performance and robustness. +For the NASS, the HAC-LAC strategy was found to perform well and to offer the advantages of being both intuitive to understand and straightforward to tune. +Looking forward, it would be interesting to investigate how sensor fusion (particularly between the force sensors and external metrology) compares to the HAC-IFF approach in terms of performance and robustness. * Decoupling :PROPERTIES: @@ -2300,7 +2342,7 @@ Looking forward, it would be interesting to investigate how sensor fusion (parti ** Introduction :ignore: -The control of parallel manipulators (and any MIMO system in general) typically involves a two-step approach: first decoupling the plant dynamics using various strategies, which will be discussed in this section, followed by the application of SISO control for the decoupled plant (discussed in section ref:sec:detail_control_cf). +The control of parallel manipulators (and any MIMO system in general) typically involves a two-step approach: first decoupling the plant dynamics (using various strategies discussed in this section), followed by the application of SISO control for the decoupled plant (discussed in section ref:sec:detail_control_cf). When sensors are integrated within the struts, decentralized control may be applied, as the system is already well decoupled at low frequency. For instance, [[cite:&furutani04_nanom_cuttin_machin_using_stewar]] implemented a system where each strut consists of piezoelectric stack actuators and eddy current displacement sensors, with separate PI controllers for each strut. @@ -2312,23 +2354,24 @@ This approach enables the implementation of controllers in a defined frame. It has been applied with various sensor types including force sensors [[cite:&mcinroy00_desig_contr_flexur_joint_hexap]], relative displacement sensors [[cite:&kim00_robus_track_contr_desig_dof_paral_manip]], and inertial sensors [[cite:&li01_simul_vibrat_isolat_point_contr;&abbas14_vibrat_stewar_platf]]. The Cartesian frame in which the system is decoupled is typically chosen at the point of interest (i.e., where the motion is of interest) or at the center of mass. -Modal control represents another noteworthy decoupling strategy, wherein the "local" plant inputs and outputs are mapped to the modal space. +Modal decoupling represents another noteworthy decoupling strategy, wherein the "local" plant inputs and outputs are mapped to the modal space. In this approach, multiple SISO plants, each corresponding to a single mode, can be controlled independently. This decoupling strategy has been implemented for active damping applications [[cite:&holterman05_activ_dampin_based_decoup_colloc_contr]], which is logical as it is often desirable to dampen specific modes. The strategy has also been employed in [[cite:&pu11_six_degree_of_freed_activ]] for vibration isolation purposes using geophones, and in [[cite:&yang19_dynam_model_decoup_contr_flexib]] using force sensors. -Another completely different strategy, is to use implement a multivariable control directly on the coupled system. +Another completely different strategy would be to implement a multivariable control directly on the coupled system. $\mathcal{H}_\infty$ and $\mu\text{-synthesis}$ were applied to a Stewart platform model in [[cite:&lei08_multi_objec_robus_activ_vibrat]]. -In [[cite:&xie17_model_contr_hybrid_passiv_activ]], decentralized force feedback was first applied, followed by $\mathcal{H}_2$ synthesis for vibration isolation based on accelerometers. -$\mathcal{H}_\infty$ synthesis was also employed in [[cite:&jiao18_dynam_model_exper_analy_stewar]] for active damping based on accelerometers. -[[cite:&thayer02_six_axis_vibrat_isolat_system]] compared $\mathcal{H}_\infty$ synthesis with decentralized control in the frame of the struts. +In [[cite:&xie17_model_contr_hybrid_passiv_activ]], decentralized force feedback was first applied, followed by $\mathcal{H}_2\text{-synthesis}$ for vibration isolation based on accelerometers. +$\mathcal{H}_\infty\text{-synthesis}$ was also employed in [[cite:&jiao18_dynam_model_exper_analy_stewar]] for active damping based on accelerometers. +A comparative study between $\mathcal{H}_\infty\text{-synthesis}$ and decentralized control in the frame of the struts was performed in [[cite:&thayer02_six_axis_vibrat_isolat_system]]. Their experimental closed-loop results indicated that the $\mathcal{H}_\infty$ controller did not outperform the decentralized controller in the frame of the struts. -These limitations were attributed to the model's poor ability to predict off-diagonal dynamics, which is crucial for $\mathcal{H}_\infty$ synthesis. +These limitations were attributed to the model's poor ability to predict off-diagonal dynamics, which is crucial for $\mathcal{H}_\infty\text{-synthesis}$. The purpose of this section is to compare several methods for the decoupling of parallel manipulators, an analysis that appears to be lacking in the literature. -The analysis begins in Section ref:ssec:detail_control_decoupling_model with the introduction of a simplified parallel manipulator model that serves as the foundation for evaluating various decoupling strategies. -Sections ref:ssec:detail_control_decoupling_jacobian through ref:ssec:detail_control_decoupling_svd systematically examine three distinct approaches: Jacobian matrix decoupling, modal decoupling, and Singular Value Decomposition (SVD) decoupling, respectively. -The comparative assessment of these three methodologies, along with concluding observations, is provided in Section ref:ssec:detail_control_decoupling_comp. +A simplified parallel manipulator model is introduced in Section ref:ssec:detail_control_decoupling_model as a test case for evaluating decoupling strategies. +The decentralized plant (transfer functions from actuators to sensors integrated in the struts) is examined in Section ref:ssec:detail_control_decoupling_decentralized. +Three approaches are investigated across subsequent sections: Jacobian matrix decoupling (Section ref:ssec:detail_control_decoupling_jacobian), modal decoupling (Section ref:ssec:detail_control_decoupling_modal), and Singular Value Decomposition (SVD) decoupling (Section ref:ssec:detail_control_decoupling_svd). +Finally, a comparative analysis with concluding observations is provided in Section ref:ssec:detail_control_decoupling_comp. ** Matlab Init :noexport:ignore: #+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) @@ -2450,24 +2493,11 @@ The dynamics in the frame of the struts are first examined. The equation of motion relating actuator forces $\bm{\mathcal{\tau}}$ to strut relative motion $\bm{\mathcal{L}}$ is derived from equation eqref:eq:detail_control_decoupling_plant_cartesian by mapping the Cartesian motion of the mass to the relative motion of the struts using the Jacobian matrix $\bm{J}_{\{M\}}$ defined in eqref:eq:detail_control_decoupling_jacobian_CoM. The obtained transfer function from $\bm{\mathcal{\tau}}$ to $\bm{\mathcal{L}}$ is shown in eqref:eq:detail_control_decoupling_plant_decentralized. -#+begin_src latex :file detail_control_decoupling_control_struts.pdf -\begin{tikzpicture} - \node[block] (Gl) {$\bm{G}_{\{\mathcal{L}\}}$}; - - % Connections and labels - \draw[<-] (Gl.west) -- ++(-0.8, 0) node[above right]{$\bm{\tau}$}; - \draw[->] (Gl.east) -- ++( 0.8, 0) node[above left]{$\bm{\mathcal{L}}$}; -\end{tikzpicture} -#+end_src - -#+RESULTS: -# [[file:figs/detail_control_decoupling_control_struts.png]] - \begin{equation}\label{eq:detail_control_decoupling_plant_decentralized} \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} \end{equation} -At low frequencies, the plant converges to a diagonal constant matrix whose diagonal elements are related to the actuator stiffnesses eqref:eq:detail_control_decoupling_plant_decentralized_low_freq. +At low frequencies, the plant converges to a diagonal constant matrix whose diagonal elements are equal to the actuator stiffnesses eqref:eq:detail_control_decoupling_plant_decentralized_low_freq. At high frequencies, the plant converges to the mass matrix mapped in the frame of the struts, which is generally highly non-diagonal. \begin{equation}\label{eq:detail_control_decoupling_plant_decentralized_low_freq} @@ -2535,7 +2565,7 @@ for out_i = 1:3 xlim([freqs(1), freqs(end)]); ylim([2e-8, 4e-5]); xticks([1e0, 1e1, 1e2]) yticks([1e-7, 1e-6, 1e-5]) - leg = legend('location', 'southwest', 'FontSize', 8); + leg = legend('location', 'northeast', 'FontSize', 8); leg.ItemTokenSize(1) = 18; if in_i == 1 @@ -2566,7 +2596,7 @@ exportFig('figs/detail_control_decoupling_coupled_plant_bode.pdf', 'width', 'ful <> **** Jacobian Matrix -The Jacobian matrix serves a dual purpose in the decoupling process: it converts strut velocity $\dot{\mathcal{L}}$ to payload velocity and angular velocity $\dot{\bm{\mathcal{X}}}_{\{O\}}$, and it transforms actuator forces $\bm{\tau}$ to forces/torque applied on the payload $\bm{\mathcal{F}}_{\{O\}}$, as expressed in equation eqref:eq:detail_control_decoupling_jacobian. +The Jacobian matrix $\bm{J}_{\{O\}}$ serves a dual purpose in the decoupling process: it converts strut velocity $\dot{\mathcal{L}}$ to payload velocity and angular velocity $\dot{\bm{\mathcal{X}}}_{\{O\}}$, and it transforms actuator forces $\bm{\tau}$ to forces/torque applied on the payload $\bm{\mathcal{F}}_{\{O\}}$, as expressed in equation eqref:eq:detail_control_decoupling_jacobian. \begin{subequations}\label{eq:detail_control_decoupling_jacobian} \begin{align} @@ -2628,28 +2658,6 @@ When the decoupling frame is located at the center of mass (frame $\{M\}$ in Fig \end{bmatrix} \end{equation} -#+begin_src latex :file detail_control_decoupling_control_jacobian_CoM.pdf -\begin{tikzpicture} - \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-\intercal}$}; - \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{M\}}^{-1}$}; - - % Connections and labels - \draw[<-] (Jt.west) -- ++(-1.4, 0) node[above right]{$\bm{\mathcal{F}}_{\{M\}}$}; - \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; - \draw[->] (G.east) -- (Ja.west) node[above left]{$\bm{\mathcal{L}}$}; - \draw[->] (Ja.east) -- ++( 1.4, 0) node[above left]{$\bm{\mathcal{X}}_{\{M\}}$}; - - \begin{scope}[on background layer] - \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=4pt] (Gx) {}; - \node[above] at (Gx.north) {$\bm{G}_{\{M\}}$}; - \end{scope} -\end{tikzpicture} -#+end_src - -#+RESULTS: -# [[file:figs/detail_control_decoupling_control_jacobian_CoM.png]] - Analytical formula of the plant $\bm{G}_{\{M\}}(s)$ is derived eqref:eq:detail_control_decoupling_plant_CoM. \begin{equation}\label{eq:detail_control_decoupling_plant_CoM} @@ -2723,28 +2731,6 @@ exportFig('figs/detail_control_decoupling_jacobian_plant_CoM.pdf', 'width', 'hal **** Center Of Stiffness -#+begin_src latex :file detail_control_decoupling_control_jacobian_CoK.pdf -\begin{tikzpicture} - \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{K\}}^{-\intercal}$}; - \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{K\}}^{-1}$}; - - % Connections and labels - \draw[<-] (Jt.west) -- ++(-1.4, 0) node[above right]{$\bm{\mathcal{F}}_{\{K\}}$}; - \draw[->] (Jt.east) -- (G.west) node[above left]{$\bm{\tau}$}; - \draw[->] (G.east) -- (Ja.west) node[above left]{$\bm{\mathcal{L}}$}; - \draw[->] (Ja.east) -- ++( 1.4, 0) node[above left]{$\bm{\mathcal{X}}_{\{K\}}$}; - - \begin{scope}[on background layer] - \node[fit={(Jt.south west) (Ja.north east)}, fill=black!10!white, draw, dashed, inner sep=4pt] (Gx) {}; - \node[above] at (Gx.north) {$\bm{G}_{\{K\}}$}; - \end{scope} -\end{tikzpicture} -#+end_src - -#+RESULTS: -# [[file:figs/detail_control_decoupling_control_jacobian_CoK.png]] - When the decoupling frame is located at the center of stiffness, the Jacobian matrix and its inverse are expressed as in eqref:eq:detail_control_decoupling_jacobian_CoK_inverse. \begin{equation}\label{eq:detail_control_decoupling_jacobian_CoK_inverse} @@ -2764,7 +2750,7 @@ However, it could alternatively be determined through analytical methods to ensu It should be noted that the existence of such a center of stiffness (i.e. a frame $\{K\}$ for which $\bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}}$ is diagonal) is not guaranteed for arbitrary systems. This property is typically achievable only in systems exhibiting specific symmetrical characteristics, as is the case in the present example. -The analytical expression for the plant in this configuration was then computed ref:eq:detail_control_decoupling_plant_CoK. +The analytical expression for the plant in this configuration was then computed eqref:eq:detail_control_decoupling_plant_CoK. \begin{equation}\label{eq:detail_control_decoupling_plant_CoK} \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} @@ -2780,7 +2766,6 @@ The plant is well decoupled below the suspension mode with the lowest frequency The physical reason for high-frequency coupling is illustrated in Figure ref:fig:detail_control_decoupling_model_test_CoK. When a high-frequency force is applied at a point not aligned with the center of mass, it induces rotation around the center of mass. -This phenomenon explains the coupling observed between different degrees of freedom at higher frequencies. #+begin_src matlab %% Jacobian Decoupling - Center of Mass @@ -2844,7 +2829,6 @@ exportFig('figs/detail_control_decoupling_jacobian_plant_CoK.pdf', 'width', 'hal **** Theory :ignore: Modal decoupling represents an approach based on the principle that a mechanical system's behavior can be understood as a combination of contributions from various modes [[cite:&rankers98_machin]]. - To convert the dynamics in the modal space, the equation of motion are first written with respect to the center of mass eqref:eq:detail_control_decoupling_equation_motion_CoM. \begin{equation}\label{eq:detail_control_decoupling_equation_motion_CoM} @@ -2983,7 +2967,7 @@ exportFig('figs/detail_control_decoupling_modal_plant.pdf', 'width', 'half', 'he <> **** Singular Value Decomposition -Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis [[cite:&brunton22_data, chapt. 1]] and multivariable control systems [[cite:&skogestad07_multiv_feedb_contr]], where it is particularly valuable for analyzing directional properties in multivariable systems. +Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis [[cite:&brunton22_data, chapt. 1]] and multivariable control systems where it is particularly valuable for analyzing directional properties in multivariable systems [[cite:&skogestad07_multiv_feedb_contr]]. The SVD constitutes a unique matrix decomposition applicable to any complex matrix $\bm{X} \in \mathbb{C}^{n \times m}$, expressed as: @@ -3121,8 +3105,8 @@ exportFig('figs/detail_control_decoupling_svd_plant.pdf', 'width', 'wide', 'heig [[file:figs/detail_control_decoupling_svd_plant.png]] As it was surprising to obtain such a good decoupling at all frequencies, a variant system with identical dynamics but different sensor configurations was examined. -Instead of using relative motion sensors aligned with the struts, three relative motion sensors were positioned as shown in Figure ref:fig:detail_control_decoupling_model_test_alt. -Although Jacobian matrices could theoretically map between these different sensor arrangements, application of the same SVD decoupling procedure yielded the plant response shown in Figure ref:fig:detail_control_decoupling_svd_alt_plant, which exhibits significantly greater coupling. +Instead of using relative motion sensors collocated with the struts, three relative motion sensors were positioned as shown in Figure ref:fig:detail_control_decoupling_model_test_alt. +Although Jacobian matrices could theoretically be used to map these sensors to the frame of the struts, application of the same SVD decoupling procedure yielded the plant response shown in Figure ref:fig:detail_control_decoupling_svd_alt_plant, which exhibits significantly greater coupling. Notably, the coupling demonstrates local minima near the decoupling frequency, consistent with the fact that the decoupling matrices were derived specifically for that frequency point. #+begin_src matlab @@ -3230,43 +3214,32 @@ SVD decoupling generally results in a loss of physical meaning for the "control The quality of decoupling achieved through these methods also exhibits distinct characteristics. Jacobian decoupling performance depends on the chosen reference frame, with optimal decoupling at low frequencies when aligned at the center of stiffness, or at high frequencies when aligned with the center of mass. Systems designed with coincident centers of mass and stiffness may achieve excellent decoupling using this approach. -Modal decoupling offers good decoupling across all frequencies, though its effectiveness relies on the accuracy of the system model, with discrepancies potentially resulting in significant off-diagonal elements. -The diagonal elements typically manifest as second-order low-pass filters, facilitating straightforward control design. +Modal decoupling offers good decoupling across all frequencies, though its effectiveness relies on the model accuracy, with discrepancies potentially resulting in significant off-diagonal elements. SVD decoupling can be implemented using measured data without requiring a model, with optimal performance near the chosen decoupling frequency, though its effectiveness may diminish at other frequencies and depends on the quality of the real approximation of the response at the selected frequency point. #+name: tab:detail_control_decoupling_strategies_comp #+caption: Comparison of decoupling strategies #+attr_latex: :environment tabularx :width \linewidth :align lXXX #+attr_latex: :center t :booktabs t :font \scriptsize -| | *Jacobian* | *Modal* | *SVD* | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Philosophy* | Topology Driven | Physics Driven | Data Driven | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Requirements* | Known geometry | Known equations of motion | Identified FRF | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Decoupling Matrices* | Decoupling using $\bm{J}_{\{O\}}$ obtained from geometry | Decoupling using $\bm{\Phi}$ obtained from modal decomposition | Decoupling using $\bm{U}$ and $\bm{V}$ obtained from SVD | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Decoupled Plant* | $\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-\intercal}$ | $\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-\intercal}$ | $\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-\intercal}$ | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Controller* | $\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-\intercal} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}$ | $\bm{K}_m(s) = \bm{\Phi}^{-\intercal} \bm{K}_{d}(s) \bm{\Phi}^{-1}$ | $\bm{K}_{\text{SVD}}(s) = \bm{V}^{-\intercal} \bm{K}_{d}(s) \bm{U}^{-1}$ | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Interpretation* | Forces/Torques to Displacement/Rotation in chosen frame | Inputs to excite individual modes | Directions of max to min controllability/observability | -| | | Output to sense individual modes | | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Properties* | Decoupling at low or high frequency depending on the chosen frame | Good decoupling at all frequencies | Good decoupling near the chosen frequency | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Pros* | Physical inputs / outputs | Target specific modes | Good Decoupling near the crossover | -| | Good decoupling at High frequency (diagonal mass matrix if Jacobian taken at the CoM) | 2nd order diagonal plant | Very General | -| | Good decoupling at Low frequency (if Jacobian taken at specific point) | | | -| | Easy integration of meaningful reference inputs | | | -| | | | | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Cons* | Coupling between force/rotation may be high at low frequency (non diagonal terms in K) | Need analytical equations | Loose the physical meaning of inputs /outputs | -| | Limited to parallel mechanisms (?) | | Decoupling depends on the real approximation validity | -| | If good decoupling at all frequencies => requires specific mechanical architecture | | Diagonal plants may not be easy to control | -|-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Applicability* | Parallel Mechanisms | Systems whose dynamics that can be expressed with M and K matrices | Very general | -| | Only small motion for the Jacobian matrix to stay constant | | Need FRF data (either experimentally or analytically) | +| | *Jacobian* | *Modal* | *SVD* | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Philosophy* | Topology Driven | Physics Driven | Data Driven | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Requirements* | Known geometry | Known equations of motion | Identified FRF | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Decoupling Matrices* | Jacobian matrix $\bm{J}_{\{O\}}$ | Eigenvectors $\bm{\Phi}$ | SVD matrices $\bm{U}$ and $\bm{V}$ | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Decoupled Plant* | $\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-\intercal}$ | $\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-\intercal}$ | $\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-\intercal}$ | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Controller* | $\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-\intercal} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}$ | $\bm{K}_m(s) = \bm{\Phi}^{-\intercal} \bm{K}_{d}(s) \bm{\Phi}^{-1}$ | $\bm{K}_{\text{SVD}}(s) = \bm{V}^{-\intercal} \bm{K}_{d}(s) \bm{U}^{-1}$ | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Interpretation* | Forces/Torques to Displacement/Rotation in chosen frame | Inputs (resp. outputs) to excite (resp. sense) individual modes | Directions of max to min controllability/observability | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Effectiveness* | Decoupling at low or high frequency depending on the chosen frame | Good decoupling at all frequencies | Good decoupling near the chosen frequency | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Pros* | Retain physical meaning of inputs / outputs. Controller acts on a meaningfully "frame" | Ability to target specific modes. Simple $2^{nd}$ order diagonal plants | Good Decoupling near the crossover. Very General and requires no model | +|-----------------------+-----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------| +| *Cons* | Good decoupling at all frequency can only be obtained for specific mechanical architecture | Relies on the accuracy of equation of motions. Robustness to unmodelled dynamics may be poor | Loss of physical meaning of inputs /outputs. Decoupling away from the chosen frequency may be poor | * Closed-Loop Shaping using Complementary Filters :PROPERTIES: @@ -3279,10 +3252,10 @@ SVD decoupling can be implemented using measured data without requiring a model, Once the system is properly decoupled using one of the approaches described in Section ref:sec:detail_control_decoupling, SISO controllers can be individually tuned for each decoupled "directions". Several ways to design a controller to obtain a given performance while ensuring good robustness properties can be implemented. -In some cases [[cite:&furutani04_nanom_cuttin_machin_using_stewar;&du14_piezo_actuat_high_precis_flexib;&yang19_dynam_model_decoup_contr_flexib]], "fixed" controller structures are utilized, such as PI and PID controllers, whose parameters are manually tuned. +In some cases "fixed" controller structures are utilized, such as PI and PID controllers, whose parameters are manually tuned [[cite:&furutani04_nanom_cuttin_machin_using_stewar;&du14_piezo_actuat_high_precis_flexib;&yang19_dynam_model_decoup_contr_flexib]]. -Another popular method is Open-Loop shaping, which was used during the conceptual phase after the plan was decoupled in the frame of the struts. -Open-loop shaping involves tuning the controller through a series of "standard" filters (leads, lags, notches, and low-pass filters) to shape the open-loop transfer function $G(s)K(s)$ according to desired specifications, including bandwidth, gain and phase margins, and gain at specific frequencies [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 4.4.7]]. +Another popular method is Open-Loop shaping, which was used during the conceptual phase. +Open-loop shaping involves tuning the controller through a series of "standard" filters (leads, lags, notches, low-pass filters, ...) to shape the open-loop transfer function $G(s)K(s)$ according to desired specifications, including bandwidth, gain and phase margins [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 4.4.7]]. Open-Loop shaping is very popular because the open-loop transfer function is a linear function of the controller, making it relatively straightforward to tune the controller to achieve desired open-loop characteristics. Another key advantage is that controllers can be tuned directly from measured frequency response functions of the plant without requiring an explicit model. @@ -3292,10 +3265,9 @@ With open-loop shaping, closed-loop transfer functions are changed only indirect In order to synthesize a controller that directly shapes the closed-loop transfer functions (and therefore the performance metric), $\mathcal{H}_\infty\text{-synthesis}$ may be used [[cite:&skogestad07_multiv_feedb_contr]]. This approach requires a good model of the plant and expertise in selecting weighting functions that will define the wanted shape of different closed-loop transfer functions [[cite:&bibel92_guidel_h]]. -$\mathcal{H}_{\infty}$ synthesis has been applied for the Stewart platform [[cite:&jiao18_dynam_model_exper_analy_stewar]], yet when benchmarked against more basic decentralized controllers, the performance gains proved negligible [[cite:&thayer02_six_axis_vibrat_isolat_system;&hauge04_sensor_contr_space_based_six]]. +$\mathcal{H}_{\infty}\text{-synthesis}$ has been applied for the Stewart platform [[cite:&jiao18_dynam_model_exper_analy_stewar]], yet when benchmarked against more basic decentralized controllers, the performance gains proved small [[cite:&thayer02_six_axis_vibrat_isolat_system;&hauge04_sensor_contr_space_based_six]]. In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions (i.e., directly addressing the closed-loop performances). - In Section ref:ssec:detail_control_cf_control_arch, the proposed control architecture is presented. In Section ref:ssec:detail_control_cf_trans_perf, typical performance requirements are translated into the shape of the complementary filters. The design of the complementary filters is briefly discussed in Section ref:ssec:detail_control_cf_analytical_complementary_filters, and analytical formulas are proposed such that it is possible to change the closed-loop behavior of the system in real time. @@ -3500,16 +3472,16 @@ At frequencies where the model accurately represents the physical plant ($G^{-1} \end{subequations} The sensitivity transfer function equals the high-pass filter $S = \frac{y}{dy} = H_H$, and the complementary sensitivity transfer function equals the low-pass filter $T = \frac{y}{n} = H_L$. -Hence, when the plant model closely approximates the actual system, the closed-loop transfer functions converge to the designed complementary filters, allowing direct translation of performance requirements into complementary filter design. +Hence, when the plant model closely approximates the actual dynamics, the closed-loop transfer functions converge to the designed complementary filters, allowing direct translation of performance requirements into the design of the complementary. -** Translating the performance requirements into the shapes of the complementary filters +** Translating the performance requirements into the shape of the complementary filters <> **** Introduction :ignore: Performance specifications in a feedback system can usually be expressed as upper bounds on the magnitudes of closed-loop transfer functions such as the sensitivity and complementary sensitivity transfer functions [[cite:&bibel92_guidel_h]]. -The design of a controller $K(s)$ to obtain the desired shapes of these closed-loop transfer functions is known as closed-loop shaping. +The design of a controller $K(s)$ to obtain the desired shape of these closed-loop transfer functions is known as closed-loop shaping. In the proposed control architecture, the closed-loop transfer functions eqref:eq:detail_control_cf_sf_cl_tf_K_inf are expressed in terms of the complementary filters $H_L(s)$ and $H_H(s)$ rather than directly through the controller $K(s)$. -Therefore, performance requirements must be translated into constraints on the shapes of these complementary filters. +Therefore, performance requirements must be translated into constraints on the shape of these complementary filters. **** Nominal Stability (NS) A closed-loop system is stable when all its elements (here $K$, $G^\prime$, and $H_L$) are stable and the sensitivity function $S = \frac{1}{1 + G^\prime K H_L}$ is stable. @@ -3521,7 +3493,7 @@ Consequently, stable and minimum phase complementary filters must be employed. **** Nominal Performance (NP) Performance specifications can be formalized using weighting functions $w_H$ and $w_L$, where performance is achieved when eqref:eq:detail_control_cf_weights is satisfied. -The weighting functions define the maximum magnitude of the closed-loop transfer functions as a function of frequency, effectively determining their "shape." +The weighting functions define the maximum magnitude of the closed-loop transfer functions as a function of frequency, effectively determining their "shape". \begin{subequations}\label{eq:detail_control_cf_weights} \begin{align} @@ -3544,7 +3516,7 @@ Similarly, for noise attenuation, the magnitude of the complementary sensitivity Classical stability margins (gain and phase margins) are also related to the maximum amplitude of the sensitivity transfer function. Typically, maintaining $|S|_{\infty} \le 2$ ensures a gain margin of at least 2 and a phase margin of at least $\SI{29}{\degree}$. -Therefore, by carefully selecting the shapes of the complementary filters, nominal performance specifications can be directly addressed in an intuitive manner. +Therefore, by carefully selecting the shape of the complementary filters, nominal performance specifications can be directly addressed in an intuitive manner. **** Robust Stability (RS) @@ -3639,8 +3611,8 @@ Therefore, for SISO systems, ensuring robust stability and nominal performance i ** Complementary filter design <> -As proposed in Section ref:sec:detail_control_sensor, complementary filters can be shaped using standard $\mathcal{H}_{\infty}$ synthesis techniques. -This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters (Section ref:ssec:detail_control_cf_trans_perf). +As proposed in Section ref:sec:detail_control_sensor, complementary filters can be shaped using standard $\mathcal{H}_{\infty}\text{-synthesis}$ techniques. +This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters. Alternatively, analytical formulas for complementary filters may be employed. For some applications, first-order complementary filters as shown in Equation eqref:eq:detail_control_cf_1st_order are sufficient. @@ -3661,7 +3633,7 @@ These filters can be transformed into the digital domain using the Bilinear tran \end{align} \end{subequations} -A significant advantage of using analytical formulas for complementary filters is that key parameters such as $\omega_0$ can be modified in real-time, as illustrated in Figure ref:fig:detail_control_cf_arch_tunable_params. +A significant advantage of using analytical formulas for complementary filters is that key parameters such as $\omega_0$ can be tuned in real-time, as illustrated in Figure ref:fig:detail_control_cf_arch_tunable_params. This real-time tunability allows rapid testing of different control bandwidths to evaluate performance and robustness characteristics. #+begin_src latex :file detail_control_cf_arch_tunable_params.pdf @@ -3709,7 +3681,7 @@ This real-time tunability allows rapid testing of different control bandwidths t For many practical applications, first order complementary filters are not sufficient. Specifically, a slope of $+2$ at low frequencies for the sensitivity transfer function (enabling accurate tracking of ramp inputs) and a slope of $-2$ for the complementary sensitivity transfer function are often desired. -For these cases, the complementary filters analytical formula in Equation eqref:eq:detail_control_cf_2nd_order are proposed. +For these cases, the complementary filters analytical formula in Equation eqref:eq:detail_control_cf_2nd_order is proposed. \begin{subequations}\label{eq:detail_control_cf_2nd_order} \begin{align} @@ -3727,7 +3699,7 @@ These filters can also be implemented in the digital domain with analytical form freqs_study = logspace(-2, 2, 1000); alphas = [0.1, 1, 10]; w0 = 2*pi*1; -s = tf('s') +s = tf('s'); figure; hold on; @@ -3755,7 +3727,7 @@ exportFig('figs/detail_control_cf_analytical_effect_alpha.pdf', 'width', 'half', freqs_study = logspace(-1, 3, 1000); alpha = [1]; w0s = [2*pi*1, 2*pi*10, 2*pi*100]; -s = tf('s') +s = tf('s'); figure; hold on; @@ -3826,8 +3798,8 @@ The model of the plant $G(s)$ from actuator force $F$ to displacement $y$ is des G(s) = \frac{1}{m s^2 + c s + k}, \quad m = \SI{20}{\kg},\ k = 1\si{\N/\mu\m},\ c = 10^2\si{\N\per(\m\per\s)} \end{equation} -The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics, payload dynamics, and other factors. -These uncertainties are represented using a multiplicative input uncertainty weight eqref:eq:detail_control_cf_test_plant_uncertainty., which specifies the magnitude of uncertainty as a function of frequency: +The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics and payload dynamics. +These uncertainties are represented using a multiplicative input uncertainty weight eqref:eq:detail_control_cf_test_plant_uncertainty, which specifies the magnitude of uncertainty as a function of frequency. \begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} @@ -3906,9 +3878,9 @@ exportFig('figs/detail_control_cf_bode_plot_mech_sys.pdf', 'width', 'half', 'hei **** Requirements and choice of complementary filters -As discussed in Section ref:ssec:detail_control_cf_trans_perf, nominal performance requirements can be expressed as upper bounds on the shapes of the complementary filters. +As discussed in Section ref:ssec:detail_control_cf_trans_perf, nominal performance requirements can be expressed as upper bounds on the shape of the complementary filters. For this example, the requirements are: -- to track ramp inputs (constant velocity scans) with zero steady-state error, which necessitates a $+2$ slope at low frequencies for the magnitude of the sensitivity function $|S(j\omega)|$ +- track ramp inputs (i.e. constant velocity scans) with zero steady-state error: a $+2$ slope at low frequencies for the magnitude of the sensitivity function $|S(j\omega)|$ is required - filtering of measurement noise above $\SI{300}{Hz}$, where sensor noise is significant (requiring a filtering factor of approximately 100 above this frequency) - maximizing disturbance rejection @@ -3918,8 +3890,9 @@ This condition is satisfied when the magnitude of the low-pass complementary fil Robust performance is achieved when both nominal performance and robust stability conditions are simultaneously satisfied. All requirements imposed on $H_L$ and $H_H$ are visualized in Figure ref:fig:detail_control_cf_specs_S_T. -While $\mathcal{H}_\infty$ synthesis could be employed to design the complementary filters, analytical formulas were used for this relatively simple example. -Specifically, the second-order complementary filters from Equation eqref:eq:detail_control_cf_2nd_order were selected, providing the desired $+2$ and $-2$ slopes, with parameters $\alpha = 1$ and $\omega_0 = 2\pi \cdot 20$ Hz. +While $\mathcal{H}_\infty\text{-synthesis}$ could be employed to design the complementary filters, analytical formulas were used for this relatively simple example. +The second-order complementary filters from Equation eqref:eq:detail_control_cf_2nd_order were selected with parameters $\alpha = 1$ and $\omega_0 = 2\pi \cdot 20\,\text{Hz}$. +There magnitudes are displayed in Figure ref:fig:detail_control_cf_specs_S_T, confirming that these complementary filters are fulfilling the specifications. #+name: fig:detail_control_cf_specs_S_T_obtained_filters #+caption: Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}). @@ -4156,7 +4129,7 @@ In this section, a control architecture in which complementary filters are used This approach differs from traditional open-loop shaping in that no controller is manually designed; rather, appropriate complementary filters are selected to achieve the desired closed-loop behavior. The method shares conceptual similarities with mixed-sensitivity $\mathcal{H}_{\infty}\text{-synthesis}$, as both approaches aim to shape closed-loop transfer functions, but with notable distinctions in implementation and complexity. -While $\mathcal{H}_{\infty}\text{-synthesis}$ synthesis offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort. +While $\mathcal{H}_{\infty}\text{-synthesis}$ offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort. Implementation only necessitates extracting a model of the plant and selecting appropriate analytical complementary filters, making it particularly interesting for applications where simplicity and intuitive parameter tuning are valued. Due to time constraints, an extensive literature review comparing this approach with similar existing architectures, such as Internal Model Control [[cite:&saxena12_advan_inter_model_contr_techn]], was not conducted. @@ -4171,22 +4144,20 @@ It will be experimentally validated with the NASS during the experimental phase. :END: <> -In order to optimize the control of the Nano Active Stabilization System, several aspects of control theory were studied in this section. - +In order to optimize the control of the Nano Active Stabilization System, several aspects of control theory were studied. Different approaches to combine sensors were compared in Section ref:sec:detail_control_sensor. While High Authority Control-Low Authority Control (HAC-LAC) was successfully applied during the conceptual design phase, the focus of this work was extended to sensor fusion techniques where two or more sensors are combined using complementary filters. -It was demonstrated that the performance of such fusion depends significantly on the proper design of these complementary filters. +It was demonstrated that the performance of such fusion depends significantly on the magnitude of the complementary filters. To address this challenge, a synthesis method based on $\mathcal{H}_\infty\text{-synthesis}$ was proposed, allowing for intuitive shaping of the complementary filters through weighting functions. -This approach enabled the translation of sensor fusion objectives directly into requirements on filter magnitudes. For the NASS, while HAC-LAC remains a natural way to combine sensors, the potential benefits of sensor fusion merit further investigation. Various decoupling strategies for parallel manipulators were examined in Section ref:sec:detail_control_decoupling, including decentralized control, Jacobian decoupling, modal decoupling, and Singular Value Decomposition (SVD) decoupling. The main characteristics of each approach were highlighted, providing valuable insights into their respective strengths and limitations. Among the examined methods, Jacobian decoupling was determined to be most appropriate for the NASS, as it provides straightforward implementation while preserving the physical meaning of inputs and outputs. -With the system successfully decoupled, attention shifts to designing appropriate SISO controllers for each decoupled direction. -A method for directly shaping closed-loop transfer functions is proposed, based on complementary filters that can be designed using either the $\mathcal{H}_\infty$ approach described earlier or through analytical formulas. -This straightforward approach enables intuitive parameter tuning while maintaining design simplicity. +With the system successfully decoupled, attention shifted to designing appropriate SISO controllers for each decoupled direction. +A control architecture for directly shaping closed-loop transfer functions was proposed. +It is based on complementary filters that can be designed using either the proposed $\mathcal{H}_\infty\text{-synthesis}$ approach described earlier or through analytical formulas. Experimental validation of this method on the NASS will be conducted during the experimental tests on ID31. * Bibliography :ignore: diff --git a/nass-control.pdf b/nass-control.pdf index f421f4d..c2106fe 100644 Binary files a/nass-control.pdf and b/nass-control.pdf differ diff --git a/nass-control.tex b/nass-control.tex index f0248d3..5c9a3b1 100644 --- a/nass-control.tex +++ b/nass-control.tex @@ -1,4 +1,4 @@ -% Created 2025-04-13 Sun 11:32 +% Created 2025-04-13 Sun 17:08 % Intended LaTeX compiler: pdflatex \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} @@ -26,7 +26,6 @@ Three critical elements for the control of parallel manipulators such as the Nano-Hexapod were identified: effective utilization and combination of multiple sensors, appropriate plant decoupling strategies, and robust controller design for the decoupled system. During the conceptual design phase of the NASS, pragmatic approaches were implemented for each of these elements. - The High Authority Control-Low Authority Control (HAC-LAC) architecture was selected for combining sensors. Control was implemented in the frame of the struts, leveraging the inherent low-frequency decoupling of the plant where all decoupled elements exhibited similar dynamics, thereby simplifying the Single-Input Single-Output (SISO) controller design process. For these decoupled plants, open-loop shaping techniques were employed to tune the individual controllers. @@ -44,10 +43,9 @@ A method for directly shaping closed-loop transfer functions using complementary \label{sec:detail_control_sensor} The literature review of Stewart platforms revealed a wide diversity of designs with various sensor and actuator configurations. -Control objectives (such as active damping, vibration isolation, or precise positioning) dictate specific sensor configurations. -The selection between inertial sensors, force sensors, or relative position sensors is primarily determined by the system's control requirements. +Control objectives (such as active damping, vibration isolation, or precise positioning) directly dictate sensor selection, whether inertial, force, or relative position sensors. -In cases where multiple control objectives must be achieved simultaneously, as is the case for the Nano Active Stabilization System (NASS) where the Stewart platform must both position the sample and provide isolation from micro-station vibrations, combining multiple sensors within the control architecture has been demonstrated to yield significant performance benefits. +In cases where multiple control objectives must be achieved simultaneously, as is the case for the Nano Active Stabilization System (NASS) where the Stewart platform must both position the sample and provide isolation from micro-station vibrations, combining multiple sensors within the control architecture has been demonstrated to yield significant performance benefits \cite{hauge04_sensor_contr_space_based_six}. From the literature, three principal approaches for combining sensors have been identified: High Authority Control-Low Authority Control (HAC-LAC), sensor fusion, and two-sensor control architectures. \begin{figure}[htbp] @@ -74,7 +72,7 @@ From the literature, three principal approaches for combining sensors have been \caption{\label{fig:detail_control_control_multiple_sensors}Different control strategies when using multiple sensors. High Authority Control / Low Authority Control (\subref{fig:detail_control_sensor_arch_hac_lac}). Sensor Fusion (\subref{fig:detail_control_sensor_arch_sensor_fusion}). Two-Sensor Control (\subref{fig:detail_control_sensor_arch_two_sensor_control})} \end{figure} -The HAC-LAC approach, implemented during the conceptual phase, employs a dual-loop control strategy in which two control loops utilize different sensors for distinct purposes (Figure \ref{fig:detail_control_sensor_arch_hac_lac}). +The HAC-LAC approach employs a dual-loop control strategy in which two control loops utilize different sensors for distinct purposes (Figure \ref{fig:detail_control_sensor_arch_hac_lac}). In \cite{li01_simul_vibrat_isolat_point_contr}, vibration isolation is provided by accelerometers collocated with the voice coil actuators, while external rotational sensors are utilized to achieve pointing control. In \cite{geng95_intel_contr_system_multip_degree}, force sensors collocated with the magnetostrictive actuators are used for active damping using decentralized IFF, and subsequently accelerometers are employed for adaptive vibration isolation. Similarly, in \cite{wang16_inves_activ_vibrat_isolat_stewar}, piezoelectric actuators with collocated force sensors are used in a decentralized manner to provide active damping while accelerometers are implemented in an adaptive feedback loop to suppress periodic vibrations. @@ -82,7 +80,7 @@ In \cite{xie17_model_contr_hybrid_passiv_activ}, force sensors are integrated in The second approach, sensor fusion (illustrated in Figure \ref{fig:detail_control_sensor_arch_sensor_fusion}), involves filtering signals from two sensors using complementary filters\footnote{A set of two complementary filters are two transfer functions that sum to one.} and summing them to create an improved sensor signal. In \cite{hauge04_sensor_contr_space_based_six}, geophones (used at low frequency) are merged with force sensors (used at high frequency). -It is demonstrated that combining both sensors using sensor fusion can improve performance compared to using the individual sensors independently. +It is demonstrated that combining both sensors using sensor fusion can improve performance compared to using only one of the two sensors. In \cite{tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip}, sensor fusion architecture is implemented with an accelerometer and a force sensor. This implementation is shown to simultaneously achieve high damping of structural modes (through the force sensors) while maintaining very low vibration transmissibility (through the accelerometers). @@ -95,25 +93,20 @@ A ``two-sensor control'' approach was proven to perform better than controllers A Linear Quadratic Regulator (LQG) was employed to optimize the two-input/one-output controller. Beyond these three main approaches, other control architectures have been proposed for different purposes. -In \cite{yang19_dynam_model_decoup_contr_flexib}, a first control loop utilizes force sensors and relative motion sensors to compensate for parasitic stiffness of the flexible joints. +For instance, in \cite{yang19_dynam_model_decoup_contr_flexib}, a first control loop utilizes force sensors and relative motion sensors to compensate for parasitic stiffness of the flexible joints. Subsequently, the system is decoupled in the modal space (facilitated by the removal of parasitic stiffness) and accelerometers are employed for vibration isolation. The HAC-LAC architecture was previously investigated during the conceptual phase and successfully implemented to validate the NASS concept, demonstrating excellent performance. At the other end of the spectrum, the two-sensor approach yields greater control design freedom but introduces increased complexity in tuning, and thus was not pursued in this study. This work instead focuses on sensor fusion, which represents a promising middle ground between the proven HAC-LAC approach and the more complex two-sensor control strategy. -A review of sensor fusion is first presented (Section \ref{ssec:detail_control_sensor_review}), followed by an examination of the fundamental theoretical concepts (Section \ref{ssec:detail_control_sensor_fusion_requirements}). -In this section, both the robustness of the fusion and the noise characteristics of the resulting ``super sensor'' are derived and expressed as functions of the complementary filters' norms. -A synthesis method for designing complementary filters that allow to shape their norms is proposed (Section \ref{ssec:detail_control_sensor_hinf_method}). +A review of sensor fusion is first presented in Section \ref{ssec:detail_control_sensor_review}. +Then, in Section \ref{ssec:detail_control_sensor_fusion_requirements}, both the robustness of the fusion and the noise characteristics of the resulting ``fused sensor'' are derived and expressed as functions of the complementary filters' norms. +A synthesis method for shaping complementary filters is proposed in Section \ref{ssec:detail_control_sensor_hinf_method}. The investigation is then extended beyond the conventional two-sensor scenario, demonstrating how the proposed complementary filter synthesis can be generalized for applications requiring the fusion of three or more sensors (Section \ref{ssec:detail_control_sensor_hinf_three_comp_filters}). \section{Review of Sensor Fusion} \label{ssec:detail_control_sensor_review} -Sensors used to measure physical quantities have two primary limitations: measurement accuracy which is compromised by various noise sources (including electrical noise from conditioning electronics), and limited measurement bandwidth. -Sensor fusion offers a solution to these limitations by combining multiple sensors \cite{bendat57_optim_filter_indep_measur_two}. -By strategically selecting sensors with complementary characteristics, a ``super sensor'' can be created that combines the advantages of each individual sensor. - - Measuring a physical quantity using sensors is always subject to several limitations. First, the accuracy of the measurement is affected by various noise sources, such as electrical noise from the conditioning electronics. Second, the frequency range in which the measurement is relevant is bounded by the bandwidth of the sensor. @@ -127,7 +120,7 @@ In other applications, sensor fusion is utilized to obtain an estimate of the me More recently, the fusion of sensors measuring different physical quantities has been proposed to enhance control properties \cite{collette15_sensor_fusion_method_high_perfor,yong16_high_speed_vertic_posit_stage}. In \cite{collette15_sensor_fusion_method_high_perfor}, an inertial sensor used for active vibration isolation is fused with a sensor collocated with the actuator to improve the stability margins of the feedback controller. -On top of Stewart platforms, practical applications of sensor fusion are numerous. +Beyond Stewart platforms, practical applications of sensor fusion are numerous. It is widely implemented for attitude estimation in autonomous vehicles such as unmanned aerial vehicles \cite{baerveldt97_low_cost_low_weigh_attit,corke04_inert_visual_sensin_system_small_auton_helic,jensen13_basic_uas} and underwater vehicles \cite{pascoal99_navig_system_desig_using_time,batista10_optim_posit_veloc_navig_filter_auton_vehic}. Sensor fusion offers significant benefits for high-performance positioning control as demonstrated in \cite{shaw90_bandw_enhan_posit_measur_using_measur_accel,zimmermann92_high_bandw_orien_measur_contr,min15_compl_filter_desig_angle_estim,yong16_high_speed_vertic_posit_stage}. It has also been identified as a key technology for improving the performance of active vibration isolation systems \cite{tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip}. @@ -143,14 +136,10 @@ In early implementations of complementary filtering, analog circuits were used t While analog complementary filters remain in use today \cite{yong16_high_speed_vertic_posit_stage,moore19_capac_instr_sensor_fusion_high_bandw_nanop}, digital implementation is now more common as it provides greater flexibility. Various design methods have been developed to optimize complementary filters. -The most straightforward approach utilizes analytical formulas. -Depending on the application, these formulas may be of first order \cite{corke04_inert_visual_sensin_system_small_auton_helic,yeh05_model_contr_hydraul_actuat_two,yong16_high_speed_vertic_posit_stage}, second order \cite{baerveldt97_low_cost_low_weigh_attit,stoten01_fusion_kinet_data_using_compos_filter,jensen13_basic_uas}, or higher orders \cite{shaw90_bandw_enhan_posit_measur_using_measur_accel,zimmermann92_high_bandw_orien_measur_contr,stoten01_fusion_kinet_data_using_compos_filter,collette15_sensor_fusion_method_high_perfor,matichard15_seism_isolat_advan_ligo}. - -Since the characteristics of the super sensor depend on the proper design of complementary filters \cite{dehaeze19_compl_filter_shapin_using_synth}, several optimization techniques have been developed. -Some approaches focus on finding optimal parameters for analytical formulas \cite{jensen13_basic_uas,min15_compl_filter_desig_angle_estim,fonseca15_compl}, while others employ convex optimization tools \cite{hua04_polyp_fir_compl_filter_contr_system,hua05_low_ligo} such as linear matrix inequalities \cite{pascoal99_navig_system_desig_using_time}. -As demonstrated in \cite{plummer06_optim_compl_filter_their_applic_motion_measur}, complementary filter design can be linked to the standard mixed-sensitivity control problem. -Consequently, the powerful tools developed for classical control theory can be applied to complementary filter design. -For example, in \cite{jensen13_basic_uas}, the two gains of a Proportional Integral (PI) controller are optimized to minimize super sensor noise. +The most straightforward approach utilizes analytical formulas, which depending on the application may be first order \cite{corke04_inert_visual_sensin_system_small_auton_helic,yeh05_model_contr_hydraul_actuat_two,yong16_high_speed_vertic_posit_stage}, second order \cite{baerveldt97_low_cost_low_weigh_attit,stoten01_fusion_kinet_data_using_compos_filter,jensen13_basic_uas}, or higher orders \cite{shaw90_bandw_enhan_posit_measur_using_measur_accel,zimmermann92_high_bandw_orien_measur_contr,stoten01_fusion_kinet_data_using_compos_filter,collette15_sensor_fusion_method_high_perfor,matichard15_seism_isolat_advan_ligo}. +Since the characteristics of the super sensor depend on proper complementary filter design \cite{dehaeze19_compl_filter_shapin_using_synth}, several optimization techniques have emerged—ranging from optimizing parameters for analytical formulas \cite{jensen13_basic_uas,min15_compl_filter_desig_angle_estim,fonseca15_compl} to employing convex optimization tools \cite{hua04_polyp_fir_compl_filter_contr_system,hua05_low_ligo} such as linear matrix inequalities \cite{pascoal99_navig_system_desig_using_time}. +As demonstrated in \cite{plummer06_optim_compl_filter_their_applic_motion_measur}, complementary filter design can be linked to the standard mixed-sensitivity control problem, allowing powerful classical control theory tools to be applied. +For example, in \cite{jensen13_basic_uas}, two gains of a Proportional Integral (PI) controller are optimized to minimize super sensor noise. All these complementary filter design methods share the common objective of creating a super sensor with desired characteristics, typically in terms of noise and dynamics. As reported in \cite{zimmermann92_high_bandw_orien_measur_contr,plummer06_optim_compl_filter_their_applic_motion_measur}, phase shifts and magnitude bumps in the super sensor dynamics may occur if complementary filters are poorly designed or if sensors are improperly calibrated. @@ -158,7 +147,7 @@ Therefore, the robustness of the fusion must be considered when designing comple Despite the numerous design methods proposed in the literature, a simple approach that specifies desired super sensor characteristics while ensuring good fusion robustness has been lacking. Fortunately, both fusion robustness and super sensor characteristics can be linked to complementary filter magnitude \cite{dehaeze19_compl_filter_shapin_using_synth}. -Based on this relationship, the present work introduces an approach to designing complementary filters using \(\mathcal{H}_\infty\) synthesis, which enables intuitive shaping of complementary filter magnitude in a straightforward manner. +Based on this relationship, the present work introduces an approach to designing complementary filters using \(\mathcal{H}_\infty\text{-synthesis}\), which enables intuitive shaping of complementary filter magnitude in a straightforward manner. \section{Sensor Fusion and Complementary Filters Requirements} \label{ssec:detail_control_sensor_fusion_requirements} A general sensor fusion architecture using complementary filters is shown in Figure \ref{fig:detail_control_sensor_fusion_overview}, where multiple sensors (in this case two) measure the same physical quantity \(x\). @@ -230,7 +219,7 @@ The effects of imperfect normalization will be addressed subsequently. In that case, the super sensor output \(\hat{x}\) equals \(x\) plus the filtered noise from both sensors \eqref{eq:detail_control_sensor_estimate_perfect_dyn}. From this equation, it is evident that the complementary filters \(H_1(s)\) and \(H_2(s)\) operate solely on the sensor noise. Thus, this sensor fusion architecture allows filtering of sensor noise without introducing distortion in the measured physical quantity. -This fundamental property necessitates that the two filters must be complementary. +This fundamental property necessitates that the two filters are complementary. \begin{equation}\label{eq:detail_control_sensor_estimate_perfect_dyn} \hat{x} = x + H_1(s) n_1 + H_2(s) n_2 @@ -252,15 +241,13 @@ If the two sensors have identical noise characteristics (\(\Phi_{n_1}(\omega) = This represents the simplest form of sensor fusion using complementary filters. However, sensors typically exhibit high noise levels in different frequency regions. -In such cases, to reduce the noise of the super sensor, the norm \(|H_1(j\omega)|\) should be minimized when \(\Phi_{n_1}(\omega)\) exceeds \(\Phi_{n_2}(\omega)\), and the norm \(|H_2(j\omega)|\) should be minimized when \(\Phi_{n_2}(\omega)\) exceeds \(\Phi_{n_1}(\omega)\). +In such cases, to reduce the noise of the super sensor, \(|H_1(j\omega)|\) should be minimized when \(\Phi_{n_1}(\omega)\) exceeds \(\Phi_{n_2}(\omega)\), and \(|H_2(j\omega)|\) should be minimized when \(\Phi_{n_2}(\omega)\) exceeds \(\Phi_{n_1}(\omega)\). Therefore, by appropriately shaping the norm of the complementary filters, the noise of the super sensor can be minimized. \paragraph{Sensor Fusion Robustness} In practical systems, sensor normalization is rarely perfect, and condition \eqref{eq:detail_control_sensor_perfect_dynamics} is not fully satisfied. - To analyze such imperfections, a multiplicative input uncertainty is incorporated into the sensor dynamics (Figure \ref{fig:detail_control_sensor_model_uncertainty}). The nominal model is the estimated model used for normalization \(\hat{G}_i(s)\), \(\Delta_i(s)\) is any stable transfer function satisfying \(|\Delta_i(j\omega)| \le 1,\ \forall\omega\), and \(w_i(s)\) is a weighting transfer function representing the magnitude of uncertainty. -The weight \(w_i(s)\) is selected such that the actual sensor dynamics \(G_i(j\omega)\) remains within the uncertain region represented by a circle in the complex plane, centered on \(1\) with a radius equal to \(|w_i(j\omega)|\). Since the nominal sensor dynamics is taken as the normalized filter, the normalized sensor model can be further simplified as shown in Figure \ref{fig:detail_control_sensor_model_uncertainty_simplified}. @@ -275,7 +262,7 @@ Since the nominal sensor dynamics is taken as the normalized filter, the normali \begin{center} \includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_sensor_model_uncertainty_simplified.png} \end{center} -\subcaption{\label{fig:detail_control_sensor_model_uncertainty_simplified}Simplified sensor model} +\subcaption{\label{fig:detail_control_sensor_model_uncertainty_simplified}Simplified normalized sensor model} \end{subfigure} \caption{\label{fig:detail_control_sensor_models_uncertainty}Sensor models with dynamical uncertainty} \end{figure} @@ -284,11 +271,6 @@ The sensor fusion architecture incorporating sensor models with dynamical uncert The super sensor dynamics \eqref{eq:detail_control_sensor_super_sensor_dyn_uncertainty} is no longer unity but depends on the sensor dynamical uncertainty weights \(w_i(s)\) and the complementary filters \(H_i(s)\). The dynamical uncertainty of the super sensor can be graphically represented in the complex plane by a circle centered on \(1\) with a radius equal to \(|w_1(j\omega) H_1(j\omega)| + |w_2(j\omega) H_2(j\omega)|\) (Figure \ref{fig:detail_control_sensor_uncertainty_set_super_sensor}). - -The sensor fusion architecture with the sensor models including dynamical uncertainty is shown in Figure \ref{fig:detail_control_sensor_fusion_dynamic_uncertainty}. -The super sensor dynamics \eqref{eq:detail_control_sensor_super_sensor_dyn_uncertainty} is no longer equal to \(1\) and now depends on the sensor dynamical uncertainty weights \(w_i(s)\) as well as on the complementary filters \(H_i(s)\). -The dynamical uncertainty of the super sensor can be graphically represented in the complex plane by a circle centered on \(1\) with a radius equal to \(|w_1(j\omega) H_1(j\omega)| + |w_2(j\omega) H_2(j\omega)|\) (Figure \ref{fig:detail_control_sensor_uncertainty_set_super_sensor}). - \begin{equation}\label{eq:detail_control_sensor_super_sensor_dyn_uncertainty} \frac{\hat{x}}{x} = 1 + w_1(s) H_1(s) \Delta_1(s) + w_2(s) H_2(s) \Delta_2(s) \end{equation} @@ -316,7 +298,7 @@ As it is generally desired to limit the dynamical uncertainty of the super senso As established in Section \ref{ssec:detail_control_sensor_fusion_requirements}, the super sensor's noise characteristics and robustness are directly dependent on the complementary filters' norm. A synthesis method enabling precise shaping of these norms would therefore offer substantial practical benefits. This section develops such an approach by formulating the design objective as a standard \(\mathcal{H}_\infty\) optimization problem. -The methodology for designing appropriate weighting functions (which specify desired complementary filter shapes during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example. +The methodology for designing appropriate weighting functions (which specify desired complementary filter shape during synthesis) is examined in detail, and the efficacy of the proposed method is validated with a simple example. \paragraph{Synthesis Objective} The primary objective is to shape the norms of two filters \(H_1(s)\) and \(H_2(s)\) while ensuring they maintain their complementary property as defined in \eqref{eq:detail_control_sensor_comp_filter}. @@ -332,8 +314,7 @@ Weighting transfer functions \(W_1(s)\) and \(W_2(s)\) are strategically selecte \end{subequations} \paragraph{Shaping of Complementary Filters using \(\mathcal{H}_\infty\) synthesis} -The synthesis objective can be readily expressed as a standard \(\mathcal{H}_\infty\) optimization problem and solved using widely available computational tools. -Consider the generalized plant \(P(s)\) illustrated in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant} and mathematically described by \eqref{eq:detail_control_sensor_generalized_plant}. +The synthesis objective can be expressed as a standard \(\mathcal{H}_\infty\) optimization problem by considering the generalized plant \(P(s)\) illustrated in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant} and mathematically described by \eqref{eq:detail_control_sensor_generalized_plant}. \begin{equation}\label{eq:detail_control_sensor_generalized_plant} \begin{bmatrix} z_1 \\ z_2 \\ v \end{bmatrix} = P(s) \begin{bmatrix} w\\u \end{bmatrix}; \quad P(s) = \begin{bmatrix}W_1(s) & -W_1(s) \\ 0 & \phantom{+}W_2(s) \\ 1 & 0 \end{bmatrix} @@ -352,16 +333,16 @@ Consider the generalized plant \(P(s)\) illustrated in Figure \ref{fig:detail_co \end{center} \subcaption{\label{fig:detail_control_sensor_h_infinity_robust_fusion_fb}Generalized plant with the synthesized filter} \end{subfigure} -\caption{\label{fig:detail_control_sensor_h_infinity_robust_fusion}Architecture for the \(\mathcal{H}_\infty\) synthesis of complementary filters} +\caption{\label{fig:detail_control_sensor_h_infinity_robust_fusion}Architecture for the \(\mathcal{H}_\infty\text{-synthesis}\) of complementary filters} \end{figure} -Applying standard \(\mathcal{H}_\infty\) synthesis to the generalized plant \(P(s)\) is equivalent to finding a stable filter \(H_2(s)\) that, based on input \(v\), generates an output signal \(u\) such that the \(\mathcal{H}_\infty\) norm of the system shown in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_fb} from \(w\) to \([z_1, \ z_2]\) does not exceed unity, as expressed in \eqref{eq:detail_control_sensor_hinf_syn_obj}. +Applying standard \(\mathcal{H}_\infty\text{-synthesis}\) to the generalized plant \(P(s)\) is equivalent to finding a stable filter \(H_2(s)\) that, based on input \(v\), generates an output signal \(u\) such that the \(\mathcal{H}_\infty\) norm of the system shown in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_fb} from \(w\) to \([z_1, \ z_2]\) does not exceed unity, as expressed in \eqref{eq:detail_control_sensor_hinf_syn_obj}. \begin{equation}\label{eq:detail_control_sensor_hinf_syn_obj} \left\|\begin{matrix} \left(1 - H_2(s)\right) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -By defining \(H_1(s)\) as the complement of \(H_2(s)\) (\eqref{eq:detail_control_sensor_definition_H1}), the \(\mathcal{H}_\infty\) synthesis objective becomes equivalent to \eqref{eq:detail_control_sensor_hinf_problem}, ensuring that conditions \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are satisfied. +By defining \(H_1(s)\) as the complement of \(H_2(s)\) \eqref{eq:detail_control_sensor_definition_H1}, the \(\mathcal{H}_\infty\text{-synthesis}\) objective becomes equivalent to \eqref{eq:detail_control_sensor_hinf_problem}, ensuring that conditions \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are satisfied. \begin{equation}\label{eq:detail_control_sensor_definition_H1} H_1(s) \triangleq 1 - H_2(s) @@ -371,19 +352,19 @@ By defining \(H_1(s)\) as the complement of \(H_2(s)\) (\eqref{eq:detail_control \left\|\begin{matrix} H_1(s) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -Therefore, applying \(\mathcal{H}_\infty\) synthesis to the standard plant \(P(s)\) (\eqref{eq:detail_control_sensor_generalized_plant}) generates two filters, \(H_2(s)\) and \(H_1(s) \triangleq 1 - H_2(s)\), that are complementary as required by \eqref{eq:detail_control_sensor_comp_filter_problem_form}, with norms bounded by the specified constraints in \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2}. +Therefore, applying \(\mathcal{H}_\infty\text{-synthesis}\) to the standard plant \(P(s)\) generates two filters, \(H_2(s)\) and \(H_1(s) \triangleq 1 - H_2(s)\), that are complementary as required by \eqref{eq:detail_control_sensor_comp_filter_problem_form}, with norms bounded by the specified constraints in \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2}. It should be noted that there exists only an implication (not an equivalence) between the \(\mathcal{H}_\infty\) norm condition in \eqref{eq:detail_control_sensor_hinf_problem} and the initial synthesis objectives in \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2}. -Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates (see \cite[,Chap. 2.8.3]{skogestad07_multiv_feedb_contr}). +Consequently, the optimization may be somewhat conservative with respect to the set of filters on which it operates \cite[,Chap. 2.8.3]{skogestad07_multiv_feedb_contr}. \paragraph{Weighting Functions Design} Weighting functions play a crucial role during synthesis by specifying the maximum allowable norms for the complementary filters. -The proper design of these weighting functions is essential for the successful implementation of the proposed \(\mathcal{H}_\infty\) synthesis approach. +The proper design of these weighting functions is essential for the successful implementation of the proposed \(\mathcal{H}_\infty\text{-synthesis}\) approach. Three key considerations should guide the design of weighting functions. First, only proper and stable transfer functions should be employed. Second, the order of the weighting functions should remain reasonably small to minimize computational costs associated with solving the optimization problem and to facilitate practical implementation of the filters (as the order of the synthesized filters equals the sum of the weighting functions' orders). -Third, the fundamental limitations imposed by the complementary property (\eqref{eq:detail_control_sensor_comp_filter}) must be respected, which implies that \(|H_1(j\omega)|\) and \(|H_2(j\omega)|\) cannot both be made small at the same frequency. +Third, the fundamental limitations imposed by the complementary property \eqref{eq:detail_control_sensor_comp_filter} must be respected, which implies that \(|H_1(j\omega)|\) and \(|H_2(j\omega)|\) cannot both be made small at the same frequency. When designing complementary filters, it is typically desirable to specify their slopes, ``blending'' frequency, and maximum gains at low and high frequencies. To facilitate the expression of these specifications, formula \eqref{eq:detail_control_sensor_weight_formula} is proposed for the design of weighting functions. @@ -445,7 +426,7 @@ Parameter & \(W_1(s)\) & \(W_2(s)\)\\ \end{center} \end{minipage} -Standard \(\mathcal{H}_\infty\) synthesis is then applied to the generalized plant shown in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant}. +Standard \(\mathcal{H}_\infty\text{-synthesis}\) is then applied to the generalized plant shown in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant}. This yields the filter \(H_2(s)\) that minimizes the \(\mathcal{H}_\infty\) norm from input \(w\) to outputs \([z_1,\ z_2]^{\intercal}\). The resulting \(\mathcal{H}_\infty\) norm is found to be close to unity, indicating successful synthesis: the norms of the complementary filters remain below the specified upper bounds. This is confirmed by the Bode plots of the obtained complementary filters in Figure \ref{fig:detail_control_sensor_hinf_filters_results}. @@ -491,7 +472,7 @@ The synthesis objective is to compute a set of \(n\) stable transfer functions \ The transfer functions \([W_1(s),\ W_2(s),\ \dots,\ W_n(s)]\) are weights selected to specify the maximum complementary filters' norm during synthesis. This synthesis objective is closely related to the one described in Section \ref{ssec:detail_control_sensor_hinf_method}, and the proposed synthesis method represents a generalization of the approach previously presented. -A set of \(n\) complementary filters can be shaped by applying standard \(\mathcal{H}_\infty\) synthesis to the generalized plant \(P_n(s)\) described by \eqref{eq:detail_control_sensor_generalized_plant_n_filters}. +A set of \(n\) complementary filters can be shaped by applying standard \(\mathcal{H}_\infty\text{-synthesis}\) to the generalized plant \(P_n(s)\) described by \eqref{eq:detail_control_sensor_generalized_plant_n_filters}. \begin{equation}\label{eq:detail_control_sensor_generalized_plant_n_filters} \begin{bmatrix} z_1 \\ \vdots \\ z_n \\ v \end{bmatrix} = P_n(s) \begin{bmatrix} w \\ u_1 \\ \vdots \\ u_{n-1} \end{bmatrix}; \quad @@ -531,7 +512,7 @@ Consider the generalized plant \(P_3(s)\) shown in Figure \ref{fig:detail_contro \begin{figure}[htbp] \begin{subfigure}{0.48\textwidth} \begin{center} -\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_sensor_comp_filter_three_hinf_fb.png} +\includegraphics[scale=1,scale=0.9]{figs/detail_control_sensor_comp_filter_three_hinf_fb.png} \end{center} \subcaption{\label{fig:detail_control_sensor_comp_filter_three_hinf_fb}Generalized plant with the synthesized filter} \end{subfigure} @@ -541,10 +522,10 @@ Consider the generalized plant \(P_3(s)\) shown in Figure \ref{fig:detail_contro \end{center} \subcaption{\label{fig:detail_control_sensor_three_complementary_filters_results}Weights and obtained filters} \end{subfigure} -\caption{\label{fig:detail_control_sensor_comp_filter_three_hinf}Architecture for the \(\mathcal{H}_\infty\) synthesis of three complementary filters (\subref{fig:detail_control_sensor_comp_filter_three_hinf_fb}). Bode plot of the inverse weighting functions and of the three obtained complementary filters (\subref{fig:detail_control_sensor_three_complementary_filters_results})} +\caption{\label{fig:detail_control_sensor_comp_filter_three_hinf}Architecture for the \(\mathcal{H}_\infty\text{-synthesis}\) of three complementary filters (\subref{fig:detail_control_sensor_comp_filter_three_hinf_fb}). Bode plot of the inverse weighting functions and of the three obtained complementary filters (\subref{fig:detail_control_sensor_three_complementary_filters_results})} \end{figure} -Standard \(\mathcal{H}_\infty\) synthesis is performed on the generalized plant \(P_3(s)\). +Standard \(\mathcal{H}_\infty\text{-synthesis}\) is performed on the generalized plant \(P_3(s)\). Two filters, \(H_2(s)\) and \(H_3(s)\), are obtained such that the \(\mathcal{H}_\infty\) norm of the closed-loop transfer from \(w\) to \([z_1,\ z_2,\ z_3]\) of the system in Figure \ref{fig:detail_control_sensor_comp_filter_three_hinf_fb} is less than one. Filter \(H_1(s)\) is defined using \eqref{eq:detail_control_sensor_h1_compl_h2_h3}, thus ensuring the complementary property of the obtained set of filters. @@ -559,12 +540,12 @@ This approach allows shaping of the filter magnitudes through the use of weighti This capability is particularly valuable in practice since the characteristics of the super sensor are directly linked to the complementary filters' magnitude. Consequently, typical sensor fusion objectives can be effectively translated into requirements on the magnitudes of the filters. -For the Nano Active Stabilization System (NASS), the High Authority Control-Integral Force Feedback (HAC-IFF) strategy was found to perform well and to offer the advantages of being both intuitive to understand and straightforward to tune. -Looking forward, it would be interesting to investigate how sensor fusion (particularly between the force sensor and external metrology) compares to the HAC-IFF approach in terms of performance and robustness. +For the NASS, the HAC-LAC strategy was found to perform well and to offer the advantages of being both intuitive to understand and straightforward to tune. +Looking forward, it would be interesting to investigate how sensor fusion (particularly between the force sensors and external metrology) compares to the HAC-IFF approach in terms of performance and robustness. \chapter{Decoupling} \label{sec:detail_control_decoupling} -The control of parallel manipulators (and any MIMO system in general) typically involves a two-step approach: first decoupling the plant dynamics using various strategies, which will be discussed in this section, followed by the application of SISO control for the decoupled plant (discussed in section \ref{sec:detail_control_cf}). +The control of parallel manipulators (and any MIMO system in general) typically involves a two-step approach: first decoupling the plant dynamics (using various strategies discussed in this section), followed by the application of SISO control for the decoupled plant (discussed in section \ref{sec:detail_control_cf}). When sensors are integrated within the struts, decentralized control may be applied, as the system is already well decoupled at low frequency. For instance, \cite{furutani04_nanom_cuttin_machin_using_stewar} implemented a system where each strut consists of piezoelectric stack actuators and eddy current displacement sensors, with separate PI controllers for each strut. @@ -576,23 +557,24 @@ This approach enables the implementation of controllers in a defined frame. It has been applied with various sensor types including force sensors \cite{mcinroy00_desig_contr_flexur_joint_hexap}, relative displacement sensors \cite{kim00_robus_track_contr_desig_dof_paral_manip}, and inertial sensors \cite{li01_simul_vibrat_isolat_point_contr,abbas14_vibrat_stewar_platf}. The Cartesian frame in which the system is decoupled is typically chosen at the point of interest (i.e., where the motion is of interest) or at the center of mass. -Modal control represents another noteworthy decoupling strategy, wherein the ``local'' plant inputs and outputs are mapped to the modal space. +Modal decoupling represents another noteworthy decoupling strategy, wherein the ``local'' plant inputs and outputs are mapped to the modal space. In this approach, multiple SISO plants, each corresponding to a single mode, can be controlled independently. This decoupling strategy has been implemented for active damping applications \cite{holterman05_activ_dampin_based_decoup_colloc_contr}, which is logical as it is often desirable to dampen specific modes. The strategy has also been employed in \cite{pu11_six_degree_of_freed_activ} for vibration isolation purposes using geophones, and in \cite{yang19_dynam_model_decoup_contr_flexib} using force sensors. -Another completely different strategy, is to use implement a multivariable control directly on the coupled system. +Another completely different strategy would be to implement a multivariable control directly on the coupled system. \(\mathcal{H}_\infty\) and \(\mu\text{-synthesis}\) were applied to a Stewart platform model in \cite{lei08_multi_objec_robus_activ_vibrat}. -In \cite{xie17_model_contr_hybrid_passiv_activ}, decentralized force feedback was first applied, followed by \(\mathcal{H}_2\) synthesis for vibration isolation based on accelerometers. -\(\mathcal{H}_\infty\) synthesis was also employed in \cite{jiao18_dynam_model_exper_analy_stewar} for active damping based on accelerometers. -\cite{thayer02_six_axis_vibrat_isolat_system} compared \(\mathcal{H}_\infty\) synthesis with decentralized control in the frame of the struts. +In \cite{xie17_model_contr_hybrid_passiv_activ}, decentralized force feedback was first applied, followed by \(\mathcal{H}_2\text{-synthesis}\) for vibration isolation based on accelerometers. +\(\mathcal{H}_\infty\text{-synthesis}\) was also employed in \cite{jiao18_dynam_model_exper_analy_stewar} for active damping based on accelerometers. +A comparative study between \(\mathcal{H}_\infty\text{-synthesis}\) and decentralized control in the frame of the struts was performed in \cite{thayer02_six_axis_vibrat_isolat_system}. Their experimental closed-loop results indicated that the \(\mathcal{H}_\infty\) controller did not outperform the decentralized controller in the frame of the struts. -These limitations were attributed to the model's poor ability to predict off-diagonal dynamics, which is crucial for \(\mathcal{H}_\infty\) synthesis. +These limitations were attributed to the model's poor ability to predict off-diagonal dynamics, which is crucial for \(\mathcal{H}_\infty\text{-synthesis}\). The purpose of this section is to compare several methods for the decoupling of parallel manipulators, an analysis that appears to be lacking in the literature. -The analysis begins in Section \ref{ssec:detail_control_decoupling_model} with the introduction of a simplified parallel manipulator model that serves as the foundation for evaluating various decoupling strategies. -Sections \ref{ssec:detail_control_decoupling_jacobian} through \ref{ssec:detail_control_decoupling_svd} systematically examine three distinct approaches: Jacobian matrix decoupling, modal decoupling, and Singular Value Decomposition (SVD) decoupling, respectively. -The comparative assessment of these three methodologies, along with concluding observations, is provided in Section \ref{ssec:detail_control_decoupling_comp}. +A simplified parallel manipulator model is introduced in Section \ref{ssec:detail_control_decoupling_model} as a test case for evaluating decoupling strategies. +The decentralized plant (transfer functions from actuators to sensors integrated in the struts) is examined in Section \ref{ssec:detail_control_decoupling_decentralized}. +Three approaches are investigated across subsequent sections: Jacobian matrix decoupling (Section \ref{ssec:detail_control_decoupling_jacobian}), modal decoupling (Section \ref{ssec:detail_control_decoupling_modal}), and Singular Value Decomposition (SVD) decoupling (Section \ref{ssec:detail_control_decoupling_svd}). +Finally, a comparative analysis with concluding observations is provided in Section \ref{ssec:detail_control_decoupling_comp}. \section{Test Model} \label{ssec:detail_control_decoupling_model} @@ -692,7 +674,7 @@ The obtained transfer function from \(\bm{\mathcal{\tau}}\) to \(\bm{\mathcal{L} \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} \end{equation} -At low frequencies, the plant converges to a diagonal constant matrix whose diagonal elements are related to the actuator stiffnesses \eqref{eq:detail_control_decoupling_plant_decentralized_low_freq}. +At low frequencies, the plant converges to a diagonal constant matrix whose diagonal elements are equal to the actuator stiffnesses \eqref{eq:detail_control_decoupling_plant_decentralized_low_freq}. At high frequencies, the plant converges to the mass matrix mapped in the frame of the struts, which is generally highly non-diagonal. \begin{equation}\label{eq:detail_control_decoupling_plant_decentralized_low_freq} @@ -712,7 +694,7 @@ Depending on the symmetry present in the system, certain diagonal elements may e \label{ssec:detail_control_decoupling_jacobian} \paragraph{Jacobian Matrix} -The Jacobian matrix serves a dual purpose in the decoupling process: it converts strut velocity \(\dot{\mathcal{L}}\) to payload velocity and angular velocity \(\dot{\bm{\mathcal{X}}}_{\{O\}}\), and it transforms actuator forces \(\bm{\tau}\) to forces/torque applied on the payload \(\bm{\mathcal{F}}_{\{O\}}\), as expressed in equation \eqref{eq:detail_control_decoupling_jacobian}. +The Jacobian matrix \(\bm{J}_{\{O\}}\) serves a dual purpose in the decoupling process: it converts strut velocity \(\dot{\mathcal{L}}\) to payload velocity and angular velocity \(\dot{\bm{\mathcal{X}}}_{\{O\}}\), and it transforms actuator forces \(\bm{\tau}\) to forces/torque applied on the payload \(\bm{\mathcal{F}}_{\{O\}}\), as expressed in equation \eqref{eq:detail_control_decoupling_jacobian}. \begin{subequations}\label{eq:detail_control_decoupling_jacobian} \begin{align} @@ -817,7 +799,7 @@ However, it could alternatively be determined through analytical methods to ensu It should be noted that the existence of such a center of stiffness (i.e. a frame \(\{K\}\) for which \(\bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}}\) is diagonal) is not guaranteed for arbitrary systems. This property is typically achievable only in systems exhibiting specific symmetrical characteristics, as is the case in the present example. -The analytical expression for the plant in this configuration was then computed \ref{eq:detail_control_decoupling_plant_CoK}. +The analytical expression for the plant in this configuration was then computed \eqref{eq:detail_control_decoupling_plant_CoK}. \begin{equation}\label{eq:detail_control_decoupling_plant_CoK} \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} @@ -833,7 +815,6 @@ The plant is well decoupled below the suspension mode with the lowest frequency The physical reason for high-frequency coupling is illustrated in Figure \ref{fig:detail_control_decoupling_model_test_CoK}. When a high-frequency force is applied at a point not aligned with the center of mass, it induces rotation around the center of mass. -This phenomenon explains the coupling observed between different degrees of freedom at higher frequencies. \begin{figure}[htbp] \begin{subfigure}{0.48\textwidth} @@ -853,7 +834,6 @@ This phenomenon explains the coupling observed between different degrees of free \section{Modal Decoupling} \label{ssec:detail_control_decoupling_modal} Modal decoupling represents an approach based on the principle that a mechanical system's behavior can be understood as a combination of contributions from various modes \cite{rankers98_machin}. - To convert the dynamics in the modal space, the equation of motion are first written with respect to the center of mass \eqref{eq:detail_control_decoupling_equation_motion_CoM}. \begin{equation}\label{eq:detail_control_decoupling_equation_motion_CoM} @@ -934,7 +914,7 @@ Each of these diagonal elements corresponds to a specific mode, as shown in Figu \label{ssec:detail_control_decoupling_svd} \paragraph{Singular Value Decomposition} -Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis \cite[, chapt. 1]{brunton22_data} and multivariable control systems \cite{skogestad07_multiv_feedb_contr}, where it is particularly valuable for analyzing directional properties in multivariable systems. +Singular Value Decomposition (SVD) represents a powerful mathematical tool with extensive applications in data analysis \cite[, chapt. 1]{brunton22_data} and multivariable control systems where it is particularly valuable for analyzing directional properties in multivariable systems \cite{skogestad07_multiv_feedb_contr}. The SVD constitutes a unique matrix decomposition applicable to any complex matrix \(\bm{X} \in \mathbb{C}^{n \times m}\), expressed as: @@ -1011,8 +991,8 @@ Additionally, the diagonal terms manifest as second-order dynamic systems, facil \end{figure} As it was surprising to obtain such a good decoupling at all frequencies, a variant system with identical dynamics but different sensor configurations was examined. -Instead of using relative motion sensors aligned with the struts, three relative motion sensors were positioned as shown in Figure \ref{fig:detail_control_decoupling_model_test_alt}. -Although Jacobian matrices could theoretically map between these different sensor arrangements, application of the same SVD decoupling procedure yielded the plant response shown in Figure \ref{fig:detail_control_decoupling_svd_alt_plant}, which exhibits significantly greater coupling. +Instead of using relative motion sensors collocated with the struts, three relative motion sensors were positioned as shown in Figure \ref{fig:detail_control_decoupling_model_test_alt}. +Although Jacobian matrices could theoretically be used to map these sensors to the frame of the struts, application of the same SVD decoupling procedure yielded the plant response shown in Figure \ref{fig:detail_control_decoupling_svd_alt_plant}, which exhibits significantly greater coupling. Notably, the coupling demonstrates local minima near the decoupling frequency, consistent with the fact that the decoupling matrices were derived specifically for that frequency point. \begin{figure}[htbp] @@ -1055,8 +1035,7 @@ SVD decoupling generally results in a loss of physical meaning for the ``control The quality of decoupling achieved through these methods also exhibits distinct characteristics. Jacobian decoupling performance depends on the chosen reference frame, with optimal decoupling at low frequencies when aligned at the center of stiffness, or at high frequencies when aligned with the center of mass. Systems designed with coincident centers of mass and stiffness may achieve excellent decoupling using this approach. -Modal decoupling offers good decoupling across all frequencies, though its effectiveness relies on the accuracy of the system model, with discrepancies potentially resulting in significant off-diagonal elements. -The diagonal elements typically manifest as second-order low-pass filters, facilitating straightforward control design. +Modal decoupling offers good decoupling across all frequencies, though its effectiveness relies on the model accuracy, with discrepancies potentially resulting in significant off-diagonal elements. SVD decoupling can be implemented using measured data without requiring a model, with optimal performance near the chosen decoupling frequency, though its effectiveness may diminish at other frequencies and depends on the quality of the real approximation of the response at the selected frequency point. \begin{table}[htbp] @@ -1071,29 +1050,19 @@ SVD decoupling can be implemented using measured data without requiring a model, \midrule \textbf{Requirements} & Known geometry & Known equations of motion & Identified FRF\\ \midrule -\textbf{Decoupling Matrices} & Decoupling using \(\bm{J}_{\{O\}}\) obtained from geometry & Decoupling using \(\bm{\Phi}\) obtained from modal decomposition & Decoupling using \(\bm{U}\) and \(\bm{V}\) obtained from SVD\\ +\textbf{Decoupling Matrices} & Jacobian matrix \(\bm{J}_{\{O\}}\) & Eigenvectors \(\bm{\Phi}\) & SVD matrices \(\bm{U}\) and \(\bm{V}\)\\ \midrule \textbf{Decoupled Plant} & \(\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-\intercal}\) & \(\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-\intercal}\) & \(\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-\intercal}\)\\ \midrule \textbf{Controller} & \(\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-\intercal} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}\) & \(\bm{K}_m(s) = \bm{\Phi}^{-\intercal} \bm{K}_{d}(s) \bm{\Phi}^{-1}\) & \(\bm{K}_{\text{SVD}}(s) = \bm{V}^{-\intercal} \bm{K}_{d}(s) \bm{U}^{-1}\)\\ \midrule -\textbf{Interpretation} & Forces/Torques to Displacement/Rotation in chosen frame & Inputs to excite individual modes & Directions of max to min controllability/observability\\ - & & Output to sense individual modes & \\ +\textbf{Interpretation} & Forces/Torques to Displacement/Rotation in chosen frame & Inputs (resp. outputs) to excite (resp. sense) individual modes & Directions of max to min controllability/observability\\ \midrule -\textbf{Properties} & Decoupling at low or high frequency depending on the chosen frame & Good decoupling at all frequencies & Good decoupling near the chosen frequency\\ +\textbf{Effectiveness} & Decoupling at low or high frequency depending on the chosen frame & Good decoupling at all frequencies & Good decoupling near the chosen frequency\\ \midrule -\textbf{Pros} & Physical inputs / outputs & Target specific modes & Good Decoupling near the crossover\\ - & Good decoupling at High frequency (diagonal mass matrix if Jacobian taken at the CoM) & 2nd order diagonal plant & Very General\\ - & Good decoupling at Low frequency (if Jacobian taken at specific point) & & \\ - & Easy integration of meaningful reference inputs & & \\ - & & & \\ +\textbf{Pros} & Retain physical meaning of inputs / outputs. Controller acts on a meaningfully ``frame'' & Ability to target specific modes. Simple \(2^{nd}\) order diagonal plants & Good Decoupling near the crossover. Very General and requires no model\\ \midrule -\textbf{Cons} & Coupling between force/rotation may be high at low frequency (non diagonal terms in K) & Need analytical equations & Loose the physical meaning of inputs /outputs\\ - & Limited to parallel mechanisms (?) & & Decoupling depends on the real approximation validity\\ - & If good decoupling at all frequencies => requires specific mechanical architecture & & Diagonal plants may not be easy to control\\ -\midrule -\textbf{Applicability} & Parallel Mechanisms & Systems whose dynamics that can be expressed with M and K matrices & Very general\\ - & Only small motion for the Jacobian matrix to stay constant & & Need FRF data (either experimentally or analytically)\\ +\textbf{Cons} & Good decoupling at all frequency can only be obtained for specific mechanical architecture & Relies on the accuracy of equation of motions. Robustness to unmodelled dynamics may be poor & Loss of physical meaning of inputs /outputs. Decoupling away from the chosen frequency may be poor\\ \bottomrule \end{tabularx} \end{table} @@ -1103,10 +1072,10 @@ SVD decoupling can be implemented using measured data without requiring a model, Once the system is properly decoupled using one of the approaches described in Section \ref{sec:detail_control_decoupling}, SISO controllers can be individually tuned for each decoupled ``directions''. Several ways to design a controller to obtain a given performance while ensuring good robustness properties can be implemented. -In some cases \cite{furutani04_nanom_cuttin_machin_using_stewar,du14_piezo_actuat_high_precis_flexib,yang19_dynam_model_decoup_contr_flexib}, ``fixed'' controller structures are utilized, such as PI and PID controllers, whose parameters are manually tuned. +In some cases ``fixed'' controller structures are utilized, such as PI and PID controllers, whose parameters are manually tuned \cite{furutani04_nanom_cuttin_machin_using_stewar,du14_piezo_actuat_high_precis_flexib,yang19_dynam_model_decoup_contr_flexib}. -Another popular method is Open-Loop shaping, which was used during the conceptual phase after the plan was decoupled in the frame of the struts. -Open-loop shaping involves tuning the controller through a series of ``standard'' filters (leads, lags, notches, and low-pass filters) to shape the open-loop transfer function \(G(s)K(s)\) according to desired specifications, including bandwidth, gain and phase margins, and gain at specific frequencies \cite[, chapt. 4.4.7]{schmidt20_desig_high_perfor_mechat_third_revis_edition}. +Another popular method is Open-Loop shaping, which was used during the conceptual phase. +Open-loop shaping involves tuning the controller through a series of ``standard'' filters (leads, lags, notches, low-pass filters, \ldots{}) to shape the open-loop transfer function \(G(s)K(s)\) according to desired specifications, including bandwidth, gain and phase margins \cite[, chapt. 4.4.7]{schmidt20_desig_high_perfor_mechat_third_revis_edition}. Open-Loop shaping is very popular because the open-loop transfer function is a linear function of the controller, making it relatively straightforward to tune the controller to achieve desired open-loop characteristics. Another key advantage is that controllers can be tuned directly from measured frequency response functions of the plant without requiring an explicit model. @@ -1116,10 +1085,9 @@ With open-loop shaping, closed-loop transfer functions are changed only indirect In order to synthesize a controller that directly shapes the closed-loop transfer functions (and therefore the performance metric), \(\mathcal{H}_\infty\text{-synthesis}\) may be used \cite{skogestad07_multiv_feedb_contr}. This approach requires a good model of the plant and expertise in selecting weighting functions that will define the wanted shape of different closed-loop transfer functions \cite{bibel92_guidel_h}. -\(\mathcal{H}_{\infty}\) synthesis has been applied for the Stewart platform \cite{jiao18_dynam_model_exper_analy_stewar}, yet when benchmarked against more basic decentralized controllers, the performance gains proved negligible \cite{thayer02_six_axis_vibrat_isolat_system,hauge04_sensor_contr_space_based_six}. +\(\mathcal{H}_{\infty}\text{-synthesis}\) has been applied for the Stewart platform \cite{jiao18_dynam_model_exper_analy_stewar}, yet when benchmarked against more basic decentralized controllers, the performance gains proved small \cite{thayer02_six_axis_vibrat_isolat_system,hauge04_sensor_contr_space_based_six}. In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions (i.e., directly addressing the closed-loop performances). - In Section \ref{ssec:detail_control_cf_control_arch}, the proposed control architecture is presented. In Section \ref{ssec:detail_control_cf_trans_perf}, typical performance requirements are translated into the shape of the complementary filters. The design of the complementary filters is briefly discussed in Section \ref{ssec:detail_control_cf_analytical_complementary_filters}, and analytical formulas are proposed such that it is possible to change the closed-loop behavior of the system in real time. @@ -1188,14 +1156,14 @@ At frequencies where the model accurately represents the physical plant (\(G^{-1 \end{subequations} The sensitivity transfer function equals the high-pass filter \(S = \frac{y}{dy} = H_H\), and the complementary sensitivity transfer function equals the low-pass filter \(T = \frac{y}{n} = H_L\). -Hence, when the plant model closely approximates the actual system, the closed-loop transfer functions converge to the designed complementary filters, allowing direct translation of performance requirements into complementary filter design. -\section{Translating the performance requirements into the shapes of the complementary filters} +Hence, when the plant model closely approximates the actual dynamics, the closed-loop transfer functions converge to the designed complementary filters, allowing direct translation of performance requirements into the design of the complementary. +\section{Translating the performance requirements into the shape of the complementary filters} \label{ssec:detail_control_cf_trans_perf} Performance specifications in a feedback system can usually be expressed as upper bounds on the magnitudes of closed-loop transfer functions such as the sensitivity and complementary sensitivity transfer functions \cite{bibel92_guidel_h}. -The design of a controller \(K(s)\) to obtain the desired shapes of these closed-loop transfer functions is known as closed-loop shaping. +The design of a controller \(K(s)\) to obtain the desired shape of these closed-loop transfer functions is known as closed-loop shaping. In the proposed control architecture, the closed-loop transfer functions \eqref{eq:detail_control_cf_sf_cl_tf_K_inf} are expressed in terms of the complementary filters \(H_L(s)\) and \(H_H(s)\) rather than directly through the controller \(K(s)\). -Therefore, performance requirements must be translated into constraints on the shapes of these complementary filters. +Therefore, performance requirements must be translated into constraints on the shape of these complementary filters. \paragraph{Nominal Stability (NS)} A closed-loop system is stable when all its elements (here \(K\), \(G^\prime\), and \(H_L\)) are stable and the sensitivity function \(S = \frac{1}{1 + G^\prime K H_L}\) is stable. For the nominal system (\(G^\prime = G\)), the sensitivity transfer function equals the high-pass filter: \(S(s) = H_H(s)\). @@ -1205,7 +1173,7 @@ Consequently, stable and minimum phase complementary filters must be employed. \paragraph{Nominal Performance (NP)} Performance specifications can be formalized using weighting functions \(w_H\) and \(w_L\), where performance is achieved when \eqref{eq:detail_control_cf_weights} is satisfied. -The weighting functions define the maximum magnitude of the closed-loop transfer functions as a function of frequency, effectively determining their ``shape.'' +The weighting functions define the maximum magnitude of the closed-loop transfer functions as a function of frequency, effectively determining their ``shape''. \begin{subequations}\label{eq:detail_control_cf_weights} \begin{align} @@ -1228,7 +1196,7 @@ Similarly, for noise attenuation, the magnitude of the complementary sensitivity Classical stability margins (gain and phase margins) are also related to the maximum amplitude of the sensitivity transfer function. Typically, maintaining \(|S|_{\infty} \le 2\) ensures a gain margin of at least 2 and a phase margin of at least \(\SI{29}{\degree}\). -Therefore, by carefully selecting the shapes of the complementary filters, nominal performance specifications can be directly addressed in an intuitive manner. +Therefore, by carefully selecting the shape of the complementary filters, nominal performance specifications can be directly addressed in an intuitive manner. \paragraph{Robust Stability (RS)} Robust stability refers to a control system's ability to maintain stability despite discrepancies between the actual system \(G^\prime\) and the model \(G\) used for controller design. @@ -1288,8 +1256,8 @@ Therefore, for SISO systems, ensuring robust stability and nominal performance i \section{Complementary filter design} \label{ssec:detail_control_cf_analytical_complementary_filters} -As proposed in Section \ref{sec:detail_control_sensor}, complementary filters can be shaped using standard \(\mathcal{H}_{\infty}\) synthesis techniques. -This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters (Section \ref{ssec:detail_control_cf_trans_perf}). +As proposed in Section \ref{sec:detail_control_sensor}, complementary filters can be shaped using standard \(\mathcal{H}_{\infty}\text{-synthesis}\) techniques. +This approach is particularly well-suited since performance requirements were expressed as upper bounds on the magnitude of the complementary filters. Alternatively, analytical formulas for complementary filters may be employed. For some applications, first-order complementary filters as shown in Equation \eqref{eq:detail_control_cf_1st_order} are sufficient. @@ -1310,7 +1278,7 @@ These filters can be transformed into the digital domain using the Bilinear tran \end{align} \end{subequations} -A significant advantage of using analytical formulas for complementary filters is that key parameters such as \(\omega_0\) can be modified in real-time, as illustrated in Figure \ref{fig:detail_control_cf_arch_tunable_params}. +A significant advantage of using analytical formulas for complementary filters is that key parameters such as \(\omega_0\) can be tuned in real-time, as illustrated in Figure \ref{fig:detail_control_cf_arch_tunable_params}. This real-time tunability allows rapid testing of different control bandwidths to evaluate performance and robustness characteristics. \begin{figure}[htbp] @@ -1321,7 +1289,7 @@ This real-time tunability allows rapid testing of different control bandwidths t For many practical applications, first order complementary filters are not sufficient. Specifically, a slope of \(+2\) at low frequencies for the sensitivity transfer function (enabling accurate tracking of ramp inputs) and a slope of \(-2\) for the complementary sensitivity transfer function are often desired. -For these cases, the complementary filters analytical formula in Equation \eqref{eq:detail_control_cf_2nd_order} are proposed. +For these cases, the complementary filters analytical formula in Equation \eqref{eq:detail_control_cf_2nd_order} is proposed. \begin{subequations}\label{eq:detail_control_cf_2nd_order} \begin{align} @@ -1377,8 +1345,8 @@ The model of the plant \(G(s)\) from actuator force \(F\) to displacement \(y\) G(s) = \frac{1}{m s^2 + c s + k}, \quad m = \SI{20}{\kg},\ k = 1\si{\N/\mu\m},\ c = 10^2\si{\N\per(\m\per\s)} \end{equation} -The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics, payload dynamics, and other factors. -These uncertainties are represented using a multiplicative input uncertainty weight \eqref{eq:detail_control_cf_test_plant_uncertainty}., which specifies the magnitude of uncertainty as a function of frequency: +The plant dynamics include uncertainties related to limited support compliance, unmodeled flexible dynamics and payload dynamics. +These uncertainties are represented using a multiplicative input uncertainty weight \eqref{eq:detail_control_cf_test_plant_uncertainty}, which specifies the magnitude of uncertainty as a function of frequency. \begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} @@ -1403,10 +1371,10 @@ Figure \ref{fig:detail_control_cf_bode_plot_mech_sys} illustrates both the nomin \end{figure} \paragraph{Requirements and choice of complementary filters} -As discussed in Section \ref{ssec:detail_control_cf_trans_perf}, nominal performance requirements can be expressed as upper bounds on the shapes of the complementary filters. +As discussed in Section \ref{ssec:detail_control_cf_trans_perf}, nominal performance requirements can be expressed as upper bounds on the shape of the complementary filters. For this example, the requirements are: \begin{itemize} -\item to track ramp inputs (constant velocity scans) with zero steady-state error, which necessitates a \(+2\) slope at low frequencies for the magnitude of the sensitivity function \(|S(j\omega)|\) +\item track ramp inputs (i.e. constant velocity scans) with zero steady-state error: a \(+2\) slope at low frequencies for the magnitude of the sensitivity function \(|S(j\omega)|\) is required \item filtering of measurement noise above \(\SI{300}{Hz}\), where sensor noise is significant (requiring a filtering factor of approximately 100 above this frequency) \item maximizing disturbance rejection \end{itemize} @@ -1417,8 +1385,9 @@ This condition is satisfied when the magnitude of the low-pass complementary fil Robust performance is achieved when both nominal performance and robust stability conditions are simultaneously satisfied. All requirements imposed on \(H_L\) and \(H_H\) are visualized in Figure \ref{fig:detail_control_cf_specs_S_T}. -While \(\mathcal{H}_\infty\) synthesis could be employed to design the complementary filters, analytical formulas were used for this relatively simple example. -Specifically, the second-order complementary filters from Equation \eqref{eq:detail_control_cf_2nd_order} were selected, providing the desired \(+2\) and \(-2\) slopes, with parameters \(\alpha = 1\) and \(\omega_0 = 2\pi \cdot 20\) Hz. +While \(\mathcal{H}_\infty\text{-synthesis}\) could be employed to design the complementary filters, analytical formulas were used for this relatively simple example. +The second-order complementary filters from Equation \eqref{eq:detail_control_cf_2nd_order} were selected with parameters \(\alpha = 1\) and \(\omega_0 = 2\pi \cdot 20\,\text{Hz}\). +There magnitudes are displayed in Figure \ref{fig:detail_control_cf_specs_S_T}, confirming that these complementary filters are fulfilling the specifications. \begin{figure}[htbp] \begin{subfigure}{0.48\textwidth} @@ -1479,7 +1448,7 @@ In this section, a control architecture in which complementary filters are used This approach differs from traditional open-loop shaping in that no controller is manually designed; rather, appropriate complementary filters are selected to achieve the desired closed-loop behavior. The method shares conceptual similarities with mixed-sensitivity \(\mathcal{H}_{\infty}\text{-synthesis}\), as both approaches aim to shape closed-loop transfer functions, but with notable distinctions in implementation and complexity. -While \(\mathcal{H}_{\infty}\text{-synthesis}\) synthesis offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort. +While \(\mathcal{H}_{\infty}\text{-synthesis}\) offers greater flexibility and can be readily generalized to MIMO plants, the presented approach provides a simpler alternative that requires minimal design effort. Implementation only necessitates extracting a model of the plant and selecting appropriate analytical complementary filters, making it particularly interesting for applications where simplicity and intuitive parameter tuning are valued. Due to time constraints, an extensive literature review comparing this approach with similar existing architectures, such as Internal Model Control \cite{saxena12_advan_inter_model_contr_techn}, was not conducted. @@ -1490,22 +1459,20 @@ It will be experimentally validated with the NASS during the experimental phase. \chapter*{Conclusion} \label{sec:detail_control_conclusion} -In order to optimize the control of the Nano Active Stabilization System, several aspects of control theory were studied in this section. - +In order to optimize the control of the Nano Active Stabilization System, several aspects of control theory were studied. Different approaches to combine sensors were compared in Section \ref{sec:detail_control_sensor}. While High Authority Control-Low Authority Control (HAC-LAC) was successfully applied during the conceptual design phase, the focus of this work was extended to sensor fusion techniques where two or more sensors are combined using complementary filters. -It was demonstrated that the performance of such fusion depends significantly on the proper design of these complementary filters. +It was demonstrated that the performance of such fusion depends significantly on the magnitude of the complementary filters. To address this challenge, a synthesis method based on \(\mathcal{H}_\infty\text{-synthesis}\) was proposed, allowing for intuitive shaping of the complementary filters through weighting functions. -This approach enabled the translation of sensor fusion objectives directly into requirements on filter magnitudes. For the NASS, while HAC-LAC remains a natural way to combine sensors, the potential benefits of sensor fusion merit further investigation. Various decoupling strategies for parallel manipulators were examined in Section \ref{sec:detail_control_decoupling}, including decentralized control, Jacobian decoupling, modal decoupling, and Singular Value Decomposition (SVD) decoupling. The main characteristics of each approach were highlighted, providing valuable insights into their respective strengths and limitations. Among the examined methods, Jacobian decoupling was determined to be most appropriate for the NASS, as it provides straightforward implementation while preserving the physical meaning of inputs and outputs. -With the system successfully decoupled, attention shifts to designing appropriate SISO controllers for each decoupled direction. -A method for directly shaping closed-loop transfer functions is proposed, based on complementary filters that can be designed using either the \(\mathcal{H}_\infty\) approach described earlier or through analytical formulas. -This straightforward approach enables intuitive parameter tuning while maintaining design simplicity. +With the system successfully decoupled, attention shifted to designing appropriate SISO controllers for each decoupled direction. +A control architecture for directly shaping closed-loop transfer functions was proposed. +It is based on complementary filters that can be designed using either the proposed \(\mathcal{H}_\infty\text{-synthesis}\) approach described earlier or through analytical formulas. Experimental validation of this method on the NASS will be conducted during the experimental tests on ID31. \printbibliography[heading=bibintoc,title={Bibliography}] \end{document}