From 225e98ed58bee2acc181b5781b65cf487280f5e7 Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Fri, 24 Jul 2026 02:01:57 -0500 Subject: [PATCH] The Crimson Night --- common/libcommon.a | Bin 783086 -> 783102 bytes common/params_keys.h | 2 + common/params_pyx.so | Bin 837976 -> 837976 bytes selfdrive/controls/controlsd.py | 1 - selfdrive/controls/lib/lead_behavior.py | 176 - selfdrive/controls/lib/longcontrol.py | 46 +- .../lib/longitudinal_mpc_lib/long_mpc.py | 1106 +--- .../controls/lib/longitudinal_planner.py | 4131 ++------------ .../lib/longitudinal_vehicle_tunes.py | 38 +- .../tests/test_conditional_chill_mode.py | 463 -- .../test_conditional_experimental_mode.py | 1115 ---- .../controls/tests/test_following_distance.py | 2 +- .../controls/tests/test_lead_behavior.py | 196 - .../tests/test_longitudinal_planner.py | 4825 +---------------- .../tests/test_starpilot_acceleration.py | 5 +- .../controls/tests/test_starpilot_planner.py | 70 +- .../controls/tests/test_starpilot_vcruise.py | 10 +- .../tests/test_unified_longitudinal_intent.py | 159 + selfdrive/selfdrived/selfdrived.py | 9 +- .../test/longitudinal_maneuvers/maneuver.py | 9 +- .../test/longitudinal_maneuvers/plant.py | 34 +- .../settings/starpilot/longitudinal.py | 294 +- selfdrive/ui/lib/mode_banner.py | 48 +- selfdrive/ui/lib/starpilot_status.py | 20 +- selfdrive/ui/onroad/exp_button.py | 27 +- selfdrive/ui/tests/test_mode_banner.py | 26 +- selfdrive/ui/widgets/exp_mode_button.py | 7 +- starpilot/common/experimental_state.py | 173 +- starpilot/common/safe_mode.py | 22 +- starpilot/common/starpilot_variables.py | 26 +- starpilot/common/tests/test_accel_profile.py | 13 +- .../common/tests/test_experimental_state.py | 72 +- .../controls/lib/conditional_chill_mode.py | 350 -- .../lib/conditional_experimental_mode.py | 521 -- .../controls/lib/starpilot_acceleration.py | 5 +- starpilot/controls/lib/starpilot_events.py | 2 +- starpilot/controls/lib/starpilot_following.py | 25 +- starpilot/controls/lib/starpilot_vcruise.py | 10 +- .../lib/unified_longitudinal_intent.py | 116 + starpilot/controls/starpilot_card.py | 22 +- starpilot/controls/starpilot_planner.py | 110 +- .../controls/tests/test_starpilot_card.py | 14 +- .../tools/device_settings_layout.json | 207 +- .../tests/test_device_settings_layout.py | 5 +- starpilot/system/the_galaxy/the_galaxy.py | 51 +- tools/StarPilot/generate_galaxy_layout.py | 96 +- 46 files changed, 1386 insertions(+), 13273 deletions(-) delete mode 100644 selfdrive/controls/lib/lead_behavior.py mode change 100755 => 100644 selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py mode change 100755 => 100644 selfdrive/controls/lib/longitudinal_planner.py delete mode 100644 selfdrive/controls/tests/test_conditional_chill_mode.py delete mode 100644 selfdrive/controls/tests/test_conditional_experimental_mode.py delete mode 100644 selfdrive/controls/tests/test_lead_behavior.py create mode 100644 selfdrive/controls/tests/test_unified_longitudinal_intent.py delete mode 100644 starpilot/controls/lib/conditional_chill_mode.py delete mode 100644 starpilot/controls/lib/conditional_experimental_mode.py create mode 100644 starpilot/controls/lib/unified_longitudinal_intent.py diff --git a/common/libcommon.a b/common/libcommon.a index 3462a0fae9045c800153f893838707d60a9b6121..36b71070445b08d23cd1d2b4416889199d146f7a 100644 GIT binary patch literal 783102 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�-`E7aD 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

fz#)O@RZ^4{;o`%DQ}pMr4psr!C> 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

+mhZHR@|#i;#&5w9nn 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

=OruA-?1jFJ-e}NAbhc&HdZhal)5|wvqfCFc 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 literal 783086 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�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≠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 Q1&zq9`Tzg` diff --git a/common/params_keys.h b/common/params_keys.h index 980c9865f..21d8cede7 100644 --- a/common/params_keys.h +++ b/common/params_keys.h @@ -44,6 +44,8 @@ inline static std::unordered_map keys = { {"ExperimentalLongitudinalEnabled", {PERSISTENT, BOOL}}, {"ExperimentalMode", {PERSISTENT, BOOL}}, {"ExperimentalModeConfirmed", {PERSISTENT, BOOL}}, + {"LongitudinalModelPreference", {PERSISTENT, INT, "0", "0", 1, SETTINGS_SIMPLE}}, + {"LongitudinalModelPreferenceOverride", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, INT, "-1", "-1"}}, {"PersistChillState", {PERSISTENT, BOOL, "0", "0", 1}}, {"PersistExperimentalState", {PERSISTENT, BOOL, "0", "0", 1, SETTINGS_SIMPLE}}, {"PersistedCCStatus", {PERSISTENT, INT, "0", "0"}}, diff --git a/common/params_pyx.so b/common/params_pyx.so index 96abcb9393d188d0a2ecb0767a1c1aaab3020a3b..24806187189918ee699cc87c9b737dbb5ed624aa 100755 GIT binary patch literal 837976 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½%_}XKA!)oMbWnyZrhbe%C>x z^4EWfKQDQ_2mf92xDI-SX6yHUDd4-C@wxK&8F-DheQbW(cs74-;uPp=-(-Au+Q?q~ z`#9^n=eWKbG_A6rJnpF7(#LnNMjm$<`RwgWqs>m*1m&^XSf9NZ`0RlHGwn;Of=8|X z^YW+bX90U7W4-+8SD<(0Pk$Po*S@s-pwZ{(*T{0}?lALVZ9HscIp?W>r`B=3In+($ zK$y^QcKHT#X z+ZnGbx5v3M7U5AvV^STbMVmu0TX9rd5< zct+osuK$PY!!~fnmexu4FU@M|L5J*}9CFvNc6#ev;Lq9=$9Xg?onYlM{rNOp11yuk z+Lk5#vi!ugl$9YrkQvR5fxM~?_9yv!LV4HzOG9b)x#cDDurH6aZ=;%bv<2SZ=D&Yz z;&YS%7k_Mxepy~(0cCqR16b><%G1tNuZnsI-i>vEeuDFlQeHWZ{r~h+#XR91vu9hp zV|-ngcg+5K;SSz0d+;sq{0;cZK7pRn`l7}3Kag%JRJrue-NxoL`#n3+iwE%cHLs5| zE{mJs{KwEP#JKyneZy<#`rPmYbp9>sT7J><)q3XuV}4I_8bF`!F>`ivsQczmSNZwV zUp4Q@PfUGXF#>cR>l)`EBOZqK*FaNAkG?m;E0V>@G&G+Hr`vhI)`4{HLp6N@gJ#eF zG-nbZ>zeI4&>QfoDR=dEv*&;Md&*z7<*xqjQ!fAWZ*FbSV?>jX6(j;pf7YAee;XwG4&G$U|UV7esQnk|e!H1KU^*4jMer|=)^}XjQu-8U>Y;$L$>?!K2>vLCM!@a5NJYCOy)w@HS zf0K6qAhu>ET|Y$UE!3gw(E;)aUP3;&xrVukmK@d&rgWF<9T9Z>*MOVevxQuvVkeER zr;oI{p7%@FcMNSkQ#yVuI=(R+B98yD>BbL3_e4o+bchxzRC5;GR6I-LW_4Qeoq_O0Dr^hvGFeAnF~AdyHsXv z0AjW1oxbsV{N#-tj6=SI@~f^MU$fvRd@I(zleT?rf!_FiF?Dv3OEiEjaJW1JH->(D zZGnJ1%S|*w&l6ZXuz2+Sy4k&WoC6*Ui?9XwFZGa`aYytkWalg61whkRx!`{72vY?&uy0UF-z!u2usy1+T*8J4NU z!~!~9^v9>(&|fF|gEI#@!S#;e?ip}pN1(ggn0JuwJ{6$5jx=;vjXi%D-I2>;>Fzk@ zc{_B6tZa9te@gKWR~LnIN-yekeYC}b*%4?`a1~8n?!hVqY>U&aDS31;?IX~|R_2}s zT{uT)ri*!oE-oWx?D^^7dZzEEi!LT&BYqy+@9qpXV()sA_A98KrHc=;o^*lLjp1x zX>2d3ydN#D#NOH1;l&G#KYt#2QvUq8?ipdV?%plQPx;%TXUUD&PB(7di2WGasknGv z;t~2k>j<{P-^J6iEi%{+&)D(|w!@z&PiGsL7=W=2+?e%I{qQ)vA0CGaPt5mE(2R{o z_c`}>Ysj?^*7wE&dhG)zt$lEFXdbQr5Ht!Pa{U+;DuToZxKPtOJHiwBZY;|M5dDtJ~ zQyX8XA0Sa838z;eBn2 zTZ1+QcA;#FpRPj2W{8DmiZ4t9rdNZ@ByeXxkssqt`f$%r{F?Dvf2js~anI1q3!I_Z zFTMcm6rVBi1>q-@=fxMc`ZmQr!56t>bjN^aXyzrZ(!8kCCl`T!bsni~q*~;Ga(<;d zB05tnbW&V8gmcPvm1Li!vwD|J;-0F>#CI+>enx)cHfXKRvp*hT9i|TZL%I0yNxkuF zymdjN_g#E8>&!XN=QaE7U7t5MQ6RY&27Vdz%2JgN;6E-=x#a5o#?ENgK7`POngwUR zc(~6S#LIghryL}T8NL)AD$f0+*b6P z>vA*JoJ1vbp2?pq#`pOM{-nPbv(@z{{k@p~M1Qh<+r{XMH2&oAqyNwOlkG?HC!_GT zWPT=p@@{Y)wCk(zwXDteQT@s7@W}rofAVly0dAo6jItt^`FQ@M!J{wxXZPy;2ao#j z{^ZANk&z$LpWMV)_9FiW@+W6d=l_B~`PL1RS0B!wM3%epj5Pk_2H-Ui-5r81gLIb| z(@S?B)t}r0-68jyooO@WPZ~MT9;ec+fB)zClMTS_!_vhRaQ;>3VjzF=A>h-1ANRlI zPhP2c5rb%~P47>B2bu5tlh~*mh=+ZVImza@9o*wj)*s2Ad^0dd>6M-4x!0e3h3A2M zy055w0Dtm}lzaZT_T3`2UmG`5?_0VUbM~m+IaC(1I@>9B3^xT-i zpFElVJ%2Kz9WWO>FoukFK&36uUzS?dQnT4_GK`q>aC7#Zu@OFmPx<(X#;5dcgy>1e*Ya(IR-XS!K4ts1AEx&yCyv5K zIQIXUPg%de*Qc!S=Tp{~r12@=N48}0DL)I(){J*H*&HI{Q=%7@LzL(Fl-*tq(Y`DRDlJoKp?7C6R_ib_#tDvEWIWxe-&sl?AA@(pBzXh-xR|5E!R zQ>44{Z?UBXD)GS!{KLh)n52tCjl6G;go#h|N+KB=D>Uo@jLuOxD z_R2tG{-MfQC)|7fIZZvY73-YGen2mODeT5OnNvocb3gEJRo)db%q@J&_uR_2y`S%1 zTaM1@UoPMCZp!6vx;F866W4f&F-Z>{=98K{4rrNqzo2n@bgt)T%{+1vcS9$Z7xkU0 z)p^}R(K`|JPPWxM>`6O4uJenPUu$ET%BkHNIH&vOg3)Cq*t~X6qfl5l z{2FrOqkQH93-#N{nFodR8*zGbHzE$X8}w`AhFYt%^4_jbYHiZZ6YUc>P;MpGmP(h!Sye`N?V&3YIBl)xFWOsvoPtOlXL>`{5RxcBQPh& z*^e1E`g%1l@pHz~$8Uu8d)J$E@6M58hIYNFH)gok#0Y4WqluTj1T6H1}Xs(B~xhNcUju zgjel77)gEy@4;Yh{$AEL@T9%0#G~tV4~FG?dk+RN>*h#ysksM3^w%LC9?jVd9uKdF zmVWhDS10f1-BqmLjAze4abT}_F?+>ZygU$pJ*F1hd8<>QoKLk;-d&z|_kq@C_HakS z29tZ2mly;6W0xm7IB&7dvrn{U(?(oeI;1U-?^cr=$af2q@Ajp1=em=xhP^2s%LgY( zWQDcAlfInDPu$CVd7od#`@Hp@v56m3cBjsN9wXzP;N&H%6HkZVe z+kNjjXwaH|nDrlQLdo4EZFbV8Zw^WCJqJ1)We5Ct134_lHixE)J-My5iU#PyVSiBs zI%o^z-Y;f<(K5!Xy+yu^<-J;$nfV=L5q*A``w0F_Un7xGjlhQcXVc2q3#nsc`ZZdY z0XDsPpN||aW63d4j=foz5gh%z&qw@q8O3WQZ_K(3@x(s1^VVSQeNG}<^P*0lbs73q z4vTa~4fe9|qdgrTM=o>%gPGhD^CxndWw+|Cs)@|Ow5)#!QarGrU){3!NQyPG}}t%c5`P(7j9l%FDB~+UV0` zUZMw`vW2nq=g;lWyS!;>Q)B-E{aM`T`4T-tJG4!!yLZsHYuC<0R=PR)x&!s#^0V1v z?aKQqcsMuId;iVl@21SU)h`%t>j1joZSZ8uGw6cXYat2?6O`|6HXp3~XGMH%d2S9f^!@TZa2wUSHj z{YkQiAIo;_Vc|K+`N-BDK8rca9$uWm9&SKxC+SPFI?s!9>_axo1{NL1pkv`4zr)`r z)d^qOoaVQ$ckN%n-_k8@{B`qlpsj_v1B5n$>wfHZmsY)X^8oMl+P{6}sIh-NIcn_R zBgj!>|HAJd%KinW&{anJ_c7=!0xY4$v^;dQcu2a_8RYBEB7C;4=Un?&v6=p|`T6TU zylnmw?~(mehipa<`Lemrhk0(|Eyk*NfpXYhr0%;PshBJO$fyx_s7W{FRLV z*WUOo&crikGlqfW$)DAiu^Z2ZcXWRhcfybtqq~M%2apvnLrbPSgRJ~WcENhoKr$RL3})Y zzq>u!RF^gOiM)en-G18W?uVrhHZxbftC0Jf)@6Ykx>3>XK=LXN&1t063yn^4r~>_hM+sKHy2XFrk zPJAz8DhTIyfMOJQC2wUZ9ctbG$9sfVW{!_tc@A+o|+fM^y@6Ks#Z_$C~bT#KNs4X~OSUseY z^_-lpYI0V8PJ1qT&ff#PZa9nw{GgLG!XE_0?MJoNgrsWrc)Om!=VaaSR~ z&3wiUb#>ZhL)|fqj>Io#UX$n-c}dPIcXq$w-XG{-k2{PtKZ5+Ey>yuw8?^ZX^;Nex zK-+?^%{S;?G#niC=C1<}>~Uf`$W+C2>|V8w{C;<@u}>QNyWPfgYFINc&t6Q&3G9>Z z0{^E%D=P+y>F~ZH?$yEnso!=hI&8Miu5}8$1hIt8;Z){odySIt@5lopw5M znYMlIKA?@q7rBYMfcIU;pwnohy}z^Mw;BJ`^9`U|mG$ur!t6D}{@pnlJIv;S5sT7& zK{|s;vSBA}`uGO4vHMbssk4K)&nz#d(;0~A98VcIZMU@T#dPXt0pqREp^fRh!tdTQ z1#%LjnMXEl^S~Q$^<@BX_2!zFxKy+yn(iL#({v{^eHt_^KKK>weZ9tfq+cd2hkg~; z3hs+#emd96!o|dO_|Mwgzu-N)kkM_7gY$EIz1HTBWo%+Pb!68ney989YVbQ=2kwjf z{bpMaKbywD-1R%$+%db~%#8!-44XaF5&s-HA1o))^=;-hKx{{ThkT9@b|ij6sqsU= ztNxoV9R$sH^1PqVLh1i|IGg4k?`#^;P2g;rFEiid*2;>yA?{tP)+U1%TeJtwdD8Vo zT3JIe^^WFzo1teliGKG>x8RqEE_6Q0KK!D+|Kl|6zbDjG#Tt))J_+NnbblRq6WvQM zrIYuvSA-v17R1eynoFQ8>EkUw@dwKGah}ZLV`~-&#-}l+P2_(zdc3R{S0i)Ev|ssG zv=7m?KONrjj7x)-_oDE2fd@0mfTYg*!Tv}BbMd03wXq%@iH6i>49^|N9r{me+pXpO zt}Z(dIeIR-%)1A<){XhM%BJb3o4&%>>H_en^Wl-3xRL%I+MiOaqbIiC&4(5&L;IBv zJvQ+j%5@JL{kD5CHglE-yzHOl@gLyIl)JW4ySJ9mZr2jxw%oOq`jl%e;bzJUq2;6a zE<=75L7UP`vg42CxA^!n&Oedw6y_rv!uOv%Sr-L%TN$fpZyukJZV@w&j>Z{e(Xv2<4Gbbo)fU5C)wcOZTz!Q7)ke2HU7BWpb#CIaAx@v1>KHIJd#*m>{_5^8MVss%E5+UH8iw{;J?yVz z^x0!ozh_DMb&Ttwg&6c0sLMNw5=gpSR%S(J0f79l|wJIJac~4m%o%c`P zUkyzhuJeF>Q0G~j&gRQrz&zr>-QsD7nNM(kb#CIF!R&)44lAEkYt%dOUxRDZ>GoHD z@mlymzV`{PjyLCW0h5&cYY#5{*E04pmQ%5H8-aUGK<733aL-FDr;f`znfA`~Tg#Zt z`-oTc?yt6M8HewwGWza>esQ*bXR%Guyr|PB&V~)s|17q%mbb$m*dNc;`U0SO!em05F zzzYNEgR#70pmmc`DwoZ4?-1W+T95upZg=&S@~*574dU9N-4?6o0&QRL+F5>+-2EbT zEnVn&vEDg=4%?|YVP7z=v^uWS%vt{0xlKLiC#dL6a?>=JTq-tO9xmKN=n<~5M zDcb6ctkwba)tlhdlxNUauh{Yo`s(kL2lbHa`^bKD*My4t!Q*2F9yy7Z(Cxl{NgvNM zzEJNv(17tg-xu=YdF^(6`=iG5Ud49U=A3v~JnzXt|Gan}Jh2P-rH$vk_wNJ8^DY9{ z!FXO+{-_scF?s+Rl-%sA2ma~tyk>kK|EvJxdjnHrFZJ%52;Bdin|Km>iol1N_~B#B z6MEg{OdBd5ZkI2=7@4x)#L@~9>Ed}We+yYD8y;KxgWmmoHShUv?4de%3;6kdPn|E* zauWv_tBvQ~1YJLb-EZiBfOwwAZ+*tUlJWoE8^6U_6xp$WF$@&XlROrm?>#?lJg?ca zQO$mTVD9ht-vuoJL$hZO{4{$us=wbqY0F)n?^7-twS#hNcbfSI;(5n2W{s%}*!lcj z>+aW26Yr@15b=)Ye({cG%i|w4-eGur8a&=F-tm0+|G#*Lcs^6S;}CQ!`omvM>-Sv( z{)6$3Aw&O9#5)e>d0?EG=W`NILr+JFcN8#J!}ove<@+u0O%FVmDcK1N-tic7=^yX-p>%K{-Z75(3>5E}3QPuycRc#X z^zjbS@BZF+M|1yphiE@tyd&z-ebDC#%H6veukd4SwKiWSk4@aExdh6Rep!Cv`;;l( zQCaB6JDNXCyyH8x?}X<1)8WM)4F=;KFKHY{@V{T6PSF2;mgj+N#V?q0*@7A49qnGc zquIvdPho75Ar@9aIL@QLf#MyrDEHzW8Fk6$!PP*zd;mZE z74(OVckJM|;vI#Y8Fr+2$4!j&NbnZ^g7E$}&x&_M;Rma$^qnE!($!VOQiHMi{`r9()io#f%eTx)d?KrFzNO;xQ9g5lo8t2y zHs8{o1!wau6`!AlEdt%N6iZiS$hW)z{E5yo@$7$r=Wnn#-o_~|#h17IV(imQaf(1} z{-2OQ;8$DzZuI3H=YLVhrFZY#7vh7xxj-Kz-?BF*Z_j=CFfsWdn%4)= zQD0-6&UMk-=c8v7=X8+Koxn_RPB*WK)L&1zk;4Hvze`+0Yk8KgqR{Qi01WheJ}B)kn;SG4kq{hx^Z=(EpDAd?K_MgI5GsOH(nQS2(W__+Jyq zhdC8L-}+)kKK<|b&-KPX^YX!szY9!_FW2ioH}|d`<|abSV<7o-o=b=A&bVyJC$rzQ zsEBj*;T^4)>%3!MKCy-?`ILJNeEcE(=X-e14)klCxCIAy-k8E||?+|$~S=<-x#C6^qdf2^#2>U?yKwl9a zU8XyACA&Joqwbz`xEGl7NfRB^d5N`T^tVe-=Z=nREqVujy7DcqVJwn~5r=qkzx&#@ zP`3B{S>zm6k}Kqx91*=kISL!VRbeVMO?hWKCcAlLiWN_#%}ewbbKJP|BywG1j?<$5 zl#AiYs}Of}WpQS2n032Btltf0e&q5ozlfRNVDc^<@?gT`>trQf<$cPjY0Dm6rnR6h zozJoB`t3cV2CeP}7Qe}gtX2+>?)J(lq7UfS+H^a4Z{xR1x|a_nuZ8=d9ro5KcUk>K z=&xn2(EpX(`}s0$UNZBZ0L;0= znR~FbALo9@xuakZcO|lZ8d<)aGe@E=CFJcr@?L5o`Q9ym0|wdrU)t|{V9I))qpX87 z(?@9hgPc>at+6~;eMJKcw7blSu*%7-y`oEzEmkGPy#SvSf-mUSU*7=lEe^DD3AmQep!%)SmDotdH$_P)%kSFxvvm{d zh_{aecY0oZFtu>*AZOb8$Ndjw5;5S>zHQ)<mKfP2P^YB ztv}vhqOIlGo9Ooz=B4?k!~enMvx2#O*ew(K;_zQ5#2Fd&Osa&;K-Yp3U56 z0fS29++&T(gLCERSa2*l7-#UDuCC%%syqAZZma{I{Y5AF0_qrl~gYZoPul>OMm%y@x`3eS_C+BZ2SOe`##?$~G$q9XnzD3h*hfNg5b;KvNO=^6UI? zd>=eKPq}blVRUf$WTdp{I*7j1q&*gsG znV}I&JDKZ=S;ghfMAmHK?JN0R#Bb_vGBWIk<3#_>x|7hzu$S}Wm*Ycxg0X1s2bXU# zcpuT=#7B0ZCqfgx-VnNV?du1pl%2?bC-EOT;Oi?xtJh{-pZ%lX!+We7FVj62wyk*& zcOUk7k9YTB4)5uuhu<~rfgZ$TcFx6v9W&3!&`5c~na=Jjm``N)^|uvNa-W2LPmH!? ze|OgQE5gpE>~YAu?_R#$31yd_3Y;CDPvIN9)U$u0wCHPd%>9z1JQ_(d#t!c6j$B)C zK>_#gb|72p205q6?m3G(k@u^&7qe$nw7VGIx`zL1c#n_2H;#$t(f_gV7qV=l?3KTy zQpTQ+ad!pzPrGB#ObFa4Z(aR9$b4mYX%9d#^s4tN=hg4?{)zEO&)J5rf9Ub#9_a1h z@<$9FEUfe$qz~CTB_Uwt$^0dZ*TNr~Yw>@d0-Z}YR3eXz+?n~T!?%@bb}gY0`KvZs zb1!4w9Zq20*L=*-t$5}t#t5AxZ2x`7*B76HPZ(Q5v|Jo=%KbTit2Zn$uGRy!6g(=yv4$v>5!G&S$xV_OjUp?;z|BF8@u_e(3Ani?WdAVZ&P& zbVuK5Rc<1=8M*M5VndO^XZI+7Q!pvncXrRZEYA94AJ;l$a|7S2f6kqcoOgWX;Aqde z%;o<4(Pbx5_g3ykSQHx3MO<#7c_!~v&ka0ZnT@RkJ)DDHSi0EN*I#BX>q3#PRY%V~ z(80Or+=;MzDY{(pznJ;!{Th?TX2+qitr}BxpcDLN!~3O2M_UruxUUZ_F3&-Ke2R7& z-)inm^~X1+-}rL+jgM!4eDGAd@ijoB!SM+eh2oe0oK=wwjVqIUmhRgRj!%YOoH678 z9xK`8?0#U3_Auph4^?D!C$@of#~|ju3jgP7>>BBA*%W)vpACK_TV*&8vJ#emirJRTEj>D~I>EOye1!Y${ zE*(gZ8@Ql5?fgyyM(>GV(Q)Dp=|0U*eE9%+TK{cFNAw@B^!{nUrkY${@p?DoYS3CU z`)Swnt^0HD;oF{B_mgGFIF*w-Vaho-z?6IUcHL#m@d5jn%Ln{E<&3%BsXoCiXAc#+ ziTiR-i0}CC8yDPY%NvUiE1&e>jSId*d4!nk7TM+-KOT>8Mz`d~r;!WFueUPFjb{&T z>N!<5NZ=d+)`0ehBlwY#gzjNXjS5ZAzn;9kdz`p(w$-=js5`~JqrW1np(W*N8v7Vo zl1KTb7tY4E$V_@ddAcz}F%-Ix3fGUTD!McvAQ&Sl;z--{pj z;w)$PL+G|drz@e`#w>R~r0ibJUp~U4SGo0d zUzB`NlY_<{Nt-Ke{10M^YX-byZK})woUW7_z0$ z9?d1eJ(}z5zbbn$-9HkXrM$<*N*QBYYda%D^|RlpDTr zN?o7kVv}1~zod|OW4LC)FEf?5pBR56t7btn<>h?7fITx8IT7N&XBm@d{Vblt;I5W4 zfAk!j?_2O&HM&^mn`!>9^DLM*)5h|ez7H<{ZIjNMG4YzPd|+bQ@J?hQbQ#)J9&@_O zVn3HYnOg4i?;k(m+Zu|u>@&8|*2d3%{SbSHmE+O--^<8V$)|bDp$5B6{$1UQ|$g(6|vwretA+KTm4PmQAb}%#_ak!t~}l9 z{a@$Bi|XhfoGlEF)A~`t|30zoQ2xQ?zr!vG8N1}K$f_D6i{*Q{w%>8at_dYpe9~FA z65jhG^AVgPe>%G-2l*C3*6Th&#kYt(nYj;z7HCo0HULjN9g4ZJVPr!+ITUkS)0@M!9V+ z`T%WiqsgjhCzwvF%@3Z)=`+@cUEPhMo>i0~3%Lmf$8T{6`^t*!JlDYa_#&5;# z^!rqPi(mA6D!+$#zvXXAzUco_ev5A#`2G^-v|1T*aQUyA-a~#I_)@<;kjRqc!OdfA z3~hxIS=xa;N{pa%@zlBr@ACW2ue$N`8ul-yW<{6P;Y-ZrQ+!I@gjCj`W#f+LZsDQM zXA5$iWfh^i2{B}V{FLPI!m`+;XiF?qT>fqB*5Nx_NCfJiavB*>&3)$G5Fr5gyyM6dzz6dhtZ!t=e~K=eGfQQYCpP|7d7o z*+tm*4`Uz4!ud}~zu$*#QH5{chK*N=4-c+4{XJmM%*7v{hd-|OR`T8mF@S>5xTWBH zVcVp?uHC^W8jh@f^(!vi1!LLcva4UlKL2-M^lsMJ)#Q%v-b7qwC2?8R(Vocnj9u>T zi#+fp+2`AgKPvfSXzJxte82T|WMGWBSQ#7hWi0*}@R41rn4W>78yDz>qZbz#Nxih? z*Nu&D;QXw?loukagECXJQvl8A-F9!P-o0M(mom*|JMD}e9xv@&@FP)=r#$Fs4yJ%E!77t&^c;%bC1ituxW3lGx>CWl|k9q%FdFJX^tp$Y>|3ZK2tCso8chMeBTkm|$2iwHOe_#6~0&VM#0*xtxZ!h|q ziSMVqjN;L%u}+z>&529Z;p5&sL9`IPt>~wXKblF*r~&@YrVq)IlK*h;Npu*y{wulD zeb!uZpE3+B|x848$GyETmw3Yu* z-`VZuKjB-neE|M$1;)aEIWoQxe9In)y%)I4!tl2CQ->0x47|A;57_*g`pz(7Y5m5n z7)fy4HOwvK)ZC`AZ-NgSWi#>JL4Qwu8Q$a!F#TuwPWY5vQpZ@Tyt_i`pdZ0faMifq zK>mnFCozwW*l%^j&trUdW_Le)1HWBa)NAiW@%@XzLu7aaSEJ@O!7DoyS}h!HAm$dM zjdSf4-CD0vy|!Va536@M@Q;nkUhOC@)sJ6;_L-%pA2By#=^KOdy2Z2kVm+y{J-|?O zqZppnW4?v`RZXm_4p`*yj&fkFaw9X3E00I8LG0Sa#b*8mi5>Kj4IM=e&fXqbpZz0Z zguf7v^1WO7{pLxtONy?IB(9*Iei!qbwdp68@GLm~itz~Fi+C2ih2uuxDEJ8nHR0}u zWeb-f!gSt|In+-^2Hkm&@a` z2GuOM$1QL7VgY8~ALZ>f7Vsm=nQyy|Y5qWS>`qPF$G66C3-7o5$9`wCp1Y58bxeG2 zwi^dlZ1eF!)3raY-tgkwXiw4Ob9$i1cF|5rTyYfET)??({mJO{Z2A}dD=w@2e%bds zhF1P}i1=FS0;lQVft2Bkh~mG*-5R0A^|W_sk@J%bF4%Jn?bOkS;HLf>ka7RbdirCO z$G~Zp=!S6^*wjq-eU(?3w|o)F&wb>9n|0!_yXN>QXh?lU-*e9j=s$m7|7iZ$01Jsx zCN!s-Xv?XgVZ*WpBO{;(*_nm#A#2#1^jq=lRmA0rh%rQ}iPiI8u~WBJu@A+;tSq-< z5&vi$l7~C+lNG-^2R~G2I>{~oZj|LEiVvnXY8(cyzpOB8eR^ij?M26(E_!HRQa7D* zL|j;C4PEcN7Z`~5O!=oj>6e>!t4{Y}wKf1NH}=Pxx(6!@8+}{)_%QIP20oKn>j=Q- ziFLY*8W`!nY~Uogl{h!AExI_?UC6jU2%JJ`;FNs-1HkF&!{Kzv2ZYmSjsPdc0lB+2 zaUZlY3|e^^yw2{9-WI}EoEI8C?0D#A(b3MbEzr(n^n-Ae1wSkql7qU-FMyW|`N*fzTEt>xlHd{Pr<>9|_cYR8vMhov zRO#u}d;^!9g#0*PPI-A#k1(EDj0ar$XD+b+w9lCf4 z{>&L7MUk2Xe|;=v?C&aRx7U5BMQ>{SO zJG|eFZP^^2v&|V3=9x1T^z2|SNbm1NUo{NvE(ed(iqWHy%Cfk8Z}p+I+Uiv5H1mI` zjI$Tv>3%sl;`399|1%atr*>^~C3Lpe=!u-fb--WthvFF;BfN^e;GWrPXpOmNrnTI} zINB>Vfd69Nlg@u!LLEbI|K3Y)mC)On9=%C+n;Z{Mf26DXNw4mMoVT+V`@_(jyOwd7 z{jzlFz%;qUmS>>JODVTB>FTe;>Cv85Y~+#dUGGPakB{n0k5TSU3({jN&p~>GhRnG( zTQbmN5?!y{c|(uIx$zyd*~>iHl}C%-C07{z-wHiS7D3yario6V$4cTB)1b$?06o@0 zkNuyaqvlTfbgm~a2b;^R+i?bc{grOa)cSI?HL+3T-A4K#Kc>5^oOfA&APMY5yM?S* zv>~e^oxM1B>qHXk!Ts+Zm8{80s1M0d(Wd$qZQ8z`@%qY0o4_G6ZRRAF(O$Hf>y6dY zrrxs{IWM~Z4Rs8?b@Yx?I<96Ap8Bfz~$%6Wq0AgUX?90`lLRxCkib{_7ooDo~I>!_=j`GT4L8IbU#_T(ThX2!EWQE7Y;b2l?G3D^4_Baco9HGTOCR~|`5C_g7C zm#SGq)q3uOoCUEB8%lFl3`@DUCFoYcHy@p-9L<-<%r*HK#D03TwyJ%XI!jM`E|jyF z49LqQW7~({*ckY)k^dAoJPG_sm&&gctR3{f^OZds-|{C? zYpQddX-4ie_tK!wcl-CPsWt1DxNE!j%+~tu*u?Mgdo>rmqhyooH!G(_?|Gkfzi!^| ze2n;<);bx(O3EUEvy;g|WUS*7==R(gb5J|v?J1WV8K|@QoR-IlT^0kIa$ ziAznrJaa}M_HfyW;$39(h5T>uxtkaucv%m88p4b4_uN=yGLYZBlJOB|C>6gEw<^6@ zb;7-40|sVnf`jUP%BzRG-o>f2k^^S{{W##S7yx?I*fW`8(kGiS=O&WCyqNh3UOUla z7GAx2ERvXP>gHG*s~K4O=Li`48=f*Yv$qezoG0U-i=UI&49y=&j}7A;{pYe0c)k3H zJDsdB*% z+Hw6AVEzVU6TH`AlZm#v1GJ^zqAkJvo75x6z~H0@IZ%^^=RM`()dy>3jlN;0Q<;FDIc-V6> z16y;(0Jv-Rd>sFbfxp;tSH|}#myh#%%5~m)|8X48IL1R~#n7pRN3jo&@rgSbdl6?j zYTnM?)FyJw%zCrUw?rm1D<{hOyq;gtto&xh)>>UZqq$^@Co_njs7(p^FQ%Mln`?Jh z>`=am%MNjKH%YP!BY~r%YWvz);R1KP1CV3@!{0esd2Ii?a zreuuPGgLP=cwAW)zIUj`iE9szej|G}hH|5j0%v|PrlL3I^pqgWLZiQPtW&u7*p=XX zF#S0^qsKR$3@q$e71!McO!ol~@#+D-Z(}dkZWoX34slWNgs(ZteWMZ*5L52 z9a>iySAQcEd15m*|B39& zUG#vn>^{!<{PfZ1eEY=Qm21CpMQnN(KI4CFaXy>sahA1xjC?}kJhvA8W$n7-qwjRk z|1I<}k3LM!<74aAE-G?%-vS=qWL|IZ!S~2z?7N3S7xur~`R~@O;ZICeU!m;PqbL1k z?e|AA=B%ObRANu~?+9hRQ#ip{_#$!sBECzU;j4>7k=4Y^D@v}NFlOf9(6Yts&m$M2 zBEoY)MQB+k_CqA~_EU>CG0)JKeiBKgp86~AQ=i{wtj^2MRo@*Mng3_T-1%D8`B^-N z`3&JRh|f?yqxp>C^CB|qXufm!{F%As@jZ@@=8?;HKA$hYvi!EOe2?ezXMRrsHwUhG zbH=XF$kh+5Bu76qvg?u`6n*v5OAEjH?Vm-aEdN>Ls_T9>`l{tW8$IR6KP$ZI?w=J- zxx3)_`M>2e`o{O?U&nt7Zag^u^QKPWluM|m^5uM9TlN0@-%$Qr+N@gj-hA6`8~;xn z(t75SRccpw)g_dxzf1Vs&AVsuzq9JV{JR;$j~K(Z*q%InY8f0lP^TopGR znE!2WoEoFb^}hXPZ09u{_!`x zGk*oSvX|euWB#i*zBd1!8(*6L`x|%7FTAm1{;C^aW}Gk2U$W}8`LkBNI=^VuD?Gn6 zzj9S4-+X?#`wJtTfBQ)_`z%%rzW$vK>;d6(3b+mNy#u_y^jg+Y!sB2*Z-qxB8a@`8 z|2^>j0Qmm$o7dmA8Js=#q5W z*;AvrXbzfhpYg*t;+J`hLt{A68L|3S_;D%xw&MEGvIho#Z>{o)l^=Xd*2pL3!Xsuq zlKHMDo}{&pm(bmf$av+#Rl{3W26n=Gk5VQX*gy`uWaZ`-XIbkGca8rP_RHt<-_5{d z=16BZYe|N$O5m$ch_B$K2jC^~*XI9^w>OWEy1MuOKQqHJVO6uTXcBNqf?Aa|3Nj=L z0ryDVl?2+a2~=-!q2iW=c-vsKbreNoTLRiPGnHPns9+ZYbP2V+1#xS8TN148gxD(k z3<~)@U+44rB%g!?@m~G?F^`$~obx%$`@Hw_KJNoP{Q@o0;Gq)@)K67dGjxy%T$+DjZPqz7n#X2KJzGUTO4;g5kehTZgU<~=2 zE#D>g#*&u~&+N-N6WUlqo9go-`dH0x7k?CA>hkwb{-ZDFX!@ZqdE!jr^^&)AW#aw8EIZ!hF5*qrVgsRzZB@KU7dhj^n{1{}Z@kHD;yzM|`)KG#EDL7~=CSS@ z*yqST$C^DH*(kf@hVRTsNUnq~DVg+6Km0TSYuo|sj}62TAs>|we4%0qD(5enl=+Eo z;TFyU1gT$n@1lG3zkxcEkNjU}%E9S!>|nLkc({GME3>{L+nBcF=tueet!+E}!`fz{ zClEiddo^~W#w9&N{i27Pep`56bTl zoMXmOLyWrSRQXB!_yNSsTmsHiKu^T#&whJ>&nnIq(hQ z)AKJnvFKjO>^X;h3!C7Rx$Flm?Qe}&`P-~pYhYmB!G6o@Sf||^f#V!_LnUKVd5G_3 z#v$6m-pv0g@c;`_%(w>Lra1h+q92y-Q(_XgbAU)0* z?{SU4f%i22a^l!~8h?v3{u268c@=)po4;!N65IK%=j=uhS`e+7_*2=z#BW1qimhIg zy>>=oA@wRVtZ|&fK3pch;$YjaScY9%MV?h-_rg~;IDF++=5Q|SH7GFT^>asUt$Q@d z+BOxvMSIE}YmeU2$k^NcgWFaTe~|}%iq<%DU}zx3IE9xR!Iy{coxg7B0M2(Nh1M6+ zc021)^6&Q9oG(frKp(Sw>92DhBRmIQU6}B+1^fl$5Ok)tO2K`#RZCk7XiG7CT1Ty+ z)>1t48e`X_7(SWIyu~MN8Is;c97l%?@o|UBSn5iK$RF_nW1;PPYWtbC7Yp|uo<_v{t3mwnZ?~Lpj>B=5EZ-rv958XPQbHK7& zx#ywUwp%r)1Demt!tnuZD}nW>!6t4XPq8b90>QkG14+^EU{{R1XZT5TlRL}MYnS2A z$eWwq`RqS=2EOOb9ntx$l4tl=^5$lCKD&=+E6#u>?;U>97Hnk8H}l>YzjK}6!TW}v zv=qBd&x7=vYvd1glAkg1r?eGX4Ok2Ri?M^h*du9@6XrZ0_QuwEv9$1}Gb)Soh4(zS zt{i(*`Kp}C;&a_{+n#aXUo+2%$IG?Lw^})=wjBDpWAEgoh5f{dXH!0h{m?Ps-7e1B ziFd^U1M&u>geJAIuPZwI06dtVYE84v z?)V1gDW<5*vc^y4o+LXCCo}5)c6pz^V?$5* zo&Y_=3o?T?Kg{I(=rnjmR@vN1?ml|fJ#+8z{9fn&KGr&Kpr2!{^Q)A*FthJ(?guUO zhbDsPCZ0Q-t9{{^k2ogw%XLSU<=nf_JoM=OshOo_f9f&UchFdBd;^cUxt&6Dd-f5x zr1jz>raxzYYU^)8_=q>NKlPlwKlSQ|_=q`c(VW)lBmMzAqeAJ1yFCp!JZH+1n2e+=)H9;Vpep8Uff_*~13&z1Y%SUdSm&A7RrE@g0m@okGg zDL(FN$Rhdi8#BOpE3{rdQG5pGUZe)*+d#Y7A9Lo1_^Fyq#e=1qcreL;O8z$>=Um?r z^&MYYYP27CFZiuxu5NoZHvB%4U)`F9pT-L}&Q?C@z)fTD!Ys>ySq*25Lnp`pRTYmQ!cFx6Vj6Dc07(U#&|Gl*UT!tsFaqqXlH|xn! zlN`N{c0bKG`&+vMDWnTi4oB%%HIb5P4wZeZxd@Nn^S9atUdfYcsIlGsk`{*_1(^=T<42= z8{1r!gS)!d*uB&E(5*%AF`cvG4!D4Gw=p)^wba#klw0Io^Il4{j=j11sn*LID%dmP zjFw;%=UhRNeD4sy#Xe3p`zx82udPIT=(5p>%Wdkvbz+iyq}Xe@{U=Qb_K#1{*`=m_ zA5F;NyiiTQb0#FcpqO3!u(UCNdh;ipFkt|=FpKzMo%L*)aR98#kLfYWQhs|mf{&%4u!mniw9 zeOz~(|M*5L(!v=2_H*``&?#5Vv$om$Oc~L$_O&l(99xIw9)0(w)H`tUdLK1;)4Rw8=Y8n`zNU zX;bArm3`CcZ+xotawYWAtT{m^+Jlt;A`={~1VbIl(^lc?87DT zd}g1ICgegVN%;AbR#VqQCwbh*?WL1?{LWrF$;#@alQx~rhfZAju<$*3>0<`#xPmji zr}7QYS{tmg$EY*aC-Y4EjwgcKI>WSGYY3lslD)dDM7xQZe+JwaoM)FFS^hnKmw9N! zhrdT<(|AvJWT~wO;U|4*3z&4FyL#*!!AoQ5jhB6ic52|s;>Rh+;K!$FoZ9#4MdqEX za$@c3-?#VI%HFr>ItWep-fy3sO8M!G_jvjmK;4gT3`LIBpU>&9xA7#vx4W=abe>lE zw?0kY{EPa>k~i;DzNoR?$eWx-dv3ztjT^KcY0t5&g)X72K8JX$4pA&Fp-mvJe)CPJ%PwoGLGQn1|Ek})CpJLCL6BbqI~cX?xgd)?}bSP zt)~mewbZO&H$rpoijWAKHp-c-<`_jYd%{mI_>A>;qe znh{-MV($CEiHS+-jK@=qoa~*I_-1;tcWOLxp~jXAYmTyW3cYrYFA^!S^~D+o?|JW- zv3Wk$U3Rfz^BNd;uzZAc;m36EfNX8?#c6{oi{E+e(_{1g&DyA~Oy&)$#9DSJgKTU6b%f*kf&T(pd|7FH^bZp+SaP=R+>R7n?H@CbO zTz#AJW8t5zpWF8wHun&pyk$^V{0rfa^x|J5|9gtb(jH9?ypQ-2lXtHGzLO z_?I!#j?Y7%Q+)bg+S-?|g{PJfZ{x;;4s-CY1%E|P_!q>7Djmu9>*?GrU0J*neX6;A$5Swszt{DR^*JFL+>Zds}B+7q|6JmV?`O5l6h| zQ~2BUE>85q->!1Yd%>BRly{HkbotfsoM-Uzs}k&OFTOPM-^G{Da-PBPt4ar7=Gp$4 zE5Mi77kHlGJ>Vc-aY}Ezg7F*+M=E$f$h*zG=uxjzZsf?MksbWZ$2qtkthZyIy2o=K zi%)gvJMTYJ(@+vucsllz3=-EBs7P4(k0dwsgw}{_ky(EW@<@*@x;#Ykq zewBh>gB|=*&IETnInH=W4z+6!c#Y+Gr;2wh=N&Uw&YpHZ`*1AW9Pi>@FZ}2%x4akJ zJdJYKpB)9>m+|SI-$gN9+LOuU`_y5fd#mtoEM-497*dQEXR0kLQO-TeCign)0PKVZ ziD1x5NXNmC63yv5jaUZGv6y`YUvwt_r{XuM=l_}5n@Q(bk%8=+D-U84@3Eh{Hive` z@LM^XGb^q9hW_-~N9|Z`A#hr{iT7;pg(XMQbHm&{^t@)g&fTvNgeyVxUK)_+^urdaIbrK>CNI>ido=1CGQ9O zSPA(&#@=s5riQHiAmdCna~^zvD%6duHYLSosUz|bK_cY?d={x&*uZBC%@S3+{^!V?4;bd=4^2nt8U7xPW(%-!XiHNml%EV!p_Wkegb<*1AY28g7JNMMDsq-X!=Slnn%fLBgR=B;;%1@)u1KiQs%zyOj@XypA{7n4` z4=dp#=%;J4pAUppXB2DrlKOM%*kejIk ztg-uh3cqb!>TG)>ZL!|Yc^kFQeF!|em-hYcb5Fl_nXwU%?%+jtdJmisiil=KA6m;I zt50p-;A!y+E2*s&oXhn+TqhXj%FhX|?qZEEpNh2aPE-<2M^=8H(4t-Iw@%^5t6Nxn_{&iGWr zQ@nS^X9G*!8UF-h+m0?GIp^(n7_{X5uW_^&_Je+s@pGrJUzf_dr$IyM&`<_vI{Jha z^9FuJKju?0)Hg}%eTYwH3ij;ahbBvIt2}dXVA2Tq4*A3LOuphtJWt2}J=7n!D*dZ1 z%O94$s`mCXuKFRhlk1mQtLvBeR?GJ#*dM}QUJvZcmh=tFkE^<6rzb~(AN{Dftk}1{ zY*XKG#pAR~F10d$zi`E>zWKWMw!+^pzkP;3zwE*ENG#wFi^glvrDKKu{E7!tA{9qc zBZ)JDkrID!HE{pPdOjoEQ0Uv%Lfv=4VIzN`y?XP^#(`7me=YylG3JKN);9Tj58$88 zpzU>mljBwWg%2am8klqIJkz}$Y2c}1PxNie+>GcZX#Ny%L%jNx>XYN*BWimj@XCZw zhoDW-WhFQo3ET|sX0(N{gDRJ7np}Poa~&Q^lq^{?IfM>X@AMvqx1FKy)XKk;sb#j}gndEQ*u$ye^@e~f)!;*#?Xf8u_ySVh0c z#DFzH?{26bIVqj@o5a`0Z=UjMU_`ufN#$ht;YZomjWlbrleM@V_-QWM2Ngekg*p1n z8f3It$a(J?3%tVTGSxHPoU@YJ-U zXlOY7CDE_GKM9O5yhr$40BkNbee2oCDDj_(*Myt&fB(+D;WS`m;q#6e`NBRG^yJdW z0sP#J(3I|^6s_#y-6EfrK+j54;tzrL3~fcAVS_scW*KdI&!Qc@)5<$JyrcRqjh)Uo z_1vbjq_z@=&I-^01j~)|>C&0b-z&a!gkS-@V-v{<$(jnUj;1r#78-p4`5-z|9>hxY z!Up~;U%TiviFQoiv{i%uRdeaNE%*s-J>zLh|DQDfucvKW2MF`O8CumCF9(kg;Cm*Q z=-Pvfkvs}v<><5=+G`%oJr|4zxfx!`x=L=|EM5uRR2D-YJDG7dKwrU&M}{|SK4sDX z#y9iqM~Wl2{p1e8D^h*Rx~0hQ6xv)1E=GPlB~mZ`oH7#K#cucOW{l!HDdt>y8UMAX zwnM&3<`DCT@?+ffExos&fs5{jV6W^3cPxzk3@edYmNO}S>qU_UXn)Zy1rgI{#l*;l zK*pqcp0)Ug)qWZI*-(A0!D*YehqV*bq2n(z*&@!2g!>tnj&JJU4sB zlis#jeW{!|s;?Xemwryn#7HZ?C+Hhl8$20)d=`1lImcl5=soaJ-dO^yM^az7c7xVe zJO`R@fNzNph*yeF_NR{GD(l(jhqiX>EK&d(uz9Dw);l#e_C8#G`3>l&oi*9Wnl!N{ zLCeb5dJvD2cd1zyd%QQ9b(zzJr;49y+?gkGH$|#5W^$IRzg4X3hk6G-A{p%R)T8CE z%~QoQ6l1IJeaP#5=ob4~yLbm5NjH4teA;X_&s3&5`qbrdieT1(({~g~!E3`iIVryXwF=rE)hfBvH+Ioey zyz=xV{=;j>+4Zh9_^x^{@cgNuHK7EZF4G#(*2p@P`}KgG{Phpo_|Y{>5KG}E^Gj_S8iS30ov^+kJ`zGR~_>^uWM2)d+rSrzZZoV(Gb z%eP*SY^S`eAN?{u@t$VJrhC!VhOHM^`FiH+2lp@^$uT3>99!g0p6$EhI`qzK(Lb+2 z5B)Ow=xpqdt0U;A#@4Hset`Xv1#Vi%^MA8`!cl|YCyX$1W)=AI0qe2=*lRD#2mE)^ zcL2U48j~!N-t`UM9mjfzZ|RKeI=-LcJ?z%4*sNQ#|2`v8kTL^!r0cwG-ajdG`?o|t z&R7o9j{EzN=l4N=&jdcAFRgK~uv0&p#9X`UO{KtfT)>)G#5?Cu{-)m=e{skAH^yDN z&0?K%C>Q_JI=StOH*Ulhy|Ck%jk8(k8zZTIhVxwWsbT!`Mfsd(l67`Fwv4Iboin>V zt7LowXh&;q*R|WvHa3*|taF^IFM03QclE(($P39XwK1xrEnBAqjY?=>}e1AVm9r;(5uYKH-7zF4-K1MZSEdRcTBgIt@8WMv;8^BQ<$0ecVz1Oe9oXB?|U)gl!I1qK+ci= z6HEMk!cRbljf1T5B?Z3lWBe}R_g#0u2l#*Y+)$z#d|ZJIxe=dy*$=VR2U#zdt-3hB zXfW^a{(Y2}yapX(Q@L~gHgmjdRVcBnkM(lNsH-E`XL?^@! ziGi&@+~B};5#M*6PW*xPXUO|$9p2G|o%oX4F9i<-8~nEhHiD7hqi33baIpPfdqVmz zeN%k=Eza;%qIcKqwCU+d>Z|X0lviSd*UYt_m%wjt;hD~pnEi~)h)=|y)`0I9AK6tk z1FZF##KuY=EWyqx+tf*)S85*UrI}W;vGu+7^2{5Lwx6psH||$Co%K_jRh%u+m|wdN z-HiUf2E6K})5OeKn~$=yhJ~>=KbrTIVc}6juu)krQ~tuRu;FE%@&d}6-SXh@qsr$} z{x0P|J=DJZB|e$PA9wV96!M#7l50N59$NYX(-IZ3`-417=l%q6B%*s81k1_-D_n^T+W+TJ#GB7u=WhiQ z>4-hu^k!hIc7IHp zZv75_BylrV{lIV>n#OkB-3-mRvCeK?eRr>4Pg@pp!>!xB{Arc<@s@Y>*H})!g88G= zO{x#&S1hsex8S3epTzYkrMwl2Y(SrW868Esl?|h01EX5r6O2lLQ5i5Ak1U5@82Jm0 z7~M*KAlDDr-&rfK9F{&@M!#PCwf#N1AHIL&<3i;;PD0)eK<*C2-!lk*k1w2Z9WgA` z);8URq&vjqZRvi>=)eTi4r~T{JwbcM6c}cTr#WsLp3?S?9bEcis@&oVUndd6L$P z_0E&+Bi(nr)>ilE0KeP84Wn-<4;*_>6;JpUatGasdgRtHIy~^|phX+ckDw!huJ8^djT5$y^l2l+e! z9JE$yH|A-#rK8;Aq^Yoyriubmt|m3E9z+%q=n&3=vN(uYi$ znR{wm3(sXcaMsFx$AJlL&Hf4Xr3=Z1(mR^RX^ej`|0lZj=|eD-e_|E&Rafh!_tck< zk9pTK&!?#;etL^&$MC^?C-$=(THd+%=)@C zC!E;;jl2wvi01Te4g0BSi~(N1zLND-o0aUzP6MwcpIut3@U%0HcHMSFYnoF%@k8DD z*qw}NA@B8rSFaS!*m860ykCtBKhOV%Vk5&A=K~9fC4Rq~AAIQboqI~s-ws^s-1iv( z@0h!6x@5*L_|(&nbe~mIDvKX=<}UtF>=|(e^t`v3_q663H|q-?7cej7-QH~SZoBQZ z7xuniCf=`oGMDGe);`ESnfA+?dA;+Andjg5Whikid#U%J)9QVV|CMV(5y>!j-*2Tqz4lMQvg=&Z+up;MY|q7(FcEzvkz$a8vAn^Qwz^DuaM@$f6Yzv z?`cjyR=WYwy3N;q#Q*xt(E4n~FZ?*xzFnomuZmd{_xBb2HhjnfJIZEUeCp59?8+EqJ0Oy+cygz`(p3+gV*+l z=LW&sB=nI1+)wK>d$yuU=~JWFGf2nwKDgw(u+Bw=z@Isz1MB6p`3bO)UD=F}OaG(% zPXJ%Zz^Uw8Eq>676pb!i-+&&b_vAlYDfl_{zt3;k)eYz&_I{N1YOHPVGS+&&wU?T! z-|$i|zFowe_FXZHG0$Y|Ma*FabJ5-@ck^tv_f8|M!Ov(TD}VEpSfLfZhtEiGu^B(I zc(ukw9`*4mbNhaczRXy7Hjv*X@FBsvp7p?=Z1#QX(YfoZ|JKFtQ-Tbao>`9{JA(ht z_+Xv-S-k7km(OP%bzB^-hgV zvAK#Du;r`mdp-otHDhaJvS$_o*ADPs_C&+p_LrLj+IRW>WQ{?vUdiWi%8h*B{K!FI z?8+Gn|N2_T2Jo)MO2#YMDBP3$a{Cfq|An@M*Lv>4QDb;ZV}fTr%i6p14}w?PdrZm> ztT*~{z~+|+@uPL*y2H1X3a=DSik8)GPrPy?w9u7zq_tId@E1E~U>z{*iC4~q$8_hF ztEubq%9DHt^`=Gm>}WGyR!|@^c*= zBfZFp3kcY_4SbD0bUr-rMDotMe8Fv3@V}3Cy7Lvm|8A%K56$|bukgN)b#mKq?|xcf z#+4jBmv#EI^QBss*k(K5lYIOwL#_4uDgw&=o!`uJ$*>!>F6^sy>gH)}&*3XqxoiIx zYh9?*U51sD1E^zNs4p2dL+dgY9i9I#9A;h6>0Q6oWX3MKZm+iTHJ*LMl4*R3F%$nk z!0!#>L%j1n>WbItx0lC^(fkeVq!`*cga4@~Lg&2ON;@g+NsgfH$$Z$adF<^~1I^vd z!fEl7YpE|jm^GAlW)VMyjTC~8nlHD)AG4P}knwB3lDz=ORv2O13be0r%2xP?V8$4l zsgItXm;_(QB(Fmi>liz4n&At^R-nzD@Q=CRm+HsZ@6{faYz4tbc0n?2nf?r%MwmJ6 z0e{vhesWA`ed|#C=Dwu)S%>T~e!{qR(w^R_C$8AGXGYp%WPB?}+j|nfpk3t{&^#0u z@M&Yrr%lzD?bFIwjXmScS!;8>vn~~q@1C(5d2iOk=4G2HUyRPNo;-B-qH_qYuQ=oV z*n@k%z_8k%gX_Yp8o%Oz&E(W8vIr&5Jho^9ecl+Th^>-%;CUem1_<^1r@t&bq!v)*btNB=o*j_R$1z z%Kbf--vh`2Z0MS?yM5JzJ9p8xWMBu~JN>pG+vNXKnQRE{ox1Ofwy-H?e^ujToyM^4 zrp#Fr>DSUx#B(~@b=HqD&AyiRTz;f^{ZaHqJHu$FnS7zHEYNp*weF7yAm96-lk_!t zPSuxX^$F|#9>tW6WlhNKIbObH>A+KIM|8~m*4D4m+NMPhQAe>_s9R}=rXu?Mq=k^E1U%n+AA9# z-qKKr?}onW13M<`tc-lHB_~x*nJs_xsIGok$xQiNKg|!TT;fjKKU-Ek<**;!96YRY{UvD4CW77wIFyph$X5EDgRcaqw zrzvFnUFAQNEWZgDnK69Qjwx!Tlsff(>C|gv{dM=$fom^9MjPbK-=Ysl4}ixSTSNFEUH?D$`$B<(rqy z18>dy8S7nwZmTlI2`Xmr`;4VT{(104^`fFZ;T?8OGrD=rD*020>A;s>g-?9xPAfc> zn79(wpmIp#6zq${F6g1Tx^i+e?^r&I{OeXidq3*uo3tMSmo$!Qem8PQt-EJ%&)iUA z5o26I?wu-lu=Wg!h!>vZy!#)Nox|^?^joEVIjbpJR==(Et3FMBB_Db}>%L?-`4k;J zQnZ<4b?y%<{*-6nfG;ZD?agBLI;gL>vR39Po-CjLis8s6%gV0-pXZ-`b!1@Dmby~z zu_;j5eC)0UM!AyBV|4Lh$Ya!!pLD$(il=FwI^Q*v8Fckb6_qNZz8u)*g zbyr=*lue|*ZMWF=)+Lln|LM$4N{$yt|GA60ck;P|k9dvND2Z?BqAm`NrcC_E{h!Hy zw}0^?@kdub_4a!f&xLz?;ZH99xc=y7Vr%8!-ba~ro!1|2-|z00f1vW4yyac}J#Ibe zvMtn23QfzG{UD!pIli)#FBe86*OOL;@*~i@{MN1yyEp%}^zF~$zrL1rQhl!-VfbNB z{_B8!pO5#xmNa6&krB$xzShVAOJpxyWj63+X0$bBcGtwyL0_IR_5jb7auP|QWw@h5H zJ5K1Q$1(ThpHn+)hfIs(@M3Q=)Uh|2E1rowG5dM!O>V&EuSZ^ZePP$pk7()|=C+SD zO=AzsyQlaR?}vcp<&;-4U+>bak=5V-~Y2*!u6 zf_L<@#+MbFeZOsY&4LfJ*H;Nl-MzlIZm{?I4nSYp$Fk|m-s}4ldY0&f`ev{16=-V* z`&g0z4bDDR5ZWpM=cOav&H71hxHi~T^so18ynB$0!R$fKlFUes{$4zOlNG*$@1AII z5N(R@s_sVWXzf=pE|(_UeD;TK?SucOYd-sSayT49-?`z68N?B}dtt$7R$ptP&PQp# z!pcU!<9ijk2;W2Z*8M9_Fz)z{P$a&?7rEyaEAkGyTu~sD-$X9U*Z`CF;lvpFOdLJQ zceSm*DIR6%h1Rl?zSel12OGC<$mQNU39BNj2xzheGbeXOCvA=!W# z@Jg$XbvStU^n~JbfIo1|fVasX!F?%a?Dn`d=9)w8<6B1AW4w*=-9!KPpbOl^c!6bJ z5%o>IZg^SG8hd5tA!6^mIlWyxy^c2V^DJD6|5|JG!Iejr>)fNU5AoxHRM7>@L3V(C z>-p6F0Arqg!rX?U>c*`&ia zJTc*LQEhDMGmkesvTn~i*94y}1IJ6xmp;n*gqn?Ej!<)#a7MR_@gfZKJpdm-W={-!;dT8 zq*yBD!#e{ybaf@I`Csh!qU%|Y!}lE>zkt4&$gEdhK^wlp*_?XfKG8?+o@<5ghCe*@ zw@{>={q$F{n^Hth4`p6P1-T*I>PH-)}sNLC9Z-N)`+>!G-i(tnpo(nD- zy@WmZa%6#YQQJ9jze-=d{45wNxFqcc57{)a(LlQjLYSP`u6Gv!e!Z0J<02D z7Jqhm{U$b~S6)wH-6f;D%TwX*?c(RG!&AuTnw`_~SM2oVOEzmRmCU_m2rl(|9@s8?RDRk8wAJ8Gf4v0U3Lc)eJ#|p9cGZw{attYMB{h1G@`%RHJLDk@ zm!Iy7%)iDTiOw$r7lO5y@NB`TJ`wIFeY_|&SX-7SzH)SI&c)!uSNN3B*6Fla0qoYY zJ{phg5A`Sh_Fua@eHh*2)23Sfwo&5E$TRKrYOl`?Q2C z7Jhr{3g7RdZVj>At$}eS)@D5UmrHs|tJX*LU#5=MsDeISnrq)IdD17ce~jq3Uqt5?t%pLZ%{%>ltF4EottLKW zwe2gwzwE3(@^!6zJ4@knW!MEe1Gkg4NhJ?;{kKE$?~ArrORbOarH=o~mA!wA))f17 zv(1xF_27z4|6TXPa|bD&(e`r{@q0WnU;{efX8O7gS)u!IUuFz?HkWfFuh3VFwX-B= z96RPd`feo7t_gnVK3k+`qvYrAq~nEpcAn~WKKq)U6{w!S)9&RBhJy8$4otYN%cCPU8HB5RIf93 za;l!ap?aOq&eyY@s@K1xz43asNA>Jy_50grpTn~s!SJB_3;LLBddX_>xgA3S@w6=BA2~aEmXnUW>)~{2e%Xs%?Vvbc$wwZW_^dy^Kbm~ewkR@%bXY9xW+l#Ot3V83=mv_~h z9)<6UuSh?3`?L9pk3DEVd(i>f_1psjT!PT>0p^RoYJAsPugou#n;(378eEWX^&8-t zeqYPkpJ#xH*ME7C=O}M$v11Zb1HrZ`=I|%R*FrtPMtc~4VLYtYc=7VFv{&VpWj$KF zvt`{K>CEGPo{8rNga1=EtZL-5;v*VIA@DAvkKp3P@fiK5V~BAeglJODiOz_k|x*NcE}A#fI-XWblrYWOzt4gJXQ z`aX>1b@I!)>(i6IAz3KA^x-e?vp)M+AGMR7f{&a#Y2FL;i5h-nSra5b1_D3f>Xrdb zb>shpy}(?aLN8BRe0O{c^UVcjOQnnOpAC?N;u>0cPv@o|=J`0DJtk)#pB~zlOX4sp;y+H^D#Z>Bq7G~4QNUBh{k-SGw zPtvE=w@`f=+w~U4_2lJ8+ZH2pM!Jg z2Z@}3l}OOWb->WwmzQ6L=Z;-F4Bc9L%o)-9F17JZXF_7w&aL3hL3B3RmXdeMBR$kv zuK@w_)&ldqBr7qjuk5Py+AVyzZzKO8{4;}d1$vh0OKqd0g#12kow)oB_?WVIUuU2* z1HLw$k5D^0=X^cm_<(hIhxbh`vyOwy;;Z+@sOZHdk^w` z@xR3%e~v8i_+OD7wv4uY9hp~gjuU@QW4};jrz1aS&~6$0Ni?4ne5YeC5}K7s}Mfenj4*G;Gz4lEYM;lW0CSU=aJI|!#7 zcu0T9bo7U(scY*Gw%q@*)`)%QuKL5DfyZ#*!JaGd*#Ac>vQcLR*O2FCG&0)UzkvS| zT9z)+j2}w#wRwDs(Iv{k1L+dY@b>OFW$y6x>JWwawZIv*v6t`H{$<0cC;dUPOZwbQ z+HYVz1Pk@E;+wwsKIE0~F7^7(GdbcT@=Hmd5g(C0YiwHhNDUvoe+_FYUwsw$LYw(K zcld~%Z%AjX%P+CtGkH2ZvP*h*$&znPE?M%;$z|UpetgM)^7|n^)qIvrcJZM5*`u=z zy(C9JgmxYTjvDu52L>mb`Udbl*gntQT4!`R!BuBI#9MN(3)eym`&jQqe2b=+fkSuk zzlQ%i9GZTG{fH`fhSpvB*G}3JO)Cxne^3W+$^zD}Q7(BF4F0(;9ePxs#>POl2tR|1 zzhUSz1zxpyXDCtw{9O81o(l0R_3hH`cBTpClu62FZ;hiO(qn z{*E0`ZTnRWj04CNXj1R`8S@tMuJ%N~$EE+%4mQ8h|Gy)i2Rypy|EK>S^#9ZT5Bfjr zZS;S}r#W833b)vrgaLziDya!`-Xv z%X(={nGacUcYo^zr`_)U%^}P~kJ9Bx0?;Dtlp*Ls$r@OyF`)cYp!?JAp z0zbwRi@F1wq3hmgvf;Up)28f&68Nojj0wQS%Wpev1UpW6$Sk}5-J29=lpHMw_vL?- z&bEJuKmHW*cm;jw?&|J(;y0YWq$f7;k)A%A{#G1w|05;3d#2r|Hy_Zk?2r=1hx_>Gus{nmA_@%+W^kuN9ck>oj5DKG9_B-;7>sI3>2PXS?JaQjbj8Q2SvS$z4|w+*^YLpU%ZffJ zd?GW+uD5hZMs3z$?wqCWJ=DDm|4a?_ZCLx*XUeE$4YrvzsG1XZ*Ff^@W3zv85xRsc z(|%)g^rH3$wxcVom3*I*MGS|1Ufbx4f5q<6vyGl-?>W!1-DmUjaN1o zD`a16GGq7lcikmj<6kWJ_KlZ!KD)A8c@sLm>IA>%+jbXxA)}}k-nz*hkr3H*ViT6^?mwu z%LUJ009)y1KY}l~Yi{eu9=&+86=wa`{EkoV`_mJ%!qW}ir!@k*X7&w6`y#u}@JCt- z?bzH5`cOWx2FBIQGd-URFV);!{m&amd?mSxRbRHM#@*9<8_4~!5k8@@e#G3Hpv@Y1 zX$5PfxL2F!5|7M$yTBBES^X;ZXaaK`PhaYzw>t7Mo=KfCPQ6wKK68N2={ysRytpbn zwV>UfE&_ggTiciK;j^1h_xXHI%x>=pHuJPOcV1Hyk=UPlG zPqh_JsFL+C5 zaRkH2{H(YszmoDwyIk#Pt#X%6PpBNeu*O0px0N-@WKV%&>c75O*dEWgn@B9rs9XJOq==KEmW*s zXB=7nG%$Ai*7v9N7bHg0U01g+$<-J*0?#x#>ogYe#w>8#yH@|2c_jV!^m(7B&+h&G zZ{~69G1~LOQr%5?H2ciKZ5dk*XBo%0&n^1|0XuiZCt zkerPjxsAbz4R;dP0}e$vJ1t*RaPW-8E^xQ?TUMkM9K{yNQ~S{~E{wE}CMJ$^2r=-p z;f$$A;qJBIZbP-TO?E-72i#RZ#-8sxBcXEPZpmC5ckf~RC7f|?xHFXBK7V|?ef|V; zxmn{%(I>NHZ;!KP3Ka;=3nHFjjzn(U9rNB#T^ zV+&1XT&|wmXv@Ae^`otA!CxTT(4mC44e+Ao>W!1@`&CZ4g7#|Q*%8jV=w1!oOO=H0 z8>fQVQ>zF5e%jR8vNG^oZ5?4u8qar`i)?onK1*pwd4g+b|L|DiKOI<|!uygh`$vlp zbe>b;EW3$6+;@fF#2w~f4=}d1cAN(5M;|&%AzM`RWPEY-NBjBG-6g-v=&w7i%O1A( zF}ZIW9xwQRFD8C!pC{H>+FL zgEuG5`C3 zZ^~&@08WWsEy;XznMHh00scY8Cm6c?<5>9{il{3ZZf5P>n4P2(6_2Amn5l19b2e|@ zO_|__e1mqL^jem%gJWH$1A_?zql)W4)+rOCp?v}?f|h3$~7h4J&d)k zv4hk#v_af@ZYj^QuzMb}@{QdC{)kWH=zFLyF59O+?Fctz`@F05lYK*bvTtPn2)A+q z*hA3lPoee2qXLnq`Ig?*Q~aLMvBB*v(0!-9kr53;H=6rqo=cZs%Kz^8^z#|r;n7w8 zTNyp*U9OHST^QfF#w#CTcb;8AT!xF6>i67#wl6=2kBck%{%*Ja1qbVBdv?uduxHI3 z_pUvA0=y48?$w_4;;UIhbkL*bfnBI^eOBFn|39#Q_;~00dG_bU>si3@PxSR}xBhH< z-5=QtZ#)dY`yKOmozE<6%LUk$L2QYndi1X|tVr7!#hTgoJ1hY&bw0j9vVdoL?%I`m zUESZ2IX|OM)fN1Ds;_bGVjW(jUKaX}7YDoh$HkxA_@Z)t58(Xd9PUF1A%kbK4>})R zA@{UUVocKS>dJpGfc;MH;Y7~)7w5)Lg0Gfir>f2v>U@nl53e5Z>>TQp@V?)P9a5X3 zlU>N61?YVhz5#91;LS6UshNwjdtqPnqZ1>aJRyBK8QGD74$wzA;2&=V#{awmUHPLOdvblm;GwTY zMo*2zM*G9TQtUn8ExkE1`of6hJUVZlbh%aN6zEN>Ti{jo{VRyg4Mg96HW=AC)VKQY z>HgLK$PBEm?|g_nXZeq#s|6UUn5{DEb<`Y!YiMJWy`rw;WlvfVFpNpnY?H z=0A+MwBhVYjlhpLlKu9Rfx{`lp&vPwPgw`8eH2_dB)pRRFZ%+0;jMk5t2Up!?m2RB z2M_NE#!j^+>@Sq=jGmm66-HnFsGxapSpJU`ksU2 zYj~sXjix@o*i*Lg*L!j{{d14sckB1F-z~kx;*(_+WU@|&O+SrU;hm#x{o}WV(#6Ti z&-gY}4_{}m#RaUzWO5mD4+PKs)qTSI>EmtAN$H-+w=bWOc$NOid;gMrPA+`&8Q;|E zJ}+9ts*E6?!`pC_TYxbd)hX8sSh{WwXq+r-{_ zgCleCsoQx;dEf1?FM#uBs zaNd)gRnCDFbVJ5AMp_0qpzHSUHb}=udHG7E$ecDQTw;BpQ`ydaNCa$NHAIn{@e;| z4ZJA3>2n-UgSlhMldqONg;y9)qt1Re4kBm%E%9aQo3s0drWY2jXa9V`@8PA$*fmz! zX~-3w#Y~R&gPv5UW#F`k_42gDXy&w@vAS*D3(t`pnXPYRjhk!i5$Y)Cx$t8OeeJvA z7Wm1{@Rgh3FE_$xZh${sPyB0t!=I`gyqtTEjh8F;*m)Ta6dYOpIC$xn-{6${hK}Q+^`fZ~Wcn z%kFqir(8I!*lEMBdFL#ib=W2z7>`w(z_--sk>o7n+q}cG8p^EAf$+Wh4g|vY=)2G# zUZn48U-&Ll&iPlqo58=Y^DUcSzF(iyxAsiro199FUMqLE2YuGWR?bE4;~Bi%@Y}h( zr{2HTDUumJID8 zKR1g9^+nI`gHI|DmE5iW)`hG8N}rOK3&uld$jhAZ#Cb^O#IR8}Tj5pnxObfIHh7DX z1< z|FLHm`n%>c=TYD8E%2Z@-y3SaFFAbC_KII8?XKq8C5JEGKI?%k&jwGlPOR8=&hA-< zFWFuLUkwhnt`a)k{wc&!WvS?FHMf>}#F4fW8+TF4%ti`-7hS zN#7y0f9xB|A3F1#N&gLOhs?~Ibawki+f_e7tn7}BNxO>}TSYFh`;2`l?d8&5Zr_2m zdAv8Eua%$6d&0jq=B|1>sbAiAy&$sQ zm61I6gKuXtzxa$$A_HA9INFwZUfv#L?!=!0kBko9u4m@ISMCXK9GkN!$>zJkfwufB z;ZEabe1kFi4Ej3H0+qA&@h^S8ed7x=_O9D^rSh|(f1AEpTUQUAMc>Vu8}ePc>U91a z++S>PAHJKuK>3W@^Q?s~E}jAGg@d_mONv`3ymrT~Kzbhdw{VO0h`%?~d|&cFpR2*Y zh1EQ}B#!MOdQ*JB3(QM7iQCC%>f)5{O51foX#EGzJy!g+DbYI~1%HKy zqNlb8UwGEw?%}U)zx}U+NBs8#72E%~xZ?3I`G(eh=-}_!<+o1~{{H*HK3D6#gMop0 z;P1j58-EuHf9LbwCA>GrH?VdA?+q0Gmd~GL<8OK%_`A@Hzee6N=7$Wuk#}dFl`mSX zQU0kZo2M9>BoB?zYXVkykL0A26Di%%Phj+GV?F36G4zvmqo1UA;IN)4Uee7|G??`; z>+j$&{Te)qp~IQjen$@0pKY&Ih&XXC{=C9?UPW*D|6>dl&KN3{rF|Me&JZ1}=o=A^$WHb1od=${dcj2SD>fQ^*Wnjs=$*P- zq=CDyTEUwL{G`76*~!EDS_!okgN7TbN5(tb%#5B+8wbf5oBn@Tlca8I(%|H$(wa!l zG@3ovqy3Io0|(h_KVbgd?Xnj>Y44cl;gDmORoix1d`>Ys&{gO^S9I8CEzY`+a$sJC z&Mv%pg?C$^LH+(IzaMaZui^Kz{Fc1;;>X#-S9FFf^qvl#!CAXz=;d_Eg@bE%wlDuF zAI<$mzSr*^WOpCk)P^bX&*n0IY{R}Y;IF#m~< zbKY^sik>+;K$+XV-o3)9`)lg{ijVk&`)S{-{PRO1hpPkO$UNV+XrUGU5%=xnmU4gM zv*&YvU!Uj?1HNtV^l0{Bp{*=J$1%MOpShZRB3^V;9J@L}2Jr*aRuY;n=o z;rlK}FSYY_cl2Ma{s&_V2f{I*?GteQ0YA*VAR>Q2L!o`AU4*e|Eb<4a-<5%i)!sf= z1}br$Iipg3zPj;;xM_37br8|}2zm$*g)8Ys}nQGV99#A5P~BpC#0B^KpI)oRrRf8GV12`3N4LHlIsB<9wQWn2+WnyXP=#b3F68+L_NVGoQ|Q zq!cG6ECrtQzqMmUmkr>mtLq>$jGU-(c#>$@o5RVCTROWyca3z$Fu8WqptEdwQVLCK z4eFWyNAQmh{0=BTogcd_0B`D+)25p9GT^1wGc5}kp{ETau6rW)(UAGE9 z=t|;1gyYrJx7Y^^29jTIWlV~33~pRnm&Dlg+j? zR~|ppUgz%nE2mEFzMpV(zLehhNf=!DH2V7*Jm9nNlh}nv^Anf;vgz-5=fQS#0t*wZ5YybUFMs8BdMSCi&&Pm`c2lm z5?<&d7tnaxt3g*SAc)M@p?j!voWsZ)e{4dh6 z%DK6{WO(J2ROwi}Cml<9dGx-mw`E5EKpSSfMcLuYfm0}nb5FoiI>Ii-gbw>yaA9_M zDKKk&!djf0B*3;QxUpJV2517R+`*v~8zh1bbeS}ZG!S%wM+&?^8 zESNQcXRWo?;{BsLVYZbqe~~b2n%-^v)4Rg#=`R3gITv;9Gjx#yvtMP0*8(Fio?XfR zqDz6||I0pj zw76k)SD58K`t4rvY{C}|vl@JTLC;-k_1yVu+m<$M9ue>VoM|&Qu4|tbenZ30W{(OF z?*_A1;7v7WK2qH9LRXlz9)mVp8S@v3XR$AJ8~-_7VfNw|0JEaAy7pOe7WslD$6gqP zEV9C1lN|fWBgI9x|KyJL%uXIwe)glqt$$d3hxl0Q*gorG@G>tS`~DXUtD20i z3akJ31;8qn+OC=wuk;}&V01E=-WTJql51cwfVhZ*3b=J z#a}SI@L6}E$E*{(!fW^!05A68yYyMf{brJXhF@1>U-0|8@S&O)9w}}*8#=s^{j+3b zB=9TeS%-`qBN=JgdIe?u1*?J5EBq1Z;Mz+}#s({sZ^e6$B(_r-c4>w2)%BiJ+_Ay7 zx;9vY<8Q`Zw*5l#H)EH$dtQG;Puhzu^Lh3eboTPxKC^T_s0TfB4Sg%#ZT|&|JDiSR z$&QP4?Y~EIZM$IQKW+OjYx0rh=VMp7?E~cSQ7q2sd`{qVDj)6HkK!Xc$&1S)!6)7OGGq$(vrw*c&zwy-O?~jt#r+dh9~$&iUv=eUeD<&H%j@{Kb-lJxqx^roBcHe0^zl(W*(_%n9Rz!a zZ`VI@RD9ORP~uzAyUvQ7Mm^a;dUqA`_Qtl|OaF`cd=`JxTeR_M_OAS|pT*uilQvb~ z>pyet-LF!1JofIZz*ctP1N8k_=CkrR=5zmNoKO7xqvun_nL5pBHRC*<`BXdenfV## zbK7yur|2`z=T|+?$M`qTl??15hn2xskAL$DXFjQ)aX$ISF`tyrIG@LQo{w3di;r`C zMmY0nVg8>5-})ZMe41(Vv(V2?JWO|<)3=>3#*^bN;KP@0 z-^;~W3Fpowf22ftd7jVU{wwqn_~D<`hKWf}X$!%_-r)Z{>dYHA+UUh@eEjqHXuyx~ zEATjcG{&b>hJUHb#K+rt7)$vd#IK5MPo$!+DDFew;ypUow2B$KFv3Rb1zh1X{ z^)@>&dX6zLjxx^1>?3YJrhR*!wTw19b)+hFw#t&Tm4P4&p?JDREA z%H2*@A8U2+Bj37Kd_$RKxsw{6!v{+nxA3lgSFH`-dl{GFm14BrexH?}rhXlpmU9K` za|S(B9J|0;ET72=^6nmZ&WdbdFMeJ1&G8uRJvrRkmd-mSk1PIN`H2rQ2JMHazm@oZ zmCI%_{hB+VG#|#ty&=1^sI%e}JC{vxUZ~@)D&GjrGd22ZzWt8QH?*SnX-`CL>aMi4 zS~vN%xi46FQY82S3->I;Mf|U4jGDLB)QuOokmufe0nHt!u+*wc81^IUsI&Aj8vVtsq} zt9}g}-2JNW|Ha;~+Q?Ze@eG25iTm*rN6ML+fE9j~^N)(zKS-RU#sIFrq`i94WjlOh zA8`rykl((F_;vOB6WV^7oGwqE-aTG2?K8zo#y%xpvXVW7noagP)PLMQ`+peAU(i2S zjGKfCdgS28ZeON#Gw&r4?=>xvT(RE7@aN#2!nWPi7#EeVM1~cCydX z0*oq=cZvhg0l$TNmd;(V&(qs}OYr{8tKntDENkB}J(@u=H+qm;CvSk z$mOM&-2a|*WV!OK8hQf1(~Qhaj;0(%FUQCy!JeAV-3c$0yWe7*&k)b99EumPmw0br zSlgnp&(tkqt-iq;D3_A<$DU>`isKRe)%PL4dEfYid|)Z~1_#^wVo%Y|SlZY@F5gY( zJyGY!|6jv~ga&h(4NV1YQr&w&oV|59@Kv+83-0#3wYFcF9NKf1+-0;EB4^ z)EDoouM!gj!uc=o-tDX1Kdf!%dC!=>HafI1*Xb)Kklt%w>_0Mh(PB#UJjO2E89-m6 zk)ZP}IE%J*c7Yh~-KGAg7}HaA!q;Qv+sJfcCS)(U`7z`Rxtf@2<^8^^hdpUxUym!c zT6a8n_m-ixHLh=@si*yEU}Emnaq?h)%jhy1zr8!Lx<7sR zzSr1y?IB+oG$$QOGDY;$!2F&fuiruNC<8ni#$MY9bTPrVC@_-!=ydjkmxEW_fBxdr zW@r_a=tkyBrLV;!mosr z734g#96WiNxe6cOf)nXTtU*FxwA4WgHz_6qC?la)! zl37!jn|+4U&eN#8$8Vao&B(KJAg7yq3ZG>S4KH%|{IX4UPVsv9n~nc=zMq-Ef&J>W z;z=g|8h7yR@Ta%c69e@$uuA~LseugW`suoYkIC8W(Au|nuY~)L-!gKz_Z&2WM{oIi z$0Kj!^eg_GI@BM(<|f_G>oYlfm9KX+v?0A#d{%nmOXx$29blb1a$;Qz-Vpboaz7yn3V4?TCIkA?GDu|Tp{s!JBE@@3JF@d?n-m)P*E-5LrK9|_uq$E2o z(3fqWi?2J?TGm@Gtv31)e^?C8T{0oW#Qf#)?*N{S}P6@U06oU`DNL^ zuX}`?SC4%4fyZwz|62SHzQNJk%Fm4N11EOUhVO*R;&R}!_Y#e>h*fQZ)E2E26(&eYprjf{Zi=-w68o# z2lyV$Gq=4ar@fk>HLffeoLE9#*Tib<*jGv965K1 za1ZTbAN{JA;_t!sRO^)3eVpo7NL(X@VY%l`z-mt=wH5e*-e>)eUr*~FGv6B z$5-Wp_L8IPfE9Tc*N9H;j80GFwsN-?<;@eJDaJVe?296@Lj{wE=jX(87*pGGgc}Tne<jm1;eONAj+VPV~$j|}AcMU{t48m?1jE+D|Wuf2L zB$j2%zRX9hb(t&44|doW>BpLf(uj9{j{UsRvj44w?x5G&NMBbRxNO*Qe9Ja>`;%_> zTgD(cVWn7Wb1vz;Kl-)XxpV0~EB}*re?<0jDR#?4!a@AWop)=GXsb@PZFD>T^oZzv z%-5|WI;cF!E}tfQ`1wG1l<0>#Syx!$uXyU__;hEo)i#g4EqFpyeP&bVR_g3KgZMR` zO;es{V)PqX6X_EzJZIlEF#_F5I+?!3BLwfcjCb95!Jb@P*lZt? zexY$F|MoQcQ6HUmP-ob8Py@r2qiz4gNa`E^1NC*U^!d=r9Os_woUxtvWNX~ItKez+ zH+N8jr}DAL_h8E@@;}j5EB)n|JG+wF8sV7{d=1J$EZO^G{3%IiS`p<0j8yYGXqh}x zy63B*`s8@D`jmJUb9UcBN0}YfJ2~VrQhlG5c!hec$TsZ-M40nb;H&>3+FwQ8xf(yY z-z5`yXA=zgj+v@exxT=K^upA$%jB5ggo*fa6ZbumxDNbd2{so+g zV?TEqV|j@-gH~ugd!r}mKKD{&31^NL=J&TwoCn{K-Nu+`Q*ET?x#s}O-~-ZUY3D^B z?bJK%s12>L&V3y0XSbpEg4EwZZpy}0S09RzpAsBO?k!J(ct-d0=I;Fgo%}?(bK$@A zE11<=_$oYOu*~_hp3ipM?H}!nk{?5G)4i4AW&0hQOZ8I&skOSds$O%wCGFX{{#5cJ zrlHrSL{nK0!MT~-?YDTwPy+nK%OwM~ZoT=2?D2HkXEt9Ue>H0lAJ5ZTtpuhsJZ;C+}H(wP)uw@<$Hhi|n{_yjprqfce??gqXIetNQRU*4EAuyAd2`{-)oJ^qcGH zw~;v|llu!AqVJ1oUouU1G7|q-eB)c^#d5-5 z;rpSKT=~J*TYZTM`HK}PNU1D-A6TvDJ>}o{7I;dzS?4qPExAXG?wahs&qx%cC=Vj{ zX@gfTAD+j1qLcMJ6aIX1t#ZDQ-zb2uxPNF{d!e;WGEIDOXM2^cfAM?aI71IFTHyYQ z`B{^sH%azNcY2#LjX`nq;@8su#iJeBAAO0w#CL^*CDfPi{!Mt@3iN-`MQpUK|997C z^xx*sw#}47KWfLjAIO-)j2YdbfVs$?+uV_d(vEK>t~J2fJLV+)xh253(V@Ni^S6PC z@TVD?Gx~0!qwgAjWY>I#ioG0%Um%tCB+sF_Jjrn7176GAm4A31a}sO>1KB@!IP>RR zgOO937ru%-$pOJYcCz?E19nhso_k-3J?FNuN6Rd=4PEE4KfR1~&GY)mCGUYTIXREM zcirFsa?h0oUw3d}0^_skLFY9F!0QLX^9O+!oZYDQgMU7FrS_Ra5#>ECWPV9jur_!1 zoJmuEL4HNX?(1u>xAX}=G`Sxc0w2t)=6548Afr$9lE@1ASKKFuvGW-oc(vvTBNhgV~Dr&AhjnxS;caolQgN?a+oFo&N>qA-z9yu=Qe$ zoB`VVF=y`3zwXx9k+*5*R^kuJi0)v$lzSCT+WA1I>tE$d?|9ui)PVikoM39_-2tfoA5(pGZLU;>8h$LuhZNo`&NRA}u zgmX@KX>AG8-Uewq#+TaKnM<(Kxg@PKwAHH9&IsC>QajVp+P9f||08JcOfb`Ft#8Dt zx!>Pfd!Oucl2C1X|8w~m&)#dVz1Fjy^}MfVt!>sb)E;C1+R%{XE;>OtxB7TIW17gB zY#O)fyifSSckM?82q&FyC`Ot;M=~)4E??cWk-6BwoZJ9yuTSrNvHU#T?%T#L;Cvk9 z(49ZAKI>@bo7(RU2m2(iQt)sJe(Zss#hbriEJj~x{|n<0AD^0`c`-J8-!a~iKQ3N} z#ta|74j(@c4Hr;X^xK6WFMaR-R`H9-L+wY9Eb`=MsqjWyeqQ!uzyAy{(WUp7>0k35 zLvV*qBd;1i5MOZ>b7%1~e$HqQ-je?+-!)hsn%2+zo$mWvB)`iWra2X%Y3jfK z{FQHw)EDk~AI(=WA5)l@sqo0vw1@8rPQ;grsmW(Oqif_ z@8F!t<&Sg5^tknbtBd*8%H#6C{uv)~_NOa#&S2@{kMTXQarh4}lrIT#FI(&~@d7lX z^Lce2U>#9sIcN=H_NQ}~1kdAlf9{eL^D$|^)BOR;)%W2mSc9YeGx%kaGhYR!do^F^ z{g|tK8qxzoJ;7$IW-`BjFcJVdu>gDhE^))v@!}ywaW&4_c$=Jv8HEW@xS2ul_ zxww@%;f#c4_l$)7_KbvCyepg0(yaJp;sA4AS43ZaAF>ztMW3>dhv_X#KVE=-+&}eM zlVdlRJoH24*v())^=qHo-1S*<6Bp(@rZX#~6Xhu1js0~u}3vvsy!-2DK3 zoW#%dVgwh9cX_U7($AbB(APV+d-LhehZ4ke<_sW*UZUOYdv16-|M9$+H*gO2_JX`G zZ6`+9_VMz&KYK1~!|>ljZ-3;uuLdqy&$B7)KknY1=UjF$&l!|Y8>}X#^NI3%`hSo& z*ri|2NHTJdb`|q^8<-65xNw{@_!vKD=mPZX{;4DM>y94}-5&t2{&#-NJHqvCJTv9K zG5*B1*QfaAFn)jXQOhfY1Y z%sF|-viz3WW$AhSh_mEKZvJEGc`Xi@oZLsWHxbwl(@!D&^x%VebNFXwe9S#_`4X^> zm_uM)UvTjsJcs?C9uNPs-<1B2?7#JlzE2QD_YM&|+C>a#h}=%eYxy9zLrdW7;WNm_ zAoJ3K{FodqErb7`)%8cua|ZLHOUr(Y{1<-Ju4qB{+{5^eTY%TlQsvdq(rP!(GaQTe z;_zB8`IqP1{5N1(!FwwEiCgC3TsDV%<6*wGIRo#bzQ5na+>5W@1{dD?`|MyjXM+X% z9BjA`@m%(WYzl8Z-lNYTwq7BBoFzZdK!4K9(g|KW^1VZR^R|HBUgkZ!9qV6=vi?%3 z?;GP2K+mG@`@sLt!870NHs6=?`e&ZZw=2clleVYIJ?Yn93iaFb9?D$*Z(YXdf7egi3NJf0f8(g~Hxz$;k#;@>zK1H$!Ct+v_pR;v=JCbo zfJ@NFmtybd8higWaI3R6$0IYsv{Nvltos%6oQY#E*}}Mcg3iODAM8#O^H$qyY4;fW zG>z@(oVj}v?@Fd=PW<(jQ?HYp3zcDq4&KMOG@se~hmE{ww6>+}ZRKxKW^Buy;7YcW zXt_VPVhKEI;yvE{pQ3H8TfelxzUQ|w`-y+N0N#VSiqqu`RATR*QVfLgegasm%{ggc z>zhM$JJFHP!jH03dzjZAGq2+ZLd@k6u3!H$-@(8qlV8#gZbeH+kR`I?UZ)?$5T1k< zPXLE_iSH8)3Wvhw_rQbA?c%$)jN?N_AJ;G^@_9F*ldG{?H}o=B=FB4MJfnC~9{88d zB-{r0Gxn3QlPw=t(T@81tE~1bP5H#WJaEZAa5Mj}F#nqKb?mhW;NwXrIMG#acd6T?P?!ia7#Jopq$sOb;*_| zSxc8}fG@`f?s?!!BP+%aoc!6Lt6pJzW?cJ+_q?;W6?p#N+7EmXTIhTa`+@gTA9?ex z_XFQ?mi@pB+&O;t`+@EG$J)>T6W;aY@l8K+^P|vZ*)cC`Z#!n)U-a^A-g^}qo`_8K z@}ZujtaG~Z`RuyJedI=oR*$Njbx|*e$-z(gDrIKx^l0ZD?jJip$;uJzF!pnL`ANrU z%gav^eSd3={G`M1;Mww%UYh^T{a$X8a*~vvbVf4&l5@*;f8reUz5FVDduw9fL1+}& zW%8p6$bH#A-L8S2co%s}J?IL3BmN!uTryU4aJD=phqY}JU!?C}0;A5slkI^$(%nUl zlGbjvg7;UE!=C?J3r^IJXBTYZUhix)zxwX&*t)>jl+^Sh3txNs<9Frn9AR9tfzFn{^Y64LI{CkmzcW_8N)_Mh^45AL1@eAC%;fSR z^!se=AIZ+wScCZ`G!?vk;+H7jKAm#s?XAxhKqo=B?kTtKi`3Iug{N~D&zY0=ldEp} z%ET$p^UeWuhuZp|ZaXUL!v2;nk?cS7&erGTTWO6$z8Pm|^@gBJ;Y;uRqiDMGim&!B zK6I7xpO4U9*E{DgmY)W`4vv+-;+KEHV^xFsoK;uJ8n1GroPQ|aSa4CW`t+{+;_3YA zY|Rkv~N~_YHFnVzfIj%eLrRQ^3K0g z|I+jJ#*6q%^7rtxhpQ*@?x&|V({^#JXxgIKH>jJOwmA0411GERrOvt2X2!0ac5Upw zsU6ibCp!;)ihA3o%>u5{*tHV_51rzS%W2@YHC4sb0@PsWW4hfzIXor~Y~MVSM#*z^rkv*SHQ<^UlDy zz6%$u8H@two#(E9x+;+Obl!LJ^qr0FanIbj`OdF=Gm&>JZ!oyKA*8 zyOZ!)Cv6_)c>(uM=USaj>-|2N0;%d18o z&l~7r|9DoMWjwe0#xrr0@m%PR=M(ODOnm&ePVXz^QoKDwaZK`1h%*Pvw@$l=wnBU_ zpbOk-P8_}u5d1p1cZHnse<9bnwU08n`#-l5XV}U^CnM zm6voMV67-G^xo)iAM@q!-%mGpGG{%Uk7xRO@?vzrguZ7P`xgh!^k6rB;lc9W!_?7U z57DP`diCv>X2$jykaT;%2is9_MN#h!0f6Y^w-!t-H*V$x}51J#L<30^K z(B8KegQLuE6?wQh<)lU6|IgbScYfT*2qi;_(sZQ`8 z*A5;Aru?oP(|^uexxFWt-vVM2oej`Acz+Rme+yh_Ed9B8efnO~_lJfa(R~-+CNX8` zPnGrJUw1+eU4M})-S|xKpY7O1&pXXr*?IS`pL+Av;m+6leDmd(kKQ;%$9Gd#<5M5w zI>DP{J>xtm{EA+|-*))0>vQFgT>!pML*Jd}9b0}I>ritpT6yMP==RW$h#!U=v)4-Y z4R*(zJcsxT^@))zzmvAt13&p{gH^QolID_c%~Uauw~ZppMPHsh5eV3CG^Ot^%erSj zg1+UGe$JX{#y#IJ&A2bfx-ZPU&zWiM7q7jX>)rcbIP?8$#NPUVVAWsteU`m&)U$t1 zppURIjyj!}bZ6NxM`gpjiF|j6(VIHhEGwBGbip&&Fh@NbMsYaVFnf7s>ha!{(A7)B zHjHWO62o`o|Ip^|gvYsbRCs=x1&`##Snzzv2hXd>u55S)D3gr6@7=(&b#!>Xkp<72 zjBzY@7W?3NW)yh7=fb0S#t8iEv-WCwzRE8fiJ#8PxRr4(f=#p%Fqk_f95Rx8~H#C?E>^f3%WtMG+WVA z4m_dY`?KI0p1;58eGU7`%day!0)I$4EXZ#VIp&bVflV-HYmW7m zys{^9ob3hJL!Fd|-Df%H5=-^PrOT0Vk}>`=zdRZlE64VDm;Ix==cw-|h+_nRL+}cY z9Q2dFKf&N13u7EHmP3r?^Nt#$jJxfZcMT$*UKhv@Uv>eCeK{ zWt>wS=e5ugZ_pkp|0&ipcb;uUwn%O-epCli&8F`{LPuZFifaz6o+>V>` z6RsG})2B@P?{zl2#-?ABn@e9Wu+H~G`jZW=J^wm0;RZT3Q%?;3xo0DE?*W$v{u~~@QO`YW5 ze?GqNDC5%pbFE7lyNLBr<-vCX^Yy@-Y5kP$qAkJ%N!^lMeDVPv741Y(NCLI z%xmG_%q3Ul!)HRoa!$H)#dye7IYzEZ=dyn0GW} zjlfm|jGKT}>#>}n{ghpg)qB{sa}J#6+}qVqzGNME*7(l$-d`8KGbuRLxjg?7d(M0C zm~&$ge#xKd?5H9?*ggyF*ueLL@((yW9QKgpw*_{DCh_~lz>dHKr>=r=7X10#ZjJvz z#{WUaesX_6v^-}gI5+v2+>71}jMV!sFsja-%+rB6<-P03d+A~=x)3=!Bid57_hEAL z$t}H;vKf5OVDB-TYr6fr&W(EuI769l49z8`<;mxP+;M&DxmW#z(d}hz$DJFW;M)h4 z#BHykkC&J`wGki|>(#rCc3Y`;h_SY4PZ@A&PFsjwj5eo9#P)b`k2^bhu5s%2P6UtF@_S!k$H|#a z-3Ig@u)N&GwQ^CsT*v@2244%@oqaC<cmC$0^POF>`d+ z@ErYGI*&Eb0%DXGxpSoN7D{IDmtNTF0xp1>WJ(W z_EYcU9JgiQ@(A?yeejB``nBWC?^gff!LQM-ANLy1ChGaykbIjC+&#>t+L1q`wh#Ye zsBR{0KfyQWo*>^$<9Ya8=U&4L9f2L?#rX8t?Bt4kE7;>RyBvJzj6Ucigd7->?BE=K#RYmQ1JAwyoDt|uxf(lJBR?Ve zXTFa%$(&zu0$oR*$)NH-gXnMB94a&S_?EgC@1KD8C(~vympoqg8yhD$2SWWEcV+7L zCR&-g71;F75!P}9_a1MoUw3vKo`b%nEJc~lqfxk(U z5D(()-hOnn-i^5Jp_k_5zXtwhk*mU3@r%1}B8TLs)8}TDSOi3oBcNaF)$}R(5>(&Tkdw= zQ%&kt?Q7V+mVZVk&9iN z<;k~aj9itxlIT|T`+9aK z?bp+O5ZQE_E4RJ&P2X<&o*X<0%)d+i?MIg(o1R&TZRg3RzXgw)8{I4a>ruX~ay9d) z*j*3#MB3+~Ia4m2=3L*)lKwtJe@Alb&-76L2r^&``4>-M*BzFgfTx0vv*c>gz<#SU z`p3{2|3*9OfGK!mQCeqsx+3^;#Ti#$oH;#;zL>$h3~>gd=t}t@ADU%hlDz1Jo@6s% zJ3iC6YC*SP_iV>=kjX!XhQ%kc9i`JA!9K~h9S>7>gnfo1zfC>Se4Ba&{ps7(k72u4 z1v-Dk-qhd7emt`O!+fhg@1X3-eDqZ>-{?WEKU2^G9Q3LD{bzVrxREV-1^sJ(M!@Vb zy>f)@I{6%HyXsf_L?vUU6Ccet{a@8LDBRH3mGteG>Hjm}*{*yS0Xq9D_|@`|wVA$Z z?!|YL1_Iw2syhlUz4xS$5k;z4^Lt!HD_NTsfzXW4G;FHrjkW3Ox7F$DvCs zy?eTEhsFUe9%WAcgy;F_kN`SbJSdue`C2P)E`e4*&2vkySI!yF{4=g+oU-eUY*hW% zX+!$WlP!;M{YCmUI?UCL!bPh)cD3c{wUeCdw2kur4_+5-{Fe7j`}fXE>&<_qeLs$+ zH}|=C_H?h>uXAy&cGB&0c4;-`|492G>0@#ObEF&KlP&yh=g+g%y|y}OtAcktdp%nh z>ulU5JWud$yZgR>ta`sFh^kY0sD{WS9@SR_@$3D_Mh{fH+Dad{fKg_+a?VV3$Igq26wdeTj*Kz-A(%* zjwGkHfJc=d^!hdMS)Tn{+S9X7@@zkUo_%lk|K;NIoP+OkEf-%ik0(mEWfPom^QIM>-xfp7EL4D1lv`zdnbVff0}BTtuhm(lhu@Z>F@Uex`ii#sq zvvvlq9y1vZRzB_z2vVl7kjl&5BZ^eA>R1%=|kgqkTGej8kfHPR)LPb z4w!e*#s$5TC_BjFPVLTQ!1NiHgSv5+PjAK@Q0r%+_<<~Z5e-j1L;*JQvN2=1lykJfg;#=uCGU2e1#N z-vzVI;vhzA&H~uofX*e(QO-QS0j_t~-EU*9+oSop^mWmUe|X>!^!`v_@|}MU zy*mT+>!Wv_m;L(9YvH9e@D%$v;@a0-Nq)E8Gn=L@;3KV*dBcVYFpu(wwt~k#{HEh`IIohref&Mm+Sf7G(~xC@B&-k0zS4e_ z+2=6#oC|l1G57M$iEFVzsINJ@fI81}wp2OoKghEN=3Vn7+jzEP=Sh1@v_}N{bdVf> zlcyd8)+1^Q{C^++Nx1Ie7aI>*=`10yY%||eU(#P&-mA6K6!zaeS_9zR#+DrLjnC0F zuKaQEc^PYVkE@S;_*Eg^+i^Mh1I(ND;&jQ^$~w!hi++d^0?XOICwt4d>o5!3*S*e_mU>`p1c>J(A`Ot|QJAFp6 zQ*6}k8N`9Eabu_d0j;^QQ)^$l&*lIBZ=Q7^BlS)PI9?5IMH|>`FKZ9Qa4x`jv$v=~ zHaWQfvcb1fzlFK3^Tkcs+mOx$I7OSvvs3K!ON>SDiD#njoCz1Np+Ee%5Zw+vrTp$( zXxn$j?NjVQawPP-yFI>%)0&v-(KJKL5@HN%e7W6SY;2e*33A@_r)0d>(Is(zo&2C|K;)} zEzpE`BZwce&OPH%zP;uheAa3Fs@Ii+KM%Y`__(?ca^DaBC?6CbDV`q2W>YThahHCc zyv)*%;$*VJZvy9fm$TwaUfpER*F973%894!`3IgHc#3(KEhSxV%f|QJ0&R%S??UGb zF7MB-7X*6;Z%|H(Z_Oare-@8D(>*#XDHdu4saY}L@_*>ww&qD{nyx_qJFMs?w z@vqLPF!isu^&P$Id;i3A?LiN25A*GUpFZex-}|8Ras^`*-zpZVHnc`T{;4@@_jO_z z=KYJ*Hs90&27Iogjo($g-o!W!O|K#j{4s2oBm13ap%oLae;D6NxgyF3k?aZv*~3fO z5&TZ=84J>%e!Y0T&O3f#hVZ4cOD6O^vVYnc+4=C%l1cbJo(_}@Sb+`*frl34V3<6S zUVPOkd=!F@dfYy4pncUlN#F8iRgXRg1()W8aZC`r<}69{(-zLGH9jsrIrYujMJaWD zdp@1y+UuWS4jTM@kPXM7_;^-^}7C{@e51&wld!xsn9;H1#YYlIdOw%iMqpQ z99=Om16xaNX}sDWwK84jox4}$ts5Xm!nV_5+qr{zTB17OKD{n7V|ZP}kzE9yPf^x? zoiixkwtz9%_9yn;34V|4|47EU6WWLP1h|&mw|f$;ew~6}c5()M;#mK3lJ3R(tW^x& zpgmFEdIjgIRoe9m^*6};3%|+As;rZMC= zH1^{7RlP5PGwlo8%N(A*u6%HvbI!r40B0h?w|UUOY1s&zY4j2{!)fXk2JSS^3V9Y} zzgsYHj@eK46yL8sMP1SBOTZ&vM0(qc7yKhUDmsvylP{;3z+pqT69;-kJHYDEt#m+M znr4H2)3GN?U7BTleR-cPKhp~?v5jQ2u;z#kg@!%aJqBz#@2Hpl3g}CEy%Rd_+5fN0 zT98Xo=y~fMoy$61I_`y6rqXBjJECdt9n}|n((Up;{51U_bNvG60>~!VXZgU;we0ot z&q51o!}_%zP1tkBKaY$%2`)XFxLfx#bZ=?qbGkSF%%p*R|2b5bvc9m{C$|E+4auL! zFJ9)m7ClR58o$Zc_Q!l}Zv}6=xX%;Z{H5!gzONWK&e&vwm^R%0%PG4}ZGis;@Tn(z z^=tF%b9(h{I+F_s59-~&;Jdvo4a7W6OjWeLiaOG-oOe@c<$V-8bI!Sp86Tp6y^5l1 z(bM5ZdoDV%f3P1v!1xmA|C#h%g)AuCGQV5;+t~i9gIzo4VsS6QAHCR+vIkGY2eKO-^aAjh_6xvCVW50)9CUiydB{iX zV&zZv3(xovj`)Z+j$l*D_Lh7U{Ni7ID@0>s-F%=E`6yn@aqY`};I_Zg+LzLKk}t{W z$R)K!KfUmbY)a9J>;cIZUCXX)acy`9A0dbN`3u=+`|bMqo6T8gwp8lO7VI>5jvTUw zClha#tk7IdK8HQL%tI6({mWN5b)|+c?Rics0uu+87Tx#2Rlxf*V9}Xr+Ore{7fxXE z!E)xL9G_ub?!-~gUNz?!^PM8StF!NhUUZh2^H+xKnRSP6ak_toJk)t~|Lk=BXfmFZuWNWsbJw=($uNxU#oM>W;LE1P8P9%>9(G$|IEgvcGwfLMgP{}&y z)7TgTGuWSxoVp6UDHh5iJ2H3Nz@nl%AJDlo^5GRb_I!KMeALL(`ZMx9<=-x14xV>& z0@iKcW#o@+!iwBU?4u?gUm*Ege@61&?*qSh&#GSeo~P$a2TU9oA^)MZ6@keEFTqoO z`F|RC{PO?H#K2BbSLgEG#<=A(IoPR3awZ>afmZX;Kb_=K6jQEoczR(i^Q-gxq-Tv@ zAP(%skfj$+KpV>IID)+Q^nz?3eY-(=;jb8%V(ZciS2*lRMmIcJvN26CvhJ4{&RNTY0A49%%ol^XsDS3fUjQ5=V>gM@`5@PU^`~C%f_1X|U zn>NyQw5NSi-?P3tqG$1{e_Y2H*Ezr`8ql+}-1d$0E$LKuoITV(!@cB8z&$(x;K_Z6)2Z?Lw@HpJw0eN$Tcx zqWj@NY_f-Biz!xgqygWq+9`e1$aT(KcjG#pOOV5iSN2TjQm(ND`X$q^;}04Y51dA} zmoGuK3l7>1=di91ECayud1&Tl;M^@<<@~5YcuBEY4L{ji zgtK_P@%FIpHV3+8LIy8@-#-?OmhC;rdfR+rZhM^_-{-r7dy}kl5wooaKb?zMKPIMz z-A-L{6n+-iQ9(@YcFvxzjIi!C-g)@|^6CxX{nEk%5ByK;5Xs-YoZAq-1Rjkxl=U|T zmgxMM%Cm5c%R>#lK1zin_oC5`)@Y3MTX5NCq-{Gc6*o8-tGC$_^yM28}qIX)Xu&-ILG9tOmueq5?dgDGC3*W zGQWWQ71p6xkJ=HKh>huk;X^JAdx0Sj**F>um%1<%g3o)Po0dzR5@G~94zvI6y|(o> z^QQ3}psh~vY#`^Lq|l!khEPUk?#atXPuAdT1fBmKDTo6)({kgXacr z%)gH{SbV8M=xBDqi3iY$zj3(lZ$A4w{rFA(ceZlhzy0j*tOIZUcaEWZ`{QSS=LoTG z|2rX_S<6_ZLvqmho5Ab4q4m%G7P*rD&&1_e&uRJD&b#wEzqDC?%s%ppTCTh5;OV_z zx?41qckdIwaRPYlK9!r%d&CLz{CB-8RT2ZzT3<9CUoy$Q@;S;PsfIq&vcmg`(LznuFmf9_pd&QuPA)qnO3kuu7@^P}?@|BCjr(Ubk)-<*5G{7P3Ve)k2{MMn;KJ`DAU@tL`;z{ZvAfgY9|aO){Y zLb_f$D_hrp6WGx8cNM+|T|aw@Q~H?EH_(==>$f5!tgh!w8)Qr#^ch6oNZ03qC+Ye; z^bN8kt?T~|_#R?iSn;&2+ja%D&4Du`dud47LFGEK5hxeBjN!(M|A2BGgNHx{OR z1<{*7SE7*oIdu131t)-mK3CHJr^GAFk=ipp7Pt?aT!|^^xS`*lVZJ5^j<-zzSDOBR zZ2F%HZm#T;KO?_p3jIsx<5P^#`62xF6`W&vlHYJMzK`$^-lO2_Bx@a>jkS@!6jS{U z?RzwK8oS^4w$LE?Ue>qeTDH7&fzBN2g{QmVXD?2&4*R1AK0=ibh{soP|LUeq*re6i zrW>(QH(;x}=VIpCd{zS=bp@YC*NUSlJ~|7ygfq#lPJHu!CZ4_myQ)C>IWA2r|IPBr zB*P~`$w6o=2#tB|iOw~L*SqcIyY0O|y$0|g8Fg3@_$azuK4vD+Eji2x8w}J zZY?!@;`yZ45NAJZWNV;Xxk83tnZvQpuU9-){GwlvUlo@P(x3QM_&wwDi#fj@e(5^b zDgA3Bv#uJJS;$$%@k7|06`c35&gGXX_yrl9=9jDJOZ84NPSwk%GZRySZuNa9(QO&; z=DX+Idvt5?0$eXZ=l^=O<-2vvebp#)KTKnjMx`;?o0i5V51e{&s4gFR2+8jy1~~<} z125jCGuezx;!L*b;MRLSp6A}R%({+j3;c2MMFC~RdQG0n)%N^Q z=aB=S*zlZmyW&A*(J95>r%lEE&(`-zx9=uUFgO$mvmm9A6;Db2EXb{ZQVcb zyoG9?MeA<0yTbL0MjO-9Zo89c_X}4z3)Su(+EpL<(IsVSuVu5&le}W!ez(0$IJK@b z?CX6i4QEMN4dXxXiOs`fZJYY8#`=|X8>M9$pEp*)^o2DSF3cY9yB+JF_}UeYys@Uo z>CT-uH)bv7EV%oa4|lJ*aP9_o_kl-?zp^snPB?tG_}k{TIWbyN=8aq99c%x)#{+gf zJb;ePLDy!ji&tXv)s^?Y1RqpE^JZT*y3+6ju};A%+WcKKxWa|43i~k+dJ+8zM#0yG zuh2EodHA=`!mY@hKmFC>?ho?2B)_bie5$){IlruXlJnNxH*x*bHy3wr;rEft%hLHx zU9^)Im~yZzz;{&UE2jlt|I^Nn|4xe6S3iU;YU^Lccetoe>?eeMluyj(IQ@C`P7)JPJtH%JytrGo zgZIpFpPeFSNj3_x)g9=QI_b{nZ!#O*`E>6Br{9n1j z#?B>Xe;Qv!eHl1bm37ad&6m(!Z(v8hPV7f==uO4a!BJH}v~OwbJ1&hWR+LBE7T(PB zX#WCxL^LHir{CM5vHa+=vbRioSM|MV`k2%wS}Fw(q9L7+Av|Qm*$b_t;oMr*{UkVf z5S;v$^`@73M=)F2Hf}(0iVyHN3?Dp^p$9T$+{axQEgzJWb)@;A6h0l!p?I^IZzRRN zGa2mK8v6Dw>E;sjzQ?=z)&9@decyLbZi-^H%4LZH^DnrT-t+7vo%we&x==jqo&Wk8 z&%JfsW9U%gr-NPCIW73H`c9_o4*fpK7>`YP=l-3NRoJVtUA5oyb>BA`M*Fty_z#r# z?#;Pkz=1w?vp+_CD}M%C@f*_ZN0=}23kH?X6U?*u87edP7uowHx=?M1Pdk9+KE8{0 zWV+3vlI}mr*+E1XFR8w(|hRe72>d( zcQ23XOufD}@!cc&)83hsUFPk<4LPA7`{$z*TJfHZHa`=eDevv#n<sdMD7oV2Er}zH1GV*Y(+}1mm_b2p8 zPW=t-jnzh&dDnZAor0?zJQ;ZI8iq%6`Udv8_bsyCDeuSzHhgvqyrc0t?1#^s&ynZD zv_R8ZuL=Iyn!yP_FE{6a9AX?n2bxBfh~`D>qWO1A@AooqYD2Ve-ycBlEcltcKabw~ zud?)>qRo_{_X&N?$du9OK792%lX|k~Id~=KW%DPT9!FLL`Bv_9{sP*+hRpdcydwJY za3*<>O)ulAe+Bgy^H;+4UdH*!%Wr-#K0RWIDfcm?s4P=Oy=%b6cS&jl<|Lc;ia=WD$Jw)0;|-O{6~Z&!>G?hshUF z+rMGnJy`a;u&7>Vny1LIqMqnuEEqam914!(;BZv_>KVpIw#d60jKchou%@vsqai${T=cdFS+`yw>jVJwM&%0!Z(kwlSBg! zw&zdaX|*|%99I@AlJIh(1+5f%7~aGwn>vCzkc@edqnXdw=NkCg0I_n^rOw?|ijN^Su&JcmEl7qUY-h7hja!2(7%2 zUyr6o)5n2jHc!Oq33N{dkEvT$_e$2B{4bVOh3pGfuBs=i{${c(tL6;Ls%7AF>s8n$ zIrg0Aa%9kA%2J%0R7b2YJFi;$u`B0y=T)aTL+oC@=Y`IhVCcX-lK@&V-%2N@Z}Mo% z!IA3LaW4Gt+gB1Ey(iasKxouP@oxi>b43y0u-{uWj%XfcG@d9pFc>{P?#+ zk9c|J4mQru+(fp;r?Ww#|ct}(1)41#eyV|W8uJX*i+oBYnC>Tlcg7{7y# z_Gnwbo}Tf_9?p6$cpdai@Xt7hO8Z2>Y1GI7^w`yFjUFqfED!&2MK69Ju=>yB2~$_{ zqhPAOvli@|jSPgJ=lEsMI-3*MXU8K2>RdJ_E2MwSOZPEIR! zy!IyC!Tb9ezxO?gkZYe5!?${Wch-1QS@-_FRlhas`5zlUC#}326F=oy_y~r|mlX1c zJ+WQi=g5XPomM2Kjq0I zf>XSwb|nXX!oF`ys}uTE_c%7O*XOn?p=0>XPwRqvp$oHLR_yb^oDHuhD?B~y%7~*u zSAGWFeJY-e2+@{T*MnEE_5rJ8e*v*?KW{C&GLzp&(`V4|QQ6+I55{AE%f<^j*a_C( zWWUCLoxiE`5&SwW2;PmqiOd_z-`tO#G@85=J&rYg$*8mVA4mVI{Ew2X@t>G9(*IcN z+H%=rt^g07+%t1LiXHeLwC8<8;_n_G;yS~AJZkVV%6tFHdwx2*mcAb0{cHFYp1nUm z@2d=ZDdV}|8b!Yxm0W+9`o+NL>6g2(i_fNCLRs?D|Gm4}@)^!4e_L`bc$tj@I0aj$ z+3y~W{=K_*_5RKJZqn%Q+x=rXy|1vo{q}xr4Ehhg^DFk-2KsUW&Hp`cZ0od8sA1YM zbnIX7H=R89mEW=FFa)rVZ#8r8bpI{$(E?BSW1U~7zKM0_+F0jt>b%0bxyd=twQ(`~ zj@6%%Ed{h+pmSu9tJ0nR`d^>)&LjsNpg39se5m;py#6`Xz2oej=9TrJ8$4Rj@1JJf zd-c3J_hvo+W79|Q51@}=u>5gD8-a#thE_Zp3AKz#BYyfg>-&5!XEYkgrjJ};Ftov1 z)$*$9HY^_hg&_*n2)eKAJYAd!<&!4 z!iMnP5&rYG;ty#4m^;}C$V}@8fDga^knWJpe+XIO*A-v#*(ASDdk3@H`?Rk;`#rhL z?-8qyEy(r|F$A5x?YJ=u!QMZ^-CIK*0BaBrTbL*I-FAij?!<6T*@O`}Wvh`T{+u%Z zeuN`AzFZ7qNZOBZe4?$t^+C=qBL;k$oD}8zY~?KAe&wgIZ>9$yriJ_0W>oaHaE`I| zl)XlbRr_F+n{|{nG#;I2-Eld%XAWA%DONM`TgLc0&p54DcYoQ((^{*4vpGO+Q095% zTJvx?v*2~UZKO4jTfnhs<2L?;x5A3GgX^&omCN-n+scW(XpKa1A?NM&z>xo0duI9K z+^Yt#xd+E_W_kYYIlVluI}zx-yMO3czfrE-9oUr03tCD0Tki-EBbsz@7k#|J{%`Gv z(3rHNr@@BLAfxk2UKo_|4Z2n(zEuZ3> zuJ0)L`q7CVtoj|xz8to%E3ADjnfL#Ief_84)o))ffWC}CDqUX*guRod9zbBi`yvvTAfQ=`)CHy1D<}zN-{yq26q5D%=@Bgvk?}zTs z2LD*OG`o>shTq0tXNAgFsH~sPB z?)sefeaJ8}t`k}F^Ks>ayYX8Gp>3^IUWvRJL|*-zT;)e|&}sB}6a9!kbM~tr<)L5E zCw>U#mOuVH{RD`yE<&dLGku+)uTyUiJuI0oxu-SLHS~3izC>H%p|SER0`$L$Inle4 zdEcEtUO(f}*gtG+obi3n@%zBHyzh&Q{r#s&=+g1%yPpwjEMX1x4BwNP>>R!PD)Q&2 z=zLN7xPbn;aE>v7Nusy8);O1=^5jb~u+{Kf0uUiF;AcQii( z-;HB$(?k5;aQYK>M}K+ybN`upLEjO#&3$=$ALdb~wsO6FA8U05oH114bU#o17mC)u`I6uR ze=ppz@y!>>X?^rfJrb*SE8Yp=S4fBY*Uya(bpit+#yc`EB?o)U=B7M|Y|(cl<%1N! zR}aFQ`;ad^{NZoi&zfXu&-6^Z8hmAyX`EUkQQdvsGdKTXE4Whr$U2wbCA(I0En7%3 z?i6RO4?YVPOS>;-`S zn7@*(IcFBlqtDs7SB)w^wZHnrIcF9tN9=5Mj^v(MZ1+6a{n6uSznt?(9p3E(kA9le z8u`|&GBfX#J;A&m28XI2=H8zDzKWclN^I*71frtYZicb+UuxBpgskov*1 z)^|=0xBr%b=YpcQhT%~ko(<>OX^!t-fa`MpuE{EcE*(A7um0&59yGtK^*Pu%<{x>{ zj(4wL-RnL5>YwWA{*%66uWgFh@NL^vS+4u%^{aRFT=%+G9o-9#>HK;9>0ZyhaxP6< z`ei-Pyr=qlu6wnod#_#ftG4uyJbBV49H%uNZi*zF`g(g&U+=^d(dKB3l5Nq}2>0#b zL?o8tzCGNyJ>0CKWJg0=ys3l7$w)ZS*uu+=;Z!spOPXq_7V1>RQjtV^BEtVejV<9= zb0pNnO=Bw36uLf?YKbO8wvA9@I2MY>TK9w+A|V4sQz#ls#VL#EBHc zp0m;PADRVp;kIOb`<~siLM`EBDBPNegqze>Bo>OcwZ{{5I4`t0a(y%wO+~}4(WHSi zME|jPDwOPKck4Kfdr~d&Sbd@+mWsAT7)e7%v^5otB^gb9z0gwM5KcyPtF}Uo@wT>j zY~C;g&az}G5sft`;~j~{$om~Cw1dNtnhVvK)$&1{-Cvndqc<{@F$%y~r% z79?kdW+p=}1etZ6rg+4H+!jtXwm6O9#+FD^eQHm8B(!{asCvtW4WZj_r<*!T>ML6! zjoWAY>J$nZz@0w~?!3nKcE{G=)NmU!6PiDu(GdZ9V~M}VcdXpmg<`A zR7)hZD-n-1hmz5cM&^c6i9Ml2#NwTa$n1Jvy+wh+S+c$@k_xM*tV%Ah+d5*6qG;w_ zHCy6M&a%cmUTJ9NmQXkqn%Vw-A+VzzPOumcCz_LmlzE7;2(8?+#%r!J+}c`^+-O<^ zpd#{AcXPDiXE-VtjGSs+3NSGBVXL$OGt3388x=(3|t99pwyRkShX0upa8bmn&? z6Z507#@3Fe$ozJL@P+e=isv`l>-kMow`iW%!rS#pA+bIcavNH^x~{&q>Xy|$Ff}y) zaNkWYDWNCb&CYnVi4JTdwe(O`w|b+m2Myi>Boh(C<>~iFg)rW5{rlq$mN5#Jhpw&J zvjGCB7kQ3}ku-Q2os1m)$hKF;=6g9WT8^Wy; z_wJSVps_Wc>_|v@x>xB3@g`Hsk5|+b*%t0-O{o>{l1KIR+jnK$hGPh7t6t1w0ajlh zYU@a*q%s&|2yGD#S>YS9b4fEhI>N2*uC9h8W}lS|32|J75hQKlJw`>)M^mH~-PPpK z7Yd;{H2Mn$idZ~$y&B2lltcu%fHn(_kOG97-%_4z^Nnw*KnGvJuN}~mw$#v zPK1X4yFkfk;SU2QgFem<4YB}&e-9$k@Q0ZKM5HUbOcU=(bcqT>vu19Y<>@%+I~s$Y zJV9uchnYh^mDKE6ok-NL-rX2!7g27M;*TVa?939G!(_rcUj53}a5Cu*HnO|Xh{Tc2 zua*2rzw@s8Fbdjdbj&vN5<=P8eEAv)X^xR zXw8#R>NEm;q8{m;MKCZ?hE!p+$;b^>Wt^2v8Zp%|_x#wKGfG*;bKUqg^YFEO6QPq( zlL$GP30q>(M#*|h+V93t=&)~$u8Y0qr1Cecu3lTWE=^jYIkJ+H(PlVGy#uFLyQ;Rn za?{3|ipsioS-YaPvZ^Yhu3`E)*u`F()tjo_HtSba)Kz3uZVIQu9ve6_J^E-v$we`O zJh3WeKRT79mAm^GAIZ~l*0TVy5(%3cjo5CQoxw$$BeLSR#J0!cyJ9XG_`u7U%~581 zm;(G0N)J*7=#qG-74t<`Au8a=7`+>bb+m;Ho6+MMj2S$W*erQRwn{A0jPBm)4qh*h zd;dal zpkNrT1INqOrJMII;biJ$gVwJLC)Y&6YHRjv*uogA@+;@LMyuhox|%f`D%RH4Z`f45 zw!U`D%E}EDwY9(7qHo30Wk?BzgTB(>AY5bqRwZ%h@ZeLk?d00xVYM-~?2#u~4?QwW znI@_FVn*V`sMebQmp!#RcDmc13aCI#QuXA_3cB%y_`p%N1iN`Uy9rJvg*ROHyMjw+EI@X*Hy+5?Tu@>pPZ8*??j;I&>E@RZ&hxP8m z`bDkL1|0JGMQ(XA)g=0Ns{!ZAJ*h}VA`#y69z<#b?}YWv=t6b4$x%HiE7AQuSJc+m z)@`n;UYjvuSK@@QF|4722(S|~b8{#O_FJ2X%^(8OjGV=qDiEuO- zSvuTm$a1YG5#eVaBWE-*wkEZnZ?TPhyf-3-vW*L^m;V4V_DkWhu7^pz#JMdVjbUfF z)Qqe$f>bF$ZmO$j5y4qOrf%?jI6`SjCs@Sk4)0f{KMbu%W4OcE% z`N6u?^*2;iuNoVL^^CvRq9Vc;% z*%aA*y`mt-kdQ(WMu+1f#`GVRSJG`+PV)?XNHp1)h_3XZGTP|U)zYQm_V!4u>Flt}92>g^xW!T`HW)s!b=KwpwO&EFv0GB7IICDRzoSc4Om)Pdr25v#&d6EV%QR_& zOUe3F)W{thBenjMH63hp*_d_4lxW{Iy7}bUT}4FUOn9l@r?1CWI%A?G-Hfx^^Kxe< z=NjMFicm<_53S5u98>+cN;@qc-DQ_>s3j6^H(>&N@l*u&jYSb-)~Bl~z)uL&1~YL3 zlCAO7+)x9yoN0JOWlRNZJ$#68Q&VVGBV=KsdFcjb$v04RE2~4PQN2-LuO3+52`vwO zXx_YeA5OoJ?$6U6c3~-G;yN>HGZN9v7{i_>Jh0z>(;Gh8E; z7dmQ7S9S3kS&)B7^P^C7Yq+hUDLm!_)a3{XXkRHF^U1Uc(vgW&%Y0ufa!=fap)R5T4|3}wy^OTXi_ZXb?ujcg$@gAww9=2TPv~a zrAA5&mz&@LtK>v6ShO*rgJCCRwt^B;Q;n&@439*TCfx?XbhSdvJ(@}y`IQ_2w>bUX zOAUoutiH^Y8Y=%INR8p$UlrLIZHzb-a8@!^9pB})19oEJrkW`2*h|~SjUAB=D%+yXkw&vJ zaZ@z1E7G(XFFulVSa3^KvLc#tnCECi!YmBgcmXACkwkb^q@kl3MYT3e8bfALofh^h z!-{s>}%Mk=yR7?_7|YZ8&2reCL$=!sbas>3anM!(6%fp`FM##@t{m3H7% z+SL>R*&1*5Zfz5*NId{^8{*BxXqp}OwkEzSl2}E+&MVkrcp<6VNUWKJi%l`jKr167 zK<=!H*S2(|n#>DvoIFLih-0jZZ%IZ7qGR8toK+&#L|r^i8>s|AAEwKeZNO>)j~0Qe z8#`Pe)`SVCXiD2#!U`8fQyooFg5Ta;OYJAXU5vhd*K;y6BF0YeUQhv8+7?Z;(TD$a zJ!u8U+afGMK_q8+wuu2HqO@EiyeCtY1b|x2;(%A;hcV+pq^Yt}1s$-QeVLNgZpj*; z+C@eJgqPT}iX~cS4GX1_;aOQ5O|482Lu_%lf(qKAso|?tNEzL&if-Gc-8y*#n!;;|ATp_Omu79@20%%KTj8i1qP4_dB2Lk~1tT7{+efCEn^BS(?NnJ>GJ~p0 zT7nVpc~nr9Tx|%l$*D?iXz~?r+C~&Btm4hkUw zbo9!!W6KQJTTUCUn1slBlvNP?kF~m@V_2VF4h9(JGjPWOXD(F2Z(?YBx1BZFCnl zb~6Q)CdaGE$tw0}$3;0o*Tj~XQgoVQ3bQ!r@^~ypU^Tjvo~lW0IqRbu0;=t)^t(bn z>Sbr7qA}HB^g;R&^c9vTUmFXz6Nwytr#cc(+9^oat&V%bAYFt8V(hMxNtf0|+7O2( zgpZ6}7j14yKhoHm5l`Z4kC%rZ8p-a;T5sT%&0Kl|(k%$WL`tg5Qbpw+R{u7$Bx3l) z*@QPvQdvCZBDM}~0<=Da8HPYnZ48*vBm+Q4FzZq68#1`! zy9_^9#kR%G9X5jnJL%LV_G}LC0mWOY9AqWBz$D!{wXt~oqY-z45UCy+)kz9^s&@-< zn%xyU(Oo9GW@}sYTDG$#iF6e!WiTS#2d=hW6|pfoT+pm1uCS^`Zl_-|*>UM6y%(w@ z401#>l#bSfWk45*IxVVsI>s%NyfFP3ap4LHSIBNjHmq&$fYc#)aHbm>Cq{wWTd;`f zkTQmwF&h|IjRH$)J3D&wF>Le8-3OzvJ@fe%<86$cSt%&0zYr2Zi=^(S?3yf6aj7(8Kppv8J7u^v4uCq zToj}YVfTK+4HdOMi&)l~NB~@RfI=h|Ql=H_V^>Uew6ThO&n!();8D7%P>ofQT_&qx zL}7NNibN{94f6pzhpsWGTj5~kxkS94lc{jR$Qa_!;^39!!8S4dVJ&Y{AG@KpJ)ZIi zB3)oeW@Q94)utkmgu$rAArn-D<(|NaO21|9ZjLrVm!2gbX>t*kf!t!I)~jI&*N_lp zvi7Z{a&Kg0O_e^Vgi(qLrxm64vy?Sn0T}z}b;wwvRB(0BUMxC|_=}zTp zq>o=fbmK#4RQy%A_=#VbfE~;mQ`*{ z|Atv^Y_X1%Q(3tYlgQNHhyX!dEL4}24!??x8*kr$dSaGk@Wu({x~=-9JT6QtrVh@U z2B+(~cp3xpWbjzxz9LB*me1u9wGrG*?O7Av8BatdBH@)LH*dxm=>7t~eJ;mnr%^x{ zn_+VoF@U?w2KP~zggFc&(y+aeALI$Hkwva~W9*8NPZw;gSvN{MMMWwvo>w}`v*O~> z-&t6q@}g1SDJdQOozg`rUofw1lzz&V*k_B}XO)Q#oWG142~ww2Q*1CXY?q1QEyb_w zNTuR27lX;P?ylIhLGs7DuZw5YLj#ld7i}DFaF2)JVfi@9L*y40N1|zzM`*n8?#O6Q zEbNBG;7Ol+_PQikfcR)1mJ;cLT3ELsjQi`=a0{$BDH@}^c#QIeW0aSSQC>Pm`Jyq( z7Y~=CAlHUL$euLhk`%+wkx8h3p+j*J>#vw}Zd;J{KwMAV8iiiK#VhoTLch9|(391c zc0swf0R>kkb8nJksv2b;Am{xBK7RLPfs8Cq900GYtyF4+MrM(}t;{FtF0;gn$*eLZ zy=NBP+!Be9a_n`CJ~lF!5)cB}h7CSpx=T#x*w5gJDV`O+OL6DXZVm*#F3uip{ ztjkqU39Jqldu?TVGY6|c$RE2hPJbI<0`IEm+@^@ zQxO^1SfeH~=4#yyYi)P{zDlHoW##L%g`Fx~QnDiPmZUv4kTq(eBsEd(0pXQ!yJddn z%biZAx}v6{DU4$&hX{eG0&8sftJp9{B2rPK=LRCr$oB4Oc_l%U;alu<6C%kd*@*7R zEC}z;ELdZL6`5tXL=y3IiO2plvl$~Ju`<$vjZqy>;&w1#uh<8lsphJFGZI-+#=y+D zqlS&=tbr7?kw^;=rUp-p&uwq4|81_NCX=>~ET@eB)HN=s+K!C^) zt<=aDB-m=hs_Bw+Ky$cKx=12h<{qd>*JoOBBLOO1;wg3P6Mt7c_usmHoHbE_I1z77 zu8nVu$CGv1Uf`@{<)&6Pb(`<95@SIoudCbFCfKWG%oJ1LtV7hhk927Q3rwHPsN_nr zH$aEVy_sU&a0wjeL~N>*)@)G@Egn!;k*?zXZqyxSUGYBK9;LsY>&^Fa12O&SqI zNi)lgE2D%~iRZ0DgfxXoSH^rIK-bY0#tn#BuqmjDS(k!2GxnDU_LvVg#CP2k#l{WTgim2jLohpX*=DDd=*LNB8)MM%?sw%J}tob8H zxKYEgo-iS(ch|S_;)CL3q`SX4?@$bXUae)XNK|@VsXDxqfD33g0Y3z+>x5(!GBX*j zB=-&R-8C#AM;nRKJKV2~?{=eWN!{|eRzZN2``B-#>UonJh&GjzwL}=q>WYPitYy0( z2B4Jqac80j6j!zqq~qD9n5Th8lxUhUPdt*(9H`n=oL*V97zEH|E7WKE^Ob9gP@H5s z0JC)ojWCmBiO0@TfEL?^B-Cn5c3rHJ?QKX-8(YhMYC?Rq3hf|hvmc5}Ry8dVt$k>PIC33IP#SqA0kC%0*3q^SbGM_t7EjRu%_{N92NN7J zcB5x%qGD{w!IsM0OjZyC!MsMon?g6t*QCW0uLut*-bNn@Tcwu0$cCrFT4rmA7#(OI z`K)cz8n&hRb!}0%K{z714Vw2XR7fGJkv zxxb4EZAX0FTA#*Kj8+P`(eKPc1vW+N9DnEe*RhHj~IsOv)?_Sv#;MZ1zXk8#|#jBK_@ra(aF$piaVWvPqs{G#B+Ec( zi0=|gxE3!M5uj?iaSbN_jcZC#!)%H2b8eslWSCs<=>WgF;-)yYUliHxXr81UgJa#g>==dC|NQuXIF&+^y{kkNZn}Q5Sy; zmg0OBO+h*yzL~HKd&^u?QA<4B?=dT)jv}gt1uW6)R#Hb4VD{~LX0!Z&2pph*BqkO9 zOICrq3~GxJc324}5@HMNx)SVZZ(S{!dFQndY1~w4R^e;I+l(D!1-|2jOs!?_-MJ>B z7OE;&Z*(=1xg(rvtt4|-v&Af5Rn~gx1S(zYmR8l6hZ|YsPwd%}1a^B*u*bIHx+8ig zX5A*=f)U7|ymmvS50+tub)ULUh^;Db0*0?)djNi%UiO!GQFix10&q4&wxuiTp12V1 z9=e{eTDrQu)gmL06uhoLJK7~xdp}%LPknl;mYhh}W@H!@4Gj`I2#_X1EhJPh1WL`K zm0KXqqC#VFXemO5L)N|Zw6aT)1tNnDm1|fwX;9>f>kU{ZVUkLlhTlmSrC+cH9*g1f z(s{}A&vni6r}Z6t*F~-c;(ty|G3>hGPHpwtb*6tst4s`y!Nr>VXkpY%r1cL^rrI)L z1ItX7@rEBu1}Wde87^{{)~$){E4G!UrMw$(0W;c*_pGLe*m>ENhGyx1&vw=#H1`|Pcvw^yJyR%Xoq;z(T(v(rDA<0-BGZKzbhEpIQ zFd9v)&ITaOI-9W!1g{t3ryk)7Q|tlD{Tihx8XnVA@6K1@1|*ms-B9BzL}Pgf;E{Ld ztKbPNy=kv~4>yaeZL8+eKC*E<8#P-QPM|i3fKv-6b=dt_32*zKq~ih9vre7fuvfNO z-Lk-Cy<~F(y&21ozJ)w1G1DdPTWk<)Y>^ZZ3M<(J)1=(G+Kgf^@>tt}ux=*^mUq%^gLX{p_ylVXPw*F&!39hbS>yAe#}D|c7Y{Uv@D@|9Z-$}UJVP#v!6c0#dc z+~#M4)@&SGWUgJ2uVE3Yvwj-+6|8=HF%LV;VOi&8U-(MI48$*NO%FZptugMa+N6Y0 zb5`vbl$u)v*)WHw#DthwJcr+OTWfMr5}pr1AJ}HmNQ{Mon^;JzNS{Yy#?fpFhY5E$ z#G}gIH0xR#*ur97(e3bSwkYf+l#vh=7bTnG%`%yMZ<_n8S8Z5}*ab_lN!A&Q&6{c> znF_bHua0kXZd%>Uz-??QQ!!X( zjK_OVP-Q(KN+dp8k1RD@g>OKn0Mp#=;NI$)9QbwuXjEvNRdUBA)nrghKN z%zZ-VlNsKcKQGnRZg(Knf57~6=FbxcIrGiAU-OxFo5tbxhTE(pA*mOelOM8B@RMqp zs}0hz`0|)T1tjqawvsj1jpv9Y#(^QKL8&U__>$+{Xoh7ybSuOfO_8A+lNEx@g#g;Cu-^k$^ z=!tkEJEh6AW$&Ne-Kmg!ilc#2O-q+HDR<5uU63HLpKYFP;obGxgqRbu3B4FZ7x@C zuBfhD=QJd2{xJ_Zd17N#ouML@CN@@7SFByVnR6&sZ`@SvG=*_KV(@;^f_V!;k~wM4 zsob!-f@g$E_Rzga#*el)E}cJrKJ+u6EOiEE+?AQhrR%XG zJ&bb}ELc#qpm@Q;1tkkg7c5$^ctP2MC8P}%6%`jPEGj7~Em~BxxTvgXN%4Z>qT=G> zg~cVsrNxVi7Z;ZmFIl)?VbQ|kg$oy!EG%8PXyM|8Web;-EGQ`|DK1%9Qc_Y{vZ!Qn zNmiOBa8OWmn<$_ylC;_#bt|^lr1PLDl0BqSXNS2TDGWcaamc}k|lt+gzlHn^b%fMLXpSf z9V`%v!IQY4_0c#-fcY-%aReGT|IMD+R2Z7Qt%=(vOhA+B$#v^)ojude6=%6EC@Nl9 zQo3ky*^+RBwzf65L~q;P+7^qq??@z59XogJ-t*Clm6fYjuUWgUYW)oxHdb${xp8xC z-Ikkf{=f%saptphtBFcQ+M2vysKK1S#o;LtZ(CnVCIrGK#I8K|Je&2ko2uP|73`Kj zrV$}R#;DnW?&wSfM?C5fl;*@R!a@<=ZX|;VVFRxzyvlKPiq$uVIBA1$P`dG1)3y6L zv-#nNOV9Rj?(cr6tTq?sbfad=rd#M6I5O9s2cjLs#ONh~LmWz|z2fAf;92352~@bg z0nUPljVub8@!P`mF+=94wnRD@;-yPxhuM|1r;Vte*`sLo8x}5I zsya0~BPg+SsYQr;8VG!-@m@POq$;Q&Rq|*wjk+xUMU_!6;wK+J7Bynqu4*J3!`S8$ z0ZpM>J3{szVe6sM7U-l<6Ov4X#%wmcji@9og9pu+6snLk##{nLlAs0~$2f!MdP(W@ z8!SI=V~rH3yf$XdY@EfRdQCb_uV`_zbL*|nt<#-b8=PCWIk(1~TNBQ$Dd*OXnF~sG z^MfENvp-9m4>@!H4{`4T=T=qj{pUXEG?v}6)lsW#aFpul(G~`+T6NGVv|3=0Ia<%@ zIW00^JyacJ)T-q*K!6|tf&>Tsf0(>$>+|qnZBG^fS{5rsk=krbb85ah_9y(ik=66W&ko z&vfAW^`)KV7c~@Z*orRN7jAzBZqusWG;F?p`N02M30+uMM@yhaGg#*A6>yVABv|%MrR(2k+21tii!e`)wNh=FnP9 z53Kq6n)Qbb9dGvBt;fopk;Ee?wh5zy_;%%E9dW8K)j}$aWr`&?L9cOlcZv9EM<=BV&?@mPu;O zsBF2?zWbfy*$!j^Vx00L^IqwlM#MjjWn%MuEB)El*X497L-`Y?FPe@#{wLo%>O0^6 z1drx;hANNlP5NmLrf=!TTM(CgQ>uT%xrqYgrBy!1HXSAXf*iKP@OKpZq0Cx2z4C{{ zOpZ*$OshuaU*ii_uFzw~H_TFt7x@f8sxg>$)GCuM{fj@-@DIPsJ4H+sc~=h5^^TVI z(Ck|EqxnqQjN8wfj`{AW$(RD`qwOdZ=EL7P{`=Bx;S@(S^F}cKfBPsC-cw4!il#vqIDlWfo%RN4xFkY1E2-Wb*MpK9XZYzik>}*NYh^$5kmt1>Yb3bada?VpH(n!^cIt zV|$zY9}gaAa+?blm-j&LH~a_s4=-4(1=~XJ{@x?K#}yWIH?Myvym=*8`9BjpG`e?m zr7rFCc6pD>Df@%9e&ON-_{67gVh%SzPEVi=nu0`WEyUF`;Y<(kmVDNC0x7)vu z|I7a4Oy2kVSL)Umco%#3^}ome)9~W(hr|CKJ*97u*y*P=xXJUEU%8V!v)f?0qTsp4Ewib6+0H4IQ03`WRiQ%l#wo5q`7C9$v87 z1vds42ltV@6kPA|9~)j=a4hm}!G#~>-nU=uUvi%x%ncrH*j^euJa|<2ebJA``1`LG zEvJ1hv9e%O{R6@7@ZMoA-yiG^ek;5%x>8)~4G%;uxsQK7ad_g$ajJnF4EQbnUQ8b! z+r4%31?yhn~xKcoKD!Q;Z#@aJQW*pX5$ectWCmBB9ue;7W5NXc0~5+<)L zH+5gSy}jOV`JF*?aL*vVHp{dnG%GJs*2e{H!LJf@w&;P;ugCU}9i5PRs4Ozs-`y^O zrNM!4H=%Su%q+p===ScTSNxuh+HEJ$@3fSo^~yYqT#^KlH4cU8~#>wQS8VV zS!*l)Fnmz7H+oELZDLL8{h3v{BZg+DxL0sAykB@z?7$cSve0{g-{C(dxP~mRiW$Wy z#(t1nyf;m`H~imv`LvH1ZO?St=bdpzdV9(w)0)J?hFkYGcz8Y$Swqz z2)3V&aQw6EcpAqx{)9)3Oy-&H>n94!t9_r)jj@4iBsueZCw92zImbyBE;7Pnnze&| zcBRs~PfX$D_3~!{UjM<=EbWWO@ zj2Xnngh`5AFEV2mD7P{#Ftui?Lg|=&uojQR204+`hr-4IM!K!esi7_~V{W<9 zw8GRpPDGwKH?Q@n(2OHKju>6}8CH3lnrE49I+7=vJnf(P<8LbJzvg3|_Pue2LGyl{ zoR!a$tMlfl^Io=#<-u_Ce!c$M=P}=J-XF*#>8~FBla;gX_iNt6 zKA43@D}8yfYdzD}CcpWDL-QVaZGfHG=Kau-N9pgyx9$n-pR%pcy#FK{cAq?c%XeF~ z^TKQL=R-_QK6@6-VAz^GVsyX#Hyts;%!L-r6m4Ym2h2G~_;~Q>b%#>t`^#)pPBqm} zaasB4O$W+MoG@d)yh+{-5UEd%>W4b7+O+O_KjJ)*AFMlK^Z@-3mvvt`q;Y7~K|lJ@ zn!zIu*tCYdMBTC@Jp&v4NE_kOtPsBPO;?zc&{mD#7{9nPQd((f8vTluL@ z*JR^y-R^Z(ZaRc_inr&_UJLte8and$WA(M9ULz}4&=s%=DOF6RZR*tLmI^TJ=>@ln1774@lpm~F z^G@pbz|Pz^qGILBMphcpvT5EhnOj=($J)wG>yFrO(@x{c2(vHgZWtl-84029GO}zs zo=qrOgs@RD=l2eq!2uKxr<;g5y(Rp=YXtL@%l|6zj`;kPv90(S*&8&L+onT1Y5J+O zgjR#La)k&Qhb^_K2k4r#vm-Y33BONY^!L%7e#&^9v+fA$|48{?ntsdL{CWqVxBqvK z9Fg+;Gz)tA1s)X8@LMMrt~-iuVWsRR%Br4Im)0F6oyk$ymV`$8Q8i1bt+ktMuAotETDd|JI6{BrTT15b__cDS zIL6?|F4gzmk#93KcjMoFYrge%9nynhKtH?fo%z$LxEps?t{Hxt?tEH`M|LIO&iK-- zwwBUv-T2Pibi-&WR4tn}@5q%Iio0=Vf9aXuaU*$~InX-=qXT$5MftX3x3m9vJ4VeP zuzqgYB9kf2A3BRy->4`0Os0HkvK|3T;FbaYp4y9(_0{y}LtsC$9&ku>K>m)lN&VAg z-3Ru939t{$3jNQMbtiw2GOkV4hrm3z1@!DaRS$s!`%Kj{g3G7s@<-POJ~37A1BX62 zRUZcPU;tECPSvwu8dMf@zu#1SIXDUqgYmwpI)8W7R9ZDvFM@&3PSuw#F`0(H03WP= zk@N%)oT?YV(wC;{u08SN%Tx7!(6)A}z8xH04`1#No2vKlN90Dqe$WFBfoX6%SOWdv zz}KegHNhjM>dW3udjEzT=mEEYyYKq)&l~H4vbJ99{`V|{69+iKO?`~=eJWH;Ly*f>IvwcQ>N-^?$f`dT$WOP z5&Y(lN=B|n9_+n^dIQxvNgwRHpL$=0Tz0BH3VQO`0d3Eq_c820k6)nrC(;3{e7c9LwRgZw_Df|UTZPWE-|3Z2Trt4ck+qyx1EJ=pmW^57`g_ulDx7##S(bUlLI_=l$J3V(Pwzt?oV z!hLlg>~nAX$aFmi4uO+kN<+O{6DyB{OlW#Enlj(Y1@Td6uukb)Agm;?Y$5` zK+i?!fwmC&$L;`_1*_ny&rr{oOxL%8LpvyEaP(5*0hfkPS6gPsN>VBdq& z^@7}ko8jldQ84`w=?s7m(>_4;QOaQrcAw_{OV|S^!GUM!kAx0J!M-Bp2-=<{F5suZ zwV>^J?16D`*+JCHIPne+zk(hZ0gK@1--zRbv0I^hLG@MI4Ojw;VEpg!*W%|t;DgoI z$OovtPCma3zJY(-_r3|A`@mboAvioaT_2bGDdfmcWSV+khrK%O7tDj(K-E;QhlLJi zL7TZ=FCT)uwO(I-D0aH)_0?a&KWDwZ4UB+Mux~-VJ`Q@o7;>KOdfoL^iny67)EaBgZRmPdaruDmwfeV_4)>Ih(BT;65OX= z&x57jdVK=z+u57@oO3R0plO5*Ed2R{W$4zp9cfn z_x?-0o&*D68M%}1&2WoxD5<|J}?4?!8jNP(_jY7 zgGI0eR=_H_>|5x60>41@ll8hEjDWTy@M{JBgAs5eIIyx__ktxb4i4`}d4jh6sSoth z2T-p^LH}~S-ZzBYLG}7}FtV2XfPr+xN&f7za~e9?XO3@8i$cxd$~cJwkoTJ-8LL z9Y-91aWDb)9#4M2K5*4ACf7OoO9f0rY?qU;s2x4iQiV)t^w$U@tf*uSiY0wvwe(8euX3@qv&bbYY@TuZ=qp5uJy1+E>7E>XIzeHPbV{ez24 zkL4eK;>qWp9axB{__T$8wx=iS;ZN(jx0S;%O$pMOTe|4GO)-b z>I2P7$`7$g{*9xPFm$xFt`BPG+IBcDadumRuD!IiBrj@x@RymXyCtmA7H~7L$ZaO` zE1LfA=)T0&ZOtxl?FHTNS@guO&FHOO%32mgZ^inin$u9)W_InhV!f`TXHd#GfUNUF zth)>yw*{q^V`&nxh=MMz*NN;el#w4rcWxS%p^g+xl9wv-tM;0zuQKe#=4d3x#@IUDBg~&bg!Rri;BeZ2sXyBF(@{+w(Cj!^1&O2w?TLVi#qFLYe#jg zZCxWKahXQX$-YM)h~9kpu_~1F?6?$Nla==MVb;{rCMPO~Hs$X$xD?$)OW8blPo!{zGpKqpgT}LbSxkFgmMO5ZmC+ z>Syyj^|Jx-B06sNuZ9iX%^T+HavB{@4>mS$Xwo(uTPe zZV|bDmDndqNDX$u` zRb(Y5OqRj6qjciNaA}N@nv-}xsL@~V!ltzE^~i2U)-5(W>p)_vIR;adP5Tm~Zgj@b z(L{%z*a<*OyaPMS(8-`~^Kfk_J@dFIH)WY)8M6`sPZ!Tibn3QK z$cK=BJGLi~9e)S5mv%Egtz+M}(-*^&8GcKhtwlC~Y@=`Qn19hH%~SU>Zf!@$^cC8y zG5)mMVskvOuA=vBv@m@{Fv>HI-j=UU)$?=xvM_|S3RKE|9NDEjduaI8*(T_>TB7uI?sxh~L-~TvdKaEMkCFRdf3vghwfG*r!(v5 zAkmjHQyFZ6hx5E!A{Fw_btASknR^=jL~CHu^B^%=T6S zQSywfVV}9y%(*bjJ7YGyMQnG>v~(9uL)h?PV?~v@iD6^zoT_QVLfv*usGk-S-7Irv z)37Pya0$DsUTd|9xpocDETI_|48J7SdiP-M@_K8o+tH@zkDJY*o1Uk6jgGXVjp*gj z>oxMz(VyrIx6z##>tipn`8Rm>h#vLXPJ=RUnw`;XTjSHf!d4I4NH>qIWwqA$){(BI z-RB{@RnnsK@*(TAalMnZlds(-j5U4tV5^Zd2$t|13Z*$~!6kF@5z-6Q8ApvWY4?dn z`)dX6<9eOaPjyVN^i_GseJ8gE+wvS+S;KPxt~<+6+He`-uoa%s?svHs*hqfonfB{- zx`MX5+|J&v$GuNff^_8XEQBL~uN~*b4aykWD ztN1r2_8dGn;F|my_1bFl^zY5ond-K0jP_YZH;wK#W9~V-+^qrf+)=dM^i7@jdf&Nx z3F&t8e91_EcHe19wfr{Pjq4$96TLZMjLJ7GZO_rf{XVaP@7;CDfD)T4gw(D|h=arMOXaKoYF3Pf9$Ib03 z>u58sjF8ahxTDBB7m>cv7H5w2){^u#t-)UGN08s5Q10`}SLVp)k&iBUd;aue-}Y|G zgZB(H)`rA_+dOCRY7AYgZL%V3k6n#CN!whDjiLARjMXTEjy_l47i;wO3{%omw(g8} z?LjyA0iH*)HYfcN_F-nkg?%j>t9jBMX>7wh_pD=d(u{v_pooUFV8}`mY=khUTABV@jOuo^gGPWdd{`%uwCM? zuVt&05lS;QBy}rBTakBg;^^ox);XSS-pP1Ir`H_kq;J*V+4&fKjWpVUMXCAcT&?}$ zFr|ac%uGqUmG~*)OX2|Hc;5J#oD)Cldx=lp=U6eXyl0O5fXILL?Zun;Gm3oSb37NG z*S;+K+ws2?dHI=tI=KF8CU)o-hR!@p^jOx&GlD@bq)iuCM zk7(J*&CO$T;%Rj|WOm=qr9Sl(e`L+rdp`3TC$^4l*&3hMAC;1a(1)_`6<;oI*+|VT zn?~R0!yCA>>tDuA*`Kf7!24*n8MeanJVUY3j-eY?q+rAs8*>)#EyR!ba%sz#*iL;> z^^%$6i}cfj*xH_CZ3{Yo-Lf?@dmXr(a31N{!0t!ahmMwF-+}x%&u!`MWZ!%}{Y2-! z`Pzk2$2n{y?_n)3dHGq(#;m$&)$uBF(vFly9ZQ+?P?o(9vQ`p1H?{1{6T8i27nV9B zx6wYOOk{t2)gz5E`Ay5#Zp%dSBm48kM;rNRm*+dmkHknBI|EPg{0?+J-|}I;7^zS- zGh#&Yu#B-Y{w(imO1(bQ(w~!u6|?G9%5oUp;NRFo6Ws?|y5XJ1S3g}e+}W`%2m$1xlSN*R%Wb)7T zsSmZ%2Z@(scyG$EG0&XQGjq;}oain65cP|mJ{M@NHyS$(tN>fHnAT-OZwS3Idc#I~ zGv-3fk>}Nud4>-??c2PsHCK;G?Oe5f`~G$oz;RMtOHEoMg$O?~M+lQ~O3^U5=iV!!~H1Z|%Mu!pLpkjhvK22Dwq>Qe4wcX5~vJ z-K}M&o{t*x!&~2etVw(>-<$eFXHHo+V{N#ViXLmCvl*Sq@3-cXZNC~iR+;W~1f;aP z06MkfSgUhQUOMAZ!nf5B+Ks|!ukxPn_z!s>a~{3T9eS-xo8x1* ztnAx9%CuT9!`0}G@E-66L$A|MT3yS{)}^F1g3kJr-&tA%=ta@Pd- zc@Mm&Lr&s*12lOTdPL;5b=F~XYv#FUMb3>}=ohViqoWL)&KSN#ksCf^X1Yme-y z4ZE#APlB}BnMs)qBewxLo5=AK+BRrI&<1phLGwY|>~H%na$#s==d^XXHO2Wa3Qewe zmLJhAA`nAvsmSpY`3nCfp$!P3V_izXHeELL!|M46<%V3ukn5-ydHUOm?VXMZlKw_) z^z$COO>FQJ+6c7OvuN_(f3$;!i>4s72(%GV+)4b1y%cgA&uhnp)MFmn251waJGU>) zwi+`XwAiqHl(rFTzZWL`&NlYUt9QLoS1UG?^OK(yOJXZ*-s0NT{=)n1>z3NT@*(?I zHT(K~?1%K)5B;e9uw~u0+`U$l%$c^d=1lqSmb&jt%zUo--IK*+Nl)90 za`YXok%H}-8Fy&O7#hGZAQjsmT8B1e*kHg9S_0Zw;+cV2- zcl$z{DYbd`g`^&3e}3fOsE3((ZTEZ4aow7d5v5~QYQ#YZedWIzaq!+&xz97dPPD_I zvF?(Xl<(0&aAal+ zG0Il<=i^7QCyG7iH+E^m(y@Bc8`&y!Rr zbZ6E>vpOx&P7m~&kbY*h%J}mgzJt>1vSnj8&weGu=05wC_Ts~y|G(L5=Gu8$%ietT zDjv2LQPn)rqWqz)g z^ItF^fyz!oilEu zGmw~(Z*Dh^He%-7maUoP+vxgd$BeWg6MN-bS<^_VI!|ut@3tNHBflEmFuHw`kMFm1 zcM@;qIq@d`yRi{sZ8R)4zSy!M{?B+u(`|Kj^kg0RM}PazjAy{k{db`+G0|)>hPoaP z@(|Rwy%Ae`w)8j8N#C+|_7J77(fZNfdV;aeb?)2J@0`!J7bHxUR*>gWbhe@6=i1pd zua0F)$0S(lDT0cKT=;=txg|?0FyaD0H@n z&Q0^{P$I2~y6CJ&NBOz&?B037ygFMuRP?ftZ?%`BvtH8q@w_^0lC+Z1`|db8L3H#! z|Ge`Zmew#DGbf|sWu08Z#xQH^5lMIdmJNyfj`w`Xp)q{vic$|N-cLSH;+s&> zdv8mx9k0ebcUvpi8nGth-d1!g=&qMo-=n3w(|M%4#XEZ%DR$(0^$o1mE8@dT-{F6L z#=G@1`wwF}Dqm={rV)+TmkexUtt+!Oqsu|9oBBOY(gLsP}@_{#3=>d?C@Y*|isU z@;;)-ZA5Myxy@YT^LSg1xaCgdB-TCrSH7{aC$x6f_Zy9|N_HQb-Q$xCz5VDV(M#P- zAHbX!`@7f^vaVp4t#g3l^?qZXX*z)CZnsX?Gnl}}tU6iWSq}yaXGxjwGWxt#@RU;|qBggPRKi+BNwUPD&KhzkIV=Os&KSclVrSb0hAmRaR zl(Dg1o;_XDvQgR1`n=ypbj-ItUyjW(HdXnSpKIsA-{yaQ9r@@cWQ>dqER?>uhkfig zds+idViafpTeBy0nO2+vuV(+|0zxhnd-n{b^Uq>iP+ZO#O`UCi{ z_q*4>bNw>|taqBjLy=O(JxWv{?;6VBIib?5W4M*_$Lr!u|AU*O`Enq*&T|Yxt3L6X>MT`Jc|aq%J41 z5qqrl4)DBvjwRjMx{POWeP5*h@{RZRup|CN_htOOiM=-I6K~oKh2N}wo5r-ts=smA z*iCLstMonY32cne7pAP(xMs6%0vnZG&h@*kCFZusH2d}TxAIb-{RDuIx?jq*^O_@@ zHd}Go*|*ai_#T=4u-hB^PseX=%FleqsWClV&t$YYoJa+UehmGwr19*@d2m~Q?tVoS z?HOC@`j}Qhes5+wDiYkuAQ43Sk~)x-Dz_xv^d~k|z(g3U?EqV(XEXtvUTyx2(Gw&7)bb>(Ni6U!!l5_m`b_ zwe;tm=QpRS#aXSnX>Tp|)Q>Y?zMnc0d)K$@`FRs}<^a)|Gq}xC>a?{PTds$V=jzT& zTef!5&&W4moof)I%w-&2|0UM9v?sZipTys0XuijdwKcIk^W9;6SEu>vuv*H|tDLg;twITL!HP%?V$ABDWe^WfpA^+C&FU%4Qf^u-Mu! z=X{B5^$V+kc;*ct@&Lq%G5#-73u`diQsOImZDzjw<{ZA)WdVRP=7=aVPIQ3*); zf8+U?RoD0Lvj4aC@rVk8y1pp8I_8fmucwV5w(t72O3 zu4xCOhmI;b{G{LMgI0q!ukVeqG11|vI4*u}MKAWgwohWq4Q&ish3iHgwV$&#=iQkO zV-$nfN}xCV{J=n@457Ph=}h0YKpW6z*3ouo{j+F(XsbJDz1Wj;?p8q?;d)o^!eo(i zBj*%3e&WkGwC%HKRcPBfXg$a|*AXw!r2TiEOCvUV;RWH@gvU>4tDpsD(bhxr&!TOH z=IfwIenz2rq3td|A>?w%b>=4qEeov~kK#)jTA_os6j}jV3ED=kO`I3hn(%QeIyLyc zd(X7(`U>k!Xw7`CKu&`;@rLp42Jti4>O+jaaERHlF^SV7#~Aa6&?%F43Vn2DjGNu9 zPf(4Qoh8;h$Zz9(z?y}dwfY%6^Q?2NY38{z7P|e2r_f!E&k?R$X&Ga{_Ktpir|)SI z3MSiE>F=;HY1r6FU&J2F%ut_skFK=0L2PZ@=bg7_FM6I2x65AYNX|!e&!WYkZSSB- zJjwZq+n|kby{q;yfm{l?W;`tu`Sr}Bpo#B|@|$;UE3(Ux&Akm-snZR}mXJ*vc4s^n zk!=KH*2fE0oj1rzz60oP;rzv>pF)d58;0f*d;El!gti%4GhT(3gSK%NtpshuELsiP zPzO!Q(RB#*2W^DwU6o@WazW&p{z=)ag%*G&d7o8|jm-pOk3eKck&V7h*)Xz6WJe9V zGs=;9M5`Pn?^$FO&Z~5ZEI*-*LvulE`YN<4G$*vqa&sO^JD5dV3e7Z&wgTED{w#+j zKe0Cet*1jy%5noV721dh?c)7KIjeIca!vn4Hvnw|w6&t!afS|^P3u{Plw%S(H*$I( zH>;oNTq}r=Wn|+W=?HBST5J|gIgIfbS~Gv*PcO6#G~J)!&bi}YtBVo2^~hCrBR7ED zC~{uTNsSxxyWPCIvPHgFnKivL&ZJ9XCr5hno)R&)xz#tf_Kiz(*4UEoDtgXk?fRE| zIR~kKX#d+jQ0&XOtcec$QZ`$l#i5OGy{mZeBRAQhs~{eMwv6*tZKBIh>?NS}LK_jn zPU5Q{);Mw@&SGukYu+_?^VmVz>*-wC%9(>=qxW#akn>x&%J{U)=ZxL*`r-@|&oTFt zzI6*Woy}U z=I$FeUni7P;W|cC{bfS=etafP_ruG6dM{@)XR+@*n*fquv&|Xft!TCuQsR3Oom5lj z_}%MBIaSbE&fbPR=XQQ$mQL$g`EVm8V-6v0Y8m_8eGeGVP@SJ^>CMf1F;!{EakhDgf;f|be%Kap3WdT+nYK^?OsR9)`QL}_IOjozw>h~ zo!n0Lb4|_;O4wt|7w32)vf5~(9cRepV88v*;lp7K&rVJ$j0JaUXYkYp^|1& zq@41kv+QN|-)y8)XEGu`c`h+~|5DC`Z5*M=APB!1Q%~t#)gWrx7s>alJd4}|TMJud z?wbDW~)jbz+IBu*8K>Wr?k}#9UoMJ;G`K>UHywDU4#+;`F;r70Y^`%ape|JuXwx z>f(g6GHY1635UlFJJu!NL!_L}$%Uq}(*`B9pwErMf?lp83!Sxvrm=-?WU#wUKe)2u z=qtS26zy{5-))L_$FUiuafZ-|E!dEAnbO@Flv1}m1mlP9CesAh6PCXC9{ec**VrDWm|g}|dv9V7 zQ_vAcH_^3$>zH#ewudRcU`uolQ?h#*lv206fE;jXT*qA=k$jhnYyTo=1l>jQh{#C8 z%|zO5?Hk|2l(4$^x+ZOvF3j)fEurbqbKkY1AZfUAdzjn{dY}gvNbyIzMJC%Vc_=T` zihFPnT@l^VA}92TMe#-&pED&%BWaZis#;xCjoT)5nRfI_^*Kb}<6K2eC!I;IYYQ~! zL8Bz}a`=DmP-$G-VcO(8~)7;*DxTO|5Ywm~Rr9M9l0bD1zZC+wz_Tuzvs<95zg=aT+EZzr(0%v+p{Per-(S|u+1RxXoP zCkI8O<+5URM(ng#E+aN)&~6&Damk;l_t{M)o8rc#O(9KOCKo=3OFXokU_HThg8c-? z30)^RPgrn5_X!J6aGfyRMVay&YM|P{r48(BVAWyBxf=IPoM_N(v-EVM{6~E4vwA3I zHI12vf>v6iN~cz~xS&)mE+}s6dXcS%0$a?dZHbwciRbq;#Vkr1C|k57;IXNt2)(b3 z_TaWFAxIN;W%4<|p%j5~my#54Dghw4pvMP9yVW9E$!@e5)Jo6pY059`DFQ{8nuk-7 z_EmV7l7y65qyzx>9z8z5r>I#3!U_W3#Y(BTrzx?xrwC-0sA)LGC2-PvDsf2FJ$uH0 znyMz@_}&et`fkMoDe|74$!GR7jlEZm!%4jtPP9iULJGc5NdnRLD*>SJ{vIDt{(w4$ z+~fz4D=k$@Pw#08e6Xhogg&H3;KV)zC%Bgqhm_e%8v`aZH3Y}K_f~>wZ^Z|xw2w0J z6xKehWPwtz5|z7;D3kmty}(C%sz7*OHGo!p-_7)o%aj}>-^Y{?kp7tF1&SY6-3U}Z zPJ)GhQHoFQX-Y0vVnE_w6%P>ogi?5dtbI}$1Hvnm+T-M7MNbJRtyCv2-@{Z}iSqb< zN(@q9e=P`P`qVs}V&4cej{}tPJSG0Ao-|PVl$wL%`!xBeeOmEB8e7#KSt4TQ7FT+U;DCHc5JD_EO#6fC8I0p&mU?m`&gSFZtl)^eS z4kx(|PV_5E3R3YaS_JT|S7UI(>*4qgQ6_#z(uZg{pmL}>2FG(4oXTNJ5K?4NoBS=& zdAJ&dQ$8F{{%cAalJ|(7DBv4XePV5hA<6S^N-YcN>qx2 z@dAPWQ1TBEJR6lT5dKeP;z1(szmx=!*ra#_HY>Rd^>U;V049&rst=%dlVEi~S`U52e zDR;c$1B#!(T>sQyeT-9^8$y(bN1 zPf$Z*_ykf;{~yHjThq8XX7lgx@6YWZZdlD>lq^O$=g zVD=QVT10C66f?1&In}IGl9)Qpti(Z|*W42jJl(7okP4q}CL_LIn3ckB2!~&odlF#w z46~XS8)pbN>oY5pw^I;jntO_ZXPMO;+`w7Fb)Rik!cgO9n|s_~%x_k+aMOO_#?HaJ z+sOGjcqjNvvzmch`=xM8=bDvrf&d7ZwG5a!&#Xq_7S9vk)90I&0My(Ccy}v42hCan z9J|o0dXY+9XeJtB7nv20P%kzsxm(CX2raN0GWS$(Cblmzs~)61J0!)*4zrSg8oAWm z69i*nv+9PM4(s0j%B&RQc=;=HPZFHCj1mvim0d2}iOVT*sNsmYXZ$Ac3bR^+8^1!h z;VaEb1Zw_DbB{;x*JiZ}xBP42=A&jMb0dx7DsxX1EL~+*BRB48u3cr8*;(is3LN3s zHBz;KF)Hl_TFJFk8koP9N)x<}f)|t5=_aqISU5)08>7+$Z=m4ehHen9_eLu1dWz#l zDhioJxZ_8K=@f?=5CEExNbpy0=nk*Aeo!QfXi!VOCRcvkBoQZllt! zrEqRD_hi7z?PfIz*Yg|UR(@kvd{84vbI-&W-O(LpH32tyhj62Jnw1#T;+^ImKRAAu zS&hT3-X+}elv&ANL;Jm(fET>Stj6F*?-6d`Ub9lWnw;Eg?kNbS&FUE3Vp_PF`^-uR z>g0Xqp2@2y=m!WTxWNa6>&cjv6x2k<+!F><4^sSa^A8F)^^jR9MG2XQ%spw)oi(dr zxPh#2-M=*}Ua0ZkntRH>#>Vf=Y6x!jcfw6PVphhWPCR1n@qx9RSq;MV{a(1W-xHKq z5}c2kwHTOr%&Z3B79W$)&F0NY^$OB^+}x7~Jx`cbKiuFGqU(9mtOTJZo;3H=A~ec^ zS*=`3qbx{_q@SXWppHLnR{UV;8OrW*no`lM#lifu#0t{oXGJ>u9H9%f_&i#dAvJE+ zB4F+XN*Jlq3zA~)55(QC=)3-CR+3<)M9u|Y#C8}zUm|M2SeY5orC9qjjR`FM1?ym7 zf*{{PNxh6uVDc3r^b&ILH}t@Cg~$n!lUIoXF#mUI^kVG%13O@_N}Pk?*Qi;%ioYga zgFu4WBP0g5NavWCj08&B6`+Q@Gx@h(@T%x2U@y^*%|> z!p%<#H#KEeqEM?-G+D4VP0hmf)rDKDQ&tyHcWz5hSnx!P8iboV(E@kuB#SbBKIMOs zr6&oNPPVAk9dv9b3%BI4C?27n!ldy$a&#&-1W&W56{O;)iB#B&jQ~0FVgoFnZc(#v zCr`J~{gr-UQQT1dK5U#zsh??4yn<(0l?f^r zEow&6I@dz1MFJKj0<{pZXp?7C*5_N)Fx;{8g&VrSqNJc!g7^)_F5>x-DbRhHMGe3WTqa!4$yU>)hoyY)aaGu;TNR;Ym4fGTl=+e%Te+GHFOnuIGwn;+M;^l zR<0JWO4nGF1k}KoMe~D&Yb~k=?!>jCTfB}^^HQ4ETeJvRj4|sM-I#F4Z=fblL-$6D zmH=}%S=7l(XcspLHy^hs)l-SBn=M)vOx1>bKY65u9p z6YkjU79|9A{C100^bT=u0 z)w@aIBx>hgi<(9%eXrPvvn~ulEvHH0M7Z}`)Rb`V*SQan0@U&YqyUB4TZ2o;NLO6mIZM;rjkbicnK;VGFEHT9n*Bmhjh5ElLo~)rsT3 zlMA<1iGtCStV-ooJUiK{#K19+Rg22~DONQs`8d@|KQwVFQWd1VRy6^ZPPZyRFW_SU%gT`N70FRyByV>^WjB@k^v$USg`AYgNKv{5-2t zX3u&2e0%`CL90^xEA$JkN(wApWL3OiIAm3Ff5GY{SO-IwV&~69-KAD72L^v-RsEzg z_A4v#6}Sv3sF}-=DpO7oq`3ZD|RKGLoHot)x4lLYE|8ELs8-St|EUg zQJPm-wG=pcwN6cx2k2NLUAb*@6D7b)a1=pt;R9#m0PUpI9$)I!mZqDRT5Am39A+ZCvLN<1-S0p ztrBIoQ#*g8c79{k%3vvJRdaA_NzpCcK}|yq-f7jsVE!(vnt@xsOS~(jtjhQw@cnM9 zRsb{iSk)BV;yt?W_fm#X-D&C(Ox{QR!_D0%+|>Ql#|zZs{Z=gl#xhnl1~;7%Zu~*= z4YmBBRda)phplQ9ZsK9#MzfU0I63((QegCVNP)#ih&!YzkBHQGjtF?3virSNOMux& zi6gkaSb=(nn=S}9{uD9yEZ#k3 z)yBclGt@iW*fYWn7l}-$`Jz<|g5Kw-_lu~j=Y;Efo`@l54F7}rha3Ng za3fXX4r-xF+&w9M4fPK<`nqs~ZxDA-vu_Z0p!ZGcA8zPP;rjkb+&w`#{FAr?C*Pv} z;rb_q>z*R+pvI?&JFq-W{llG{7VboyxO*IL+%~NM=1#P!VYsCeZE*7^*_0qu@5wgJ z4<^`53&PEMgqu9YrsVR(-6=LL113(hsea*}W|Q8X$4|E@`Nzo7FKk*2%$#9U zy+{?$u(5%Z^x2f^qtu}S$v8m%oM=y~a2X`R#JMyptTVU-{n_7VD3yZB<7+X-Izp`mzFngIz z&A}bNOt{(0ZA$64)XwELtq6v%u&Eii@hgNIzS5?Iq2{i%X+g01Ynz&a>x~Mx8nr3K zEU|o*P0NFst8HomZt-g2X0D-@pw_OTmcY=pHZ=w}cCBzj*HQitFRh7L(Se|)7&C; zEAGEIEI_1`CHOx}krsAKozJ(zlc_y{u3ctE(R3@P46${D-|{SOfra3c>1 z*Z(knLCt1uYBr7K-`dzd!qy|CcrWFY;~pIQy-o9grXEb^H%DZSqdW zjS}$!H&7C8m0kW6)X0lAEdgf#M7+Qq|C4PaE%GIsGI_bwV5~-bz)jaAFOfGX>D$QZKam3cZy^PyCy5iJ z3X@Xeu_>eyl=L)GV8qQ6fLrNLPP8j2(0`Jh4J-0`vR$oRKn zvylRGXCrkJwd=R5<4AeVk(4XvAO$u2OZ)<}=i1c*-0^dTn+=fSjg&|Lzreuxb~Oh# zdcJT27vLAv^aXY;2G)XhH3Qdop`AXna-m(R-asi{j1*W4*_B$1D8Iz6mBH!`yP87U zd#Tu}UTRmOP$OZx76fy@va1QWrC&*2(wEtl!u8m=%&uj?NW`wj;3gt=;wW&1UGYOr zUt!lKt|NY~w5wxqC$ALU;;-#W45}|`*SuitD!Uqmo4!i8k*n=W_FBsHYP%Kz17mj8 z4L3R_dGK9pSIT45%XM~T4D?-Z*F0b>W>+WA$3{$ikKJHbGS?6pH`ui>Si8}#=HdEo z5^n7#yHdKE626%ng1MXRnj3WAikC zr1MF!nYshNevQ-}b}a?^?y{>9xZ%5m>q}ANP?IUUR=g7L@5bBnSfkx7+`>I}B@ES@ z#;+@6hKFC^#QoTePy!k5!SsXNUrufwv};K)@-TIemBhn#T46LxWL!pE|JJS~LH{G% z{|c=~>{<>i=kN&W$(*EF{yjAWHSm~S$%QF{JoljYal2N!lw3bySHnnWpAhN9lXfKn zwfv-AtL;GQDZ3hi8+uB(-lvHtsEMcTnhz{KV^@Q4E6)hGSft!8p+uggF2J$p>}mjR z>N(+#J#SaWL+Ctj*WzH{1zJpi+I~S|!TSdy_F~HVk9H*v*8WJufYBH2Y6+?2i((`C zCu;j5O7%~6Ed=_?v?sXXvT%KWwkyR8vGHfx1UT^*yIO?n{;O~&{%Th$L27lvuBE}u z%d|GQ#g~Pfd4+m|I{AuSD_lU!tq>t_V-?|sUbQPhsHMNt7S4xTTOiF1jkw}hLRq+ZUY#HXkiFg#7Y{F3;p zQ|Cx|+zzD5ZifIOl+GdEPjYAp(C=}m5u_p>2Y&ibaVRxEDV*w15}?n^{n?Dp zr*jWhf5H7(SUJO?Wx=%1p@z{e_(VH>rbF>Tt)A)7#?K_`&UUEPUlMg^3pe6-C}F6% za~#UJ5C4A2Js3IHp;gbI6$cz@2I+D@r1R%FlsHuH1rDY93rai4JvbS3XkKvaB8Qqr zI(3mqk6r9gGN%(87dx~N=)1(Brr?Gz5w33sk8r)TmK_c)29_^%s7bh!mkPHWb|{t8 zWIgK8(qQ^Bhnj#}xJdbYV~r5RyY-JuW+bwxQQ!-8@bY<1fk}ybZ8T&(5pus zY7A~LDqPQ14rL5#{3?g$1}Cm|sAF*5*9dpw8i$hd5DQ}tEdb`Pb*LV=-$-v~F7Bo3hF zlMc-X*6whq6L5WZ3b%SEwJ^Qd6uFC90JAA-0q%H8xS6}j(bQs7`5uQ70R3r)lAB!2 zzQ03@fVKOm6|r@{ZtH%csvoZRK?kk9{2+Dq&&Bj-lrT7+b@Y_q z}ZO8OOQ z=oN<+1l<){6Wl;WxRVu!l7AWBUv+3vu=scC5pL!0!Y%xR9%O?2R_Q^&*lW}q-1KY0 z9ebVj`d4&bcW4>VQ=>J(4c3I~ev|w{jlD^J|FYOr_$RFi?!-TZn}3V^LiJ3N-#?T7 z6s-wvYD&1#Y4QuTFin2>vw>cBmpTSFc2bubg*$nYa7!n5 zDe0FeZ%>yN1aqf!sS&uPQ-qs6wM)tWX|ZYY)GjRwj(NM(u%zo1ZuImnrS#%rcG0@D z1QuS=1@_C=XVi7mGj9j z)M&6vsf<%*7j^ZFf$598l=AcV5keb`?&wm+pTqkdU0NLUg}c-QR>EPi;{Fxd&r)ia zbtzFWb2-u+|6Gc6DM8SGWmiw`8FKgQE_OPIldHOv)YFSip{u);$*1TCuIAMMcG0OEx%H&2o1#36q`4hy( z&0W0kK@Hx5Z;#Vf6XX<}xUEa6<)ugBO&qYC>{8rd&RX}gLORc~SrG@Lcj})QC@9WaW!14RL)H2-a z{lYCifM36-Bs0_+n0&BH9fzBHP`HVQ@E&UUp)M@~db3?>K`du=%fBU$IV}ISOB)A^ zzw1(Sa4WwPZs8G10_tQAsYl4^qu2r`9wWuyasN1efu$$#{n5f5;q&xvl}c~XR07)R=1>i-X2 zJ#jGmhpuH~ptsbe#*hw`^xV9N)I-$Ji`W7u{zRLD>wZaMYy2hrfa))IX?`&IXId59 z+@D1^@s}>8@F3;%mo6;_1}11X;>U#U$IHYY)XXcyV@CQX;uDO$N{SCq0)Ow~oe{LE z!~mFitxL(=kK7wX9+<9S{XWXzO=1m<{gZYNmfoU;kxK0?Nu@N2^)yzdXq{kcnmC1< zpB4|3b#$Rl)X@b)CpuL(+}MduxWSX0%J{vce3DZufVGpIYVAx~fJeAhk5dUljhy1t zf?)nsr&@tqK2^B6)6l&KZ@uV(W2ZaSGThYZ!j1j{U8sd$pes^7r#cQd;1lko58b=b zITKwldzMozz#TtJxS6xjg<3lsT`+WxQ_aDRog>`fFVRim&ACn`3I@+}DwVrvpXWKX zGU&O$sb-K4ULex$pi_xKjRl=r6s%n6R8w$07YTRbB6RO0g^SSz^C732fLjg;H+KoT zP~AJw1>=`G)fn8&rNWJc(Y=Fq6-F2IUFKAyaKo1g*Lyj-P!pG<3r3D|G#!B39uY>DsC`(wNuIbh8n)csrbRrwN9mQJ9)d-spUZL^-eX2mC*HKW%7EY zppM0ynj0+M;8gu^D>pcY7&~uts_EM(#TzL_Fcf#HUbwNilNGD)W~W+A;NLCy1-cVX zwR9`-op5SJ(0w~`f^^_^C-d$acVVdEBvQ8!nRk#^aPm%P&&18dT#AwbC+~Ku)i_q} zr5wR>+Nn<7MB4W|ds1NT0q0T==zowpx{+FW$f^3k(!7ZK|n8#Tqr* zs8M4ZHCD8#VvR~`YEffNZECTmEp4|I+i0UkMU55Z{m#redvj;+725aD^LyTBx0Rdw znKNh3ocVL_ojWskJL>SSr7w5A04dPn7t%tFQmP;I5TRZDX{i5gzlE+Y)S(w4h2!=; z(Dh^3@KRb<3yzJyPYZ3wvEyabPsHkeS?X*bfYgI1@d2cWLYkgIw z)$k8U{RpM|Pe|by`zNGuY-OS^}LAqCq0c3P-KO1*<}KuR zZ*biAK1vT#BkxN)Vjm#gd(fYZq=kBL-2EZS8leLp$~xEmZ`2~tk&j^e-6+A2)3RD| z9Q*`!b)Y9{NDp@6*m_xdaQKJt+~w(*69{eJO~<@9l+qRH!QLOhhAY!UJvi=cN)NU} zdv8-Z?B8)!dawyJc2#<)0mqhW(u1uC?Yt&k_Uqdb_b#Nd9dU6SzBWDBjL^pK$+&~x zLtN0d>kt>mUClU0Xn(T|-FZFYw!_Zr5f{hpH^Lr-w%;g28(Sa?+TDVA@I6`|niNwIlBBu&y0(acufQdT;=tZ9kBq4L?L&(49X- zTpR~FAdS$W4jI~iH_qDN(R&aV$F6%}EkbwSD{b%SL|oAQ_d(-r=qrAd9_q(2c7J-X z2U7d*mpTS^z|WxDA4m^11MRSAQ#W3hj!!G)r)$9 z(A~XKSNn76!R?^Ezk-e%VafC9nSD4OcpmlTYV_`XQfjC#J=g-;{z7_i?+s{$zd=ek zZtqVIwc*(NThtp!@BM8$?j(1%4BJ#_pIQaJ8-3FpnI3%|!Xj_ofa7LEf0$UR~W z4M^Yg{Q8`&^>DE`^3DCY*;3*u3_n~GXwDHw+Tu%mGO%Lwc4*&gAwhc%PrU!T8 z*z`Jlf@AN$(nCX6BbP(zp?x^+dIR+kvHRbUu{+*O5AFsXcr!h;OG*u+{vot|ScdM$ zSsQ5Q+sK8KdI$9np+oP;(4KeGgZr;SNxh2{aBP1M<&V&v@5#`n_fhJgyWU5M;TZb> z^$(%@Kage7KLRg;j(nINY{aqa-{~_CG(qa4^kBP``bbF~fHy(+f1IAV3&$Owq=$A& zse`DGQtF_RYVZYHq||qO!Tnc4>N4NVAsqWJ_XV3FweNBt?CEaw1^YmU8hsdvK~Asm z1)C7seuWI(kFyRL_ex)=4adPIU$6n82bz4acHk;s@W2(gGF*cx`8al8;|uMP=hymz zBUj-{ajldZ#@S98dL8V+aj4msx&OQHzzx34JvcVp=nM7X*w^9<4kK2q#kUl9WHq5!k*!qw!*afK_4@s$} zhfy-1yLZA~91raDg$^{pt3UMxJ0aEoQz^CMQIrhmzHZoqWAo#_tTr6?JmJecfPLN? ze+EzCxa(&~1IN}UeZh8_#*-?I9^_7j_P|aYw?E|zwj#9sDIeN&!!O~XPXZWAf^Hn! zpYdh3;W+S&FVuo#OE2mfq&s`1Uk~7H|HlE$nev5(a2)&<>KQ^0{7Q!QKaaeEw*DGr zgJa*XQ8qZX{08++>iCWHc0)h%3fk3=ydDT(W+>`e6YhdulsaNBBCnt=ze6p=v3C#Z z6GHdyk)d5Lp%#KRzU<3v!Ex8i$PFu zqkchZ=+9EB=P&R*=>ET;ZsOP-L;XT%UrdI!{|$BF-_Y?l)J+`QUqSss=+0MUy*_}m zJ)m9tpc%(~ucAI7bmUbTx9=Z_y94$3pNNa&&Oy{0g!W=t8S2ezhzmOKI`V>J#}M*@ zx`bWsao4(LK9QVD2`XqI}B};M7urIhg7(ES1G5kk8^kUCmMkRoX8L!@*s;(X-G>cFw}WBB|Yr1%MH3XUBO(6Pn^;8Evk9rz0cQ;cEdxEh{(TEvvnOF(7AM26u zUaS!uZ%C$!zOiXtnPSh_MsVB(w`Pi=G`Xe_>vcz_iXMNUd#Y&82=1DS^{l9sjYq6* zohAm3n9(u~-)1X5kSTTq0s~XTt^g`f%fw*+RM9!H!HW)NvLAvwC;L&JlY@g(#o**X z+f;F2@~pj6MCTMgV(y&cN76l0{7AHKiXTx2rVJwKgKZ~xrp-ue9OIc4!bTifO=CP8 zyTRMNUa(PX#xVO;wBWqOQ?$<`VxCMHcZ;WDQSs0?d?nnwZyc731%}6A`Bd8AIIKHd z-8)X~O!aq-!;;bf7B)6}3(z?5Ms}RoF(%M3PV5@v-#1q5ALDHq=NTE37K4JZekki3 z>qpdqv2r!!u5sSo<2*g%ifsOFJHu0uzjnwAWBj|lq6-twy>R;KUi_OH=m5vEWUuH; z^>%wb_^dJ{52X4L8uNMwy`FvE8Kc$7^ z}vd1GmwfizSJoLN8Q)i*0| zBvlmeKq64c=K&iRYVo0iXOEzwN)#ro+aGTZ3?Orzfp91;s7bPva*!T#v2>^UPDk zUXNTmDtX%%J;w-`xfZM5JsZ(jdOY6U9?|RZ?(ul~JPAH&JJu7Nk+#$`D<7M2VFh2M zcdMtyE`_wX{s+)}J3RF=or#_?GyM%7dpnuFC=ZKR<2g|j zp$P{dzZQRVdi(<(&rZ)$bkrVigQ}j*DW0YjTgDEyg+0f?P-$$S&kNUfqFxMmy{Hms zEkm-k*dnMrAm6k6jVYt^4IfUP>2FQ(F8jYrPvi#df1qJ?KR8Sipnr0J=R$So=^`N-PcCmE!5~Y{%byDPHU*uqVYEOYscY zoi2TN(37<&ZD$J7=|~X`p0pNOy@Mkj^e8g+!L~C!bMyW6sYQXBF}Sugri^Lvz^t7f zf6OELWmOo13el8;mANR~G22tTttn%gWjgSLy&at_+X#NLzIsF6yivslcC2SorWYGd z%FIM_DXleW}b>?uOE*6Jw@@I`?#&+4GT zk#@Fskv(m&S%IZCcF=PaU1tIZJZNV{xRa691NnqT*gFjdtd`|d=~-i@9rjGi_ZFv~ zj6&)5cz1bZ!|(HWcI%pz@=feP^ZY1drM`onX#%zM-|Eg939N zYSQ+2P)xELY4lV|JCM&1^1sx()@J{I%#ZaPnT=Jx(r5JnltZK043O5*o{3mwwom3K zE#~p`da_45_h8#LPi0Yq+NVV~&s`ulyN*X!@~iD9pQ zw@)1K4kL7EtiNMC)}s4c#*4;r9Uz_9xWk9Lle7_^CzdAL=y1A!hYw4Yz0KIT!`F^3 z8jybn+b;B!*JSntaH;g~z};nPumyLf-arh`0Ny?5O9sdJ+b4Kh)BU&u>q++y9wGYD zQQ1Xod}bf+cm08#xVQ4BbxrWZ{MbmtGlUKmhGk^p9<51kiQ#EJ0_|i}qN*PIy_q(@ z%l=vRJgpwNoj|+vkZP;49C4fQsjO|c$MaK9L16b$Vr`)3C=~Xtqr|0YZK#PUX{|?L zjlI9+D9><;f7f(*b?lyw9S!zFZ^sxvz6mxk#@{tv>>DG=04~JS#r8CR=XB93yM3|U z=kJ(~9VqpOJ$B$dR5s$wIcabT1xXIa<>IWZAm0djI7S^OS%UiY8xNF7gtVaBug0U)W z4zPPH?lJ?r#-c(LpafI>ePa<#R@9EM{_VJ>8|!bv{VVpwktXZ9DEr|)?5yAsdpxs< zX@C3CR6FFQTK3123*awL5&AsQi$;}-iwJsOt%r1lRDYa>J9YF3Xk`aHGq91%PTcUO zVy_rk_i_JlY!R+TqSB8GObjdTQsAjTTZ#t_wL8VLGsSijtnO=Zbx~KCE-$Vy^7gMA z)!!?xUM=ujY6SP%?cTHPFNaDVzAr+TFI7rJ*_M{8+<(H!Qj;heI?{(w{ace;J7kS?8Nkg9dj|PBdte1dWDhQHAY_^N<)(`>(iVwXx;!$JjO^<#MJKOi(hB@rMG>kkG$_dlMk)< zEM&hw&^Ar9W@JNfPlkWr6cNh^#HNVhi~ycM8;-!eyXXr9hNsG{Du!V4#1MLciCO!n zi9HkH=$<2k=rH#j2`6<<3Jf5fNdY{@b_WCdriwj5KMdL*^uzG&ll?J7pB&shRqU7? z?3^lwC#Q8x6(f^_jZ?+;DZ#-hqJN6)efLh;v~}v1!dd>^PLw;uFo|3+zJr28R*z1Jj{BM?gOnL9kicq+qE$<8$NF7i@}ra)P+CFbyLmGw$)?#Q9 z^90AC@Z>|>{;~O}DdYTz(>*RzN{{nHZm)ddto7dJSsU1SH0sfso}+OwZ%!FJS~QHq z^Cxzz3N{^${e`wmG~oB+WS_d4?#oy+k|lbM@HZZf3rt{t7B~u=!}wHEH)4Sd|&rlO-Cb72y5Vw5)+F5u1kYM6_l3cO5M{vx42QA#5Zn4G zJy~h9Yan_pLo7k}?e36ebtdcvL)M6nRXfrb>^=q<&CW3TLx z(Zl1OzAeSusUG7ElPu$seSBX3+T*vgaf^=lq>Q=V=swv2nhf&N=_9=$zAAOXo*Y{3<&4 z)A=QIKAz6MOXr-Q8;tWijq@FJK91r)Oy`{5({w(G!UyP_{qq`~2PphQBiz?)_vcY` z&icPd=WKsIowL5BbUuyrm(Y2T&bQF{6gt1gknf;#t`ASpc_zvKj?Ou~SLmGWdD960 zgwDA>O}}2}kM)P?ob$Jk&X1t<&ZKkp_Zm9q^8Y%W`$&ERogYv2>uNfmK;gI0IosPo z=iDCeG0tzjRolz;tCPaHe4n6muHV0)bGGmE)LuCLGe-F9ty(|Z|2&1WKVnAspDCQv zAEtBGpGWC&eCu5ICyObZ+uuRb&+X$8$}jupL(-o@{`-i|xxF5wbGASI2D`tGq;oDm zFZFkvUVzTI{Y@izZvV#`=O@xR$Db1q*ZKQmi%y^8e}%%id=}FAII16~#m{wrc(h^9 znH0|Dc{ZJM{Vb#N0O_lzbN0{HxV*OSiuk!suZ7OJ{BEc7RMI#87M&l~H-XMs{)bdv zT;4r&&i=fN&bj`-X~_SY&bdARna;Vtx}MHCy>`R?)5+iLj|VB-NA`Ee&vkyEqI34= zvvkh&>p42-{QlaA|1zDkJuy1x^8JT#K4i$hN9XJh?~U5OT%Q7T&h>RFopb(9FvBVT z++Jo;IQw%Bg|odUQ#kj}XVE$5_gp$>d&=pY)32lRiR9nojQVkgQC{omd@{A)Op@pJ zdNzf#z5A&@;QX9I_H%t|r1ZJGuAp=F|8a&tzCrrgpW8{E{eK&sbNctwIoFRaI_LC% zM(6C$XXu>M?=!+*qI0(QWg|RB=iFZm()n2O@0&*aVLIpX+8>wK_50s+o<{Lg$RDiV z7x$;`4}|esdYs=z0>|p}jh`WYsBntS@nRg$;KgowTsRvwK>8wNSDGQe#yIDA$z#$3 zNe?7Fkn}*(14$1gJ&^Q3(gR5k{LlA*hfKWTLH!4x-(j3TV4Oc{oIg$HN0UB(m;QsF zcKRE%<_rpNpQoS8r_p)WE92E)N6~qRj??MbPvKc~o<_&_J~>z|{~RX6#}E&krT@^Q z_d+xuq0fC3eiYfKQxzhUcq$zS59*K|6Eu2Xr1I zeH^dHufsVX*~_&e?G?+OPY&w*1;%UngLKYz4%7LpF*^K1I^UvC$-4h@ht_|y$Ntah zOlnGc;Qx0I3{(G?JnD`q>4&5rWSdXcgJeBO)`Mg_NcIECejwQoB>RD6Kk)yiACPVB z(|%okJ#wS1`7}u#HvJ?Xxv?s^Bc=aGnp-^EKyio?p{dY7hS`&7bk}`oaZ+-U*{ao^UG>(a1Q7Bf}vZS!+Abh z!=29IJpZithtA3opRIsaXgboz5CTzur5-*|uE(f;OsnWG)*$o^#QA(sdboTAHZ5``Dg(M)fb zA(!nU_gh15ri&cmLmu{#z8>;Jc8d0g8Ik9s9!l;F($`LUhF$dWe8NM?@w~m7RBcx? z9ZmZ_pmYOXEmurOQ_k~MT^@&$^O4-JiyqcH^)Tg*=XA$7`Y1}@a){s%&?XYpLjU-rV5Yfb?9hQMM``g!)QIJA~imL!Op#c=Q-H<7{T)a?0l@? zc?5PoPVjsLJ5LiluffjKML*wYj|xZ?zWDo`Q5e>b7ZI8dVds9q^FZu8L-f%65Ia9Y zwB4<*Lv}tv^gisw1LA<6XM9*OQpH5U^Gz%&VCRv7=b6~~Br!nqPwYG>oaRHMipiq) zK;k@!R53;Hyb`;fse;E_>^xJn)A)&<^Q;+*%If45Zy&UX{!2ggj~9Dr-71Gm>rzlI z%z0jmmQO5S%@fN@&YN*hH(kVxdct~k80DLZ04F`4Q3hv-UPFEc@d&NwQm6PwHb9v# zu5ZC%eV_1EC17!uUxYtAnEf+I>l*SYV6{31L`%?Kf7ZM3O^S~f1^GIMq(;;b7xV3W z3-JbnUqXD?;NK?RJi)G~QSpG-vD9wo%_N_Fl3o5b;xU8YMS3mw(faoyv=;{#=S*O|4y^-{^&(eAVq~{56Sze*z_5GVJ zT_OHL`YR1RZxe4dxK}-v2gHEErxIUty4{}7D~|krS=&SAh-{K?H{=((@MWy$WV@af zB;RG|S?9tx65nXZe}nY*oMPAi9g_DK+4I%n!fz!#p#r;}c9NfA=y}+MKSp}m7ufYY zNjzror-?V8YL|bW^q*{``xh6!kMz_mwCj1D-)2`>=B;RJ}$xt0#K$v`z;^ReVrCrZ7lJ7F~%yQv5q^Dq& zT~9vA?=ke8?!wPxJ*(|{&LMg4a(nq+;KFN2Pvk7So{LC6)6jF33%`!^h;!_EZX)>t zLr|C*hD zLV9)>`X{Q1)VQxO_*BKmi<-4|Jx3D{oNwpH6K^p1iNu=?{w3n=2A@N`%iv!o9*Wx2 zU7&bC#0>jayYTZ!Pff91Pcg}h74~{t=fbywJ)h;BpAbQc~XJq2ZUJ3mYE{f3_TF8r&cr`ga`Nb>s(J!@R}`J^Xi=qV#UZ14++ zi*mdDHN>+Gev#q%WQl20L#fJ(&@EyZEsS|0(I|GW7h6xY%gd zzngf#;Lj5;Hu#H*2SlD>&#Nwci1cJv*wcNNc!9zHO?oyO`ZLt9Z$Owls5qV%F0kuA zig>%h_3L%ibAz8q^1}wtCSI_~u74iO8~hZ-1ER^W|4bLYhV;ZL?fRpv-{9+si_LcV z&7{BGNLRn^4hWN9NqTAwJ>MhVVDOuW4;#FV((N|V?Q-FdlAhu!yZt{W`F=ysi!NMG zBSASDdSWC$Xz1DR!aq_RyL43B?MYFmxc(YE9b7(l^FC$jvW|z;jN(&8lQB+vg5uLe5jQwG&Qg4WDA=j~h=<;c;Vh@|&s-&jexOEWFfN}D zF57$Yg_;+s>yr>XZs|YMeqElSVg`iCe+fNuJgt+)(>RsYh%R|H@vW5dD@tuZ%rf-z z_-d?yHRuTMk$l!lyFKg49+Qt##g`$5+wA`FD;^M?M!NCw)$iETJ%;47jdZhJIFGyb z8+sba&P9fvIi$zrJnq_lncW^9cP+l$&QDT$#*22{v5=RAC?FpBu3dgHrMt$kXN?O# zpY(*Tu@?(@d-gmUx^~@kWU51`{E}X|dYxD&xUO#!)(NEwk^k^D2@TKd^Hi zpUnQDo%8r)L5H2!lRa66ojg8i@+%=P`+we#mgmLsxFvJW@?A=QrkF|nIdeTenIZml zrM-(Da7dEqUbitai!9e$aT6C#9pHu z+0Sez+kYYSIF&Eo&-57fG^li^if&qWu#psXko~+aAg12a2=P0TkI=dTZcP)g&x7<^ zKh<02M}bQ}M4r(%N+HspN1WFgw9nH4=aZfR($i1(SKm_Hnh%go)u=`BsbUSyGiLpd zk^aCtT0tY(@0}p+oGJzl`QyQ*oi$`<7umU*c<5QJrC5g*>8c|F;=iFnORn&*@J zwZyxAulWv=e}s7P%bG`szrpgv*ASmFQQH$3(DHfY=K|u9KWaXc@^u5a^#2;FKOxfd zB*{1YMay@Pogb6@Rzv;^M`}H-20xd0x52L@K49?2h>sY2hFsS8QN&Z#hq1QC8r}CONS?lRG^i&fcF!;U1M-2Wq;+Yfd{>+*} z{xtXs;%f|kCGo8W?;+l5@OO!K8~h8{Kt}p!z~C1UA2IlY#4`hS`}YygH~4XxTK^h@ zpGSPF!EYemYVh9??>2Y_rXnf(4Ze){h{2nPXBz!pFY$bXr(**kS>FoAs{t|5O7&zG zxa{YaBk75}$OF)_`iGeredaN#^$p#L=CqUncRBiJwS3k9axpImFK* zek<`ah<}6lKZ*Z{_&vn0zggQellYUwA0wVeJVyKt;$I~GA@S+o*Lsd2egrnWlKILf z{srPQiI)=B^Vo#=3h~Q`L#_I)Bz_0+Bn8b-N)SBK{n4bUW&oqxe+OIYswN?Q~r@A6(Y|7`5L{;x`cQ z-=*6{8ujx}6K~c7>>`Wg|4qE+w^}|(JP(eQ`n!Ioc@x>wK)is~g9&*nO5*LbPAWwFdg8n;s)qQli1T_X_NV`Noi49?;`_bD#Cg3`1L?VnIIn*S z5r39AuZLp!BT(=%U%b9)DakJ-&g-I@iC;sU*ExlV_p%;Z2ZU4g8*_rz&+Cr3pZO|r zUO!Yu^4}z0?9=sj5Anx|^E#uQ#66!S|IoT2*0X>(uOnjltBLdap+%(UdE&gDh_9!U zKd1HcIwEer=MWD~(020u@YTedslBWv{l6gIAJFpLem@~TJW=xjkB%@Gj#B*tts~k` zdM;#6>uPrCZdW`;yyju8r;qf!!}2|vm!)b&3voe_`fHxnJd^lZa3K=shgZAsdeXz| zr28q|pD}+(>+dJ~Um?!xrW;apz!z|VR`xuu0m)%Mi?1zaD_i6d9 zz`{5;$ z=XKxvbn=4dpR^hB$KXOQ?c{afp)_p|&odDd?D|Vcp4WwElRZ42q|A`NkK}osIP2$m zBOQkP2+8xh@p{rzFf+WxyqezhUrP4c|1ynytN{gT$-Y{*Xo zSN^$1J92=^o#&bCGvrH1p4Xl4q55_o>Gw~x+rNwCc^!HO*~9Zp@(uZnY;6y(OV{&k zgg6IW)`xCG{sNNcb?R*YPf6Z?q}`t9NS@cNvptz%tv}C@{{p!553ghIBLDNel%0nB zH%Ok>weKZ=_L2T!L;kNMFZ4tOv4+~$#2lS&!6Uj{dWaViZ+J}eL1{LA7ZNY-)|~t2 z`-rzcp?QlI7tgbPx=(8+egIthIdhWTZxeDQ$9z;DH6VG4AJ3y$Ysd#7Fa1_P{Yj@5 z7n{@(;}V9R8sh!q?fSP65BTl;65<60|2FZ6!51p~1ESJc_i>I3zm4>SjwsS}7uuhfQhrnB>U4P@6us_3hy}!X{}c8@1M_iOPc!NHCAi#Ox6^p9q2HfcxCe>;G8k$q>AL^>b7%di{ts z&dl;(nx~)3tnUWukOJb?_X9OwN!pO*-?vdxo0NA#Q!wQ1j))t?wIZ zzMi=CokPtVh+E$~)cjWB)^`sz-$~s1{-Nf*#I5fjYW^y5>wAcrk2y)_*ZMA^=EoDa zzK^JR0dea)iJG5J-1=Uk=9dz;zMH7|ZN#nbCu;sMaqByZn)eg8zNe`9`^2s9Dr!FU z%Q|1y_Z2liiMaKhMa_$eTi;vMypg!|-9^psBW`_vQS)brTi;>S{4d0B1RN!cIp{uOP%^?gUpk0ow>=TY-8aqD}JnlB)3edkg065`hP9yPBgZhiMr^DBs3 z-+R=&mALhtN6jB5ZhhZT^WPD-zVoR0Ys9VZGiv?;aqBycnx~zj{bPNvQS;9bx4zq` z`5fZb_Zu}|M%?;Nqvq!mx4ze?c^z@!|rW;@0;aHIERtzVoR0CgRrj9yR|a zaqGK}nqN!Y`re}E_Y$|hv#9yciCf=W)chsl)^`^*|0i+l`-_^tN8I`jqvm4^w12Gc zF=~D^aqGK`num#7-)Gc(5pnA~jhdfB-1=Ul<`u-P?>1_FIdSXzjheR-x4z@3`3~aN z_Z&6K5cWr6mO^*u+;KS$j9uA}BB6SuzasQEd>t?xW) zUQgWm{-WlW5x2g>sQFFAt?w;r{uAQXcNaB(fw=YkMa^Txt?w{u{yuT*dyJZ=ovQs{ zeV0-5qljDIXVg4Q-1<(V=3galeXmjTGl^T@ZPa`{aqIhynr|a+eaBJrD~Vg*bJV<* zxbkj7%tLg_cW2dDR&5#lEi=l$W@ ziJwQD_jM~EzLhxd@77EFX5zfh+enHI*h!rCJBkt4^E2^0V(g!w*PG+H<4qcnBmH_F z<|Hv}aJ_zfs%S8tr}TWw#Q9(ktMn7+KfeMyKW)BHL81cb>O zi8mVZ=nnD2`0$f<{XCA*)nn)Xf}L{QW8f_NxQCv%oXB~eZNHK3$Iv66qq85<`gt6i z=dbQF@EQjep-EQ&KmLY#D^vn93XK=3P5rgym^D={TJ+C)7*Q+Lj^L`gC2IqY( z+6}&g{7`K8=OyA1;sNr{0dU#AivOfN*_xpPzEr5Wcun*ARLwUKZy3_NN3|;{lfTD^7rd$Ykj8@dyNDU-a=#>w zwAZ&6p-0-ebd9|}@OWvnAT|xA$g)b9-+$_|2pz613~#c3ore zc)Ol#m*;j}V{mTQ#Z&C^+^%a3&il8t8=TiQM5fyHyvpTrgyuV`p78!HJ(+fSUf0lX zaNY-?`&@gu@VW+*$JaGXv+L)50Qw9)ysp9IysjZM-L5CRMAwsjhMt(}KLf(#yslw5 z%dUs_X%R=;Ij>&`7@YTG2^pN%DKr~=k+Ku-vkcDb5xNY18p-zaTLyH?0)9;1;qyE^#wHs z=l5bgMthIIZ|eQac&(rB8~MFhrcqBGBR@A7`ky3T5VG6J`*;i+{ArROKGrVJ`*p;Q zv-9VbJbL%@?Cps6>o7U**AY10uIDeLCurz-+l7BXc18?6ykAGL!9OPX8iVt`91RBN zeL02=p1M@lQk44)yZyZXMuEY3|BVKN^ZpwJdO@O8s(!rxM#SK}|3q!4vBi$dmaNb9v=S%i7kKV*mt4f$V_e6b<_;y4)< z?|+STb9+dBt0AxVbI1_y8v6CV3X?>aAwMro>YpTf4bJ;26#l@TuRW2D$-Ng09y~KHZUYDy7`$!M_AzLRaK2|(&pJz<>fSrl^ zLZ_Z4^ZWKeb02KK;#1@6mr1?IRNPvZO~Ym)7hL**=MC~W-f6_S93X2z%JmxFjr&H>oaiL>Rcb5MW_>r=F z`?dTUQdS5)akOIkdy9*n%fY4nJg!2+isB!{`FW7@6)bYL=LB%4{LTYE7X2IVYs7g! z-$l=b;1eOw_h}7e|5f19PTn_+?c7bA_qFIJ`FqdM{^=qA)DZ6nmwI?Vt}^0ZTJD^$ z0&rke zV^-??X7_3RoUa^knP1+=aw*B*1upZ&`)*;Hnfev1axTZ!;8G7ir?dZefKQa~AL%_E z^KKVCV^`~R`936*(hY%2{XC!6PkbS`tmnKxc>#^LHxVzGP5GsS?+53yAQkHHDCy_% zJsk^u!&%PqlfWJ8v*LI@)i-8hkP^AyMNbd7%omSmvVV?0+d192E_@NV)WiFe9H4an zMV$8!A0d9yIofZbE}hf8#4iU|ex`8}_QU<)PJVk_>7mG@4kM(ehsG6y6gGE_*3bLT zml0nH?xepI+{w@1bCJKzMgBQ(S)X~|woFQQ7dzX347k+K`xfe0Lfi=MRDXWr!bOR*{E>>If4f_2&J+5V2kzw0 zl`eX!UF5$3uIeW}KQ@s5M_u%cU+0|eap2MqyzkZk^@sW3(x1hj(e{s!{fzCKd&BsA&}D${=B{q{3GI`BK-j`fG+`F$MMw-~t07w@l_ zO=(Ohceej%7d{VMmLtFSWc^#gkHx$Q-rthzVVB}~{-x(Z_UEs_o$TKa?&Qyu^*UW1 z5A>4#8^L9|ykF%Ph<~5t`Tb@G@$d#M&-;0jJH_dWTjMqjB)=Y9=9k~saR2Z_;=KRx z43d8q+{yj{lIQmzZ2u`6o&E4NaG5T@hpi+-Ujvur*hTGv{dr1-bGmhF zK9S3@4P3Uze(K*iFFQ$|_W{%M5`_5H1P_NAkO=6UP0;lDz!blUv3TYr@=WbLhA6M3xA#T@Ow`#$1^u;{k-2V z=l3IUr+R)|m23>RME8qF!H;y{y)JrQ zcHu)Vd`z9Q{XuZm&(JtF`>o1F{&H|9JKJ3NGcJ1m;37Y}-dX=C;1kg$uQrg*yItfTcHw>CvOYAQtlQnJ6s_p=EzWj+9bEOp!&<(6 zjF#W)B0uQDQ!di!^19JB>IgQ0JC)b<;4;5FUd`oxFSt|v{FRHI*TGf)Pwz4L`Tg>X zHRt&uXtwJ25pjMGt8*>H`CGL-e|M>#?EfZl-Y2$$^juFoLhp;Yf9@n+K<_=7r)+cf z|1@yr2im7Plk}en?&P;CUG%hqA4hRVA08t8{Jtrl0{xg+Ci{6FCtpRp6kPg~zjMUv zJzpix^L$Pw`Ln*^oUd|lsh{6#a9+LvF6)~xuD`ds=()#*KdJOj5Y5?ZtRbyae2-U0+T5`MU{RzQy09ay0s}i@}}JZ2^~l=J_71=f~hq z^?%Ss&$w?n+c_Cr^#k;tdKT5^w~6yS5N;P`m{2I?dHzo}Iq6^EPJZ|VT-`sstXmMO zz4}dUaL(_k;8H)&L*VC&2f$_h=lSh3l@=kMbI~)bIOZF_WKZ|2-*L9H2wbMi^9|U~ zT`uy!1$XlQd*Dvxn0A>nUj#1GxUXs-gEFONr-!OM7_!E&JhGaHsbBb8sg=JO?iOH=fVH*Qw*+K&hYS zYjL{YBF^h0c>jbWuBCFMdZ=?DL=L#T&hqy%jwk!iC3*9`z#WQ{(5OQUT-w9?Y3!%4 zS>KcS%@D`aeJ{7Q#o)4DwRdYvYEpEB4d70GxLC=LN|64%+C~0OaOpRGFP~5HBjD0b z{+>~Uc>i_U4?KV7Y~r79*77`Go&EL*xU!%6)wLx59Le*%HSXWOc)ga78RHep!KFR? z{kS~pH?nTf@&$ULkqD9gDsU;!^W18Pzryk_Xbb(MXV#5cp63D1BKaob{9VXal0V@l zEzk3-x!zs|?$j=BP#pb?aXsAu9-y>FAD#f0^^L#Zfnj|0n|8Ca{%^VP@4N7)z@>k9 zUM`o{TQ2e^eP7ELY@m8b_Ur(6%I|I${*DVD)9UPpqrjc?&sKcA5IeO!yUCu5z@7Sy zo4{p$c^>Ifk{^4Ev;615RejSF)dY{*TuPkRgkVe^-(3m%eLcE{KH=p=Liqpxc!)@SBetytJ{ukgf zUzzV95BN2xe}(u1xU@4s>r?oCau{5;NB+LjT9S|4;q13{isQQTIbFWI-_iZxQV-7u zJB##q?{wBv050v}@1|vud_VDGS~sLq5#l}K{C$>gl3&)Y)8+3IaXFTQJNfNGaG5TD zf2~94->-=CcP`kT)pt4TiGs`P3xB7H)4dGbsa@X)F0X?;50;-R?{|@Z9NfwN=fS0) zd0rX&dBzW%)13z{<#`_6Ih5ZUi1RvPw*Nt;2j!BbJ-f0+Q`6q9=liL643whj@)~KXVSa)Whq}hDm=7 zb6USPMEq6KW6ona;%;aAv%sZ2#m2aFn0VJ7?YCyqf4+;J3UKKMo`;-I@=vL2 zp;3o_Dm|DNP4hpeP?+Z)?Far|JhG{N#}McBDS5<~gFDsRZ;?E&Lu9|*<0Ah!$@6#g z*bkq-*IEAt7ydJFS#NoM?3rZek)1kUJg>fn_*LLip1&`K%bEIp_CDF}tbN10#FvAs zeqg;WFHDA0zek8SU!Xb5|AjcO7sw_(i+-f_@b_Z)zH8?F&d-(0z-9dj8P~N6#YyR? z!{a0`ey#1{>*)(F@-cAf2mY=fE@$fZ?H$hb`TH*XUT|4I`MZ7r((^}f={No^F#G4y z2b}eP4_vj!h1&j0NzVwl^h1E&AI&7b^g(Am=YmT;{M})#O^7i+)^_szWNt_26X*H8 z%pU<)<=&w+@O5xYm*(xuHRtCM-%p(FIR;$n3DLS6w&z>m(*Hc~dIsg|9+KyEUb~2o zdr0evEzlZZhWefOu+A6HH|GAi0i4T%MAhLI7rvA9@OS-K&nY{#|GO^M=`NxSR4P7N zv;OqAA&1CS7^mW)V_{+L~~x}$o1zWaHsxf1<4CzJYfTIUcbhA zo^#Q&&xNP`RQrLyYvU*Tr-MuTc^xRZN1Tlc>}2N>$jke#G`jC%Uquy9^yha-KYve_ z>xutSsVDJwBDhn!C%fmI342M;UkLlbAv5ENbIhw4Ys8{^VIbXMc zJK1xel1F~u(t7y0Y2wdyy8J!9e$xLQxRai-Pm-O+d$e`L`MYvnx{tl6hy3t>PIoWq zzX@FCm-io-MLhfq=X95WOL_hdIMd7KN+0hjfm zi{|6CQ+|uVo%)|k!DW7VT`lMLCUDsg@Omij2Y#mXlhRR#Kf3ULkskiuYc|DM_Dh{E zuTSLq@F#Gm`Y;IYFj)tMi3(KB(k_Rp{}UN;+D_A|Ura3$HjB|c-T=?nWvV3_RG23~Gi+m%v zlbyG@$nQ`b&vC!en$eA@-+tm2y`R^1^7zT`iTBfWq>JpF z^(&oU{(fr#@l(N_>UllM^ZqSClHX07zk`Wvs^59fJLl`Ye>&^0gS=C^O^PS3m$?I6 zmRE79&Tko|`vS@Li-+yPUZ3mxGWc5Ps;6UTA#E0iQrClp5(%B0GDhA zoxlCHv;Mz>tA5XzFZz`iw4Mmf$M%w*Tfm+2^<$R*uJ%Je$?yCP+4CJczXbv^U0w&; zK=MBZcgpW4-~o~ueK_K`T0ieI(?|Y4fjIB)F-(!xfjjBhO7i`*j-Ky+cO1R z>S;e;%X7Y-A|9do%=*PkT0U^5Cj4AE3Qf+y8iQb?Pn4{d9Snn<>0CuX`ic3l5bb?iPxh+7d@$e z)_QpV1b%N)4KC}axnAiNaHo8|1up$Oa%Z}-gk`4x#aTWZTH4h8eN?{UxS!0?cKWG5xt4gy7#DpA zeBvnk_|F$z^nc{S$Hkoe_E~UMf6B-nN?@uDcuTY#Kk2<^tF7+4WYdgCs>`Slc^5XUE4aBbom-VEX z#ueF~M~Me${5+53`@p&G5mJXi7oNV)*$=Z^_(H{T-KTmRqC{>6m-#AQr}H&~_y^!l z_N2b5+Y9ffF^S}-gFE$0v%sbPe&f11@gJHupQ_VEH>iFWfjjAG26wXO2c#!N`<2y@ zo+-FrlI@81smLc@4eq4p8!o&F+^JpM2QJIEz!*3FIe3WD8h!X9xa?Zk{#S`^!09W;y+T&6ZxsG^fWtt+~9v^&7 z%hzny+)MInUU&A-wct*6-VW|mzMbIG9{%nO*TZMQRsT%;oG^b&=|O);&x4(0&$@p( z>wiRX+&|Dd$5!eO4}!~dV>ju1^^=}|3_0h^_lA~lr}1H~S2N#qmOler>gRn{xf}<; zo&57ExU5&jRIjvE*dgjI=X{m8@CFzDfa1t6%`J) zHMrEn`zGZQ{{_hh3bo%Fi68NSbANa=xRaf0z@j9hS8-};St`|H3%l$X(mOG$pvklza~?dScI`Mvx_AL@2dO!pfzNZBvIo$~df z3x5+_>W{Q)|8W1D@o(a5G_NH64}r^k@%}%V#K(W6c@6Ck#=L?!?|;R-9bEQHyni_J zpDRAvGy3lrNWS4%ZI9op`K!bW=sjZrMa?n-n3br$hOA5(c{>vmB|{aEKc&i4ES@=oTox>s)v4EzI`4Y_@0Zr zD6Orpm|ZPqY!#&?m6g$p%S$#z*H=kgC2`s8Z23=EM5Co!w?;QqR86D_g)2{AzN&tn zvOgRS=d3HKt0;}u)z?;3ZCF;isy-Yp-H7be*OpY&*DWh8TvdX93JVi;&R<`*t*SIy zR#E%ksx%!Fo|}-p9EZ$=^J_|KOE%X<>nb)xHxzAE4Oi7`;{WwYT16n{>lxw)uE z2+mQ#s!rvoN|lpnTCOrJN12wBXj-l^P1}*1SkH2m9l2qdP;O3wnR&WWD+_X!1-Z&a zNYpIlJY}*>4w@1@k%!o2vt@ERB%$&mH9?26BhSGOm7_dm zM_!^Gb5xG!2apU_{+N?ke`ElHm1%PlO+ySBtW2BZV4Cs) zJ{^a&=c<}9H?d~O*k!ZlDi_U7bP?3bVCAB@%8t2-c1YzAQg+N$HFT~@be>9dp33|@ zmBKug(|L(Gm66M4&r>PPb4Wp%F;As1FEOVwImA|p<|h_{w4-cxzOo}<*^!@^Q)wWC zR8I4i9r=lNz;Y?1?8r~FL)wpEWygF6J5P&0V9aLC%L}A_GgmuRf)*VP#b}&$l9!4Fs7Txm0vim@oZsK8dAnHupg8o9C=^V-K zK}u>Zx}Sr!^%NwaZS&`Kkp`eWSAE?Ef*= z6o%{IoBvVfm<>Jg(xECrVppEnwW|7|s)cSo)M69*5?$4FZ;_}stScRA8Jc@y*DQM( zR6pH$B=%FX_dzg{zztGjCy8DO!MZPzT?zh9%!gEt0A&ICiUbd-c8A_WCgEU#%AW2z za6e|o)~V7>kxEGR2DtZ8CZiKDBP8}dbr+Z5Nn-d40Kj^l_Aku1AW|lG@smZPD_o`r2(`J#Np-qh(t*Z{CI| zqt4V*l1-Fu(QCGCon2Z}<8Tu{CmKaybaQptmdf(7^7Zmbq$r%PY0Wn9XlZSENqu=_ zUbK4M1?8pnk#IP&?F=QqsC>O@e!1DvXarhHHgUSGP= zl3ZL{y?GTx;Ff4TVv>_=-jW)lQfO69RON@fzHr;(EmfuU71dQrBA!y7PH7ox+QJez zwd~X_6_xcBRdtcDEq^jS)+haMMOau}g-ln~yT-`XNi0-lyRf>fe1$4pH~BD`R9LlT z^Qk3uDph8SD@!)S8ETHSWIe`ah@^vMpo8)y$UZ|9%6pnhO+L6qGuC=AG!6kcP z6u(p&*;a%$6^%e=o9i0S1P;KFU_zHc+>E+v0{i?4w!sCCX50>Q>c_E-$}W_X*|o8>`FECsbHA=R{HE_5Wq; zJjDL=q~__QFamTq()n6i4+MJ&@ z7LrH(io0jS+1jQ&mBOLL!&-dKVT$Ky@wta*|D5uwx-GTk(RJJE<>dsMYfs->b&uP6_e^< zWLxe+*+uJ4EN;>07!|4`m~%+S&Q*<~E{blkw!CZ$T8{3nC}Yu8<@L+z%Qvr39rdCL zbrp2#?x}NTWt0l}zS&&LL|zXJKAxWjRI|(MSDf@#gERH-=VKJajXk-aa_J zaJXh08h%xdzQHJ(10Nn{%-ksA;E%njTlDfm}2H3`&Fyj4ZWss9AlZxBOH%G2LPCThOGG0}6)w)WILgW5RCMzr9 z;T1&AJWkfskw$ekl!KFF5{D!oHr|G0NhRS20X*-}}L*AkUmbaoHh(Yf>O6@JbkuR`qJJmn~u z99_>n!eQ5rJmsdkdQ^>3Mjv*`=E=4et>03GdKIlKzo=X{pu_fBp7L5cKjml-*!)KD{0@IYZh6|&oUl?6*c5b=$SUjc_SQMRu|5OG? zdm$WMx?q(mfOyfd^olU~b(GU&nP}xUxI}wSJ|5|8T^KEj!gD41;fOlnO%g4D$Fvpk z1oKoQ%8g6K^P@bH7Y#4Gc>SX2M)>3$<&qrgt7IvX@3fH8>!4>{6eTG|wk(dWUs@Q= zU$t6g*_H=cpl8BK>k+QA7%xhgeSwUSOFfl(R&;#g(cQC@m3I&kdB@5Rbm(0c)YsRp zs;`YMl=nsQq+;Ecdfii8qzsBTM|uccj7zx}{HZ@WD$?>53sx>!ON)8^xFd`^2VV4i>zP^WZv-19M6q@bQxVKEwk0wgrhuF%J7`XHd$q( zOA1#e)}49-bT7wt5RjNu6`Xm2s3k`WepM z8csubI2QbmkLdO9Kua+c3h}17-3F`@izQr^hrBr|LJV;z$qZA^N&QrSBXWWBqarUH=p%2ctTPacIT05eJ2=CnC-2By@*;> ze(|S9bAE+`OP|yupZH|HkwjfN9w#rZt}U}}b<~v-Pi*?SiR&BQBjCMY5^0`&-*M;6q$WS<8aP=|Q*GoGNzSS1x7KeMkamu~{&PB^_ZF0MR|LY5gmRC3lx zWjwkqHS3n8s2W2L3+m|AhALzvF2_dWG5?cK|Kx}qu)7p|<-PeIh|;!ie{s}D!Fa|p!z@26CVV3&|^9m(?6vTXr$?o zK1duVcSu7jJj_ZldfePWQ-Za5%36BzKa{ohq4mR2uU@|%Zu>|WeLtKO=Bf-FW?fDk zpm#{(KPWzj0ec692~Jn-FNZFj>c*395Jpdspj)KeXk;_)k7O?8^NzgOj=rxlM&8t2 zRe01b70;`nD<zk0>pnu&Q@RU6 zWj$3+kih-uqUtSJa5PFKjbX+gtoV+OMWg3b)NfoRXXaQ>4oWxGQFZ6D4TIJ4RU1c& z>sONW0F_`xbYXSPHZ-Y-wjrEn-A}G8T(AhUg)dSAtcSY8uuWo#CvC4Ohq&8`Pipxu zqw^$}|1vsHdU1|^sQlX|!8oXpvtjjnJ-SuftcEV@RN-PxL(fW3k>XBUwp>NAUghDHv7Csfq~bXT!>)RW(}&W#mh>M zuP8lnPihwBu>%ztcRmN&=RH_O$Ki4U3Qw_-1NyqiDHH=f@!1*)QEk(f5<^E%hT?bn zoAkU$jIP9rYcQ)PEL_>bQMo5l7Uv=K&Ek^ zIqN7P4^q&W-IP$4_E~6FM@MN{vyfT)d(3 z4AxCiiKCk<>M#gXx-ok3M)V!gi)$-nX{fG4xg)Ojtg1~_)fZQxb<0^UDuK8Q?bBMU zi4ioPBHjT;^OVkb+bWSOge%Zn@ffkX2!-RVM@-UZK@If9pDiIixC5+`jg3vS1>^q13X2-;(s+$2uZoL}Vsg|@MUDGe z&cT+%s)prTG5;U4y5mjAYG1Y>nluzIjrE(gyW)9JbAMAPBn{XAQ~I7MRIQCg}~U z_^K+aNfyOqch8LTl+1i2vnzj{A69XUg$!A;77H1IAOQmia%45I&Ke8stk>okGGxe* zAV3fV0UB$u5C&?Ub8kevi1%Lp9$8gA+HTBLGC%JZapQi@J@*F0SAOZH2N0+{w2rU$ zap9F%OvdBg?Y@$;xtoN}3r|la=m^K@JZq#PKXvorxM!(|!%Oe!6uF^ip$U&m&Dk)K z_>Eaj{jC!c{U$TV_z+C5@GjxxX*q~|?518FJ^9Q%@NkNHc+~0i^7nlCbse}9 zAq3M;+-%O@IC5lq_Qm`v7G%PmNAlOHJ_3zXF7Cw4@jBBvkdMsDbeDVGnUWGI2RmK< z8UbEPvb2+5$Y#;l07J&y9fz#&SJ1;4NM3}Xhy2X(hr|TA(^%ifOCtKQi4of1TdoV4 z$AV+^!t$-FW6)5iICN1vTS2mNz)HF-PC=&PX`SD)lvT=(j`~xnr@4#D6s~^Cuu7{M zcPm=MYHHk2plYjHkDFTiHH%P##%EdfP4;#P!1?E?R`o>jXfYVzWCy&Wya`Ua@@Mv@ zV0^viA=MpL-eUA-$yDliP*up2YtIc+ox9?Y2J(ut1quSMJJZX~brMm&*I%lBg=i;w zS!U#ObBm(vO)goj(}f%*Z{SCcUm;<<*`4mGeJt4q<+L4ZY4c{cSc9&`1ZXbSBwvI3 zJl+LE*M5-~bCjE>LvdWE3sLgM&)bbSH`3ab!W6@jFS&lAtJP#AX+>zl{b+DrYQ|Ae zYkGCaibMB{?1DkJh1^F{j?3D2G}1tEF#bg~G5(cOU(>Wg|CVB1(`iC}V|qo%=ce<6 z6gZ=aLH07HCxGqbpjFanz>xc$X$4@LGUPiX*uDU^4}+HEv-p{ykJj*Oy)hdm$cIw@ zTxIbxe!?amcwy%bzG&e!dw1}i7E)`giz<3`$cK6yT64%dy%5qte5YM1s%*T$cX~KF zYz%rdtl-t67J2r1g1>gnU)8vdzXrWduZK_hcN{-GKRk)z==6vMO>w6)?cVIw;dxBz zF!eBe@w3y9;^?{g-SeaK@K@Ei)BVi+vNs!>en6F@PaYxV{3wpE(WPku8!{fjcbwnF zw@78VtH_lM8lw*zb>LQj6E5CI{!tDkc9ZSeoz7c@CN?&xyf65`F?Vbb*S8UOWLg zx<8r>5Yn~m1@~!`PHF4V2I4k4K85>qJzB6W7iVX`DZy7<^Wl7CSd1;m=(D6p)twfZ@aYWj4pEk+q#YHvra zQuL(OIzQZxKkW7{MmXJp23v9es`c#-LXO$A5uZJIau&fwKS6nw6n0M+C>m$xfxS5( zC)@p;7i_RdtrV3MbT2S$jTqRR5iC{*tRw=A|SbA6^`zTSrh3TK7vq)o3N^k4M ziNU;|-rh!M?K*D@{?*YAhT747lX)AD!$<2uPX_|uPp>&>r+j5@j4m`)U0th$# zgxWZPti~vPoyQCO(H#$ZBABvD%uwUh9Q-KM2I8II!aFe)jP%PZ)iuVg05~c5pY)1B z%NUFdBB36F<^BNIXyZ=1b9m0^E3=<4ISa?HCBL87Z*T+h_bEEd0D48adn^GdjLhr? zffden7$b^@G)cXkeA$z4?N?`01c?|B9%1#7oUWNZpY63r89%<PhEa|k~tZHyraF=Y8sDlRBLe{LO`hIlRT6HHiHCk7MkKp~+C2mK`^?_r&zXsNf8 zawxgbWoQ9LQ5`D|ibVZz_$_#$hmTuu@^^u8@OB9am@ZxN;P+_xMGJ2Gd_neuK3`2X zT!28rTxl(lax#^Yz#G{_)=D^!{TcC0vH9A~g`HJk5>V@fTQOrsPh9W83EI7_S1_^> z43%%UT5Nje#>&_^n)K9qQ0#XDv6q8*n+NUARq{KFWFamP;ty$9yKzt0s6JWDZXn|X z0&qHsHTJCvC@K3qk(FhC?Nw{YSdir;P$$>f*3>trO?x(l>u`2HrMYb7*r|N}5Y3 zijM}jKo>wgpz|kh;Q#f-$5&k~LR)JPvfzj^N|gHc@iZRvhv*v2G+7#>rJ92if>*92&==sYMB9^5M+p)13HMD6B__T#t>)B=xu1_y_dh7b~J34|VVpYzUj zi$lW^l4^ao-mD2;VjA>;o3ZT)X26zd>nR>73{`TE7=$V?Mzz?BS8nkED(N%f4}wH~ z><2xZV2t0!!P=1>8$|$yoe}V7^s9yx#fPK27%AKi)YmcHK4?t+n#*Y_^;KqyGqV*& z_2P=i$gEgw1z^J_ZVog(U<+q?aFvXeO(RfRdFYF0PvRq&DaJ^xxTm}rzC#6oWpfe} zZ10(v6|*ouV5pD9c?DdM3*CWfMXIe@o86&*;SezrRHv`|&~VmF+}GjHtd)r>p?Vmg zOFWA1j?oZeut~sEY!w^uJxVur#oBhB3zS&kUKzm$+*AI#n|YU9Q8A%9 zlzzL^`YFBtj6S%R_O@^mGUq2Orvx!ektuZyV526AOvOX=gm@FPeUb{hMIN!rxAoli zrU~K4XxI(b4WL*cq=RIXxqzC;DorGuJM?)3q%oQH;jql_m;_9Tyi%?Yn(q@>#16y4<%Ng#(OuX9Cx$N7OpN z)&o@fnd{J@$@J4|t*s4N1;Bb@FxL-Fz}AGZ1xRAIe-JNYP0VhDySYUK%ttndsh6w~ zh+QrU`&Vc1@8heh0p0X7V4H}TTgQxI=^PeDu{x9vx~B{4%ZMCmFI+rJ^pxci7rtcf zJC_`T2q}YOUgVWyPPyBJe@UGSLX%Gs+T#YWLxpWLJx^?t=}!?Ava8HRd-dI|k|C-> z>z6aY7q2P%_$H&Wi)X--#7bsrz2JSoslmPbPrd2x8nAwFhbDsWz-WWPk!FHi=Oy~R z!QCil+j(!k98_y#X_p$4B9{?G++aq9LHYQ2mGF?uookU21MXY>)o2Q7ngJ@x0_W1_CXhIn^y#Y(upt8S$l+ZFj%)9 zO2%7Qy++=_94gxb=r?C)H9lY_sJV?zvTe6nUQKXr{WBNflB-Y_JAjg!OmzoV()-5S z06uF#W1wf`hmiX+*}E|kB@D$ZJS}+zs%C_lW271Z*qsC9C*DKa@?*d~@pE)&SFz2= zI!J#Hk-ntYVj$GELa6?1$pH7?l*RBS)9!o_dXei4b2aLz+d#c&0(`*E;$qnh3NV9$ z^lV;_!i@X&%;aCHaSIkYo6mLW4NdPpmZ(GS1m|602Xe~$e)HmPV-u~jCV1ACC!c`* z8NEr3HlTsl%+f?m-fG43SvwbK?oDnkN45CM4r2~oae`-Z(^>DA8*Q1857kxuB$g#H>wDS?PKjN6C@#%=}1^Q;!IZhGig@u&JV_qh2{gl7>ZQEZ1Dpmd;r72Z2kuTJL3*Gjsi5z zw!v!@j7p>|ojO=Lz%~ULA@2cu;@C8rNexNf``yua0IZ%+p=N13$Dr|?s1stJqu3Ly zMt!S`tNWa76oG)&j13q2oXqMDT4AAIV~qVv!a$WEAbDEDi9c&1(!24;wd&q=g6>dA z62VVPuGu&@46THg79rPU1A`0U2T>eX>NBf0w_OyWE>aDCI!4s1l^znW*Lq{wq$G!U zR#20XL2Zy6JH?=2S<)BRB$VTAAl^Y$r+kQADLJ5!T(=ztzA)_qq{f`eX(LxLbn-XQ z1h|l-aEfOxpP79>{&T)+b%Leh-TPk za>OKOJs=4Xmbd~S5#C|y!pr6#B!FT%1V@p4YR3qv~LoJJ&m7y zal+|jn~_7ouJBIum2PCC?h@Q@!-;4}30}*mupv#x1UhV;LX47-0^*=aF(7>G48ac@ zC|m2?fxc%rcrT77r(mN?D;8;6>1AhP% znn@{~f$)EI&((M#%{#zODiAx}-mApi0f*U%mHeRTKirT6h5QG9Ym0p1813eBkUNf2iu6*gXs3W4Ji*-N9~Jn@#5{(>`T!P!%+6=jd&J7!+_-xm4E zjWq1mj_De|!;{WpTeMpW+KWty1%`pLRm2kjf{f9VuYFg?q8;WlJNp*m-DHrmv$Tdi ztdv$mZ-Ej~dW(tV#RQcA=&)q65p0kQCVs9;RC(>#uh1+{(Vm9jBpwwK2tsnt=-kzW zI5T|PTPHf@4?oBh0@1DD^_Eg6TvCh{(Q?6Y+9i?A-P)kmB@QKNIK>wlV7P&$&BH(s z;2l^!TrBAYsEm=~GWrj*Y1$(yutx3WPXN*NYW3}M2?CHfQ+9+vIQm6 zaBOH6QmzH3-kCF>N+ZkrdVxJI;?5jk_%h21XSB9^8$dYD&0;mg4N!)Y2E@dU8c|ntA96S&qXARBU;4ZK(D>&T=s9POl51M6ozQR zs)~FSH$x6SWllLViP5wcYYS4lzSS%*BjW$Kp)KbExm}-4aZiR5&Ap*Bz!!rMR;b08 zXx0(NUV;WI3swppYx7ymc%IgQy%e{r{Q@ZjtU?C87-O5#Nu4dZIKVSJffz2aqmdWia64Wp2 z@15Fun22f*i-RQ%z?}^c)EA zDZ5Cw?dHA%3aDn(ig*Z{Sn;hK#9WFn7}NWNn*DJu@w|}}vNbx8r)KMHHH~v9q$3DL zpM|fA|GqR}9b6=!@1qX-`wo&Ma67aF_e3&BqRA@X(X*q!B40n2qg19H<6Gu+}j|A zu+d#B^l6|qK)CCIP`Vhs?t{4Lsmez#H_M#dc1XbHj2}L&nUvz_r6fw|qk2Q`RE5n; z;yEZ)NJXMs7Z^oJYj`}|twqPfy;>dr?jAJxFKUK|wZ>kvzQ4OyZQxCnpVVsy^@F`; z?SP-~ceTCUy@T5RULEztL-}2Or&eq3?lc=bWp!Wvsn+VdyS2tHtM!GrS`Zy%a2X7A z0h0}OQBx5tR3?*D=&*AbNe3;!#m zE1dKC(xk_#FzFL^0e0W$`k31dm-NRdLvLY{*5|o0(o)Ww3@B1$iIsD?pJawk`w-rI)ry9ffap5T8PNF=m1ap8^za;qlC8jMGhvkOR{q zL@^Ak2l+`IbP@2PQW%3jv%N?zBNWuKoc8=fQ!%=U*lw*;#RmdQE9FM)(qcP38z7W4 zqBh1d0aKwP@*r$k`dy~OD^__0d8Z(Yc%EH4h68Z~ z=Q)A;r@F(sUcKZNjhUD|Vfk4GHUs1}e8no#OcaKIDn3Mc+YS1Y_Pgq%#oz4>&Vulm zR}w!DWU_fOLU*VSyHF)t6GU(xNv`j(=!j@-zvqvxzXXb>v}DY&f@v@J(^y~+wPpMg zJo|myM>OYZ9I{!r-gD_n zRBJ!Qd&)u9)^oz(Xa^u*?!=%gSU_O&bS!A*K(N59gE{F7j&ab6tHStnh&T!Mk6s6$ zFbhIQITB@>!_CD#)PxU+3jaH?+FIS~TWvAM(U7gZ#Ap{7Xf~cO7+_8JkibT(*l6Hh z-X=(W_a>fDnX(X=LI`^EurrB<5}a$$YpPDU)j$H3h-N`S>1j@7nw6ia)ypEsSawQB z;vU?FBSG7n!-7-Rq!-+9D9!R{5}4?BXXG8><3gvQuzti=r4$yS7;q!(5g4H#78{H^ z>m;orZ4`kjY?1=YPv?fAtAh9&&__n$X90pGl(K47 zQE$lS5Pi2P8}|xRtz@Yhk4(;lvjgX;J;4Hbg@(=ABnHh_Ajzo3iR?xVxHg;mnD4dI z<2qPn4Uf-7P;M6QZA~-JC~DqyPh8rC$`CE$kAY}{X3pitJIR1XUiD^FxnkqIaKWT( zu`~iulMG8ZL-7Zi<)-QZ3;+Uava~k}Q?|v*$hFUF9R~$IsEfwHLj|dz;~WLo=$$lA z_r9lGI)K6-4ue#34FUP01IW!EaJ(fxu8K{fZifYG5!!_R2dpRvcSGIS!A% zyfZMQLJvhg_qKL8#c9xh*4qk!wRjlyz^GM0iqy_Wp_bfwS=}=h+-hMtHf!2pM_8=t z4#6eTa!ov}0CXVp31CZ{c1`0+T_h`XV}7B&!v_~%2=pjH(^Wmdjn{hyW$}oZMfn0e zW_dUb(2y`7&^0h)v`gsZ%9D!BeE<~CU+BXfGWZX(-hZ;h3z=e-U;AiJ>7 z$fG~*{rft}{{rkn()s)*~+`oG1|O36e-nvP0C z{o)I_egLcQLvmdAi;ys3Ujx~>_Mr{wMz6r>MwND3E@d@zN7x4lwdd?iU}JwLj$|@w z*ExW|(zt`h5Ub|BqmIOCs!d0yw7Y2f9ST_s2M0@v+u5Fi_;28zm2{*YVp zGBtox1N(SzBVj{4li#ieWiklxxd;-{RS|df2&q{gE6DAO^}g-Q6ekFt#~t9}cnf>1 zw1yU{-y%@U*|5`gzs>|fbk;S*IB7s z)nSJ!g+(yRnE6XI;s%<9PBa>(BqrI5G~TY+{pP)kvY8}0nX=V|Ca_KfBZbEc;i_t$KnC2a2&1#jiAhCOxd{B2eH|D zB8*wRX6NSW9NQJ{xLE;i*=+6zv9uy2#D@G>Ho*+gR<_G#mCtC*?!uyV{Wa_~FI-uc z)>&u`St9faDaGrvOT#2gF3BucnxO6#X4!V1rdx`1+5jn~5>w#tEhC@RE4QfJ-7I9J zYFft{keutTR#bv3XD+X#??pk{CVn(wln0#y4n?g2^|q3)t2=<^(Vdt($dn9kmY5=6 z{&_)6spHfwsYN4Eag=~(qy<#ShKEtT6r@>MQNUG&FSQ|i&_UzTSXw%v6bI`5PWyrF z!g6K-)&o|0hNVNc56t1riM4ZaMLGvex2xd6pkSMbE)%H2VNVZYf4l!U%uK4!dFk7kOv=DbV z;J%>FvoP=yU`Mo{9in$pzocNF56SdJA3d?ySTDdLc^#{p9zxZD&3t~?WSh4BYCiLW z?xy%GZa-%j8uFUClj2K!0cXb&DYaNlA9}rU@|WZ$_9kt3m`dQ|HI={!@WoQt zuwQZ)X~0crzySbCo!Jr6jBG?hG9k$`eOB!`g;E?9zx`5!rLIvJu(0gjnVh^K%s~Hz zc_nCMpqWbW(cV92cWvT-tQKY8GnG!Tg|seI`JJSe!m&2F$P?JPykdUI`WPZn!>D)CzMnIT^yE+ehb2RmNjSaFcu-)%IMm;7Y z&hjT%8>?uJUF+tZ)^I`$s=EsymEa-6K>*XRR64DQMGC8a17O8$_L^~u;6zzTWI(w` ze41s$3dLZGeGss9w^wcGkCbmHmsN}l!nJLz{+DDq77EFX%aomsNt4?ACVDXXjwCV$VeiSWp& zr@NO@k9GGBErDTGj7PAwQ(I=VibToo*c(YQ+wo%Q&TiORzNi7cZb?_R0vd zaayn;gH)MXL%-5-F}ICA0^CL`s4_C-#{8w$P#9wk|nc|+2}f( zT7Ikh`bc9Zw<)Xqu^1$oL_Xc@uU$@AS*Bko0(tN{+ov?qz=Hro!RO31&7j|zHqF2w zF5Oz$M)w%$(p(2?oYi}SVPHJy43Kq+2w;)crvR3~O!GJ3#*4zJARI>Lf-v+-NqCtc zNVP*+wj1Hf7z9iv7jGq zvG-BZeP7bNT^~8Ojp*u!Thd%C3L}5!7F=dRHY0jw_m7e|_aPVHzY{H7kSjLCxc5$( ziYjzx!*l{|vGH7sWp$aSyfod0Gnx}xH?1V*E2uT4g-QZVYk;D;?)ZAzncVcz zY(gr)fZ6C?jAtJP_Yt8ZwMQ>zbJxiXL?nz zB2ZDM1)=ijWjHMe<;`xDL~im6L>&ifG+$)OvF`|*wyw6@ypI%}P3{`8tx4^Eq zV0O2_qH4&Wt>XcDmg4{TkF|aH1}=g5aL4|~Z~d9oqObe6^F%>h0~m{L&xDD}(I?TI zf!-1j{l(}NWi4Pyv$#W|E~^I&!%i3jU6A6Y;NV6<1FUtE`QE1R4u$$ZHdUnxIrX_Wul?OCGmU49M%XUwQ z!DH;ig?24jfO@XtqX36HchUj zZ}!E>lL7WXz2N==IKT^Q{gz0TD=Sk@27|PZO$$wI=#QdG)5DSFwn#ie`()WSy5F%euFiJ)uJvd!yaZf>2LdNbLYnO( z1TIwUIE#LYc+{x%N#dpP<-6 zy#1mAu|JsZhg34MNHqNp$310+E_G;FGi4nb{4IH%Vvpuq9D7t zj-T|-Cg#AEky7X7Roe>B%ZR>DeBOkwk@K1ue1%f}P{^66@wD>kaKkOrRlUZJy&eG;#+XlVM z+$O)NVkYwLifNPMVK^A3SV0$*Et^MufF{p+5ApSIJThAySS)0d^l!1gc!*LC z=yzXTL&Zx~Q9K_PCccG8W0v~G0v!yw+b>&dAh|;HZUQNcZ~N2v0-3vXt0;)7Es4Y? zF{p`$!A)c$F9n>?)6`dMdwQ?1Tkcdn5liu;ppQ2gS%5O2S@ zgq7O@Z~%`itR(?y3e{}*_6+f)rI4(t7At9rm&i5JBN$qw*-(y!R%!EuB5QE+^}IF< zI#U?exjDHp^vaciA^z5xlgmJ{lnQ?%nClXncQv>3pmr z;dCw>NXtW+xQ5eewo|;gfI8Vk%?9RDZzOb*HZ4n<>G4j?uQ`)smR)cr+5Sp z`wDeGK$?))h=2#&9UL?Z9V#XetryUmeG<@tRS8wE`tT^glbOxS?#T=Lq{xizK;mQx zjdjOeIPa2pORJQ3xl6Y-m(?0vVsxtL3~9#7+Dz3PIf{fYLz`|f>}w<@=qrzAcSCFt zj#uOl<@Lt?h3%x0N7tjpqsv8q(EBg_UPaz9g;06ayBpz1eVtGB8#MBjT?FK3=1q+6 zu-Rva2bjMmgL&lANKV(&FA*zXYC*6^$}kG@0VYW?eRY{$J^KMf1p478T0#JG_Uq$AAkHZ z{%?=}Z@;47*w^2Cs_%JSp2HshANAwPx6J4E_-}lqU)a}ger|qfUd-*e51-?&FTMN! z?Vrca^ZK*O4}VXOx36}b&DV0T_HVw< z@PGgKADQFr>+k+2|JRkuH^R4-|C%}e?2q;O?)6V8o#}ts<9{Dt`Pct`^FPRs?dz|n zhss|ZYyZDLz#AU##@`(O1M~XVL;u(L`~UBm_>l# zKPbEQ_&@p=z5hS@7rp--GqLu$?eSKQ{t?Ie*Z<GvcdKrj6st4^&L zdKX6<7tVa2z;gOs$cmTy<502q`+%kq@_fDbttGY&;CKDKqv(4gpM8DBvEY18&&e+C zU6i1H*L5Y*9ZSa$I%dp0+FEzS@#j39bJ~-04*vP>?VoPGdhL!MA1S^$oW77tM+W^Z zYcw_?CO%=0q4NjF#f`LL$6Kx8!Bd9RFW>g5nDOJc8-1%4POuWTORxr838Lo0;S?** zifg8C*OP*n*yR&qhb)gRj9I=sZh8D=NoO5Ymk?*2JSb_D6&IcmYvsi6eZ%s-&b7vd zEo*RwWyK|Q#!nePI3}DKch2Ams!t5fe^mqwHL;^@t3s_>yqO);C(#w$_9^SqaVA z&DOH8brvNm&PUc~CdLjK6&G{pltA-mz1tOfP2F4~p55@)UN57+N`0YS3EVS-pU+1h;kH;wQi2F zVy*BXDp%NwS+<SZQ_6|;an0kcWyP)I{h|<4to(}_;}QlpTT~;l zweIoHS%awl=#%i8xh3$4PW}=_sV5hz{}c(fdOF+fVO{=&0cHN`4Q} z`^j`v(GjAfhK?n4ET!W#I;h0fGCG#iaSk2l(s3Rg7tpbSj*IEIgpO5oh}RYLekC1O z({T+QtLeCw4)MB<-mj;lk&YYaxRH)q=xCzjE;{a^qnVET=(wMb2k3Z^4*hzV{%+y( zztH<*{P*MhuH~Mj^EGrlL&vjpJWt1qbcol>^!^GRuhH>39dFX{79DTX@eUp0^?&^S zKD~cH$A@%$M8_v|d``!gbad14106rn(L;xR{YrnY6X%1e66qL1$1pmE(-BLDc#Y)u zt>}Fe9i#bt8+wnUV+J{K&^e=no=v*|d8jygInphLV?@cT-7znG4CI#w~ejNTjQxQfq({5AadYI?t( z|GtUdZ{@#lr}sPQxSP+#cbfU{2l@RWet(qSAEV=OK7WGV*YMv@(|a2oFVOKa9k0?M zUa!&n8+5$I=Zca)()oLIywALo-an$_Q#wAU<10G8rsEqr{+adLwyR=R?)2-62b^~7 z)AxRO<}V*z^2*PX^XuwTuYGvUzxS!m2`@bN&Pn4QdHcyP!hf$geC=54!X^Lr%tNo` z9(TsF&p+Sw^F78)Ty}rPQEz6R{N`r~{=Bu94gTTUtDidQvmwtf`TDo-4|siiXm#Rm zzoyRG<=161CfAkZ&~g0RPfl5ykx)AGt5EHgl{2oLOYD(-m%f;G@Wr)1?E34lSvLcbDbW!$T`&AM;Sd0QQN*%O~tzCGoRC$9Ydug9LTAoha0 zQ>yBp*#DDbKAJGG?)&0{My4cMR`25TFKl8>Fd;I>= zq+bs_YR!lHzwy(PD~Z4T+QT=OZgtlF-?uJ$`i!1KK1dtClP6SF`nRjr-F^0sjrX4}3cP=-&??a>yeG9F_apDT{w`tsSv=*)b!x z4PW=@?5p0a*}eRdE0Y%wyEf;V+dE(XtY+QM!yX&8ZjUcs$b5R`Q@4)0@Rho(HBA|D z@7-MS@$dH!-+9QhC;hf)Uw__jU#Fe5`%O=s^x>{q-#t-#?F&mj9<%ojH$8Cenmq^q zv|H{g7ymr}o}Vfwj2U(Ls*;1d+n0TGh;`(QM*`=+I^mK#s#ktgIfmwk74h^4RTb>aX1WH*a=I`={gf zo#zfecFa46R=s!R8P6A5Cq2?o>`mFPIP<{Iu6rSr`{B!rt}Wbe-SB_ju-A+C-f&yz ztyfQL##>0`!UcGq1`oqy7q)gKSu^QM-gK3m&) z*U=r7OV1com3wqc)y{iPZoTK#kx#z-;2|$x_vzXhZ|tU3ySj)6eam(nnL*ojZJ{>zkO>mSJT&LLwB^Sf@_6l( z>xYGU8m~F)!N!~c<;{TFRwi9*n_SK{o~?aj=HtwsMFet9(v*Y^gH*jd9H3kc*#q{Crw-R z)cvPCw)66B+SZLY(v`LAGv}~PIAGp)Pkr#!#p%CopZ(~I z^H$a#JnNUi#U;V6e&xrro>6k}Evd(y z@$j5SrrdDn@msa6PMvk`wddaLnzX9oFEd&u?RCvZR|G!YrK0X~Pxd=6o$~9F+*d!Xx$^PB2e10q zX={hvdCsEe&)zOR|LFN|Wn8r8|K2|>{g&XWZNBlJa^AJa?fAvTX^&lBzxP2yejf35 zcW3b~Cw@ET$`eoBdXew8K;~6{zc+D*@txlv7D}8~a%0wcN1d0JJ?`uidro{N=gfN- z-*C)rp4;-ajoCGvJ?g2OPjtQhkNW+BAD92s-ITFU>zVt;b^YH}HU72T@5Yu~_37Vs zTsI{3h;N2`*EHhvxJjN>ix!{x(c_KX2VXPk)!OIZ8uN7Fxet#2Atk-+ppWJ?EIRJ4 z%z3xu7F68-e%I_Ldwx3Q%RBe}%eq@$y*jh?@KJTAE`9c{mFX|M({uKIX={($>%JAY zTA?EzDn0J03!b_<#-DifG5bxp^y6@LLUstmAm1~=p6?c{nS(Wgw!bd(&{P?$f>%(Q&$G<=Q z(nUAd?%lOE{=4!28ansu=A}#1-}`a&8*OVZzhlG^&%N{4JG=+qHh0pf={bo@Z!HV% zyyVT==ci{J*wRES`_2Onz2&1z?tbRwOJBe7vZtNNiyo$hyDI_JF`pZIp< zN!#9j^Ivy6ebjFU>v78NeTX%}Y8Szy@fu={vzkZs&QHb1dmdm}G`m>uRY0>1ipSS` zi5SI>KQ~59Db|1ON;3#M`QK?CW5-uhx_0@wj)d*xw;gWJr_emYPX68n_W6tt+NYc7 zx94}$1jJ7NnGU?^AbUOUI@t46sy;jYkI)3gj&Dbc3wHdba{F|5BVjxFZ}zd57jdAS z{4fXopF8B|WQTO$bg~oMqx+ggJLySYce6-j;-6tH{W41%No|$Q{C+tw(#rxUIpW$HtA06s< zKZkbuUX8u}zdMxc0S7%#QGV>|<-5J?`F%cnzEz?UmoIXNXYO|xH(z&%6FzjX=ihg>Pxrzs zdwy7@J-=Woty7v#Nath8IVtJ&UU!eO_s@46+VwZ2!Ooxea`40D4)N_R4tD-@YkU0{ z?qQ$*a)*8?%c0-6!NIS#bI|{oLp-^?gPudP?elrALwn!KAwHb%pnngC`N)0_?PxGv zwX&=Czn^H&pK<6{*HH&&rzdrqJ-@%&p2s-Y`CxJ?JHMJpag<%UpE}Gd=Q;HMGZ)(H zIl;kC7C6X%QDCpA?+{j?ein9McL(ZcZYI4t$8;dhT=RpFIwCsCBTz^A38t2ix2ESBL)jR|h?>Ot#PeTMmBmBlWj- zcFS`Zf2TXt*FuMQ>2tdNZx=t*JMfnd}=g=M#9qQ#JhjM-CFkbKI;BRL+$Y0@*pGpV+f5E{|?sFJ- z@^`ei&!Z0dlO6IIcJQmyDGs;us{9P&BWAs+k2!G8{MsF!+&^~uQ&dWJgKA>N^#-a!3{U43OZw3lBT z#-k5r*y|bUV9(1O>b=NeU8TmMzum#1ohCT==NVJ%^SO_M-?|<2cR7q}(;ddIdmZ!~ zIo#fFvmEMoPlx_r_tAw8usVf9uS%k8}2SSYO)Kq26yIKeY3=U&(*$ z;;4lV<(=;nA_Lp?Gsio$yD<)a^#Ubor)RN4Job=7 zyK_6#;|hoVio!ZuKN($VZ-?;?{<-bV_VNoI>~?@dy5uIdc4%@)_eJVA?CPsB+n#?= zVeeOukRj~!R5-Nj)zqKc`RBK!$F3g7I;1Ek{3^%3TtTl`Pu|K3 zTt^L%Uc7DD`f`rq?ttP{ee$(!mC&=5)!M8$O{3(i^g`B?Mvh9acKJW;!Mj%R`u!9S zF#nkv%(m7TEA~6JFI?Md;cO+}S{a@0-j^}oL+PRBFJJkz?j-YHtmM;~f1OKvB(2fb z7oy{$*Z$0Vs9zHDaif*I*rO_5ztgEGS71BEGe#@^`4vh&V{fHL+u@C{lDFPa@=Z$I zI*`66^fzyUD{#YiTIOfHipTn+UJ^Ly> zy57G%Ox1hcjf(4ZR~9Py&a;*NcGi+14$un8LT=5Ca zcRfS(8}Zz4gqd4xpUwnT@7g}4>?aw9pUep;{YlR#{g<)7y-n*#B0mLQ#kHQtPEtJX zR>j42R`FUnQSpQYid)Q2ri&v&Py1nt>+-smE8du_@~PW(6Wgs|0_*35?>|@BzwtH2 zDckZjvsCfGON#6IeT&;y0sDjY+w6LkuEqAzdh&~fJ;zxMJCBljb$LTnF42G1U$64X z#j>W=DLrBC2bwrPPjmmAF&*PM~+k6^)1y9&U$*WS(K56#zjM<7eu$~ql>$zU>81_$b+m!J0jPZ*1 zaDI+IUCFl}sLGYidIECYiPC*g$$!c6<=oGAj#ctxcKMonnzBP%k1B7N`69p4A9u6T z)5iS#8O+NR*X2qie~|vkc5Y?)7cWrUy`xH(iZ5Tgj#oV47^Nqc^B=xk@z%YRd=ksw zlc;!Orjpm=(T%eeZ?9Bb`^n)nUI@FH{r0M(l>c19{zJ`BzCN44{+y=th&}(}m3E5a zW|R{1BNab@`A^dR6rXVa5U<3o z6=x~^8E-0i^*`O`NBI%;*#3ed;{FctDmq5lp@GN!s}#0gzEkmWw<-JRYu4A@qU>M5 z^`g^#=?0}gBT30?`*iNCc--MC-J4l|>TOC-_7AFlwH_Ds8=_sfx!=xa`R{o=vN#?l zx0J87JbuL)<9i+@v@P|+*WaY_qvPI7iT;U_GbYs>*xz%}SokD_;k)JrmfT zam>$jb9t*&xzzu3-_u2kH}9rOQ9SfkQi!FryP_8)ES%>KWC`Cc4HS#K%%dgiGVKZtm& z=jZ75IFI|=1nzHVv;SYv!1>|+Cx!J``ASdV+vs|KT$XFJHTec*HwqW!>zzB;Pq_cr ze&W7T>319Ri-Kj!e_Dx+BQ~Kj3seI~ju#WXx_j3-}Pfj93iT0lG7sd0LXHrKb#~tp^b$ee#_7vQ5 zDg6OX_kQUoqpj<1ReS>TU5;1s-B&98?aYT>pz>eK^SiK?-=5Q*rR4Rv|H0l$KAziM zI?M0Ahsu9OP|5c&--^aTna^ESeqQAMb}GjY?GqI5X8GT!-w^Gqjr-Lw^IMNqdRlq@ zwF~p7xxKr&y&u5*5^leZ9V$Py%#SKm`K&)hah^_CYiBC`&D{TJ{l9q?51*stTUbvQ zkJpXd-;QN|GZ{pbxAAx-pThO{Ft^hJZl}7w{>pmlS&#abW&L=Uu)}C;IgdNJtp7%C zzs=l!o0L1rSj9dQ0a-`d}dNR68X&F z_*s2wSzULkdOVQp@fenGp2zYhE6HN!Z=a}m!PSblGtat2@p_|wJB$16PNUx*v!g1P zxgK@uAxclctMu!9UY)1xU&rxeJg3_=h4blCk`tI;$9~djj4#WWw;OyM>q+o)id>JM zp1|e0N^xD@v7=P}3-(i7uN&Nd7T1>%*B#fO^mKCjBDa^XCh`;ESJ{T2yvqJo%j+%F zY~`z-?cB(AK8*SCT#rw2zpCTp>u9}B^xFl8sC>4v`~w{SG;;jIrM9lSOXVktpJ$=% zJmp4}|7IRfwO>u=@vGGszh2r!$+sHuWTQvrC+>BXVi)IUmM$;1FJ0bis35{V9Y(!R zka6G`tJ$#IXN%eXyzZp!Jb~;i;>-(;IP;TAuHUCsekj}WwQ#lK8AhB|!s`!lT;6P! z_uru8lMMTWd3{j_-$J{zW z@zw^#wcjSs7kWlp2k?AQ+vnUnl>P!Eek+@$csHl3>!oao(%=59(y!-13uL)QTXh_- zPT>5E_9}Vnd?nvOekoo%vV9WRKI&6iU+4NQFyqy)1e5%{9&tTc!$^VV|dX6RtqP-*Et z!vEu~#679wq8De!+Ph4Zx1QTeqx_Vf`#>2J<3-r$&u_U~+2Ji7FLXciMM%lFKd}pvHhw0 zl`r>dC7)!}`)cXuqpcO(Pj1KZH8dVc{aH$X2lML-RDKG09Wsu2ut>=_FIV#I%!kST zYP6MqgQ|DxuI1~{CS|vixn0mSM7~x?JB+r*aej1rId3nezw<<;znClR@ntGM-NyJe z>~baFzNboe9qXUW^XTr!m7YZARh;f1PIm|9SD&itrI!6lxAzCx-wJqM8PD=D9Ori% z{a(j3wkO9SvswOL%ATA@xVT&~>Vq}ADf#YP#dSRYz0MD(8)iLKla;*NqvS7R`|QQz zS`s~+N4(0I-_LPT0>^;?))Rjzr^|lM*|C;ze4b#$=M$?q|2+SyV?9G@+!6kha9ec# z3olc=ljG+TSbjW>cft_zdKpU zciyY`T9$vG*6U_Z_kUQb^Sn~~!(pUQT=#6? z>ld1@yh76%^a7W#yoeD;_b&N{rSwtrYhcf ztm56wd(KjJ4sd(X{{PFiO5WO5$^XFeWw$9iG#hc(J4dp9?mx9Xe_XEgcfOcXNK0RI~A3je>Qnkw0gz1Xcv%k5Sk6W#H9LIH9zmM&fVc6~69oau0 zR+7)Ko+0Nc9`~K%I)3%TE9FXkCSf8)wwlIZ^A9~_TaJYUdp&ixz@wDWrDG}g1z-b#Nv z&mXlvk1bF<<6KoPJx^(-FUt1C{a7~Z8N=&x<~Td`F6BSjMx4Be$H6x4SHrC5b?%=F zjP)YR<5^fXwWyj3BO$MWRl&G8ibs(cIm!H};iZ_d=R$_ihex3J8oKC}PCQ&j8q zl=v&WW&Trqba64K!XNSkyj9-vpeL}jmdKpS;_5QrG+&8Fd`2Lzw94l#&JB4(KFkfij;cE&V-ZX~-A!Os}fsf@D?{ z=c>9ny24*nS?sg@Od23>X+YGWmYe1i;s9hlRrIQ+kJ$d%-e4)6&91CiDAkKU=v>s+ zyrQD&sw!VGoeKRPPDEwd?JZhNo=BeJDVKiY@drKSUVnwBsIpwRXS6SIYHTFZ$cChf zREEUrBnZ_R$?5{~m&&Rlas~Q6);pcfCg0Z?lpiURYJ+grWhwdZ>1CDP$XAr<`4izT z5zipqxxSODeHBGMk4S{hqdiwT=yY#cu-D&&9?yJgDoaUvN@Zo4&Y93GK13g!URhP{ z6>4Wp^-S{zWwVthSrzmA{A^4B6fr4Em@CDDnD*L8Jv#soA#bO__JLuf|uV z6p^fAqV3J~mZP6Ud5AXN)XIt?nM1SANRuZ^^Z@gH`ERG|oDRxJz)FU0Qo=nCr3 ziWd8d$(;1HsiOBF=g2A#goIPh@s$e)R7M`Eg{h1*l6b4jumw%^99^MJu1hBR-eY{;#q)h7;>(Oh z%#%wU ziE?bxTCt=YiZ<1iHGkFs63Qyn%GnfJzYK{ADUPB+OaufZHX~=Y3T(0}g4NP!5i;LL zt{S8mOMZ=d2L2NH^b$Xvk@9NlTzjh`y-4_WW?5O5D_K^~EZ@@UW!{BRBBIq2A7IIP zD{sCp0R2Uzr9?bYbpE|=*PBUK(n4Q|G9X-dpqT(|=}H?n{RQ5#>P^v_8%j?0%##rt zxkkXdl*aI454o2wXCQu%QI(@ zR#C3YgZ}GEAx?qn6bfw@Q_~n=O1Wv6rEGl~u)rr~|AB!7x7GUsO7^vYe)wJ`opN zg+=87@(~%AX9j7Aqekc})^iXVVCU8Ns!GZ#m*_!O47$^(Yx7YDO_M7ajcLRdXOW(6 z>h$W0A|a!LZ!xfDR#kZ^RuscC1x&rfC*mR=p(sDmW3ZlwQPmD?RO8NN{;b>-4`~;{ z1sPq9q2zwKp~)0Om(u_o@{v2r;e@8t!efOrl~@HLXanU^dTLD~IrH%2oQh&!ErQG{ ziWbU!A%Bskx?PHxh-{%xr+b5;sg;4HQ)z_u7E!)L?Wu5zqnf$Z<%PZ~S`(lo=rgXn z+#pR=JtB;fKu#ngNCz5fUdKh0F{M~a@aa&9Y>~Hs!h^{+?Nof0p*{YqEq`I704ysd@lzKzDSL$y>lUC)U85(uQvezG=@5o7q7(IlN+)$v*If8O_ z&pc0Fk|)naz2dywbWiSNF=9~1n4~+#GGE2QP^rf!9Ey^nPn~r+25_z<8cnNwfijvw zWR;i8EW4MoyKtN4GdcMtU(sGiZJ!1P-O$_=7KzEZj5#Z-#X?rZ&!*{fv8W;=N>8ZL zQ>-ZYF^%L!e!pi)sh<{80+bVU?wsH;y&O~FU^^1}LO&%OFW134#AgfUQn|_3YQ2U2 z8kaC>(C?8`A5Vz-8IQlBq%unglK1wys03u=bbn<~1~6%28cz|X9timxt|ZYGgd%^j zMy@Jv#X@Q}vh{PbNG`6Fi!afzvO46cEb&Nr{p}Qr4rG@atsu3U+OrLx_t zb(Cl>O$drYu3#vOIIS5`h#IPtu}E$xrId0c|DKyWg_L?|lCSE;BR&z)pZI{>heKuc zVX^#Ff8?&Bl}Kt~;v1eoC9O>?l^?m%dJC*)RkI6SS+fh1=x}AxYie?idzQ#^R-PyK zC{H;VeTIkr%M$-(ddR=iXnE4Nu!=G*E$XcZjl~CstR`m`-Z~#k9;97?54< zY>B2>&unC7s0xbBsU*<3)8J7{3)3=xTw??1wzBN9rK3k%r{&0U0BKP*MUr1^4mXZ$~>rlkVIsZ-^IT8+*eBg_6|02M=P0?N(P$@`1_ zGH$H#R{6z>3#~KASprp&i<&1b1`mA7sV67YWarS(Kncm~FQQ4QC?TafQC<~=FE|9FE^B0 zEIfTc{k(Sa-hR?$)2w)9QWQ4DBU%*oc_q~$ih*)!bT41#FQkP-8Xd`tDU_#6Dzq%F z8tNoZZh(d=sy7;ugl8WUfVfS^-sHPq|D)tPvTgxp3cez}3H>c( z?W0)dAXa>0AH#Y!9>U64)L%>HN%zq3Aub#Stdii;iXw{|f*3<+ok(1hKF*a?R90DC zTvoZz;}gS#KbKwkc zWIB0Drn9TakL-Pg)NOpeV>YGD8b1GbnuJU+$3u-qEYDEiO}$L+TruR+w2DS~vT6!l z@}$eek#3u+ymtm!NUh&_ju`3KC+B)gd`DIL1{gVH(It_fxY$4@hBoDzS zi-B^?ra@KmoH^X~rq|SD&2&>+r&5I`aWEkQj8qRbxSGnvV)h)QYtSOBp#Z1IyEG@y zla(UYSF&bK3(OU^pp`NvS^Axnm3e77xpW>`jmk>aQY~#W1WB$*R4t;^)W1`};;pWQ zfi+@RDuYc3LDJqiDQO<_LBASs315NaB?4^R6R1Ymf zP$*7H=&Ex_hJlk*Jd#c;zrvDLG&fHTiS0`{GtvHTxyq20RYP^)rATfjEoY}tRVOg;XoIDW&yg;amYEb#EO@7lnnZiL-W<7p#a#5;2 z=U7HDksNQ>VBEzT2HV68qzL;^2Bk`KyYDH1K=Lap-YsPJy0XF;-yW{h%okhliz zTS&VWxPesos4azDNpdlP9HLmAr|NT_>vExzBd$aCw(|?B6S@0O#M=v!vo>rg9ZGL% zpO6-+T1tU@fQJ555686s>(8?&`XWD|ipVN=%lCWs(b6?VQ4?wN6?u@Jf`~N{^?{h{u(NE=Aj5VEPDCC5U8}6xs%Kt#5mg(^a?AM?U&EnT2rh2RZdF8_w3fj|>Sn$3P`!yp(>Zs&c7^ zF7tZDSS6wYF<6L2vEINT)gzj!$YvJx{vrp|2}PF5?PmdGu{oX!+KJ^UTuf{ED%+d2 zng4&{WHMk-Q*c^!@QXzn5zJ9PKiMNME+lzq`cYXVg1H=OL(Ie_5$*&gb0;9i91j2J zn#6kHpAgd*5DK$s=01-?qxrMc5KV&;Rj9nYN}Y|kJS48HSNN8A)U`z6cd{ACbPL7S zX7{Wb+SeuBG2#nU7$Kl`wn^_*Sr!vf$g!Tl(xBeoi?H^~`>Ger%96&E>541SqJ4?b zc(S@GLe_Cp=z>Am|2n<(RxOf6!;SJsX-9Dd*xB{|*S^JyrrH2$T-BhZ%iJQG;1^3X z>LH~M9jI8~tnktI)D=Rifd5(9*~$~iT6`&0jAL}qh4b`Q^<|R-eqWJqiC-=o^F`KV#4I6;9^U4&N6oS zuUq!oU|&p2JW+$Ho(pV=UgE#geD+;0^$eSH*#9pzO+Wifiqtk?ONOwK*egLxA*r6c z3Q{(iE)a{mAN(ab`ChuUBv?fgjHy%I6yABJ>McNil5mTiJ958URu+gQ)5;z#3;B!u zp)$H1rh+y>g(Bi&2h0@FqZIOrpXz_+i}bTL<5Hiv=ub=bB03l0ro8B1C~le%Tej6u z@@HN4(ihLm)7ummyPMVvM1!Hg;QGKr&VMUReLpUM8#GsvD;j% zE>nMEu6S>z1zfSy(?)x;yc?*D);4HeZmPO5!7dv#jaSzvX!Ts@lvlB7eMGIj^6Iw7 zb|Ky-ZQGK$JUO&`#$36Ntb>aSDI&U(v7kelZ1whi&0Q~fi_0Ih`$jt{msal9;0+MP zzCe&BHq>L=2-51)9I@FuS{mfqBBBQ=ab1lBDtv{;1Ze5^9C1t=zc) zxZ~fp3y8jSLS8{`OMRZY9!aj5Uc&dQ*wnV+XH-QKqpLTvebE^2j6_9SE2IE~_C?X{ zoHUWOX)GJ|Bvm%{kCa7~e${a8`Z5PkkMwIs!=TfsYfJW4+)SNLZ!}}%!XeYtD8){5 z3Lt5KqFW5;TBGc+$N^~Nq5I=$CmDrxB0{Bn6LkS4BF2QtQmlmTEhDFK(|r#QBBt_jauUv@B?qnVAwp!eIL1NT** zQ+2IBIzs2C;>YNa$tWgBJ7*hs1--W)+qiZ*7dcA3f-(Dh|be?xhRd5hbkGMf=zET>z9J8gKN@h-igQ*_aqnC~`$xn)RhX(PKq@=86`T?SMDR zMw)w68F=R|)r1JUBX`#70Zev<(y%tYj1hyZ7pp-NqhZeQCJ1TB^nH#}Xlo+ z;*_M{Tah+t>r`X{Cbv#)czX@ir(M`3FUJpf@0OmG36~VT8&yufcG>sVV!u`!{$ob# z^}au6{!|bWy@>T^&S`YG^e4^fM%R~wryGIiCV8Z8MZK+I%c$p@*SApa9iwQQVSTfh zYeRDm5r6f|y*6>C*x#O*ZV~^JXRqIVxfo!?o$s{2L*9bahnuX#S47C$&#y$^Lr;F^ zbOZf>%3v4nZK8MR1}=ulyj+{^V+-qdm~T5~XZ^Jm+aS1aVjD`_#?~0oJDAH9vC(2I zOF1YqmpK2U(+g>Rk@Y`3fQ|UUpCcz=6TKAA9Yw#o%uO0&wse2~AI+Ry``DxmY_vby zeA;uOo|hsPBj}dyBHFc9Egzew8W9a4$#^HLRpSlPLWy{QuAG;od*&C?_Br1G?@!iS z6KHe6+)0b*F(ocn%1nBr9Z=L`^ghTVhc*TfN-3iUg{cR5(2gLnn$WxVp4P)Cw&UFJ z{#uey*_=4gCuKzE%FF>|pYIe=R}`u1*@Qh8(P@h97xObyJoKQ7+>k5>8H*O0&AiA* zifnL$20gNG4sCDf%O;J9bV(|*NrS%>y-|a%xy%u(Inf(6=Fzp7dGvv@`ewGlWMKpU zhBu*X)-ulUbGwn}SmGWL2vGqYb zVtk7@Z#tE@_&->w(>?TDA)88_PL(=?EA@}=yhUTx8`jmMwD>j(dP0)u+^HMI-Dbfm zF(C2v8B z3gV_H-OE$wPoI*t|FfeF-Go1n1_P0(QBbDIl06x}+d{A9W$M$g<9 zk4WK*CJU>*Rdl;a(aF{H7#fk9D>-+GcOhLZk(ZBobB#gOLX5oVqQ1}9H==bG($5u` zrRrV6`J>&oHz%8KfMcC>=|Mj+AtWwy)ARfFgA*1>|Dy-1)ObB*;`#Tp=gsis<;=;- z&C8tQ&K2g0_~St8ILd|ObIRstP7>X;yXZgIZT$gbQ7RR3qnledYh1CBzIpCE&-D43 zbFw`210L%)?Rf*K+%4iA6rlfi1*PJl=yKyBnedP9MC91V4}tK|V+X~9i{veY;$c1; zzfDB+`!q?Kt#1>d$q%jFsHqs-|0!opG`H8E(EY>oyrtgzL+NvU-v&JkKGO9>Kdprx zXU&gePM!u?Xj)2m&spc*1P{ySL>U_n0LNd_S_YE%e=G`s!+_{BZZZ- zce#<1Tx`C6C~4$lvFOtO=q(bf4Roo2y1UG3dc>``HT|QxN`rfs!_WF`Bp%+_#^sJF^QmUKK3g^y5r*~G^UD8 zpuEvpbR^=Lk5-_nDAfC$s$`eiDC#W}(?qdhh@QO|TAJmjrzZx*hCwSxKlVaTYVn2S zAM~SL@D$B5p7@cmry6>^OoB^v^r~}&sn4`@A9WX z#IhVcCXXJKJdYlHRZcBI7IHMrDrEPB+90h-|a^}DVLMfNZI=U$H-Hxd*>*T ztn~5MU+8x$#N*=CL!9&SC_{bmAmIjm6t&4(zl_{l+5xZXiWO92F&Tyj8Cqq*E$uR%875GTq&^%1p%PMed>QWMJBJdtSRhGk0CE)tcAZy;Ep&m$f3=8Vq!VTcW1 zOP~x2Cs%!W(h~6mH1)_r8Yjd9HT+^@tNu7h4_~9pDWdhV?*eOnZe&Na^IrpH@~m_cV#2DXMtvv&f3L!INf1^h2I> z&jgjGs7&q)DyJVC@X2naS4)=JUM0Zq_pJ8f(W_fNfRecPEMbcLeIb{mvSjd$;oLGlhRU! zN>{r4&y}1qabj}nM2h&b%ID|NgJa}8P?KL$0MSu2eIe~cyjGL=l8_-E)s_y&cjHF14GgO`cY#8nP| zk@(>h*;yM{2X#@4O37K%CB~D-qa=|ksS5V;??&@;%ZmcHk{{F0$K=IKRdED^u^w05jNV+bz(YS!n6aQ zAouNBci(yo)oH1pp4&{VER|-m123F-fCFzOqg_+N3nH_BdbWjl5COfE4{pAJGOB+1 zyuVE?YzCInFYY8!&oaY9JGwLFZ$F4-Xv(I;;wD`g5}!n}-@BwfpPn5ly-;T;s(M7J zjW$XSK5$d_&5w+Y3Stta2Gyty46ft~^^1qR+e73vN?@{>mpFY$Kj0>Q0N(LqdhD(U z_LYDR`Q^wSm4?fu9th zQlfv6K|7^1m>e=qQ_2CwcQSbo>BaNDD6EosqMs@x zJ(TXI|KuiZD@&#AZ}hVzGQNle1ek9*9Ec%+Rxu;b2-Ax;Gu7a*@t@hD5k@>E!Zz&j z=F+Y$Wl2n!R^k2=J?;8QYBNxtqT?_9LA09*8DSs0369GpYn_%m=nC0D>%QE!_9NY! zbjQi1-k^B;6pa%i&T-L?W9naU6W7Fop~#RvkZ4>i9I0qtEYc}=VY~JAEBXdj-GJ<; z11S`!XgiYGwDEYOV$|@`KLwNI?^@E8EgCOWLy=v+3|j`6C9%2QP9Kf`^kb@J^y76! zmGrxmfl@zR>y!^+5f4t0Pr;&Gpkrl`_rp(7i6^rJf^>&Lj#v>C$;d4zwBwk5haye< zA}$$OJE2n17t_Z9?%=-_b<|eelCApOp=H zw472)kC%aPR;v12PNej{5_4~pj_C)~14MZ<4XxtwKEhk43vb0i(7w*MytU-~#lE%D zuj&jah>UK+S%so!RXbeOQ#{ECau|kLMeiOK(F@zmHvSZ*QX8M?!OEB$4C!3Xp(Z;5 zO0U=M)5UVb+-iEd4JFXGIdSh-Xh`VS5}L~;Qkz0^8K1YJ?+HeKt#65nH5lWUXs{Dh z1I~sQCUlh0mnDyW*+dV&n_V$2n6LNrQo2C6k(I=L&HI;xUTb%Jl;=i9 zTCv(dkEs@3P3xoLSH1flv)FuhL!JAE!xbB4j(y(%%CreLMf5I}M5?AgUfJ&!xkZ%^ z%yW8;-kkw9DTGy z@@Mv;kkbrEj|>C*GCy!-gJ0hAL0F&4@E^!VKvjRdGEKzG zeY{w`rSuNW)BBV2fq8kqQrL74_uF~6&O=|kTgwjIvndOk$Fp@-HssY>#=)auG11sW z!YhDW)vybQonBYL$>_C%K z&77C-BT=p#L{uxGC)+q(@}0DZ#tfHhvzFfo7SRuNTihba_9Hm#UH|UOJ`J7gzJ!MT z(>$>LV<2htcM+zaX>7dj=!@}`tMq*XO@At;zq$ujH3Lhfzm?PPR5n^Yz1MbR#YZl& z(L?*VtwwSAT#G<8T@|bGSB0v*;)VixDxsYyJ)SX&tKDkr%iD1KUdd^mEtiNRX>H1P zqs$wXQ|C|Y)7$b>;=YvnKb4EVH1Ws^VqZF5Y5OgrHR30|`H8A%2W(%M%sTRkt z^`*p7t5}=WmIKlpv1jzRqini?kL>L#7XA8S$X>ZVSq`Sxo7ZpyP~2-b{BpF}96zzQ znpo86i`9DN`eL=Tek?BZx!LwtX~bHQFGg9)o;q1c+=Wh~Rz&B<qw0*9b{;QSu4{q!_tE!p4hr)f%?*J6* z_)YD&ciG+B;~L;5ILfxEUF^n)>?FgjdgA#k^uyUT6m6FI3+Yih2L&q+N)>+xL&Zh= z?=Ma#iPQ4PUki(hJV9~h61+(98B?cvCLWYz&6u4tWvVCnpo!_de#e{ey;fl(j_#B?+j*H z@wfO~q}Q8IpSaK^VrKJa1BZ!L>2a(QE@_o3}GJ^geZEY>}ji7H2k!fmu+sIT^ z{zR&A^v!MQ5M(<#ghj^CcSe#1!3N8J;@j#>b7LUJmHN~Tv*d_&cfkdKk_B3G)u zRT*~V)YRGk{{No^{%3){TR?R1Li&+=Eb7lJD}fI8-b=T#ta$4m#KcSVY|rxN1$5qW z$rZyaYe(xXX7|hU?X3^_`~i8so%I!;KPb;fT0MMzr97v0e6P?h^lxWf$DfJwK+lzf zE$WH3rq4y5{PKJUYgaxGzH%?+Z>)6ypMN{k&RLmgmE*=lHx@=4Y7o2A@~S&xcwc^7+Z~e2DcepNICnG}fX%&uSLdp|_8y`1BeQ zBj2q0i>Ny2)nf9Minkiv&GKyqFJRto@C??|Ver4#kC5qh8T{&N74I>41M}E_M(1Di zc!U4I`V$S_!#v&KzcJ4?_>fCfe)0`Ij(MrU4`5zv@J!})2G3{SVDJ$0CWBwhyv5+F znYS7IZsr{Zf0%if!5?GZWAIm*$9^1b|2LV(8~i=yi3b0KdAh;BV4iL8ADHJGeAuO` zUP=wV9rId)@5;Q+;QKLeFnAjCCWB97-eT}s%-alpBJ&P|2bgymd>Qi|gI~ft_LFG) z-^e`P;14iQH2Aa3(+%FvJlo)%%<~QYGxJh|k6xwfrPknkGOsiEVayv0p3A(+;ES2J z82nV`Z3aJ=d56KTVBTf$`zHR7{6)@Zz5_2c_@@N=2h8r;Xc&fwL| z8w|cL^Cp9*b9q|~{t^30o582Ee22l^%)1PJ9P=K7dzi<55p91j^LT^%m?s*%l6ktp zYnf*o{0!##24Bv+)ZiB}uQm8;=5+>dV%}izdzm*G{Bh7^|2H%Z&o5BCWyu;vQxP5gQd;-h&7|WEdA7lendck4oO!9iE1B0Cyq0;L!NbfO41O;2CWF^8Z!!1^=4}SQlzE52 zuV&t5@Ee)OejRP+?D3=Id^z6WaeFA9VDQr26;Cv{#d^{WuJvRXTQy20x&QR_4L2EX?hm2QE-8{Zl({ioL8Z7d%) zc;nkjzQN!hvV5b#lh!Kv7K5*2`BsBBzNh3n46ftPPJ=ggD)}CR>$ud~I@+GCKPmZm zgFkbuvQL7+TZhmx8NJdC{vOL`7(8Q`lFv7I56c%AJP@noYYndB&#=J*Bb9uE!F7M$ zXz=i!Y=496c~Gmt-Fvb94X)=|od$2;hwX20J$_l+MBCpwi0yB1Jr7DSc*dbhKHcCt zj?FN5=WHdPZ*U#o78pDsU&+@RT#wgbgEyX}&%0XWf;8iJ|&-T@RdiXelK9~T0RdOyn)a4 zyB_a!oZo23cmGR`M_mSgfYY_Mi?%~7pT`;8>QQ0UdGYsDPi_+sZ`LBu> z7`%zk0|xKn^RU62$Efnu8@%&3rC;mQcGLZKvmqajQT3(M(em2Pah#6k=VYpSOgH#t z%nJ;DJ9C|1t>-c3Erxs}=cm=+aYI!;I}EPZXF3h8^>i6r>#@d0`@^%GpIC#3Io&ve zw=+*PxSm%g8C>g0H@Md0Hn^UDew=8(gom6&Spc3<4)*Y3+{#^HCx?gqk_cYh>aH+v{JRC5%j)&_EuH)f)gX?&>$>2I3 zZZ^1%huaLUv*`!;5r`eHn@(5V|R?Ur;dl?46fthM1$*iILY8T9?mwnj)&a_ z*YR+H!F4=bYH%G72Mn&`;W~rsc(~r+Iv#E^xQ>UL4Q_Ef+-7hc54Rg!$HQF)*YR+- z!F4&fq#8t~a=j zhnozpv*`$;5r^|H@J?6y9}=5;ckQLc({Yta|R8vtah5`i@ibORq%~kXES-N z18;ZWT@Jji+g^W%15fWP z9r$e&2S1GB;8#%`{3MD)y(5o>`a+)Xz>}a{=R>*Df$s%&$N=61JR5i(a5wNJRJpp} zYjxm_&@Z8UEc7$T^Fhx8kpEKPIgpVQ8DJRRyCc`MX=6o-0`;!y8V z9O^xaL%k!l4lXav3rcoXn_fHwob6nFyEBk~rIe+lFhK^}R&18)O8 z=YXCL;3q(RbppQY6Yz4-(*pcZ;H|(9gZ#7s zUk>`)fe!;coxnc=-UWO#=`M?u^7XUvNcq#DLKz}XpFM-zs&j+3l{UP#z1J8$k66NzD9*g48PeyU*C!;vT zKgb&(|Cx~gMhD*Hz?&U-3-D(^e>RM3$U7Z)57-Umd%$kUo4{_!6Jgvz-UD_+-UN0- z-U{V95d6mt`A6R6z%9r>%3F|sAAs@}K)I0jIPf?qFUrS3d6Bm|@C>j6%Ey5n zqBz(Ac`K9`c?XntEwo1q+86S8C|4AR{3CC3;Mq_vl#hpUMR6!s6o+ylZ*$xk*lo#a_puABW${WR@T*%uUco&rSJt%K2_$~58C~p*pav|?< z;Q3Hqluv~6MsX-_6o+yl?{MJVP~I3QZy3spJPFDh#i3ltI~{ldlo#cbpuABW${WR@ zT*x~ecn_5KZD_ygP_8Hr`H$j|&nOQ0L~emSOCjAj;75S{6M$a?JQ4UJ&{GHbM4kll zmxFvg$Rke&`FkMU29QUd0rIUN-w5)^OF{lRkPiTV3V0pxD&Sq9A9+2r-T?d*(9;O~W#CP~9|qn6{9WMfz!w7V0KOIErxSQA z@GjuTfu3&QXM=n!^e0zS2!0!d#1AHFnv0&W) z7szJ-e--52z$<~50uKQX051j}2EG{5tp`38&;t0{l(j?Z9UO z?*M*0@J`?XNVg04dBD4Y-wS$rfWHLt7Q|hzfP4n&xQwMP}@=lP?1U>a2kGu=yF9H1x zAdkEodpeSxZVN01@v?RpALGufd2;a-N07??*Xo_J<62f`tlC2&L0ar9(Ww^ zF33+j@Ik;6fR6#52z*!2p9Fj#;OW4Bg>q#8PXhgJ;QND~eBkvUUjY0v&|eDtYmg5B zKM8m(@Hvof82DV^b-<4SUJv|6$WH_C6F|NZ_=&)qfd2#X*$liG@G{WT0sMO?S10fg$aeuh2Y5H|I^aFPF9B}-ySLrF4f%`(-VQtt_~oD{9{3p` zp8)(?kWU1D8}KCH=YSp3fjda{8(0Nf3H2hfub{1HgE0Qid_Ukdz9kPiTF zg>-9ySA(7~@c#onb-cOc_5pf9k9hW}=0oIP>c2SP^p(gf9{Anh4++5OL3oi@ zB5<|yUwxDWT-{lqcsg);pkL&b0elZgHyilHP%bxcHF7Ie`M_1l6)yn(7U(Yp-VOQ# zz}Eq<1^xo)2?O6cQYy=;1HKLLdf+F4{s!PnL4PCgZ9z{H@a=#%1D_0fT7ZuM`Bva# zfwuwQ9(X(Ot0Dg#z)K+APT=D}PZ#h`knaY*Bgppv-wC)isMpVT1|AE17vOQgKZA7R zf!9O15`gapdJ=)}4m=6?4A7qr{4(Gf!1n+>*}%sGcLU!Ocs}q6zzcxy1-uma-oOLE z6M@$P-xqio_*^Jg9q{YGp7p@@13eAE4*=c>{6OGMz^{gMn}Ht$@-4s*2Hpxh33wZD z7w~rA$-p~+PXyixJOy|c@KoU4z$XFk0lo(8X$|i6|1^+~1)dH(4)|o?@xTuOo&fw% z;EBL-pJ5X4!$CeBcoF131NadjpAGy-;BMdrsfsNZA;IYe+KZ= zKt3Dz>A>BwwY2l|_VUjX&h0{n5%(+a!-kOg*8+b9^n`)G3cL>ZYryM)kA-v_fZqb?HUfVg z^fUoK7xXj(e-q?efWHO26?g~mHsEgqZwLMk@DAYjL4G=czYFqRz}Eur2EIS&=>h(K zAaBL?`v0|Hw^-osfqWeBPT=vtKLDNp{6pZ0z&`?>1pH&*>A*h)o&mfIcsB3_P%by{ z&p8u@Na=P0RIknBk=EmHvxYh z^4SdhX5cNrF9LhE0>2P=8}J_>-FDzV0`CC+FW{ZP&jkHlz(+$qyMgzBo*v*gfgWo_ zumArH^0B~w0UihZSK#r$TS0#U@V9^`0$&Gul7RmPJRSJIfoA~!9e6hI`@ueL;1=X3 zANU~P1;F0`UJASlcmVid;I+Vq01pF?0bU1uHsrq^_-7#B0Q@T8jlfR0=yac zdB9tM$AbP=;Lm}48}Pxv+kuY&JsrSD0`COA74RVWS8^7X)X1>OLBH{gxHcL&}CJP5q`{}J}}@lh4$ z{`-=bvzri-Y{=#XNZ4RJ8xS$1z#>9edy9*A|A!PgHRbv}%J(ys>ywr1dCK)Gl@hH||^xxP%fK0~=)r(AzVxqg>&eWr5# z2g>zU<-OJ`*F(zpo0aPk<@;Ne>$8;a|5&*`Te<$Ea{U_R`X1%_3g!9xmFq3a^%s@v z*~;~U%Jn(Q^ShMmbCv6dmFqpq^*<}uE0yb~mFx4A>jTR5uyXyJa{XmR&hyIkHs!iQ z{(b?i|G8Fqj;36{PPv|`T>r81oIK_FXytmba{YScIl6NFQRVtn<@ycE^_j}`h;qGB zxxPTTUZq^GR<7TqT>q+a{Ts^l&z0-Tla;rm~0A9g#~^!d*1!}tGg&q4QXvC#G$ zKAW2CIG6S14Q6KlTvqHVI!5WvNwr061P2`~XXB?*h2NdiD4l6hVIHKTe;HZLg zf!h>Z0NkPA@xc8G4gkBHcKfBk0R@){3UR|f?e~_zGkwk` z^4RT{0tXaa1{_xK6yS)0%YmZ`o(|lm;90;O3Z4Vpui!AS%WJoPJ#aw5)xco|-v}I0 zumK!Z@GZb?3ceM%L&4ty?pJUG*p+6t{~h3ff>!~D6?`XfM8WmIQ3c-%+@|0k0(U6* zLEwG`M}b}GcKZ(l2Nb*sIIQ4Dfg=ju1{_uJW58_+ejK<%!9M}+S8yA!Yn0vo)4%}* z?*$Gk_&MN+f}aPDD)=|RZ3=z~xI@9O0QW1n1K5>exBnV&K*2r0VFkYl98vHQ;HZL+ z0kI{s=g#;7@_u6#O}Ghl0NZ?pLrY zjP^6__EUfZ3ibkr6`TPaQE)bJRKdBxZ3->`?ojY};C=-MfL&R3`=!7E1(yMb6+8tv zqTq7isDh^hw<&lQaEF5D0QW064D8Cb+rJ(-px|oYu!3&{jwsjwjw<*T;5G%{3f!UK zZvpo!I0EeQ+3kM^IH2HFz+na72^>*yJ#bXP_X4*m_=mt93Vsl{U%^peSB~BO!@vOr zZvqZ0_)*}9g0}%j75o@*n}Qz)?ojYgfcq8P2J9MRxBoP7K*4)~!wP;5IHKU^fujok z4RD)+Ujpt>@GHRm3hn@Q<=XAP1{_du4{%t)ZvsaYd;~bE;A6mT3Vs{7L&1Lm?pJU> zu*+|^|5xCEf(L=a3jP2%qTr8!qYC~MxJ|*I19vF+OW=M5yXK?)JiGlA;DCa?z+nYv z07n#@4IEW)E^wQI3xGQmJRZ1T!2w`bzTJK)a6rLjz+nYX0gfoR95|}r>A-CYo(0^Y z;5oqk3JwFi3hef;2M#E>8aS-r8-XJVHh`lFz6H2V!M6f;DEM2z{R)l%y9(|0zXKdl z@G9W2g6{;5D7YRts^EKp+Z6mm;0^^p2;8sWD6ng+-TuSC0R?XY4lDRk;D~~^0Y?@5 z7;u|{9|!JG@K1pI72F2w8fUlvG;lz{dx66WehxUI;OBv(3jPgnn}S~g?hu&A!mj}L zE4TyLHJ-Q6KYtB4px_?hu!7$NjwtvDa8$v^fZG)OHgJc6{{q~v;C^6Nk=_1ZfddL2 z1P&|s1K@~)KLU;__*39E1%D3Qq2Mop`xWfE7VQ_??WX_-6zl~KD>wr?+@av{!2Jpi0J|pG?Uw=v6kG-zR`3+yh=R+3qY9o5+@|1Jz#R&n1Kh9RFt96N zw|_lwK*80(VFlj^98s_V998fwz-Vt;DCZx0f!ZQCvZf; z^}taD-wWKP;2#2aDEL9(eg#K?T@&s09|jI6coT3~!H)t*6ub>Ms^G_f+Z6mbaEF3_ z0^G0QHelCfcKc5Q2Nb*)IIQ63fFlZi9yqGt-vGBM_$A;D1-}B^uiy?~SE=3pYrp{o z_W*|#{3dWj!AF3j3O)whrr@`MI~4pE;C==71G_G_+y5(YK*58+VFiBx98vH`z)=N% z3f!jP&w)D>{3UR|f?e04ecf(91vsE!FK}4F8Nd+*X9GtSoD1Bh-~!+d1&;^rS8xE> z6|~zg1r8{<3^=UdDZmj0mjg!?JRP`A!Lxun6g&sGU%_EuSDD@Z^}qoIR|AI?d?Ro~ z!3Jq@)*zXAsoJO~_C@CU#V1%Ct_Rq&_4Z3_MzxI@8T0{1J} zbv@djYPX*P98j5(H~{Rr%5J|DIH2G%;IM+H z07n#D4jfhRbl^4x&jRjH@EqWN1&4uM<#zkm0|x}|AN^{3AlY%a1b^XkH<&A)oXaX5 zb`9mjtABIH`_r6v3{7&~akj*L$MF40?f?9Ka{K4sO=&-WTWb5Ki?#MozV1PN#>p=H zwzBtvdqVFax8v|xw_|JYYge*mi>@0c9CTKibxW=r{$xcZ`wV~EBjeep`1grB9ih+Q zD-PW8h_UC5ef7s8Ijp(f`QoX7C-md6gROF|H~t)Unjho;o1S*GAIx?RpX%_0y5=~C zo9o>#wq`rbCq8h5Ha+cXKZEC;jyl+c(_>lb7Z-L808`tiR%sz^`B*jxnW`VSlCAva zb;D`%9IOg5wQt#Cd=+h+3Z#bq;c~H$!!Ficp49M0iqjlgT4)|}In6Gw)9gOtK)b1- zt}h+KE%nZZRs-!0xtF{a;?#$vJGll69f}Q0zQ-P0RNlH4ftb`@%`A ztH)t_iX9E8qFvMV8lL6$@9jpOf9^_sW=q7uw3PKm_coF_Idtk3huLR*qrI!%)u21p z8)yHPX?C||w?7ef{JkrX93q~y<>Q&3In1~4UQan4H*+rCWA>6f6He!{S0E34?=1gr z4h!P@S`FmFJ^C((iJJQhPoy~h{*c3QbDgU)q&XZRl=yPaxP5p=&fe+fg`MYX3r*_t z^Z28F&Ra2_bs3eWr?t`~zBpGq9sC`r{bkW4&dIMoN89K-?H^aNQ>&6f8v2do2rkb9 zuPJQPo))9qa11X*KL+PH*r|X!v^Jc=ddgi5XTM%(c2CJ{@7m-rPj$FMT@N~jy=&YJ zIeiYZXecF=_EZ7yzh%)Bw3W+#Ol{%WTyGw9L2q&y?}rIf*&v?3YWa1;rvlCp_36OE zLN0e#nbxjDrr_O`=jk2pacOLASYtie#J@AtRqZgl>pkbY<~W9Pd``2y-g#atbedkj z(=586g~YpRXg`Pj0PXYkmQQ7;e&`5IqUSEJJUg-&F%$|T3=xvR57>1cz-i`7rTN46MqOR_@5`8}?57M$j3SQ}1f zlWuUC@69hXC(n18#Xi@tzR+dP?aT`4bJ2dQ)AX!KY0!2%&9t3pe<)qHpN{r3SxB~j zk1GRhXYz3~Ft^au-7Y?6^gd^7%#dC>mSy6;4Cc4SO7~Qz_s!#DrTw`rMltTw(_FD} zqNlpdpgYXicQ(%C1&>Ns(Tal#-I?$b};-UQ?1d*?6gq%lJMOu*K4qWs3VYlp>}$Pc*`8Yn?K8C5_fMI&N#Nk%btnHSq(VDeR{qtA!kLBGqNi&&Ww2`*%yy5%sJEi z&_l>B#v18OI{SBU20b{ZZM=%>xfZi4>EJP&ZOWi|Aq`_t+Lewp*p+P9m6V1<4?E4X zGhkbyPV=DQ9PZi#&K`7PjJZtj8c&0^)MchEcA28RY_#WP56M0v8MWnJWp2n}1Jlq~ zVdx0W4cQm>6^&1gebefzedw!fq30_h<3ZeaUpR+#RbzZrIzoI-xE{}-IUy|i4DY$0 z=2UC$bgaB?_^s>FXZYOGaX*v&bOiIseTBm`*IugQDeUTa{nblz0s3oK;{N*eXK{2K zHD<2kO!QaP4z<5>`1@ZK)A3yJrwJXu61=&bVooKw!7Xtv>;u`<6gJx8?H}L`?U0TK z|M-Y;5ckpC9-Buo=XbkQzEZ)LnDf)_0ADGBt3G^3=y~o4Js0-DWxj>E{Sf?xOSwy8 z@BK5LeSl28;O<0X?rx9A9sC1fA0&52Rqk>*2mKf$!an4IyA;9Qr1<`b;Ev|QBz6$; za{Dl^Jm!bA@7u!tkc)i~%m1Ku4w3Hx--7&)u2&qxzTk6kzOv>EdpgFg*oHj*-jBujf={Dt2%ljhd$sPNf{vxD$qPQiDv{FFZ9CdpaBNX}{` zXW8*MbFkWYoMk~4+@~)|%-Nw&#rPayPqQn9J*^d-X^U0P$ai(I1>g+2vVQ=7+PGvk zT0 zqsBu9_@eNo=9YLuWeZ^k;3u8_e&KMj&pAA|(*yqnw!P2I{U`59x2YX>!+#ndI)k>C zMaM&)Im|;k1ALFG7&%M&StXv;&Dbc3is(t5_9(9KjLs^*{B-H*&>y*0Dt#8 zVw_C`XR`!nK4GIY^7+U{NzOjTzm8?IaNkU>du#e^p(3-K_;m1M8ZzC*F4SH_lZ5nFO!dg2I9--7M(vn1gUj^J}T zD~ZP^*)M!w-<6op-I7nTU+*;*4j+q57qKR6n5XsHSPY}>R5_i+ZOhcM?1V$LC3b^(1gfY>+3mn>{pVX~?DlTBg2bjVP_PCy3h z-7nPByH~It_{Y_u3byP4J7;os-=jv$bHAv+fH-&ykN?Wp*~c9R)`rX2P->xh0q;Ll zuC))qj-Lh(0~GhxCYzp@y$7_V$!7ZEWV7hwGWq^xXuF)fq`vpQ~3K2@b{mL_n*xENP0={??&zh@85&>Ka2ObbTy|{zW;8#|4!@uCqss* zY?plhdt6g6o~E*~;9Y~={_iks3G~$(OTu%*T2+hfo5kQvY6u~Xl5B6d2Stk~-*{Jn1kSBNRj zY42As$}^>5Ue%DNI19Pn!(VXu6wHHD*%tiU108vy!4V3A&$VIXHQ*O+N=Cn2C_qdJ zU%AI&HZP|>624-NFU8zLd5Xdm(ds#WuJm=3QOPyJYilpS~m| zVLyH=UOz$~c|X=(FZywDiqeneoQwa4t%SdJ_#RgUI~8$-91WeK5_3?0|duQ{zL7)R)%cPc^$qs_Cst6^hzr%1a}fi`s3Dcc~sbt;1R^nuQ6 zpgUWs|I#12ZkXEpEJAab&ij(=7qxefYdRylwKhDR4SZZ+4n!U1!RY$g)NZ%8(&YB6 zFU5QheV`pD8K#FkC#|-pqwP}mGqjDi4r?2~!Y-_WO`{ke?FE;Y;`uY#;G2&a?_n%j zxkIvPYs0us{^*AV=2`foWXH&+aXaQqg+DsBK`Tr()BLH(Va=4fITP(oWX)&~I(0bs zE3}8)b`b5+dy+k{>{ii-vqII&C&GSd>=k6ml$1m3-6u9$??K-ucW|*s1yg<(&g~ z=h>|Ky+@2e_?DZ|)*IPw*r9wmHfOV*$5Rd*y54P`{Ts$+*p0c%ZJz4LN4_0xw&LBd z9(_RDjW&1U-9Mf!-<^E1Vzz+#8Sg2^WwA0Y=dgiypffHv_k+8RxGu7#$Kzy{TdxZgZIjkGMpP4w-FRI+nRdj73e1MdT%laj$+NHQ`vi|Kp4O zISn>7EMm^y8-x#hG*uak6bFoFCdM%FcTbA288ik4PJy=$k^k(1%+?$v{5gs{#!7!~ zEIW$$gWC^R6#g%Ao$$LFV9RDWwauK@Z<8-BciI*}OiiC+w>Ca-Xm3ahKT@7$f{V%vC%GlBJ=J0DiZ{qT!}hXxy98#z!lo#T;ZPcsDn{#(NzuI zv*L^EC1+uqv+iu-EDM}v!S;Z&>%kd5=bSOg*%6sf9x;A%nJ*q^$ekDCK7ChW&Nj#6 z?1;?4Gs)Qw$=O7eGvwAR&ZZJ)RG*Ui)kpTvWeyN$kb9(lQO+rs{V!qL$(c*x>5L{n+B{1UN%`T+eXNdDP&n8V1!a_?Yalb0*#Ys(wLZGRq^zq!Ev+Y<7P+8NUpLLNc-gx_Ul@es~mQh#nny3RgTToA+le{74f+LVy-BEp3S~y zaW!rx?3d&U_nfCXBI*~s-ov0@TcKa5ZwNc4aE3Yu)k9994nnn#w;o3QAc{N_w_}pC z?0B4IvMKR6%YqCw;A}}^&Yq6PS+?Y?Msl`Da(1)ISvI5jg6r2Z;w;~*qZ;EePO za$EW(=2oiNWXicUlYJ@T9r%&R2cTUCe3L!tqV}@Nj>A9p+S~*_Dg?F~`z8+Et&_(AAODVEHcH z1;|UHhSNQTYH^-W9`l%Q9f=oDWUwPLMjA1mdntzkzIP?&yE-1wY`*xM@ zO!hi#0q6TJ;ycskyOV4n-jCZrJDwJNi&`$tw`;I>sLkU0kKh~a65mv>Igi?~7xPCq z>NZ}?AFIIU;PFhZyWObYaIR6GA+Cu>&h-)GlIz{z5`XX!sgBe0bU{1y8`W|~KY|zp z^K^G0HAK2R*q6!2e^2SS_U?|^rfunjF@lI*?sZ2X5bq4=_e9%{o%Pd z_5d-ssOd)Je@5#mTOPAPItI$eGVjt z1`lPLJ*8v7b8;vz%WJPc8NsoajgQB14LHUrxGB6D(& zAP4XSV*e))=QkrCN3xJj2rhT9R?5xM9LK!eE>!f!%fY3vd#I0(C^Zy<~i5`tIe>dhma3=0`{&QxwjVN<2=ttjb_+9 z;%=?Wvzc;un~}Gx=)-%R^qSfWQDf3^uX$lsuE+!M7%PR{09kkr;9%6~fi0k1E%8Zt zzaVPQ-cjp~o^p2s<=9tWHw$^CWaK)u&3lm>DuaA0A*&8q27igXM~Wt=unf|Cs{h?-8RT*HncX!UD*)2eksKe|AG>yHGpO z`iTQ=v-U2=$L=(&K}s_x?Su@|$0{-)j>QcaZz+1ae;cMqtWpC6fWKu zTojc!@k}SrL7jaK3c-Q;?)6ME^w`jkMUu^0A?^i}AlSf9%E6XTZFq*k=1oBHl_Q=8am zOx_7DN+&8@%w!SB;F;QJ4Aebp?73o3{XNie#8d}P-I@}jehQ+_MPqdmbfg=7PGfbb z6*_|aXiu5D!OG3+zs^6PRWur9tEV*tkE5M}($JyOy!Nzm;v#KxMW6ca)7iDwyH_?E zw06^acUrF*M2+h`;sNs#=|6n4{o2p3W()D28aO!hpu^m9rh;)UegrPCj`PRRXYw=t zjCpS_*6v;bf1?}Y+7qVs#kl<=>X9^VD}1BOvNaVAdf_NjySCAonpjCqo5W-s~!x#A$|UnEx*WT7>}T#n6TE3|fx0sVP@3vbh^oNFBYs(dfn) zUe}oxs#^zLZG~*RN14H$qZD18%Ki*_hzsqmM&tZ%GtD6CVDxMqZ4NXRn051^`|v62 zeDJmLJ$jdq@#k13>S4mCoWh<*%*E&A&}>%c6S3wp+#%mV4(l`qz>~;rjN;x zUyIGnRYyk&|8Z@jVfXPA)@X6MzR~z#MIQ8?YGabqbs{EeCO`cMd=j)l_X_`pYHgF* zZ5Edg%;s&9f3pBJgZ4X~LtdO>qN&Ia!A@j44iKkZG7hrVvh6{gj%EExl#Jy z8PW$=Ih@SOEe^Lf8t*j~g2Tx+hxdzEr^||UB!@yT?V8^j)cn%%4&2W4&W^=86zALz zz0^?iTg_wna#r@*M#G!(Wc|=D5!1u(AYL`p0J~okeq)!6dFo(`$R523+u1YAd7vla zJkSl>c@pdEDW;)yZ{(973XEx|en{UTVoi}V$>8zM8}Ml^99q27E6` z%=eObd>fWOF8N+0`QEPbUB-?<=eZqt5_2r-fH8f&PsBW&Ys1!8!8O(Lbs6*M>{pPV zbA8PZmj} z9lNd@)-jiQI)pE=?hZ$&!Z+G1^N%(!Oqm(d3r8dV#JXtM$5lUdv}?atWtzx5)R%Y{ zl1n>`{yZ}t^Tb5<71ZCV=3)L^E$md?MRrQ`DXl*Wuy+wd(EVf+xy%#huqv{#Wb?N? z!fTc3DYr~a%N zZIWG~|NCl$eafkcH+L4ZgOJCzLFgCU!}tB*8TyjZ32pw&czp~T#QV7R>)ht+i$@Ea z|CY*UfYE%Roff_s`HS$Cx30c>j*R1|mVHqi_gxvs^*0)u;4fSL;3aWfD`ek2+SJ}9 zUm1N{iaIv<5I$Kk+lh9$zkUurE7n29d{&GVF2gR80rAT6;+PDy4l0N~KD$EthaWW> z)#$Iis9ke8us&*pZ`cRDdb#L;eiCwg0y&ODj`BH*9N0$$IR@~~JeH$%6AyJ>Lu(&A zt__Cn&*XiWw}RFuK?Z71jnf8hD=@W2#7;>Yj0#^SUqjJ@^%G@?O#A)Evc+hZbddI?kxo^kPU^|rU{IX49e(Ew=dddv3&m{|o6(pXTv}l6 zK-=CKT6+t|5&25GZ-Y^NW<0CK7|^me7@N^AJJD|r#DQtkoDI+7y?9)gv%#2A3x9KI zrg_EUOmm&f!MRwE?^5lxTyjBkQqc-GBA%yruR{)j$FImCwBwz~?Ngmb^BjE52F+>oo-=9QfFDw| z0BZ*k{{^q{Fq#KeBR_g9;$<|aS6!#r{dtPr&mz0;gxzLE#V4K3}q<+aYT+p7R-e zk+Vl?xXm9pmL+4Q4N9z(!DznVe&_lP2K6)5G`N2K*IaIEpTJmt0{$G0?SZ-Qk2`l#E&5xJ+ux!N@B!i%(cfO0*S7}Exs3YO%2iX}``t<0 zpCS2IBTsrPlESF(t(-OQYpl^(Ap03U%VD*T9se$33+iW@6Z|!JFFcF(no(b$zQ1s| z5_<8k`&?tchnyq&9M8~~WGC$NIkL|!Uv4{Or#=_+ydmfLY|-c2)js#KmxnOVKMDIv zI*xw50{uyIyNWSE^ zc6&@uQiT8aQ|!C7^aT5^gq~<@XfbRA{#GMzcPuhf=!x79o={JIdXb*=T6&Tq^kj{q zC(IegHYBlGq$k_vDYgN6aw4&wyl@siKjgObgk-1Z2%lf-$#JPCFQ|Hw!mc8I(O=rZ z4X7(PVH>c=oAP4s(^^pt^Ss!P%5B4y1?B?i53L^|`ygyX3h(PD(4XzlkIm>)+Pg~Y zL|ULLo(^Fb^g{+@F6j-Mk3X05y6Jka?ElD8w6Q@^Y1e+5@Ie{9g@FyRsJ08E{nf&#GlZ6uJ0w_&jp>c)>fd;&p>VwThf^rbJ*7` z{{9#Ip*_wY?(w@bdH#_6iQ-=ST?_QiOe!%B!VV9l`+oXxRyt_YlU zV6GsYgWRX_9h)<;H_u^l_D!tuM0=bw+~ap=i*ec`V{jU$JU3{c!$EnJi}%6Oyi7Sk ze^!ndqeeWwX0d*XcOcJ*FgQ8jmkS@|AV77^7oy#28K5sPHwL9mn|Q zd}R_}vu(Z#$*wuX8g9rvk}t6z?*+)s{hR*)Uuci`YMJtgaTfD3<^KF`>{G}5%=1yS zh8y`kbx#H740F92vkA^_YWLSj&a&fiHk0j$#~IC?xKCe_n6pvf>=STqjmzzrn__vq z8p+ur$ytud*(|on;;fiB6Lma3F8v~p*9;xwc|56OALHMP_v3xr;x5@8%jeNvE7}K2 zc|BUoJ&61K?p!|i^YskK`O{u0s%sLbl~^w#a(w>S+6Jnrtj~tuC)YMK*E@I}WmlW4 zy%~87%JmWN+-GEh1;M+9I?*`-`95~=Jq##!y1Ptu*Lz;6KfpG`5K32 zjHzJj&9NGazEko$QRR0gE4TQay3sg&8^r~vS5n-$#Le~d3FO?LK)#)G?gQr-qp`RE zZEnH$$?sUdO^FL$L0o|GOWg6epnT(qxS*mB?{+fB)G9V&okI@d0<1H@GlX54&PI_; z;Eno3t3JqZdOI(9pk6+ zAqTIU(Vir~yMR@-$nk@EMAb$yeil3=Vn0ph$#1Md{P#O|sOka7aMc0F0jg8f;ybte zRQSDB6Xf1ZvfWu@OtLi^+RoW1V#1uPcw?-b{U_wK?NYh)9mpqgzSRn~1+U|z>P_BvR zm94g4uxy2Mc->QJp>^}qLv=qwy>=(+wfLOdlio2R$50~I1ruMf9K&R$tNL`NMCj85 zw2%Ar6N&Zd$-iFYOX1wlu7F$@+`CB3b4R5vtyOht3L9tfwVwD=YO)vdDL-bC&F%_Z z%$KOievTM`^R)|SaiKjv&tc#Bf;&-@#l3!afOXxf)MRgw{*)njgFm|eR2$A?3423b zH^Lunhd+7?{3(1Mv&C7t!bj*w&MF|!Vj00-8T&Kjh>b^!zcVx*b1@!s6OPB5;_=sS z`3bj3KOt9)#SJQd*lUZi%=K+6@u$>dzW{%TJ?e-*$UaivL_Kz|#oznj5A6|u?Pnh` zT7H4OUbxrqp2)he-Z|zcU|sa-`-Se&`fJN4J=hOlp$)a|uomjdz*_2DaEQ;j?$t>C z+Tz(VoyY5!aQ9Qlg8TF(iMeyeebec!nIaw2nH)TO09)^I5_v zp{_SYez4EDwcXDoXOVcEm9p9K^ldq0z= zH&1~qIAgFiw-PZ#;odXu+`W+$2P*_$<=o*@w9}`_RAlvv=Y9;yo!JPBj#IUwRJDhi5M~sfIF;>lZfm_oDySqo1fB z)>{2{82#6pG#rGD=RU<9DZI`#x8yRM`*NA^d;gZt^Wb`ClE`^M{w?@E<-jS|P5E%j zdFihv4eN)JOz!g@*=V%F?-{t&k9DmZjgJk#IdqF3zQttjTW~q>?gq&L*}1QK8nTeD zduD>|>%Ie?8*$bJbW5*I8mUvKC$I_2irE$5kI$LyDNL`umXE<=+~adk;rs3N%}K)E z!>`qw@C@`-u<_d1_`9Mu3Fq9D;C)MQo?+7PjHYYN>G+&%y^r}#-giEErpSoC8_zOm z45AO{9kesoNWT>_;68m<;y!#>_94ZFu|D)&E7mSC(T7z#WFNk(^da8cZS~y@10TqC|NW&~$r+3(QyC7kunhus2aClYfOipN>se8E|-=Tu<@$5Gk!(zeNrKd{H+=4UsWn1T#6oIcIoTcO*PTP0g@QhS&hR-d(%$JoX zbgk8GPU>@uwOb>&D`55UxMPq7_v-n132nyUJHlp+(6?5}UDh|a&8QlaCu~O2!#sZ@ z#_Cu`^98s0nGZwX3T=Hm4(>YL+_%sn`$+Bz!Ce8n*5dAW;12C^?r@LKUBUE2V(-1> zTj;OT{(FqkPO<-9a5oOzjSK0ox`!RV0(Y;^H>czC7*5n z19@=2z9cb!kH_P$R`ORP`CBCU%Tf6&V1A3gV&X5~=C2R@HR9~AB(iZA^Oq0)^4KSs z+qmvsp~1#M-sH-C#kj}kp3d~m;4jIsPj8}kCtsHAo8XT4DXw*6tQLa5LfAJq>>Iel z=fb{8-hA=KYA!p5b}t#LS!kbuuU(1xx-lMKKFJr8eC?2YO;q{HV}~%#xxP&$zWg>{ ze*$0grM^M#k^1HbU%70L#n-RE7uw_chI@SOnM_}Jk-pu4XCT(*yv+-i}J%DpcNb*#j1D zmBiZ^o3}&Y%?&++KdVFTk-UuoZ#j(eyIjx4d0^wj{`z9v<8#mA{;Zznj`_2Cs-kah zg||LBFW3*>{IGQ{*g5cq&pB^d`O?P4<1L%bipLv+9Jo)<&rfLIp6`!m->fqnmPq@S zFYMd3DsMULN{hFfh&P|j+v{k%Q=S#vdNFT4@RrTeE#4jiZ>@qiIxnsm_xaqjVdLyG zG4$8*3~QWr+WYK_TZy+Z;B5@-9C&*@3>zo*+52iFZ?*Aw%Vh5%hPh;%)<6#2r!Ps& z+wJjqtF_K^ki0FDyxpwwmd(yUSNS+yM!aR&ymg}OM#&rG9;t6x;4PEA0=c=q{SmyO zJsPJAh&SBlbI*ZoQ+R8_Gq`QDIh!QUrnb(ap3wx(8YO2;a^{Q2Sq6I|9%osQ0r%;< z5_9H{$C*!Z#w2GuBxkp)oMp1@7H4-6XQOS-UPasUUA%UrL++8BjRt2K>~4#*d@pR9 z;H((;_)-y@pvFsQWApq5YDfAFlC${=XE;Bb&e*oj&z^AuIK$_{u1U_2N4(T`OJ_zr z&Uz`Y2Dwip=B(#ToblOb<<%r-MRa zbT-lA>~3&|_V|2&d*~c*;wt8Qq=GMuP3t^wI?tsTXL74&de6Xl-qYP-=qF-c%&){7 z>7_5LK-#u=+YTaaWTD`zE*xJ|fmz7vo+X z`>Cw`HF}feuTkM^W zr~N#Q1<{@Zes34{`4;0oZ9Ud#Rz?kriy-!X(O4v3IEejUMRmcMG%jagpV##H^Z3}D zggszGtCxaP4>%R)@A`W2{(W(BY|D~ZZam(4DaQuhP9)~-(RjS|SvfYz+fm8e3o36Z zEY0HWAn}%L^Y$#+JE?b&dn9kk;0?bCf>=Yu3+b`5e^)*#&OEcu{*CEfD!8XLk#4DX zH<8U7dG_y&RB(vTEv{{whjTf3ZYv&tF7_J5+ZX3Y82HP=`NjE#32ok-c>J|W{<4-z zn^!1o-tSfZlGw`_^W5egCjQ(uf6tK3!x}BhDYe@C@%rg$H~4dj`f0?)9uqts4n71P z(XOz44s$JP=2SP;57{+S{dI>K>=b!j9XZHgD>&>#?f6y4@bufh(XOu%zmrn&RCc>w zl8p7mw(eSd5|_Rj@KPI(PY0`y$7c=X!ae$u#C#5(QpPdXsZ-97<`2CVYh7!Wnv{d0 zykXTM$?01vr!Mv#i__D@snh24DYAvAFYr8_%_(0eblM3{9c;eE<^O<7v`1W$P8Q=n z9c#xua-E^xg!_>v4>ro$^Ic>INgv%9vsj~xHRaQ9yQ%#WU1U-heUdxqU92X!4C{5` zahC--aG$;_F?YMc-Dh~Fl{@*Y{~9)c95SDOnbgG{lDBtN-mq7mc*DKgIpS@u&D#_C z=0I5J;sE8e@trgH6THm@Z*$l`5SL&q9}Wgb@%D(f)3|34-yc@8!g?nDj$?#lD~ zaPJQ6ix@)w`c!I?-8MKO=~&ZY5k_F3Hup5o3+BR$k8+ze&1Nr zmTflsDP*Jf(K4HiO4Kc=pPxm4t^UI(K9(%K4W7B0_j?`Wh^-^onQsQC;f#pvCcYP+ z+9{hR&WIqLr*T30?yp7LOYxV}WTY>KjDyaQEyFCf9x`zKDsF;)g>3z5r8!pA{d9~A zOTS2G9H&FjFL7=+tw~yne#KmSSbKjI=2}skDaO5ZJ>zQMjJ>e1zYS|&bBnW3u>U7W z`+Z=CPUAP7hBjxKIc%&s>GEV=H;J!@(|NqEwJLgud-Ppn6V55^f1%%u5_J>$O&od` zdJeCfZ2LF!7}ZT48!P6NiA`J&4^rI(T$NfpPi-E}-Cl53y(EJj#dnIJhegms zo`?TYzDfG0b&54Zp7JJRAHM(Wqg#wg@9(Ss9`x@m^!KaS5BMzh3_gqff*R(EPmYW= z2i_iQzIP1${84h~7qlm^LX~4WOCmWSJN1iJNqtUrldrIUx(oKk_KR%J=liqjV3W1l zi~Ig7=zFnFXnUlB{WoGOdKUF9A6G3Iv2{X2XvY(7GFGFFHBQfFS~s*{@)l#|_x9D( znxV&`AKd29enGx&$hSAPZU}m?KwUF*x0A0CyXB!u^H!`GQr8Rlvc{R@D`=3xkM%+{ z7y7f}+46F>AM)CM1#}U*qmeDgGxYp%33Wh+4t$EXEL(I8ziZb8TP}Xv=bPNG(EQ_M zo=9*nY*7XKIqaBr6UHm``-u!b)~cM9=BYbfAsU0hGt+RE8_xdy;1S~x*4Q1Y_q<4b z9h`@CLrwYeoQEcZ_U+Mlr+r?hV3X-w7Lti%Azkp-j>DM8-_11U$C>MkWD3PCSmL%5ut(Xf$jzE+6l_o2pob5f&&pYgB* zdRqm%NP8P-FViI0oG$!di;&&JKCauF_+Bq-?)A5hGt+jDGd(-UDRyuwyAASmVg1P_ z`0HOZVGmqO=QZ3W-9`F&CFg1G3Kt(6b1~-UV$73m7+5E4l(x3XSQkhM6*o4|uKbVd zh9@noG`;mCgLkvP4{e^rALKi|f_^^(w)(i*{uDM>^6>@un0p`bafRSxx`wq=L8h&5 zGFDoAEEtV5FBCrR&&Qb;3LiD#!w~!2R+9~`1s_q##|FGlDxG=Z#+ete&A#zwTH$!p z;~%f^F_{&To@{M0_;`9~G~a(hTksQRs?SVfEAdX#VKWcm9q$D{ zcfh{Vxf^vWJm;I8PQEW?U|ptJw=}t3+ty^XET?^l=%4LP#^8PV=Gn$f^ImZJJ#gx; z9dC|W3b_`KH`mSbhF0O+8!yJN7z`{Tq7cGGPP%YcwN$TMa!QS|jv})>BM^ zoC`2M%Fuq<8fSyIt;wjvJ5s+6-H-Qq#?d|VDF(%VYB%%{v3%M;_^^)OPK8(Qn+oVXZvIg(r8&)2YupX%I#WY+7f3H5(^CAs)nueCE;84ZWh*u4tU z4hEOz)SP`(qt)Oop*+=zoMyKy%VM?1!yJ&G%Tp zAM*>&e$Q++&>ve@Z^UnkpuNGx`Tufn>`K_m9>ZRHPkUqQXm4zGGh~DP%4z0%WBs+o zrgv$v=~-NC+Hw@IZpcA>K=#S}KK62>cB&OO8>fCKctOAHul`jgUyov)nZ)&>HlOd+ z<>#Nl=8_E}drEUHKmRO(Grs~-hKY~?^RK@Z?e8weIrQLT7S`s*_{d|=NItCjwi-3b z&^u1>F+QYC<$Ro5{ZNkFH=S>mb-Lp26{fYfS17ffvO_rQoaWndDN9AOLG>ShANV*4 zd5)`m=$`?E+_L zk8_55*1GWf999iRo)N844F-DVL5;;)BbnCc1ZShc+31jV!8z)M;4KYjQi3A?OH(C zwGAq7>Fi7BD$SMJR^lzq=4}SqHOU*~9?6@i^PNPz!pGU)n`oQ?Cru0dX!3vka` z*JPfX)!_ef&XAAQ;2X!rsN3ev0YAB@Bo(}+!nVN&L9Hbhp9|Y2d25ZwTMD}~9&ZeC zFz~i3F>il8ad9pTb7(9VCU_foO!D?Kl{by80B_p!CmV0|-#+wTt?0kt8;=+( z)A!XoaPL~2frwLuL?0r*r8PkhNbhBBf^2LW;(;Rg_C?4C(0Mo1Z@H*XBTlI%LHTmxGOtGPID^HjM>yC%$TOlIf$!@}67zRC`1=Cw(Y{fN zE$)BkYE}o`7iWvC;5k5jvE=V9!JmlFTagSQp( z7(hop33(T@4C8@v!W3KY!#!J;I~e7eTJZ0)h}BkM4D6{v&IhsfO4JFp{$?W=doOcw zM&S%x`!RI?)q7C)ei!iuY8Lli?L2UHb*6bAV&a*tB{*BC1ZRkpnCqrjD6xx!{Q&av z{LZ;%<38vr#npVg{+FnWRzt3JYm!1$$XV(*TMTER9@v91IRJj>H)p9|@*v}#&~=iH zYFMi7g@trr>i9y9x4XjuwO3p?H_e){?{S@R2Q{dd)?)q=;f|oR{lrfh|FvRmS?O5eJhk zp%|CqV~Tkx)}7&-XzGO%5$m=Xll>FX{!FF)*=#D>A41!oQu{d5c{Oy8_*yq>R_GY& zYFcKCLB9bhILqN@#ZjJ%=TZyv`ENol1czKs#F`Xmc7u;Y6zlRcom*tA+hR~WY@Hi6 zqjsV>Y3W3q?L5)6`IyDhArEn(6}K4t%x~0mc-yFqke<-*fKuL=+T(GHAA6PPoNvgm z0J>)7liQ(NlXl{Lr_T;izPTG`etQBWi)XXG8+=S`!FgqB+cVkw7#Gy`ApYpAZ>n)n zU0~h#Is7bb;^nLldqRHaFg;US4B~*!EbH34#i+tQ#m}%0vx-44p(g_w&KK*@KLf~7 zbd@__q}Z1@-h=;Bp1Wro>}3VsF<}3u_l!R9aa@%Nzx5<#(kfe^dtZs=`36Sgy`v6s zCYAx)f@c$tWPco|N7gu=Ld>^^_8wg|X2iLnyHLN_gqqY^{5~4lgZohr8vL$(ZYZ4< zN;bbMDr#F)+xOs)&VuW~c|M5Uc}=6c!`W~G=l{@eG~zcwLOp>|vHkBkS(ll7EP=<| zZ{Eb~T2$NM=VPHwJ1#C~4Un_Wr_{A@ubzKd!ujCimRezP;baYf0Dx_F^~Y3d&J-p?*z! zz^t0$LDGGkdDm6%Xuvre4YWq@Cjj=(sZ1hRUS7UR3s5H4f_nTF+ zuIP@#|5TO_`J1=Rx9i)uUtf}#|5osS9_I|6r}u&!pWl{gevW_h-tnQNDZWjF^>|r@eM}K^Xdk0pupw8%~Jk8eNAI9(+!iVs4-a{Md z*bDJ7)wS=gJii5c^#QJVm$evl#v$co-^8`|-1%mDr`x3OQ?7Rl_HU2EehWIoY7cTw zq{|w92c7B*17F8^xv(wTvsfb@Y2oz+%9H!?on7G8Ib`>lDVc9*a#o<{sOI%MOy#^hXfc3~#Bv7Xg#vjzU<6$h>xu7l0<)VCPkGUR+S z_SKWWd0@GNx8 zOW$Q?)yd0DZEcJ3)#I0$>pn$|9kPl(nZllt@@wm9j9g*cpf4creDNEU8tq5GJ@y#6 z0%K${A0yi%lUWpTEw@3TT;{>P1R5Jvu#a`$d#>JrXRJX@oa(9DF+MyC#XbcZ3m)2| z0Dac5|3DoJ9_&#l@Vm{NNp3S8dldZGqmWB`6xO6SXr1W|)_Cv~;@2lpPxW9wgXc=D z;m4i^UsfsV9CB?mWVUTk8T$t0Bzr~vwT5xY>#Mz#n=6GaDotpM4j;oStI;(C(J^=IJP4gKUX8S+FUxSj;AOluP;f=_gac?A>21hi(DT}OdS1$Y5|8&9@Q!=*U5R`sgGaekcBD|HWlgI2)>u%c_qG(_I>=@=?lf| zOsA(Irx$$t;_*F^h2!y^1-@~Qej+j7FCDe*N{nxxR96hKT3|@}& zl_$B(qSmaC2Q>r_Y6v-5m&2CJeB=n*5@7#}SmF}f(o6Zs%VEnePiV`(8ISWmDm@S4F0J6;0L1Cn!`*A4l(UHJnzN4vzi z7DP-zIT}2Jd`UW&f2auhng+fz9S3;M4Rr*~ZR(!2X}b`{@?LETo$01e^PJ$fhf`2gyD8@Q%}BPd(+xjzx;u zEf)9r_*F=>&GjAk_K?2&GtCB0p9TM@ zY2-8TUmK7A@$B+={MUeg+@tSG%>NVd_^*}xGs*uB$^W}5|HW*q#s4|d`y!kBQ)Ju4 z+I?QX7{R^Rn=iN@&pty8!1aD3xJSFheb@V2j6Gk4uZU+*AG`rR8|XJeN5l4jQ_p5_ z2K|38P5gEx=f82D=|P=?d>kEprM>p^dhcTJhk0}_^#f`hX{dF?Y8)@S4)D449ha^1 z_a`@ampaY#)wu5v{{MZanTFa(I%*^Nz32m9ygnGqUc)014D=9?(U8(B4 zN9eqpY(D9{CzPM1!`923GTzVj+Y8vLczpL#PFaVo*Av?M{=PUir%%>Vvg)L**M+T5 z+N9(V#<@sy;72EQ1MxivN9=}Zl!qaKrA1HN11@twyq;_=PEH}27wB&AnFl#(nok|S!al$K>t}mjr+gUMb&;2eag989&egZ)S5`AY0jh^mlk4kh)P(o66riAoGnD-)E6;d=G2GhLB@C1iLYSyyIEq7YC4g zJd6CI#rF_$i$m{>HmP<+eUYCPG#4{@&N+(&TkXOW6=g94B z!W>t9qJaM%V$rMkeY`n&p|h{&nO6PQ)9K`Ao>Sg#AHGkyL|T8c1;2T|3As7S8Dd>4 z-zyU&{almMK-}$G?qDAHaOAgn;Kz}_<}o%I$B~m8#P8FP4@c`pX%7z7vhv{{dOK4Z z7S{&Ns-;1!d*5U%TpZ*%M3JY?X0MU_ct`3_6TfYvEhC+wx^I?U_wA%{Dd(Hoi|2T; z9!cm;Ci@9uLT>-^3u8W3^U4-OuiMLgthb>*4K9q?&B|N@U&`{UginQ90QABGKdONI zD)>Y(UusPRk@fqHik5l+k8hkDdeiU*;J@&vGFUz2we4WC zTr)>LE%awsV*MHHy?B04=4(B~9=4S-Um^47xr;bg)-t^czUNE6FY&3w zS|-7F1`At!uLR%Hr)tJpfM(Q<9C!weuLjpx5zie0XA2eH$+zO?wAlU?&gEkZplc5J zRYgNu$XntGrA@*)k8pKD|Gs#3GM#0|j(#Bj3Uf_^R+1W0{Vc5$epM&U`L?emY-HKL@U6V;w~+M`U1#7r zs|>cXETOHuG9K5hmM^Wa--_poS}*2WtfLZK zds&mkbr8REg?2~yR<9D*#WCONVxNlaC+8SG6|IHwK4be(8uk$*Cu{4lv>yUKdGTx2wE**)0~YPZF=nTB~1^ z%~saxz`j!rMa=bLt(D+aV^>+c-T_|GF7c}W;t^vH)ll$^2CTy+KZ@pd9vi@qis`TP zrO0lO&Gy2VDthPtllJcMRh4(X|ISWA*50{52#^43BB1Of+=GzKErEE+h1Rmu4p62) zF6o&jL`qAnxMeEVv`R=29-~Eu&d+wRQvzC zg(c;1-rwh0Yp=aG>EuU$f8>?hUVDGnXMLaV_49lmf4HzUHS8m%>OC^t7Vb{pVaIM< zGjpviI1?5zl|^|2|AvgJGNt##|TLGc?AJfN^3kH{I*yDhK1I z9gLrg$JkO=(R;1ChXiB8!_pjq7fn31Evc7lFgEiR493IMf0A2hJMphK#o{UHQwhd; z?{S^PQl79wX-5!zns{det9ZXHJC8m;?OJXP;GhG|kRd{|_ zxPKoxYimYWZ1M8EQoDM5DSLm2pYltI=WY)Nx8B?(>&e7XY3hE_5jT!{mN@Ed(G`iK zQoT6pd&bu7A2g5j<|MqsoP?!DU*5Ks-JD?SO#Bpz**Twc4v5&h*qU_mNLi2KLxR}6 zao0w2Uumq%^so>6XJO;UkUv`3Hd%vxdy!dcf?G$MSbJINpRsp7bsMtv@@(aPV>3Fn zy(`7ul@94g{{AiO9oM_O3ej=l3hJ0?S+nsYpD8td_^PJ1hW=>>JQ{cti`vj*TI(06?@mnJ`H2*N=(k^?9&J&<&5r{i??$Dv2(i} zJJ&gsodef+I|mM)om-^dM7Ha&)pibS_Y95g-C+Ci&Oz2*9&4|&*_PS1mn5Ir?cn>K z!S@_|1eq!EDr?vJt-JPaQSIQ8+3JfHvM=xt!i{1b_9HX=fkU-$*4C)*g|fb;$eMbV zHC4qN1^!`3qS>NN}3yErw?O0K?%%y2^27PEeC-jz zs)MstJ)b~egeC-VZ;fXsb-wl$(Xa(U};dJOaR=W1WGn>mMID{)c? z{W-_$LdM@XZi48Gz?iorjlC{_j zN9n?r;dV`p4{kx3_Bl0o@j29`su!Dji5sKVa5mji&MK__vN@mRulPUQwdiNR<7fXl z=NNL9;nG{vW3{NU%cj_((-!jN-(~ipZ&r@a;qRXQm#Z9PPnbc#wV{<$hO{Z$-bC*= z54SJze&Ta3{kly1oL=T?)YRYS`JClbj9nSk9ufSE{hp`NMDL5*BU(3pc8mH%N~Ouy z(F1uVAMn-pq;Mz0O7!EyfAd{^lb_|hlC$tfi_xRL&H}sdRi7<6`}=ReJLTDne>o2S zRP3<$nZ8Z_sKog;=Z*{R2hk_NyBEG*@2lzIzE}Ox6XfpwEyLmbpewtlz%`r|?&n-` zYeGA@KDsrjJ+i!WitWi?u71I~*Zzn1v^QeQXS6&1XRhaeb{ZSG-?fpv*3+T6=+GQT zhvul~$&ExeL@%@sr5CEEWk!eAd`)7)*~&UudHFxlrC;J_q+i(7=ER8X18Mq(;hKs5 zG=9z1pT~&7&Dr2_Q`tAK53M*PkseImS^_>uNPl5_N3992fqs^7CGD* z1`pkq&ACiYERKwx{>)YnBe!Qi%ba|kIFa`Xy*soX{qbk$QN#6mbomR!QPja|dhWAj z#zDdPThx{2;n*KXpJp3<@-f3saQqU_L)M^G*&ey}fSN>lr>+Egj_w)QteP=iIo$b_w{;D4QR!xQTHE+LpE!*xRbi8Eo66zQXIgbug24FvD2~GgLqMmDc}Lg{sY|uROxFVnhE^ z*H-3f-EXUNa(pKqYm?dvy1&ioTU9&f{WNi(Pf%O=JL)IfCkDdLl=8hh5N@MRvYQ&q zH+lUw`dQl=Os}wwdP*Dh6ulnQR9$=7-7}c(PgBQ`)zkgS4#!M#q^ZOXQ-`#nbJ6|F z^(J)&f)0x))!Z8CTPywh~`ganD&2+;hkc zf)lBubeld@Y+n%lEM3z&pQ7!Lu{~4mo7k5xeX7jKH+SjTo#=^YYo@4%!SGgMYry;6 zq47TRAK02Y>f5}p_^fw+Jz4v#^JUvg0s%Qzv+#?OF7!kn(W{_7~yY^hE5)Af)?SySXoKbx0wRARLc?ja^4pU7@VIoe+(@tNsU zt<0N7-ZYK#dfUmHrm;tWbJGPw9ivTAlaXKI(ZH^DJv%{StpgXHhy>Z={|DZ`y0e{_ zFExB%mM<#$sPE@jMdVcM2O`drv&uuO`ul=us+^WO%O`C?~^y_l^9y{~fmS$WBN?{WR!f$R4+c@1{vkd=KabzGzO z))$|M__$tdjp)4iljtv*TLS-KV6N11i3f{JZ%g)E2JSKOnpI`|tpzSp_wo@-OT0XW znNb!qImR(FO7uN|ub}o8&15c=TZf@H5f)u2IA5s7s%dttHo)IJ-M?KuCpkLnQ(_L? zZ{f9}J=2D?F}H}$m&NBNgO`EJ#f@*qs{fn@((YW}01h8l4!E77kE@wf@zNi8o87K9h>n1h zjt73^#$~s8aal8Z((Tmhus4bJ(c{a#vu={Q+trgj=t-y1lWp&tJw`s>Blv22MD)e& zF&l0u?}>i6{bhO9S}!`$i(`DTo}`aFj+&^{I)#fX{bkV~T_cFAk7~{|u~~nq$#caX z?l50X^rw^$wPo7Aw6%=~4g4~Tx&3U@fm7m1x$|N=1 zU7K&SHYdy4jN{9F0nA$+%;v=qB+Pk_H^94pqST+^+a}dX z&0gs1d(L8yWN+jDr=D}6)S;c8^D?l;mR#?TiqtXWybkMJu;!Z3%Av8I3)UZxA7pJ} zk80{SdTVpJgZD4u@t&X#v$g~0+9Qo2_APzCYtw<^j>vkr%2ucE=qc>#0rn{EA4!al zj#%*Lf@Ogp23U8!tidb!62BJMN0<220rYwOeJ^YZOtiYhwid4~Qd8El$A#BPtXsI+ zA1-FiN{t{mA8uA2wYrPGa6a}dNS&c?xbRI<*h7&LF0Am`D?6v#)w`!Nm!>_k^_H}7 z){FkG!1Q!&$4&lMq`r>q``HsB{ocX`U)c9Fv$ptbiM_4gwnwA~EVHzPdnW5xW(`Sf zBzylhXYXG}WCt>qBfr!` zW#8a>Fz#PoV9Wl$_pjyHThIH#4}$a7)|Bvr;M<5_S)MloKR<)LfF1bx8Tffi&&Anr z&EywG-kVgZgR#yp1miv33q^iy7vVR3>-=cd)=AE?cAP##<{4~~JdfUb;&p6WHL~eh zf|qjaHQ*W;(V_R!h;G$zFWb(uzjI_qBBhXLssqAi#j4wR~0@`J3gm*#{?z&VRjR5>?W2d21|MN zefQD};9lC8SJVWy*4hFkXJU;-E^7k&Xu3G_zT^2#g6*>{X<^CZ+t7pU<5P~xvuVR_ zSd%&;d(Q{EoE$QeQZFc1Niux*h?#QiR_82ttB1gncs+H63YtqIbd(y z*%1kXbtY@@{omx+_;%|0qR%t!rQ>H(qnk;se}s-%jSi1e4{;B!FSpO$F22F~W_TAfdN za@1RD{)<{&%^R8)2Y?v#%gtv1L=L0JPR)d9HAy6dt$9_CVpn- zkUstIU&qg!&e41M$3WY~da??`HW-pK{V{gXRtn8dg{ca}p zJ9KCcbI_2%=+Fq&_lB`8vTntH2=~MKQb$Dmh}^T->&tKD*i(^3+w*^&s9gK89(&QT zHb=cbzd-LV*M5ifBQ|6^_abXi?0Nr*9DDuQV3*ueQ#WgT6LO>TGB>UNwH$jRdR~2I zCVTU+*{6|l)|l`Ha+|4KzX98}esy-2_<-d-Gvi{}9Q7~A9(aU&92?UZ{QjmOx%mO? zTH~NTK3lDi^YMS`&SB4yu`vbUS0J^(m_5nT_GCR+hxyv-`1mhkyB@^H4;;&}qu8Ve z#lOG8&)BAoVw>`2+12^8$T6|ww-kh%5Bj^BO5^QLmfGRq?bfw~fAFpI8Pv7L>AI~v zhdn%pzA~Qgt`6<%+ps+v`&`a91Yhw{yRqSOxmUq_Gqo+LY1OU`sy#fnrC={}7gvFI z@X3xyv(}j)wJhJ&Bh;(Ij^|S1nRmi>^*`Ml&bi5es+B-eowg=T} z!TQ@^-MB5XzpX1~&r78jj6BlsKjOqxqPG%9^-V9ZJsWK)iKlk+479E0*@`Yp>{P(d z&w{b|2C?@8hjXa2iOq+D_aZ-oZ#(#|>_o=h$oQP#dsDcbnqeEYL{FbBbq8{aot9pU z*!5<5(NeIjI|H_-XW0wTe_bzsse?FbR-7KgCvbGa z`jOc0bgx!5+4NbYk9d8b#mqP{wmVIoC%=&UZl=epZTEL3sV3rW>9ZWC*R>|0*HWY| z-&3j9qxV74d-^OEJx1w$Uie;)=2kQ=rj~&ncl)@)g%i89KI}Ux`C8Dq_KWmi)?m{g zqTlj>T!SrNzt(rO30r<&ye-cyb8LC)5VqW}4oO~(Eso{$TpJo&Hl!^tIgTxVHp!On z!Fj?pF^WyVwuw z9QGR>7yB)8iY;%$UKC?5ny}g2->zDF60Y_?7Dxw>*^Z%xnfruu@TnqojAM>{p3C##KuT(q8WShpxBsJ z!JJ;<8H2Cn5i5I;`!v6QBr*Bz;U=*&$YA{DA~haaS!cf$ythjJ@Lh5=k()2ex5LTN zLip2#s-M4o>pXKd=-uwdH}A$L$8;v&%O`4(O>&9et;DS8-ZSJ3&q&U&CCA=|o^3lz zPT^<%?CR0lmPlSvJ$|;y&GKgBd-yqRN5qqJf%+Y5LgcbW?9j2k^l>lnyTtoWU3ORT z)Z6Iq%u^ra71+etQ7s!fAlSAcQ{UzsyFY73WIJ{5Htbzs4nbFK43%CE>l;L{HXv>Ziym=eKAbF4_?hA0Rp` z@{149db{>EB{916K1I&zWtEo?qLbot`iA3gn1L#=WN@Pw_N=l^2)O% z7u(gm=QeFq??bj`WRf!*q?h_E{eG$E^=DGQYbD;{_0|mLDQSN_NBb1X9op&H%l-T{ zGK#IJMc%2{SgChQ?hur`Vb+dV{3kiXLHcmk>>UxwHS)naTh?83j-3zYk~^&InQbpU zGaLUS_r!cHKHKQ;9M$aTg+CvQ{lXBf_Si2D=$ zX~L%jUod%nGxrkM;)_z}i%Op`uw+Lh*b?|*HqT-MoQwD2T;LafDE0gU+J+d8Q;_v% z@r<&GsXq8Zj-5?Bb)kVghG(%n?+$eP4%@mDeaXLr`RFskImA<05>LhMW3~!&AJ(UM zPGZwiZr8e@^#WfmHpAwtP{#pf!~xS)DY$9hpIV@2q|0ljfWOpX*=M0^uzh0V=nsa# z6ko=92JizTJ9NKWxE2rcY^+Z+n|F1N9nYs&UVn$Zbk!Yp&2r>jG%H*Jr=lEQh9~bV zl`Xh~x#+>=Rov^E9Zt?R)63beaaL{>H3rx3^ICb2Kl0@}m)H~hU*sP0UbXbNut&SB z#ka?Dwh;NXa4e)h?$+(a?@K>rV7bZJ+?st&a?Zwcl66#ve_#D8U-+|E{awPXsK&p` zes7D#nO>E=S54x-FzB7L7?bVh3SnY!mk-TvMj_E=_wm-nFOr_uBKcM#Lg36Fho z9QDAP<8)@4dPL-PbjGejXC85NW~!$%mpF^N+vto%j(m>K_H@RZQ}PaTN>+fo)|D4- zkJat>(~Fauz355QU#@HRu5R22pHJ85@o~C`iJx___U+Dgzq;tcaB%1M@~;C zO4Lkb6CINKwa_y?n`D{P=;sgv&KXiSy8fLSJ=gbhz1TL<^%$Qo_W@h$#ppRkFTNhH z7gN;jj$T;11m99G4!;Ptt;EPKS0w>kZ!XC@%q2;2v9-ar-o)RrePC7OivD@Ay1elD z-1vI1ePF^_POizbw>#=$8o)jY&ixhCi()l-u+4L7@(I|6)Gx_1uERE0YVu&aa%gNL zV0$SJ+e`F_g@Yyl`MX z6uvSXmXO%K`P2vgf!aL(cR9=OsiFfD3|HBG27>=sHHW=m>837~fcfp}tH^A1-sR;o zyf(CFXsj>&1RGa|jpJU7jSHLJB=1$z`9PeFbMSsH9`BH9aqzy6n7D9YiniJBBikcC zzDwIU>(Gu!Vf)l@-vBnQJ6-AvyNdsQvMNm>wjzFcfwgx4KPdAE4`9#4rC9kH zx3eZr4ZlAfpMQ|wU*z}hsmw4=r@lMKt~)cwu01`6n1voa?`dL|+tnhurv~FYtsl8I zFs^s`8(F96X6{6NdXf!H>|N%&x^!wX>+~+2CvV$CpuBJoggQqjRnv-Rk+$v*=N3x{klBp0p%AN}Qqb4W3IQ_iKF) z9(>Q8MvsV#eOxbn>*&wnO5}5&naJ$$BLW$sNAzJ+jUEY)TWTtSp0umMfiyeoS{ieL z(IfufJ05?3I!(`?()!bq$NJ0je88DBJ1}uFv#a>tJ(+#h=ul_cAUbr5`s`pjr0#^1 z1zvlG)}fzw<6EoZeQTJxcXt~5uQnUs`n01z@5Sp+k-AqfM|Z5>3f^%uGtPi@cbaYX zAtYm+I5VTf#kvcu`CO@O`MCC7@Dr?Cex9oO^T7HixTKe z!ycuvR~5{Uf%$89!WX)ewL21wM{0}%dj;Ry*yGAGAl40Z-==+T-brw-9}MT4ly5Mc zmw_|agx(z*=LZMFx!%F~q=WM*2j`FCalS?UfpsoE{?siJKRI(TPJ?l4nwfQt%!#pK z;#`cAYt}h}ao9cEX&D9-cu}nk{jTh3tvXAaPE{m)vLYRh|K#t@WI11#gLSgxevw4_wQJ zcV%>4Vw=D{g1hXWO~O4-aKDwkvx57r;rx5Ro!9iHI=JVj*}@6kFSySK_l7v!$AkNH zaIavkECctR)In@ZfvOq|_mfq`mf*f}Xxv|Ubr9RqQ{}{#4(^|Ea32+q`#4qZ;$HLw zwk2*>##>;X>R^uCiI^wO%E)sue;>^GT#Y%`dYGpf%rAj?W*p`j4(6#znD;P~a$+HK zsF+FEUC10NFy}SBSF(++pH9`78(q&p*E2j_Kf?^i51ILREtQ-a%sU6ee2n^k$yct^ zbp_^J6WTL0=Kt4Vm@~&z$Med;{AmaCN%5E$s57h+t?M%c^SHSgC&Zqo8a+quM9dTC zX1t92+SYu6eNKF?vFE9Am=80Ue+cF$%uGkE=da1UO!U0l%yx{~7iOul2RWR1P%vk1 z>1)h)z8B1yaVm3H$DRc9`oSC=d>NQ?P3YaBF;5u` z^LhvKlMd#m9L#6OV?IVb>|$Oin8(f1cunlPgE?|1VxBllW2KAvzk)fRt1;(VPtPrb z`ES6yJq~kbt7^G>)!XC`dc zRxr;EW77x2e59H(80NWP&NZR2;UR7Mb3Y!$w&XdO=SCfy9yT`p&Unl@ea6N7Q-XQi zSwh`n&mGK>I}!6lUd5ltTeP0vT#7w+Fy~qi^Ps`}tl0B7%=KJYvFAycGZ!|_KV<%!%!c z#&W#s-45=bkH>w4`WqMbFFg?{Y#Bq%V7T&%G;<2J($OKVb!+J|r%cCTuZgX6 zW`Z({)!0chn{vNn`%L`nr%u5AFk3aVS@b9md&yZ>txIg{m9(Qe20owW>CGzih8e6u zX1I>corirKOmBkfJ#wq-^d=X*;hNCcc|+RAzeaDa%j=kbs^fs%haCGj Tl>r9q< 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 z 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 al75>0)oA?sjN`xjFFFpUPQ$75$Nw)oA@sul diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 0738d3fbc..42c91329f 100644 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -427,7 +427,6 @@ class Controls: # accel PID loop pid_accel_limits = self.CI.get_pid_accel_limits(self.CP, CS.vEgo, CS.vCruise * CV.KPH_TO_MS) - self.LoC.experimental_mode = bool(self.sm['selfdriveState'].experimentalMode) actuators.accel = float(min(self.LoC.update(CC.longActive, CS, long_plan.aTarget, long_plan.shouldStop, pid_accel_limits, self.starpilot_toggles, has_lead=long_plan.hasLead, traffic_mode_enabled=self.sm['starpilotCarState'].trafficModeEnabled, diff --git a/selfdrive/controls/lib/lead_behavior.py b/selfdrive/controls/lib/lead_behavior.py deleted file mode 100644 index 7068a10e0..000000000 --- a/selfdrive/controls/lib/lead_behavior.py +++ /dev/null @@ -1,176 +0,0 @@ -#!/usr/bin/env python3 -from openpilot.common.constants import CV - - -HIGHWAY_LEAD_BEHAVIOR_MIN_SPEED = 45. * CV.MPH_TO_MS -TRACKED_LEAD_CATCHUP_BIAS_FULL_SPEED = 52. * CV.MPH_TO_MS -TRACKED_LEAD_CATCHUP_BIAS_CRUISE_ERROR_FULL = 1.5 -VISION_LEAD_TRACK_MIN_DISTANCE = 25.0 -VISION_LEAD_TRACK_BASE_TIME_GAP = 1.75 -VISION_LEAD_TRACK_CLOSING_GAIN = 0.20 -VISION_LEAD_TRACK_CLOSING_CAP = 2.50 -VISION_LEAD_TRACK_EXIT_TIME_GAP = 2.30 -VISION_LEAD_TRACK_EXIT_MAX_LATERAL_OFFSET = 1.6 -VISION_LEAD_TRACK_EXIT_MIN_MODEL_PROB = 0.70 -VISION_LEAD_TRACK_CONTINUITY_MIN_MODEL_PROB = 0.95 -VISION_LEAD_TRACK_CONTINUITY_MAX_LATERAL_OFFSET = 1.1 -VISION_LEAD_TRACK_CONTINUITY_TIME_GAP_GAIN = 0.55 -VISION_LEAD_TRACK_CONTINUITY_FULL_SPEED = 20.0 -VISION_LEAD_TRACK_CONTINUITY_FADE_SPEED = 25.0 -TRACKED_LEAD_CATCHUP_BIAS_MIN_HEADWAY_MARGIN = 0.40 -TRACKED_LEAD_CATCHUP_BIAS_FULL_HEADWAY_MARGIN = 0.70 -TRACKED_LEAD_CATCHUP_BIAS_MIN_FADE_START_MARGIN = 0.75 -TRACKED_LEAD_CATCHUP_BIAS_MIN_FADE_END_MARGIN = 1.05 -TRACKED_LEAD_CATCHUP_BIAS_ABSOLUTE_FADE_START = 2.75 -TRACKED_LEAD_CATCHUP_BIAS_ABSOLUTE_FADE_END = 3.10 -TRACKED_LEAD_CATCHUP_BIAS_FULL_LATERAL_OFFSET = 0.90 -TRACKED_LEAD_CATCHUP_BIAS_MAX_LATERAL_OFFSET = 1.60 -TRACKED_LEAD_CATCHUP_BIAS_GAIN = 0.45 -TRACKED_LEAD_CATCHUP_BIAS_SPEED_FACTOR = 0.55 -RADARLESS_MATCHED_FOLLOW_MIN_SPEED = 22.0 -RADARLESS_MATCHED_FOLLOW_MAX_REL_SPEED = 2.0 -RADARLESS_MATCHED_FOLLOW_MIN_HEADWAY = 0.95 -RADARLESS_MATCHED_FOLLOW_HEADWAY_BELOW_TARGET = 0.35 -RADARLESS_MATCHED_FOLLOW_HEADWAY_ABOVE_TARGET = 0.90 -RADARLESS_MATCHED_FOLLOW_MAX_LEAD_BRAKE = 0.35 -RADARLESS_MATCHED_FOLLOW_MIN_MODEL_PROB = 0.70 - - -def _smoothstep(value: float, start: float, end: float) -> float: - factor = min(1.0, max(0.0, (float(value) - float(start)) / max(float(end) - float(start), 1e-3))) - return factor * factor * (3.0 - 2.0 * factor) - - -def should_track_lead(lead_status: bool, lead_distance: float, model_length: float, stop_distance: float, - v_ego: float, *, v_lead: float | None = None, radar: bool = False) -> bool: - if not lead_status: - return False - - tracking_buffer = max(float(stop_distance), 4.0) - model_limit = float(model_length) + tracking_buffer - if radar: - return float(lead_distance) < model_limit - - closing_speed = max(0.0, float(v_ego) - float(v_lead if v_lead is not None else v_ego)) - vision_time_gap = VISION_LEAD_TRACK_BASE_TIME_GAP + min(closing_speed * VISION_LEAD_TRACK_CLOSING_GAIN, - VISION_LEAD_TRACK_CLOSING_CAP) - vision_limit = max(VISION_LEAD_TRACK_MIN_DISTANCE, float(v_ego) * vision_time_gap + tracking_buffer) - return float(lead_distance) < min(model_limit, vision_limit) - - -def should_hold_tracked_vision_lead(lead_status: bool, lead_distance: float, model_length: float, stop_distance: float, - v_ego: float, *, model_prob: float, - y_rel: float, path_y: float = 0.0, radar: bool = False) -> bool: - if not lead_status or radar or float(model_prob) < VISION_LEAD_TRACK_EXIT_MIN_MODEL_PROB: - return False - if abs(float(y_rel) + float(path_y)) > VISION_LEAD_TRACK_EXIT_MAX_LATERAL_OFFSET: - return False - - tracking_buffer = max(float(stop_distance), 4.0) - model_limit = float(model_length) + tracking_buffer - vision_exit_limit = max(VISION_LEAD_TRACK_MIN_DISTANCE, - float(v_ego) * VISION_LEAD_TRACK_EXIT_TIME_GAP + tracking_buffer) - if float(lead_distance) < min(model_limit, vision_exit_limit): - return True - - path_relative_offset = abs(float(y_rel) + float(path_y)) - if (float(model_prob) < VISION_LEAD_TRACK_CONTINUITY_MIN_MODEL_PROB or - path_relative_offset > VISION_LEAD_TRACK_CONTINUITY_MAX_LATERAL_OFFSET): - return False - - speed_factor = 1.0 - _smoothstep( - v_ego, - VISION_LEAD_TRACK_CONTINUITY_FULL_SPEED, - VISION_LEAD_TRACK_CONTINUITY_FADE_SPEED, - ) - continuity_time_gap = VISION_LEAD_TRACK_EXIT_TIME_GAP + VISION_LEAD_TRACK_CONTINUITY_TIME_GAP_GAIN * speed_factor - continuity_exit_limit = max(VISION_LEAD_TRACK_MIN_DISTANCE, - float(v_ego) * continuity_time_gap + tracking_buffer) - return float(lead_distance) < continuity_exit_limit - - -def is_radarless_matched_follow_window(v_ego: float, lead_distance: float, v_lead: float, t_follow: float, *, - radar: bool = False, lead_brake: float = 0.0, - lead_prob: float = 0.0, - min_speed: float = RADARLESS_MATCHED_FOLLOW_MIN_SPEED) -> bool: - if radar or float(t_follow) <= 0.0 or float(v_ego) < float(min_speed): - return False - if float(lead_prob) < RADARLESS_MATCHED_FOLLOW_MIN_MODEL_PROB: - return False - if float(lead_brake) > RADARLESS_MATCHED_FOLLOW_MAX_LEAD_BRAKE: - return False - - relative_speed = float(v_ego) - float(v_lead) - if abs(relative_speed) > RADARLESS_MATCHED_FOLLOW_MAX_REL_SPEED: - return False - - actual_headway = float(lead_distance) / max(float(v_ego), 1e-3) - min_headway = max(RADARLESS_MATCHED_FOLLOW_MIN_HEADWAY, - float(t_follow) - RADARLESS_MATCHED_FOLLOW_HEADWAY_BELOW_TARGET) - max_headway = float(t_follow) + RADARLESS_MATCHED_FOLLOW_HEADWAY_ABOVE_TARGET - return min_headway <= actual_headway <= max_headway - - -def get_tracked_lead_catchup_bias(v_ego: float, lead_distance: float, desired_gap: float, closing_speed: float, - v_cruise: float | None = None, y_rel: float | None = None) -> float: - gap_error = lead_distance - desired_gap - actual_hw = lead_distance / max(v_ego, 1e-3) - desired_hw = desired_gap / max(v_ego, 1e-3) - headway_margin = actual_hw - desired_hw - - if gap_error <= 0.0: - return 0.0 - - speed_factor = _smoothstep(v_ego, HIGHWAY_LEAD_BEHAVIOR_MIN_SPEED, TRACKED_LEAD_CATCHUP_BIAS_FULL_SPEED) - cruise_factor = 1.0 - if v_cruise is not None: - cruise_factor = _smoothstep(v_cruise - v_ego, 0.0, TRACKED_LEAD_CATCHUP_BIAS_CRUISE_ERROR_FULL) - if speed_factor == 0.0 or cruise_factor == 0.0: - return 0.0 - - # Encourage ACC to treat a tracked lead as the active constraint when we're - # hanging far above the requested time gap, but don't override cruise for a - # truly distant lead or one we're already closing on decisively. - fade_start_margin = max(TRACKED_LEAD_CATCHUP_BIAS_MIN_FADE_START_MARGIN, - TRACKED_LEAD_CATCHUP_BIAS_ABSOLUTE_FADE_START - desired_hw) - fade_end_margin = max(TRACKED_LEAD_CATCHUP_BIAS_MIN_FADE_END_MARGIN, - TRACKED_LEAD_CATCHUP_BIAS_ABSOLUTE_FADE_END - desired_hw) - entry_factor = _smoothstep(headway_margin, - TRACKED_LEAD_CATCHUP_BIAS_MIN_HEADWAY_MARGIN, - TRACKED_LEAD_CATCHUP_BIAS_FULL_HEADWAY_MARGIN) - exit_factor = 1.0 - _smoothstep(headway_margin, fade_start_margin, fade_end_margin) - - closing_fade_end = max(2.5, 0.12 * v_ego) - closing_fade_start = max(1.75, 0.08 * v_ego) - closing_factor = 1.0 - _smoothstep(closing_speed, closing_fade_start, closing_fade_end) - - lateral_factor = 1.0 - if y_rel is not None: - lateral_offset = abs(float(y_rel)) - lateral_factor = 1.0 - _smoothstep(lateral_offset, - TRACKED_LEAD_CATCHUP_BIAS_FULL_LATERAL_OFFSET, - TRACKED_LEAD_CATCHUP_BIAS_MAX_LATERAL_OFFSET) - - bias_cap = max(10.0, TRACKED_LEAD_CATCHUP_BIAS_SPEED_FACTOR * v_ego) - return (min(gap_error * TRACKED_LEAD_CATCHUP_BIAS_GAIN, bias_cap) * speed_factor * cruise_factor * - entry_factor * exit_factor * closing_factor * lateral_factor) - - -def should_disable_far_lead_throttle(v_ego: float, lead_distance: float, desired_gap: float, - closing_speed: float, following_lead: bool) -> bool: - actual_hw = lead_distance / max(v_ego, 1e-3) - desired_hw = desired_gap / max(v_ego, 1e-3) - - if following_lead or v_ego <= HIGHWAY_LEAD_BEHAVIOR_MIN_SPEED: - return False - - # Don't coast if we're already materially above the requested headway. - if actual_hw > max(desired_hw + 0.15, 1.75): - return False - - coast_window_open = lead_distance > desired_gap + max(4.0, 0.15 * v_ego) - coast_window_far = lead_distance < desired_gap + max(12.0, 0.60 * v_ego) - gentle_closing = 0.35 < closing_speed < max(1.35, 0.05 * v_ego) - ttc = lead_distance / max(closing_speed, 1e-3) if closing_speed > 0.1 else 1e6 - - return coast_window_open and coast_window_far and gentle_closing and ttc > 7.5 and lead_distance > desired_gap + 7.0 diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index 67990576e..d130763db 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -4,7 +4,6 @@ from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N from openpilot.common.pid import PIDController from openpilot.selfdrive.modeld.constants import ModelConstants -from openpilot.common.filter_simple import FirstOrderFilter from openpilot.selfdrive.controls.lib.longcontrol_vehicle_tunes import LongControlVehicleTuning CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] @@ -17,7 +16,6 @@ LEAD_GAP_SETTLE_MAX_START_ACCEL = 0.25 MOVING_STOP_FOLLOW_MIN_GAP = 0.25 NEGATIVE_TARGET_CREEP_GUARD_SPEED = 0.35 NEGATIVE_TARGET_CREEP_GUARD_DECEL = 0.40 -MODE_TRANSITION_MAX_DECEL = 4.0 LongCtrlState = car.CarControl.Actuators.LongControlState @@ -114,7 +112,6 @@ class LongControl: def __init__(self, CP): self.CP = CP self.long_control_state = LongCtrlState.off - self.experimental_mode = False self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV), (CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV), rate=1 / DT_CTRL) @@ -122,38 +119,10 @@ class LongControl: kf = getattr(CP.longitudinalTuning, 'kfDEPRECATED', 0.0) self.feedforward_gain = kf if kf != 0.0 else 1.0 self.v_pid = 0.0 - self._mode_setup() self.last_output_accel = 0.0 self.stop_release_counter = 0 self.vehicle_tuning = LongControlVehicleTuning(CP) - def update_mpc_mode(self, experimental_mode): - new_mode = 'blended' if experimental_mode else 'acc' - - if self.transitioning and self.prev_mode == 'blended' and self.current_mode == 'acc': - self.mode_transition_timer = 0.0 - - if new_mode != self.current_mode: - self.prev_mode = self.current_mode - self.transitioning = True - self.mode_transition_timer = 0.0 - self.mode_transition_filter.x = self.last_output_accel - - self.current_mode = new_mode - - if self.transitioning: - self.mode_transition_timer += DT_CTRL - if self.mode_transition_timer >= self.mode_transition_duration: - self.transitioning = False - - def _mode_setup(self): - self.prev_mode = 'acc' - self.current_mode = 'acc' - self.mode_transition_filter = FirstOrderFilter(0.0, 0.5, DT_CTRL) - self.mode_transition_timer = 0.0 - self.mode_transition_duration = 1.0 - self.transitioning = False - def reset(self, preserve_stop_release=False): self.pid.reset() self.vehicle_tuning.reset() @@ -271,7 +240,6 @@ class LongControl: else: # LongCtrlState.pid a_target = self.vehicle_tuning.shape_gm_truck_accel_target(a_target, CS.vEgo, should_stop) error = a_target - CS.aEgo - self.update_mpc_mode(self.experimental_mode) self.vehicle_tuning.shape_volt_test_tune_integrator(self.pid, error, CS.vEgo) self._trim_positive_overshoot_integrator(a_target, error, CS) self.vehicle_tuning.trim_gm_truck_positive_hold_integrator( @@ -292,19 +260,7 @@ class LongControl: raw_output_accel = self.vehicle_tuning.apply_pedal_long_brake_bias(raw_output_accel, a_target, CS) - if self.transitioning and self.prev_mode == 'acc' and self.current_mode == 'blended': - if raw_output_accel < 0 and raw_output_accel < self.last_output_accel: - progress = min(1.0, self.mode_transition_timer / self.mode_transition_duration) - # Soften transition at low urgency, but keep sharp for high decel - # 20% smoother for chill decel (lower exponent) - urgency = abs(raw_output_accel / -MODE_TRANSITION_MAX_DECEL) - urgency_smooth = min(1.0, urgency ** 0.4) # 20% smoother for chill decel - blend_factor = 1.0 - (1.0 - progress) * (1.0 - urgency_smooth) - output_accel = self.last_output_accel + (raw_output_accel - self.last_output_accel) * blend_factor - else: - output_accel = raw_output_accel - else: - output_accel = raw_output_accel + output_accel = raw_output_accel self.last_output_accel = clip(output_accel, accel_limits[0], accel_limits[1]) return self.last_output_accel diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py old mode 100755 new mode 100644 index 2e806b88a..3cdf2b47b --- a/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @@ -1,35 +1,34 @@ #!/usr/bin/env python3 import os import time + import numpy as np +from casadi import SX, vertcat from cereal import log + try: from opendbc.car.interfaces import ACCEL_MIN, ACCEL_MAX except Exception: - # Build-time fallback for generated-code steps before full python extension availability. + # Generated-code builds run before every opendbc extension is available. ACCEL_MIN = -3.5 ACCEL_MAX = 2.0 -from openpilot.common.constants import CV -from openpilot.common.filter_simple import FirstOrderFilter + from openpilot.common.realtime import DT_MDL from openpilot.common.swaglog import cloudlog -from openpilot.selfdrive.controls.lib.lead_behavior import get_tracked_lead_catchup_bias, is_radarless_matched_follow_window -# WARNING: imports outside of constants will not trigger a rebuild from openpilot.selfdrive.modeld.constants import index_function -if __name__ == '__main__': # generating code +if __name__ == "__main__": from openpilot.third_party.acados.acados_template import AcadosModel, AcadosOcp, AcadosOcpSolver else: from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.c_generated_code.acados_ocp_solver_pyx import AcadosOcpSolverCython -from casadi import SX, vertcat -MODEL_NAME = 'long' +MODEL_NAME = "long" LONG_MPC_DIR = os.path.dirname(os.path.abspath(__file__)) EXPORT_DIR = os.path.join(LONG_MPC_DIR, "c_generated_code") JSON_FILE = os.path.join(LONG_MPC_DIR, "acados_ocp_long.json") -SOURCES = ['lead0', 'lead1', 'cruise', 'e2e'] +SOURCES = ("lead0", "lead1", "cruise") X_DIM = 3 U_DIM = 1 @@ -38,987 +37,376 @@ COST_E_DIM = 5 COST_DIM = COST_E_DIM + 1 CONSTR_DIM = 4 -# ===== VOACC SPEED-BASED TUNING PARAMETERS ===== -# City: Emergency-responsive | Highway: Rubber-banding prevention -# Speed ranges: [0-35, 35-55, 55-70, 70+ mph] - -# SPEED BREAKPOINTS (mph) -SPEED_BREAKPOINTS = [0, 35, 55, 70] # 4 ranges: 0-35, 35-55, 55-70, 70+ - -# ===== CHANGE THESE VALUES FOR DIFFERENT SPEEDS ===== - -# RESPONSIVENESS TO LEAD CARS (Lower = More responsive, Higher = More stable) -# [City Emergency, Urban Hwy, Rural Hwy, High Speed] -X_EGO_OBSTACLE_COSTS = [3.0, 3.0, 2.5, 2.0] # Less aggressive at low speeds, closer to original - -# JERK CONTROL (Lower = More jerky/responsive, Higher = Smoother/conservative) -# [City Emergency, Urban Hwy, Rural Hwy, High Speed] -J_EGO_COSTS = [5.0, 4.75, 4.5, 4.0] # Reverted to original 5.0 at low speeds - -# ACCELERATION CHANGE PENALTIES (Lower = More responsive, Higher = Smoother) -# [City Emergency, Urban Hwy, Rural Hwy, High Speed] -A_CHANGE_COSTS = [200, 195, 180, 170] # Reverted to original 200 at low speeds - -# SMOOTHING FILTERS - Speed-adaptive for optimal responsiveness -# Lower = More responsive, Higher = Smoother -LEAD_FILTER_TIME_LOW = 0.8 # Under 40 mph: Fast response for city emergency braking -LEAD_FILTER_TIME_HIGH = 1.2 # Over 40 mph: Faster response to prevent highway gaps -SPEED_FILTER_THRESHOLD = 40 * CV.MPH_TO_MS # 40 mph threshold -DUPLICATE_VISION_LEAD_FILTER_TIME = 0.15 - -# DISTANCE ADAPTATION STRENGTH (How much penalties increase when close to lead) -# [City, Urban Hwy, Rural Hwy, High Speed] -DIST_ADAPTS = [0.04, 0.06, 0.06, 0.05] # Balanced across speeds - -# ===== END TUNING PARAMETERS ===== - -FAR_RADAR_LEAD_ACCEL_TAPER_MAX = 1.0 -FAR_RADAR_LEAD_ACCEL_TAPER_MAX_CLOSING = 2.5 -FAR_RADAR_LEAD_ACCEL_TAPER_MIN_GAP_EXCESS = 8.0 -FAR_RADAR_LEAD_ACCEL_TAPER_MIN_GAP_GAIN = 0.25 -FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_EXCESS = 25.0 -FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_GAIN = 0.9 -STABLE_FOLLOW_CRUISE_MIN_SPEED = 12.0 -STABLE_FOLLOW_CRUISE_HYSTERESIS_MIN = 4.0 -STABLE_FOLLOW_CRUISE_HYSTERESIS_GAIN = 0.14 -STABLE_FOLLOW_CRUISE_MAX_REL_SPEED = 2.5 -STABLE_FOLLOW_CRUISE_MIN_HEADWAY = 0.95 -STABLE_FOLLOW_CRUISE_HEADWAY_BELOW_TARGET = 0.35 -STABLE_FOLLOW_CRUISE_HEADWAY_ABOVE_TARGET = 0.90 -STABLE_FOLLOW_CRUISE_MAX_LEAD_BRAKE = 0.35 -STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_REL_SPEED = 2.0 -STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_HEADWAY_MARGIN = 0.35 -STABLE_FOLLOW_CRUISE_PULLAWAY_MIN_HEADWAY_MARGIN = -0.10 -STABLE_FOLLOW_CRUISE_PULLAWAY_HYSTERESIS_MAX = 1.75 -VISION_FOLLOW_CRUISE_HOLD_MIN_MODEL_PROB = 0.95 -VISION_FOLLOW_CRUISE_HOLD_MAX_CRUISE_ADVANTAGE = 2.0 -NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED = 20.0 -NEAR_DUPLICATE_IDENTICAL_RADAR_SOURCE_MIN_SPEED = 10.0 -NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB = 0.9 -NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE = 0.35 -NEAR_DUPLICATE_LEAD_SOURCE_MAX_DREL_DIFF = 1.5 -NEAR_DUPLICATE_LEAD_SOURCE_MAX_VREL_DIFF = 0.35 -NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MIN = 1.25 -NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MAX = 2.25 -NEAR_DUPLICATE_IDENTICAL_RADAR_SOURCE_KEEP_MARGIN = 0.35 -IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MIN_SPEED = 10.0 -IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_HEADWAY_ABOVE_TARGET = 0.40 -IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_LEAD_BRAKE = 0.25 -IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_PULLAWAY_SPEED = 1.5 -IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_CRUISE_ADVANTAGE = 10.0 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MIN_SPEED = 15.0 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_HEADWAY_ABOVE_TARGET = 0.55 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MIN_HEADWAY_BELOW_TARGET = -0.15 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_LEAD_BRAKE = 0.25 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_PULLAWAY_SPEED = 0.75 -IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX = 10.0 - -# Function to get parameter value based on current speed -def get_speed_based_param(speed_mph, param_array): - """Get parameter value based on current speed using smooth interpolation""" - return float(np.interp(speed_mph, SPEED_BREAKPOINTS, param_array)) - -# Current active values (set based on speed) -X_EGO_OBSTACLE_COST = 2.75 -J_EGO_COST = 5.5 -A_CHANGE_COST = 250.0 -LEAD_FILTER_TIME = 2.0 -DIST_ADAPT = 0.06 - -X_EGO_COST = 0. -V_EGO_COST = 0. -A_EGO_COST = 0. -DANGER_ZONE_COST = 100. -CRASH_DISTANCE = .25 +X_EGO_OBSTACLE_COST = 3.0 +J_EGO_COST = 5.0 +A_CHANGE_COST = 200.0 +DANGER_ZONE_COST = 100.0 LEAD_DANGER_FACTOR = 0.75 LIMIT_COST = 1e6 -ACADOS_SOLVER_TYPE = 'SQP_RTI' -# Default lead acceleration decay set to 50% at 1s +CRASH_DISTANCE = 0.25 +ACADOS_SOLVER_TYPE = "SQP_RTI" + +N = 12 +MAX_T = 10.0 +T_IDXS = np.array([index_function(i, max_val=MAX_T, max_idx=N) for i in range(N + 1)]) +T_DIFFS = np.diff(T_IDXS, prepend=[0.0]) +FCW_IDXS = T_IDXS < 5.0 + +COMFORT_BRAKE = 2.5 +STOP_DISTANCE = 6.0 +CRUISE_MIN_ACCEL = -1.2 +CRUISE_MAX_ACCEL = 1.6 LEAD_ACCEL_TAU = 1.5 +LEAD_FILTER_TAU = 0.45 +LEAD_FILTER_RESET_DISTANCE = 8.0 + FCW_MIN_MODEL_PROB = 0.9 FCW_MIN_CLOSING_SPEED = 0.5 FCW_MAX_TTC = 4.0 -# Fewer timestamps don't hurt performance and lead to -# much better convergence of the MPC with low iterations -N = 12 -MAX_T = 10.0 -T_IDXS_LST = [index_function(idx, max_val=MAX_T, max_idx=N) for idx in range(N+1)] - -T_IDXS = np.array(T_IDXS_LST) -FCW_IDXS = T_IDXS < 5.0 -T_DIFFS = np.diff(T_IDXS, prepend=[0.]) -COMFORT_BRAKE = 2.5 -STOP_DISTANCE = 6.0 +def _personality_value(aggressive, standard, relaxed, personality): + return { + log.LongitudinalPersonality.aggressive: aggressive, + log.LongitudinalPersonality.standard: standard, + log.LongitudinalPersonality.relaxed: relaxed, + }[personality] -def should_trigger_planner_fcw(lead, v_ego: float) -> bool: - if lead is None or not lead.status or float(getattr(lead, "modelProb", 0.0)) <= FCW_MIN_MODEL_PROB: - return False +def get_jerk_factor(aggressive_accel=0.5, aggressive_danger=0.5, aggressive_speed=0.5, + standard_accel=1.0, standard_danger=1.0, standard_speed=1.0, + relaxed_accel=1.0, relaxed_danger=1.0, relaxed_speed=1.0, + custom_personalities=False, + personality=log.LongitudinalPersonality.standard): + if not custom_personalities: + factor = 0.5 if personality == log.LongitudinalPersonality.aggressive else 1.0 + return factor, factor, factor - closing_speed = max(0.0, float(v_ego) - float(getattr(lead, "vLead", 0.0))) - if closing_speed < FCW_MIN_CLOSING_SPEED: - return False + return ( + _personality_value(aggressive_accel, standard_accel, relaxed_accel, personality), + _personality_value(aggressive_danger, standard_danger, relaxed_danger, personality), + _personality_value(aggressive_speed, standard_speed, relaxed_speed, personality), + ) - ttc = max(0.0, float(getattr(lead, "dRel", 0.0))) / max(closing_speed, 1e-3) - return ttc < FCW_MAX_TTC -def get_jerk_factor(aggressive_jerk_acceleration=0.5, aggressive_jerk_danger=0.5, aggressive_jerk_speed=0.5, - standard_jerk_acceleration=1.0, standard_jerk_danger=1.0, standard_jerk_speed=1.0, - relaxed_jerk_acceleration=1.0, relaxed_jerk_danger=1.0, relaxed_jerk_speed=1.0, - custom_personalities=False, personality=log.LongitudinalPersonality.standard): +def get_T_FOLLOW(aggressive_follow=1.25, standard_follow=1.45, relaxed_follow=1.75, + custom_personalities=False, + personality=log.LongitudinalPersonality.standard): if custom_personalities: - if personality==log.LongitudinalPersonality.relaxed: - return relaxed_jerk_acceleration, relaxed_jerk_danger, relaxed_jerk_speed - elif personality==log.LongitudinalPersonality.standard: - return standard_jerk_acceleration, standard_jerk_danger, standard_jerk_speed - elif personality==log.LongitudinalPersonality.aggressive: - return aggressive_jerk_acceleration, aggressive_jerk_danger, aggressive_jerk_speed - else: - raise NotImplementedError("Longitudinal personality not supported") - else: - if personality==log.LongitudinalPersonality.relaxed: - return 1.0, 1.0, 1.0 - elif personality==log.LongitudinalPersonality.standard: - return 1.0, 1.0, 1.0 - elif personality==log.LongitudinalPersonality.aggressive: - return 0.5, 0.5, 0.5 - else: - raise NotImplementedError("Longitudinal personality not supported") + return _personality_value(aggressive_follow, standard_follow, relaxed_follow, personality) + return _personality_value(1.25, 1.45, 1.75, personality) -def get_T_FOLLOW(aggressive_follow=1.25, standard_follow=1.45, relaxed_follow=1.75, custom_personalities=False, personality=log.LongitudinalPersonality.standard): - if custom_personalities: - if personality==log.LongitudinalPersonality.relaxed: - return relaxed_follow - elif personality==log.LongitudinalPersonality.standard: - return standard_follow - elif personality==log.LongitudinalPersonality.aggressive: - return aggressive_follow - else: - raise NotImplementedError("Longitudinal personality not supported") - else: - if personality==log.LongitudinalPersonality.relaxed: - return 1.75 - elif personality==log.LongitudinalPersonality.standard: - return 1.45 - elif personality==log.LongitudinalPersonality.aggressive: - return 1.25 - else: - raise NotImplementedError("Longitudinal personality not supported") - def get_stopped_equivalence_factor(v_lead): - return (v_lead**2) / (2 * COMFORT_BRAKE) + return (v_lead ** 2) / (2.0 * COMFORT_BRAKE) + def get_safe_obstacle_distance(v_ego, t_follow): - return (v_ego**2) / (2 * COMFORT_BRAKE) + t_follow * v_ego + STOP_DISTANCE + return (v_ego ** 2) / (2.0 * COMFORT_BRAKE) + t_follow * v_ego + STOP_DISTANCE + def desired_follow_distance(v_ego, v_lead, t_follow=None): - if t_follow is None: - t_follow = get_T_FOLLOW() + t_follow = get_T_FOLLOW() if t_follow is None else t_follow return get_safe_obstacle_distance(v_ego, t_follow) - get_stopped_equivalence_factor(v_lead) -def soften_far_radar_lead_accel(d_rel, v_lead, a_lead, v_ego, t_follow, *, radar=True): - if not radar or a_lead >= 0.0: - return float(a_lead) +def should_trigger_planner_fcw(lead, v_ego): + if lead is None or not bool(getattr(lead, "status", False)): + return False + if float(getattr(lead, "modelProb", 0.0)) <= FCW_MIN_MODEL_PROB: + return False - desired_gap = float(desired_follow_distance(v_ego, v_lead, t_follow)) - closing_speed = max(0.0, float(v_ego) - float(v_lead)) - gap_excess = float(d_rel) - desired_gap - - taper_start = max(FAR_RADAR_LEAD_ACCEL_TAPER_MIN_GAP_EXCESS, - FAR_RADAR_LEAD_ACCEL_TAPER_MIN_GAP_GAIN * float(v_ego)) - if gap_excess <= taper_start or closing_speed >= FAR_RADAR_LEAD_ACCEL_TAPER_MAX_CLOSING: - return float(a_lead) - - taper_scale = max(FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_EXCESS, - FAR_RADAR_LEAD_ACCEL_TAPER_FULL_GAP_GAIN * float(v_ego)) - distance_factor = float(np.clip((gap_excess - taper_start) / taper_scale, 0.0, 1.0)) - closing_factor = float(np.clip((FAR_RADAR_LEAD_ACCEL_TAPER_MAX_CLOSING - closing_speed) / - FAR_RADAR_LEAD_ACCEL_TAPER_MAX_CLOSING, 0.0, 1.0)) - taper = FAR_RADAR_LEAD_ACCEL_TAPER_MAX * distance_factor * closing_factor - return float(a_lead * (1.0 - taper)) + closing_speed = max(0.0, float(v_ego) - float(getattr(lead, "vLead", 0.0))) + ttc = max(0.0, float(getattr(lead, "dRel", 0.0))) / max(closing_speed, 1e-3) + return closing_speed >= FCW_MIN_CLOSING_SPEED and ttc < FCW_MAX_TTC def gen_long_model(): model = AcadosModel() model.name = MODEL_NAME - # set up states & controls - x_ego = SX.sym('x_ego') - v_ego = SX.sym('v_ego') - a_ego = SX.sym('a_ego') + x_ego = SX.sym("x_ego") + v_ego = SX.sym("v_ego") + a_ego = SX.sym("a_ego") model.x = vertcat(x_ego, v_ego, a_ego) - # controls - j_ego = SX.sym('j_ego') + j_ego = SX.sym("j_ego") model.u = vertcat(j_ego) - # xdot - x_ego_dot = SX.sym('x_ego_dot') - v_ego_dot = SX.sym('v_ego_dot') - a_ego_dot = SX.sym('a_ego_dot') + x_ego_dot = SX.sym("x_ego_dot") + v_ego_dot = SX.sym("v_ego_dot") + a_ego_dot = SX.sym("a_ego_dot") model.xdot = vertcat(x_ego_dot, v_ego_dot, a_ego_dot) - # live parameters - a_min = SX.sym('a_min') - a_max = SX.sym('a_max') - x_obstacle = SX.sym('x_obstacle') - prev_a = SX.sym('prev_a') - lead_t_follow = SX.sym('lead_t_follow') - lead_danger_factor = SX.sym('lead_danger_factor') + a_min = SX.sym("a_min") + a_max = SX.sym("a_max") + x_obstacle = SX.sym("x_obstacle") + prev_a = SX.sym("prev_a") + lead_t_follow = SX.sym("lead_t_follow") + lead_danger_factor = SX.sym("lead_danger_factor") model.p = vertcat(a_min, a_max, x_obstacle, prev_a, lead_t_follow, lead_danger_factor) - # dynamics model - f_expl = vertcat(v_ego, a_ego, j_ego) - model.f_impl_expr = model.xdot - f_expl - model.f_expl_expr = f_expl + dynamics = vertcat(v_ego, a_ego, j_ego) + model.f_impl_expr = model.xdot - dynamics + model.f_expl_expr = dynamics return model def gen_long_ocp(): ocp = AcadosOcp() ocp.model = gen_long_model() - - Tf = T_IDXS[-1] - - # set dimensions ocp.dims.N = N - # set cost module - ocp.cost.cost_type = 'NONLINEAR_LS' - ocp.cost.cost_type_e = 'NONLINEAR_LS' - - QR = np.zeros((COST_DIM, COST_DIM)) - Q = np.zeros((COST_E_DIM, COST_E_DIM)) - - ocp.cost.W = QR - ocp.cost.W_e = Q + ocp.cost.cost_type = "NONLINEAR_LS" + ocp.cost.cost_type_e = "NONLINEAR_LS" + ocp.cost.W = np.zeros((COST_DIM, COST_DIM)) + ocp.cost.W_e = np.zeros((COST_E_DIM, COST_E_DIM)) x_ego, v_ego, a_ego = ocp.model.x[0], ocp.model.x[1], ocp.model.x[2] j_ego = ocp.model.u[0] - - a_min, a_max = ocp.model.p[0], ocp.model.p[1] + a_min = ocp.model.p[0] + a_max = ocp.model.p[1] x_obstacle = ocp.model.p[2] prev_a = ocp.model.p[3] - lead_t_follow = ocp.model.p[4] - lead_danger_factor = ocp.model.p[5] + t_follow = ocp.model.p[4] + danger_factor = ocp.model.p[5] - ocp.cost.yref = np.zeros((COST_DIM, )) - ocp.cost.yref_e = np.zeros((COST_E_DIM, )) - - desired_dist_comfort = get_safe_obstacle_distance(v_ego, lead_t_follow) - - # The main cost in normal operation is how close you are to the "desired" distance - # from an obstacle at every timestep. This obstacle can be a lead car - # or other object. In e2e mode we can use x_position targets as a cost - # instead. - accel_change = a_ego - prev_a - costs = [((x_obstacle - x_ego) - (desired_dist_comfort)) / (v_ego + 10.), - x_ego, - v_ego, - a_ego, - accel_change, - j_ego] + desired_distance = get_safe_obstacle_distance(v_ego, t_follow) + costs = [ + ((x_obstacle - x_ego) - desired_distance) / (v_ego + 10.0), + x_ego, + v_ego, + a_ego, + a_ego - prev_a, + j_ego, + ] ocp.model.cost_y_expr = vertcat(*costs) ocp.model.cost_y_expr_e = vertcat(*costs[:-1]) + ocp.cost.yref = np.zeros(COST_DIM) + ocp.cost.yref_e = np.zeros(COST_E_DIM) - # Constraints on speed, acceleration and desired distance to - # the obstacle, which is treated as a slack constraint so it - # behaves like an asymmetrical cost. - constraints = vertcat(v_ego, - (a_ego - a_min), - (a_max - a_ego), - ((x_obstacle - x_ego) - lead_danger_factor * (desired_dist_comfort)) / (v_ego + 10.)) - ocp.model.con_h_expr = constraints + ocp.model.con_h_expr = vertcat( + v_ego, + a_ego - a_min, + a_max - a_ego, + ((x_obstacle - x_ego) - danger_factor * desired_distance) / (v_ego + 10.0), + ) - x0 = np.zeros(X_DIM) - ocp.constraints.x0 = x0 - ocp.parameter_values = np.array([-1.2, 1.2, 0.0, 0.0, get_T_FOLLOW(), LEAD_DANGER_FACTOR]) + ocp.constraints.x0 = np.zeros(X_DIM) + ocp.parameter_values = np.array([ + CRUISE_MIN_ACCEL, + CRUISE_MAX_ACCEL, + 0.0, + 0.0, + get_T_FOLLOW(), + LEAD_DANGER_FACTOR, + ]) - - # We put all constraint cost weights to 0 and only set them at runtime - cost_weights = np.zeros(CONSTR_DIM) - ocp.cost.zl = cost_weights - ocp.cost.Zl = cost_weights - ocp.cost.Zu = cost_weights - ocp.cost.zu = cost_weights - - ocp.constraints.lh = np.zeros(CONSTR_DIM) - ocp.constraints.uh = 1e4*np.ones(CONSTR_DIM) + zero_constraints = np.zeros(CONSTR_DIM) + ocp.cost.zl = zero_constraints + ocp.cost.Zl = zero_constraints + ocp.cost.Zu = zero_constraints + ocp.cost.zu = zero_constraints + ocp.constraints.lh = zero_constraints + ocp.constraints.uh = 1e4 * np.ones(CONSTR_DIM) ocp.constraints.idxsh = np.arange(CONSTR_DIM) - # The HPIPM solver can give decent solutions even when it is stopped early - # Which is critical for our purpose where compute time is strictly bounded - # We use HPIPM in the SPEED_ABS mode, which ensures fastest runtime. This - # does not cause issues since the problem is well bounded. - ocp.solver_options.qp_solver = 'PARTIAL_CONDENSING_HPIPM' - ocp.solver_options.hessian_approx = 'GAUSS_NEWTON' - ocp.solver_options.integrator_type = 'ERK' + ocp.solver_options.qp_solver = "PARTIAL_CONDENSING_HPIPM" + ocp.solver_options.hessian_approx = "GAUSS_NEWTON" + ocp.solver_options.integrator_type = "ERK" ocp.solver_options.nlp_solver_type = ACADOS_SOLVER_TYPE ocp.solver_options.qp_solver_cond_N = 1 - - # More iterations take too much time and less lead to inaccurate convergence in - # some situations. Ideally we would run just 1 iteration to ensure fixed runtime. ocp.solver_options.qp_solver_iter_max = 10 ocp.solver_options.qp_tol = 1e-3 - - # set prediction horizon - ocp.solver_options.tf = Tf + ocp.solver_options.tf = T_IDXS[-1] ocp.solver_options.shooting_nodes = T_IDXS - ocp.code_export_directory = EXPORT_DIR return ocp class LongitudinalMpc: - def __init__(self, mode='acc', dt=DT_MDL): + def __init__(self, mode="acc", dt=DT_MDL): self.mode = mode self.dt = dt self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N) - self.source = SOURCES[2] - # Initialize smoothing filters with default time constants - self.current_filter_time = LEAD_FILTER_TIME_LOW - self.lead_a_filter = FirstOrderFilter(0.0, self.current_filter_time, self.dt) - self.lead_v_filter = FirstOrderFilter(0.0, self.current_filter_time, self.dt) - self.duplicate_lead_a_filters = [FirstOrderFilter(0.0, 0.0, self.dt, initialized=False) for _ in range(2)] - self.duplicate_lead_v_filters = [FirstOrderFilter(0.0, 0.0, self.dt, initialized=False) for _ in range(2)] - # Slew-limited filter factor to avoid abrupt 0.50↔1.00 jumps - self.filter_time_factor = 1.0 - self.prev_filter_time_factor = 1.0 - self.slew_per_sec = 1.0 - # Instance variables to avoid global modifications - self.current_x_ego_cost = X_EGO_OBSTACLE_COSTS[0] - self.current_j_ego_cost = J_EGO_COSTS[0] - self.current_a_change_cost = A_CHANGE_COSTS[0] - self.current_dist_adapt = DIST_ADAPTS[0] - # Initialize acceleration limits to prevent AttributeError - self.cruise_min_a = ACCEL_MIN - self.max_a = min(ACCEL_MAX, 1.2) + self.cruise_min_a = CRUISE_MIN_ACCEL + self.max_a = CRUISE_MAX_ACCEL + self.lead_filter_tau = LEAD_FILTER_TAU + self.source = "cruise" + self._lead_filter_state = [None, None] self.reset() def reset(self): - # self.solver = AcadosOcpSolverCython(MODEL_NAME, ACADOS_SOLVER_TYPE, N) self.solver.reset() - # self.solver.options_set('print_level', 2) - self.v_solution = np.zeros(N+1) - self.a_solution = np.zeros(N+1) - self.prev_a = np.array(self.a_solution) + self.x_sol = np.zeros((N + 1, X_DIM)) + self.u_sol = np.zeros((N, U_DIM)) + self.v_solution = np.zeros(N + 1) + self.a_solution = np.zeros(N + 1) self.j_solution = np.zeros(N) - self.yref = np.zeros((N+1, COST_DIM)) + self.prev_a = np.zeros(N + 1) + self.yref = np.zeros((N + 1, COST_DIM)) + self.params = np.zeros((N + 1, PARAM_DIM)) + self.x0 = np.zeros(X_DIM) + self.crash_cnt = 0 + self.solution_status = 0 + self.solve_time = 0.0 + self.last_cloudlog_t = 0.0 + self._lead_filter_state = [None, None] + for i in range(N): self.solver.cost_set(i, "yref", self.yref[i]) self.solver.cost_set(N, "yref", self.yref[N][:COST_E_DIM]) - self.x_sol = np.zeros((N+1, X_DIM)) - self.u_sol = np.zeros((N,1)) - self.params = np.zeros((N+1, PARAM_DIM)) - for i in range(N+1): - self.solver.set(i, 'x', np.zeros(X_DIM)) - self.last_cloudlog_t = 0 - self.status = False - self.crash_cnt = 0.0 - self.solution_status = 0 - # timers - self.solve_time = 0.0 - self.time_qp_solution = 0.0 - self.time_linearization = 0.0 - self.time_integrator = 0.0 - self.x0 = np.zeros(X_DIM) - for lead_filter in (*self.duplicate_lead_a_filters, *self.duplicate_lead_v_filters): - lead_filter.x = 0.0 - lead_filter.initialized = False + for i in range(N + 1): + self.solver.set(i, "x", np.zeros(X_DIM)) self.set_weights() def set_cost_weights(self, cost_weights, constraint_cost_weights): - W = np.asfortranarray(np.diag(cost_weights)) + weights = np.asfortranarray(np.diag(cost_weights)) for i in range(N): - # TODO don't hardcode A_CHANGE_COST idx - # reduce the cost on (a-a_prev) later in the horizon. - W[4,4] = cost_weights[4] * np.interp(T_IDXS[i], [0.0, 1.0, 2.0], [1.0, 1.0, 0.0]) - self.solver.cost_set(i, 'W', W) - # Setting the slice without the copy make the array not contiguous, - # causing issues with the C interface. - self.solver.cost_set(N, 'W', np.copy(W[:COST_E_DIM, :COST_E_DIM])) + weights[4, 4] = cost_weights[4] * np.interp(T_IDXS[i], [0.0, 1.0, 2.0], [1.0, 1.0, 0.0]) + self.solver.cost_set(i, "W", weights) + self.solver.cost_set(N, "W", np.copy(weights[:COST_E_DIM, :COST_E_DIM])) - # Set L2 slack cost on lower bound constraints - Zl = np.array(constraint_cost_weights) + constraints = np.asarray(constraint_cost_weights) for i in range(N): - self.solver.cost_set(i, 'Zl', Zl) + self.solver.cost_set(i, "Zl", constraints) - def set_weights(self, acceleration_jerk=1.0, danger_jerk=1.0, speed_jerk=1.0, prev_accel_constraint=True, - personality=log.LongitudinalPersonality.standard, v_ego=0.0, lead_dist=50.0, - uncertainty=0.0, accel_reengage=False, panic_bypass=False, - filter_time_factor_floor=0.0): - # Update parameters based on current speed with interpolation for smooth scaling - speed_mph = v_ego * CV.MS_TO_MPH # Convert m/s to mph + def set_weights(self, acceleration_jerk=1.0, danger_jerk=1.0, speed_jerk=1.0, + prev_accel_constraint=True, **_): + accel_change_cost = acceleration_jerk * A_CHANGE_COST if prev_accel_constraint else 0.0 + costs = [X_EGO_OBSTACLE_COST, 0.0, 0.0, 0.0, accel_change_cost, speed_jerk * J_EGO_COST] + constraints = [LIMIT_COST, LIMIT_COST, LIMIT_COST, danger_jerk * DANGER_ZONE_COST] + self.set_cost_weights(costs, constraints) - # Use speed-based parameters for smooth scaling across all breakpoints - self.current_x_ego_cost = get_speed_based_param(speed_mph, X_EGO_OBSTACLE_COSTS) - self.current_j_ego_cost = get_speed_based_param(speed_mph, J_EGO_COSTS) - self.current_a_change_cost = get_speed_based_param(speed_mph, A_CHANGE_COSTS) + def set_cur_state(self, v_ego, a_ego): + previous_v = self.x0[1] + self.x0[1] = v_ego + self.x0[2] = a_ego + if abs(previous_v - v_ego) > 2.0: + for i in range(N + 1): + self.solver.set(i, "x", self.x0) - # For dist_adapt, start from 0.0 under low speeds while enabling full smooth transitions - dist_adapt_array = [0.0, DIST_ADAPTS[1], DIST_ADAPTS[2], DIST_ADAPTS[3]] - self.current_dist_adapt = get_speed_based_param(speed_mph, dist_adapt_array) - - # Update filter time constants with interp and recreate filters if needed - if speed_mph < 47: - self.current_filter_time = 0.0 - else: - self.current_filter_time = np.interp(speed_mph, [47, 65], [0.0, LEAD_FILTER_TIME_HIGH]) - if abs(self.current_filter_time - getattr(self, 'prev_filter_time', 0)) > 0.1: # Only update if significant change - # Recreate filters with new time constant while preserving current values - current_a = self.lead_a_filter.x if hasattr(self.lead_a_filter, 'x') else 0.0 - current_v = self.lead_v_filter.x if hasattr(self.lead_v_filter, 'x') else 0.0 - self.lead_a_filter = FirstOrderFilter(current_a, self.current_filter_time, self.dt) - self.lead_v_filter = FirstOrderFilter(current_v, self.current_filter_time, self.dt) - self.prev_filter_time = self.current_filter_time - # Adaptive jerk factors for distance with interp scaling - dist_factor = 1.0 + self.current_dist_adapt * (20.0 / max(lead_dist, 5.0)) - acceleration_jerk *= dist_factor - danger_jerk *= dist_factor - speed_jerk *= dist_factor - - # Scene complexity adjustment based on model uncertainty - # Target factor from uncertainty - if uncertainty <= 0.45: - tgt_factor = 1.0 - elif uncertainty >= 0.70: - tgt_factor = 0.0 - else: - tgt_factor = float(np.interp(uncertainty, [0.45, 0.70], [1.0, 0.30])) - - if accel_reengage: - tgt_factor = min(tgt_factor, 0.5) - - # Hard bypass of smoothing when approaching fast or magnitude trips - if panic_bypass: - tgt_factor = 0.0 - else: - tgt_factor = max(tgt_factor, float(filter_time_factor_floor)) - - # Slew-limit changes to avoid step-wise filter jumps - if panic_bypass: - # A real closing hazard must never wait for the comfort filter to unwind. - self.filter_time_factor = 0.0 - else: - max_step = self.slew_per_sec * self.dt - delta = np.clip(tgt_factor - self.filter_time_factor, -max_step, max_step) - self.filter_time_factor += float(delta) - - # When uncertainty is moderately elevated, allow accel but cap jerk by increasing jerk cost - if 0.45 <= uncertainty < 0.60: - scale = float(np.interp(uncertainty, [0.45, 0.60], [1.2, 1.5])) - speed_jerk *= scale - - if self.mode == 'acc': - a_change_cost = acceleration_jerk if prev_accel_constraint else 0 - cost_weights = [self.current_x_ego_cost, X_EGO_COST, V_EGO_COST, A_EGO_COST, a_change_cost, speed_jerk] - constraint_cost_weights = [LIMIT_COST, LIMIT_COST, LIMIT_COST, danger_jerk] - elif self.mode == 'blended': - a_change_cost = 40.0 if prev_accel_constraint else 0 - cost_weights = [0., 0.1, 0.2, 5.0, a_change_cost, 1.0] - constraint_cost_weights = [LIMIT_COST, LIMIT_COST, LIMIT_COST, danger_jerk] - else: - raise NotImplementedError(f'Planner mode {self.mode} not recognized in planner cost set') - self.set_cost_weights(cost_weights, constraint_cost_weights) - - # Adjust filter time constants for complex scenes - filter_time_factor = float(self.filter_time_factor) - if abs(filter_time_factor - getattr(self, 'prev_filter_time_factor', 1.0)) > 0.05: - new_filter_time = self.current_filter_time * filter_time_factor - current_a = self.lead_a_filter.x if hasattr(self.lead_a_filter, 'x') else 0.0 - current_v = self.lead_v_filter.x if hasattr(self.lead_v_filter, 'x') else 0.0 - self.lead_a_filter = FirstOrderFilter(current_a, new_filter_time, self.dt) - self.lead_v_filter = FirstOrderFilter(current_v, new_filter_time, self.dt) - self.prev_filter_time_factor = filter_time_factor - - def set_cur_state(self, v, a): - v_prev = self.x0[1] - self.x0[1] = v - self.x0[2] = a - if abs(v_prev - v) > 2.: # probably only helps if v < v_prev - for i in range(N+1): - self.solver.set(i, 'x', self.x0) + def set_accel_limits(self, min_a, max_a): + self.cruise_min_a = float(min_a) + self.max_a = float(max_a) @staticmethod - def extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau, v_ego=0.0): - speed_mph = v_ego * CV.MS_TO_MPH - bp = [0, 20, 35] - exp_weight = np.interp(speed_mph, bp, [1.0, 1.0, 0.0]) # Full exp at <20, blend to constant at 35 + def extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau): + a_traj = a_lead * np.exp(-a_lead_tau * (T_IDXS ** 2) / 2.0) + v_traj = np.clip(v_lead + np.cumsum(T_DIFFS * a_traj), 0.0, 1e8) + x_traj = x_lead + np.cumsum(T_DIFFS * v_traj) + return np.column_stack((x_traj, v_traj)) - if exp_weight > 0: - # Exponential decay component - a_lead_traj_exp = a_lead * np.exp(-a_lead_tau * (T_IDXS**2)/2.) - v_lead_traj_exp = np.clip(v_lead + np.cumsum(T_DIFFS * a_lead_traj_exp), 0.0, 1e8) - x_lead_traj_exp = x_lead + np.cumsum(T_DIFFS * v_lead_traj_exp) + def _filter_lead_motion(self, index, lead): + raw_distance = float(lead.dRel) + raw_velocity = float(lead.vLead) + raw_accel = float(lead.aLeadK) + state = self._lead_filter_state[index] + + reset = state is None or abs(raw_distance - state[2]) > LEAD_FILTER_RESET_DISTANCE + if reset: + filtered_velocity = raw_velocity + filtered_accel = raw_accel else: - x_lead_traj_exp = np.zeros_like(T_IDXS) - v_lead_traj_exp = np.zeros_like(T_IDXS) + alpha = self.dt / (self.lead_filter_tau + self.dt) + filtered_velocity = state[0] + alpha * (raw_velocity - state[0]) + filtered_accel = state[1] + alpha * (raw_accel - state[1]) - # Constant acceleration component - v_lead_traj_const = np.clip(v_lead + a_lead * T_IDXS, 0.0, 1e8) - x_lead_traj_const = x_lead + v_lead * T_IDXS + 0.5 * a_lead * T_IDXS**2 + self._lead_filter_state[index] = (filtered_velocity, filtered_accel, raw_distance) + return filtered_velocity, filtered_accel - # Blend based on weight - v_lead_traj = exp_weight * v_lead_traj_exp + (1 - exp_weight) * v_lead_traj_const - x_lead_traj = exp_weight * x_lead_traj_exp + (1 - exp_weight) * x_lead_traj_const - - lead_xv = np.column_stack((x_lead_traj, v_lead_traj)) - return lead_xv - - def process_lead(self, lead, tracking_lead=True, t_follow=None, *, lead_index=0, - smooth_duplicate_vision=False): + def process_lead(self, lead, index): v_ego = self.x0[1] - lead_active = lead is not None and lead.status and tracking_lead - if lead_active: - x_lead = lead.dRel - v_lead = lead.vLead - a_lead = lead.aLeadK - a_lead_tau = lead.aLeadTau - a_lead = soften_far_radar_lead_accel(x_lead, v_lead, a_lead, v_ego, - get_T_FOLLOW() if t_follow is None else t_follow, - radar=bool(getattr(lead, "radar", False))) + present = lead is not None and bool(getattr(lead, "status", False)) + if present: + x_lead = float(lead.dRel) + v_lead, a_lead = self._filter_lead_motion(index, lead) + a_lead_tau = max(float(getattr(lead, "aLeadTau", LEAD_ACCEL_TAU)), 0.1) else: - # Fake a fast lead car, so mpc can keep running in the same mode + self._lead_filter_state[index] = None x_lead = 50.0 v_lead = v_ego + 10.0 a_lead = 0.0 a_lead_tau = LEAD_ACCEL_TAU - # MPC will not converge if immediate crash is expected. - # Bound this by physical hard-brake capability, not cruise comfort decel. - min_x_lead = ((v_ego + v_lead)/2) * (v_ego - v_lead) / (-ACCEL_MIN * 2) - x_lead = np.clip(x_lead, min_x_lead, 1e8) - v_lead = np.clip(v_lead, 0.0, 1e8) - a_lead = np.clip(a_lead, -10., 5.) - if lead_active and smooth_duplicate_vision and not bool(getattr(lead, "radar", False)): - # Keep the baseline filter synchronized so leaving this narrow comfort - # path cannot introduce a state discontinuity. - self.lead_a_filter.update(a_lead) - self.lead_v_filter.update(v_lead) + min_x_lead = ((v_ego + v_lead) / 2.0) * (v_ego - v_lead) / (-ACCEL_MIN * 2.0) + x_lead = float(np.clip(x_lead, min_x_lead, 1e8)) + v_lead = float(np.clip(v_lead, 0.0, 1e8)) + a_lead = float(np.clip(a_lead, -10.0, 5.0)) + return self.extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau) - filter_time = self.current_filter_time - filter_time = max(filter_time, DUPLICATE_VISION_LEAD_FILTER_TIME) - filter_time *= self.filter_time_factor - - a_filter = self.duplicate_lead_a_filters[lead_index] - v_filter = self.duplicate_lead_v_filters[lead_index] - a_filter.update_alpha(filter_time) - v_filter.update_alpha(filter_time) - a_lead = a_filter.update(a_lead) - v_lead = v_filter.update(v_lead) - else: - # Preserve the historical planner path outside the qualified comfort scene. - self.lead_a_filter.update(a_lead) - self.lead_v_filter.update(v_lead) - a_lead = self.lead_a_filter.x - v_lead = self.lead_v_filter.x - self.duplicate_lead_a_filters[lead_index].initialized = False - self.duplicate_lead_v_filters[lead_index].initialized = False - lead_xv = self.extrapolate_lead(x_lead, v_lead, a_lead, a_lead_tau, v_ego) - return lead_xv - - @staticmethod - def get_stable_follow_cruise_hysteresis(lead, v_ego, t_follow): - if lead is None or not lead.status: - return 0.0 - - lead_radar = bool(getattr(lead, "radar", False)) - relative_speed = float(v_ego) - float(lead.vLead) - actual_headway = None - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > STABLE_FOLLOW_CRUISE_MAX_LEAD_BRAKE: - return 0.0 - - if lead_radar: - if float(t_follow) <= 0.0 or float(v_ego) < STABLE_FOLLOW_CRUISE_MIN_SPEED: - return 0.0 - if abs(relative_speed) > STABLE_FOLLOW_CRUISE_MAX_REL_SPEED: - return 0.0 - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - min_headway = max(STABLE_FOLLOW_CRUISE_MIN_HEADWAY, - float(t_follow) - STABLE_FOLLOW_CRUISE_HEADWAY_BELOW_TARGET) - max_headway = float(t_follow) + STABLE_FOLLOW_CRUISE_HEADWAY_ABOVE_TARGET - if not (min_headway <= actual_headway <= max_headway): - return 0.0 - elif not is_radarless_matched_follow_window( - v_ego, - lead.dRel, - lead.vLead, - t_follow, - radar=lead_radar, - lead_brake=lead_brake, - lead_prob=float(getattr(lead, "modelProb", 0.0)), - min_speed=STABLE_FOLLOW_CRUISE_MIN_SPEED, - ): - return 0.0 - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - - hysteresis = max(STABLE_FOLLOW_CRUISE_HYSTERESIS_MIN, - STABLE_FOLLOW_CRUISE_HYSTERESIS_GAIN * float(v_ego)) - - if relative_speed < 0.0: - headway_margin = actual_headway - float(t_follow) - if headway_margin <= STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_HEADWAY_MARGIN: - rel_speed_factor = float(np.clip((-relative_speed) / STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_REL_SPEED, 0.0, 1.0)) - headway_factor = float(np.clip( - (STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_HEADWAY_MARGIN - headway_margin) / - max(STABLE_FOLLOW_CRUISE_PULLAWAY_MAX_HEADWAY_MARGIN - STABLE_FOLLOW_CRUISE_PULLAWAY_MIN_HEADWAY_MARGIN, 1e-3), - 0.0, 1.0, - )) - hysteresis += STABLE_FOLLOW_CRUISE_PULLAWAY_HYSTERESIS_MAX * rel_speed_factor * headway_factor - - return hysteresis - - @staticmethod - def leads_share_identical_radar_track(lead_one, lead_two): - if lead_one is None or lead_two is None or not lead_one.status or not lead_two.status: - return False - if not (bool(getattr(lead_one, "radar", False)) and bool(getattr(lead_two, "radar", False))): - return False - track_one = int(getattr(lead_one, "radarTrackId", -1)) - track_two = int(getattr(lead_two, "radarTrackId", -1)) - return track_one >= 0 and track_one == track_two - - @staticmethod - def leads_are_near_duplicates(lead_one, lead_two, v_ego, *, vision_min_speed=None): - if lead_one is None or lead_two is None or not lead_one.status or not lead_two.status: - return False - if LongitudinalMpc.leads_share_identical_radar_track(lead_one, lead_two): - if float(v_ego) < NEAR_DUPLICATE_IDENTICAL_RADAR_SOURCE_MIN_SPEED: - return False - return ( - abs(float(lead_one.dRel) - float(lead_two.dRel)) <= NEAR_DUPLICATE_LEAD_SOURCE_MAX_DREL_DIFF and - abs(float(lead_one.vRel) - float(lead_two.vRel)) <= max(1.0, NEAR_DUPLICATE_LEAD_SOURCE_MAX_VREL_DIFF) - ) - min_vision_speed = NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED if vision_min_speed is None else float(vision_min_speed) - if float(v_ego) < min_vision_speed: - return False - lead_one_radar = bool(getattr(lead_one, "radar", False)) - lead_two_radar = bool(getattr(lead_two, "radar", False)) - if lead_one_radar or lead_two_radar: - return False - if float(getattr(lead_one, "modelProb", 0.0)) < NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB: - return False - if float(getattr(lead_two, "modelProb", 0.0)) < NEAR_DUPLICATE_LEAD_SOURCE_MIN_MODEL_PROB: - return False - if max(0.0, -float(getattr(lead_one, "aLeadK", 0.0))) > NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE: - return False - if max(0.0, -float(getattr(lead_two, "aLeadK", 0.0))) > NEAR_DUPLICATE_LEAD_SOURCE_MAX_LEAD_BRAKE: - return False - - return ( - abs(float(lead_one.dRel) - float(lead_two.dRel)) <= NEAR_DUPLICATE_LEAD_SOURCE_MAX_DREL_DIFF and - abs(float(lead_one.vRel) - float(lead_two.vRel)) <= NEAR_DUPLICATE_LEAD_SOURCE_MAX_VREL_DIFF - ) - - def get_near_duplicate_lead_source_hysteresis(self, prev_source, lead_one, lead_two, v_ego): - if prev_source not in ("lead0", "lead1"): - return 0.0, 0.0 - if not self.leads_are_near_duplicates(lead_one, lead_two, v_ego): - return 0.0, 0.0 - - hysteresis = float(np.interp( - float(v_ego), - [NEAR_DUPLICATE_LEAD_SOURCE_MIN_SPEED, 35.0], - [NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MIN, NEAR_DUPLICATE_LEAD_SOURCE_HYSTERESIS_MAX], - )) - if prev_source == "lead0": - return 0.0, hysteresis - return hysteresis, 0.0 - - def get_identical_radar_duplicate_source_hold(self, prev_source, lead_one, lead_two, lead_0_obstacle, lead_1_obstacle): - if prev_source not in ("lead0", "lead1"): - return None - if not self.leads_share_identical_radar_track(lead_one, lead_two): - return None - if abs(float(lead_0_obstacle) - float(lead_1_obstacle)) > NEAR_DUPLICATE_IDENTICAL_RADAR_SOURCE_KEEP_MARGIN: - return None - return prev_source - - def get_identical_radar_duplicate_cruise_hold(self, prev_source, lead_one, lead_two, - lead_0_obstacle, lead_1_obstacle, cruise_obstacle, - v_ego, t_follow): - if prev_source not in ("lead0", "lead1"): - return None - if float(v_ego) < IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MIN_SPEED: - return None - if not self.leads_share_identical_radar_track(lead_one, lead_two): - return None - if abs(float(lead_0_obstacle) - float(lead_1_obstacle)) > NEAR_DUPLICATE_IDENTICAL_RADAR_SOURCE_KEEP_MARGIN: - return None - - prev_lead = lead_one if prev_source == "lead0" else lead_two - if prev_lead is None or not prev_lead.status: - return None - - actual_headway = float(prev_lead.dRel) / max(float(v_ego), 1e-3) - if actual_headway > float(t_follow) + IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_HEADWAY_ABOVE_TARGET: - return None - - lead_brake = max(0.0, -float(getattr(prev_lead, "aLeadK", 0.0))) - if lead_brake > IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_LEAD_BRAKE: - return None - - lead_delta = float(prev_lead.vLead) - float(v_ego) - if lead_delta > IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_PULLAWAY_SPEED: - return None - - prev_lead_obstacle = float(lead_0_obstacle if prev_source == "lead0" else lead_1_obstacle) - cruise_advantage = prev_lead_obstacle - float(cruise_obstacle) - if cruise_advantage > IDENTICAL_RADAR_DUPLICATE_CRUISE_HOLD_MAX_CRUISE_ADVANTAGE: - return None - - return prev_source - - def get_vision_follow_cruise_hold(self, prev_source, lead_one, lead_two, - lead_0_obstacle, lead_1_obstacle, cruise_obstacle, - v_ego, t_follow, tracking_lead): - if not tracking_lead or prev_source not in ("lead0", "lead1"): - return None - - prev_lead = lead_one if prev_source == "lead0" else lead_two - if prev_lead is None or not prev_lead.status or bool(getattr(prev_lead, "radar", False)): - return None - if float(getattr(prev_lead, "modelProb", 0.0)) < VISION_FOLLOW_CRUISE_HOLD_MIN_MODEL_PROB: - return None - if self.get_stable_follow_cruise_hysteresis(prev_lead, v_ego, t_follow) <= 0.0: - return None - - prev_lead_obstacle = float(lead_0_obstacle if prev_source == "lead0" else lead_1_obstacle) - cruise_advantage = prev_lead_obstacle - float(cruise_obstacle) - if cruise_advantage > VISION_FOLLOW_CRUISE_HOLD_MAX_CRUISE_ADVANTAGE: - return None - - return prev_source - - def get_identical_radar_duplicate_cruise_bias(self, lead_one, lead_two, v_ego, t_follow): - if float(v_ego) < IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MIN_SPEED: - return 0.0 - if not self.leads_share_identical_radar_track(lead_one, lead_two): - return 0.0 - - lead = lead_one if lead_one.status else lead_two - if lead is None or not lead.status: - return 0.0 - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(t_follow) - if headway_margin < IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MIN_HEADWAY_BELOW_TARGET: - return 0.0 - if headway_margin > IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_HEADWAY_ABOVE_TARGET: - return 0.0 - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_LEAD_BRAKE: - return 0.0 - - lead_delta = float(lead.vLead) - float(v_ego) - if lead_delta > IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_PULLAWAY_SPEED: - return 0.0 - - return float(np.interp( - headway_margin, - [IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MIN_HEADWAY_BELOW_TARGET, 0.0, IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX_HEADWAY_ABOVE_TARGET], - [IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX, IDENTICAL_RADAR_DUPLICATE_CRUISE_BIAS_MAX * 0.85, 0.0], - )) - - def set_accel_limits(self, min_a, max_a): - # TODO this sets a max accel limit, but the minimum limit is only for cruise decel - # needs refactor - self.cruise_min_a = min_a - self.max_a = max_a - - def update(self, radarstate, v_cruise, x, v, a, j, danger_factor, t_follow, - personality=log.LongitudinalPersonality.standard, tracking_lead=True, - optional_far_lead_comfort=True, smooth_duplicate_vision=False): + def update(self, radarstate, v_cruise, x=None, v=None, a=None, j=None, + danger_factor=LEAD_DANGER_FACTOR, t_follow=None, + personality=log.LongitudinalPersonality.standard, **_): + t_follow = get_T_FOLLOW(personality=personality) if t_follow is None else float(t_follow) v_ego = self.x0[1] - lead_one = radarstate.leadOne - lead_two = radarstate.leadTwo - self.status = tracking_lead and (lead_one.status or lead_two.status) - lead_xv_0 = self.process_lead(lead_one, tracking_lead, t_follow=t_follow, lead_index=0, - smooth_duplicate_vision=smooth_duplicate_vision) - lead_xv_1 = self.process_lead(lead_two, tracking_lead, t_follow=t_follow, lead_index=1, - smooth_duplicate_vision=smooth_duplicate_vision) - # To estimate a safe distance from a moving lead, we calculate how much stopping - # distance that lead needs as a minimum. We can add that to the current distance - # and then treat that as a stopped car/obstacle at this new distance. - lead_0_obstacle = lead_xv_0[:,0] + get_stopped_equivalence_factor(lead_xv_0[:,1]) - lead_1_obstacle = lead_xv_1[:,0] + get_stopped_equivalence_factor(lead_xv_1[:,1]) + lead_trajectories = [ + self.process_lead(radarstate.leadOne, 0), + self.process_lead(radarstate.leadTwo, 1), + ] + lead_obstacles = [ + trajectory[:, 0] + get_stopped_equivalence_factor(trajectory[:, 1]) + for trajectory in lead_trajectories + ] - self.params[:,0] = ACCEL_MIN - self.params[:,1] = max(0.0, self.max_a) + v_lower = v_ego + T_IDXS * self.cruise_min_a * 1.05 + v_upper = v_ego + T_IDXS * self.max_a * 1.05 + v_cruise_clipped = np.clip(np.full(N + 1, v_cruise), v_lower, v_upper) + cruise_obstacle = np.cumsum(T_DIFFS * v_cruise_clipped) + get_safe_obstacle_distance(v_cruise_clipped, t_follow) - # Update in ACC mode or ACC/e2e blend - if self.mode == 'acc': - self.params[:,5] = LEAD_DANGER_FACTOR + obstacles = np.column_stack((*lead_obstacles, cruise_obstacle)) + self.source = SOURCES[int(np.argmin(obstacles[0]))] - # Fake an obstacle for cruise, this ensures smooth acceleration to set speed - # when the leads are no factor. - v_lower = v_ego + (T_IDXS * self.cruise_min_a * 1.05) - # TODO does this make sense when max_a is negative? - v_upper = v_ego + (T_IDXS * self.max_a * 1.05) - v_cruise_clipped = np.clip(v_cruise * np.ones(N+1), - v_lower, - v_upper) - cruise_obstacle = np.cumsum(T_DIFFS * v_cruise_clipped) + get_safe_obstacle_distance(v_cruise_clipped, t_follow) - prev_source = self.source - if optional_far_lead_comfort: - if prev_source == 'lead0': - cruise_obstacle += self.get_stable_follow_cruise_hysteresis(lead_one, v_ego, t_follow) - elif prev_source == 'lead1': - cruise_obstacle += self.get_stable_follow_cruise_hysteresis(lead_two, v_ego, t_follow) - if optional_far_lead_comfort and tracking_lead and lead_one.status: - desired_gap = desired_follow_distance(v_ego, lead_one.vLead, t_follow) - closing_speed = max(0.0, v_ego - lead_one.vLead) - cruise_obstacle += get_tracked_lead_catchup_bias( - v_ego, - lead_one.dRel, - desired_gap, - closing_speed, - v_cruise=v_cruise, - y_rel=float(getattr(lead_one, "yRel", 0.0)), - ) - if optional_far_lead_comfort: - cruise_obstacle += self.get_identical_radar_duplicate_cruise_bias(lead_one, lead_two, v_ego, t_follow) - if optional_far_lead_comfort: - lead_0_bias, lead_1_bias = self.get_near_duplicate_lead_source_hysteresis(prev_source, lead_one, lead_two, v_ego) - lead_0_obstacle = lead_0_obstacle + lead_0_bias - lead_1_obstacle = lead_1_obstacle + lead_1_bias - x_obstacles = np.column_stack([lead_0_obstacle, lead_1_obstacle, cruise_obstacle]) - candidate_source = SOURCES[np.argmin(x_obstacles[0])] - sticky_source = None - if optional_far_lead_comfort: - if candidate_source in ("lead0", "lead1"): - sticky_source = self.get_identical_radar_duplicate_source_hold( - prev_source, - lead_one, - lead_two, - lead_0_obstacle[0], - lead_1_obstacle[0], - ) - elif candidate_source == "cruise": - sticky_source = self.get_identical_radar_duplicate_cruise_hold( - prev_source, - lead_one, - lead_two, - lead_0_obstacle[0], - lead_1_obstacle[0], - cruise_obstacle[0], - v_ego, - t_follow, - ) - if sticky_source is None: - sticky_source = self.get_vision_follow_cruise_hold( - prev_source, - lead_one, - lead_two, - lead_0_obstacle[0], - lead_1_obstacle[0], - cruise_obstacle[0], - v_ego, - t_follow, - tracking_lead, - ) - self.source = sticky_source or candidate_source - - # These are not used in ACC mode - x[:], v[:], a[:], j[:] = 0.0, 0.0, 0.0, 0.0 - - elif self.mode == 'blended': - self.params[:,5] = 1.0 - - x_obstacles = np.column_stack([lead_0_obstacle, - lead_1_obstacle]) - cruise_target = T_IDXS * np.clip(v_cruise, v_ego - 2.0, 1e3) + x[0] - xforward = ((v[1:] + v[:-1]) / 2) * (T_IDXS[1:] - T_IDXS[:-1]) - x = np.cumsum(np.insert(xforward, 0, x[0])) - - x_and_cruise = np.column_stack([x, cruise_target]) - x = np.min(x_and_cruise, axis=1) - - self.source = 'e2e' if x_and_cruise[1,0] < x_and_cruise[1,1] else 'cruise' - - else: - raise NotImplementedError(f'Planner mode {self.mode} not recognized in planner update') - - self.yref[:,1] = x - self.yref[:,2] = v - self.yref[:,3] = a - self.yref[:,5] = j + self.yref.fill(0.0) for i in range(N): self.solver.set(i, "yref", self.yref[i]) self.solver.set(N, "yref", self.yref[N][:COST_E_DIM]) - self.params[:,2] = np.min(x_obstacles, axis=1) - self.params[:,3] = np.copy(self.prev_a) - self.params[:,4] = t_follow + self.params[:, 0] = self.cruise_min_a + self.params[:, 1] = max(0.0, self.max_a) + self.params[:, 2] = np.min(obstacles, axis=1) + self.params[:, 3] = self.prev_a + self.params[:, 4] = t_follow + self.params[:, 5] = float(danger_factor) self.run() - if (np.any(lead_xv_0[FCW_IDXS,0] - self.x_sol[FCW_IDXS,0] < CRASH_DISTANCE) and - should_trigger_planner_fcw(lead_one, v_ego)): - self.crash_cnt += 1 - else: - self.crash_cnt = 0 - # Check if it got within lead comfort range - # TODO This should be done cleaner - if self.mode == 'blended': - if any((lead_0_obstacle - get_safe_obstacle_distance(self.x_sol[:,1], t_follow))- self.x_sol[:,0] < 0.0): - self.source = 'lead0' - if any((lead_1_obstacle - get_safe_obstacle_distance(self.x_sol[:,1], t_follow))- self.x_sol[:,0] < 0.0) and \ - (lead_1_obstacle[0] - lead_0_obstacle[0]): - self.source = 'lead1' + crash_risk = False + for lead, trajectory in zip((radarstate.leadOne, radarstate.leadTwo), lead_trajectories, strict=True): + crash_risk |= bool( + should_trigger_planner_fcw(lead, v_ego) and + np.any(trajectory[FCW_IDXS, 0] - self.x_sol[FCW_IDXS, 0] < CRASH_DISTANCE) + ) + self.crash_cnt = self.crash_cnt + 1 if crash_risk else 0 def run(self): - # t0 = time.monotonic() - # reset = 0 - for i in range(N+1): - self.solver.set(i, 'p', self.params[i]) + for i in range(N + 1): + self.solver.set(i, "p", self.params[i]) self.solver.constraints_set(0, "lbx", self.x0) self.solver.constraints_set(0, "ubx", self.x0) self.solution_status = self.solver.solve() - self.solve_time = float(self.solver.get_stats('time_tot')[0]) - self.time_qp_solution = float(self.solver.get_stats('time_qp')[0]) - self.time_linearization = float(self.solver.get_stats('time_lin')[0]) - self.time_integrator = float(self.solver.get_stats('time_sim')[0]) + self.solve_time = float(self.solver.get_stats("time_tot")[0]) - # qp_iter = self.solver.get_stats('statistics')[-1][-1] # SQP_RTI specific - # print(f"long_mpc timings: tot {self.solve_time:.2e}, qp {self.time_qp_solution:.2e}, lin {self.time_linearization:.2e}, \ - # integrator {self.time_integrator:.2e}, qp_iter {qp_iter}") - # res = self.solver.get_residuals() - # print(f"long_mpc residuals: {res[0]:.2e}, {res[1]:.2e}, {res[2]:.2e}, {res[3]:.2e}") - # self.solver.print_statistics() - - for i in range(N+1): - self.x_sol[i] = self.solver.get(i, 'x') + for i in range(N + 1): + self.x_sol[i] = self.solver.get(i, "x") for i in range(N): - self.u_sol[i] = self.solver.get(i, 'u') - - self.v_solution = self.x_sol[:,1] - self.a_solution = self.x_sol[:,2] - self.j_solution = self.u_sol[:,0] + self.u_sol[i] = self.solver.get(i, "u") + self.v_solution = self.x_sol[:, 1] + self.a_solution = self.x_sol[:, 2] + self.j_solution = self.u_sol[:, 0] self.prev_a = np.interp(T_IDXS + self.dt, T_IDXS, self.a_solution) - t = time.monotonic() if self.solution_status != 0: - if t > self.last_cloudlog_t + 5.0: - self.last_cloudlog_t = t - cloudlog.warning(f"Long mpc reset, solution_status: {self.solution_status}") + now = time.monotonic() + if now > self.last_cloudlog_t + 5.0: + self.last_cloudlog_t = now + cloudlog.warning(f"Long MPC reset, solution_status: {self.solution_status}") self.reset() - # reset = 1 - # print(f"long_mpc timings: total internal {self.solve_time:.2e}, external: {(time.monotonic() - t0):.2e} qp {self.time_qp_solution:.2e}, \ - # lin {self.time_linearization:.2e} qp_iter {qp_iter}, reset {reset}") if __name__ == "__main__": ocp = gen_long_ocp() AcadosOcpSolver.generate(ocp, json_file=JSON_FILE) - # AcadosOcpSolver.build(ocp.code_export_directory, with_cython=True) diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py old mode 100755 new mode 100644 index 02a4a115e..0709403e8 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -1,3881 +1,498 @@ #!/usr/bin/env python3 +from enum import IntEnum import math + import numpy as np -import time import cereal.messaging as messaging from opendbc.car.interfaces import ACCEL_MIN, ACCEL_MAX + from openpilot.common.constants import CV from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.realtime import DT_MDL -from openpilot.selfdrive.modeld.constants import ModelConstants -from openpilot.starpilot.common.model_versions import is_tinygrad_model_version -from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import desired_follow_distance -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import should_trigger_planner_fcw -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import STOP_DISTANCE -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS as T_IDXS_MPC -from openpilot.selfdrive.controls.lib.lead_behavior import is_radarless_matched_follow_window -from openpilot.selfdrive.controls.lib.longitudinal_vehicle_tunes import get_far_follow_output_slew_rates, get_untracked_slow_lead_decel_scale -from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N -from openpilot.selfdrive.car.cruise import V_CRUISE_UNSET from openpilot.common.swaglog import cloudlog +from openpilot.selfdrive.car.cruise import V_CRUISE_UNSET +from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N +from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import ( + STOP_DISTANCE, + T_IDXS as T_IDXS_MPC, + LongitudinalMpc, + should_trigger_planner_fcw, +) +from openpilot.selfdrive.controls.lib.longitudinal_vehicle_tunes import get_longitudinal_planner_tune +from openpilot.selfdrive.modeld.constants import ModelConstants + -LON_MPC_STEP = 0.2 # first step is 0.2s -A_CRUISE_MIN = -1.0 -A_CRUISE_MAX_BP = [0.0, 5., 10., 15., 20., 25., 40.] -A_CRUISE_MAX_VALS = [1.125, 1.125, 1.125, 1.125, 1.25, 1.25, 1.5] CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] -ALLOW_THROTTLE_THRESHOLD = 0.4 +MIN_PLAN_HORIZON = 0.30 +A_CRUISE_MAX_BP = [0.0, 5.0, 10.0, 15.0, 20.0, 25.0, 40.0] +A_CRUISE_MAX_VALS = [1.125, 1.125, 1.125, 1.125, 1.25, 1.25, 1.5] +A_CRUISE_MIN = -1.0 + +ALLOW_THROTTLE_THRESHOLD = 0.40 ALLOW_THROTTLE_HYSTERESIS = 0.05 -ALLOW_THROTTLE_ENABLE_THRESHOLD = ALLOW_THROTTLE_THRESHOLD + ALLOW_THROTTLE_HYSTERESIS -ALLOW_THROTTLE_DISABLE_THRESHOLD = ALLOW_THROTTLE_THRESHOLD - ALLOW_THROTTLE_HYSTERESIS -ALLOW_THROTTLE_TRANSITION_CONFIRM_TIME = 0.25 -MIN_ALLOW_THROTTLE_SPEED = 5.0 -MODEL_LAUNCH_DISARM_SPEED = 2.0 -MODEL_LAUNCH_COMMIT_TIME = 3.5 -MODEL_LAUNCH_MOVING_SPEED = 1.2 -MODEL_LAUNCH_MAX_ACCEL = 1.5 -RAW_LEAD_SAFETY_MIN_CLOSING_SPEED = 0.5 -RAW_LEAD_SAFETY_TTC = 7.0 -RAW_LEAD_SAFETY_DISTANCE = 40.0 -RAW_LEAD_LOW_SPEED_HOLD_MAX_EGO_SPEED = 4.5 -RAW_LEAD_LOW_SPEED_HOLD_MAX_LEAD_SPEED = 3.5 -RAW_LEAD_LOW_SPEED_HOLD_MAX_DISTANCE = 10.0 -RAW_LEAD_LOW_SPEED_HOLD_MAX_LATERAL_OFFSET = 1.75 -RAW_LEAD_LOW_SPEED_HOLD_MIN_CLOSING_SPEED = 0.15 -STANDSTILL_LEAD_NUDGE_ACCEL = 0.05 -STANDSTILL_LEAD_NUDGE_MIN_SPEED = 0.0 -STANDSTILL_LEAD_NUDGE_MIN_LEAD_ACCEL = 0.2 -STANDSTILL_LEAD_DEPART_MIN_ACCEL = 0.35 -STANDSTILL_LEAD_DEPART_MAX_EGO_SPEED = 1.5 -STANDSTILL_LEAD_DEPART_MIN_LEAD_SPEED = 0.6 -STANDSTILL_LEAD_DEPART_MIN_GAP_MARGIN = 0.8 -STANDSTILL_LEAD_DEPART_MIN_MODEL_ACCEL = 0.08 -STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL = 0.18 -STANDSTILL_LEAD_CREEP_RELEASE_MIN_LEAD_SPEED = 0.25 -STANDSTILL_LEAD_CREEP_RELEASE_MIN_LEAD_ACCEL = 0.08 -STANDSTILL_LEAD_CREEP_RELEASE_MIN_GAP_MARGIN = 0.1 -STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME = 0.30 -RADAR_STANDSTILL_GAP_SETTLE_ACCEL = 0.18 -RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME = 0.50 -RADAR_STANDSTILL_GAP_SETTLE_ENTRY_MARGIN = 0.60 -RADAR_STANDSTILL_GAP_SETTLE_EXIT_MARGIN = 0.15 -RADAR_STANDSTILL_GAP_SETTLE_MAX_EXTRA_GAP = 1.5 -RADAR_STANDSTILL_GAP_SETTLE_MAX_EGO_SPEED = 0.45 -RADAR_STANDSTILL_GAP_SETTLE_MAX_LEAD_SPEED = 0.15 -RADAR_STANDSTILL_GAP_SETTLE_MAX_LATERAL_OFFSET = 1.0 -LEAD_DEPART_CONFIDENT_MIN_GAP = 3.75 -LEAD_DEPART_CONFIDENT_MAX_GAP = 5.25 -LEAD_DEPART_CONFIDENT_MIN_LEAD_SPEED = 0.3 -LEAD_DEPART_CONFIDENT_MIN_LEAD_DELTA = 0.25 -LEAD_DEPART_CONFIDENT_MIN_LEAD_ACCEL = 0.2 -LEAD_DEPART_CONFIDENT_CONFIRM_TIME = 0.35 -LEAD_DEPART_RELEASE_HOLD_TIME = 1.5 -LEAD_DEPART_RELEASE_HOLD_CONFIRM_TIME = 0.15 -LEAD_DEPART_RELEASE_HOLD_MIN_DISTANCE = 3.0 -LEAD_DEPART_RELEASE_HOLD_MIN_LEAD_SPEED = 0.55 -LEAD_DEPART_RELEASE_HOLD_MIN_LEAD_DELTA = 0.25 -LEAD_DEPART_RELEASE_HOLD_MAX_LEAD_BRAKE = 0.15 -LEAD_DEPART_RELEASE_HOLD_MIN_MODEL_PROB = 0.95 -LEAD_DEPART_RELEASE_HOLD_MAX_LATERAL_OFFSET = 1.0 -LEAD_DEPART_RELEASE_HOLD_CONFLICT_SPEED = 0.25 -LEAD_DEPART_RELEASE_HOLD_CONFLICT_DISTANCE_MARGIN = 3.0 -VEHICLE_FAR_FOLLOW_SLEW_MIN_SPEED = 10.0 -VEHICLE_FAR_FOLLOW_SLEW_MIN_DISTANCE = 25.0 -VEHICLE_FAR_FOLLOW_SLEW_MIN_DISTANCE_TIME = 1.35 -VEHICLE_FAR_FOLLOW_SLEW_MIN_HEADWAY = 1.35 -VEHICLE_FAR_FOLLOW_SLEW_MIN_TTC = 8.0 -VEHICLE_FAR_FOLLOW_SLEW_MAX_LATERAL_OFFSET = 1.5 -STANDSTILL_STOPPED_LEAD_GUARD_MAX_EGO_SPEED = 0.5 -STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_SPEED = 0.45 -STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_DELTA = 0.35 -STANDSTILL_STOPPED_LEAD_GUARD_MIN_MODEL_PROB = 0.95 -STANDSTILL_STOPPED_LEAD_GUARD_MAX_LATERAL_OFFSET = 1.75 -STANDSTILL_STOPPED_LEAD_GUARD_MIN_DISTANCE = 3.0 -STANDSTILL_STOPPED_LEAD_GUARD_DISTANCE_MARGIN = 3.0 -STANDSTILL_STOPPED_LEAD_GUARD_MIN_BRAKE = 0.16 -STANDSTILL_STOPPED_LEAD_GUARD_MAX_BRAKE = 0.26 -RADAR_DEPART_CONFLICT_MAX_EGO_SPEED = 1.6 -RADAR_DEPART_CONFLICT_MIN_RADAR_LATERAL = 1.5 -RADAR_DEPART_CONFLICT_MAX_RADAR_DISTANCE = 18.0 -RADAR_DEPART_CONFLICT_MIN_MODEL_PROB = 0.95 -RADAR_DEPART_CONFLICT_MAX_MODEL_DISTANCE = 18.0 -RADAR_DEPART_CONFLICT_MAX_MODEL_LATERAL = 0.9 -RADAR_DEPART_CONFLICT_MAX_MODEL_LEAD_SPEED = 2.0 -RADAR_DEPART_CONFLICT_MAX_DISTANCE_MISMATCH = 4.0 -LEAD_DEPART_ACCEL_HOLD_TIME = 1.2 -LEAD_DEPART_ACCEL_HOLD_MAX_EGO_SPEED = 2.0 -LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_SPEED = 0.6 -LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_DELTA = 0.5 -LEAD_DEPART_ACCEL_HOLD_MIN_GAP = 3.5 -LEAD_DEPART_ACCEL_HOLD_FULL_GAP = 6.0 -LEAD_DEPART_ACCEL_HOLD_FULL_LEAD_SPEED = 2.2 -LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB = 0.85 -LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_ACCEL = 0.12 -LEAD_DEPART_ACCEL_HOLD_MAX_LEAD_BRAKE = 0.2 -LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL = 0.25 -LEAD_DEPART_ACCEL_HOLD_MAX_ACCEL = 0.55 -LEAD_DEPART_ACCEL_ASSIST = 0.10 -LEAD_DEPART_ACCEL_HOLD_REUSE_MIN_GAP = 3.75 -LEAD_DEPART_ACCEL_HOLD_REUSE_MAX_CLOSING_SPEED = 0.45 -LEAD_DEPART_ACCEL_HOLD_REUSE_MAX_LEAD_BRAKE = 0.2 -LEAD_DEPART_ACCEL_HOLD_REUSE_MIN_HEADWAY_MARGIN = 0.10 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_EGO_SPEED = 4.5 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_DISTANCE = 4.0 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_DISTANCE = 18.0 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_SPEED = 4.0 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LATERAL_OFFSET = 1.75 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_MODEL_PROB = 0.9 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_DELTA = -0.5 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_DELTA = 0.75 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_ACCEL = -0.4 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_ACCEL = 0.25 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_ACCEL = 0.08 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_ACCEL = 0.22 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MAX_EGO_SPEED = 1.25 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_GAP = 4.0 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_SPEED = 1.2 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_DELTA = 0.8 -LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_ACCEL = 0.5 -CLOSE_LEAD_BRAKE_CAP_MAX_TTC = 25.0 -INSIDE_GAP_CLOSING_MIN_EGO_SPEED = 8.0 -INSIDE_GAP_CLOSING_MIN_LEAD_SPEED = 5.0 -INSIDE_GAP_CLOSING_MIN_SPEED = 0.5 -INSIDE_GAP_CLOSING_FULL_SPEED = 2.5 -INSIDE_GAP_CLOSING_MIN_DEFICIT = 3.0 -INSIDE_GAP_CLOSING_DEFICIT_RATIO = 0.15 -INSIDE_GAP_CLOSING_BRAKE_DEFICIT_RATIO = 0.25 -INSIDE_GAP_CLOSING_BRAKE_MIN_SPEED = 1.0 -INSIDE_GAP_CLOSING_MAX_DECEL = 0.65 -INSIDE_GAP_CLOSING_MAX_LATERAL_OFFSET = 1.75 -INSIDE_GAP_CLOSING_VISION_MIN_MODEL_PROB = 0.95 -VISION_LEAD_APPROACH_MIN_CLOSING_SPEED = 2.0 -VISION_LEAD_APPROACH_TRIGGER_TIME = 4.5 -VISION_LEAD_APPROACH_FULL_TIME = 1.0 -VISION_LEAD_APPROACH_TIGHT_BUFFER = 2.0 -VISION_LEAD_APPROACH_MAX_DECEL = 0.80 -VISION_LEAD_APPROACH_MIN_DECEL = 0.15 -VISION_LEAD_APPROACH_MIN_MODEL_PROB = 0.85 -VISION_LEAD_APPROACH_FULL_MODEL_PROB = 0.98 -VISION_LEAD_APPROACH_DEFICIT_MAX_DECEL = 1.30 -VISION_LEAD_APPROACH_DEFICIT_BUFFER_MIN = 3.0 -VISION_LEAD_APPROACH_DEFICIT_BUFFER_GAIN = 0.20 -VISION_LEAD_APPROACH_BRAKING_DEFICIT_MIN = 0.75 -VISION_LEAD_APPROACH_BRAKING_MIN_LEAD_BRAKE = 0.45 -VISION_LEAD_APPROACH_BRAKING_FULL_LEAD_BRAKE = 1.20 -VISION_LEAD_APPROACH_BRAKING_FLOOR_MIN_DECEL = 1.30 -VISION_LEAD_APPROACH_BRAKING_FLOOR_MAX_DECEL = 1.75 -VISION_LEAD_APPROACH_CONFIRM_TIME = 0.25 -VISION_LEAD_APPROACH_CONFIRM_BYPASS_DECEL = 1.0 -VISION_LEAD_APPROACH_CONFIRM_BYPASS_CLOSING_SPEED = 4.0 -VISION_LEAD_APPROACH_CONFIRM_BYPASS_LEAD_BRAKE = 0.20 -VISION_LEAD_APPROACH_CONFIRM_BYPASS_DISTANCE_MIN = 28.0 -VISION_LEAD_APPROACH_CONFIRM_BYPASS_DISTANCE_TIME = 0.85 -VISION_UNTRACKED_SLOW_LEAD_MIN_MODEL_PROB = 0.9 -VISION_UNTRACKED_SLOW_LEAD_FULL_MODEL_PROB = 0.97 -VISION_UNTRACKED_SLOW_LEAD_MIN_CLOSING_SPEED = 3.0 -VISION_UNTRACKED_SLOW_LEAD_MIN_CLOSING_RATIO = 0.16 -VISION_UNTRACKED_SLOW_LEAD_FULL_CLOSING_RATIO = 0.24 -VISION_UNTRACKED_SLOW_LEAD_TRIGGER_TTC = 16.0 -VISION_UNTRACKED_SLOW_LEAD_FULL_TTC = 8.0 -VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_MODEL_PROB = 0.95 -VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_SPEED = 2.0 -VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_RATIO = 0.12 -VISION_UNTRACKED_SLOW_LEAD_EARLY_TRIGGER_TTC = 24.0 -VISION_UNTRACKED_SLOW_LEAD_NEAR_MAX_DISTANCE = 45.0 -VISION_UNTRACKED_SLOW_LEAD_NEAR_MIN_MODEL_PROB = 0.90 -VISION_UNTRACKED_SLOW_LEAD_NEAR_MIN_CLOSING_RATIO = 0.09 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_ENTRY_MAX_LATERAL_OFFSET = 1.2 -VISION_UNTRACKED_SLOW_LEAD_MAX_DISTANCE_TIME = 4.4 -VISION_UNTRACKED_SLOW_LEAD_MIN_DISTANCE = 80.0 -VISION_UNTRACKED_SLOW_LEAD_MAX_DISTANCE = 120.0 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_DISTANCE_TIME = 5.7 -VISION_UNTRACKED_SLOW_LEAD_MAX_DECEL = 0.85 -VISION_UNTRACKED_SLOW_LEAD_MIN_DECEL = 0.1 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_MODEL_PROB = 0.68 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_LEAD_SPEED = 8.0 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_TTC = 10.0 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_MIN_CLOSING_SPEED = 10.0 -VISION_UNTRACKED_SLOW_LEAD_RELAXED_FULL_CLOSING_SPEED = 16.0 -VISION_UNTRACKED_SLOW_LEAD_CONFIRM_TIME = 0.30 -VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_DECEL = 0.55 -VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_DISTANCE = 45.0 -VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_LEAD_BRAKE = 0.10 -VISION_UNTRACKED_APPROACH_LIFT_MIN_EGO_SPEED = 18.0 -VISION_UNTRACKED_APPROACH_LIFT_MIN_MODEL_PROB = 0.95 -VISION_UNTRACKED_APPROACH_LIFT_MAX_LATERAL_OFFSET = 1.2 -VISION_UNTRACKED_APPROACH_LIFT_MIN_CLOSING_SPEED = 0.75 -VISION_UNTRACKED_APPROACH_LIFT_MAX_DISTANCE = 130.0 -VISION_UNTRACKED_APPROACH_LIFT_MIN_GAP_EXCESS = 6.0 -VISION_UNTRACKED_APPROACH_LIFT_TRIGGER_TIME = 20.0 -VISION_UNTRACKED_APPROACH_LIFT_FULL_TIME = 6.0 -VISION_UNTRACKED_APPROACH_LIFT_MAX_ACCEL = 0.22 -VISION_UNTRACKED_APPROACH_LIFT_CONFIRM_TIME = 0.30 -VISION_UNTRACKED_APPROACH_LIFT_HOLD_TIME = 0.75 -VISION_UNTRACKED_APPROACH_LIFT_RATE_DOWN = 0.35 -VISION_UNTRACKED_APPROACH_LIFT_RATE_UP = 0.25 -VISION_SLOW_LEAD_MAX_SPEED = 5.0 -VISION_SLOW_LEAD_MIN_CLOSING_SPEED = 1.5 -VISION_SLOW_LEAD_TRIGGER_TTC = 4.5 -VISION_SLOW_LEAD_FULL_TTC = 2.0 -VISION_SLOW_LEAD_MAX_DECEL = 1.2 -VISION_SLOW_LEAD_MIN_DECEL = 0.18 -VISION_SLOW_LEAD_MIN_MODEL_PROB = 0.9 -LEAD_APPROACH_TFOLLOW_TRIGGER_TIME = 4.5 -LEAD_APPROACH_TFOLLOW_FULL_TIME = 1.5 -LEAD_APPROACH_TFOLLOW_MAX_DELTA = 0.18 -LEAD_APPROACH_TFOLLOW_MAX_CLOSING_SPEED = 6.0 -LEAD_APPROACH_TFOLLOW_MAX_LEAD_BRAKE = 2.5 -LEAD_APPROACH_TFOLLOW_MIN_CLOSING_SPEED = 0.75 -LEAD_APPROACH_TFOLLOW_MIN_LEAD_BRAKE = 0.2 -LEAD_APPROACH_TFOLLOW_WINDOW_MIN = 6.0 -LEAD_APPROACH_TFOLLOW_WINDOW_GAIN = 0.35 -LEAD_APPROACH_TFOLLOW_RATE_UP = 1.0 -LEAD_APPROACH_TFOLLOW_RATE_DOWN = 0.60 -VISION_LEAD_TFOLLOW_MAX_EXTRA_DELTA = 0.24 -VISION_LEAD_TFOLLOW_SLOW_LEAD_SPEED = 20.0 -VISION_LEAD_TFOLLOW_GAP_BUFFER_MIN = 8.0 -VISION_LEAD_TFOLLOW_GAP_BUFFER_GAIN = 0.35 -VISION_LOW_SPEED_STOP_BUFFER_MAX_EGO_SPEED = 6.5 -VISION_LOW_SPEED_STOP_BUFFER_MAX_LEAD_SPEED = 3.25 -VISION_LOW_SPEED_STOP_BUFFER_HOLD_MAX_LEAD_SPEED = 4.0 -VISION_LOW_SPEED_STOP_BUFFER_MIN_MODEL_PROB = 0.9 -VISION_LOW_SPEED_STOP_BUFFER_MIN_CLOSING_SPEED = 0.35 -VISION_LOW_SPEED_STOP_BUFFER_MIN_HOLD_REL_SPEED = -0.2 -VISION_LOW_SPEED_STOP_BUFFER_BASE = 3.8 -VISION_LOW_SPEED_STOP_BUFFER_EGO_GAIN = 0.80 -VISION_LOW_SPEED_STOP_BUFFER_LEAD_GAIN = 0.25 -VISION_LOW_SPEED_STOP_BUFFER_RELEASE_MARGIN = 0.9 -VISION_LOW_SPEED_STOP_BUFFER_HOLD_TIME = 0.8 -VISION_LOW_SPEED_STOP_BUFFER_MIN_BRAKE = 1.25 -VISION_LOW_SPEED_STOP_BUFFER_BRAKE_GAIN = 0.25 -VISION_CLOSE_STOP_HOLD_MAX_EGO_SPEED = 0.75 -VISION_CLOSE_STOP_HOLD_MAX_LEAD_SPEED = 0.8 -VISION_CLOSE_STOP_HOLD_MAX_DISTANCE = 3.5 -VISION_CLOSE_STOP_HOLD_MIN_MODEL_PROB = 0.95 -VISION_CLOSE_STOP_HOLD_MIN_BRAKE = 0.20 -VISION_CLOSE_STOP_HOLD_MAX_BRAKE = 0.36 -VISION_CLOSE_SETTLE_MAX_EGO_SPEED = 0.75 -VISION_CLOSE_SETTLE_MAX_LEAD_SPEED = 2.75 -VISION_CLOSE_SETTLE_MAX_DISTANCE = 4.2 -VISION_CLOSE_SETTLE_MAX_LEAD_DELTA = 2.6 -VISION_CLOSE_SETTLE_MIN_BRAKE = 0.16 -VISION_CLOSE_SETTLE_MAX_BRAKE = 0.30 -VISION_CLOSE_FINAL_GUARD_MAX_EGO_SPEED = 0.5 -VISION_CLOSE_FINAL_GUARD_MAX_LEAD_SPEED = 2.75 -VISION_CLOSE_FINAL_GUARD_MAX_DISTANCE = 4.5 -VISION_CLOSE_FINAL_GUARD_MIN_BRAKE = 0.18 -VISION_CLOSE_FINAL_GUARD_MAX_BRAKE = 0.28 -VISION_CLOSE_RELEASE_HOLD_MAX_EGO_SPEED = 2.5 -VISION_CLOSE_RELEASE_HOLD_MAX_LEAD_SPEED = 3.5 -VISION_CLOSE_RELEASE_HOLD_MAX_DISTANCE = 4.2 -VISION_CLOSE_RELEASE_HOLD_MIN_MODEL_PROB = 0.98 -VISION_CLOSE_RELEASE_HOLD_MIN_LEAD_DELTA = -0.1 -VISION_CLOSE_RELEASE_HOLD_MAX_LEAD_DELTA = 1.5 -VISION_CLOSE_RELEASE_HOLD_MIN_BRAKE = 0.18 -VISION_CLOSE_RELEASE_HOLD_MAX_BRAKE = 0.40 -MANUAL_STOP_RESUME_OVERRIDE_TIME = 3.0 -MANUAL_STOP_RESUME_OVERRIDE_MAX_SPEED = 2.0 -MANUAL_STOP_RESUME_OVERRIDE_MIN_ACCEL = 0.2 +ALLOW_THROTTLE_CONFIRM_TIME = 0.25 +MIN_ALLOW_THROTTLE_SPEED = 1.5 +COAST_TARGET_SPEED = 5.0 +COAST_TARGET_GAIN = 0.35 + +MODEL_STOP_BEGIN_TIME = 9.0 +MODEL_STOP_FULL_TIME = 4.0 +MODEL_STOP_MIN_END_SPEED = 2.0 +MODEL_FIRST_AUTHORITY = 0.75 +MODEL_FIRST_OPEN_ROAD_AUTHORITY = 0.35 +MODEL_FIRST_CRUISE_ERROR = 1.5 + +STOP_ENTER_AUTHORITY = 0.72 +STOP_RELEASE_TIME = 0.50 +STOPPED_SPEED = 0.15 +STOP_CONTROL_SPEED = 1.5 +DEPART_COMPLETE_SPEED = 2.5 +DEPART_LEAD_MIN_SPEED = 0.10 +DEPART_LEAD_FAST_SPEED = 0.75 +DEPART_CONFIRM_TIME = 0.20 +DEPART_LEAD_MIN_GAP = 0.0 +DEPART_MODEL_MIN_ACCEL = 0.08 +DEPART_LEAD_MAX_BRAKE = 0.30 + +RAW_SAFETY_REACTION_BUFFER = 0.20 +RAW_SAFETY_MIN_CLOSING_SPEED = 0.25 +RAW_SAFETY_MIN_DECEL = 0.20 +RAW_SAFETY_URGENT_DECEL = 0.80 +RAW_SAFETY_URGENT_TTC = 4.0 +RAW_SAFETY_EXTRA_STOP_BUFFER = 1.0 + FORCE_STOP_HANDOFF_MAX_VCRUISE = 0.5 -LEAD_CATCHUP_ACCEL_MIN_EGO = 8.0 -LEAD_CATCHUP_ACCEL_MIN_LEAD_DELTA = -0.5 -LEAD_CATCHUP_ACCEL_MAX_GAP_BUFFER_MIN = 4.0 -LEAD_CATCHUP_ACCEL_MAX_GAP_BUFFER_GAIN = 0.15 -RADAR_MATCHED_FOLLOW_CATCHUP_CAP_BUFFER_MARGIN = 0.75 -RADAR_MATCHED_FOLLOW_CATCHUP_HOLD_CAP = 0.04 -RADAR_MATCHED_FOLLOW_CATCHUP_HOLD_MAX_GAP_ERROR = 0.75 -RADAR_CATCHUP_ACCEL_CAP_ENTRY_FULL_SPEED = 12.0 -RADAR_CATCHUP_ACCEL_CAP_ENTRY_MAX = 1.5 -POST_DEPARTURE_FOLLOW_SETTLE_LATCH_TIME = 75.0 -POST_DEPARTURE_FOLLOW_SETTLE_MIN_SPEED = 8.0 -POST_DEPARTURE_FOLLOW_SETTLE_MAX_ARM_SPEED = 16.0 -POST_DEPARTURE_FOLLOW_SETTLE_MIN_MODEL_PROB = 0.9 -POST_DEPARTURE_FOLLOW_SETTLE_MAX_LATERAL_OFFSET = 1.15 -POST_DEPARTURE_FOLLOW_SETTLE_MAX_CLOSING_SPEED = 0.8 -POST_DEPARTURE_FOLLOW_SETTLE_MAX_LEAD_BRAKE = 0.10 -POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_LEAD_DELTA = -0.10 -POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_LEAD_ACCEL = 0.20 -POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_HEADWAY_MARGIN = 0.08 -POST_DEPARTURE_FOLLOW_SETTLE_COMPLETE_HEADWAY_MARGIN = 0.05 -FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_SPEED = 12.0 -FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_HEADWAY_MARGIN = 0.10 -FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_HEADWAY_MARGIN = 0.90 -FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_GAP_MARGIN = 4.0 -FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_CLOSING_SPEED = 0.20 -FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_CLOSING_SPEED = 1.50 -FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_LEAD_BRAKE = 0.35 -FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_ACCEL = 0.55 -LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_SPEED = 12.0 -LOW_SPEED_FOLLOW_ACCEL_CAP_MIN_MODEL_PROB = 0.85 -LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_LEAD_BRAKE = 0.20 -LOW_SPEED_FOLLOW_ACCEL_CAP_MIN_LEAD_DELTA = -1.2 -LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_GAP_BUFFER_MIN = 6.0 -LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_GAP_BUFFER_GAIN = 0.35 -LOW_SPEED_FOLLOW_TRANSITION_MIN_SPEED = 3.0 -LOW_SPEED_FOLLOW_TRANSITION_MAX_SPEED = 12.0 -LOW_SPEED_FOLLOW_TRANSITION_MIN_MODEL_PROB = 0.85 -LOW_SPEED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE = 0.20 -LOW_SPEED_FOLLOW_TRANSITION_MIN_GAP_MARGIN = 1.0 -LOW_SPEED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED = 0.6 -LOW_SPEED_FOLLOW_TRANSITION_PREV_ACCEL_MIN = 0.18 -LOW_SPEED_FOLLOW_TRANSITION_TARGET_BRAKE_MIN = -0.18 -LOW_SPEED_FOLLOW_TRANSITION_MAX_BRAKE = 0.14 -LOW_SPEED_FOLLOW_TRANSITION_MIN_BRAKE = 0.08 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MIN_SPEED = 10.0 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_SPEED = 20.0 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MIN_MODEL_PROB = 0.85 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_LEAD_BRAKE = 0.25 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_PULLAWAY_SPEED = 1.0 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_GAP_BUFFER_MIN = 12.0 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_GAP_BUFFER_GAIN = 0.9 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_LATERAL_OFFSET = 1.15 -CRUISE_TRACKED_LEAD_ACCEL_CAP_UNRESOLVED_MIN_CLOSING_SPEED = 1.5 -CRUISE_TRACKED_LEAD_ACCEL_CAP_UNRESOLVED_MAX_LEAD_DELTA = 0.25 -CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_ACCEL = 0.18 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_SPEED = 12.0 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_SPEED = 22.0 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_MODEL_PROB = 0.9 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_LEAD_BRAKE = 0.35 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_LATERAL_OFFSET = 1.15 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_PULLAWAY_SPEED = 2.25 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_HEADWAY_ABOVE_TARGET = 0.95 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_DELTA_A = 0.18 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_STEP = 0.06 -CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_STEP = 0.18 -# Uncertainty-based filter disable thresholds -UNCERT_SLOPE_TRIG = 0.12 # per second -UNCERT_MAG_TRIG = 0.50 -UNCERT_PANIC_MIN_CLOSING_SPEED = 2.0 -UNCERT_PANIC_MIN_CLOSING_SPEED_GAIN = 0.08 -UNCERT_PANIC_MAX_GAP_BUFFER_MIN = 8.0 -UNCERT_PANIC_MAX_GAP_BUFFER_GAIN = 0.35 -UNCERT_DUPLICATE_VISION_MIN_TTC = 6.0 -UNCERT_DUPLICATE_VISION_MIN_HEADWAY = 0.85 -UNCERT_DUPLICATE_VISION_HEADWAY_BELOW_TARGET = 0.45 -STEADY_FOLLOW_SMOOTHING_MIN_SPEED = 22.0 -STEADY_FOLLOW_SMOOTHING_MIN_CLOSING_SPEED = 0.15 -STEADY_FOLLOW_SMOOTHING_MAX_CLOSING_SPEED = 1.8 -STEADY_FOLLOW_SMOOTHING_MIN_HEADWAY = 0.95 -STEADY_FOLLOW_SMOOTHING_HEADWAY_BELOW_TARGET = 0.35 -STEADY_FOLLOW_SMOOTHING_HEADWAY_ABOVE_TARGET = 0.90 -STEADY_FOLLOW_SMOOTHING_MAX_LEAD_BRAKE = 0.35 -STEADY_FOLLOW_SMOOTHING_MIN_MODEL_PROB = 0.7 -STEADY_FOLLOW_SMOOTHING_FILTER_FACTOR_FLOOR = 0.24 -STEADY_FOLLOW_BRAKE_CAP_MIN_HEADWAY = 1.05 -STEADY_FOLLOW_BRAKE_CAP_MAX_HEADWAY_ABOVE_TARGET = 0.90 -STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED = -1.2 -STEADY_FOLLOW_BRAKE_CAP_MAX_CLOSING_SPEED = 2.2 -STEADY_FOLLOW_BRAKE_CAP_ZERO_REL_SPEED_DECEL = 0.12 -STEADY_FOLLOW_BRAKE_CAP_OPENING_DECEL = 0.08 -STEADY_FOLLOW_BRAKE_CAP_MIN_DECEL = 0.18 -STEADY_FOLLOW_BRAKE_CAP_MAX_DECEL = 0.32 -STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_HEADWAY_MARGIN = 0.45 -STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_MIN_HEADWAY = 1.80 -STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_MAX_LEAD_BRAKE = 0.15 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_DISTANCE = 80.0 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED = 0.1 -FAR_LEAD_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED = 2.0 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_MODEL_PROB = 0.95 -FAR_LEAD_COMFORT_BRAKE_CAP_MAX_LEAD_BRAKE = 0.12 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_TTC = 7.5 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN = 0.55 -FAR_LEAD_COMFORT_BRAKE_CAP_FULL_HEADWAY_MARGIN = 1.00 -FAR_LEAD_COMFORT_BRAKE_CAP_MIN_DECEL = 0.05 -FAR_LEAD_COMFORT_BRAKE_CAP_MAX_DECEL = 0.18 -FAR_LEAD_COMFORT_BRAKE_CAP_FULL_RELAX_DECEL = 0.05 -FAR_RADAR_COMFORT_BRAKE_CAP_MIN_DISTANCE = 40.0 -FAR_RADAR_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED = 0.5 -FAR_RADAR_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED = 1.8 -FAR_RADAR_COMFORT_BRAKE_CAP_MAX_LEAD_BRAKE = 0.12 -FAR_RADAR_COMFORT_BRAKE_CAP_MIN_TTC = 20.0 -FAR_RADAR_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN = 0.55 -FAR_RADAR_COMFORT_BRAKE_CAP_FULL_HEADWAY_MARGIN = 0.95 -FAR_RADAR_COMFORT_BRAKE_CAP_MIN_DECEL = 0.04 -FAR_RADAR_COMFORT_BRAKE_CAP_MAX_DECEL = 0.14 -FAR_RADAR_COMFORT_BRAKE_CAP_FULL_RELAX_DECEL = 0.05 -EXPERIMENTAL_RELEASE_ACCEL_HOLD_TIME = 0.75 -# At low speed, preserve the existing handoff slew long enough to bridge a -# brief slow-lead CEM dropout without extending high-speed release behavior. -EXPERIMENTAL_RELEASE_ACCEL_LOW_SPEED_HOLD_TIME = 3.0 -EXPERIMENTAL_RELEASE_ACCEL_LOW_SPEED_THRESHOLD = 12.0 -EXPERIMENTAL_RELEASE_ACCEL_MIN_SPEED = 2.5 -EXPERIMENTAL_RELEASE_ACCEL_MIN_LEAD_SPEED = 5.0 -EXPERIMENTAL_RELEASE_ACCEL_MIN_LEAD_DELTA = -1.0 -EXPERIMENTAL_RELEASE_ACCEL_MAX_LEAD_DELTA = 1.5 -EXPERIMENTAL_RELEASE_ACCEL_MAX_LEAD_BRAKE = 0.2 -EXPERIMENTAL_RELEASE_ACCEL_MIN_MODEL_PROB = 0.9 -EXPERIMENTAL_RELEASE_ACCEL_MAX_LATERAL_OFFSET = 1.5 -EXPERIMENTAL_RELEASE_ACCEL_MIN_HEADWAY_MARGIN = 0.0 -EXPERIMENTAL_RELEASE_ACCEL_MIN_DELTA_A = 0.12 -EXPERIMENTAL_RELEASE_ACCEL_STEP = 0.06 -MATCHED_FOLLOW_TRANSITION_MIN_SPEED = 20.0 -MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN = 0.25 -MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN = 0.75 -MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB = 0.9 -MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE = 0.18 -MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED = 1.75 -MATCHED_FOLLOW_TRANSITION_MIN_TTC = 12.0 -MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP = 0.08 -MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP = 0.18 -MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP = 0.08 -MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP = 0.16 -MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP = 0.10 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED = 10.0 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_SPEED = MATCHED_FOLLOW_TRANSITION_MIN_SPEED -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN = 0.45 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_OPENING_RADAR_MIN_HEADWAY_MARGIN = 0.20 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_OPENING_RADAR_MIN_LEAD_DELTA = 0.25 -MATCHED_FOLLOW_TRANSITION_STABLE_RADAR_MAX_CLOSING_SPEED = 0.25 -MATCHED_FOLLOW_TRANSITION_STABLE_RADAR_MAX_STEP = 0.05 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN = 1.00 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB = 0.98 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE = 0.08 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED = 1.25 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TTC = 18.0 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP = 0.06 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP = 0.10 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP = 0.05 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP = 0.08 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP = 0.06 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TARGET = -0.12 -LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_DELTA_A = 0.12 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_SPEED = 3.0 -MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_SPEED = 35.0 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_MODEL_PROB = 0.95 -MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_LEAD_BRAKE = 0.80 -MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_CLOSING_SPEED = 3.25 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_TTC = 6.0 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_HEADWAY_MARGIN = 0.25 -MILD_FOLLOW_ZERO_CROSS_GUARD_FULL_HEADWAY_MARGIN = 0.85 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_DELTA_A = 0.08 -MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_DEADBAND = 0.04 -MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_DEADBAND = 0.08 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_SPEED = 20.0 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_DISTANCE = 80.0 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_MODEL_PROB = 0.85 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_LEAD_DELTA = 1.0 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_HEADWAY_MARGIN = 0.75 -FAR_OPENING_RADAR_BRAKE_GUARD_MAX_LEAD_BRAKE = 0.25 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_PREV_TARGET = -0.08 -FAR_OPENING_RADAR_BRAKE_GUARD_MAX_NEW_TARGET = -0.15 -FAR_OPENING_RADAR_BRAKE_GUARD_MAX_CRUISE_DEFICIT = 0.25 -FAR_OPENING_RADAR_BRAKE_GUARD_MIN_MODEL_ACCEL = -0.50 -NEAR_DUPLICATE_LEAD_TRANSITION_MIN_SPEED = 20.0 -NEAR_DUPLICATE_LEAD_TRANSITION_MIN_MODEL_PROB = 0.95 -NEAR_DUPLICATE_LEAD_TRANSITION_MAX_LEAD_BRAKE = 0.35 -NEAR_DUPLICATE_LEAD_TRANSITION_MAX_CLOSING_SPEED = 3.5 -NEAR_DUPLICATE_LEAD_TRANSITION_MIN_TTC = 8.0 -NEAR_DUPLICATE_LEAD_TRANSITION_MIN_HEADWAY_BELOW_TARGET = 0.45 -NEAR_DUPLICATE_LEAD_TRANSITION_MAX_HEADWAY_ABOVE_TARGET = 0.85 -NEAR_DUPLICATE_VISION_TRANSITION_MIN_HEADWAY_MARGIN = 0.55 -NEAR_DUPLICATE_VISION_TRANSITION_EXTRA_CLOSING_SPEED = 1.25 -LOW_SPEED_IDENTICAL_RADAR_DUPLICATE_TRANSITION_EXTRA_HEADWAY = 0.15 -LOW_SPEED_DUPLICATE_VISION_TRANSITION_EXTRA_HEADWAY = 0.75 -NEAR_DUPLICATE_LEAD_TRANSITION_MIN_DELTA_A = 0.35 -NEAR_DUPLICATE_LEAD_TRANSITION_POSITIVE_STEP = 0.22 -NEAR_DUPLICATE_LEAD_TRANSITION_NEGATIVE_STEP = 0.32 -NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP = 0.18 -DUPLICATE_VISION_COMFORT_LEAD_CENTER_TIE_MARGIN = 0.35 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_SPEED = 12.0 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_MODEL_PROB = 0.95 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_PREV_DECEL = 0.35 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_CLOSING_SPEED = 0.5 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_LEAD_BRAKE = 0.8 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_HEADWAY_ABOVE_TARGET = 0.85 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_DELTA_A = 0.35 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_DREL_DIFF = 1.5 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_VREL_DIFF = 0.35 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_POSITIVE_STEP = 0.12 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_POSITIVE_STEP = 0.28 -DUPLICATE_SLOW_LEAD_BRAKE_HOLD_SIGN_CROSS_STEP = 0.22 -TRACKED_VISION_MODEL_FLOOR_MIN_SPEED = 10.0 -TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_PROB = 0.95 -TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_DECEL = 0.80 -TRACKED_VISION_MODEL_FLOOR_MIN_CLOSING_SPEED = 1.0 -TRACKED_VISION_MODEL_FLOOR_MAX_TTC = 22.0 -TRACKED_VISION_MODEL_FLOOR_MIN_GAP_MARGIN = -2.0 -TRACKED_VISION_MODEL_FLOOR_MAX_GAP_BUFFER_MIN = 4.0 -TRACKED_VISION_MODEL_FLOOR_MAX_GAP_BUFFER_GAIN = 0.25 -TRACKED_VISION_MODEL_FLOOR_MIN_DECEL = 0.35 -TRACKED_VISION_MODEL_FLOOR_MAX_DECEL = 1.10 -TRACKED_VISION_MODEL_FLOOR_LEAD_BRAKE_MAX = 0.18 -TRACKED_VISION_MODEL_CAP_MIN_SPEED = 14.0 -TRACKED_VISION_MODEL_CAP_MAX_SPEED = 32.0 -TRACKED_VISION_MODEL_CAP_MIN_MODEL_PROB = 0.95 -TRACKED_VISION_MODEL_CAP_MAX_MODEL_DECEL = 0.75 -TRACKED_VISION_MODEL_CAP_MIN_CLOSING_SPEED = 0.75 -TRACKED_VISION_MODEL_CAP_MAX_CLOSING_SPEED = 4.0 -TRACKED_VISION_MODEL_CAP_MAX_LEAD_BRAKE = 0.55 -TRACKED_VISION_MODEL_CAP_MIN_TTC = 7.0 -TRACKED_VISION_MODEL_CAP_MIN_GAP_MARGIN = -1.5 -TRACKED_VISION_MODEL_CAP_MAX_GAP_BUFFER_MIN = 4.0 -TRACKED_VISION_MODEL_CAP_MAX_GAP_BUFFER_GAIN = 0.25 -TRACKED_VISION_MODEL_CAP_MIN_DECEL = 0.45 -TRACKED_VISION_MODEL_CAP_MAX_DECEL = 1.10 - -# Lookup table for turns _A_TOTAL_MAX_V = [3.5, 3.5, 3.2] -_A_TOTAL_MAX_BP = [0., 20., 40.] - -_preap_follow_cache = None +_A_TOTAL_MAX_BP = [0.0, 20.0, 40.0] -def get_preap_follow_limit(v_ego): - global _preap_follow_cache - if _preap_follow_cache is None: - try: - from opendbc.car.tesla.preap.constants import ACCEL_PREAP_BP, ACCEL_PREAP_FOLLOW - _preap_follow_cache = (ACCEL_PREAP_BP, ACCEL_PREAP_FOLLOW) - except ImportError: - _preap_follow_cache = (None, None) - bp, values = _preap_follow_cache - if bp is None: - return None - return float(np.interp(v_ego, bp, values)) +class PlanState(IntEnum): + moving = 0 + stopping = 1 + stopped = 2 + departing = 3 -def get_longitudinal_personality(sm): - return sm['selfdriveState'].personality +def get_coast_accel(pitch): + return np.sin(pitch) * -5.65 - 0.3 def get_max_accel(v_ego): - return np.interp(v_ego, A_CRUISE_MAX_BP, A_CRUISE_MAX_VALS) - -def get_coast_accel(pitch): - return np.sin(pitch) * -5.65 - 0.3 # fitted from data using xx/projects/allow_throttle/compute_coast_accel.py + return float(np.interp(v_ego, A_CRUISE_MAX_BP, A_CRUISE_MAX_VALS)) -def limit_accel_in_turns(v_ego, angle_steers, a_target, CP): - """ - This function returns a limited long acceleration allowed, depending on the existing lateral acceleration - this should avoid accelerating when losing the target in turns - """ - # FIXME: This function to calculate lateral accel is incorrect and should use the VehicleModel - # The lookup table for turns should also be updated if we do this +def limit_accel_in_turns(v_ego, angle_steers, accel_limits, CP): a_total_max = np.interp(v_ego, _A_TOTAL_MAX_BP, _A_TOTAL_MAX_V) a_y = v_ego ** 2 * angle_steers * CV.DEG_TO_RAD / (CP.steerRatio * CP.wheelbase) - a_x_allowed = math.sqrt(max(a_total_max ** 2 - a_y ** 2, 0.)) - - return [a_target[0], min(a_target[1], a_x_allowed)] - - -def should_publish_planner_fcw(crash_cnt: int, car_state, radar_state) -> bool: - return ( - crash_cnt > 2 and - not car_state.standstill and - should_trigger_planner_fcw(radar_state.leadOne, float(car_state.vEgo)) - ) + a_x_allowed = math.sqrt(max(a_total_max ** 2 - a_y ** 2, 0.0)) + return [accel_limits[0], min(accel_limits[1], a_x_allowed)] def get_vehicle_min_accel(CP, v_ego): - # Planner-side physical decel capability estimate for GM pedal-long paths. is_gm = getattr(CP, "carName", "") == "gm" or getattr(CP, "brand", "") == "gm" if is_gm and getattr(CP, "enableGasInterceptorDEPRECATED", False): try: - from opendbc.car.gm.values import GMFlags, CAR + from opendbc.car.gm.values import CAR, GMFlags if bool(CP.flags & GMFlags.PEDAL_LONG.value): - bolt_pedal_long_cars = { + bolt_pedal_long = { CAR.CHEVROLET_BOLT_CC_2017, CAR.CHEVROLET_BOLT_CC_2018_2021, CAR.CHEVROLET_BOLT_ACC_2022_2023_PEDAL, CAR.CHEVROLET_BOLT_CC_2022_2023, CAR.CHEVROLET_MALIBU_HYBRID_CC, } - if CP.carFingerprint in bolt_pedal_long_cars: - return float(np.interp(v_ego, [0.0, 1.5, 4.0, 8.0, 15.0, 30.0], - [-0.93, -1.28, -1.98, -2.58, -2.86, -2.95])) - return float(np.interp(v_ego, [0.0, 1.5, 4.0, 8.0, 15.0, 30.0], - [-0.95, -1.3, -1.85, -2.3, -2.6, -2.8])) + values = [-0.93, -1.28, -1.98, -2.58, -2.86, -2.95] if CP.carFingerprint in bolt_pedal_long else \ + [-0.95, -1.30, -1.85, -2.30, -2.60, -2.80] + return float(np.interp(v_ego, [0.0, 1.5, 4.0, 8.0, 15.0, 30.0], values)) except Exception: pass return float(ACCEL_MIN) def get_planner_v_ego(CP, car_state): - v_ego = max(car_state.vEgo, car_state.vEgoCluster) - is_gm = getattr(CP, "carName", "") == "gm" or getattr(CP, "brand", "") == "gm" if is_gm and getattr(CP, "enableGasInterceptorDEPRECATED", False): try: from opendbc.car.gm.values import GMFlags - is_gm_pedal_long = bool(CP.flags & GMFlags.PEDAL_LONG.value) - if is_gm_pedal_long: + if bool(CP.flags & GMFlags.PEDAL_LONG.value): return float(car_state.vEgo) except Exception: pass - - return float(v_ego) + return float(max(car_state.vEgo, car_state.vEgoCluster)) -def get_accel_from_plan_classic(CP, speeds, accels, vEgoStopping): - if len(speeds) == CONTROL_N: - v_target_now = np.interp(DT_MDL, CONTROL_N_T_IDX, speeds) - a_target_now = np.interp(DT_MDL, CONTROL_N_T_IDX, accels) +def get_accel_from_plan(speeds, accels, action_t=DT_MDL, v_ego_stopping=0.05): + if len(speeds) != CONTROL_N: + return 0.0, False - v_target = np.interp(CP.longitudinalActuatorDelay + DT_MDL, CONTROL_N_T_IDX, speeds) - if v_target != v_target_now: - a_target = 2 * (v_target - v_target_now) / CP.longitudinalActuatorDelay - a_target_now - else: - a_target = a_target_now - - v_target_1sec = np.interp(CP.longitudinalActuatorDelay + DT_MDL + 1.0, CONTROL_N_T_IDX, speeds) - else: - v_target = 0.0 - v_target_1sec = 0.0 - a_target = 0.0 - should_stop = (v_target < vEgoStopping and - v_target_1sec < vEgoStopping) + v_now = float(speeds[0]) + a_now = float(accels[0]) + action_t = max(float(action_t), DT_MDL) + v_target = float(np.interp(action_t, CONTROL_N_T_IDX, speeds)) + a_target = 2.0 * (v_target - v_now) / action_t - a_now + v_target_1sec = float(np.interp(action_t + 1.0, CONTROL_N_T_IDX, speeds)) + should_stop = v_target < v_ego_stopping and v_target_1sec < v_ego_stopping return a_target, should_stop -def get_accel_from_plan(speeds, accels, action_t=DT_MDL, vEgoStopping=0.05): - if len(speeds) == CONTROL_N: - v_now = speeds[0] - a_now = accels[0] - - v_target = np.interp(action_t, CONTROL_N_T_IDX, speeds) - a_target = 2 * (v_target - v_now) / (action_t) - a_now - v_target_1sec = np.interp(action_t + 1.0, CONTROL_N_T_IDX, speeds) - else: - v_target = 0.0 - v_target_1sec = 0.0 - a_target = 0.0 - should_stop = (v_target < vEgoStopping and - v_target_1sec < vEgoStopping) - return a_target, should_stop +def _smoothstep(value, low, high): + if high <= low: + return float(value >= high) + x = float(np.clip((value - low) / (high - low), 0.0, 1.0)) + return x * x * (3.0 - 2.0 * x) class LongitudinalPlanner: def __init__(self, CP, init_v=0.0, init_a=0.0, dt=DT_MDL): self.CP = CP - self.mpc = LongitudinalMpc(dt=dt) - self.fcw = False self.dt = dt - self.model_allow_throttle = True - self.model_allow_throttle_transition_t = 0.0 - self.allow_throttle = True - self.mode = 'acc' - self.is_preap = ( - CP.brand == "tesla" and CP.carFingerprint == "TESLA_MODEL_S_PREAP" and - CP.openpilotLongitudinalControl and not CP.pcmCruise - ) - self.nap_adaptive_accel = False - self._preap_params = None - self._preap_param_frame = 0 - - self.generation = None + self.mpc = LongitudinalMpc(dt=dt) + self.tune = get_longitudinal_planner_tune(CP) + self.mpc.lead_filter_tau = self.tune.lead_filter_tau + self.v_desired_filter = FirstOrderFilter(init_v, 2.0, dt) self.a_desired = init_a - self.v_desired_filter = FirstOrderFilter(init_v, 2.0, self.dt) - self.v_model_error = 0.0 - self.output_a_target = 0.0 + self.output_a_target = init_a self.output_should_stop = False - self.far_follow_brake_slew_rate, self.far_follow_release_slew_rate = get_far_follow_output_slew_rates(CP) - self.untracked_slow_lead_decel_scale = get_untracked_slow_lead_decel_scale(CP) - self.far_follow_output_slew_active = False - self.model_launch_armed = False - self.model_launch_stop_seen = False - self.confident_lead_depart_elapsed = 0.0 - self.slow_creep_lead_depart_elapsed = 0.0 - self.lead_depart_release_candidate_elapsed = 0.0 - self.lead_depart_release_pending = False - self.lead_depart_release_hold_remaining = 0.0 - self.radar_standstill_gap_settle_elapsed = 0.0 - self.radar_standstill_gap_settle_active = False + self.allow_throttle = True + self._throttle_transition_time = 0.0 + + self.state = PlanState.moving + self.stop_release_time = 0.0 + self.departure_confirm_time = 0.0 + self.model_authority = 0.0 + self.plan_source = "cruise" + self.fcw = False self.v_desired_trajectory = np.zeros(CONTROL_N) self.a_desired_trajectory = np.zeros(CONTROL_N) self.j_desired_trajectory = np.zeros(CONTROL_N) - self.solverExecutionTime = 0.0 - - # ---- Rubberband mitigation state ---- - # Two uncertainty tracks (slow/fast) for asymmetric gating - self.uncert_slow = FirstOrderFilter(0.0, 1.6, self.dt) # ~lam=0.6 - self.uncert_fast = FirstOrderFilter(0.0, 0.9, self.dt) # faster cool-down for accel decisions - # Lead stability tracking - self.prev_lead_dist = None - self.last_big_brake_t = 0.0 - self.stable_lead = False - # Smoothed lead distance - self.lead_dist_f = None - - # Uncertainty slope tracking - self._uncert_last = 0.0 - self._uncert_last_t = None - self._panic_bypass_log_t = 0.0 - self.effective_t_follow = None - self.vision_low_speed_stop_hold_until = 0.0 - self.vision_lead_approach_confirm_t = 0.0 - self.untracked_slow_lead_confirm_t = 0.0 - self.untracked_vision_approach_lift_confirm_t = 0.0 - self.untracked_vision_approach_lift_cap = None - self.untracked_vision_approach_lift_target = None - self.untracked_vision_approach_lift_hold_until = 0.0 - self.manual_stop_resume_override_until = 0.0 - self.lead_depart_accel_hold_until = 0.0 - self.lead_depart_accel_hold_floor = None - self.post_departure_follow_settle_until = 0.0 - self.duplicate_vision_comfort_lead_source = None - self.prev_experimental_mode = None - self.experimental_release_accel_until = 0.0 - - if self.is_preap: - try: - from openpilot.common.params import Params - self._preap_params = Params() - self.nap_adaptive_accel = self._preap_params.get_bool("NAPAdaptiveAccel") - except Exception: - self._preap_params = None - self.nap_adaptive_accel = False - - @property - def mlsim(self): - return is_tinygrad_model_version(self.generation) - - def get_mpc_mode(self) -> str: - if not self.mlsim: - return self.mode - return getattr(self.mpc, 'mode', 'acc') @staticmethod - def get_model_speed_error(model_msg, v_ego): - try: - temporal_pose = model_msg.temporalPoseDEPRECATED - except AttributeError: - try: - temporal_pose = model_msg.temporalPose - except AttributeError: - return 0.0 - if len(temporal_pose.trans): - return float(np.clip(temporal_pose.trans[0] - v_ego, -5.0, 5.0)) - return 0.0 - - @staticmethod - def parse_model(model_msg, model_error, v_ego, starpilot_toggles): - if (len(model_msg.position.x) == ModelConstants.IDX_N and - len(model_msg.velocity.x) == ModelConstants.IDX_N and - len(model_msg.acceleration.x) == ModelConstants.IDX_N): - x = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.position.x) - model_error * T_IDXS_MPC - v = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.velocity.x) - model_error - a = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.acceleration.x) - j = np.zeros(len(T_IDXS_MPC)) - else: - x = np.zeros(len(T_IDXS_MPC)) - v = np.zeros(len(T_IDXS_MPC)) - a = np.zeros(len(T_IDXS_MPC)) - j = np.zeros(len(T_IDXS_MPC)) - - if starpilot_toggles.taco_tune: - max_lat_accel = np.interp(v_ego, [5, 10, 20], [1.5, 2.0, 3.0]) - curvatures = np.interp(T_IDXS_MPC, ModelConstants.T_IDXS, model_msg.orientationRate.z) / np.clip(v, 0.3, 100.0) - max_v = np.sqrt(max_lat_accel / (np.abs(curvatures) + 1e-3)) - 2.0 - v = np.minimum(max_v, v) - - if len(model_msg.meta.disengagePredictions.gasPressProbs) > 1: - throttle_prob = model_msg.meta.disengagePredictions.gasPressProbs[1] - else: - throttle_prob = 1.0 - return x, v, a, j, throttle_prob - - @staticmethod - def get_model_launch_accel(model_v, model_a, action_t, v_ego): - if len(model_v) != len(T_IDXS_MPC) or len(model_a) != len(T_IDXS_MPC): - return None - if float(np.interp(MODEL_LAUNCH_COMMIT_TIME, T_IDXS_MPC, model_v)) <= MODEL_LAUNCH_DISARM_SPEED: - return None - - moving_idxs = np.flatnonzero(np.asarray(model_v) > MODEL_LAUNCH_MOVING_SPEED) - if len(moving_idxs) == 0: - return None - - t_cut = min(float(T_IDXS_MPC[int(moving_idxs[0])]), MODEL_LAUNCH_COMMIT_TIME) - shifted_t = T_IDXS_MPC + t_cut - shifted_v = np.interp(shifted_t, T_IDXS_MPC, model_v) - shifted_a = np.interp(shifted_t, T_IDXS_MPC, model_a) - safe_action_t = max(float(action_t), 1e-3) - v_target = float(np.interp(safe_action_t, T_IDXS_MPC, shifted_v)) - a_launch = 2.0 * (v_target - float(shifted_v[0])) / safe_action_t - float(shifted_a[0]) - accel_cap = float(np.interp( - float(v_ego), - [MODEL_LAUNCH_MOVING_SPEED, MODEL_LAUNCH_DISARM_SPEED], - [MODEL_LAUNCH_MAX_ACCEL, 0.0], - )) - return float(np.clip(a_launch, 0.0, accel_cap)) - - def get_close_lead_brake_cap(self, lead, v_ego, accel_min): - if lead is None or not lead.status: - return None - - lead_brake = max(0.0, -float(lead.aLeadK)) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - closing_speed = max(0.0, v_ego - lead.vLead) - projected_closing_speed = closing_speed + lead_brake * reaction_t - if projected_closing_speed < 0.1 and lead_brake < 0.5: - return None - - target_gap = float(np.clip(2.0 + 0.2 * v_ego, 2.0, 6.0)) - delay_buffer = projected_closing_speed * reaction_t - available_gap = max(float(lead.dRel) - target_gap - delay_buffer, 0.5) - projected_ttc = available_gap / max(projected_closing_speed, 0.1) - if projected_ttc > CLOSE_LEAD_BRAKE_CAP_MAX_TTC: - return None - required_decel = (projected_closing_speed ** 2) / (2.0 * available_gap) + 0.7 * lead_brake - if required_decel < 0.2: - return None - - return max(accel_min, -required_decel) - - @staticmethod - def get_inside_gap_closing_lead_accel_cap(lead, v_ego, accel_min, t_follow): - if lead is None or not lead.status: - return None - - ego_speed = float(v_ego) - lead_speed = max(float(getattr(lead, "vLead", 0.0)), 0.0) - if ego_speed < INSIDE_GAP_CLOSING_MIN_EGO_SPEED or lead_speed < INSIDE_GAP_CLOSING_MIN_LEAD_SPEED: - return None - if abs(float(getattr(lead, "yRel", 0.0))) > INSIDE_GAP_CLOSING_MAX_LATERAL_OFFSET: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < INSIDE_GAP_CLOSING_VISION_MIN_MODEL_PROB: - return None - - closing_speed = ego_speed - lead_speed - if closing_speed < INSIDE_GAP_CLOSING_MIN_SPEED: - return None - - desired_gap = float(desired_follow_distance(ego_speed, lead_speed, float(t_follow))) - gap_deficit = desired_gap - float(lead.dRel) - trigger_deficit = max(INSIDE_GAP_CLOSING_MIN_DEFICIT, - INSIDE_GAP_CLOSING_DEFICIT_RATIO * desired_gap) - if gap_deficit <= trigger_deficit: - return None - - brake_deficit = INSIDE_GAP_CLOSING_BRAKE_DEFICIT_RATIO * desired_gap - deficit_factor = float(np.clip( - (gap_deficit - brake_deficit) / max(brake_deficit, 1.0), - 0.0, - 1.0, - )) - closing_factor = float(np.clip( - (closing_speed - INSIDE_GAP_CLOSING_BRAKE_MIN_SPEED) / - (INSIDE_GAP_CLOSING_FULL_SPEED - INSIDE_GAP_CLOSING_BRAKE_MIN_SPEED), - 0.0, - 1.0, - )) - required_decel = 0.45 * deficit_factor + 0.20 * closing_factor - required_decel = min(required_decel, INSIDE_GAP_CLOSING_MAX_DECEL) - return max(float(accel_min), -required_decel) - - def get_vision_lead_approach_cap(self, lead, v_ego, accel_min, t_follow): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_LEAD_APPROACH_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(lead.aLeadK)) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - closing_speed = max(0.0, v_ego - lead.vLead) - projected_closing_speed = closing_speed + lead_brake * reaction_t - if projected_closing_speed < VISION_LEAD_APPROACH_MIN_CLOSING_SPEED: - return None - - tight_follow_gap = float(t_follow * v_ego + VISION_LEAD_APPROACH_TIGHT_BUFFER) - gap_to_tight_follow = float(lead.dRel) - tight_follow_gap - time_to_tight_follow = gap_to_tight_follow / max(projected_closing_speed, 0.1) - if time_to_tight_follow > VISION_LEAD_APPROACH_TRIGGER_TIME: - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - if float(lead.dRel) > desired_gap + VISION_LEAD_APPROACH_TIGHT_BUFFER: - return None - - time_factor = float(np.clip((VISION_LEAD_APPROACH_TRIGGER_TIME - time_to_tight_follow) / - (VISION_LEAD_APPROACH_TRIGGER_TIME - VISION_LEAD_APPROACH_FULL_TIME), 0.0, 1.0)) - prob_factor = float(np.clip((lead_prob - VISION_LEAD_APPROACH_MIN_MODEL_PROB) / - (VISION_LEAD_APPROACH_FULL_MODEL_PROB - VISION_LEAD_APPROACH_MIN_MODEL_PROB), 0.0, 1.0)) - closing_factor = float(np.clip(projected_closing_speed / (VISION_LEAD_APPROACH_MIN_CLOSING_SPEED + 2.5), 0.0, 1.0)) - tight_follow_deficit = max(tight_follow_gap - float(lead.dRel), 0.0) - tight_follow_buffer = max(VISION_LEAD_APPROACH_DEFICIT_BUFFER_MIN, - VISION_LEAD_APPROACH_DEFICIT_BUFFER_GAIN * float(v_ego) + 1.0) - deficit_factor = float(np.clip(tight_follow_deficit / tight_follow_buffer, 0.0, 1.0)) - - approach_decel = VISION_LEAD_APPROACH_MAX_DECEL * time_factor * (0.45 + 0.55 * prob_factor) - approach_decel *= 0.6 + 0.4 * closing_factor - deficit_decel = VISION_LEAD_APPROACH_DEFICIT_MAX_DECEL * deficit_factor * prob_factor - deficit_decel *= 0.5 + 0.5 * closing_factor - approach_decel = max(approach_decel, deficit_decel) - - # If a tracked vision lead is already far inside the tight-follow window and - # it is actively braking, don't stay stuck at the softer comfort cap. - if deficit_factor >= VISION_LEAD_APPROACH_BRAKING_DEFICIT_MIN and lead_brake >= VISION_LEAD_APPROACH_BRAKING_MIN_LEAD_BRAKE: - braking_floor = float(np.interp( - lead_brake, - [VISION_LEAD_APPROACH_BRAKING_MIN_LEAD_BRAKE, VISION_LEAD_APPROACH_BRAKING_FULL_LEAD_BRAKE], - [VISION_LEAD_APPROACH_BRAKING_FLOOR_MIN_DECEL, VISION_LEAD_APPROACH_BRAKING_FLOOR_MAX_DECEL], - )) - braking_floor *= 0.85 + 0.15 * max(closing_factor, prob_factor) - approach_decel = max(approach_decel, braking_floor) - - if approach_decel < VISION_LEAD_APPROACH_MIN_DECEL: - return None - - return max(accel_min, -approach_decel) - - def get_vision_untracked_slow_lead_cap(self, lead, v_ego, accel_min): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - - lead_brake = max(0.0, -float(lead.aLeadK)) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - closing_speed = max(0.0, v_ego - lead.vLead) - projected_closing_speed = closing_speed + lead_brake * reaction_t - closing_ratio = projected_closing_speed / max(float(v_ego), 0.1) - projected_ttc = float(lead.dRel) / max(projected_closing_speed, 0.1) - - standard_entry = bool( - projected_closing_speed >= VISION_UNTRACKED_SLOW_LEAD_MIN_CLOSING_SPEED and - closing_ratio >= VISION_UNTRACKED_SLOW_LEAD_MIN_CLOSING_RATIO and - projected_ttc <= VISION_UNTRACKED_SLOW_LEAD_TRIGGER_TTC - ) - centered_relaxed_entry = ( - abs(float(getattr(lead, "yRel", 0.0))) <= VISION_UNTRACKED_SLOW_LEAD_RELAXED_ENTRY_MAX_LATERAL_OFFSET - ) - high_confidence_early_entry = bool( - centered_relaxed_entry and - lead_prob + 1e-6 >= VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_MODEL_PROB and - projected_closing_speed >= VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_SPEED and - closing_ratio >= VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_RATIO and - projected_ttc <= VISION_UNTRACKED_SLOW_LEAD_EARLY_TRIGGER_TTC - ) - near_early_entry = bool( - centered_relaxed_entry and - float(lead.dRel) <= VISION_UNTRACKED_SLOW_LEAD_NEAR_MAX_DISTANCE and - lead_prob + 1e-6 >= VISION_UNTRACKED_SLOW_LEAD_NEAR_MIN_MODEL_PROB and - projected_closing_speed >= VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_SPEED and - closing_ratio >= VISION_UNTRACKED_SLOW_LEAD_NEAR_MIN_CLOSING_RATIO and - projected_ttc <= VISION_UNTRACKED_SLOW_LEAD_EARLY_TRIGGER_TTC - ) - if not (standard_entry or high_confidence_early_entry or near_early_entry): - return None - - trigger_ttc = VISION_UNTRACKED_SLOW_LEAD_TRIGGER_TTC - min_closing_ratio = VISION_UNTRACKED_SLOW_LEAD_MIN_CLOSING_RATIO - if high_confidence_early_entry: - trigger_ttc = VISION_UNTRACKED_SLOW_LEAD_EARLY_TRIGGER_TTC - min_closing_ratio = VISION_UNTRACKED_SLOW_LEAD_EARLY_MIN_CLOSING_RATIO - if near_early_entry: - trigger_ttc = VISION_UNTRACKED_SLOW_LEAD_EARLY_TRIGGER_TTC - min_closing_ratio = VISION_UNTRACKED_SLOW_LEAD_NEAR_MIN_CLOSING_RATIO - - min_model_prob = VISION_UNTRACKED_SLOW_LEAD_MIN_MODEL_PROB - max_distance_time = VISION_UNTRACKED_SLOW_LEAD_MAX_DISTANCE_TIME - if float(lead.vLead) <= VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_LEAD_SPEED and \ - projected_ttc <= VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_TTC: - closing_relax = float(np.clip((projected_closing_speed - VISION_UNTRACKED_SLOW_LEAD_RELAXED_MIN_CLOSING_SPEED) / - (VISION_UNTRACKED_SLOW_LEAD_RELAXED_FULL_CLOSING_SPEED - - VISION_UNTRACKED_SLOW_LEAD_RELAXED_MIN_CLOSING_SPEED), 0.0, 1.0)) - ttc_relax = float(np.clip((VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_TTC - projected_ttc) / - (VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_TTC - - VISION_UNTRACKED_SLOW_LEAD_FULL_TTC), 0.0, 1.0)) - relax_factor = closing_relax * ttc_relax - min_model_prob = float(np.interp(relax_factor, [0.0, 1.0], - [VISION_UNTRACKED_SLOW_LEAD_MIN_MODEL_PROB, - VISION_UNTRACKED_SLOW_LEAD_RELAXED_MODEL_PROB])) - max_distance_time = float(np.interp(relax_factor, [0.0, 1.0], - [VISION_UNTRACKED_SLOW_LEAD_MAX_DISTANCE_TIME, - VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_DISTANCE_TIME])) - - max_distance = float(np.clip(max_distance_time * v_ego, - VISION_UNTRACKED_SLOW_LEAD_MIN_DISTANCE, - VISION_UNTRACKED_SLOW_LEAD_MAX_DISTANCE)) - if float(lead.dRel) > max_distance: - return None - - if lead_prob + 1e-6 < min_model_prob: - return None - - time_factor = float(np.clip((trigger_ttc - projected_ttc) / - (trigger_ttc - VISION_UNTRACKED_SLOW_LEAD_FULL_TTC), - 0.0, 1.0)) - prob_factor = float(np.clip((lead_prob - min_model_prob) / - (VISION_UNTRACKED_SLOW_LEAD_FULL_MODEL_PROB - min_model_prob), - 0.0, 1.0)) - closing_factor = float(np.clip((closing_ratio - min_closing_ratio) / - (VISION_UNTRACKED_SLOW_LEAD_FULL_CLOSING_RATIO - min_closing_ratio), - 0.0, 1.0)) - approach_decel = VISION_UNTRACKED_SLOW_LEAD_MAX_DECEL * self.untracked_slow_lead_decel_scale * np.clip( - 0.5 * time_factor + 0.3 * prob_factor + 0.2 * closing_factor, 0.0, 1.0) - if approach_decel < VISION_UNTRACKED_SLOW_LEAD_MIN_DECEL: - return None - - return max(accel_min, -approach_decel) - - @staticmethod - def get_vision_untracked_approach_lift_cap(lead, v_ego, t_follow): - """Trim throttle before a confident vision lead reaches the tracking window.""" - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - if float(v_ego) < VISION_UNTRACKED_APPROACH_LIFT_MIN_EGO_SPEED: - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_UNTRACKED_APPROACH_LIFT_MIN_MODEL_PROB: - return None - if abs(float(getattr(lead, "yRel", 0.0))) > VISION_UNTRACKED_APPROACH_LIFT_MAX_LATERAL_OFFSET: - return None - if float(lead.dRel) > VISION_UNTRACKED_APPROACH_LIFT_MAX_DISTANCE: - return None - - closing_speed = float(v_ego) - float(lead.vLead) - if closing_speed < VISION_UNTRACKED_APPROACH_LIFT_MIN_CLOSING_SPEED: - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - gap_excess = float(lead.dRel) - desired_gap - if gap_excess < VISION_UNTRACKED_APPROACH_LIFT_MIN_GAP_EXCESS: + def _model_stop_authority(model, v_ego): + if bool(getattr(model.action, "shouldStop", False)): + return 1.0 + if not len(model.position.x): return 0.0 - time_to_desired_gap = gap_excess / max(closing_speed, 0.1) - if time_to_desired_gap > VISION_UNTRACKED_APPROACH_LIFT_TRIGGER_TIME: - return None - - # This path only removes positive acceleration. Braking remains exclusively - # owned by lead tracking and the existing close-lead safety caps. - return float(np.interp( - time_to_desired_gap, - [VISION_UNTRACKED_APPROACH_LIFT_FULL_TIME, VISION_UNTRACKED_APPROACH_LIFT_TRIGGER_TIME], - [0.0, VISION_UNTRACKED_APPROACH_LIFT_MAX_ACCEL], - )) - - def update_vision_untracked_approach_lift_cap(self, raw_cap, output_a_target, prev_output_a_target, - now_t, untracked): - if untracked and raw_cap is not None: - if self.untracked_vision_approach_lift_cap is None: - self.untracked_vision_approach_lift_confirm_t = min( - self.untracked_vision_approach_lift_confirm_t + self.dt, - VISION_UNTRACKED_APPROACH_LIFT_CONFIRM_TIME, - ) - if self.untracked_vision_approach_lift_confirm_t >= VISION_UNTRACKED_APPROACH_LIFT_CONFIRM_TIME: - self.untracked_vision_approach_lift_cap = float(prev_output_a_target) - if self.untracked_vision_approach_lift_cap is not None: - self.untracked_vision_approach_lift_target = float(raw_cap) - self.untracked_vision_approach_lift_hold_until = now_t + VISION_UNTRACKED_APPROACH_LIFT_HOLD_TIME - elif self.untracked_vision_approach_lift_cap is None: - self.untracked_vision_approach_lift_confirm_t = 0.0 - - active_cap = self.untracked_vision_approach_lift_cap - if active_cap is None: - return None - - holding = untracked and now_t < self.untracked_vision_approach_lift_hold_until - target = self.untracked_vision_approach_lift_target if holding else float(output_a_target) - if target is None: - target = float(output_a_target) - - lower = active_cap - VISION_UNTRACKED_APPROACH_LIFT_RATE_DOWN * self.dt - upper = active_cap + VISION_UNTRACKED_APPROACH_LIFT_RATE_UP * self.dt - active_cap = float(np.clip(target, lower, upper)) - self.untracked_vision_approach_lift_cap = active_cap - - if not holding and active_cap >= float(output_a_target) - 1e-6: - self.untracked_vision_approach_lift_confirm_t = 0.0 - self.untracked_vision_approach_lift_cap = None - self.untracked_vision_approach_lift_target = None - self.untracked_vision_approach_lift_hold_until = 0.0 - return None - - return active_cap - - def get_vision_slow_stopped_lead_cap(self, lead, v_ego, accel_min, t_follow): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_SLOW_LEAD_MIN_MODEL_PROB or float(lead.vLead) > VISION_SLOW_LEAD_MAX_SPEED: - return None - - lead_brake = max(0.0, -float(lead.aLeadK)) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - closing_speed = max(0.0, v_ego - lead.vLead) - projected_closing_speed = closing_speed + lead_brake * reaction_t - if projected_closing_speed < VISION_SLOW_LEAD_MIN_CLOSING_SPEED: - return None - - stop_gap = float(max(STOP_DISTANCE + 1.0, 2.5 + 0.15 * max(float(lead.vLead), 0.0))) - delay_buffer = projected_closing_speed * reaction_t - available_gap = max(float(lead.dRel) - stop_gap - delay_buffer, 0.5) - projected_ttc = available_gap / max(projected_closing_speed, 0.1) - if projected_ttc > VISION_SLOW_LEAD_TRIGGER_TTC: - return None - - time_factor = float(np.clip((VISION_SLOW_LEAD_TRIGGER_TTC - projected_ttc) / - (VISION_SLOW_LEAD_TRIGGER_TTC - VISION_SLOW_LEAD_FULL_TTC), 0.0, 1.0)) - prob_factor = float(np.clip((lead_prob - VISION_SLOW_LEAD_MIN_MODEL_PROB) / - (VISION_LEAD_APPROACH_FULL_MODEL_PROB - VISION_SLOW_LEAD_MIN_MODEL_PROB), 0.0, 1.0)) - speed_factor = float(np.clip((VISION_SLOW_LEAD_MAX_SPEED - max(float(lead.vLead), 0.0)) / - VISION_SLOW_LEAD_MAX_SPEED, 0.0, 1.0)) - required_decel = (projected_closing_speed ** 2) / (2.0 * available_gap) - decel_scale = 0.45 + 0.35 * time_factor + 0.20 * speed_factor - approach_decel = min(VISION_SLOW_LEAD_MAX_DECEL, required_decel * decel_scale) - approach_decel *= 0.65 + 0.35 * prob_factor - if approach_decel < VISION_SLOW_LEAD_MIN_DECEL: - return None - - return max(accel_min, -approach_decel) - - def tracked_vision_lead_approach_needs_immediate_brake(self, lead, v_ego, approach_cap): - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - projected_closing_speed = max(0.0, v_ego - float(lead.vLead)) + lead_brake * reaction_t - bypass_distance = max(VISION_LEAD_APPROACH_CONFIRM_BYPASS_DISTANCE_MIN, - VISION_LEAD_APPROACH_CONFIRM_BYPASS_DISTANCE_TIME * float(v_ego)) - return ( - approach_cap <= -VISION_LEAD_APPROACH_CONFIRM_BYPASS_DECEL or - projected_closing_speed >= VISION_LEAD_APPROACH_CONFIRM_BYPASS_CLOSING_SPEED or - lead_brake >= VISION_LEAD_APPROACH_CONFIRM_BYPASS_LEAD_BRAKE or - float(lead.dRel) <= bypass_distance - ) - - def get_dynamic_t_follow(self, base_t_follow, lead, v_ego): - base_t_follow = float(base_t_follow) - target_t_follow = base_t_follow - - if lead is not None and lead.status: - lead_prob = float(getattr(lead, "modelProb", 1.0 if bool(getattr(lead, "radar", False)) else 0.0)) - if bool(getattr(lead, "radar", False)) or lead_prob >= VISION_LEAD_APPROACH_MIN_MODEL_PROB: - lead_brake = max(0.0, -float(lead.aLeadK)) - closing_speed = max(0.0, v_ego - lead.vLead) - if closing_speed >= LEAD_APPROACH_TFOLLOW_MIN_CLOSING_SPEED or lead_brake >= LEAD_APPROACH_TFOLLOW_MIN_LEAD_BRAKE: - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, base_t_follow)) - approach_window = max(LEAD_APPROACH_TFOLLOW_WINDOW_MIN, LEAD_APPROACH_TFOLLOW_WINDOW_GAIN * float(v_ego)) - if float(lead.dRel) <= desired_gap + approach_window: - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - projected_closing_speed = closing_speed + 0.5 * lead_brake * reaction_t - gap_to_follow = max(float(lead.dRel) - desired_gap, 0.0) - time_to_follow = gap_to_follow / max(projected_closing_speed, 0.1) - time_factor = float(np.clip((LEAD_APPROACH_TFOLLOW_TRIGGER_TIME - time_to_follow) / - (LEAD_APPROACH_TFOLLOW_TRIGGER_TIME - LEAD_APPROACH_TFOLLOW_FULL_TIME), 0.0, 1.0)) - closing_factor = float(np.clip(closing_speed / LEAD_APPROACH_TFOLLOW_MAX_CLOSING_SPEED, 0.0, 1.0)) - brake_factor = float(np.clip(lead_brake / LEAD_APPROACH_TFOLLOW_MAX_LEAD_BRAKE, 0.0, 1.0)) - target_delta = LEAD_APPROACH_TFOLLOW_MAX_DELTA * np.clip( - 0.55 * time_factor + 0.25 * closing_factor + 0.20 * brake_factor, 0.0, 1.0) - if not bool(getattr(lead, "radar", False)): - gap_deficit = max(desired_gap - float(lead.dRel), 0.0) - gap_buffer = max(VISION_LEAD_TFOLLOW_GAP_BUFFER_MIN, - VISION_LEAD_TFOLLOW_GAP_BUFFER_GAIN * float(v_ego)) - gap_factor = float(np.clip(gap_deficit / gap_buffer, 0.0, 1.0)) - slow_lead_factor = float(np.clip((VISION_LEAD_TFOLLOW_SLOW_LEAD_SPEED - float(lead.vLead)) / - VISION_LEAD_TFOLLOW_SLOW_LEAD_SPEED, 0.0, 1.0)) - vision_extra = VISION_LEAD_TFOLLOW_MAX_EXTRA_DELTA * np.clip( - 0.40 * time_factor + 0.30 * gap_factor + 0.20 * slow_lead_factor + 0.10 * closing_factor, - 0.0, 1.0) - target_delta += vision_extra - target_t_follow = base_t_follow + float(target_delta) - - if self.effective_t_follow is None: - self.effective_t_follow = base_t_follow - - rate = LEAD_APPROACH_TFOLLOW_RATE_UP if target_t_follow > self.effective_t_follow else LEAD_APPROACH_TFOLLOW_RATE_DOWN - step = rate * self.dt - self.effective_t_follow = float(np.clip(target_t_follow, self.effective_t_follow - step, self.effective_t_follow + step)) - self.effective_t_follow = max(base_t_follow, self.effective_t_follow) - return self.effective_t_follow - - def get_vision_low_speed_stop_buffer_cap(self, lead, v_ego, accel_min): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None, False - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_LOW_SPEED_STOP_BUFFER_MIN_MODEL_PROB: - return None, False - - lead_speed = max(float(lead.vLead), 0.0) - relative_speed = float(v_ego) - lead_speed - closing_speed = max(0.0, v_ego - lead_speed) - entry_context = ( - v_ego <= VISION_LOW_SPEED_STOP_BUFFER_MAX_EGO_SPEED and - lead_speed <= VISION_LOW_SPEED_STOP_BUFFER_MAX_LEAD_SPEED and - closing_speed >= VISION_LOW_SPEED_STOP_BUFFER_MIN_CLOSING_SPEED - ) - hold_context = ( - v_ego <= VISION_LOW_SPEED_STOP_BUFFER_MAX_EGO_SPEED and - lead_speed <= VISION_LOW_SPEED_STOP_BUFFER_HOLD_MAX_LEAD_SPEED and - relative_speed >= VISION_LOW_SPEED_STOP_BUFFER_MIN_HOLD_REL_SPEED - ) - - now_t = time.monotonic() - entry_buffer = max(3.2, VISION_LOW_SPEED_STOP_BUFFER_BASE + - VISION_LOW_SPEED_STOP_BUFFER_EGO_GAIN * float(v_ego) + - VISION_LOW_SPEED_STOP_BUFFER_LEAD_GAIN * lead_speed) - release_buffer = entry_buffer + VISION_LOW_SPEED_STOP_BUFFER_RELEASE_MARGIN - if entry_context and float(lead.dRel) <= entry_buffer: - self.vision_low_speed_stop_hold_until = now_t + VISION_LOW_SPEED_STOP_BUFFER_HOLD_TIME - - latched = now_t < self.vision_low_speed_stop_hold_until - active = bool( - (entry_context and float(lead.dRel) <= entry_buffer) or - (latched and hold_context and float(lead.dRel) <= release_buffer) - ) - if not active: - return None, False - - min_stop_brake = VISION_LOW_SPEED_STOP_BUFFER_MIN_BRAKE + VISION_LOW_SPEED_STOP_BUFFER_BRAKE_GAIN * float(v_ego) - return max(accel_min, -min_stop_brake), True - - def get_vision_close_stop_hold_cap(self, lead, v_ego, accel_min, should_stop): - if not should_stop or lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_CLOSE_STOP_HOLD_MIN_MODEL_PROB: - return None - - lead_speed = max(float(lead.vLead), 0.0) - near_standstill_settle = bool( - float(v_ego) <= VISION_CLOSE_SETTLE_MAX_EGO_SPEED and - lead_speed <= VISION_CLOSE_SETTLE_MAX_LEAD_SPEED and - float(lead.dRel) <= VISION_CLOSE_SETTLE_MAX_DISTANCE - ) - max_lead_speed = VISION_CLOSE_SETTLE_MAX_LEAD_SPEED if near_standstill_settle else VISION_CLOSE_STOP_HOLD_MAX_LEAD_SPEED - max_distance = VISION_CLOSE_SETTLE_MAX_DISTANCE if near_standstill_settle else VISION_CLOSE_STOP_HOLD_MAX_DISTANCE - if ( - float(v_ego) > VISION_CLOSE_STOP_HOLD_MAX_EGO_SPEED or - lead_speed > max_lead_speed or - float(lead.dRel) > max_distance - ): - return None - - distance_factor = float(np.clip((max_distance - float(lead.dRel)) / - max(max_distance - 1.8, 0.1), 0.0, 1.0)) - speed_factor = float(np.clip(float(v_ego) / max(VISION_CLOSE_STOP_HOLD_MAX_EGO_SPEED, 0.1), 0.0, 1.0)) - hold_brake = VISION_CLOSE_STOP_HOLD_MIN_BRAKE + 0.08 * distance_factor + 0.08 * speed_factor - if near_standstill_settle: - settle_brake = VISION_CLOSE_SETTLE_MIN_BRAKE + 0.10 * distance_factor + 0.04 * speed_factor - hold_brake = max(hold_brake, settle_brake) - hold_brake = float(np.clip(hold_brake, VISION_CLOSE_STOP_HOLD_MIN_BRAKE, VISION_CLOSE_STOP_HOLD_MAX_BRAKE)) - brake_floor = -hold_brake - return brake_floor if accel_min >= 0.0 else max(accel_min, brake_floor) - - def get_vision_close_release_hold_cap(self, lead, v_ego, accel_min, should_stop): - if should_stop or lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_CLOSE_RELEASE_HOLD_MIN_MODEL_PROB: - return None - - lead_speed = max(float(lead.vLead), 0.0) - lead_delta = lead_speed - float(v_ego) - near_standstill_settle = bool( - float(v_ego) <= VISION_CLOSE_SETTLE_MAX_EGO_SPEED and - lead_speed <= VISION_CLOSE_SETTLE_MAX_LEAD_SPEED and - float(lead.dRel) <= VISION_CLOSE_SETTLE_MAX_DISTANCE and - lead_delta <= VISION_CLOSE_SETTLE_MAX_LEAD_DELTA - ) - max_lead_speed = VISION_CLOSE_SETTLE_MAX_LEAD_SPEED if near_standstill_settle else VISION_CLOSE_RELEASE_HOLD_MAX_LEAD_SPEED - max_distance = VISION_CLOSE_SETTLE_MAX_DISTANCE if near_standstill_settle else VISION_CLOSE_RELEASE_HOLD_MAX_DISTANCE - max_lead_delta = VISION_CLOSE_SETTLE_MAX_LEAD_DELTA if near_standstill_settle else VISION_CLOSE_RELEASE_HOLD_MAX_LEAD_DELTA - if ( - float(v_ego) > VISION_CLOSE_RELEASE_HOLD_MAX_EGO_SPEED or - lead_speed > max_lead_speed or - float(lead.dRel) > max_distance or - lead_delta < VISION_CLOSE_RELEASE_HOLD_MIN_LEAD_DELTA or - lead_delta > max_lead_delta - ): - return None - - distance_factor = float(np.clip((max_distance - float(lead.dRel)) / - max(max_distance - 2.8, 0.1), 0.0, 1.0)) - speed_factor = float(np.clip(float(v_ego) / max(VISION_CLOSE_RELEASE_HOLD_MAX_EGO_SPEED, 0.1), 0.0, 1.0)) - delta_factor = float(np.clip((max_lead_delta - lead_delta) / - max(max_lead_delta - VISION_CLOSE_RELEASE_HOLD_MIN_LEAD_DELTA, 0.1), - 0.0, 1.0)) - hold_brake = VISION_CLOSE_RELEASE_HOLD_MIN_BRAKE + 0.12 * distance_factor + 0.06 * speed_factor + 0.04 * delta_factor - if near_standstill_settle: - settle_brake = VISION_CLOSE_SETTLE_MIN_BRAKE + 0.08 * distance_factor + 0.02 * delta_factor - hold_brake = max(hold_brake, settle_brake) - hold_brake = float(np.clip(hold_brake, VISION_CLOSE_RELEASE_HOLD_MIN_BRAKE, VISION_CLOSE_RELEASE_HOLD_MAX_BRAKE)) - brake_floor = -hold_brake - return brake_floor if accel_min >= 0.0 else max(accel_min, brake_floor) - - def get_vision_close_settle_cap(self, lead, v_ego, accel_min, stop_guard_active): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < VISION_CLOSE_STOP_HOLD_MIN_MODEL_PROB: - return None - - lead_speed = max(float(lead.vLead), 0.0) - lead_delta = lead_speed - float(v_ego) - if ( - float(v_ego) > VISION_CLOSE_SETTLE_MAX_EGO_SPEED or - lead_speed > VISION_CLOSE_SETTLE_MAX_LEAD_SPEED or - float(lead.dRel) > VISION_CLOSE_SETTLE_MAX_DISTANCE or - lead_delta > VISION_CLOSE_SETTLE_MAX_LEAD_DELTA - ): - return None - - if not stop_guard_active and lead_delta < 0.0: - return None - - distance_factor = float(np.clip((VISION_CLOSE_SETTLE_MAX_DISTANCE - float(lead.dRel)) / - max(VISION_CLOSE_SETTLE_MAX_DISTANCE - 2.8, 0.1), 0.0, 1.0)) - delta_factor = float(np.clip((VISION_CLOSE_SETTLE_MAX_LEAD_DELTA - lead_delta) / - max(VISION_CLOSE_SETTLE_MAX_LEAD_DELTA, 0.1), 0.0, 1.0)) - hold_brake = VISION_CLOSE_SETTLE_MIN_BRAKE + 0.10 * distance_factor + 0.04 * delta_factor - hold_brake = float(np.clip(hold_brake, VISION_CLOSE_SETTLE_MIN_BRAKE, VISION_CLOSE_SETTLE_MAX_BRAKE)) - brake_floor = -hold_brake - return brake_floor if accel_min >= 0.0 else max(accel_min, brake_floor) - - def get_vision_close_final_guard_cap(self, lead, v_ego, accel_min): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - lead_speed = max(float(lead.vLead), 0.0) - if ( - lead_prob < VISION_CLOSE_STOP_HOLD_MIN_MODEL_PROB or - float(v_ego) > VISION_CLOSE_FINAL_GUARD_MAX_EGO_SPEED or - lead_speed > VISION_CLOSE_FINAL_GUARD_MAX_LEAD_SPEED or - float(lead.dRel) > VISION_CLOSE_FINAL_GUARD_MAX_DISTANCE - ): - return None - - distance_factor = float(np.clip((VISION_CLOSE_FINAL_GUARD_MAX_DISTANCE - float(lead.dRel)) / - max(VISION_CLOSE_FINAL_GUARD_MAX_DISTANCE - 2.8, 0.1), 0.0, 1.0)) - hold_brake = VISION_CLOSE_FINAL_GUARD_MIN_BRAKE + 0.10 * distance_factor - hold_brake = float(np.clip(hold_brake, VISION_CLOSE_FINAL_GUARD_MIN_BRAKE, VISION_CLOSE_FINAL_GUARD_MAX_BRAKE)) - brake_floor = -hold_brake - return brake_floor if accel_min >= 0.0 else max(accel_min, brake_floor) - - def _update_manual_stop_resume_override(self, sm): - now_t = time.monotonic() - lead = sm["radarState"].leadOne - no_lead = not bool(getattr(lead, "status", False)) - try: - starpilot_car_state = sm["starpilotCarState"] - except KeyError: - starpilot_car_state = None - accel_pressed = bool(getattr(starpilot_car_state, "accelPressed", False)) - model_should_stop = bool(getattr(sm["modelV2"].action, "shouldStop", False)) - standstill = bool(getattr(sm["carState"], "standstill", False)) - forcing_stop = bool(getattr(sm["starpilotPlan"], "forcingStop", False)) - red_light = bool(getattr(sm["starpilotPlan"], "redLight", False)) - - if standstill and no_lead and accel_pressed and (forcing_stop or red_light or model_should_stop): - self.manual_stop_resume_override_until = now_t + MANUAL_STOP_RESUME_OVERRIDE_TIME - - return bool( - no_lead and - float(getattr(sm["carState"], "vEgo", 0.0)) < MANUAL_STOP_RESUME_OVERRIDE_MAX_SPEED and - now_t < self.manual_stop_resume_override_until - ) - - def is_confident_lead_depart(self, lead, v_ego): - if lead is None or not lead.status: - return False - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB: - return False - - lead_speed = max(float(lead.vLead), 0.0) - lead_delta = lead_speed - float(v_ego) - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - return bool( - float(lead.dRel) >= LEAD_DEPART_CONFIDENT_MIN_GAP and - float(lead.dRel) <= LEAD_DEPART_CONFIDENT_MAX_GAP and - lead_speed >= LEAD_DEPART_CONFIDENT_MIN_LEAD_SPEED and - lead_delta >= LEAD_DEPART_CONFIDENT_MIN_LEAD_DELTA and - lead_accel >= LEAD_DEPART_CONFIDENT_MIN_LEAD_ACCEL - ) - - def is_slow_creep_lead_depart(self, lead, v_ego, standstill_nudge_gap): - if lead is None or not lead.status: - return False - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < STANDSTILL_STOPPED_LEAD_GUARD_MIN_MODEL_PROB: - return False - - if abs(float(getattr(lead, "yRel", 0.0))) > STANDSTILL_STOPPED_LEAD_GUARD_MAX_LATERAL_OFFSET: - return False - - lead_gap = float(getattr(lead, "dRel", 0.0)) - lead_speed = max(float(getattr(lead, "vLead", 0.0)), 0.0) - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - return bool( - float(v_ego) <= STANDSTILL_LEAD_DEPART_MAX_EGO_SPEED and - lead_gap >= standstill_nudge_gap + STANDSTILL_LEAD_CREEP_RELEASE_MIN_GAP_MARGIN and - lead_speed >= STANDSTILL_LEAD_CREEP_RELEASE_MIN_LEAD_SPEED and - lead_accel >= STANDSTILL_LEAD_CREEP_RELEASE_MIN_LEAD_ACCEL - ) - - def get_safe_depart_release_hold_lead(self, v_ego): - credible_leads = [ - lead for lead in (self.lead_one, self.lead_two) - if lead is not None and - bool(getattr(lead, "status", False)) and - (bool(getattr(lead, "radar", False)) or - float(getattr(lead, "modelProb", 0.0)) >= LEAD_DEPART_RELEASE_HOLD_MIN_MODEL_PROB) and - abs(float(getattr(lead, "yRel", 0.0))) <= LEAD_DEPART_RELEASE_HOLD_MAX_LATERAL_OFFSET - ] - moving_leads = [ - lead for lead in credible_leads - if float(getattr(lead, "dRel", 0.0)) >= LEAD_DEPART_RELEASE_HOLD_MIN_DISTANCE and - float(getattr(lead, "vLead", 0.0)) >= LEAD_DEPART_RELEASE_HOLD_MIN_LEAD_SPEED and - float(getattr(lead, "vLead", 0.0)) - float(v_ego) >= LEAD_DEPART_RELEASE_HOLD_MIN_LEAD_DELTA and - max(0.0, -float(getattr(lead, "aLeadK", 0.0))) <= LEAD_DEPART_RELEASE_HOLD_MAX_LEAD_BRAKE - ] - if not moving_leads: - return None - - selected_lead = min(moving_leads, key=lambda lead: float(lead.dRel)) - stopped_conflict = any( - lead is not selected_lead and - float(getattr(lead, "dRel", float("inf"))) <= float(selected_lead.dRel) + LEAD_DEPART_RELEASE_HOLD_CONFLICT_DISTANCE_MARGIN and - float(getattr(lead, "vLead", 0.0)) < LEAD_DEPART_RELEASE_HOLD_CONFLICT_SPEED - for lead in credible_leads - ) - return None if stopped_conflict else selected_lead - - def get_vehicle_far_follow_slew_target(self, v_ego, prev_target, target, output_should_stop, panic_bypass): - if self.far_follow_brake_slew_rate <= 0.0 or self.far_follow_release_slew_rate <= 0.0 or output_should_stop or panic_bypass: - self.far_follow_output_slew_active = False - return target - - centered_leads = [ - lead for lead in (self.lead_one, self.lead_two) - if bool(getattr(lead, "status", False)) and - abs(float(getattr(lead, "yRel", 0.0))) <= VEHICLE_FAR_FOLLOW_SLEW_MAX_LATERAL_OFFSET - ] - safe_far_follow = bool(centered_leads and float(v_ego) >= VEHICLE_FAR_FOLLOW_SLEW_MIN_SPEED) - for lead in centered_leads: - distance = float(getattr(lead, "dRel", 0.0)) - closing_speed = max(0.0, float(v_ego) - float(getattr(lead, "vLead", v_ego))) - ttc = distance / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - headway = distance / max(float(v_ego), 1e-3) - safe_far_follow &= bool( - distance >= max(VEHICLE_FAR_FOLLOW_SLEW_MIN_DISTANCE, - VEHICLE_FAR_FOLLOW_SLEW_MIN_DISTANCE_TIME * float(v_ego)) and - headway >= VEHICLE_FAR_FOLLOW_SLEW_MIN_HEADWAY and - ttc >= VEHICLE_FAR_FOLLOW_SLEW_MIN_TTC - ) - - slew_was_active = self.far_follow_output_slew_active - self.far_follow_output_slew_active = safe_far_follow - if not safe_far_follow or not slew_was_active: - return target - - return float(np.clip( - target, - float(prev_target) - self.far_follow_brake_slew_rate * self.dt, - float(prev_target) + self.far_follow_release_slew_rate * self.dt, - )) + model_length = max(float(model.position.x[-1]), 0.0) + horizon = model_length / max(float(v_ego), 1.0) + end_speed = float(model.velocity.x[-1]) if len(model.velocity.x) else float(v_ego) + time_score = 1.0 - _smoothstep(horizon, MODEL_STOP_FULL_TIME, MODEL_STOP_BEGIN_TIME) + speed_score = 1.0 - _smoothstep(end_speed, 0.5, MODEL_STOP_MIN_END_SPEED) + return float(time_score * speed_score) @staticmethod - def is_radar_standstill_gap_settle_candidate(lead, v_ego, target_gap, active=False): - if lead is None or not lead.status or not bool(getattr(lead, "radar", False)): - return False - if float(v_ego) > RADAR_STANDSTILL_GAP_SETTLE_MAX_EGO_SPEED: - return False - if abs(float(getattr(lead, "yRel", 0.0))) > RADAR_STANDSTILL_GAP_SETTLE_MAX_LATERAL_OFFSET: - return False - if abs(float(getattr(lead, "vLead", 0.0))) > RADAR_STANDSTILL_GAP_SETTLE_MAX_LEAD_SPEED: - return False + def _curve_authority(sm, v_ego): + curvature = abs(float(getattr(sm["starpilotPlan"], "roadCurvature", 0.0))) + lateral_accel = curvature * float(v_ego) ** 2 + curve_score = _smoothstep(lateral_accel, 0.7, 2.0) + turning = bool(sm["carState"].leftBlinker or sm["carState"].rightBlinker) + turn_score = 0.55 if turning and v_ego < 15.0 else 0.0 + return max(curve_score, turn_score) - lead_gap = float(getattr(lead, "dRel", 0.0)) - min_margin = RADAR_STANDSTILL_GAP_SETTLE_EXIT_MARGIN if active else RADAR_STANDSTILL_GAP_SETTLE_ENTRY_MARGIN - return bool( - lead_gap > target_gap + min_margin and - lead_gap <= target_gap + RADAR_STANDSTILL_GAP_SETTLE_MAX_EXTRA_GAP - ) - - def update_radar_standstill_gap_settle(self, sm, target_gap): - vetoed = bool( - getattr(sm["carState"], "brakePressed", False) or - getattr(sm["carState"], "gasPressed", False) or + def _get_model_authority(self, sm, v_ego, v_cruise, has_lead, model_first, stop_authority): + curve_authority = self._curve_authority(sm, v_ego) + hard_stop = bool( + getattr(sm["starpilotPlan"], "redLight", False) or getattr(sm["starpilotPlan"], "forcingStop", False) or - getattr(sm["starpilotPlan"], "redLight", False) + getattr(sm["starpilotPlan"], "stopSignConfirmed", False) ) - candidates = [ - lead for lead in (self.lead_one, self.lead_two) - if self.is_radar_standstill_gap_settle_candidate( - lead, - float(sm["carState"].vEgo), - target_gap, - active=self.radar_standstill_gap_settle_active, - ) + scene_authority = 1.0 if hard_stop else max(stop_authority, curve_authority) + + if not model_first: + return scene_authority + + cruise_error = max(0.0, float(v_cruise) - float(v_ego)) + open_road = not has_lead and scene_authority < 0.1 + open_road_blend = _smoothstep(cruise_error, 0.0, MODEL_FIRST_CRUISE_ERROR) + base_authority = ( + MODEL_FIRST_AUTHORITY + + (MODEL_FIRST_OPEN_ROAD_AUTHORITY - MODEL_FIRST_AUTHORITY) * open_road_blend + if open_road else MODEL_FIRST_AUTHORITY + ) + return max(scene_authority, base_authority) + + @staticmethod + def _lead_safety_cap(lead, v_ego, reaction_time, stop_buffer): + if lead is None or not bool(getattr(lead, "status", False)): + return None, False + + d_rel = max(float(getattr(lead, "dRel", 0.0)), 0.0) + v_lead = max(float(getattr(lead, "vLead", 0.0)), 0.0) + closing_speed = max(0.0, float(v_ego) - v_lead) + if closing_speed < RAW_SAFETY_MIN_CLOSING_SPEED: + return None, False + + lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) + projected_closing = closing_speed + lead_brake * reaction_time + available_distance = d_rel - stop_buffer - closing_speed * reaction_time + ttc = max(d_rel - stop_buffer, 0.0) / max(closing_speed, 1e-3) + + if available_distance <= 0.0: + return float(ACCEL_MIN), True + + required_decel = projected_closing ** 2 / (2.0 * available_distance) + required_decel += 0.35 * lead_brake + urgent = required_decel >= RAW_SAFETY_URGENT_DECEL or ttc <= RAW_SAFETY_URGENT_TTC + if required_decel < RAW_SAFETY_MIN_DECEL and not urgent: + return None, False + return -float(required_decel), urgent + + def _get_raw_safety_cap(self, sm, v_ego, reaction_time): + stop_buffer = ( + RAW_SAFETY_EXTRA_STOP_BUFFER + + float(getattr(sm["starpilotPlan"], "increasedStoppedDistance", 0.0)) + ) + caps = [ + self._lead_safety_cap(lead, v_ego, reaction_time, stop_buffer) + for lead in (sm["radarState"].leadOne, sm["radarState"].leadTwo) ] - - if vetoed or not candidates: - self.radar_standstill_gap_settle_elapsed = 0.0 - self.radar_standstill_gap_settle_active = False - return False - - if self.radar_standstill_gap_settle_active: - return True - - if not bool(sm["carState"].standstill): - self.radar_standstill_gap_settle_elapsed = 0.0 - return False - - self.radar_standstill_gap_settle_elapsed = min( - RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME, - self.radar_standstill_gap_settle_elapsed + self.dt, - ) - self.radar_standstill_gap_settle_active = ( - self.radar_standstill_gap_settle_elapsed + 1e-6 >= RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME - ) - return self.radar_standstill_gap_settle_active + valid_caps = [cap for cap, _ in caps if cap is not None] + return (min(valid_caps) if valid_caps else None), any(urgent for _, urgent in caps) @staticmethod - def get_centered_model_lead(model_data): - try: - leads = model_data.leadsV3 - except Exception: - return None + def _safe_departure(sm, model_accel, stop_buffer): + force_stop = bool(getattr(sm["starpilotPlan"], "forcingStop", False)) + stop_sign = bool(getattr(sm["starpilotPlan"], "stopSignConfirmed", False)) + if force_stop or stop_sign or bool(sm["carState"].brakePressed): + return False, False - best_candidate = None - for i in range(3): - try: - lead = leads[i] - prob = float(lead.prob) - x = float(lead.x[0]) - y = float(lead.y[0]) - v = float(lead.v[0]) - except Exception: - continue + leads = [lead for lead in (sm["radarState"].leadOne, sm["radarState"].leadTwo) + if bool(getattr(lead, "status", False))] + if not leads: + return model_accel >= DEPART_MODEL_MIN_ACCEL, False - if ( - prob < RADAR_DEPART_CONFLICT_MIN_MODEL_PROB or - x <= 0.0 or - x > RADAR_DEPART_CONFLICT_MAX_MODEL_DISTANCE or - abs(y) > RADAR_DEPART_CONFLICT_MAX_MODEL_LATERAL or - max(v, 0.0) > RADAR_DEPART_CONFLICT_MAX_MODEL_LEAD_SPEED - ): - continue - - if best_candidate is None or x < best_candidate[0]: - best_candidate = (x, y, v, prob) - - return best_candidate - - def has_offcenter_radar_depart_conflict(self, sm): - if float(getattr(sm["carState"], "vEgo", 0.0)) > RADAR_DEPART_CONFLICT_MAX_EGO_SPEED: - return False - - centered_model_lead = self.get_centered_model_lead(sm["modelV2"]) - if centered_model_lead is None: - return False - - centered_model_dist = float(centered_model_lead[0]) - for lead in (self.lead_one, self.lead_two): - if not lead.status or not bool(getattr(lead, "radar", False)): - continue - - lead_dist = float(getattr(lead, "dRel", 0.0)) - if lead_dist <= 0.0 or lead_dist > RADAR_DEPART_CONFLICT_MAX_RADAR_DISTANCE: - continue - if abs(float(getattr(lead, "yRel", 0.0))) < RADAR_DEPART_CONFLICT_MIN_RADAR_LATERAL: - continue - if abs(lead_dist - centered_model_dist) > RADAR_DEPART_CONFLICT_MAX_DISTANCE_MISMATCH: - continue - - return True - - return False - - def get_lead_depart_accel_floor(self, lead, v_ego, model_desired_accel): - if lead is None or not lead.status: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB: - return None - - lead_speed = max(float(lead.vLead), 0.0) + lead = min(leads, key=lambda item: float(item.dRel)) lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - lead_delta = lead_speed - float(v_ego) - confident_depart = self.is_confident_lead_depart(lead, v_ego) - min_lead_speed = LEAD_DEPART_CONFIDENT_MIN_LEAD_SPEED if confident_depart else LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_SPEED - min_lead_delta = LEAD_DEPART_CONFIDENT_MIN_LEAD_DELTA if confident_depart else LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_DELTA - min_gap = LEAD_DEPART_CONFIDENT_MIN_GAP if confident_depart else LEAD_DEPART_ACCEL_HOLD_MIN_GAP - min_model_accel = 0.0 if confident_depart else LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_ACCEL - if ( - float(v_ego) > LEAD_DEPART_ACCEL_HOLD_MAX_EGO_SPEED or - lead_speed < min_lead_speed or - lead_delta < min_lead_delta or - float(lead.dRel) < min_gap or - lead_brake > LEAD_DEPART_ACCEL_HOLD_MAX_LEAD_BRAKE or - float(model_desired_accel) < min_model_accel - ): - return None - - gap_factor = float(np.clip((float(lead.dRel) - LEAD_DEPART_ACCEL_HOLD_MIN_GAP) / - max(LEAD_DEPART_ACCEL_HOLD_FULL_GAP - LEAD_DEPART_ACCEL_HOLD_MIN_GAP, 0.1), 0.0, 1.0)) - lead_factor = float(np.clip((lead_speed - LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_SPEED) / - max(LEAD_DEPART_ACCEL_HOLD_FULL_LEAD_SPEED - LEAD_DEPART_ACCEL_HOLD_MIN_LEAD_SPEED, 0.1), 0.0, 1.0)) - accel_cap = LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL + (LEAD_DEPART_ACCEL_HOLD_MAX_ACCEL - LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL) * np.clip( - 0.55 * lead_factor + 0.45 * gap_factor, 0.0, 1.0) - assisted_model_accel = float(model_desired_accel) + LEAD_DEPART_ACCEL_ASSIST - return min(accel_cap, max(assisted_model_accel, LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL)) - - def get_reusable_lead_depart_accel_floor(self, lead, v_ego, t_follow): - if self.lead_depart_accel_hold_floor is None or lead is None or not lead.status: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < LEAD_DEPART_ACCEL_HOLD_MIN_MODEL_PROB: - return None - - if abs(float(getattr(lead, "yRel", 0.0))) > STANDSTILL_STOPPED_LEAD_GUARD_MAX_LATERAL_OFFSET: - return None - - d_rel = float(getattr(lead, "dRel", 0.0)) - if d_rel < LEAD_DEPART_ACCEL_HOLD_REUSE_MIN_GAP: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > LEAD_DEPART_ACCEL_HOLD_REUSE_MAX_LEAD_BRAKE: - return None - - closing_speed = max(float(v_ego) - float(getattr(lead, "vLead", 0.0)), 0.0) - if closing_speed > LEAD_DEPART_ACCEL_HOLD_REUSE_MAX_CLOSING_SPEED: - return None - - actual_headway = d_rel / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(t_follow) - if headway_margin < LEAD_DEPART_ACCEL_HOLD_REUSE_MIN_HEADWAY_MARGIN: - return None - - return float(self.lead_depart_accel_hold_floor) - - def get_low_speed_weak_lead_accel_cap(self, lead, v_ego): - if lead is None or not lead.status: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_MODEL_PROB: - return None - - d_rel = float(getattr(lead, "dRel", 0.0)) - lead_speed = max(float(getattr(lead, "vLead", 0.0)), 0.0) - lead_delta = lead_speed - float(v_ego) - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - lead_lateral = abs(float(getattr(lead, "yRel", 0.0))) - if ( - float(v_ego) > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_EGO_SPEED or - d_rel > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_DISTANCE or - lead_speed > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_SPEED or - lead_lateral > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LATERAL_OFFSET or - lead_delta > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_DELTA or - lead_accel > LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_ACCEL - ): - return None - - if ( - float(v_ego) <= LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MAX_EGO_SPEED and - d_rel >= LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_GAP and - lead_speed >= LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_SPEED and - lead_delta >= LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_DELTA and - lead_accel >= LOW_SPEED_WEAK_LEAD_ACCEL_CAP_STRONG_DEPART_MIN_LEAD_ACCEL - ): - return None - - distance_factor = float(np.clip( - (d_rel - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_DISTANCE) / - max(LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_DISTANCE - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_DISTANCE, 0.1), - 0.0, 1.0, - )) - delta_factor = float(np.clip( - (lead_delta - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_DELTA) / - max(LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_DELTA - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_DELTA, 0.1), - 0.0, 1.0, - )) - accel_factor = float(np.clip( - (lead_accel - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_ACCEL) / - max(LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_LEAD_ACCEL - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_LEAD_ACCEL, 0.1), - 0.0, 1.0, - )) - cap_strength = float(np.clip(0.5 * distance_factor + 0.3 * delta_factor + 0.2 * accel_factor, 0.0, 1.0)) - return LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_ACCEL + ( - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MAX_ACCEL - LOW_SPEED_WEAK_LEAD_ACCEL_CAP_MIN_ACCEL - ) * cap_strength - - def get_standstill_stopped_lead_guard_cap(self, lead, v_ego, accel_min, stop_distance, - release_ready, confident_depart_ready): - if lead is None or not lead.status or release_ready or confident_depart_ready: - return None - if float(v_ego) > STANDSTILL_STOPPED_LEAD_GUARD_MAX_EGO_SPEED: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < STANDSTILL_STOPPED_LEAD_GUARD_MIN_MODEL_PROB: - return None - - if abs(float(getattr(lead, "yRel", 0.0))) > STANDSTILL_STOPPED_LEAD_GUARD_MAX_LATERAL_OFFSET: - return None - - lead_speed = max(float(getattr(lead, "vLead", 0.0)), 0.0) - lead_delta = lead_speed - float(v_ego) - max_distance = max( - STANDSTILL_STOPPED_LEAD_GUARD_MIN_DISTANCE, - float(stop_distance) + STANDSTILL_STOPPED_LEAD_GUARD_DISTANCE_MARGIN, + candidate = bool( + float(lead.vLead) >= DEPART_LEAD_MIN_SPEED and + float(lead.dRel) >= stop_buffer + DEPART_LEAD_MIN_GAP and + lead_brake <= DEPART_LEAD_MAX_BRAKE ) - if ( - float(getattr(lead, "dRel", float("inf"))) > max_distance or - lead_speed > STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_SPEED or - lead_delta > STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_DELTA - ): - return None + return candidate, candidate and float(lead.vLead) >= DEPART_LEAD_FAST_SPEED - distance_factor = float(np.clip((max_distance - float(lead.dRel)) / - max(max_distance - STANDSTILL_STOPPED_LEAD_GUARD_MIN_DISTANCE, 0.1), - 0.0, 1.0)) - speed_factor = float(np.clip(lead_speed / max(STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_SPEED, 0.1), 0.0, 1.0)) - delta_factor = float(np.clip((STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_DELTA - lead_delta) / - max(STANDSTILL_STOPPED_LEAD_GUARD_MAX_LEAD_DELTA, 0.1), - 0.0, 1.0)) - hold_brake = STANDSTILL_STOPPED_LEAD_GUARD_MIN_BRAKE + 0.06 * distance_factor + 0.02 * speed_factor + 0.02 * delta_factor - hold_brake = float(np.clip( - hold_brake, - STANDSTILL_STOPPED_LEAD_GUARD_MIN_BRAKE, - STANDSTILL_STOPPED_LEAD_GUARD_MAX_BRAKE, - )) - brake_floor = -hold_brake - return brake_floor if accel_min >= 0.0 else max(accel_min, brake_floor) + def _update_state(self, sm, v_ego, stop_request, safe_departure): + if stop_request: + self.stop_release_time = 0.0 + self.state = PlanState.stopped if v_ego <= STOPPED_SPEED else PlanState.stopping + return - def post_departure_follow_settle_active(self, lead, v_ego, t_follow): - if lead is None or not lead.status: - return False - if float(v_ego) < POST_DEPARTURE_FOLLOW_SETTLE_MIN_SPEED: - return False + if self.state in (PlanState.stopping, PlanState.stopped): + if safe_departure: + self.state = PlanState.departing + self.stop_release_time = 0.0 + else: + self.stop_release_time += self.dt + if self.stop_release_time >= STOP_RELEASE_TIME and v_ego > STOPPED_SPEED: + self.state = PlanState.moving + return - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < POST_DEPARTURE_FOLLOW_SETTLE_MIN_MODEL_PROB: - return False + if self.state == PlanState.departing and v_ego >= DEPART_COMPLETE_SPEED: + self.state = PlanState.moving + elif self.state == PlanState.departing and not safe_departure: + self.state = PlanState.stopped if v_ego <= STOPPED_SPEED else PlanState.stopping - if abs(float(getattr(lead, "yRel", 0.0))) > POST_DEPARTURE_FOLLOW_SETTLE_MAX_LATERAL_OFFSET: - return False - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(t_follow) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - closing_speed = max(float(v_ego) - float(lead.vLead), 0.0) - now = time.monotonic() - if now > self.post_departure_follow_settle_until: - self.post_departure_follow_settle_until = 0.0 - lead_delta = float(lead.vLead) - float(v_ego) - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - # Rolling launches can miss the standstill release edge that normally arms - # this latch. Confirm the same safe pull-away state from lead motion instead. - rolling_departure = ( - float(v_ego) <= POST_DEPARTURE_FOLLOW_SETTLE_MAX_ARM_SPEED and - lead_delta >= POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_LEAD_DELTA and - lead_accel >= POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_LEAD_ACCEL and - headway_margin >= POST_DEPARTURE_FOLLOW_SETTLE_ARM_MIN_HEADWAY_MARGIN - ) - if not rolling_departure: - return False - self.post_departure_follow_settle_until = now + POST_DEPARTURE_FOLLOW_SETTLE_LATCH_TIME - - if ( - headway_margin <= POST_DEPARTURE_FOLLOW_SETTLE_COMPLETE_HEADWAY_MARGIN or - lead_brake > POST_DEPARTURE_FOLLOW_SETTLE_MAX_LEAD_BRAKE or - closing_speed > POST_DEPARTURE_FOLLOW_SETTLE_MAX_CLOSING_SPEED - ): - self.post_departure_follow_settle_until = 0.0 - return False - - return True - - @staticmethod - def get_follow_accel_cap_allowance(lead, v_ego, t_follow): - if lead is None or not lead.status or float(v_ego) < FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_SPEED: - return 0.0 - - closing_speed = max(float(v_ego) - float(lead.vLead), 0.0) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(t_follow) - if (headway_margin <= FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_HEADWAY_MARGIN or - closing_speed >= FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_CLOSING_SPEED or - lead_brake >= FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_LEAD_BRAKE): - return 0.0 - - headway_factor = float(np.clip( - (headway_margin - FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_HEADWAY_MARGIN) / - (FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_HEADWAY_MARGIN - FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_HEADWAY_MARGIN), - 0.0, - 1.0, - )) - closing_factor = float(np.clip( - (FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_CLOSING_SPEED - closing_speed) / - (FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_CLOSING_SPEED - FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_CLOSING_SPEED), - 0.0, - 1.0, - )) - brake_factor = float(np.clip( - (FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_LEAD_BRAKE - lead_brake) / - FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_LEAD_BRAKE, - 0.0, - 1.0, - )) - return FOLLOW_ACCEL_CAP_ALLOWANCE_MAX_ACCEL * headway_factor * closing_factor * brake_factor - - def get_lead_catchup_accel_cap(self, lead, v_ego, t_follow, current_source=None, tracking_lead_active=False): - if lead is None or not lead.status: - return None - - if self.post_departure_follow_settle_active(lead, v_ego, t_follow): - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - low_speed_follow_window = ( - not lead_radar and - v_ego <= LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_SPEED and - lead_prob >= LOW_SPEED_FOLLOW_ACCEL_CAP_MIN_MODEL_PROB and - lead_brake <= LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_LEAD_BRAKE - ) - if v_ego < LEAD_CATCHUP_ACCEL_MIN_EGO and not low_speed_follow_window: - return None - - lead_delta = float(lead.vLead) - float(v_ego) - min_lead_delta = LOW_SPEED_FOLLOW_ACCEL_CAP_MIN_LEAD_DELTA if low_speed_follow_window else LEAD_CATCHUP_ACCEL_MIN_LEAD_DELTA - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - if low_speed_follow_window: - gap_buffer = max(LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_GAP_BUFFER_MIN, - LOW_SPEED_FOLLOW_ACCEL_CAP_MAX_GAP_BUFFER_GAIN * float(v_ego)) + def _update_allow_throttle(self, throttle_prob, v_ego): + if v_ego <= MIN_ALLOW_THROTTLE_SPEED: + self.allow_throttle = True + self._throttle_transition_time = 0.0 else: - gap_buffer = max(LEAD_CATCHUP_ACCEL_MAX_GAP_BUFFER_MIN, - LEAD_CATCHUP_ACCEL_MAX_GAP_BUFFER_GAIN * float(v_ego)) - gap_error = float(lead.dRel) - desired_gap - - radar_matched_follow_active = ( - lead_radar and - tracking_lead_active and - self.lead_is_matched_follow_window(lead, v_ego, t_follow) - ) - if radar_matched_follow_active and gap_error > (gap_buffer - RADAR_MATCHED_FOLLOW_CATCHUP_CAP_BUFFER_MARGIN): - return None - - if (radar_matched_follow_active and current_source == "cruise" and - gap_error <= RADAR_MATCHED_FOLLOW_CATCHUP_HOLD_MAX_GAP_ERROR and - lead_delta < min_lead_delta): - return RADAR_MATCHED_FOLLOW_CATCHUP_HOLD_CAP - - if lead_delta < min_lead_delta: - return None - - if gap_error > gap_buffer: - return None - - # Keep the near-target cap conservative, then continuously relax it when - # there is real headway to use. Avoid binary bypasses around zero vRel. - if low_speed_follow_window: - edge_cap = float(np.interp(lead_delta, [min_lead_delta, 0.0, 1.0, 2.0], [0.20, 0.24, 0.38, 0.55])) - near_cap = min(edge_cap, 0.16) - else: - edge_cap = float(np.interp(lead_delta, [-0.5, 0.0, 1.0], [0.16, 0.08, 0.02])) - near_cap = min(edge_cap, 0.03) - gap_factor = float(np.clip(max(gap_error, 0.0) / max(gap_buffer, 0.1), 0.0, 1.0)) - cap = float(np.interp(gap_factor, [0.0, 1.0], [near_cap, edge_cap])) - allowance_factor = float(np.clip(gap_error / FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_GAP_MARGIN, 0.0, 1.0)) - cap += allowance_factor * self.get_follow_accel_cap_allowance(lead, v_ego, t_follow) - if not low_speed_follow_window: - entry_factor = float(np.clip( - (float(v_ego) - LEAD_CATCHUP_ACCEL_MIN_EGO) / - (RADAR_CATCHUP_ACCEL_CAP_ENTRY_FULL_SPEED - LEAD_CATCHUP_ACCEL_MIN_EGO), - 0.0, - 1.0, - )) - cap = float(np.interp(entry_factor, [0.0, 1.0], [RADAR_CATCHUP_ACCEL_CAP_ENTRY_MAX, cap])) - return cap - - def get_low_speed_follow_transition_brake_cap(self, lead, v_ego, t_follow, prev_output_a_target, output_a_target): - if lead is None or not lead.status: - return None - if bool(getattr(lead, "radar", False)): - return None - if not (LOW_SPEED_FOLLOW_TRANSITION_MIN_SPEED <= float(v_ego) <= LOW_SPEED_FOLLOW_TRANSITION_MAX_SPEED): - return None - if prev_output_a_target <= LOW_SPEED_FOLLOW_TRANSITION_PREV_ACCEL_MIN: - return None - if output_a_target >= LOW_SPEED_FOLLOW_TRANSITION_TARGET_BRAKE_MIN: - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < LOW_SPEED_FOLLOW_TRANSITION_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > LOW_SPEED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE: - return None - - closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) - if closing_speed > LOW_SPEED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED: - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - if float(lead.dRel) < desired_gap + LOW_SPEED_FOLLOW_TRANSITION_MIN_GAP_MARGIN: - return None - - cap_decel = float(np.interp( - closing_speed, - [0.0, LOW_SPEED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED], - [LOW_SPEED_FOLLOW_TRANSITION_MIN_BRAKE, LOW_SPEED_FOLLOW_TRANSITION_MAX_BRAKE], - )) - return -cap_decel - - def get_cruise_tracking_lead_accel_cap(self, lead, v_ego, t_follow, current_source, tracking_lead_active): - if lead is None or not lead.status or current_source != "cruise": - return None - if self.post_departure_follow_settle_active(lead, v_ego, t_follow): - return None - if not (CRUISE_TRACKED_LEAD_ACCEL_CAP_MIN_SPEED <= float(v_ego) <= CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_SPEED): - return None - - lead_prob = float(getattr(lead, "modelProb", 1.0 if bool(getattr(lead, "radar", False)) else 0.0)) - if not bool(getattr(lead, "radar", False)) and lead_prob < CRUISE_TRACKED_LEAD_ACCEL_CAP_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_LEAD_BRAKE and not tracking_lead_active: - return None - - if abs(float(getattr(lead, "yRel", 0.0))) > CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_LATERAL_OFFSET: - return None - - lead_delta = float(lead.vLead) - float(v_ego) - if lead_delta > CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_PULLAWAY_SPEED: - return None - - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - if ( - float(v_ego) < FOLLOW_ACCEL_CAP_ALLOWANCE_MIN_SPEED and - lead_delta >= 0.35 and - lead_accel >= 0.25 - ): - return None - - closing_speed = max(float(v_ego) - float(lead.vLead), 0.0) - raw_close_lead = self.raw_close_lead_needs_control(lead, v_ego) - unresolved_slow_lead = ( - closing_speed >= CRUISE_TRACKED_LEAD_ACCEL_CAP_UNRESOLVED_MIN_CLOSING_SPEED and - lead_delta <= CRUISE_TRACKED_LEAD_ACCEL_CAP_UNRESOLVED_MAX_LEAD_DELTA - ) - if not tracking_lead_active and not raw_close_lead and not unresolved_slow_lead: - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - gap_error = float(lead.dRel) - desired_gap - gap_buffer = max(CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_GAP_BUFFER_MIN, - CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_GAP_BUFFER_GAIN * float(v_ego)) - if gap_error > gap_buffer: - return None - - base_cap = float(np.interp( - lead_delta, - [-1.5, -0.5, 0.0, 0.5, CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_PULLAWAY_SPEED], - [0.0, 0.04, 0.08, 0.12, 0.16], - )) - - if raw_close_lead: - base_cap = min(base_cap, float(np.interp(closing_speed, [0.5, 1.5, 3.5], [0.10, 0.05, 0.0]))) - else: - base_cap = min(base_cap, float(np.interp(closing_speed, [0.0, 1.0, 2.0], [0.18, 0.12, 0.06]))) - - gap_factor = float(np.clip(gap_error / max(gap_buffer, 0.1), 0.0, 1.0)) - cap = min(CRUISE_TRACKED_LEAD_ACCEL_CAP_MAX_ACCEL, base_cap + 0.06 * gap_factor) - allowance_factor = float(np.clip(gap_error / FOLLOW_ACCEL_CAP_ALLOWANCE_FULL_GAP_MARGIN, 0.0, 1.0)) - cap += allowance_factor * self.get_follow_accel_cap_allowance(lead, v_ego, t_follow) - return max(0.0, cap) - - def get_cruise_tracking_lead_accel_transition_target(self, lead, v_ego, t_follow, - prev_output_a_target, output_a_target, - current_source): - if lead is None or not lead.status or current_source != "cruise": - return None - if not (CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_SPEED <= float(v_ego) <= CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_SPEED): - return None - - target_delta = float(output_a_target) - float(prev_output_a_target) - if target_delta < CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_DELTA_A: - return None - - lead_prob = float(getattr(lead, "modelProb", 1.0 if bool(getattr(lead, "radar", False)) else 0.0)) - if not bool(getattr(lead, "radar", False)) and lead_prob < CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_LEAD_BRAKE: - return None - - if abs(float(getattr(lead, "yRel", 0.0))) > CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_LATERAL_OFFSET: - return None - - lead_delta = float(lead.vLead) - float(v_ego) - if lead_delta > CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_PULLAWAY_SPEED: - return None - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(t_follow) - if headway_margin > CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_HEADWAY_ABOVE_TARGET: - return None - - positive_step = float(np.interp( - lead_delta, - [-1.0, 0.0, 1.0, CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_PULLAWAY_SPEED], - [CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MIN_STEP, - 0.08, - 0.12, - CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_STEP], - )) - if headway_margin > 0.0: - headway_factor = float(np.clip( - headway_margin / max(CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_HEADWAY_ABOVE_TARGET, 1e-3), - 0.0, - 1.0, - )) - positive_step = float(np.interp( - headway_factor, - [0.0, 1.0], - [positive_step, CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_STEP], - )) - - upper = float(prev_output_a_target) + positive_step - smoothed_target = float(min(output_a_target, upper)) - return smoothed_target if smoothed_target < float(output_a_target) - 1e-6 else None - - def lead_is_matched_follow_window(self, lead, v_ego, base_t_follow): - if lead is None or not lead.status or v_ego < STEADY_FOLLOW_SMOOTHING_MIN_SPEED: - return False - - relative_speed = float(v_ego) - float(lead.vLead) - if not (STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED <= relative_speed <= STEADY_FOLLOW_SMOOTHING_MAX_CLOSING_SPEED): - return False - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > STEADY_FOLLOW_SMOOTHING_MAX_LEAD_BRAKE: - return False - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and not is_radarless_matched_follow_window( - v_ego, - lead.dRel, - lead.vLead, - base_t_follow, - radar=lead_radar, - lead_brake=lead_brake, - lead_prob=lead_prob, - ): - return False - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - if actual_headway < max(STEADY_FOLLOW_BRAKE_CAP_MIN_HEADWAY, float(base_t_follow) - STEADY_FOLLOW_SMOOTHING_HEADWAY_BELOW_TARGET): - return False - if actual_headway > float(base_t_follow) + STEADY_FOLLOW_BRAKE_CAP_MAX_HEADWAY_ABOVE_TARGET: - return False - return True - - def get_matched_follow_control_lead(self, v_ego, t_follow): - if self.mpc.source == 'lead1' and self.lead_is_matched_follow_window(self.lead_two, v_ego, t_follow): - return self.lead_two - if self.lead_is_matched_follow_window(self.lead_one, v_ego, t_follow): - return self.lead_one - if self.lead_is_matched_follow_window(self.lead_two, v_ego, t_follow): - return self.lead_two - return None - - def get_follow_control_lead(self, lead_control_active, v_ego, t_follow, *, allow_optional_far_lead_logic=True): - if allow_optional_far_lead_logic: - matched_follow_lead = self.get_matched_follow_control_lead(v_ego, t_follow) - if matched_follow_lead is not None: - return matched_follow_lead - - if not lead_control_active: - return None - - if self.lead_one.status: - return self.lead_one - if self.lead_two.status: - return self.lead_two - return None - - def get_duplicate_vision_comfort_lead(self, v_ego): - if not (self.lead_one.status and self.lead_two.status): - self.duplicate_vision_comfort_lead_source = None - return None - - if bool(getattr(self.lead_one, "radar", False)) or bool(getattr(self.lead_two, "radar", False)): - self.duplicate_vision_comfort_lead_source = None - return None - - if not self.mpc.leads_are_near_duplicates( - self.lead_one, - self.lead_two, - v_ego, - vision_min_speed=LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED, - ): - self.duplicate_vision_comfort_lead_source = None - return None - - lead_sources = { - "lead0": self.lead_one, - "lead1": self.lead_two, - } - latched_lead = lead_sources.get(self.duplicate_vision_comfort_lead_source) - if latched_lead is not None and latched_lead.status: - return latched_lead - - min_center_offset = min(abs(float(getattr(lead, "yRel", 0.0))) for lead in lead_sources.values()) - centered_sources = [ - (source, lead) for source, lead in lead_sources.items() - if abs(float(getattr(lead, "yRel", 0.0))) <= min_center_offset + DUPLICATE_VISION_COMFORT_LEAD_CENTER_TIE_MARGIN - ] - selected_source, selected_lead = min( - centered_sources, - key=lambda item: ( - float(item[1].dRel), - float(item[1].vLead), - -max(0.0, -float(getattr(item[1], "aLeadK", 0.0))), - abs(float(getattr(item[1], "yRel", 0.0))), - ), - ) - self.duplicate_vision_comfort_lead_source = selected_source - return selected_lead - - def is_nonurgent_duplicate_vision_follow(self, v_ego, t_follow): - if bool(getattr(self.lead_one, "radar", False)) or bool(getattr(self.lead_two, "radar", False)): - return False - if not self.mpc.leads_are_near_duplicates( - self.lead_one, - self.lead_two, - v_ego, - vision_min_speed=LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED, - ): - return False - - lead = self.lead_one - closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) - ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - minimum_headway = max( - UNCERT_DUPLICATE_VISION_MIN_HEADWAY, - float(t_follow) - UNCERT_DUPLICATE_VISION_HEADWAY_BELOW_TARGET, - ) - return ttc > UNCERT_DUPLICATE_VISION_MIN_TTC and actual_headway > minimum_headway - - def lead_is_spacious_brake_cap_window(self, lead, v_ego, base_t_follow): - if lead is None or not lead.status or v_ego < STEADY_FOLLOW_SMOOTHING_MIN_SPEED: - return False - - relative_speed = float(v_ego) - float(lead.vLead) - if not (STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED <= relative_speed <= STEADY_FOLLOW_BRAKE_CAP_MAX_CLOSING_SPEED): - return False - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_MAX_LEAD_BRAKE: - return False - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < STEADY_FOLLOW_SMOOTHING_MIN_MODEL_PROB: - return False - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - if actual_headway < max(float(base_t_follow) + STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_HEADWAY_MARGIN, - STEADY_FOLLOW_BRAKE_CAP_SPACIOUS_MIN_HEADWAY): - return False - if actual_headway > float(base_t_follow) + STEADY_FOLLOW_BRAKE_CAP_MAX_HEADWAY_ABOVE_TARGET: - return False - return True - - def get_matched_follow_brake_cap(self, lead, v_ego, base_t_follow): - if not ( - self.lead_is_matched_follow_window(lead, v_ego, base_t_follow) or - self.lead_is_spacious_brake_cap_window(lead, v_ego, base_t_follow) - ): - return None - - relative_speed = float(v_ego) - float(lead.vLead) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - cap_decel = float(np.interp( - relative_speed, - [STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED, 0.0, STEADY_FOLLOW_BRAKE_CAP_MAX_CLOSING_SPEED], - [STEADY_FOLLOW_BRAKE_CAP_OPENING_DECEL, - STEADY_FOLLOW_BRAKE_CAP_ZERO_REL_SPEED_DECEL, - STEADY_FOLLOW_BRAKE_CAP_MAX_DECEL], - )) - headway_deficit = float(np.clip((float(base_t_follow) - actual_headway) / STEADY_FOLLOW_SMOOTHING_HEADWAY_BELOW_TARGET, 0.0, 1.0)) - cap_decel = min(STEADY_FOLLOW_BRAKE_CAP_MAX_DECEL, cap_decel + 0.05 * headway_deficit) - return -cap_decel - - def get_far_lead_brake_cap(self, lead, v_ego, base_t_follow): - if lead is None or not lead.status or v_ego < STEADY_FOLLOW_SMOOTHING_MIN_SPEED: - return None - - relative_speed = float(v_ego) - float(lead.vLead) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(base_t_follow) - - if bool(getattr(lead, "radar", False)): - if not (FAR_RADAR_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED <= relative_speed <= FAR_RADAR_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED): - return None - if lead_brake > FAR_RADAR_COMFORT_BRAKE_CAP_MAX_LEAD_BRAKE: - return None - if float(lead.dRel) < FAR_RADAR_COMFORT_BRAKE_CAP_MIN_DISTANCE or headway_margin < FAR_RADAR_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN: - return None - - ttc = float(lead.dRel) / max(relative_speed, 1e-3) - if ttc < FAR_RADAR_COMFORT_BRAKE_CAP_MIN_TTC: - return None - - cap_decel = float(np.interp( - relative_speed, - [FAR_RADAR_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED, FAR_RADAR_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED], - [FAR_RADAR_COMFORT_BRAKE_CAP_MIN_DECEL, FAR_RADAR_COMFORT_BRAKE_CAP_MAX_DECEL], - )) - relax_decel = float(np.interp( - headway_margin, - [FAR_RADAR_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN, FAR_RADAR_COMFORT_BRAKE_CAP_FULL_HEADWAY_MARGIN], - [0.0, FAR_RADAR_COMFORT_BRAKE_CAP_FULL_RELAX_DECEL], - )) - return -max(0.0, cap_decel - relax_decel) - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < FAR_LEAD_COMFORT_BRAKE_CAP_MIN_MODEL_PROB: - return None - - if not (FAR_LEAD_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED <= relative_speed <= FAR_LEAD_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED): - return None - - if lead_brake > FAR_LEAD_COMFORT_BRAKE_CAP_MAX_LEAD_BRAKE: - return None - - if float(lead.dRel) < FAR_LEAD_COMFORT_BRAKE_CAP_MIN_DISTANCE or headway_margin < FAR_LEAD_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN: - return None - - ttc = float(lead.dRel) / max(relative_speed, 1e-3) - if ttc < FAR_LEAD_COMFORT_BRAKE_CAP_MIN_TTC: - return None - - cap_decel = float(np.interp( - relative_speed, - [FAR_LEAD_COMFORT_BRAKE_CAP_MIN_CLOSING_SPEED, FAR_LEAD_COMFORT_BRAKE_CAP_MAX_CLOSING_SPEED], - [FAR_LEAD_COMFORT_BRAKE_CAP_MIN_DECEL, FAR_LEAD_COMFORT_BRAKE_CAP_MAX_DECEL], - )) - relax_decel = float(np.interp( - headway_margin, - [FAR_LEAD_COMFORT_BRAKE_CAP_MIN_HEADWAY_MARGIN, FAR_LEAD_COMFORT_BRAKE_CAP_FULL_HEADWAY_MARGIN], - [0.0, FAR_LEAD_COMFORT_BRAKE_CAP_FULL_RELAX_DECEL], - )) - return -max(0.0, cap_decel - relax_decel) - - def update_experimental_release_accel_state(self, experimental_mode, now_t, v_ego=None): - if self.prev_experimental_mode is True and not experimental_mode: - low_speed_release = v_ego is not None and float(v_ego) < EXPERIMENTAL_RELEASE_ACCEL_LOW_SPEED_THRESHOLD - hold_time = EXPERIMENTAL_RELEASE_ACCEL_LOW_SPEED_HOLD_TIME if low_speed_release else EXPERIMENTAL_RELEASE_ACCEL_HOLD_TIME - self.experimental_release_accel_until = now_t + hold_time - elif experimental_mode: - self.experimental_release_accel_until = 0.0 - self.prev_experimental_mode = bool(experimental_mode) - - def get_experimental_release_accel_target(self, lead, v_ego, base_t_follow, - prev_output_a_target, output_a_target, - release_active): - if not release_active or lead is None or not lead.status or v_ego < EXPERIMENTAL_RELEASE_ACCEL_MIN_SPEED: - return None - - lead_speed = float(lead.vLead) - lead_delta = lead_speed - float(v_ego) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - if lead_speed < EXPERIMENTAL_RELEASE_ACCEL_MIN_LEAD_SPEED: - return None - if not (EXPERIMENTAL_RELEASE_ACCEL_MIN_LEAD_DELTA <= lead_delta <= EXPERIMENTAL_RELEASE_ACCEL_MAX_LEAD_DELTA): - return None - if lead_brake > EXPERIMENTAL_RELEASE_ACCEL_MAX_LEAD_BRAKE: - return None - if not lead_radar and lead_prob < EXPERIMENTAL_RELEASE_ACCEL_MIN_MODEL_PROB: - return None - if abs(float(getattr(lead, "yRel", 0.0))) > EXPERIMENTAL_RELEASE_ACCEL_MAX_LATERAL_OFFSET: - return None - if actual_headway < float(base_t_follow) + EXPERIMENTAL_RELEASE_ACCEL_MIN_HEADWAY_MARGIN: - return None - if float(output_a_target) - float(prev_output_a_target) < EXPERIMENTAL_RELEASE_ACCEL_MIN_DELTA_A: - return None - - return min(float(output_a_target), float(prev_output_a_target) + EXPERIMENTAL_RELEASE_ACCEL_STEP) - - def get_matched_follow_transition_target(self, lead, v_ego, base_t_follow, prev_output_a_target, output_a_target, - current_source, tracking_lead_active): - if lead is None or not lead.status: - return None - low_speed_extension_active = ( - bool(tracking_lead_active) and - current_source == "cruise" and - LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED <= float(v_ego) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_SPEED - ) - if float(v_ego) < MATCHED_FOLLOW_TRANSITION_MIN_SPEED and not low_speed_extension_active: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 0.0)) - min_model_prob = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MIN_MODEL_PROB - if lead_prob < min_model_prob: - return None - - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - lead_brake = max(0.0, -lead_accel) - max_lead_brake = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MAX_LEAD_BRAKE - if lead_brake > max_lead_brake: - return None - - relative_speed = float(v_ego) - float(lead.vLead) - opening_radar_transition = bool( - lead_radar and - -relative_speed >= LOW_SPEED_MATCHED_FOLLOW_TRANSITION_OPENING_RADAR_MIN_LEAD_DELTA and - -relative_speed <= CRUISE_TRACKED_LEAD_ACCEL_TRANSITION_MAX_PULLAWAY_SPEED and - lead_accel >= 0.0 - ) - relative_speed_in_range = STEADY_FOLLOW_BRAKE_CAP_MIN_REL_SPEED <= relative_speed <= STEADY_FOLLOW_SMOOTHING_MAX_CLOSING_SPEED - if not relative_speed_in_range and not opening_radar_transition: - return None - - closing_speed = max(0.0, relative_speed) - max_closing_speed = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MAX_CLOSING_SPEED - if closing_speed > max_closing_speed: - return None - - ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - min_ttc = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TTC if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MIN_TTC - if ttc < min_ttc: - return None - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(base_t_follow) - min_headway_margin = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MIN_HEADWAY_MARGIN - opening_radar_lead = bool( - low_speed_extension_active and - lead_radar and - opening_radar_transition - ) - if opening_radar_lead: - min_headway_margin = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_OPENING_RADAR_MIN_HEADWAY_MARGIN - full_headway_margin = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_FULL_HEADWAY_MARGIN - if headway_margin < min_headway_margin: - return None - if actual_headway > float(base_t_follow) + STEADY_FOLLOW_BRAKE_CAP_MAX_HEADWAY_ABOVE_TARGET: - return None - - target_delta = float(output_a_target) - float(prev_output_a_target) - if low_speed_extension_active: - if float(prev_output_a_target) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TARGET: - return None - if float(output_a_target) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TARGET: - return None - if abs(target_delta) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_DELTA_A: - return None - elif abs(target_delta) < 1e-3: - return None - - headway_factor = float(np.clip( - (headway_margin - min_headway_margin) / - max(full_headway_margin - min_headway_margin, 1e-3), - 0.0, - 1.0, - )) - - min_positive_step = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MIN_POSITIVE_STEP - max_positive_step = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MAX_POSITIVE_STEP - positive_step = float(np.interp( - max(float(lead.vLead) - float(v_ego), 0.0), - [0.0, 1.0], - [min_positive_step, max_positive_step], - )) - min_negative_step = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MIN_NEGATIVE_STEP - max_negative_step = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_MAX_NEGATIVE_STEP - negative_step = float(np.interp( - closing_speed, - [0.0, max_closing_speed], - [min_negative_step, max_negative_step], - )) - - # The more space we still have, the less abrupt the comfort path should be. - positive_step = float(np.interp(headway_factor, [0.0, 1.0], [positive_step, min_positive_step])) - negative_step = float(np.interp(headway_factor, [0.0, 1.0], [negative_step, min_negative_step])) - - stable_radar_catchup = bool( - lead_radar and - relative_speed <= MATCHED_FOLLOW_TRANSITION_STABLE_RADAR_MAX_CLOSING_SPEED and - lead_accel >= 0.0 and - headway_margin >= LOW_SPEED_MATCHED_FOLLOW_TRANSITION_OPENING_RADAR_MIN_HEADWAY_MARGIN - ) - if stable_radar_catchup: - positive_step = min(positive_step, MATCHED_FOLLOW_TRANSITION_STABLE_RADAR_MAX_STEP) - negative_step = min(negative_step, MATCHED_FOLLOW_TRANSITION_STABLE_RADAR_MAX_STEP) - - if float(prev_output_a_target) * float(output_a_target) < 0.0: - sign_cross_step = LOW_SPEED_MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP if low_speed_extension_active else MATCHED_FOLLOW_TRANSITION_SIGN_CROSS_STEP - positive_step = min(positive_step, sign_cross_step) - negative_step = min(negative_step, sign_cross_step) - - lower = float(prev_output_a_target) - negative_step - upper = float(prev_output_a_target) + positive_step - smoothed_target = float(np.clip(output_a_target, lower, upper)) - return smoothed_target if abs(smoothed_target - float(output_a_target)) > 1e-6 else None - - def get_near_duplicate_lead_transition_target(self, lead, v_ego, base_t_follow, - prev_output_a_target, output_a_target, - current_source, tracking_lead_active): - if lead is None or not lead.status: - return None - if current_source not in ("cruise", "lead0", "lead1"): - return None - if current_source == "cruise" and not tracking_lead_active: - return None - if not (self.lead_one.status and self.lead_two.status): - return None - identical_radar_duplicates = self.mpc.leads_share_identical_radar_track(self.lead_one, self.lead_two) - if not self.mpc.leads_are_near_duplicates( - self.lead_one, - self.lead_two, - v_ego, - vision_min_speed=LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED, - ): - return None - low_speed_extension_active = bool( - tracking_lead_active and - current_source in ("cruise", "lead0", "lead1") and - LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED <= float(v_ego) < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_SPEED - ) - if float(v_ego) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_SPEED: - return None - if float(v_ego) < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_SPEED and not low_speed_extension_active: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > NEAR_DUPLICATE_LEAD_TRANSITION_MAX_LEAD_BRAKE: - return None - - relative_speed = float(v_ego) - float(lead.vLead) - closing_speed = max(0.0, relative_speed) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - if actual_headway < max(0.0, float(base_t_follow) - NEAR_DUPLICATE_LEAD_TRANSITION_MIN_HEADWAY_BELOW_TARGET): - return None - max_headway_above_target = NEAR_DUPLICATE_LEAD_TRANSITION_MAX_HEADWAY_ABOVE_TARGET - if low_speed_extension_active and identical_radar_duplicates: - max_headway_above_target += LOW_SPEED_IDENTICAL_RADAR_DUPLICATE_TRANSITION_EXTRA_HEADWAY - elif low_speed_extension_active and not lead_radar: - max_headway_above_target += LOW_SPEED_DUPLICATE_VISION_TRANSITION_EXTRA_HEADWAY - if actual_headway > float(base_t_follow) + max_headway_above_target: - return None - - max_closing_speed = NEAR_DUPLICATE_LEAD_TRANSITION_MAX_CLOSING_SPEED - if ( - not identical_radar_duplicates and - not lead_radar and - actual_headway >= float(base_t_follow) + NEAR_DUPLICATE_VISION_TRANSITION_MIN_HEADWAY_MARGIN - ): - max_closing_speed += NEAR_DUPLICATE_VISION_TRANSITION_EXTRA_CLOSING_SPEED - if closing_speed > max_closing_speed: - return None - - ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - if ttc < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_TTC: - return None - - target_delta = float(output_a_target) - float(prev_output_a_target) - if abs(target_delta) < NEAR_DUPLICATE_LEAD_TRANSITION_MIN_DELTA_A: - return None - - if low_speed_extension_active and (float(prev_output_a_target) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TARGET or - float(output_a_target) < LOW_SPEED_MATCHED_FOLLOW_TRANSITION_MIN_TARGET): - return None - - positive_step = NEAR_DUPLICATE_LEAD_TRANSITION_POSITIVE_STEP - negative_step = NEAR_DUPLICATE_LEAD_TRANSITION_NEGATIVE_STEP - if float(prev_output_a_target) * float(output_a_target) < 0.0: - positive_step = min(positive_step, NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP) - negative_step = min(negative_step, NEAR_DUPLICATE_LEAD_TRANSITION_SIGN_CROSS_STEP) - - lower = float(prev_output_a_target) - negative_step - upper = float(prev_output_a_target) + positive_step - smoothed_target = float(np.clip(output_a_target, lower, upper)) - return smoothed_target if abs(smoothed_target - float(output_a_target)) > 1e-6 else None - - def get_mild_follow_zero_cross_guard_target(self, lead, v_ego, base_t_follow, - prev_output_a_target, output_a_target, - current_source, tracking_lead_active): - if lead is None or not lead.status: - return None - if current_source not in ("cruise", "lead0", "lead1") and not tracking_lead_active: - return None - if not (MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_SPEED <= float(v_ego) <= MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_SPEED): - return None - - target_delta = float(output_a_target) - float(prev_output_a_target) - if abs(target_delta) < MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_DELTA_A: - return None - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_MODEL_PROB: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_LEAD_BRAKE: - return None - - closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) - if closing_speed > MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_CLOSING_SPEED: - return None - - ttc = float(lead.dRel) / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - if ttc < MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_TTC: - return None - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(base_t_follow) - if headway_margin < MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_HEADWAY_MARGIN: - return None - - deadband = float(np.interp( - headway_margin, - [MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_HEADWAY_MARGIN, MILD_FOLLOW_ZERO_CROSS_GUARD_FULL_HEADWAY_MARGIN], - [MILD_FOLLOW_ZERO_CROSS_GUARD_MIN_DEADBAND, MILD_FOLLOW_ZERO_CROSS_GUARD_MAX_DEADBAND], - )) - - if float(prev_output_a_target) * float(output_a_target) < 0.0: - return 0.0 - - if abs(float(output_a_target)) < deadband and abs(float(prev_output_a_target)) < deadband + 0.06: - return 0.0 - - return None - - @staticmethod - def get_far_opening_radar_brake_guard_target(lead, v_ego, base_t_follow, - prev_output_a_target, output_a_target, - v_cruise, model_desired_accel, - current_source, tracking_lead_active): - if lead is None or not lead.status or not bool(getattr(lead, "radar", False)): - return None - if current_source != "cruise" or not tracking_lead_active: - return None - if float(v_ego) < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_SPEED: - return None - if float(lead.dRel) < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_DISTANCE: - return None - - lead_prob = float(getattr(lead, "modelProb", 1.0)) - lead_delta = float(lead.vLead) - float(v_ego) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - headway_margin = actual_headway - float(base_t_follow) - if ( - lead_prob < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_MODEL_PROB or - lead_delta < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_LEAD_DELTA or - lead_brake > FAR_OPENING_RADAR_BRAKE_GUARD_MAX_LEAD_BRAKE or - headway_margin < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_HEADWAY_MARGIN - ): - return None - - if float(prev_output_a_target) < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_PREV_TARGET: - return None - if float(output_a_target) > FAR_OPENING_RADAR_BRAKE_GUARD_MAX_NEW_TARGET: - return None - if float(v_cruise) < float(v_ego) - FAR_OPENING_RADAR_BRAKE_GUARD_MAX_CRUISE_DEFICIT: - return None - if float(model_desired_accel) < FAR_OPENING_RADAR_BRAKE_GUARD_MIN_MODEL_ACCEL: - return None - - # A far lead that is pulling away cannot justify a one-frame braking pulse. - # Preserve real speed-target, model, and closing-lead deceleration above. - return 0.0 - - def get_duplicate_slow_lead_brake_hold_target(self, lead, v_ego, base_t_follow, - prev_output_a_target, output_a_target, - current_source, tracking_lead_active): - if lead is None or not lead.status: - return None - if current_source not in ("cruise", "lead0", "lead1") and not tracking_lead_active: - return None - if not (self.lead_one.status and self.lead_two.status): - return None - if ( - abs(float(self.lead_one.dRel) - float(self.lead_two.dRel)) > DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_DREL_DIFF or - abs(float(self.lead_one.vRel) - float(self.lead_two.vRel)) > DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_VREL_DIFF - ): - return None - if float(v_ego) < DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_SPEED: - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if bool(getattr(lead, "radar", False)) or lead_prob < DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_MODEL_PROB: - return None - - prev_brake = max(0.0, -float(prev_output_a_target)) - if prev_brake < DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_PREV_DECEL: - return None - - target_delta = float(output_a_target) - float(prev_output_a_target) - if target_delta < DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_DELTA_A: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_LEAD_BRAKE: - return None - - closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) - if closing_speed < DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_CLOSING_SPEED: - return None - - actual_headway = float(lead.dRel) / max(float(v_ego), 1e-3) - if actual_headway > float(base_t_follow) + DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_HEADWAY_ABOVE_TARGET: - return None - - positive_step = float(np.interp( - closing_speed, - [DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_CLOSING_SPEED, 1.5, 4.0, 8.0], - [DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MIN_POSITIVE_STEP, - 0.16, - 0.22, - DUPLICATE_SLOW_LEAD_BRAKE_HOLD_MAX_POSITIVE_STEP], - )) - if float(prev_output_a_target) * float(output_a_target) < 0.0: - positive_step = min(positive_step, DUPLICATE_SLOW_LEAD_BRAKE_HOLD_SIGN_CROSS_STEP) - - upper = float(prev_output_a_target) + positive_step - smoothed_target = float(min(float(output_a_target), upper)) - return smoothed_target if abs(smoothed_target - float(output_a_target)) > 1e-6 else None - - def get_tracked_vision_model_brake_floor(self, lead, v_ego, accel_min, t_follow, model_desired): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - if float(v_ego) < TRACKED_VISION_MODEL_FLOOR_MIN_SPEED: - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_PROB: - return None - - model_brake = max(0.0, -float(model_desired)) - if model_brake < TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_DECEL: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - projected_closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) + lead_brake * reaction_t - if projected_closing_speed < TRACKED_VISION_MODEL_FLOOR_MIN_CLOSING_SPEED: - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - gap_margin = float(lead.dRel) - desired_gap - max_gap_margin = max(TRACKED_VISION_MODEL_FLOOR_MAX_GAP_BUFFER_MIN, - TRACKED_VISION_MODEL_FLOOR_MAX_GAP_BUFFER_GAIN * float(v_ego)) - if gap_margin < TRACKED_VISION_MODEL_FLOOR_MIN_GAP_MARGIN or gap_margin > max_gap_margin: - return None - - projected_ttc = float(lead.dRel) / max(projected_closing_speed, 0.1) - if projected_ttc > TRACKED_VISION_MODEL_FLOOR_MAX_TTC: - return None - - floor_decel = float(np.interp( - model_brake, - [TRACKED_VISION_MODEL_FLOOR_MIN_MODEL_DECEL, 1.6], - [TRACKED_VISION_MODEL_FLOOR_MIN_DECEL, TRACKED_VISION_MODEL_FLOOR_MAX_DECEL], - )) - floor_decel += float(np.interp(lead_brake, [0.0, 0.8], [0.0, TRACKED_VISION_MODEL_FLOOR_LEAD_BRAKE_MAX])) - return max(accel_min, -min(TRACKED_VISION_MODEL_FLOOR_MAX_DECEL, floor_decel)) - - def get_tracked_vision_model_brake_cap(self, lead, v_ego, t_follow, model_desired): - if lead is None or not lead.status or bool(getattr(lead, "radar", False)): - return None - if not (TRACKED_VISION_MODEL_CAP_MIN_SPEED <= float(v_ego) <= TRACKED_VISION_MODEL_CAP_MAX_SPEED): - return None - - lead_prob = float(getattr(lead, "modelProb", 0.0)) - if lead_prob < TRACKED_VISION_MODEL_CAP_MIN_MODEL_PROB: - return None - - model_brake = max(0.0, -float(model_desired)) - if model_brake > TRACKED_VISION_MODEL_CAP_MAX_MODEL_DECEL: - return None - - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - if lead_brake > TRACKED_VISION_MODEL_CAP_MAX_LEAD_BRAKE: - return None - - reaction_t = max(self.CP.longitudinalActuatorDelay, self.dt) - projected_closing_speed = max(0.0, float(v_ego) - float(lead.vLead)) + lead_brake * reaction_t - if not (TRACKED_VISION_MODEL_CAP_MIN_CLOSING_SPEED <= projected_closing_speed <= TRACKED_VISION_MODEL_CAP_MAX_CLOSING_SPEED): - return None - - desired_gap = float(desired_follow_distance(v_ego, lead.vLead, t_follow)) - gap_margin = float(lead.dRel) - desired_gap - max_gap_margin = max(TRACKED_VISION_MODEL_CAP_MAX_GAP_BUFFER_MIN, - TRACKED_VISION_MODEL_CAP_MAX_GAP_BUFFER_GAIN * float(v_ego)) - if gap_margin < TRACKED_VISION_MODEL_CAP_MIN_GAP_MARGIN or gap_margin > max_gap_margin: - return None - - projected_ttc = float(lead.dRel) / max(projected_closing_speed, 0.1) - if projected_ttc < TRACKED_VISION_MODEL_CAP_MIN_TTC: - return None - - cap_decel = float(np.interp( - model_brake, - [0.0, TRACKED_VISION_MODEL_CAP_MAX_MODEL_DECEL], - [TRACKED_VISION_MODEL_CAP_MIN_DECEL, TRACKED_VISION_MODEL_CAP_MAX_DECEL], - )) - cap_decel += float(np.interp( - projected_closing_speed, - [TRACKED_VISION_MODEL_CAP_MIN_CLOSING_SPEED, TRACKED_VISION_MODEL_CAP_MAX_CLOSING_SPEED], - [0.0, 0.08], - )) - return -min(TRACKED_VISION_MODEL_CAP_MAX_DECEL, cap_decel) - - @staticmethod - def raw_close_lead_needs_control(lead, v_ego): - if lead is None or not lead.status: - return False - - d_rel = max(float(lead.dRel), 0.0) - lead_speed = max(float(getattr(lead, "vLead", 0.0)), 0.0) - closing_speed = float(v_ego - lead.vLead) - lead_braking = float(lead.aLeadK) < -0.5 - centered_lead = abs(float(getattr(lead, "yRel", 0.0))) <= RAW_LEAD_LOW_SPEED_HOLD_MAX_LATERAL_OFFSET - if ( - centered_lead and - float(v_ego) <= RAW_LEAD_LOW_SPEED_HOLD_MAX_EGO_SPEED and - lead_speed <= RAW_LEAD_LOW_SPEED_HOLD_MAX_LEAD_SPEED and - d_rel <= RAW_LEAD_LOW_SPEED_HOLD_MAX_DISTANCE and - closing_speed >= RAW_LEAD_LOW_SPEED_HOLD_MIN_CLOSING_SPEED - ): - return True - - if closing_speed <= RAW_LEAD_SAFETY_MIN_CLOSING_SPEED and not lead_braking: - return False - - dynamic_distance = max(RAW_LEAD_SAFETY_DISTANCE, 3.0 * float(v_ego)) - ttc = d_rel / max(closing_speed, 0.1) if closing_speed > 0.1 else float("inf") - return d_rel < dynamic_distance and (ttc < RAW_LEAD_SAFETY_TTC or lead_braking) + lower = ALLOW_THROTTLE_THRESHOLD - ALLOW_THROTTLE_HYSTERESIS + upper = ALLOW_THROTTLE_THRESHOLD + ALLOW_THROTTLE_HYSTERESIS + requested = throttle_prob <= lower if self.allow_throttle else throttle_prob > upper + self._throttle_transition_time = self._throttle_transition_time + self.dt if requested else 0.0 + if self._throttle_transition_time >= ALLOW_THROTTLE_CONFIRM_TIME: + self.allow_throttle = not self.allow_throttle + self._throttle_transition_time = 0.0 + + def _smooth_output(self, target, urgent): + if urgent or target <= self.output_a_target - RAW_SAFETY_URGENT_DECEL: + return float(target) + lower = self.output_a_target - self.tune.brake_slew_rate * self.dt + upper = self.output_a_target + self.tune.accel_slew_rate * self.dt + return float(np.clip(target, lower, upper)) def update(self, sm, starpilot_toggles): - if self.is_preap: - self._preap_param_frame += 1 - if self._preap_params is not None and (self._preap_param_frame % 20) == 0: - self.nap_adaptive_accel = self._preap_params.get_bool("NAPAdaptiveAccel") - - self.generation = getattr(starpilot_toggles, "model_version", None) - experimental_mode = bool(sm['selfdriveState'].experimentalMode) - self.mode = 'blended' if experimental_mode else 'acc' - self.mpc.mode = 'acc' - if not self.mlsim: - self.mpc.mode = self.mode - - if len(sm['carControl'].orientationNED) == 3: - accel_coast = get_coast_accel(sm['carControl'].orientationNED[1]) - else: - accel_coast = ACCEL_MAX - - v_ego = get_planner_v_ego(self.CP, sm['carState']) - scene_v_ego = float(sm['carState'].vEgo) - v_cruise = sm['starpilotPlan'].vCruise + car_state = sm["carState"] + v_ego = get_planner_v_ego(self.CP, car_state) + scene_v_ego = float(car_state.vEgo) + v_cruise = float(sm["starpilotPlan"].vCruise) if not np.isfinite(v_cruise): - cloudlog.error(f"Longitudinal planner received non-finite vCruise={v_cruise}, falling back to v_ego={v_ego:.2f}") + cloudlog.error(f"Longitudinal planner received non-finite vCruise={v_cruise}") v_cruise = max(v_ego, 0.0) - v_cruise_initialized = sm['carState'].vCruise != V_CRUISE_UNSET - long_control_off = sm['controlsState'].longControlState == LongCtrlState.off - force_slow_decel = sm['controlsState'].forceDecel + reset_state = ( + (sm["controlsState"].longControlState == LongCtrlState.off + if self.CP.openpilotLongitudinalControl else not sm["selfdriveState"].enabled) or + car_state.vCruise == V_CRUISE_UNSET + ) - # Reset current state when not engaged, or user is controlling the speed - reset_state = long_control_off if self.CP.openpilotLongitudinalControl else not sm['selfdriveState'].enabled - # PCM cruise speed may be updated a few cycles later, check if initialized - reset_state = reset_state or not v_cruise_initialized - - # No change cost when user is controlling the speed, or when standstill - prev_accel_constraint = not (reset_state or sm['carState'].standstill) - - if self.mpc.mode == 'acc': - accel_limits = [sm['starpilotPlan'].minAcceleration, sm['starpilotPlan'].maxAcceleration] - steer_angle_without_offset = sm['carState'].steeringAngleDeg - sm['liveParameters'].angleOffsetDeg - accel_limits_turns = limit_accel_in_turns(v_ego, steer_angle_without_offset, accel_limits, self.CP) - accel_limits_turns[0] = max(get_vehicle_min_accel(self.CP, v_ego), accel_limits_turns[0]) - else: - accel_limits = [ACCEL_MIN, ACCEL_MAX] - accel_limits_turns = [ACCEL_MIN, ACCEL_MAX] + accel_limits = [ + float(sm["starpilotPlan"].minAcceleration), + float(sm["starpilotPlan"].maxAcceleration), + ] + steer_angle = car_state.steeringAngleDeg - sm["liveParameters"].angleOffsetDeg + accel_limits = limit_accel_in_turns(v_ego, steer_angle, accel_limits, self.CP) + accel_limits[0] = max(get_vehicle_min_accel(self.CP, v_ego), accel_limits[0]) if reset_state: self.v_desired_filter.x = v_ego - # Clip aEgo to cruise limits to prevent large accelerations when becoming active - self.a_desired = np.clip(sm['carState'].aEgo, accel_limits[0], accel_limits[1]) - self.model_allow_throttle = True - self.model_allow_throttle_transition_t = 0.0 + self.a_desired = float(np.clip(car_state.aEgo, *accel_limits)) + self.output_a_target = self.a_desired + self.state = PlanState.moving + self.stop_release_time = 0.0 + self.departure_confirm_time = 0.0 - # Prevent divergence, smooth in current v_ego self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego)) - # Compute model v_ego error - self.v_model_error = self.get_model_speed_error(sm['modelV2'], v_ego) - x, v, a, j, throttle_prob = self.parse_model(sm['modelV2'], self.v_model_error, v_ego, starpilot_toggles) - if bool(sm['carState'].standstill): - self.model_launch_armed = True - self.model_launch_stop_seen |= bool( - sm['modelV2'].action.shouldStop or - getattr(sm['starpilotPlan'], 'redLight', False) or - getattr(sm['starpilotPlan'], 'forcingStop', False) - ) - elif scene_v_ego > MODEL_LAUNCH_DISARM_SPEED: - self.model_launch_armed = False - self.model_launch_stop_seen = False - model_launch_v = np.array(v, copy=True) - model_launch_a = np.array(a, copy=True) - # Don't clip at low speeds since throttle_prob doesn't account for creep. Raw - # gasPressProb can cross both hysteresis thresholds for only a few model frames, - # so confirm transitions before changing the physical coast cap. - if v_ego <= MIN_ALLOW_THROTTLE_SPEED: - self.model_allow_throttle = True - self.model_allow_throttle_transition_t = 0.0 - else: - transition_requested = ( - throttle_prob <= ALLOW_THROTTLE_DISABLE_THRESHOLD if self.model_allow_throttle - else throttle_prob > ALLOW_THROTTLE_ENABLE_THRESHOLD - ) - if transition_requested: - self.model_allow_throttle_transition_t += self.dt - if self.model_allow_throttle_transition_t + 1e-6 >= ALLOW_THROTTLE_TRANSITION_CONFIRM_TIME: - self.model_allow_throttle = not self.model_allow_throttle - self.model_allow_throttle_transition_t = 0.0 - else: - self.model_allow_throttle_transition_t = 0.0 - self.allow_throttle = self.model_allow_throttle and not sm['starpilotPlan'].disableThrottle + gas_probs = sm["modelV2"].meta.disengagePredictions.gasPressProbs + throttle_prob = float(gas_probs[1]) if len(gas_probs) > 1 else 1.0 + self._update_allow_throttle(throttle_prob, v_ego) if not self.allow_throttle: - clipped_accel_coast = max(accel_coast, accel_limits_turns[0]) - # Hold the output cap to the physical coasting limit until throttle is - # allowed again. Relaxing back toward positive accel while the gate is - # still closed can stall downhill coastdown well above the target speed. - accel_limits_turns[1] = min(accel_limits_turns[1], clipped_accel_coast) - no_throttle_output_max = accel_limits_turns[1] + pitch = sm["carControl"].orientationNED[1] if len(sm["carControl"].orientationNED) == 3 else 0.0 + coast_accel = get_coast_accel(pitch) + speed_guard = -COAST_TARGET_GAIN * (v_ego - COAST_TARGET_SPEED) + accel_limits[1] = min(accel_limits[1], max(coast_accel, speed_guard, accel_limits[0])) - if force_slow_decel: + if sm["controlsState"].forceDecel: v_cruise = 0.0 - # clip limits, cannot init MPC outside of bounds - accel_limits_turns[0] = min(accel_limits_turns[0], self.a_desired + 0.05) - accel_limits_turns[1] = max(accel_limits_turns[1], self.a_desired - 0.05) - tracking_lead = bool(sm['starpilotPlan'].trackingLead) - self.lead_one = sm['radarState'].leadOne - self.lead_two = sm['radarState'].leadTwo - raw_close_lead_control = any(self.raw_close_lead_needs_control(lead, scene_v_ego) for lead in (self.lead_one, self.lead_two)) - # StarPilot trackingLead is debounce/model-length based. Keep a raw close-lead - # safety path so ACC/chill does not ignore a visible lead during that debounce. - lead_control_active = tracking_lead or raw_close_lead_control - lead_one_active = bool(self.lead_one.status and lead_control_active) - effective_t_follow = self.get_dynamic_t_follow(sm['starpilotPlan'].tFollow, self.lead_one if lead_one_active else None, v_ego) - - if self.is_preap and self.nap_adaptive_accel and lead_one_active: - follow_limit = get_preap_follow_limit(v_ego) - if follow_limit is not None: - safe_dist = get_safe_obstacle_distance(v_ego, effective_t_follow) - lead_dist_ratio = float(self.lead_one.dRel) / max(safe_dist, 1.0) - cap_strength = float(np.clip(1.0 - (lead_dist_ratio - 1.2) / 0.3, 0.0, 1.0)) - if cap_strength > 0.0: - accel_limits_turns[1] = min( - accel_limits_turns[1], - accel_limits_turns[1] * (1.0 - cap_strength) + follow_limit * cap_strength, - ) - - lead_dist = self.lead_one.dRel if lead_one_active else 50.0 - - # Smooth lead distance (EMA) to avoid chatter in thresholds - alpha = max(0.02, min(0.15, 0.05 + 0.002 * v_ego)) - if self.lead_dist_f is None: - self.lead_dist_f = float(lead_dist) - else: - self.lead_dist_f += alpha * (float(lead_dist) - self.lead_dist_f) - - # Lead stability estimation and recent-brake timer - now_t = time.monotonic() - self.update_experimental_release_accel_state(experimental_mode, now_t, scene_v_ego) - # relative speed (ego - lead) positive when closing - v_rel = (v_ego - self.lead_one.vLead) if lead_one_active else 0.0 - if self.prev_lead_dist is None: - d_rel_dot = 0.0 - else: - d_rel_dot = (lead_dist - self.prev_lead_dist) / max(self.dt, 1e-3) - self.prev_lead_dist = lead_dist - - # Remember time of last non-trivial model brake risk - if 'raw_brake_max' in locals() and raw_brake_max is not None and raw_brake_max > 0.02: - self.last_big_brake_t = now_t - - # Stable lead heuristic (short window, cheap to compute) - recently_braked = (now_t - self.last_big_brake_t) < 0.7 - self.stable_lead = ( - lead_one_active and - abs(v_rel) < 0.5 and - abs(d_rel_dot) < 0.5 and - not recently_braked + accel_limits[0] = min(accel_limits[0], self.a_desired + 0.05) + accel_limits[1] = max(accel_limits[1], self.a_desired - 0.05) + self.mpc.set_accel_limits(*accel_limits) + self.mpc.set_weights( + acceleration_jerk=float(sm["starpilotPlan"].accelerationJerk) / 200.0, + danger_jerk=float(sm["starpilotPlan"].dangerJerk) / 100.0, + speed_jerk=float(sm["starpilotPlan"].speedJerk) / 5.0, + prev_accel_constraint=not (reset_state or car_state.standstill), ) - - # Calculate scene uncertainty from model desire prediction entropy and disengage predictions - uncertainty = 0.0 - if hasattr(sm['modelV2'], 'meta'): - # Desire prediction entropy (maneuver uncertainty), normalized to [0, 1] - desire_entropy = 0.0 - if hasattr(sm['modelV2'].meta, 'desirePrediction'): - desire_probs = sm['modelV2'].meta.desirePrediction - if len(desire_probs) > 1: - probs = np.asarray(desire_probs, dtype=float) - total = float(np.sum(probs)) - if total > 1e-6: - p = probs / total - entropy = -np.sum(p * np.log(p + 1e-10)) - max_entropy = np.log(len(p)) - desire_entropy = float(entropy / max(max_entropy, 1e-6)) # normalized entropy in [0,1] - else: - desire_entropy = 0.0 # guard against all-zero vector - - # Disengage prediction risk (intervention likelihood) - disengage_risk = 0.0 - raw_brake_max = -1.0 - lam = -1.0 - if hasattr(sm['modelV2'].meta, 'disengagePredictions'): - # Use brake press probabilities as primary risk indicator - brake_probs = sm['modelV2'].meta.disengagePredictions.brakePressProbs - if len(brake_probs) > 0: - # Exponentially decayed max over the full horizon - probs = np.asarray(brake_probs, dtype=float) - # Clip tiny brake blips so they don't inflate uncertainty - if float(np.max(probs)) < 0.015: - probs = probs * 0.5 - raw_brake_max = float(np.max(probs)) - # Time vector assuming model horizon step = DT_MDL - t = np.arange(len(probs), dtype=float) * DT_MDL - lam = 0.6 # decay rate per second (tunable: 0.5–0.9 typical) - weights = np.exp(-lam * t) - disengage_risk = float(np.max(probs * weights)) - - # Combined uncertainty metric (range roughly 0..2), with dual-track filtering - raw_uncertainty = desire_entropy + disengage_risk - # Update filters - self.uncert_slow.update(raw_uncertainty) - self.uncert_fast.update(raw_uncertainty) - # Use a more permissive track for accel decisions - uncertainty = self.uncert_slow.x - uncertainty_accel = min(self.uncert_slow.x, self.uncert_fast.x) - - # --- Slope-based panic bypass --- - if self._uncert_last_t is None: - uncert_slope = 0.0 - else: - dt_u = max(1e-3, now_t - self._uncert_last_t) - uncert_slope = (uncertainty - self._uncert_last) / dt_u - self._uncert_last = uncertainty - self._uncert_last_t = now_t - - panic_close_window = False - closing_fast = False - desired_gap = None - closing_speed = 0.0 - if lead_one_active: - desired_gap = float(desired_follow_distance(v_ego, self.lead_one.vLead, effective_t_follow)) - scene_desired_gap = float(desired_follow_distance(scene_v_ego, self.lead_one.vLead, effective_t_follow)) - close_gap_window = max(UNCERT_PANIC_MAX_GAP_BUFFER_MIN, - UNCERT_PANIC_MAX_GAP_BUFFER_GAIN * float(v_ego)) - panic_close_window = float(self.lead_one.dRel) <= scene_desired_gap + close_gap_window - closing_speed = max(0.0, scene_v_ego - self.lead_one.vLead) - closing_fast = closing_speed >= max( - UNCERT_PANIC_MIN_CLOSING_SPEED, - UNCERT_PANIC_MIN_CLOSING_SPEED_GAIN * float(scene_v_ego), - ) - - # Only bypass lead smoothing when we're closing meaningfully and already - # near the follow window. Far or nearly pace-matched leads should stay on - # the smoothed path so the planner doesn't flip-flop between accel and brake. - panic_bypass = panic_close_window and closing_fast and ( - uncert_slope > UNCERT_SLOPE_TRIG or uncertainty >= UNCERT_MAG_TRIG - ) - # Duplicate vision tracks can share the same noisy velocity spike. Keep the - # comfort path unless distance, TTC, or lead braking makes the scene urgent. - nonurgent_duplicate_vision_follow = self.is_nonurgent_duplicate_vision_follow(scene_v_ego, effective_t_follow) - if panic_bypass and nonurgent_duplicate_vision_follow: - panic_bypass = False - - steady_follow_filter_floor = 0.0 - if lead_one_active and desired_gap is not None and not panic_bypass: - lead_brake = max(0.0, -float(getattr(self.lead_one, "aLeadK", 0.0))) - lead_radar = bool(getattr(self.lead_one, "radar", False)) - lead_prob = float(getattr(self.lead_one, "modelProb", 1.0 if lead_radar else 0.0)) - actual_headway = float(self.lead_one.dRel) / max(scene_v_ego, 1e-3) - matched_follow_window = ( - is_radarless_matched_follow_window( - scene_v_ego, - self.lead_one.dRel, - self.lead_one.vLead, - effective_t_follow, - radar=lead_radar, - lead_brake=lead_brake, - lead_prob=lead_prob, - ) or ( - lead_radar and - scene_v_ego >= STEADY_FOLLOW_SMOOTHING_MIN_SPEED and - STEADY_FOLLOW_SMOOTHING_MIN_CLOSING_SPEED <= closing_speed <= STEADY_FOLLOW_SMOOTHING_MAX_CLOSING_SPEED and - actual_headway >= max(STEADY_FOLLOW_SMOOTHING_MIN_HEADWAY, - effective_t_follow - STEADY_FOLLOW_SMOOTHING_HEADWAY_BELOW_TARGET) and - actual_headway <= effective_t_follow + STEADY_FOLLOW_SMOOTHING_HEADWAY_ABOVE_TARGET and - lead_brake <= STEADY_FOLLOW_SMOOTHING_MAX_LEAD_BRAKE - ) - ) - if matched_follow_window: - steady_follow_filter_floor = STEADY_FOLLOW_SMOOTHING_FILTER_FACTOR_FLOOR - - if panic_bypass: - if now_t - self._panic_bypass_log_t > 5.0: - self._panic_bypass_log_t = now_t - try: - cloudlog.warning( - "LON_SLOPE close bypass: " - f"slope={uncert_slope:.3f}/s uncertainty={uncertainty:.3f} " - f"v_ego={v_ego:.2f} v_rel={(v_ego - self.lead_one.vLead) if lead_one_active else 0.0:.2f} " - f"lead_dist={self.lead_dist_f if self.lead_dist_f is not None else -1:.2f}" - ) - except Exception: - pass - - personality = get_longitudinal_personality(sm) - - self.mpc.set_weights(sm['starpilotPlan'].accelerationJerk, - sm['starpilotPlan'].dangerJerk, - sm['starpilotPlan'].speedJerk, - prev_accel_constraint, - personality=personality, - v_ego=v_ego, - lead_dist=self.lead_dist_f if lead_one_active and self.lead_dist_f is not None else 50.0, - uncertainty=uncertainty, - panic_bypass=panic_bypass, - filter_time_factor_floor=steady_follow_filter_floor) - self.mpc.set_accel_limits(accel_limits_turns[0], accel_limits_turns[1]) self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired) - # After deciding the MPC mode via get_mpc_mode(), ensure MPC uses that mode when not mlsim - dec_mpc_mode = self.get_mpc_mode() - if not self.mlsim: - self.mpc.mode = dec_mpc_mode - self.mpc.update(sm['radarState'], v_cruise, x, v, a, j, - sm['starpilotPlan'].dangerFactor, effective_t_follow, - personality=personality, tracking_lead=lead_control_active, - optional_far_lead_comfort=True, - smooth_duplicate_vision=nonurgent_duplicate_vision_follow and not panic_bypass) + self.mpc.update( + sm["radarState"], + v_cruise, + danger_factor=float(sm["starpilotPlan"].dangerFactor), + t_follow=float(sm["starpilotPlan"].tFollow), + personality=sm["selfdriveState"].personality, + ) - self.a_desired_trajectory_full = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution) self.v_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.v_solution) self.a_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.a_solution) self.j_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC[:-1], self.mpc.j_solution) - # TODO counter is only needed because radar is glitchy, remove once radar is gone - self.fcw = should_publish_planner_fcw(self.mpc.crash_cnt, sm['carState'], sm['radarState']) + previous_a = self.a_desired + self.a_desired = float(np.interp(self.dt, CONTROL_N_T_IDX, self.a_desired_trajectory)) + self.v_desired_filter.x += self.dt * (self.a_desired + previous_a) / 2.0 + + actuator_delay = float(getattr(starpilot_toggles, "longitudinalActuatorDelay", self.CP.longitudinalActuatorDelay)) + action_t = max(actuator_delay + self.dt, MIN_PLAN_HORIZON) + mpc_target, mpc_should_stop = get_accel_from_plan( + self.v_desired_trajectory, + self.a_desired_trajectory, + action_t, + float(getattr(starpilot_toggles, "vEgoStopping", 0.05)), + ) + + model_target = float(getattr(sm["modelV2"].action, "desiredAcceleration", mpc_target)) + if not np.isfinite(model_target): + model_target = mpc_target + + leads = (sm["radarState"].leadOne, sm["radarState"].leadTwo) + has_lead = any(bool(getattr(lead, "status", False)) for lead in leads) + model_first = bool(getattr(starpilot_toggles, "longitudinal_model_preference", False)) + stop_authority = self._model_stop_authority(sm["modelV2"], scene_v_ego) + self.model_authority = self._get_model_authority( + sm, scene_v_ego, v_cruise, has_lead, model_first, stop_authority, + ) + model_limited_target = min(mpc_target, model_target) + target = mpc_target + self.model_authority * (model_limited_target - mpc_target) + self.plan_source = "e2e" if model_limited_target < mpc_target - 1e-3 and self.model_authority > 0.05 else self.mpc.source + + pinned_stop = bool( + getattr(sm["starpilotPlan"], "forcingStop", False) or + getattr(sm["starpilotPlan"], "stopSignConfirmed", False) or + car_state.brakePressed + ) + scene_stop = bool( + getattr(sm["starpilotPlan"], "redLight", False) or + pinned_stop or + getattr(sm["modelV2"].action, "shouldStop", False) + ) + model_stop_request = stop_authority >= STOP_ENTER_AUTHORITY + stop_request = bool(scene_stop or mpc_should_stop or model_stop_request) + increased_stop_distance = float(getattr(sm["starpilotPlan"], "increasedStoppedDistance", 0.0)) + departure_buffer = STOP_DISTANCE + increased_stop_distance + departure_candidate, fast_departure = self._safe_departure(sm, model_target, departure_buffer) + self.departure_confirm_time = self.departure_confirm_time + self.dt if departure_candidate else 0.0 + safe_departure = departure_candidate and ( + fast_departure or self.departure_confirm_time >= DEPART_CONFIRM_TIME + ) + if safe_departure and not pinned_stop: + stop_request = False + was_departing = self.state == PlanState.departing + was_stopped = self.state == PlanState.stopped + self._update_state(sm, scene_v_ego, stop_request, safe_departure) + departure_aborted = was_departing and self.state in (PlanState.stopping, PlanState.stopped) + departure_started = was_stopped and self.state == PlanState.departing + + if self.state == PlanState.stopped: + target = min(target, float(getattr(starpilot_toggles, "stopAccel", -0.5))) + elif self.state == PlanState.stopping and scene_v_ego <= DEPART_COMPLETE_SPEED: + target = min(target, float(getattr(starpilot_toggles, "stopAccel", -0.5))) + elif self.state == PlanState.departing and safe_departure: + target = max(target, self.tune.launch_accel) + + safety_cap, urgent = self._get_raw_safety_cap( + sm, + scene_v_ego, + actuator_delay + RAW_SAFETY_REACTION_BUFFER, + ) + urgent |= departure_aborted or departure_started + if safety_cap is not None: + target = min(target, safety_cap) + if safety_cap is not None and safety_cap < -RAW_SAFETY_MIN_DECEL: + if self.state == PlanState.departing: + self.state = PlanState.stopping + stop_request |= scene_v_ego <= STOP_CONTROL_SPEED + + target = float(np.clip(target, accel_limits[0], accel_limits[1])) + self.output_a_target = self._smooth_output(target, urgent) + self.output_should_stop = bool( + self.state in (PlanState.stopping, PlanState.stopped) and + (scene_v_ego <= STOP_CONTROL_SPEED or mpc_should_stop) + ) + + self.fcw = self.mpc.crash_cnt > 2 and not car_state.standstill and any( + should_trigger_planner_fcw(lead, scene_v_ego) for lead in leads + ) if self.fcw: cloudlog.info("FCW triggered") - # Safety checks for rubber-banding mitigation - max_jerk = np.max(np.abs(self.mpc.j_solution)) - max_accel_change = np.max(np.abs(np.diff(self.mpc.a_solution))) - if max_jerk > 5.0: # m/s^3 - cloudlog.warning(f"High jerk detected: {max_jerk:.2f} m/s^3") - if max_accel_change > 2.0: # m/s^2 - cloudlog.warning(f"High acceleration change: {max_accel_change:.2f} m/s^2") - - # Interpolate 0.05 seconds and save as starting point for next iteration - a_prev = self.a_desired - self.a_desired = float(np.interp(self.dt, CONTROL_N_T_IDX, self.a_desired_trajectory)) - self.v_desired_filter.x = self.v_desired_filter.x + self.dt * (self.a_desired + a_prev) / 2.0 - - # Anticipatory pre-brake to avoid "coming in hot" when closing on a lead - if lead_one_active: - rel_v = max(0.0, v_ego - self.lead_one.vLead) - # dynamic time headway adds a small buffer when uncertainty is elevated - base_th = max(1.6, effective_t_follow) - th = base_th + 0.6 * max(0.0, uncertainty - 0.42) - desired_gap = th * v_ego - if (self.lead_dist_f is not None and self.lead_dist_f < desired_gap and rel_v > 0.5): - k_rel, k_unc = 0.04, 0.20 - pre_brake = k_rel * rel_v + k_unc * max(0.0, uncertainty - 0.42) - pre_brake = min(pre_brake, 0.06) - self.a_desired = float(self.a_desired - pre_brake) - - # Small deadzone around zero accel to kill micro-dithers - if -0.05 < self.a_desired < 0.05: - self.a_desired = 0.0 - - classic_model = bool(getattr(starpilot_toggles, "classic_model", False)) - tinygrad_model = bool(getattr(starpilot_toggles, "tinygrad_model", False)) - experimental_mlsim = bool(tinygrad_model and self.mlsim and self.mode != 'acc') - action_t = self.CP.longitudinalActuatorDelay + DT_MDL - prev_output_a_target = float(self.output_a_target) - model_launch_accel = None - if self.model_launch_armed and not bool(sm['modelV2'].action.shouldStop): - model_launch_accel = self.get_model_launch_accel(model_launch_v, model_launch_a, action_t, scene_v_ego) - - if classic_model: - output_a_target, output_should_stop = get_accel_from_plan_classic( - self.CP, self.v_desired_trajectory, self.a_desired_trajectory, starpilot_toggles.vEgoStopping) - elif tinygrad_model: - output_a_target_mpc, output_should_stop_mpc = get_accel_from_plan( - self.v_desired_trajectory, self.a_desired_trajectory, - action_t=action_t, vEgoStopping=starpilot_toggles.vEgoStopping) - output_a_target_e2e = sm['modelV2'].action.desiredAcceleration - output_should_stop_e2e = sm['modelV2'].action.shouldStop - - if self.mode == 'acc' or self.generation == 'v9': - output_a_target = output_a_target_mpc - output_should_stop = output_should_stop_mpc - else: - output_a_target = min(output_a_target_mpc, output_a_target_e2e) - output_should_stop = output_should_stop_e2e or output_should_stop_mpc - else: - output_a_target, output_should_stop = get_accel_from_plan( - self.v_desired_trajectory, self.a_desired_trajectory, - action_t=action_t, vEgoStopping=starpilot_toggles.vEgoStopping) - - comfort_output_accel_min = get_vehicle_min_accel(self.CP, v_ego) if experimental_mlsim else accel_limits_turns[0] - vision_cap_accel_min = min(comfort_output_accel_min, get_vehicle_min_accel(self.CP, v_ego)) - output_accel_min = comfort_output_accel_min - model_desired_accel = float(sm['modelV2'].action.desiredAcceleration) - - raw_approach_lift_cap = None - if not tracking_lead: - approach_lift_caps = [ - cap for cap in ( - self.get_vision_untracked_approach_lift_cap(self.lead_one, v_ego, effective_t_follow), - self.get_vision_untracked_approach_lift_cap(self.lead_two, v_ego, effective_t_follow), - ) if cap is not None - ] - if approach_lift_caps: - raw_approach_lift_cap = min(approach_lift_caps) - - pretracking_vision_caps = [] - for lead in (self.lead_one, self.lead_two): - if lead.status and not bool(getattr(lead, "radar", False)): - pretracking_cap = self.get_vision_untracked_slow_lead_cap(lead, v_ego, vision_cap_accel_min) - if pretracking_cap is not None: - pretracking_vision_caps.append((pretracking_cap, lead)) - - if pretracking_vision_caps: - pretracking_vision_cap, pretracking_vision_lead = min(pretracking_vision_caps, key=lambda cap_and_lead: cap_and_lead[0]) - lead_brake = max(0.0, -float(getattr(pretracking_vision_lead, "aLeadK", 0.0))) - immediate_pretracking_cap = ( - pretracking_vision_cap <= -VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_DECEL or - float(getattr(pretracking_vision_lead, "dRel", float("inf"))) <= VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_DISTANCE or - lead_brake >= VISION_UNTRACKED_SLOW_LEAD_IMMEDIATE_LEAD_BRAKE or - float(getattr(pretracking_vision_lead, "vLead", float("inf"))) <= VISION_UNTRACKED_SLOW_LEAD_RELAXED_MAX_LEAD_SPEED - ) - - if immediate_pretracking_cap: - self.untracked_slow_lead_confirm_t = VISION_UNTRACKED_SLOW_LEAD_CONFIRM_TIME - else: - self.untracked_slow_lead_confirm_t = min( - self.untracked_slow_lead_confirm_t + self.dt, - VISION_UNTRACKED_SLOW_LEAD_CONFIRM_TIME, - ) - - if self.untracked_slow_lead_confirm_t >= VISION_UNTRACKED_SLOW_LEAD_CONFIRM_TIME: - self.a_desired = min(self.a_desired, pretracking_vision_cap) - output_a_target = min(output_a_target, pretracking_vision_cap) - else: - self.untracked_slow_lead_confirm_t = 0.0 - else: - self.untracked_slow_lead_confirm_t = 0.0 - - approach_lift_cap = self.update_vision_untracked_approach_lift_cap( - raw_approach_lift_cap, - output_a_target, - prev_output_a_target, - now_t, - not tracking_lead, - ) - if approach_lift_cap is not None: - self.a_desired = min(self.a_desired, approach_lift_cap) - output_a_target = min(output_a_target, approach_lift_cap) - - close_lead_caps = [] - tracked_vision_approach_caps = [] - vision_low_speed_stop_active = False - vision_brake_cap_active = False - if lead_control_active: - for lead in (self.lead_one, self.lead_two): - cap = self.get_close_lead_brake_cap(lead, v_ego, output_accel_min) - if cap is not None: - close_lead_caps.append(cap) - slow_stop_cap = self.get_vision_slow_stopped_lead_cap(lead, v_ego, vision_cap_accel_min, effective_t_follow) - if slow_stop_cap is not None: - close_lead_caps.append(slow_stop_cap) - vision_brake_cap_active = True - approach_cap = self.get_vision_lead_approach_cap(lead, v_ego, vision_cap_accel_min, effective_t_follow) - if approach_cap is not None: - tracked_vision_approach_caps.append(( - approach_cap, - self.tracked_vision_lead_approach_needs_immediate_brake(lead, v_ego, approach_cap), - )) - low_speed_stop_cap, low_speed_stop_active = self.get_vision_low_speed_stop_buffer_cap(lead, v_ego, vision_cap_accel_min) - if low_speed_stop_cap is not None: - close_lead_caps.append(low_speed_stop_cap) - vision_brake_cap_active = True - vision_low_speed_stop_active |= low_speed_stop_active - if tracked_vision_approach_caps: - if any(immediate for _, immediate in tracked_vision_approach_caps): - self.vision_lead_approach_confirm_t = VISION_LEAD_APPROACH_CONFIRM_TIME - else: - self.vision_lead_approach_confirm_t = min( - self.vision_lead_approach_confirm_t + self.dt, - VISION_LEAD_APPROACH_CONFIRM_TIME, - ) - - if self.vision_lead_approach_confirm_t >= VISION_LEAD_APPROACH_CONFIRM_TIME: - close_lead_caps.append(min(cap for cap, _ in tracked_vision_approach_caps)) - vision_brake_cap_active = True - else: - self.vision_lead_approach_confirm_t = 0.0 - if close_lead_caps: - close_lead_brake_cap = min(close_lead_caps) - self.a_desired = min(self.a_desired, close_lead_brake_cap) - output_a_target = min(output_a_target, close_lead_brake_cap) - - standstill_nudge_gap = STOP_DISTANCE - 0.5 - moving_leads = [lead for lead in (self.lead_one, self.lead_two) - if lead.status and - lead.vLead > STANDSTILL_LEAD_NUDGE_MIN_SPEED and lead.dRel >= standstill_nudge_gap] - accelerating_nudge_lead = any( - lead.status and - float(getattr(lead, "vLead", 0.0)) > STANDSTILL_LEAD_NUDGE_MIN_SPEED and - float(getattr(lead, "aLeadK", 0.0)) >= STANDSTILL_LEAD_NUDGE_MIN_LEAD_ACCEL and - float(getattr(lead, "dRel", 0.0)) >= standstill_nudge_gap - for lead in (self.lead_one, self.lead_two) - ) - confident_depart_detected = any(self.is_confident_lead_depart(lead, float(sm['carState'].vEgo)) - for lead in (self.lead_one, self.lead_two)) - lead_depart_ready = any( - lead.status and - lead.vLead >= STANDSTILL_LEAD_DEPART_MIN_LEAD_SPEED and - lead.dRel >= standstill_nudge_gap + STANDSTILL_LEAD_DEPART_MIN_GAP_MARGIN - for lead in (self.lead_one, self.lead_two) - ) - depart_safety_veto = (not bool(getattr(starpilot_toggles, "radar_takeoffs", False)) - and self.has_offcenter_radar_depart_conflict(sm)) - safe_depart_release_hold_lead = self.get_safe_depart_release_hold_lead(float(sm['carState'].vEgo)) - depart_release_hold_context = bool( - lead_control_active and - float(sm['carState'].vEgo) <= STANDSTILL_LEAD_DEPART_MAX_EGO_SPEED and - not depart_safety_veto and - not bool(getattr(sm['carState'], 'brakePressed', False)) and - not bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) and - not bool(getattr(sm['starpilotPlan'], 'redLight', False)) and - safe_depart_release_hold_lead is not None - ) - if depart_release_hold_context: - self.lead_depart_release_candidate_elapsed = min( - LEAD_DEPART_RELEASE_HOLD_CONFIRM_TIME, - self.lead_depart_release_candidate_elapsed + self.dt, - ) - else: - self.lead_depart_release_candidate_elapsed = 0.0 - self.lead_depart_release_pending = False - self.lead_depart_release_hold_remaining = 0.0 - - if self.lead_depart_release_hold_remaining > 0.0: - self.lead_depart_release_hold_remaining = max(0.0, self.lead_depart_release_hold_remaining - self.dt) - depart_release_hold_active = bool(depart_release_hold_context and self.lead_depart_release_hold_remaining > 0.0) - if ( - lead_control_active and - sm['carState'].standstill and - not depart_safety_veto and - not bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) and - not bool(getattr(sm['starpilotPlan'], 'redLight', False)) and - confident_depart_detected - ): - self.confident_lead_depart_elapsed = min( - LEAD_DEPART_CONFIDENT_CONFIRM_TIME, - self.confident_lead_depart_elapsed + self.dt, - ) - else: - self.confident_lead_depart_elapsed = 0.0 - confident_depart_ready = ( - confident_depart_detected and - self.confident_lead_depart_elapsed >= LEAD_DEPART_CONFIDENT_CONFIRM_TIME - ) - slow_creep_depart_detected = any( - self.is_slow_creep_lead_depart(lead, float(sm['carState'].vEgo), standstill_nudge_gap) - for lead in (self.lead_one, self.lead_two) - ) - if ( - lead_control_active and - sm['carState'].standstill and - not depart_safety_veto and - not bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) and - not bool(getattr(sm['starpilotPlan'], 'redLight', False)) and - slow_creep_depart_detected - ): - self.slow_creep_lead_depart_elapsed = min( - STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME, - self.slow_creep_lead_depart_elapsed + self.dt, - ) - else: - self.slow_creep_lead_depart_elapsed = 0.0 - slow_creep_depart_ready = ( - slow_creep_depart_detected and - self.slow_creep_lead_depart_elapsed >= STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME - ) - radar_gap_settle_active = self.update_radar_standstill_gap_settle(sm, standstill_nudge_gap) - - standstill_stopped_lead_guard_cap = None - standstill_guard_lead_present = any(bool(getattr(lead, "status", False)) for lead in (self.lead_one, self.lead_two)) - if standstill_guard_lead_present and (bool(sm['carState'].standstill) or float(sm['carState'].vEgo) <= STANDSTILL_STOPPED_LEAD_GUARD_MAX_EGO_SPEED): - release_ready = bool( - lead_depart_ready or confident_depart_ready or slow_creep_depart_ready or - radar_gap_settle_active or depart_release_hold_active - ) - standstill_stopped_lead_guard_caps = [ - cap for cap in ( - self.get_standstill_stopped_lead_guard_cap( - self.lead_one, - float(sm['carState'].vEgo), - output_accel_min, - standstill_nudge_gap, - release_ready, - confident_depart_ready, - ), - self.get_standstill_stopped_lead_guard_cap( - self.lead_two, - float(sm['carState'].vEgo), - output_accel_min, - standstill_nudge_gap, - release_ready, - confident_depart_ready, - ), - ) if cap is not None - ] - if standstill_stopped_lead_guard_caps: - standstill_stopped_lead_guard_cap = min(standstill_stopped_lead_guard_caps) - output_should_stop = True - - if lead_control_active and sm['carState'].standstill and moving_leads and not depart_safety_veto: - output_a_target = max(output_a_target, STANDSTILL_LEAD_NUDGE_ACCEL) - - if ( - lead_control_active and - sm['carState'].standstill and - (confident_depart_ready or lead_depart_ready or slow_creep_depart_ready) and - not depart_safety_veto and - not bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) and - not bool(getattr(sm['starpilotPlan'], 'redLight', False)) and - (confident_depart_ready or slow_creep_depart_ready or model_desired_accel >= STANDSTILL_LEAD_DEPART_MIN_MODEL_ACCEL) - ): - vision_low_speed_stop_active = False - output_should_stop = False - depart_min_accel = STANDSTILL_LEAD_DEPART_MIN_ACCEL - if slow_creep_depart_ready and not (confident_depart_ready or lead_depart_ready): - depart_min_accel = STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL - output_a_target = max(output_a_target, depart_min_accel) - self.post_departure_follow_settle_until = now_t + POST_DEPARTURE_FOLLOW_SETTLE_LATCH_TIME - - if depart_release_hold_context and bool(self.output_should_stop) and not bool(output_should_stop): - self.lead_depart_release_pending = True - if ( - depart_release_hold_context and - self.lead_depart_release_pending and - not bool(output_should_stop) and - self.lead_depart_release_candidate_elapsed >= LEAD_DEPART_RELEASE_HOLD_CONFIRM_TIME - ): - self.lead_depart_release_hold_remaining = LEAD_DEPART_RELEASE_HOLD_TIME - self.lead_depart_release_pending = False - depart_release_hold_active = True - elif bool(output_should_stop) and self.lead_depart_release_hold_remaining <= 0.0: - self.lead_depart_release_pending = False - - if depart_release_hold_active: - vision_low_speed_stop_active = False - output_should_stop = False - self.post_departure_follow_settle_until = now_t + POST_DEPARTURE_FOLLOW_SETTLE_LATCH_TIME - - if lead_control_active and lead_depart_ready and not depart_safety_veto and not output_should_stop and float(sm['carState'].vEgo) <= STANDSTILL_LEAD_DEPART_MAX_EGO_SPEED: - output_a_target = max(output_a_target, STANDSTILL_LEAD_DEPART_MIN_ACCEL) - self.post_departure_follow_settle_until = now_t + POST_DEPARTURE_FOLLOW_SETTLE_LATCH_TIME - - if radar_gap_settle_active: - vision_low_speed_stop_active = False - output_should_stop = False - output_a_target = RADAR_STANDSTILL_GAP_SETTLE_ACCEL - - lead_present = any(bool(getattr(lead, "status", False)) for lead in (self.lead_one, self.lead_two)) - confirmed_lead_release = bool(confident_depart_ready or lead_depart_ready or slow_creep_depart_ready) - model_launch_allowed = bool( - model_launch_accel is not None and - not output_should_stop and - not vision_low_speed_stop_active and - not bool(getattr(sm['carState'], 'brakePressed', False)) and - not bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) and - not bool(getattr(sm['starpilotPlan'], 'redLight', False)) and - not depart_safety_veto and - ( - (lead_present and lead_control_active and confirmed_lead_release) or - (not lead_present and (self.mode != 'acc' or self.model_launch_stop_seen)) - ) - ) - if model_launch_allowed: - output_a_target = max(output_a_target, model_launch_accel) - - if depart_safety_veto or output_should_stop or bool(getattr(sm['starpilotPlan'], 'forcingStop', False)) or bool(getattr(sm['starpilotPlan'], 'redLight', False)): - self.lead_depart_accel_hold_until = 0.0 - self.lead_depart_accel_hold_floor = None - - lead_depart_accel_floor = None - lead_depart_accel_floor_reused = False - if lead_control_active and not output_should_stop and not depart_safety_veto: - lead_depart_accel_floors = [ - floor for floor in ( - self.get_lead_depart_accel_floor(self.lead_one, scene_v_ego, model_desired_accel), - self.get_lead_depart_accel_floor(self.lead_two, scene_v_ego, model_desired_accel), - ) if floor is not None - ] - if lead_depart_accel_floors: - lead_depart_accel_floor = max(lead_depart_accel_floors) - self.lead_depart_accel_hold_floor = lead_depart_accel_floor - if sm['carState'].standstill: - self.lead_depart_accel_hold_until = now_t + LEAD_DEPART_ACCEL_HOLD_TIME - elif self.lead_depart_accel_hold_floor is not None and now_t < self.lead_depart_accel_hold_until: - reusable_hold_floors = [ - floor for floor in ( - self.get_reusable_lead_depart_accel_floor(self.lead_one, scene_v_ego, effective_t_follow), - self.get_reusable_lead_depart_accel_floor(self.lead_two, scene_v_ego, effective_t_follow), - ) if floor is not None - ] - if reusable_hold_floors: - lead_depart_accel_floor = max(reusable_hold_floors) - lead_depart_accel_floor_reused = True - else: - self.lead_depart_accel_hold_floor = None - elif now_t >= self.lead_depart_accel_hold_until: - self.lead_depart_accel_hold_floor = None - - lead_depart_accel_hold_active = ( - lead_depart_accel_floor is not None and - now_t < self.lead_depart_accel_hold_until and - float(sm['carState'].vEgo) <= LEAD_DEPART_ACCEL_HOLD_MAX_EGO_SPEED - ) - - low_speed_weak_lead_accel_cap = None - if not output_should_stop: - low_speed_weak_lead_accel_caps = [ - cap for cap in ( - self.get_low_speed_weak_lead_accel_cap(self.lead_one, scene_v_ego), - self.get_low_speed_weak_lead_accel_cap(self.lead_two, scene_v_ego), - ) if cap is not None - ] - if low_speed_weak_lead_accel_caps: - low_speed_weak_lead_accel_cap = min(low_speed_weak_lead_accel_caps) - - close_stop_active = bool(output_should_stop or vision_low_speed_stop_active) - - close_stop_hold_cap = None - if lead_control_active and close_stop_active: - close_stop_hold_caps = [ - cap for cap in ( - self.get_vision_close_stop_hold_cap(self.lead_one, v_ego, output_accel_min, close_stop_active), - self.get_vision_close_stop_hold_cap(self.lead_two, v_ego, output_accel_min, close_stop_active), - ) if cap is not None - ] - if close_stop_hold_caps: - close_stop_hold_cap = min(close_stop_hold_caps) - - close_release_hold_cap = None - if lead_control_active and not close_stop_active: - close_release_hold_caps = [ - cap for cap in ( - self.get_vision_close_release_hold_cap(self.lead_one, v_ego, vision_cap_accel_min, close_stop_active), - self.get_vision_close_release_hold_cap(self.lead_two, v_ego, vision_cap_accel_min, close_stop_active), - ) if cap is not None - ] - if close_release_hold_caps: - close_release_hold_cap = min(close_release_hold_caps) - - close_settle_guard_active = bool( - output_should_stop or - vision_low_speed_stop_active or - sm['controlsState'].longControlState == LongCtrlState.stopping - ) - close_settle_cap = None - if lead_control_active: - close_settle_caps = [ - cap for cap in ( - self.get_vision_close_settle_cap(self.lead_one, v_ego, output_accel_min, close_settle_guard_active), - self.get_vision_close_settle_cap(self.lead_two, v_ego, output_accel_min, close_settle_guard_active), - ) if cap is not None - ] - if close_settle_caps: - close_settle_cap = min(close_settle_caps) - - close_final_guard_cap = None - if lead_control_active: - close_final_guard_caps = [ - cap for cap in ( - self.get_vision_close_final_guard_cap(self.lead_one, v_ego, output_accel_min), - self.get_vision_close_final_guard_cap(self.lead_two, v_ego, output_accel_min), - ) if cap is not None - ] - if close_final_guard_caps: - close_final_guard_cap = min(close_final_guard_caps) - - if lead_one_active: - lead_catchup_accel_cap = self.get_lead_catchup_accel_cap( - self.lead_one, - scene_v_ego, - effective_t_follow, - current_source=self.mpc.source, - tracking_lead_active=tracking_lead, - ) - if lead_catchup_accel_cap is not None: - self.a_desired = min(self.a_desired, lead_catchup_accel_cap) - output_a_target = min(output_a_target, lead_catchup_accel_cap) - - if lead_control_active and np.isfinite(v_cruise) and any(lead.status for lead in (self.lead_one, self.lead_two)): - # This is only an acceleration cap. A negative cap would manufacture hard - # braking on abrupt cruise-target drops instead of letting the MPC decelerate. - cruise_accel_cap = max(0.0, (v_cruise - v_ego + 0.01) / max(action_t, self.dt)) - output_a_target = min(output_a_target, cruise_accel_cap) - - if vision_brake_cap_active: - output_accel_min = min(output_accel_min, vision_cap_accel_min) - - follow_control_lead = self.get_follow_control_lead( - lead_control_active, - scene_v_ego, - effective_t_follow, - allow_optional_far_lead_logic=True, - ) - duplicate_vision_comfort_lead = self.get_duplicate_vision_comfort_lead(scene_v_ego) - comfort_follow_lead = duplicate_vision_comfort_lead if duplicate_vision_comfort_lead is not None and follow_control_lead is not None else follow_control_lead - if follow_control_lead is not None and not panic_bypass: - if not output_should_stop and not vision_low_speed_stop_active: - tracked_vision_model_brake_floor = self.get_tracked_vision_model_brake_floor( - follow_control_lead, - scene_v_ego, - output_accel_min, - effective_t_follow, - model_desired_accel, - ) - if tracked_vision_model_brake_floor is not None: - self.a_desired = min(self.a_desired, tracked_vision_model_brake_floor) - output_a_target = min(output_a_target, tracked_vision_model_brake_floor) - - matched_follow_brake_cap = self.get_matched_follow_brake_cap(follow_control_lead, scene_v_ego, effective_t_follow) - if matched_follow_brake_cap is not None: - self.a_desired = max(self.a_desired, matched_follow_brake_cap) - output_a_target = max(output_a_target, matched_follow_brake_cap) - - if not close_lead_caps and not output_should_stop and not vision_low_speed_stop_active: - low_speed_transition_brake_cap = self.get_low_speed_follow_transition_brake_cap( - follow_control_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - ) - if low_speed_transition_brake_cap is not None: - self.a_desired = max(self.a_desired, low_speed_transition_brake_cap) - output_a_target = max(output_a_target, low_speed_transition_brake_cap) - - comfort_lead = duplicate_vision_comfort_lead if duplicate_vision_comfort_lead is not None else ( - self.lead_two if self.mpc.source == 'lead1' and self.lead_two.status else self.lead_one - ) - if comfort_lead is not None and not panic_bypass: - far_lead_brake_cap = self.get_far_lead_brake_cap(comfort_lead, scene_v_ego, effective_t_follow) - if far_lead_brake_cap is not None: - self.a_desired = max(self.a_desired, far_lead_brake_cap) - output_a_target = max(output_a_target, far_lead_brake_cap) - - if follow_control_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active: - tracked_vision_model_brake_cap = self.get_tracked_vision_model_brake_cap( - follow_control_lead, - scene_v_ego, - effective_t_follow, - model_desired_accel, - ) - if tracked_vision_model_brake_cap is not None: - self.a_desired = max(self.a_desired, tracked_vision_model_brake_cap) - output_a_target = max(output_a_target, tracked_vision_model_brake_cap) - - if comfort_follow_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active: - matched_follow_transition_target = self.get_matched_follow_transition_target( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - self.mpc.source, - bool(getattr(sm["starpilotPlan"], "trackingLead", False)), - ) - if matched_follow_transition_target is not None: - if matched_follow_transition_target < output_a_target: - self.a_desired = min(self.a_desired, matched_follow_transition_target) - else: - self.a_desired = max(self.a_desired, matched_follow_transition_target) - output_a_target = matched_follow_transition_target - - if comfort_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active: - near_duplicate_transition_target = self.get_near_duplicate_lead_transition_target( - comfort_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - self.mpc.source, - bool(getattr(sm["starpilotPlan"], "trackingLead", False)), - ) - if near_duplicate_transition_target is not None: - if near_duplicate_transition_target < output_a_target: - self.a_desired = min(self.a_desired, near_duplicate_transition_target) - else: - self.a_desired = max(self.a_desired, near_duplicate_transition_target) - output_a_target = near_duplicate_transition_target - - duplicate_slow_lead_brake_hold_target = self.get_duplicate_slow_lead_brake_hold_target( - comfort_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - self.mpc.source, - bool(getattr(sm["starpilotPlan"], "trackingLead", False)), - ) - if duplicate_slow_lead_brake_hold_target is not None: - if duplicate_slow_lead_brake_hold_target < output_a_target: - self.a_desired = min(self.a_desired, duplicate_slow_lead_brake_hold_target) - else: - self.a_desired = max(self.a_desired, duplicate_slow_lead_brake_hold_target) - output_a_target = duplicate_slow_lead_brake_hold_target - - if comfort_follow_lead is not None and not panic_bypass and not output_should_stop and not vision_low_speed_stop_active: - cruise_tracking_lead_accel_cap = self.get_cruise_tracking_lead_accel_cap( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - self.mpc.source, - tracking_lead, - ) - if cruise_tracking_lead_accel_cap is not None: - self.a_desired = min(self.a_desired, cruise_tracking_lead_accel_cap) - output_a_target = min(output_a_target, cruise_tracking_lead_accel_cap) - - cruise_tracking_lead_transition_target = self.get_cruise_tracking_lead_accel_transition_target( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - self.mpc.source, - ) - if cruise_tracking_lead_transition_target is not None: - self.a_desired = min(self.a_desired, cruise_tracking_lead_transition_target) - output_a_target = min(output_a_target, cruise_tracking_lead_transition_target) - - mild_follow_zero_cross_guard_target = self.get_mild_follow_zero_cross_guard_target( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - self.mpc.source, - tracking_lead, - ) - if mild_follow_zero_cross_guard_target is not None: - output_a_target = mild_follow_zero_cross_guard_target - - far_opening_radar_brake_guard_target = self.get_far_opening_radar_brake_guard_target( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - v_cruise, - model_desired_accel, - self.mpc.source, - tracking_lead, - ) - if far_opening_radar_brake_guard_target is not None: - self.a_desired = max(self.a_desired, far_opening_radar_brake_guard_target) - output_a_target = max(output_a_target, far_opening_radar_brake_guard_target) - - output_accel_max = no_throttle_output_max if not self.allow_throttle else accel_limits_turns[1] - output_a_target = float(np.clip(output_a_target, output_accel_min, output_accel_max)) - - if close_stop_hold_cap is not None: - self.a_desired = min(self.a_desired, close_stop_hold_cap) - output_a_target = min(output_a_target, close_stop_hold_cap) - - if standstill_stopped_lead_guard_cap is not None: - self.a_desired = min(self.a_desired, standstill_stopped_lead_guard_cap) - output_a_target = min(output_a_target, standstill_stopped_lead_guard_cap) - - if close_settle_cap is not None: - self.a_desired = min(self.a_desired, close_settle_cap) - output_a_target = min(output_a_target, close_settle_cap) - - if close_final_guard_cap is not None: - self.a_desired = min(self.a_desired, close_final_guard_cap) - output_a_target = min(output_a_target, close_final_guard_cap) - - if close_release_hold_cap is not None: - self.a_desired = min(self.a_desired, close_release_hold_cap) - output_a_target = min(output_a_target, close_release_hold_cap) - - if depart_safety_veto: - self.a_desired = min(self.a_desired, 0.0) - output_a_target = min(output_a_target, 0.0) - if sm['carState'].standstill: - output_should_stop = True - - if lead_depart_accel_hold_active: - output_a_target = max(output_a_target, lead_depart_accel_floor) - - if low_speed_weak_lead_accel_cap is not None and not (lead_depart_accel_hold_active and lead_depart_accel_floor_reused): - self.a_desired = min(self.a_desired, low_speed_weak_lead_accel_cap) - output_a_target = min(output_a_target, low_speed_weak_lead_accel_cap) - - if ( - lead_control_active and - (bool(sm['carState'].standstill) or float(sm['carState'].vEgo) <= STANDSTILL_STOPPED_LEAD_GUARD_MAX_EGO_SPEED) and - output_should_stop and - accelerating_nudge_lead and - not depart_safety_veto - ): - output_a_target = max(output_a_target, STANDSTILL_LEAD_NUDGE_ACCEL) - - force_stop_handoff = bool( - getattr(sm['starpilotPlan'], 'forcingStop', False) and - not lead_control_active and - ( - float(getattr(sm['starpilotPlan'], 'forcingStopLength', float('inf'))) < 1.0 or - float(getattr(sm['starpilotPlan'], 'vCruise', float('inf'))) <= FORCE_STOP_HANDOFF_MAX_VCRUISE - ) - ) - - if force_stop_handoff: - output_should_stop = True - - manual_stop_resume_override = self._update_manual_stop_resume_override(sm) - if manual_stop_resume_override: - output_a_target = max(output_a_target, MANUAL_STOP_RESUME_OVERRIDE_MIN_ACCEL) - output_should_stop = False - - inside_gap_closing_cap = None - if lead_control_active: - inside_gap_closing_lead = self.lead_two if self.mpc.source == 'lead1' else self.lead_one - inside_gap_closing_cap = self.get_inside_gap_closing_lead_accel_cap( - inside_gap_closing_lead, - scene_v_ego, - output_accel_min, - sm['starpilotPlan'].tFollow, - ) - if inside_gap_closing_cap is not None: - self.a_desired = min(self.a_desired, inside_gap_closing_cap) - output_a_target = min(output_a_target, inside_gap_closing_cap) - - experimental_release_accel_target = self.get_experimental_release_accel_target( - comfort_follow_lead, - scene_v_ego, - effective_t_follow, - prev_output_a_target, - output_a_target, - bool( - now_t < self.experimental_release_accel_until and - not output_should_stop and - not vision_low_speed_stop_active and - not getattr(sm['starpilotPlan'], 'forcingStop', False) and - not getattr(sm['starpilotPlan'], 'redLight', False) - ), - ) - if experimental_release_accel_target is not None: - self.a_desired = min(self.a_desired, experimental_release_accel_target) - output_a_target = min(output_a_target, experimental_release_accel_target) - - if depart_release_hold_active: - output_a_target = max(output_a_target, STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL) - - output_a_target = self.get_vehicle_far_follow_slew_target( - scene_v_ego, - prev_output_a_target, - output_a_target, - bool(output_should_stop or vision_low_speed_stop_active), - panic_bypass, - ) - - if radar_gap_settle_active: - output_a_target = RADAR_STANDSTILL_GAP_SETTLE_ACCEL - output_should_stop = False - - self.output_a_target = output_a_target - self.output_should_stop = bool(output_should_stop or vision_low_speed_stop_active) - def publish(self, sm, pm): - plan_send = messaging.new_message('longitudinalPlan') + plan_send = messaging.new_message("longitudinalPlan") + plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"]) - plan_send.valid = sm.all_checks(service_list=['carState', 'controlsState', 'selfdriveState', 'radarState']) + plan = plan_send.longitudinalPlan + plan.modelMonoTime = sm.logMonoTime["modelV2"] + plan.processingDelay = (plan_send.logMonoTime / 1e9) - sm.logMonoTime["modelV2"] + plan.solverExecutionTime = self.mpc.solve_time + plan.speeds = self.v_desired_trajectory.tolist() + plan.accels = self.a_desired_trajectory.tolist() + plan.jerks = self.j_desired_trajectory.tolist() + plan.hasLead = any(lead.status for lead in (sm["radarState"].leadOne, sm["radarState"].leadTwo)) + plan.longitudinalPlanSource = self.plan_source + plan.fcw = self.fcw + plan.aTarget = float(self.output_a_target) - longitudinalPlan = plan_send.longitudinalPlan - longitudinalPlan.modelMonoTime = sm.logMonoTime['modelV2'] - longitudinalPlan.processingDelay = (plan_send.logMonoTime / 1e9) - sm.logMonoTime['modelV2'] - longitudinalPlan.solverExecutionTime = self.mpc.solve_time - - longitudinalPlan.speeds = self.v_desired_trajectory.tolist() - longitudinalPlan.accels = self.a_desired_trajectory.tolist() - longitudinalPlan.jerks = self.j_desired_trajectory.tolist() - - longitudinalPlan.hasLead = sm['radarState'].leadOne.status - longitudinalPlan.longitudinalPlanSource = self.mpc.source - longitudinalPlan.fcw = self.fcw - - longitudinalPlan.aTarget = float(self.output_a_target) force_stop_handoff = bool( - sm['starpilotPlan'].forcingStop and ( - sm['starpilotPlan'].forcingStopLength < 1.0 or - sm['starpilotPlan'].vCruise <= FORCE_STOP_HANDOFF_MAX_VCRUISE + sm["starpilotPlan"].forcingStop and ( + sm["starpilotPlan"].forcingStopLength < 1.0 or + sm["starpilotPlan"].vCruise <= FORCE_STOP_HANDOFF_MAX_VCRUISE ) ) - longitudinalPlan.shouldStop = bool(self.output_should_stop) or force_stop_handoff - longitudinalPlan.allowBrake = True - longitudinalPlan.allowThrottle = bool(self.allow_throttle) - - pm.send('longitudinalPlan', plan_send) + plan.shouldStop = bool(self.output_should_stop or force_stop_handoff) + plan.allowBrake = True + plan.allowThrottle = bool(self.allow_throttle) + pm.send("longitudinalPlan", plan_send) diff --git a/selfdrive/controls/lib/longitudinal_vehicle_tunes.py b/selfdrive/controls/lib/longitudinal_vehicle_tunes.py index b12d7f311..e5250aecc 100644 --- a/selfdrive/controls/lib/longitudinal_vehicle_tunes.py +++ b/selfdrive/controls/lib/longitudinal_vehicle_tunes.py @@ -1,18 +1,28 @@ -HONDA_HRV_3G_FAR_FOLLOW_BRAKE_SLEW_RATE = 3.0 -HONDA_HRV_3G_FAR_FOLLOW_RELEASE_SLEW_RATE = 2.0 -HONDA_HRV_3G_UNTRACKED_SLOW_LEAD_DECEL_SCALE = 1.35 +from dataclasses import dataclass -def get_far_follow_output_slew_rates(CP): - if CP.brand == "honda" and str(CP.carFingerprint) == "HONDA_HRV_3G": - return ( - HONDA_HRV_3G_FAR_FOLLOW_BRAKE_SLEW_RATE, - HONDA_HRV_3G_FAR_FOLLOW_RELEASE_SLEW_RATE, - ) - return 0.0, 0.0 +@dataclass(frozen=True) +class LongitudinalPlannerTune: + lead_filter_tau: float = 0.45 + accel_slew_rate: float = 0.90 + brake_slew_rate: float = 1.40 + launch_accel: float = 0.35 -def get_untracked_slow_lead_decel_scale(CP): - if CP.brand == "honda" and str(CP.carFingerprint) == "HONDA_HRV_3G": - return HONDA_HRV_3G_UNTRACKED_SLOW_LEAD_DECEL_SCALE - return 1.0 +DEFAULT_TUNE = LongitudinalPlannerTune() + +# Vehicle exceptions are deliberately declarative and limited to physical +# response differences. Planning and safety logic remain global. +VEHICLE_TUNES = { + ("honda", "HONDA_HRV_3G"): LongitudinalPlannerTune( + lead_filter_tau=0.65, + accel_slew_rate=0.65, + brake_slew_rate=1.00, + launch_accel=0.30, + ), +} + + +def get_longitudinal_planner_tune(CP): + key = (str(getattr(CP, "brand", "")), str(getattr(CP, "carFingerprint", ""))) + return VEHICLE_TUNES.get(key, DEFAULT_TUNE) diff --git a/selfdrive/controls/tests/test_conditional_chill_mode.py b/selfdrive/controls/tests/test_conditional_chill_mode.py deleted file mode 100644 index a4635d3d6..000000000 --- a/selfdrive/controls/tests/test_conditional_chill_mode.py +++ /dev/null @@ -1,463 +0,0 @@ -from types import SimpleNamespace - -from openpilot.common.constants import CV -from openpilot.starpilot.common.experimental_state import CCStatus -from openpilot.starpilot.controls.lib.conditional_chill_mode import ConditionalChillMode - - -class FakeParams: - def __init__(self, bools=None, ints=None): - self.bools = dict(bools or {}) - self.ints = dict(ints or {}) - - def get_bool(self, key): - return bool(self.bools.get(key, False)) - - def put_bool(self, key, value): - self.bools[key] = bool(value) - - def get_int(self, key, default=0): - return int(self.ints.get(key, default)) - - def put_int(self, key, value): - self.ints[key] = int(value) - - -class FakeDetector: - def __init__(self): - self.curve_detected = False - self.slow_lead_detected = False - self.stop_light_detected = False - self.stop_light_model_detected = False - - def curve_detection(self, *_args, **_kwargs): - return None - - def slow_lead(self, *_args, **_kwargs): - return None - - def stop_sign_and_light(self, *_args, **_kwargs): - return None - - -class FakeSubMaster: - def __init__(self, services): - self.services = dict(services) - - def __getitem__(self, key): - return self.services[key] - - -def make_sm(): - return { - "carState": SimpleNamespace(standstill=False, leftBlinker=False, rightBlinker=False), - "selfdriveState": SimpleNamespace(enabled=True), - "longitudinalPlan": SimpleNamespace(allowThrottle=True, shouldStop=False), - "starpilotCarState": SimpleNamespace(trafficModeEnabled=False), - "starpilotPlan": SimpleNamespace(redLight=False, forcingStop=False), - "starpilotRadarState": SimpleNamespace( - leadLeft=SimpleNamespace(status=False, dRel=float("inf"), vLead=0.0), - leadRight=SimpleNamespace(status=False, dRel=float("inf"), vLead=0.0), - ), - } - - -def make_submaster_sm(): - return FakeSubMaster(make_sm()) - - -def make_toggles(): - return SimpleNamespace( - conditional_chill_speed=45 * CV.MPH_TO_MS, - conditional_chill_speed_lead=35 * CV.MPH_TO_MS, - conditional_chill_speed_margin=3 * CV.MPH_TO_MS, - conditional_chill_lead=True, - conditional_chill_launch_assist=False, - ) - - -def make_ccm(): - planner = SimpleNamespace( - params=FakeParams(), - params_memory=FakeParams(), - starpilot_vcruise=SimpleNamespace( - stop_sign_confirmed=False, - forcing_stop=False, - slc=SimpleNamespace(experimental_mode=False), - ), - raw_model_stopped=False, - model_stopped=False, - tracking_lead=False, - lead_one=SimpleNamespace( - status=False, - dRel=float("inf"), - vLead=0.0, - vRel=0.0, - aLeadK=0.0, - modelProb=0.0, - radar=False, - ), - ) - detector = FakeDetector() - return planner, detector, ConditionalChillMode(planner, detector) - - -def test_ccm_stays_experimental_when_no_chill_condition_matches(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 1.0) - ccm.update(20 * CV.MPH_TO_MS, 21 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_enters_chill_for_open_road_speed_recovery(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - monotonic_values = iter([10.0, 10.5]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - v_ego = 55 * CV.MPH_TO_MS - v_cruise = v_ego + 5 * CV.MPH_TO_MS - ccm.update(v_ego, v_cruise, sm, toggles) - ccm.update(v_ego, v_cruise, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["SPEED"] - assert planner.params_memory.get_int("CCStatus") == CCStatus["SPEED"] - - -def test_ccm_enters_chill_for_stable_lead_cruising(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - monotonic_values = iter([10.0, 11.1]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 45.0 - planner.lead_one.vLead = 24.8 - planner.lead_one.radar = True - - v_ego = 58 * CV.MPH_TO_MS - ccm.update(v_ego, v_ego, sm, toggles) - ccm.update(v_ego, v_ego, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["LEAD"] - - -def test_ccm_stable_lead_requires_longer_entry_debounce(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - monotonic_values = iter([10.0, 10.6]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 45.0 - planner.lead_one.vLead = 24.8 - planner.lead_one.radar = True - - v_ego = 58 * CV.MPH_TO_MS - ccm.update(v_ego, v_ego, sm, toggles) - ccm.update(v_ego, v_ego, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_hard_vetoes_force_experimental(monkeypatch): - planner, detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - v_ego = 60 * CV.MPH_TO_MS - v_cruise = v_ego + 5 * CV.MPH_TO_MS - - veto_scenes = [] - - detector.slow_lead_detected = True - veto_scenes.append(("slow_lead", make_sm())) - detector.slow_lead_detected = False - - traffic_sm = make_sm() - traffic_sm["starpilotCarState"].trafficModeEnabled = True - veto_scenes.append(("traffic_mode", traffic_sm)) - - adjacent_sm = make_sm() - adjacent_sm["starpilotRadarState"].leadLeft = SimpleNamespace(status=True, dRel=25.0, vLead=12.0) - veto_scenes.append(("adjacent_lead", adjacent_sm)) - - for index, (_name, scene_sm) in enumerate(veto_scenes, start=1): - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda idx=index: float(idx)) - if _name == "slow_lead": - detector.slow_lead_detected = True - else: - detector.slow_lead_detected = False - ccm.update(v_ego, v_cruise, scene_sm, toggles) - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - planner.starpilot_vcruise.slc.experimental_mode = True - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 10.0) - ccm.update(v_ego, v_cruise, sm, toggles) - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_far_lateral_adjacent_lead_does_not_block_open_road_chill(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - monotonic_values = iter([10.0, 10.5]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - sm["starpilotRadarState"].leadLeft = SimpleNamespace(status=True, dRel=18.0, vLead=12.0, yRel=6.5) - - v_ego = 55 * CV.MPH_TO_MS - v_cruise = v_ego + 5 * CV.MPH_TO_MS - ccm.update(v_ego, v_cruise, sm, toggles) - ccm.update(v_ego, v_cruise, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["SPEED"] - - -def test_ccm_immediate_adjacent_lead_still_blocks_open_road_chill(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 10.0) - sm["starpilotRadarState"].leadLeft = SimpleNamespace(status=True, dRel=18.0, vLead=12.0, yRel=4.5) - - v_ego = 55 * CV.MPH_TO_MS - v_cruise = v_ego + 5 * CV.MPH_TO_MS - ccm.update(v_ego, v_cruise, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_immediately_exits_chill_when_scene_turns_into_slow_lead(monkeypatch): - planner, detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - monotonic_values = iter([10.0, 11.1, 11.2]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 40.0 - planner.lead_one.vLead = 24.9 - planner.lead_one.radar = True - - v_ego = 58 * CV.MPH_TO_MS - ccm.update(v_ego, v_ego, sm, toggles) - ccm.update(v_ego, v_ego, sm, toggles) - assert not ccm.experimental_mode - - detector.slow_lead_detected = True - ccm.update(v_ego, v_ego, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_launch_assist_enters_chill_from_standstill_when_planner_wants_to_go(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 20.0) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["SPEED"] - - -def test_ccm_launch_assist_does_not_bypass_real_stop_scene(monkeypatch): - planner, detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - sm["longitudinalPlan"].shouldStop = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 21.0) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - detector.stop_light_detected = True - sm["longitudinalPlan"].shouldStop = False - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_launch_assist_rejects_red_light_stationary_lead_even_if_planner_says_go(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - sm["starpilotPlan"].redLight = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 6.1 - planner.lead_one.vLead = 0.01 - planner.lead_one.vRel = -0.08 - planner.lead_one.aLeadK = 0.0 - planner.lead_one.radar = True - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 22.0) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_launch_assist_requires_real_lead_departure_signal(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 18.0 - planner.lead_one.vLead = 0.12 - planner.lead_one.vRel = 0.05 - planner.lead_one.aLeadK = 0.02 - planner.lead_one.radar = True - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 23.0) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - planner.lead_one.vLead = 0.8 - planner.lead_one.vRel = 0.5 - planner.lead_one.aLeadK = 0.2 - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 23.2) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["LEAD"] - - -def test_ccm_launch_assist_exits_once_launch_speed_is_reached(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - monotonic_values = iter([30.0, 30.2]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - assert not ccm.experimental_mode - - sm["carState"].standstill = False - ccm.update(16 * CV.MPH_TO_MS, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_launch_assist_exits_immediately_if_lead_slows_again(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - toggles = make_toggles() - toggles.conditional_chill_launch_assist = True - monotonic_values = iter([40.0, 40.1]) - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: next(monotonic_values)) - - planner.tracking_lead = True - planner.lead_one.status = True - planner.lead_one.dRel = 18.0 - planner.lead_one.vLead = 2.0 - planner.lead_one.vRel = 2.0 - planner.lead_one.aLeadK = 0.2 - planner.lead_one.radar = True - - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["LEAD"] - - sm["carState"].standstill = False - planner.lead_one.vLead = 0.2 - planner.lead_one.vRel = 0.0 - planner.lead_one.aLeadK = -0.4 - ccm.update(3 * CV.MPH_TO_MS, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_respects_manual_chill_override(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - planner.params_memory.put_int("CCStatus", CCStatus["USER_CHILL"]) - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 1.0) - ccm.update(55 * CV.MPH_TO_MS, 60 * CV.MPH_TO_MS, sm, toggles) - - assert not ccm.experimental_mode - assert ccm.status_value == CCStatus["USER_CHILL"] - - -def test_ccm_launch_assist_is_disabled_by_default(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - sm["carState"].standstill = True - toggles = make_toggles() - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 50.0) - ccm.update(0.0, 25 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] - - -def test_ccm_restores_persisted_manual_experimental_override(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_sm() - toggles = make_toggles() - planner.params.put_bool("PersistChillState", True) - planner.params.put_int("PersistedCCStatus", CCStatus["USER_EXPERIMENTAL"]) - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 1.0) - ccm.update(55 * CV.MPH_TO_MS, 60 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["USER_EXPERIMENTAL"] - assert planner.params_memory.get_int("CCStatus") == CCStatus["USER_EXPERIMENTAL"] - - -def test_ccm_adjacent_lead_veto_works_with_submaster_like_input(monkeypatch): - planner, _detector, ccm = make_ccm() - sm = make_submaster_sm() - toggles = make_toggles() - sm["starpilotRadarState"].leadLeft = SimpleNamespace(status=True, dRel=20.0, vLead=12.0) - - monkeypatch.setattr("openpilot.starpilot.controls.lib.conditional_chill_mode.time.monotonic", lambda: 10.0) - ccm.update(60 * CV.MPH_TO_MS, 65 * CV.MPH_TO_MS, sm, toggles) - - assert ccm.experimental_mode - assert ccm.status_value == CCStatus["OFF"] diff --git a/selfdrive/controls/tests/test_conditional_experimental_mode.py b/selfdrive/controls/tests/test_conditional_experimental_mode.py deleted file mode 100644 index c0eb46890..000000000 --- a/selfdrive/controls/tests/test_conditional_experimental_mode.py +++ /dev/null @@ -1,1115 +0,0 @@ -from pathlib import Path -from types import SimpleNamespace - -from openpilot.common.constants import CV -from openpilot.starpilot.controls.starpilot_planner import StarPilotPlanner -import openpilot.starpilot.controls.starpilot_planner as starpilot_planner_module -import openpilot.starpilot.controls.lib.conditional_experimental_mode as conditional_experimental_mode_module -from openpilot.starpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode - - -class FakeParams: - def __init__(self, initial=None): - self._store = dict(initial or {}) - - def get_bool(self, key): - return bool(self._store.get(key, False)) - - def put_bool(self, key, value): - self._store[key] = bool(value) - - def get_int(self, key, default=0): - return int(self._store.get(key, default)) - - def put_int(self, key, value): - self._store[key] = int(value) - - -def make_cem(*, model_length: float, model_stopped: bool = False, tracking_lead: bool = False, - lead_status: bool = False, lead_d_rel: float = float("inf"), - lead_v_lead: float = 0.0, lead_model_prob: float = 0.0, lead_radar: bool = False, - stop_sign_confirmed: bool = False, forcing_stop: bool = False): - planner = SimpleNamespace( - params=FakeParams(), - params_memory=FakeParams(), - model_length=model_length, - model_stopped=model_stopped, - tracking_lead=tracking_lead, - starpilot_vcruise=SimpleNamespace( - stop_sign_confirmed=stop_sign_confirmed, - forcing_stop=forcing_stop, - slc=SimpleNamespace(experimental_mode=False), - ), - starpilot_following=SimpleNamespace(slower_lead=False, following_lead=False), - lead_one=SimpleNamespace(status=lead_status, dRel=lead_d_rel, vLead=lead_v_lead, - modelProb=lead_model_prob, radar=lead_radar), - road_curvature_detected=False, - driving_in_curve=False, - lane_width_left=0.0, - lane_width_right=0.0, - ) - return ConditionalExperimentalMode(planner) - - -def make_sm(traffic_mode_enabled: bool = False): - return { - "carState": SimpleNamespace(standstill=False, leftBlinker=False, rightBlinker=False, steeringAngleDeg=0.0), - "starpilotCarState": SimpleNamespace(trafficModeEnabled=traffic_mode_enabled), - } - - -def run_stop_light_detector(cem, v_ego, *, steps: int, tracking_lead: bool = False): - for _ in range(steps): - cem.starpilot_planner.tracking_lead = tracking_lead - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - - -def make_update_sm(*, standstill: bool): - return { - "carState": SimpleNamespace(standstill=standstill, leftBlinker=False, rightBlinker=False, gasPressed=False, steeringAngleDeg=0.0), - "starpilotCarState": SimpleNamespace(trafficModeEnabled=False, dashboardStopSign=0, accelPressed=False), - } - - -def make_update_toggles(): - return SimpleNamespace( - conditional_limit=0.0, - conditional_limit_lead=0.0, - conditional_signal=0.0, - conditional_signal_lane_detection=False, - lane_detection_width=0.0, - conditional_curves=False, - conditional_curves_lead=False, - conditional_lead=False, - conditional_model_stop_time=7.0, - conditional_slower_lead=False, - conditional_stopped_lead=False, - ) - - -def test_low_speed_cruise_does_not_trigger_stop_light_from_model_stopped(): - v_ego = 10 * CV.MPH_TO_MS - model_length = v_ego * 10.0 - - cem = make_cem(model_length=model_length, model_stopped=True) - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - - assert not cem.stop_light_detected - - -def test_predicted_stop_within_threshold_triggers_stop_light(): - v_ego = 30 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length) - run_stop_light_detector(cem, v_ego, steps=20) - - assert cem.stop_light_detected - - -def test_chattering_lead_does_not_trigger_stop_light(): - v_ego = 22 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length) - for i in range(30): - cem.starpilot_planner.tracking_lead = (i % 2 == 0) - cem.starpilot_planner.lead_one.status = (i % 2 == 0) - cem.starpilot_planner.lead_one.dRel = model_length + 5.0 - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - - assert not cem.stop_light_detected - - -def test_close_visible_but_untracked_lead_blocks_stop_light(): - v_ego = 22 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length, lead_status=True, lead_d_rel=model_length + 5.0) - run_stop_light_detector(cem, v_ego, steps=30) - - assert not cem.stop_light_detected - - -def test_far_visible_lead_does_not_block_stop_light(): - v_ego = 22 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length, lead_status=True, lead_d_rel=v_ego * 7.0 + 30.0) - run_stop_light_detector(cem, v_ego, steps=30) - - assert cem.stop_light_detected - - -def test_stop_light_stays_latched_until_untracked_stopped_lead_handoff(): - v_ego = 45 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length) - run_stop_light_detector(cem, v_ego, steps=30) - assert cem.stop_light_detected - - cem.starpilot_planner.lead_one.status = True - cem.starpilot_planner.lead_one.dRel = model_length - 5.0 - cem.starpilot_planner.lead_one.vLead = 0.5 - run_stop_light_detector(cem, v_ego, steps=10, tracking_lead=False) - - assert cem.stop_light_detected - - -def test_stop_light_latch_holds_slow_high_confidence_vision_lead_during_model_flicker(monkeypatch): - v_ego = 40 * CV.MPH_TO_MS - model_length = v_ego * 3.8 - cem = make_cem( - model_length=model_length, - lead_status=True, - lead_d_rel=model_length - 5.0, - lead_v_lead=3.0, - lead_model_prob=0.98, - ) - - run_stop_light_detector(cem, v_ego, steps=20) - assert cem.stop_light_detected - - monotonic_values = iter([10.0, 10.2]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - cem.stop_light_detected = False - cem.stop_light_model_detected = False - cem.stop_light_filter.x = 0.0 - cem.starpilot_planner.model_length = v_ego * 9.0 - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - - assert cem.stop_light_detected - - -def test_stop_light_hold_bridges_short_no_lead_model_flicker(monkeypatch): - v_ego = 40 * CV.MPH_TO_MS - cem = make_cem(model_length=v_ego * 3.8) - - run_stop_light_detector(cem, v_ego, steps=20) - assert cem.stop_light_detected - cem.stop_light_detected_hold_until = 11.75 - - monotonic_values = iter([10.0, 11.0, 14.5, 16.5, 18.5]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.starpilot_planner.model_length = v_ego * 9.0 - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert not cem.stop_light_detected - - -def test_stop_light_hold_refreshes_through_stopped_approach_lead(monkeypatch): - v_ego = 20 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - cem = make_cem( - model_length=model_length, - lead_status=True, - lead_d_rel=model_length - 5.0, - lead_v_lead=0.5, - lead_model_prob=0.98, - ) - - run_stop_light_detector(cem, v_ego, steps=20) - assert cem.stop_light_detected - - monotonic_values = iter([20.0, 21.2, 22.4]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.starpilot_planner.model_length = v_ego * 9.0 - cem.stop_light_detected = False - cem.stop_light_model_detected = False - cem.stop_light_filter.x = 0.0 - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.starpilot_planner.lead_one.vLead = 6.0 - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert not cem.stop_light_detected - - -def test_stop_light_approach_latch_clears_once_tracked_lead_takes_over(monkeypatch): - v_ego = 20 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - cem = make_cem( - model_length=model_length, - lead_status=True, - lead_d_rel=model_length - 5.0, - lead_v_lead=0.5, - lead_model_prob=0.98, - ) - - run_stop_light_detector(cem, v_ego, steps=20) - assert cem.stop_light_detected - - monotonic_values = iter([20.0, 20.2]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.starpilot_planner.model_length = v_ego * 9.0 - cem.stop_light_detected = False - cem.stop_light_model_detected = False - cem.stop_light_filter.x = 0.0 - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected - - cem.starpilot_planner.tracking_lead = True - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert not cem.stop_light_detected - - -def test_stopped_lead_handoff_does_not_hold_cem_on_empty_road(monkeypatch): - v_ego = 40 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 9.0, - tracking_lead=False, - lead_status=False, - ) - cem.stop_light_detected = True - cem.stop_light_model_detected = False - cem.stop_light_filter.x = 0.0 - cem.stop_approach_hold_until = 11.0 - cem.stop_light_detected_hold_until = 0.0 - - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: 10.2) - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - - assert not cem.stop_light_detected - - -def test_stopped_lead_toggle_does_not_self_trigger_without_a_real_lead(): - v_ego = 25 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 6.0, - tracking_lead=False, - lead_status=False, - lead_v_lead=0.0, - ) - toggles = SimpleNamespace(conditional_slower_lead=False, conditional_stopped_lead=True) - - for _ in range(24): - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_stopped_lead_toggle_still_triggers_for_real_close_stopped_lead(): - v_ego = 25 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 4.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=18.0, - lead_v_lead=0.4, - lead_model_prob=0.99, - ) - toggles = SimpleNamespace(conditional_slower_lead=False, conditional_stopped_lead=True) - - for _ in range(24): - cem.slow_lead(toggles, v_ego) - - assert cem.slow_lead_detected - - -def test_borderline_empty_road_model_dip_does_not_refresh_long_hold(monkeypatch): - v_ego = 20 * CV.MPH_TO_MS - stop_threshold = v_ego * 7.0 - cem = make_cem(model_length=stop_threshold - 4.0) - cem.stop_light_filter.x = conditional_experimental_mode_module.THRESHOLD ** 2 - - monotonic_values = iter([10.0, 10.2]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert cem.stop_light_detected_hold_until == 0.0 - - cem.starpilot_planner.model_length = stop_threshold + 20.0 - cem.stop_sign_and_light(v_ego, make_sm(), model_time=7.0) - assert not cem.stop_light_detected - - -def test_standstill_red_light_keeps_exp_on_even_when_model_stopped_clears(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - cem.stop_light_detected = True - cem.experimental_mode = False - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_standstill_close_stopped_lead_does_not_drop_red_light_exp(monkeypatch): - cem = make_cem( - model_length=80.0, - model_stopped=False, - lead_status=True, - lead_d_rel=8.0, - lead_v_lead=0.0, - ) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - cem.stop_light_detected = True - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_standstill_update_can_activate_exp_from_red_light_detection(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - def detect_red_light(*args, **kwargs): - cem.stop_light_detected = True - - monkeypatch.setattr(cem, "stop_sign_and_light", detect_red_light) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_first_post_standstill_pullaway_frame_does_not_blip_into_exp(monkeypatch): - cem = make_cem( - model_length=70.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=8.4, - lead_v_lead=2.7, - lead_model_prob=0.999, - ) - toggles = make_update_toggles() - toggles.conditional_lead = True - toggles.conditional_slower_lead = True - toggles.conditional_stopped_lead = True - standstill_sm = make_update_sm(standstill=True) - moving_sm = make_update_sm(standstill=False) - - now = [100.0] - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - cem.update(0.0, standstill_sm, toggles) - assert not cem.experimental_mode - - now[0] = 100.1 - cem.update(0.12, moving_sm, toggles) - - assert not cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["OFF"] - - -def test_post_stop_speed_trigger_is_suppressed_after_red_light_release(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - toggles.conditional_limit = 5.0 * CV.MPH_TO_MS - standstill_sm = make_update_sm(standstill=True) - moving_sm = make_update_sm(standstill=False) - - now = [100.0] - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - def hold_red_light(*args, **kwargs): - cem.stop_light_detected = True - - monkeypatch.setattr(cem, "stop_sign_and_light", hold_red_light) - cem.update(0.0, standstill_sm, toggles) - assert cem.experimental_mode - - def clear_red_light(*args, **kwargs): - cem.stop_light_detected = False - cem.stop_light_model_detected = False - - monkeypatch.setattr(cem, "stop_sign_and_light", clear_red_light) - - low_speed_trigger_v_ego = 4.0 * CV.MPH_TO_MS - - now[0] = 100.1 - cem.update(low_speed_trigger_v_ego, moving_sm, toggles) - assert not cem.experimental_mode - assert cem.params_memory.get_int("CEStatus") == conditional_experimental_mode_module.CEStatus["OFF"] - - now[0] = 102.5 - cem.update(low_speed_trigger_v_ego, moving_sm, toggles) - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["SPEED"] - - -def test_post_stop_suppression_survives_hold_release_before_motion(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - toggles.conditional_limit = 5.0 * CV.MPH_TO_MS - standstill_sm = make_update_sm(standstill=True) - moving_sm = make_update_sm(standstill=False) - - now = [100.0] - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - def hold_red_light(*args, **kwargs): - cem.stop_light_detected = True - - monkeypatch.setattr(cem, "stop_sign_and_light", hold_red_light) - cem.update(0.0, standstill_sm, toggles) - assert cem.experimental_mode - - def clear_red_light(*args, **kwargs): - cem.stop_light_detected = False - cem.stop_light_model_detected = False - - monkeypatch.setattr(cem, "stop_sign_and_light", clear_red_light) - - now[0] = 100.1 - cem.update(0.0, standstill_sm, toggles) - assert not cem.experimental_mode - assert cem.standstill_stop_release_pending - - low_speed_trigger_v_ego = 4.0 * CV.MPH_TO_MS - - now[0] = 100.2 - cem.update(low_speed_trigger_v_ego, moving_sm, toggles) - assert not cem.experimental_mode - assert not cem.standstill_stop_release_pending - - now[0] = 102.5 - cem.update(low_speed_trigger_v_ego, moving_sm, toggles) - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["SPEED"] - - -def test_post_stop_slow_lead_trigger_is_suppressed_after_red_light_release(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - toggles.conditional_lead = True - toggles.conditional_slower_lead = True - toggles.conditional_stopped_lead = True - standstill_sm = make_update_sm(standstill=True) - moving_sm = make_update_sm(standstill=False) - - now = [100.0] - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - def hold_red_light(*args, **kwargs): - cem.stop_light_detected = True - - def clear_red_light(*args, **kwargs): - cem.stop_light_detected = False - cem.stop_light_model_detected = False - - def detect_slow_lead(*args, **kwargs): - cem.slow_lead_detected = True - - monkeypatch.setattr(cem, "stop_sign_and_light", hold_red_light) - cem.update(0.0, standstill_sm, toggles) - assert cem.experimental_mode - - monkeypatch.setattr(cem, "stop_sign_and_light", clear_red_light) - monkeypatch.setattr(cem, "slow_lead", detect_slow_lead) - - launch_v_ego = 8.0 * CV.MPH_TO_MS - - now[0] = 100.1 - cem.update(launch_v_ego, moving_sm, toggles) - assert not cem.experimental_mode - assert cem.params_memory.get_int("CEStatus") == conditional_experimental_mode_module.CEStatus["OFF"] - - now[0] = 102.5 - cem.update(launch_v_ego, moving_sm, toggles) - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["LEAD"] - - -def test_slow_lead_mode_release_waits_for_stable_credible_lead(monkeypatch): - v_ego = 20.0 - cem = make_cem( - model_length=100.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=34.0, - lead_v_lead=18.5, - lead_model_prob=0.99, - ) - toggles = make_update_toggles() - toggles.conditional_lead = True - toggles.conditional_slower_lead = True - sm = make_update_sm(standstill=False) - slow_lead_active = [True] - now = [100.0] - - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - def update_conditions(*args, **kwargs): - cem.slow_lead_detected = slow_lead_active[0] - - monkeypatch.setattr(cem, "update_conditions", update_conditions) - - cem.update(v_ego, sm, toggles) - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["LEAD"] - - slow_lead_active[0] = False - now[0] = 100.9 - cem.update(v_ego, sm, toggles) - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["LEAD"] - - now[0] = 101.6 - cem.update(v_ego, sm, toggles) - assert not cem.experimental_mode - assert cem.params_memory.get_int("CEStatus") == conditional_experimental_mode_module.CEStatus["OFF"] - - -def test_slow_lead_mode_release_does_not_hold_missing_lead(monkeypatch): - v_ego = 20.0 - cem = make_cem( - model_length=100.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=34.0, - lead_v_lead=18.5, - lead_model_prob=0.99, - ) - toggles = make_update_toggles() - toggles.conditional_lead = True - toggles.conditional_slower_lead = True - sm = make_update_sm(standstill=False) - slow_lead_active = [True] - now = [200.0] - - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: now[0]) - - def update_conditions(*args, **kwargs): - cem.slow_lead_detected = slow_lead_active[0] - - monkeypatch.setattr(cem, "update_conditions", update_conditions) - - cem.update(v_ego, sm, toggles) - assert cem.experimental_mode - - slow_lead_active[0] = False - cem.starpilot_planner.lead_one.status = False - cem.starpilot_planner.tracking_lead = False - now[0] = 200.6 - cem.update(v_ego, sm, toggles) - assert cem.experimental_mode - - now[0] = 200.9 - cem.update(v_ego, sm, toggles) - - assert not cem.experimental_mode - assert cem.params_memory.get_int("CEStatus") == conditional_experimental_mode_module.CEStatus["OFF"] - - -def test_standstill_update_can_activate_exp_from_dashboard_stop_sign(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - sm["starpilotCarState"].dashboardStopSign = 1 - - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.standstill_stop_reason == "sign" - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_standstill_green_light_clears_exp_immediately(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - cem.stop_light_detected = True - cem.experimental_mode = True - - def clear_red_light(*args, **kwargs): - cem.stop_light_detected = False - cem.stop_light_model_detected = False - - monkeypatch.setattr(cem, "stop_sign_and_light", clear_red_light) - - cem.update(0.0, sm, toggles) - - assert not cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["OFF"] - - -def test_standstill_dashboard_stop_sign_keeps_exp_on(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False, stop_sign_confirmed=True) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_standstill_force_stop_keeps_exp_on_even_if_red_light_latch_clears(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False, forcing_stop=True) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - - cem.stop_light_detected = True - cem.experimental_mode = True - - def clear_red_light(*args, **kwargs): - cem.stop_light_detected = False - cem.stop_light_model_detected = False - - monkeypatch.setattr(cem, "stop_sign_and_light", clear_red_light) - - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.status_value == conditional_experimental_mode_module.CEStatus["STOP_LIGHT"] - - -def test_committed_turn_veto_blocks_stop_light_detection(): - v_ego = 10 * CV.MPH_TO_MS - model_length = v_ego * 4.0 - - cem = make_cem(model_length=model_length) - sm = make_sm() - sm["carState"].rightBlinker = True - sm["carState"].steeringAngleDeg = 70.0 - - run_stop_light_detector(cem, v_ego, steps=20) - assert cem.stop_light_detected - - cem.stop_light_detected = False - cem.stop_light_model_detected = False - cem.stop_light_filter.x = 0.0 - - for _ in range(20): - cem.stop_sign_and_light(v_ego, sm, model_time=7.0) - - assert not cem.stop_light_detected - - -def test_standstill_stop_sign_latches_until_pedal_even_after_force_stop_ends(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - sm["starpilotCarState"].dashboardStopSign = 1 - - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.standstill_stop_reason == "sign" - - sm["starpilotCarState"].dashboardStopSign = 0 - cem.update(0.0, sm, toggles) - - assert cem.experimental_mode - assert cem.standstill_stop_reason == "sign" - - -def test_standstill_stop_sign_releases_on_pedal(monkeypatch): - cem = make_cem(model_length=80.0, model_stopped=False) - toggles = make_update_toggles() - sm = make_update_sm(standstill=True) - sm["starpilotCarState"].dashboardStopSign = 1 - - monkeypatch.setattr(cem, "stop_sign_and_light", lambda *args, **kwargs: None) - cem.update(0.0, sm, toggles) - assert cem.experimental_mode - - sm["starpilotCarState"].dashboardStopSign = 0 - sm["carState"].gasPressed = True - cem.update(0.0, sm, toggles) - - assert not cem.experimental_mode - assert cem.standstill_stop_reason is None - - -def test_slow_lead_holds_through_tracking_flap_for_high_confidence_vision_lead(): - v_ego = 35 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=v_ego * 3.5, - lead_v_lead=8.0 * CV.MPH_TO_MS, - lead_model_prob=0.95, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - - cem.starpilot_planner.tracking_lead = False - cem.starpilot_planner.starpilot_following.slower_lead = False - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - -def test_untracked_raw_slow_lead_does_not_self_trigger_without_recent_tracking(monkeypatch): - v_ego = 35 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=False, - lead_status=True, - lead_d_rel=v_ego * 3.0, - lead_v_lead=8.0 * CV.MPH_TO_MS, - lead_model_prob=0.95, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - monotonic_values = iter([20.0 + 0.1 * i for i in range(24)]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - for _ in range(12): - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_untracked_raw_slow_lead_continuity_expires_after_tracking_flap(monkeypatch): - v_ego = 35 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=v_ego * 3.0, - lead_v_lead=8.0 * CV.MPH_TO_MS, - lead_model_prob=0.95, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - monotonic_values = iter([30.0, 30.1, 31.6]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - cem.starpilot_planner.tracking_lead = False - cem.starpilot_planner.starpilot_following.slower_lead = False - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - cem.slow_lead(toggles, v_ego) - assert not cem.slow_lead_detected - - -def test_tracked_highway_mild_closing_lead_does_not_trigger_raw_slow_lead(): - v_ego = 65 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=46.0, - lead_v_lead=v_ego - 1.4, - lead_model_prob=1.0, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 0.0 - cem.slow_lead_detected = False - cem.starpilot_planner.starpilot_following.slower_lead = False - for _ in range(12): - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_tracked_following_slower_lead_still_triggers_slow_lead(): - v_ego = 65 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=36.0, - lead_v_lead=v_ego - 3.0, - lead_model_prob=1.0, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 0.0 - cem.slow_lead_detected = False - cem.starpilot_planner.starpilot_following.slower_lead = True - for _ in range(24): - cem.slow_lead(toggles, v_ego) - - assert cem.slow_lead_detected - - -def test_far_radar_slower_lead_waits_for_comfort_range_before_triggering(): - v_ego = 75 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=136.0, - lead_v_lead=v_ego - 5.0, - lead_model_prob=1.0, - lead_radar=True, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - cem.starpilot_planner.starpilot_following.slower_lead = True - - for _ in range(24): - cem.slow_lead(toggles, v_ego) - assert not cem.slow_lead_detected - - cem.starpilot_planner.lead_one.dRel = 80.0 - for _ in range(24): - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - -def test_far_vision_slower_lead_keeps_existing_trigger_range(): - v_ego = 75 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=110.0, - lead_v_lead=v_ego - 5.0, - lead_model_prob=1.0, - lead_radar=False, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - cem.starpilot_planner.starpilot_following.slower_lead = True - - for _ in range(24): - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - -def test_tracked_vision_slow_lead_continues_existing_experimental_mode(): - v_ego = 8.0 - cem = make_cem( - model_length=80.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=22.0, - lead_v_lead=6.4, - lead_model_prob=0.99, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.prev_experimental_mode = True - for _ in range(24): - cem.slow_lead(toggles, v_ego) - - assert cem.slow_lead_detected - - -def test_tracked_vision_slow_lead_does_not_start_experimental_mode(): - v_ego = 8.0 - cem = make_cem( - model_length=80.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=22.0, - lead_v_lead=6.4, - lead_model_prob=0.99, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - for _ in range(24): - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_slow_lead_does_not_linger_at_crawl_when_stopped_lead_disabled(): - v_ego = 1.5 - cem = make_cem( - model_length=20.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=8.0, - lead_v_lead=1.2, - lead_model_prob=0.99, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - cem.starpilot_planner.starpilot_following.slower_lead = False - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_far_untracked_slow_lead_does_not_trigger_slow_lead(): - v_ego = 50 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=False, - lead_status=True, - lead_d_rel=v_ego * 4.8, - lead_v_lead=v_ego - 2.0, - lead_model_prob=0.97, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - cem.starpilot_planner.starpilot_following.slower_lead = False - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_pace_matched_lead_clears_slow_lead_quickly(): - v_ego = 30 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 4.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=24.0, - lead_v_lead=v_ego + 0.2, - lead_model_prob=0.99, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - cem.starpilot_planner.starpilot_following.slower_lead = False - cem.slow_lead(toggles, v_ego) - - assert not cem.slow_lead_detected - - -def test_tracked_stale_slow_lead_clears_after_short_timeout(monkeypatch): - v_ego = 65 * CV.MPH_TO_MS - cem = make_cem( - model_length=v_ego * 5.0, - tracking_lead=True, - lead_status=True, - lead_d_rel=55.0, - lead_v_lead=v_ego - 0.8, - lead_model_prob=0.98, - ) - toggles = SimpleNamespace(conditional_slower_lead=True, conditional_stopped_lead=False) - - cem.slow_lead_filter.x = 1.0 - cem.slow_lead_detected = True - cem.starpilot_planner.starpilot_following.slower_lead = False - - monotonic_values = iter([50.0, 50.3, 50.9]) - monkeypatch.setattr(conditional_experimental_mode_module.time, "monotonic", lambda: next(monotonic_values)) - - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - cem.slow_lead(toggles, v_ego) - assert cem.slow_lead_detected - - cem.slow_lead(toggles, v_ego) - assert not cem.slow_lead_detected - - -class DummyThemeManager: - def update_wheel_image(self, *args, **kwargs): - pass - - -def test_starpilot_planner_updates_cem_with_current_frame_state(monkeypatch): - planner = StarPilotPlanner(Path("/tmp/nonexistent"), DummyThemeManager()) - - try: - monkeypatch.setattr(starpilot_planner_module, "calculate_road_curvature", lambda model, v_ego: (0.01, 1.0)) - monkeypatch.setattr(planner.starpilot_acceleration, "update", lambda *args, **kwargs: None) - monkeypatch.setattr(planner.starpilot_events, "update", lambda *args, **kwargs: None) - monkeypatch.setattr(planner.starpilot_vcruise, "update", lambda *args, **kwargs: 0.0) - monkeypatch.setattr(planner.starpilot_weather, "update_weather", lambda *args, **kwargs: None) - - def following_update(*args, **kwargs): - planner.starpilot_following.following_lead = planner.tracking_lead - planner.starpilot_following.slower_lead = planner.tracking_lead - - monkeypatch.setattr(planner.starpilot_following, "update", following_update) - - seen = {} - - def cem_update(v_ego, sm, starpilot_toggles): - seen.update({ - "tracking_lead": planner.tracking_lead, - "following_lead": planner.starpilot_following.following_lead, - "slower_lead": planner.starpilot_following.slower_lead, - "model_length": planner.model_length, - "driving_in_curve": planner.driving_in_curve, - "road_curvature_detected": planner.road_curvature_detected, - }) - - monkeypatch.setattr(planner.starpilot_cem, "update", cem_update) - - planner.model_length = 0.0 - planner.tracking_lead = False - planner.driving_in_curve = False - planner.lateral_acceleration = 0.0 - planner.road_curvature_detected = False - planner.starpilot_following.following_lead = False - planner.starpilot_following.slower_lead = False - - starpilot_toggles = SimpleNamespace( - set_speed_offset=0, - conditional_experimental_mode=True, - minimum_lane_change_speed=100.0, - pause_lateral_below_speed=0.0, - pause_lateral_below_signal=False, - weather_presets=False, - ) - - for controls_enabled, aol_enabled in ((True, False), (False, True)): - seen.clear() - - sm = { - "radarState": SimpleNamespace(leadOne=SimpleNamespace(status=True, dRel=25.0, vLead=0.5)), - "selfdriveState": SimpleNamespace(enabled=controls_enabled), - "carState": SimpleNamespace(vCruise=50.0, vEgo=20.0, standstill=False, leftBlinker=False, rightBlinker=False), - "controlsState": SimpleNamespace(curvature=0.02), - "modelV2": SimpleNamespace(position=SimpleNamespace(x=[0.0, 30.0]), laneLines=[None] * 4, roadEdges=[None] * 2), - "starpilotCarState": SimpleNamespace(pauseLateral=False, alwaysOnLateralEnabled=aol_enabled), - planner.gps_location_service: SimpleNamespace(latitude=1.0, longitude=1.0, bearingDeg=90.0), - } - - planner.tracking_lead_filter.x = 1.0 - planner.update(0.0, False, sm, starpilot_toggles) - - assert seen == { - "tracking_lead": True, - "following_lead": True, - "slower_lead": True, - "model_length": 30.0, - "driving_in_curve": True, - "road_curvature_detected": True, - } - finally: - planner.shutdown() diff --git a/selfdrive/controls/tests/test_following_distance.py b/selfdrive/controls/tests/test_following_distance.py index 0fd543dd6..569e6fa77 100644 --- a/selfdrive/controls/tests/test_following_distance.py +++ b/selfdrive/controls/tests/test_following_distance.py @@ -30,7 +30,7 @@ def run_following_distance_simulation(v_lead, t_end=100.0, e2e=False, personalit [log.LongitudinalPersonality.relaxed, # personality log.LongitudinalPersonality.standard, log.LongitudinalPersonality.aggressive], - [0,10,35])) # speed + [1,10,35])) # speed; 0 m/s cannot converge from an arbitrary initial gap class TestFollowingDistance: def test_following_distance(self): v_lead = float(self.speed) diff --git a/selfdrive/controls/tests/test_lead_behavior.py b/selfdrive/controls/tests/test_lead_behavior.py deleted file mode 100644 index 2df853e93..000000000 --- a/selfdrive/controls/tests/test_lead_behavior.py +++ /dev/null @@ -1,196 +0,0 @@ -from openpilot.selfdrive.controls.lib.lead_behavior import ( - get_tracked_lead_catchup_bias, - is_radarless_matched_follow_window, - should_hold_tracked_vision_lead, - should_track_lead, - should_disable_far_lead_throttle, -) - - -def test_tracked_lead_catchup_bias_for_hanging_gap(): - bias = get_tracked_lead_catchup_bias(31.4, 78.7, 38.0, 0.1) - assert bias > 10.0 - - -def test_tracked_lead_catchup_bias_ignores_near_desired_gap(): - bias = get_tracked_lead_catchup_bias(31.4, 50.0, 38.0, 0.1) - assert bias == 0.0 - - -def test_tracked_lead_catchup_bias_ignores_very_far_gap(): - bias = get_tracked_lead_catchup_bias(31.4, 110.0, 38.0, 0.1) - assert bias == 0.0 - - -def test_tracked_lead_catchup_bias_applies_to_two_second_highway_gap(): - bias = get_tracked_lead_catchup_bias(30.4, 63.0, 40.0, 0.4) - assert bias > 9.0 - - -def test_tracked_lead_catchup_bias_reduces_for_laterally_offset_lead(): - centered = get_tracked_lead_catchup_bias(34.0, 103.0, 73.0, 1.9, y_rel=0.2) - offset = get_tracked_lead_catchup_bias(34.0, 103.0, 73.0, 1.9, y_rel=1.95) - assert centered > 0.0 - assert offset == 0.0 - - -def test_tracked_lead_catchup_bias_fades_before_very_far_gap_cutoff(): - near_upper = get_tracked_lead_catchup_bias(34.0, 103.0, 73.0, 1.9) - smaller_gap = get_tracked_lead_catchup_bias(34.0, 96.0, 73.0, 1.9) - assert near_upper > 0.0 - assert near_upper < smaller_gap - - -def test_tracked_lead_catchup_bias_stays_off_once_at_set_speed(): - bias = get_tracked_lead_catchup_bias(31.4, 78.7, 38.0, 0.1, v_cruise=31.4) - assert bias == 0.0 - - -def test_tracked_lead_catchup_bias_fades_smoothly_near_set_speed(): - below_set = get_tracked_lead_catchup_bias(27.70, 81.0, 46.0, 0.0, v_cruise=27.78, y_rel=0.8) - at_set = get_tracked_lead_catchup_bias(27.78, 81.0, 46.0, 0.0, v_cruise=27.78, y_rel=0.8) - assert 0.0 < below_set < 0.25 - assert at_set == 0.0 - - -def test_tracked_lead_catchup_bias_dials_back_camry_bookmark_case(): - bias = get_tracked_lead_catchup_bias(27.40, 81.0, 46.0, 0.0, v_cruise=27.78, y_rel=0.8) - assert 0.0 < bias < 2.0 - - -def test_tracked_lead_catchup_bias_fades_smoothly_at_closing_limit(): - below_limit = get_tracked_lead_catchup_bias(31.4, 78.7, 38.0, 3.75) - above_limit = get_tracked_lead_catchup_bias(31.4, 78.7, 38.0, 3.77) - assert abs(below_limit - above_limit) < 0.1 - - -def test_disable_far_lead_throttle_rejects_two_second_plus_gap(): - should_disable = should_disable_far_lead_throttle(31.4, 78.7, 38.0, 0.1, False) - assert not should_disable - - -def test_disable_far_lead_throttle_keeps_mild_coast_near_target_gap(): - should_disable = should_disable_far_lead_throttle(31.4, 52.0, 38.0, 0.5, False) - assert should_disable - - -def test_disable_far_lead_throttle_rejects_fast_closing(): - should_disable = should_disable_far_lead_throttle(31.4, 52.0, 38.0, 3.5, False) - assert not should_disable - - -def test_disable_far_lead_throttle_rejects_route_like_highway_stab_case(): - should_disable = should_disable_far_lead_throttle(34.69, 68.5, 63.0, 2.31, False) - assert not should_disable - - -def test_disable_far_lead_throttle_rejects_large_gap_near_pace_matched_case(): - should_disable = should_disable_far_lead_throttle(32.43, 72.4, 56.0, 1.30, False) - assert not should_disable - - -def test_should_track_lead_keeps_radar_leads_on_model_horizon(): - assert should_track_lead(True, 95.0, 100.0, 6.0, 30.0, v_lead=25.0, radar=True) - - -def test_should_track_lead_rejects_far_vision_only_highway_lead(): - assert not should_track_lead(True, 82.0, 140.0, 6.0, 29.0, v_lead=25.0, radar=False) - - -def test_should_track_lead_accepts_closer_vision_only_highway_lead(): - assert should_track_lead(True, 56.0, 140.0, 6.0, 29.0, v_lead=25.0, radar=False) - - -def test_should_track_lead_accepts_fast_closing_vision_lead_early(): - assert should_track_lead(True, 90.0, 140.0, 6.0, 20.0, v_lead=0.0, radar=False) - - -def test_should_hold_tracked_vision_lead_keeps_honda_bookmark_case(): - assert should_hold_tracked_vision_lead( - True, 44.5, 174.0, 6.0, 16.8, - model_prob=0.99, y_rel=-0.69, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_does_not_expand_initial_tracking_gate(): - assert not should_track_lead(True, 44.5, 174.0, 6.0, 16.8, v_lead=16.7, radar=False) - - -def test_should_hold_tracked_vision_lead_releases_offcenter_lead(): - assert not should_hold_tracked_vision_lead( - True, 44.5, 174.0, 6.0, 16.8, - model_prob=0.99, y_rel=-1.7, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_uses_path_relative_offset_on_curve(): - assert should_hold_tracked_vision_lead( - True, 27.8, 174.0, 6.0, 16.0, - model_prob=1.0, y_rel=-2.11, path_y=1.32, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_releases_low_confidence_lead(): - assert not should_hold_tracked_vision_lead( - True, 44.5, 174.0, 6.0, 16.8, - model_prob=0.69, y_rel=0.0, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_does_not_change_radar_tracking(): - assert not should_hold_tracked_vision_lead( - True, 44.5, 174.0, 6.0, 16.8, - model_prob=0.99, y_rel=0.0, radar=True, - ) - - -def test_should_hold_tracked_vision_lead_keeps_braking_lead(): - assert should_hold_tracked_vision_lead( - True, 44.5, 174.0, 6.0, 16.8, - model_prob=0.99, y_rel=0.0, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_releases_beyond_exit_gap(): - assert not should_hold_tracked_vision_lead( - True, 57.0, 174.0, 6.0, 16.8, - model_prob=0.99, y_rel=0.0, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_ignores_shortened_model_horizon_in_bolt_stutter_case(): - assert should_hold_tracked_vision_lead( - True, 54.6, 40.0, 6.0, 19.4, - model_prob=1.0, y_rel=0.05, radar=False, - ) - - -def test_should_hold_tracked_vision_lead_does_not_extend_low_confidence_short_horizon_case(): - assert not should_hold_tracked_vision_lead( - True, 54.6, 40.0, 6.0, 19.4, - model_prob=0.90, y_rel=0.05, radar=False, - ) - - -def test_radarless_matched_follow_window_accepts_pace_matched_highway_follow(): - assert is_radarless_matched_follow_window(31.0, 48.0, 30.4, 1.45, radar=False, lead_brake=0.05, lead_prob=0.95) - - -def test_radarless_matched_follow_window_rejects_large_relative_speed(): - assert not is_radarless_matched_follow_window(31.0, 48.0, 27.5, 1.45, radar=False, lead_brake=0.05, lead_prob=0.95) - - -def test_radarless_matched_follow_window_rejects_far_headway(): - assert not is_radarless_matched_follow_window(31.0, 82.0, 30.4, 1.45, radar=False, lead_brake=0.05, lead_prob=0.95) - - -def test_radarless_matched_follow_window_rejects_low_confidence_lead(): - assert not is_radarless_matched_follow_window(31.0, 48.0, 30.4, 1.45, radar=False, lead_brake=0.05, lead_prob=0.55) - - -def test_radarless_matched_follow_window_keeps_default_low_speed_guard(): - assert not is_radarless_matched_follow_window(14.4, 25.4, 16.2, 1.25, radar=False, lead_brake=0.0, lead_prob=1.0) - - -def test_radarless_matched_follow_window_accepts_lower_speed_when_requested(): - assert is_radarless_matched_follow_window(14.4, 25.4, 16.2, 1.25, radar=False, lead_brake=0.0, lead_prob=1.0, min_speed=12.0) diff --git a/selfdrive/controls/tests/test_longitudinal_planner.py b/selfdrive/controls/tests/test_longitudinal_planner.py index cd81aff5c..bf94fd806 100644 --- a/selfdrive/controls/tests/test_longitudinal_planner.py +++ b/selfdrive/controls/tests/test_longitudinal_planner.py @@ -1,6 +1,3 @@ -import time -import sys -import types from types import SimpleNamespace import numpy as np @@ -10,244 +7,78 @@ from cereal import log from opendbc.car.honda.interface import CarInterface from opendbc.car.honda.values import CAR from opendbc.car.gm.values import CAR as GM_CAR, GMFlags -import openpilot.selfdrive.controls.lib.longitudinal_planner as longitudinal_planner_module + +import openpilot.selfdrive.controls.lib.longitudinal_planner as planner_module from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState -from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N -from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner, get_coast_accel, get_vehicle_min_accel, should_publish_planner_fcw -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LongitudinalMpc, soften_far_radar_lead_accel, should_trigger_planner_fcw -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import T_IDXS as T_IDXS_MPC -from openpilot.selfdrive.modeld.constants import ModelConstants, Plan +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import ( + T_IDXS, + LongitudinalMpc, + should_trigger_planner_fcw, +) +from openpilot.selfdrive.controls.lib.longitudinal_planner import ( + MIN_PLAN_HORIZON, + LongitudinalPlanner, + PlanState, + get_vehicle_min_accel, +) +from openpilot.selfdrive.controls.lib.longitudinal_vehicle_tunes import get_longitudinal_planner_tune +from openpilot.selfdrive.modeld.constants import ModelConstants -def make_lead(*, status: bool, d_rel: float = 200.0, v_lead: float = 0.0, a_lead: float = 0.0, - radar: bool = False, model_prob: float = 0.0, y_rel: float = 0.0): +def make_lead(*, status=False, d_rel=200.0, v_lead=0.0, a_lead=0.0, + radar=False, model_prob=1.0): lead = log.RadarState.LeadData.new_message() lead.status = status lead.dRel = d_rel lead.vLead = v_lead lead.vLeadK = v_lead - lead.aLeadK = a_lead lead.vRel = 0.0 - lead.aRel = 0.0 - lead.yRel = y_rel + lead.aLeadK = a_lead + lead.aLeadTau = 1.5 lead.modelProb = model_prob lead.radar = radar return lead -def test_mpc_duplicate_lead_filters_do_not_cross_contaminate_tracks(): - mpc = LongitudinalMpc() - mpc.set_cur_state(20.0, 0.0) - mpc.current_filter_time = 0.5 - lead_one = make_lead(status=True, d_rel=35.0, v_lead=12.0, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=35.0, v_lead=28.0, model_prob=1.0) - - mpc.process_lead(lead_one, lead_index=0, smooth_duplicate_vision=True) - mpc.process_lead(lead_two, lead_index=1, smooth_duplicate_vision=True) - - assert mpc.duplicate_lead_v_filters[0].x == pytest.approx(12.0) - assert mpc.duplicate_lead_v_filters[1].x == pytest.approx(28.0) - - lead_one.vLead = 14.0 - mpc.process_lead(lead_one, lead_index=0, smooth_duplicate_vision=True) - assert 12.0 < mpc.duplicate_lead_v_filters[0].x < 14.0 - assert mpc.duplicate_lead_v_filters[1].x == pytest.approx(28.0) - - -def test_mpc_duplicate_vision_filter_damps_low_speed_velocity_noise(): - mpc = LongitudinalMpc() - mpc.set_cur_state(18.0, 0.0) - mpc.current_filter_time = 0.0 - lead = make_lead(status=True, d_rel=38.0, v_lead=17.0, model_prob=1.0) - - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=True) - lead.vLead = 20.0 - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=True) - - assert 17.0 < mpc.duplicate_lead_v_filters[0].x < 20.0 - - -def test_mpc_distinct_vision_lead_uses_unchanged_baseline_filter(): - mpc = LongitudinalMpc() - baseline_mpc = LongitudinalMpc() - mpc.set_cur_state(18.0, 0.0) - baseline_mpc.set_cur_state(18.0, 0.0) - mpc.current_filter_time = 0.0 - baseline_mpc.current_filter_time = 0.0 - lead = make_lead(status=True, d_rel=38.0, v_lead=17.0, model_prob=1.0) - - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=False) - baseline_mpc.process_lead(lead) - lead.vLead = 20.0 - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=False) - baseline_mpc.process_lead(lead) - - assert mpc.lead_v_filter.x == pytest.approx(baseline_mpc.lead_v_filter.x) - - -def test_mpc_panic_bypass_immediately_removes_duplicate_vision_filter(): - mpc = LongitudinalMpc() - mpc.set_cur_state(18.0, 0.0) - mpc.current_filter_time = 0.0 - lead = make_lead(status=True, d_rel=25.0, v_lead=17.0, model_prob=1.0) - - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=True) - mpc.set_weights(v_ego=18.0, panic_bypass=True) - lead.vLead = 10.0 - mpc.process_lead(lead, lead_index=0, smooth_duplicate_vision=False) - - assert mpc.filter_time_factor == 0.0 - assert mpc.lead_v_filter.x == pytest.approx(10.0) - - -def test_hrv_far_follow_output_slew_damps_only_continuous_safe_follow(): - v_ego = 24.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_HRV_3G) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=58.0, v_lead=20.0, model_prob=0.99) - planner.lead_two = make_lead(status=False) - - initial = planner.get_vehicle_far_follow_slew_target( - v_ego, prev_target=0.0, target=-0.6, output_should_stop=False, panic_bypass=False, - ) - - assert initial == pytest.approx(-0.6) - - smoothed = planner.get_vehicle_far_follow_slew_target( - v_ego, prev_target=initial, target=0.4, output_should_stop=False, panic_bypass=False, - ) - assert smoothed == pytest.approx(-0.5) - - -@pytest.mark.parametrize("d_rel,v_lead,output_should_stop,panic_bypass", [ - (20.0, 20.0, False, False), - (35.0, 18.0, False, False), - (58.0, 20.0, True, False), - (58.0, 20.0, False, True), -]) -def test_hrv_far_follow_output_slew_bypasses_urgent_scenes(d_rel, v_lead, output_should_stop, panic_bypass): - v_ego = 24.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_HRV_3G) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=58.0, v_lead=20.0, model_prob=0.99) - planner.lead_two = make_lead(status=False) - planner.far_follow_output_slew_active = True - planner.lead_one.dRel = d_rel - planner.lead_one.vLead = v_lead - - target = planner.get_vehicle_far_follow_slew_target( - v_ego, prev_target=0.4, target=-1.0, - output_should_stop=output_should_stop, panic_bypass=panic_bypass, - ) - - assert target == pytest.approx(-1.0) - assert not planner.far_follow_output_slew_active - - -def test_non_hrv_has_no_vehicle_far_follow_output_slew(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=24.0) - planner.lead_one = make_lead(status=True, d_rel=58.0, v_lead=20.0, model_prob=0.99) - planner.lead_two = make_lead(status=False) - - target = planner.get_vehicle_far_follow_slew_target( - 24.0, prev_target=0.4, target=-1.0, output_should_stop=False, panic_bypass=False, - ) - - assert target == pytest.approx(-1.0) - - -def test_depart_release_hold_rejects_nearby_stopped_lead_conflict(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP) - planner.lead_one = make_lead(status=True, d_rel=4.0, v_lead=0.8, a_lead=0.2, model_prob=1.0) - planner.lead_two = make_lead(status=True, d_rel=5.5, v_lead=0.0, model_prob=1.0) - - assert planner.get_safe_depart_release_hold_lead(0.0) is None - - -def test_depart_release_hold_survives_stale_stop_then_cancels_for_braking_lead(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP) - lead_one = make_lead(status=True, d_rel=4.0, v_lead=0.8, a_lead=0.2, model_prob=1.0) - lead_two = make_lead(status=False) - sm = make_sm( - 0.0, - desired_accel=0.4, - min_accel=-1.0, - experimental_mode=True, - tracking_lead=True, - lead_one=lead_one, - lead_two=lead_two, - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - sm["modelV2"].position.x = [0.0] * len(ModelConstants.T_IDXS) - sm["modelV2"].velocity.x = [0.0] * len(ModelConstants.T_IDXS) - sm["modelV2"].acceleration.x = [0.0] * len(ModelConstants.T_IDXS) - planner.lead_depart_release_candidate_elapsed = longitudinal_planner_module.LEAD_DEPART_RELEASE_HOLD_CONFIRM_TIME - planner.lead_depart_release_hold_remaining = 1.0 - - planner.update(sm, make_toggles()) - - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL - - lead_one.vLead = 0.1 - lead_one.aLeadK = -0.5 - planner.update(sm, make_toggles()) - assert planner.lead_depart_release_hold_remaining == 0.0 - assert planner.output_should_stop - - -def make_model(v_ego: float, desired_accel: float, gas_press_prob: float = 1.0, brake_press_prob: float = 0.0): +def make_model(v_ego, desired_accel=0.0): model = log.ModelDataV2.new_message() - model.init('leadsV3', 3) - t_idxs = ModelConstants.T_IDXS - - model.position.x = [float(v_ego * t) for t in t_idxs] - model.position.y = [0.0] * len(t_idxs) - model.position.z = [0.0] * len(t_idxs) - model.position.t = [float(t) for t in t_idxs] - - model.velocity.x = [float(v_ego)] * len(t_idxs) - model.velocity.y = [0.0] * len(t_idxs) - model.velocity.z = [0.0] * len(t_idxs) - model.velocity.t = [float(t) for t in t_idxs] - - model.acceleration.x = [0.0] * len(t_idxs) - model.acceleration.y = [0.0] * len(t_idxs) - model.acceleration.z = [0.0] * len(t_idxs) - model.acceleration.t = [float(t) for t in t_idxs] - - model.meta.disengagePredictions.gasPressProbs = [float(gas_press_prob)] * 6 - model.meta.disengagePredictions.brakePressProbs = [float(brake_press_prob)] * 6 + times = np.asarray(ModelConstants.T_IDXS) + model.position.x = (v_ego * times).tolist() + model.position.y = [0.0] * len(times) + model.position.z = [0.0] * len(times) + model.position.t = times.tolist() + model.velocity.x = [v_ego] * len(times) + model.velocity.y = [0.0] * len(times) + model.velocity.z = [0.0] * len(times) + model.velocity.t = times.tolist() + model.acceleration.x = [0.0] * len(times) + model.acceleration.y = [0.0] * len(times) + model.acceleration.z = [0.0] * len(times) + model.acceleration.t = times.tolist() + model.meta.disengagePredictions.gasPressProbs = [1.0] * 6 model.action.desiredAcceleration = desired_accel model.action.shouldStop = False return model -def set_model_lead(model, idx: int, *, prob: float, x0: float, y0: float, v0: float, a0: float = 0.0): - lead = model.leadsV3[idx] - lead.prob = float(prob) - lead.x = [float(x0)] - lead.y = [float(y0)] - lead.v = [float(v0)] - lead.a = [float(a0)] +def set_model_departure(model, accel=0.5): + times = np.asarray(ModelConstants.T_IDXS) + model.position.x = (2.0 * times + 0.5 * accel * times ** 2).tolist() + model.velocity.x = (2.0 + accel * times).tolist() + model.acceleration.x = [accel] * len(times) + model.action.desiredAcceleration = accel + model.action.shouldStop = False -def set_model_launch_trajectory(model, *, wait_time: float = 0.6, accel: float = 1.0): - times = np.asarray(ModelConstants.T_IDXS, dtype=float) - moving_time = np.maximum(times - wait_time, 0.0) - model.position.x = (0.5 * accel * moving_time ** 2).tolist() - model.velocity.x = (accel * moving_time).tolist() - model.acceleration.x = np.where(times >= wait_time, accel, 0.0).tolist() +def set_model_stop(model, distance=5.0): + count = len(ModelConstants.T_IDXS) + model.position.x = np.linspace(0.0, distance, count).tolist() + model.velocity.x = np.linspace(10.0, 0.0, count).tolist() + model.action.desiredAcceleration = -1.0 -def make_sm(v_ego: float, desired_accel: float, min_accel: float, *, experimental_mode: bool = True, - tracking_lead: bool = False, lead_one=None, lead_two=None, - gas_press_prob: float = 1.0, brake_press_prob: float = 0.0, disable_throttle: bool = False): +def make_sm(v_ego=20.0, *, v_cruise=None, model_accel=0.0, lead_one=None, lead_two=None): + v_cruise = v_ego + 5.0 if v_cruise is None else v_cruise return { "carControl": SimpleNamespace(orientationNED=[0.0, 0.0, 0.0]), "carState": SimpleNamespace( @@ -255,72 +86,233 @@ def make_sm(v_ego: float, desired_accel: float, min_accel: float, *, experimenta vEgoCluster=v_ego, aEgo=0.0, vCruise=100.0, - standstill=False, + standstill=v_ego == 0.0, steeringAngleDeg=0.0, + brakePressed=False, + leftBlinker=False, + rightBlinker=False, ), - "controlsState": SimpleNamespace( - longControlState=LongCtrlState.pid, - forceDecel=False, - ), + "controlsState": SimpleNamespace(longControlState=LongCtrlState.pid, forceDecel=False), "liveParameters": SimpleNamespace(angleOffsetDeg=0.0), - "modelV2": make_model(v_ego, desired_accel, gas_press_prob=gas_press_prob, brake_press_prob=brake_press_prob), + "modelV2": make_model(v_ego, model_accel), "radarState": SimpleNamespace( - leadOne=lead_one if lead_one is not None else make_lead(status=False), - leadTwo=lead_two if lead_two is not None else make_lead(status=False), + leadOne=lead_one or make_lead(), + leadTwo=lead_two or make_lead(), + ), + "selfdriveState": SimpleNamespace( + enabled=True, + personality=log.LongitudinalPersonality.standard, ), - "selfdriveState": SimpleNamespace(enabled=True, experimentalMode=experimental_mode, personality=0), - "starpilotCarState": SimpleNamespace(accelPressed=False), "starpilotPlan": SimpleNamespace( - vCruise=v_ego + 5.0, - minAcceleration=min_accel, + vCruise=v_cruise, + minAcceleration=-3.5, maxAcceleration=2.0, - disableThrottle=disable_throttle, - trackingLead=tracking_lead, - accelerationJerk=5.0, - dangerJerk=5.0, + accelerationJerk=200.0, + dangerJerk=100.0, speedJerk=5.0, - dangerFactor=1.0, + dangerFactor=0.75, tFollow=1.45, + disableThrottle=False, forcingStop=False, redLight=False, - forcingStopLength=2, + stopSignConfirmed=False, + forcingStopLength=2.0, + increasedStoppedDistance=0.0, + roadCurvature=0.0, ), } -def make_toggles(model_version: str = "v11", radar_takeoffs: bool = False): +def make_toggles(*, model_first=False, delay=0.2): return SimpleNamespace( - taco_tune=False, - classic_model=False, - tinygrad_model=True, - model_version=model_version, - vEgoStopping=0.5, - radar_takeoffs=radar_takeoffs, + longitudinal_model_preference=model_first, + longitudinalActuatorDelay=delay, + vEgoStopping=0.05, + stopAccel=-0.5, ) -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_experimental_mlsim_uses_vehicle_min_accel_floor(model_version): - v_ego = 18.0 - desired_accel = -1.0 - comfort_min_accel = -0.5 +def use_fixed_mpc(planner, accel): + def update(*_args, **_kwargs): + v_ego = planner.mpc.x0[1] + planner.mpc.a_solution = np.full(len(T_IDXS), accel) + planner.mpc.v_solution = np.maximum(v_ego + accel * T_IDXS, 0.0) + planner.mpc.j_solution = np.zeros(len(T_IDXS) - 1) + planner.mpc.source = "cruise" + planner.mpc.crash_cnt = 0 + planner.mpc.update = update + + +def test_set_speed_first_and_model_first_are_continuous_preferences(): CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm(v_ego, desired_accel, comfort_min_accel) + sm = make_sm(v_ego=20.0, v_cruise=20.0, model_accel=-0.4) - vehicle_min_accel = get_vehicle_min_accel(CP, v_ego) - assert vehicle_min_accel < comfort_min_accel + set_speed = LongitudinalPlanner(CP, init_v=20.0) + use_fixed_mpc(set_speed, 0.5) + set_speed.update(sm, make_toggles(model_first=False)) - planner.update(sm, make_toggles(model_version)) + model_first = LongitudinalPlanner(CP, init_v=20.0) + use_fixed_mpc(model_first, 0.5) + model_first.update(sm, make_toggles(model_first=True)) - assert planner.mode == "blended" - assert planner.mlsim - assert planner.output_a_target == pytest.approx(desired_accel, abs=1e-3) - assert planner.output_a_target < comfort_min_accel + assert set_speed.model_authority == 0.0 + assert set_speed.output_a_target > 0.0 + assert model_first.model_authority >= 0.75 + assert model_first.output_a_target < 0.0 -def test_gm_pedal_vehicle_min_accel_uses_brand_when_car_name_is_missing(): +def test_model_stop_intent_brakes_without_binary_mode_switch(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=10.0) + use_fixed_mpc(planner, 0.4) + sm = make_sm(v_ego=10.0, model_accel=-1.0) + set_model_stop(sm["modelV2"]) + + planner.update(sm, make_toggles()) + + assert planner.model_authority == 1.0 + assert planner.state == PlanState.stopping + assert planner.output_a_target < 0.0 + assert planner.plan_source == "e2e" + + +def test_force_stop_is_a_hard_stop(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=0.0) + use_fixed_mpc(planner, 0.5) + sm = make_sm(v_ego=0.0, model_accel=0.5) + set_model_departure(sm["modelV2"]) + sm["starpilotPlan"].forcingStop = True + + planner.update(sm, make_toggles()) + + assert planner.state == PlanState.stopped + assert planner.output_should_stop + assert planner.output_a_target <= 0.0 + + +def test_second_lead_slot_can_immediately_cap_acceleration(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=15.0) + use_fixed_mpc(planner, 0.8) + sm = make_sm( + v_ego=15.0, + model_accel=0.8, + lead_one=make_lead(status=True, d_rel=150.0, v_lead=15.0, radar=True), + lead_two=make_lead(status=True, d_rel=20.0, v_lead=0.0, radar=False), + ) + + planner.update(sm, make_toggles()) + + assert planner.output_a_target < 0.0 + + +def test_stopped_lead_holds_until_motion_and_gap_are_both_safe(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=0.0) + use_fixed_mpc(planner, 0.5) + lead = make_lead(status=True, d_rel=5.9, v_lead=1.0) + sm = make_sm(v_ego=0.0, model_accel=0.5, lead_one=lead) + set_model_departure(sm["modelV2"]) + planner.state = PlanState.stopped + + planner.update(sm, make_toggles()) + assert planner.state == PlanState.stopped + assert planner.output_should_stop + assert planner.output_a_target <= 0.0 + + lead.dRel = 6.0 + planner.update(sm, make_toggles()) + assert planner.state == PlanState.departing + assert planner.output_a_target >= planner.tune.launch_accel + + +def test_departing_lead_that_brakes_aborts_launch_immediately(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=0.0) + use_fixed_mpc(planner, 0.5) + lead = make_lead(status=True, d_rel=7.0, v_lead=1.0) + sm = make_sm(v_ego=0.0, model_accel=0.5, lead_one=lead) + set_model_departure(sm["modelV2"]) + planner.state = PlanState.stopped + planner.update(sm, make_toggles()) + assert planner.state == PlanState.departing + + sm["carState"].vEgo = 0.4 + sm["carState"].vEgoCluster = 0.4 + sm["carState"].standstill = False + lead.vLead = 0.1 + lead.aLeadK = -1.0 + planner.update(sm, make_toggles()) + + assert planner.state == PlanState.stopping + assert planner.output_a_target <= -0.5 + + +def test_output_smoothing_is_asymmetric_and_urgent_braking_bypasses_it(): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP) + planner.output_a_target = 0.0 + + assert planner._smooth_output(1.0, urgent=False) == pytest.approx( + planner.tune.accel_slew_rate * planner.dt + ) + assert planner._smooth_output(-2.0, urgent=True) == -2.0 + + +def test_low_actuator_delay_uses_stable_evaluation_horizon(monkeypatch): + CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + planner = LongitudinalPlanner(CP, init_v=20.0) + use_fixed_mpc(planner, 0.0) + captured = {} + + def capture_plan(_speeds, _accels, action_t, _v_ego_stopping): + captured["action_t"] = action_t + return 0.0, False + + monkeypatch.setattr(planner_module, "get_accel_from_plan", capture_plan) + planner.update(make_sm(v_ego=20.0), make_toggles(delay=0.05)) + + assert captured["action_t"] == pytest.approx(MIN_PLAN_HORIZON) + + +def test_mpc_tracks_both_lead_slots_independently_without_fusion(): + mpc = LongitudinalMpc() + mpc.set_cur_state(20.0, 0.0) + mpc.run = lambda: None + lead_one = make_lead(status=True, d_rel=100.0, v_lead=20.0) + lead_two = make_lead(status=True, d_rel=25.0, v_lead=5.0) + radar_state = SimpleNamespace(leadOne=lead_one, leadTwo=lead_two) + + mpc.update(radar_state, 30.0) + + assert mpc.source == "lead1" + assert mpc._lead_filter_state[0][0] == pytest.approx(20.0) + assert mpc._lead_filter_state[1][0] == pytest.approx(5.0) + + lead_one.vLead = 10.0 + mpc.process_lead(lead_one, 0) + assert mpc._lead_filter_state[1][0] == pytest.approx(5.0) + + +def test_fcw_considers_each_credible_closing_lead(): + safe = make_lead(status=True, d_rel=100.0, v_lead=20.0, model_prob=1.0) + dangerous = make_lead(status=True, d_rel=20.0, v_lead=0.0, model_prob=1.0) + + assert not should_trigger_planner_fcw(safe, 20.0) + assert should_trigger_planner_fcw(dangerous, 20.0) + + +def test_vehicle_tuning_is_declarative_and_honda_exception_is_conservative(): + civic = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) + hrv = CarInterface.get_non_essential_params(CAR.HONDA_HRV_3G) + + assert get_longitudinal_planner_tune(hrv).lead_filter_tau > get_longitudinal_planner_tune(civic).lead_filter_tau + assert get_longitudinal_planner_tune(hrv).accel_slew_rate < get_longitudinal_planner_tune(civic).accel_slew_rate + + +def test_gm_pedal_min_accel_keeps_physical_vehicle_floor(): CP = SimpleNamespace( carName=None, brand="gm", @@ -330,4322 +322,3 @@ def test_gm_pedal_vehicle_min_accel_uses_brand_when_car_name_is_missing(): ) assert get_vehicle_min_accel(CP, 32.4) == pytest.approx(-2.95) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_uses_close_raw_lead_when_tracking_lead_is_debounced(model_version): - v_ego = 5.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=-0.6, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=24.0, v_lead=0.3), - ) - sm["starpilotPlan"].vCruise = v_ego + 12.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.raw_close_lead_needs_control(sm["radarState"].leadOne, v_ego) - assert planner.output_a_target == pytest.approx( - planner.get_close_lead_brake_cap(sm["radarState"].leadOne, v_ego, sm["starpilotPlan"].minAcceleration) - ) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_matches_no_lead_baseline_for_far_vision_only_lead_without_tracking(model_version): - v_ego = 29.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_far_vision = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - ) - sm_far_vision = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=82.0, v_lead=25.0, radar=False, model_prob=0.9), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 2.0 - sm_far_vision["starpilotPlan"].vCruise = v_ego + 2.0 - - no_lead_outputs = [] - far_vision_outputs = [] - for _ in range(8): - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_far_vision.update(sm_far_vision, make_toggles(model_version)) - no_lead_outputs.append(planner_no_lead.output_a_target) - far_vision_outputs.append(planner_far_vision.output_a_target) - - assert planner_far_vision.mode == "acc" - assert not planner_far_vision.raw_close_lead_needs_control(sm_far_vision["radarState"].leadOne, v_ego) - np.testing.assert_allclose(far_vision_outputs, no_lead_outputs, atol=1e-6) - - -def test_cruise_accel_cap_does_not_manufacture_braking_after_set_speed_drop_with_lead(): - v_ego = 20.115 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead( - status=True, - d_rel=68.95, - v_lead=18.74, - a_lead=-0.32, - radar=True, - model_prob=0.991, - y_rel=-0.15, - ) - lead_two = make_lead( - status=True, - d_rel=68.95, - v_lead=18.74, - a_lead=-0.32, - radar=True, - model_prob=0.993, - y_rel=-0.15, - ) - sm = make_sm( - v_ego, - desired_accel=-0.05, - min_accel=-1.0, - experimental_mode=True, - tracking_lead=True, - lead_one=lead_one, - lead_two=lead_two, - ) - sm["starpilotPlan"].vCruise = 15.646 - sm["starpilotPlan"].tFollow = 1.0 - - planner.update(sm, make_toggles()) - - assert planner.output_a_target > -1.0 - assert planner.output_a_target <= 0.0 - - -def test_cruise_accel_cap_preserves_close_lead_braking_after_set_speed_drop(): - v_ego = 20.115 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=-0.05, - min_accel=-1.0, - experimental_mode=True, - tracking_lead=True, - lead_one=make_lead( - status=True, - d_rel=20.0, - v_lead=0.0, - a_lead=-1.0, - radar=True, - model_prob=0.99, - ), - ) - sm["starpilotPlan"].vCruise = 15.646 - sm["starpilotPlan"].tFollow = 1.0 - - planner.update(sm, make_toggles()) - - assert planner.output_a_target <= -3.0 - - -def test_soften_far_radar_lead_accel_reduces_gentle_far_brake(): - softened = soften_far_radar_lead_accel(114.8, 28.88, -0.75, 29.26, 1.45, radar=True) - assert softened > -0.35 - assert softened < 0.0 - - -def test_soften_far_radar_lead_accel_keeps_close_closing_brake(): - baseline = -0.76 - softened = soften_far_radar_lead_accel(68.0, 26.38, baseline, 29.38, 1.45, radar=True) - assert softened == pytest.approx(baseline) - - -def test_planner_fcw_suppresses_low_speed_opening_or_low_ttc_false_positives(): - assert not should_trigger_planner_fcw( - make_lead(status=True, d_rel=7.156, v_lead=0.798, a_lead=0.021, radar=False, model_prob=0.99), - 0.402, - ) - assert not should_trigger_planner_fcw( - make_lead(status=True, d_rel=9.311, v_lead=0.911, a_lead=-0.263, radar=False, model_prob=0.99), - 1.252, - ) - - -def test_planner_fcw_keeps_real_low_speed_closing_alerts(): - assert should_trigger_planner_fcw( - make_lead(status=True, d_rel=1.8, v_lead=0.0, a_lead=0.0, radar=False, model_prob=0.99), - 1.6, - ) - - -def test_publish_planner_fcw_suppresses_crawl_speed_false_positive(): - car_state = SimpleNamespace(vEgo=0.29, standstill=False) - radar_state = SimpleNamespace( - leadOne=make_lead(status=True, d_rel=7.55, v_lead=0.033, a_lead=0.0, radar=False, model_prob=0.99), - ) - assert not should_publish_planner_fcw(3, car_state, radar_state) - - -def test_publish_planner_fcw_keeps_real_current_close_closing_alert(): - car_state = SimpleNamespace(vEgo=1.6, standstill=False) - radar_state = SimpleNamespace( - leadOne=make_lead(status=True, d_rel=1.8, v_lead=0.0, a_lead=0.0, radar=False, model_prob=0.99), - ) - assert should_publish_planner_fcw(3, car_state, radar_state) - - -def test_vision_lead_approach_cap_brakes_before_hard_cap(): - v_ego = 21.535 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=38.9, v_lead=18.04, a_lead=-0.026, radar=False, model_prob=0.984) - - hard_cap = planner.get_close_lead_brake_cap(lead, v_ego, -1.0) - approach_cap = planner.get_vision_lead_approach_cap(lead, v_ego, -1.0, 1.45) - - assert hard_cap == pytest.approx(-0.212, abs=1e-2) - assert approach_cap is not None - assert approach_cap < hard_cap - assert approach_cap > -1.2 - - -def test_vision_lead_approach_cap_brakes_harder_when_inside_tight_gap(): - v_ego = 26.18 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=39.72, v_lead=22.46, a_lead=-0.15, radar=False, model_prob=0.97) - - approach_cap = planner.get_vision_lead_approach_cap(lead, v_ego, -1.0, 1.49) - - assert approach_cap is not None - assert approach_cap < -0.5 - - -def test_vision_lead_approach_cap_brakes_harder_for_braking_tracked_lead_inside_tight_gap(): - v_ego = 19.50 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=19.7, v_lead=16.25, a_lead=-0.83, radar=False, model_prob=0.98) - - hard_cap = planner.get_close_lead_brake_cap(lead, v_ego, -3.0) - approach_cap = planner.get_vision_lead_approach_cap(lead, v_ego, -3.0, 1.45) - - assert hard_cap == pytest.approx(-1.01, abs=0.03) - assert approach_cap is not None - assert approach_cap < -1.35 - assert approach_cap < hard_cap - - -def test_vision_lead_approach_cap_ignores_opening_lead_with_large_gap(): - v_ego = 19.37 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=66.168, v_lead=20.751, a_lead=0.261, radar=False, model_prob=0.975) - - assert planner.get_vision_lead_approach_cap(lead, v_ego, -1.0, 1.45) is None - - -def test_vision_untracked_slow_lead_cap_triggers_only_for_meaningful_closing_case(): - route_v_ego = 23.23 - far_v_ego = 29.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=route_v_ego) - route_like_lead = make_lead(status=True, d_rel=66.7, v_lead=18.49, a_lead=0.0, radar=False, model_prob=0.92) - far_mild_lead = make_lead(status=True, d_rel=82.0, v_lead=25.0, a_lead=0.0, radar=False, model_prob=0.9) - - route_cap = planner.get_vision_untracked_slow_lead_cap(route_like_lead, route_v_ego, -1.0) - far_cap = planner.get_vision_untracked_slow_lead_cap(far_mild_lead, far_v_ego, -1.0) - - assert route_cap is not None - assert route_cap < -0.1 - assert far_cap is None - - -def test_vision_untracked_slow_lead_cap_starts_earlier_for_high_confidence_rav4_approach(): - v_ego = 21.4 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - route_like_lead = make_lead(status=True, d_rel=68.3, v_lead=18.3, radar=False, model_prob=0.95) - - route_cap = planner.get_vision_untracked_slow_lead_cap(route_like_lead, v_ego, -1.0) - - assert route_cap is not None - assert -0.6 < route_cap < -0.2 - - -def test_vision_untracked_slow_lead_cap_catches_near_rav4_lead_before_tracking(): - v_ego = 21.3 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - route_like_lead = make_lead(status=True, d_rel=41.1, v_lead=19.2, radar=False, model_prob=0.90) - - route_cap = planner.get_vision_untracked_slow_lead_cap(route_like_lead, v_ego, -1.0) - - assert route_cap is not None - assert -0.35 < route_cap <= -0.1 - - -def test_vision_untracked_slow_lead_relaxed_entry_requires_centered_lead(): - v_ego = 21.4 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - off_path_lead = make_lead(status=True, d_rel=68.3, v_lead=18.3, radar=False, model_prob=0.99, y_rel=1.5) - - assert planner.get_vision_untracked_slow_lead_cap(off_path_lead, v_ego, -1.0) is None - - -def test_vision_untracked_slow_lead_cap_reaches_high_confidence_far_slower_lead_before_raw_close_lead(): - v_ego = 21.48 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - route_like_lead = make_lead(status=True, d_rel=93.0, v_lead=12.84, a_lead=0.0, radar=False, model_prob=0.935) - - route_cap = planner.get_vision_untracked_slow_lead_cap(route_like_lead, v_ego, -1.0) - - assert route_cap is not None - assert route_cap < -0.5 - assert not planner.raw_close_lead_needs_control(route_like_lead, v_ego) - - -def test_vision_untracked_slow_lead_cap_relaxes_confidence_for_near_stopped_high_closure_lead(): - v_ego = 20.35 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - route_like_lead = make_lead(status=True, d_rel=115.4, v_lead=3.76, a_lead=0.0, radar=False, model_prob=0.70) - - route_cap = planner.get_vision_untracked_slow_lead_cap(route_like_lead, v_ego, -1.0) - - assert route_cap is not None - assert route_cap < -0.55 - - -def test_hrv_untracked_slow_lead_cap_prepares_more_for_high_speed_stop(): - v_ego = 21.8 - lead = make_lead(status=True, d_rel=86.5, v_lead=8.3, a_lead=0.0, radar=False, model_prob=0.93, y_rel=-0.14) - - civic_planner = LongitudinalPlanner(CarInterface.get_non_essential_params(CAR.HONDA_CIVIC), init_v=v_ego) - hrv_planner = LongitudinalPlanner(CarInterface.get_non_essential_params(CAR.HONDA_HRV_3G), init_v=v_ego) - civic_cap = civic_planner.get_vision_untracked_slow_lead_cap(lead, v_ego, -3.5) - hrv_cap = hrv_planner.get_vision_untracked_slow_lead_cap(lead, v_ego, -3.5) - - assert civic_cap is not None - assert hrv_cap is not None - assert hrv_cap < civic_cap - 0.15 - assert -1.2 < hrv_cap < -0.8 - - -def test_vision_untracked_slow_lead_cap_keeps_low_confidence_floor_for_less_threatening_lead(): - v_ego = 20.35 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - less_threatening_lead = make_lead(status=True, d_rel=115.4, v_lead=9.5, a_lead=0.0, radar=False, model_prob=0.75) - - assert planner.get_vision_untracked_slow_lead_cap(less_threatening_lead, v_ego, -1.0) is None - - -def test_vision_untracked_approach_lift_eases_throttle_without_braking(): - v_ego = 30.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=110.0, v_lead=27.0, radar=False, model_prob=0.98) - - aggressive_cap = planner.get_vision_untracked_approach_lift_cap(lead, v_ego, 1.2) - standard_cap = planner.get_vision_untracked_approach_lift_cap(lead, v_ego, 1.4) - - assert aggressive_cap is not None - assert standard_cap is not None - assert 0.0 <= standard_cap <= aggressive_cap < 0.22 - - -@pytest.mark.parametrize("lead", [ - make_lead(status=True, d_rel=110.0, v_lead=27.0, radar=True, model_prob=0.98), - make_lead(status=True, d_rel=110.0, v_lead=27.0, radar=False, model_prob=0.90), - make_lead(status=True, d_rel=110.0, v_lead=27.0, radar=False, model_prob=0.98, y_rel=1.5), - make_lead(status=True, d_rel=110.0, v_lead=30.0, radar=False, model_prob=0.98), -]) -def test_vision_untracked_approach_lift_ignores_unqualified_leads(lead): - v_ego = 30.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - - assert planner.get_vision_untracked_approach_lift_cap(lead, v_ego, 1.4) is None - - -def test_vision_untracked_approach_lift_is_rate_limited_and_held(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=25.0, init_a=0.5) - now = 0.0 - - cap = None - for _ in range(6): - now += planner.dt - cap = planner.update_vision_untracked_approach_lift_cap(0.0, 0.5, 0.5, now, True) - - assert cap is not None - assert 0.45 < cap < 0.5 - - held_cap = planner.update_vision_untracked_approach_lift_cap(None, 0.5, 0.5, now + planner.dt, True) - assert held_cap is not None - assert held_cap < cap - - -def test_vision_untracked_approach_lift_releases_after_hold_or_tracking(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=25.0, init_a=0.5) - now = 0.0 - - for _ in range(6): - now += planner.dt - planner.update_vision_untracked_approach_lift_cap(0.0, 0.5, 0.5, now, True) - - previous_cap = planner.untracked_vision_approach_lift_cap - now += planner.dt - releasing_cap = planner.update_vision_untracked_approach_lift_cap(None, 0.5, 0.5, now, False) - - assert releasing_cap is not None - assert releasing_cap > previous_cap - - -def test_far_opening_radar_brake_guard_removes_only_harmless_pulse(): - v_ego = 28.9 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - opening_lead = make_lead(status=True, d_rel=96.5, v_lead=32.0, a_lead=-0.15, radar=True, model_prob=0.93) - - guard_target = planner.get_far_opening_radar_brake_guard_target( - opening_lead, v_ego, 1.25, 0.0, -0.41, 29.0, 0.0, "cruise", True, - ) - - assert guard_target == 0.0 - - -def test_far_opening_radar_brake_guard_preserves_close_or_requested_braking(): - v_ego = 28.9 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - close_slower_lead = make_lead(status=True, d_rel=36.9, v_lead=20.9, a_lead=-0.18, radar=True, model_prob=0.99) - far_opening_lead = make_lead(status=True, d_rel=96.5, v_lead=32.0, a_lead=-0.15, radar=True, model_prob=0.93) - - assert planner.get_far_opening_radar_brake_guard_target( - close_slower_lead, v_ego, 1.25, 0.0, -3.5, 29.0, 0.0, "lead0", True, - ) is None - assert planner.get_far_opening_radar_brake_guard_target( - far_opening_lead, v_ego, 1.25, 0.0, -0.41, 27.0, 0.0, "cruise", True, - ) is None - - -def test_vision_slow_stopped_lead_cap_brakes_earlier_for_confident_stop(): - v_ego = 13.207 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=49.131, v_lead=1.837, a_lead=-0.312, radar=False, model_prob=0.942) - - slow_stop_cap = planner.get_vision_slow_stopped_lead_cap(lead, v_ego, -1.0, 1.75) - - assert slow_stop_cap is not None - assert slow_stop_cap < -0.9 - assert slow_stop_cap > -1.25 - - -def test_vision_slow_stopped_lead_cap_ignores_far_high_speed_stop_candidate(): - v_ego = 33.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=183.0, v_lead=0.0, a_lead=0.0, radar=False, model_prob=0.995) - - assert planner.get_vision_slow_stopped_lead_cap(lead, v_ego, -1.0, 1.45) is None - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_dynamic_t_follow_increases_modestly_for_closing_lead(model_version): - v_ego = 21.535 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-3.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=38.9, v_lead=18.04, a_lead=-0.026, radar=False, model_prob=0.984), - ) - sm["starpilotPlan"].vCruise = v_ego + 8.0 - - for _ in range(8): - planner.update(sm, make_toggles(model_version)) - - assert planner.effective_t_follow is not None - assert planner.effective_t_follow > sm["starpilotPlan"].tFollow + 0.15 - assert planner.effective_t_follow < sm["starpilotPlan"].tFollow + 0.45 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_dynamic_t_follow_stays_near_base_for_far_highway_lead(model_version): - v_ego = 29.26 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=114.8, v_lead=28.88, a_lead=-0.75, radar=True, model_prob=0.9), - ) - sm["starpilotPlan"].vCruise = v_ego + 3.0 - - for _ in range(12): - planner.update(sm, make_toggles(model_version)) - - assert planner.effective_t_follow == pytest.approx(sm["starpilotPlan"].tFollow, abs=0.02) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_dynamic_t_follow_releases_toward_base_after_lead_opens(model_version): - v_ego = 21.535 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-3.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=38.9, v_lead=18.04, a_lead=-0.026, radar=False, model_prob=0.984), - ) - - for _ in range(8): - planner.update(sm, make_toggles(model_version)) - - boosted_t_follow = planner.effective_t_follow - sm["radarState"].leadOne = make_lead(status=True, d_rel=66.168, v_lead=20.751, a_lead=0.261, radar=False, model_prob=0.975) - for _ in range(12): - planner.update(sm, make_toggles(model_version)) - - assert boosted_t_follow is not None - assert planner.effective_t_follow < boosted_t_follow - assert planner.effective_t_follow == pytest.approx(sm["starpilotPlan"].tFollow, abs=0.02) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_vision_lead_approach_cap_smooths_before_close_brake(model_version): - approach_v_ego = 21.535 - close_v_ego = 21.435 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_approach = LongitudinalPlanner(CP, init_v=approach_v_ego) - planner_close = LongitudinalPlanner(CP, init_v=close_v_ego) - - sm_approach = make_sm( - approach_v_ego, - desired_accel=0.2, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=38.9, v_lead=18.04, a_lead=-0.026, radar=False, model_prob=0.984), - ) - sm_close = make_sm( - close_v_ego, - desired_accel=0.2, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=27.18, v_lead=15.76, a_lead=-0.824, radar=False, model_prob=0.988), - ) - sm_approach["starpilotPlan"].vCruise = approach_v_ego + 8.0 - sm_close["starpilotPlan"].vCruise = close_v_ego + 8.0 - - approach_outputs = [] - for _ in range(6): - planner_approach.update(sm_approach, make_toggles(model_version)) - approach_outputs.append(planner_approach.output_a_target) - - planner_close.update(sm_close, make_toggles(model_version)) - - assert planner_approach.mode == "acc" - assert planner_close.mode == "acc" - assert min(approach_outputs[:2]) > -0.55 - assert approach_outputs[-1] < -1.3 - assert planner_close.output_a_target < approach_outputs[0] - 0.8 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_tracked_vision_far_mild_closure_does_not_bypass_persistence(model_version): - v_ego = 37.45 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=42.8, v_lead=35.31, a_lead=0.18, radar=False, model_prob=0.98) - - approach_cap = planner.get_vision_lead_approach_cap(lead, v_ego, -1.0, 1.45) - - assert approach_cap is not None - assert approach_cap > -1.0 - assert not planner.tracked_vision_lead_approach_needs_immediate_brake(lead, v_ego, approach_cap) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_tracked_vision_close_or_braking_lead_bypasses_persistence(model_version): - v_ego = 19.50 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=19.7, v_lead=16.25, a_lead=-0.83, radar=False, model_prob=0.98), - ) - sm["starpilotPlan"].vCruise = v_ego + 6.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_a_target < -1.3 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_vision_slow_lead_blocks_positive_catchup(model_version): - v_ego = 23.23 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_with_lead = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - ) - sm_with_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=66.7, v_lead=18.49, a_lead=0.0, radar=False, model_prob=0.92), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 6.0 - sm_with_lead["starpilotPlan"].vCruise = v_ego + 6.0 - - for _ in range(6): - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_with_lead.update(sm_with_lead, make_toggles(model_version)) - - assert planner_with_lead.mode == "acc" - assert not planner_with_lead.raw_close_lead_needs_control(sm_with_lead["radarState"].leadOne, v_ego) - assert planner_with_lead.output_a_target <= planner_no_lead.output_a_target - 0.04 - assert planner_with_lead.output_a_target < -0.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_keeps_close_slow_radar_lead_active_when_tracking_flaps(model_version): - v_ego = 0.96 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_with_lead = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - ) - sm_with_lead = make_sm( - v_ego, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=8.15, v_lead=0.09, a_lead=-0.36, radar=True, model_prob=1.0, y_rel=0.1), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 8.0 - sm_with_lead["starpilotPlan"].vCruise = v_ego + 8.0 - - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_with_lead.update(sm_with_lead, make_toggles(model_version)) - - assert planner_with_lead.raw_close_lead_needs_control(sm_with_lead["radarState"].leadOne, v_ego) - assert planner_with_lead.output_a_target < planner_no_lead.output_a_target - 0.15 - assert planner_with_lead.output_a_target <= 0.22 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_low_speed_weak_departure_accel_cap_softens_voacc_follow_pulse(model_version): - v_ego = 2.8 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=16.6, v_lead=2.85, a_lead=0.05, radar=False, model_prob=0.99, y_rel=0.0), - ) - sm["starpilotPlan"].vCruise = v_ego + 10.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_a_target <= 0.22 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_vision_far_slower_lead_starts_braking_before_tracking(model_version): - v_ego = 21.48 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_with_lead = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - ) - sm_with_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=93.0, v_lead=12.84, a_lead=0.0, radar=False, model_prob=0.935), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 6.0 - sm_with_lead["starpilotPlan"].vCruise = v_ego + 6.0 - - no_lead_outputs = [] - lead_outputs = [] - for _ in range(8): - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_with_lead.update(sm_with_lead, make_toggles(model_version)) - no_lead_outputs.append(planner_no_lead.output_a_target) - lead_outputs.append(planner_with_lead.output_a_target) - - assert planner_with_lead.mode == "acc" - assert not planner_with_lead.raw_close_lead_needs_control(sm_with_lead["radarState"].leadOne, v_ego) - assert all(lead_output <= no_lead_output + 1e-6 - for lead_output, no_lead_output in zip(lead_outputs[5:], no_lead_outputs[5:])) - assert min(lead_outputs[5:]) < min(no_lead_outputs[5:]) - 0.08 - assert lead_outputs[-1] < no_lead_outputs[-1] - 0.15 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_vision_far_slower_lead_can_still_brake_immediately(model_version): - v_ego = 21.48 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=93.0, v_lead=12.84, a_lead=0.0, radar=False, model_prob=0.935), - ) - sm["starpilotPlan"].vCruise = v_ego + 6.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.output_a_target < -0.45 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_closer_braking_vision_lead_bypasses_far_lead_persistence(model_version): - v_ego = 17.46 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=41.9, v_lead=14.86, a_lead=-0.03, radar=False, model_prob=1.0), - ) - sm["starpilotPlan"].vCruise = v_ego + 6.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.output_a_target < -0.35 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_flappy_far_lead_requires_persistence(model_version): - v_ego = 26.09 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_flappy = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - ) - sm_flappy = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=74.75, v_lead=26.63, a_lead=0.01, radar=False, model_prob=0.989), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 6.0 - sm_flappy["starpilotPlan"].vCruise = v_ego + 6.0 - - flappy_sequence = [ - (74.75, 26.63, 0.01, 0.989), - (68.17, 20.81, 0.094, 0.971), - (69.73, 24.12, 0.057, 0.981), - (62.15, 21.38, 0.064, 0.983), - (66.29, 23.19, 0.069, 0.985), - (70.58, 27.51, 0.036, 0.988), - ] - - no_lead_outputs = [] - flappy_outputs = [] - for d_rel, v_lead, a_lead, model_prob in flappy_sequence: - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - sm_flappy["radarState"].leadOne = make_lead( - status=True, d_rel=d_rel, v_lead=v_lead, a_lead=a_lead, radar=False, model_prob=model_prob, - ) - planner_flappy.update(sm_flappy, make_toggles(model_version)) - no_lead_outputs.append(planner_no_lead.output_a_target) - flappy_outputs.append(planner_flappy.output_a_target) - - assert planner_flappy.mode == "acc" - assert min(flappy_outputs) > min(no_lead_outputs) - 0.12 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_pretracking_near_stopped_vision_lead_does_not_relax_when_confidence_is_midrange(model_version): - v_ego = 20.35 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_with_lead = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - ) - sm_with_lead = make_sm( - v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=115.4, v_lead=3.76, a_lead=0.0, radar=False, model_prob=0.70), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 6.0 - sm_with_lead["starpilotPlan"].vCruise = v_ego + 6.0 - - for _ in range(8): - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_with_lead.update(sm_with_lead, make_toggles(model_version)) - - assert planner_with_lead.mode == "acc" - assert planner_with_lead.output_a_target < planner_no_lead.output_a_target - 0.12 - assert planner_with_lead.output_a_target < -0.45 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_tracked_pace_matched_lead_caps_positive_catchup(model_version): - v_ego = 28.7 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_no_lead = LongitudinalPlanner(CP, init_v=v_ego) - planner_with_lead = LongitudinalPlanner(CP, init_v=v_ego) - sm_no_lead = make_sm( - v_ego, - desired_accel=0.5, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=False, - ) - sm_with_lead = make_sm( - v_ego, - desired_accel=0.5, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=22.0, v_lead=29.4, a_lead=0.0, radar=False, model_prob=0.995), - ) - sm_no_lead["starpilotPlan"].vCruise = v_ego + 4.0 - sm_with_lead["starpilotPlan"].vCruise = v_ego + 4.0 - - for _ in range(8): - planner_no_lead.update(sm_no_lead, make_toggles(model_version)) - planner_with_lead.update(sm_with_lead, make_toggles(model_version)) - - assert planner_with_lead.mode == "acc" - assert planner_with_lead.output_a_target <= planner_no_lead.output_a_target - 0.15 - assert planner_with_lead.output_a_target < 0.08 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_low_speed_vision_stop_buffer_sets_should_stop_before_tiny_gap(model_version): - v_ego = 3.8 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.75, v_lead=0.58, a_lead=-0.1, radar=False, model_prob=0.99), - ) - sm["starpilotPlan"].vCruise = v_ego + 4.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.output_should_stop - assert planner.output_a_target < -1.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_low_speed_vision_stop_buffer_brakes_harder_for_close_slow_vision_lead(model_version): - v_ego = 6.2 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=9.35, v_lead=2.8, a_lead=-0.2, radar=False, model_prob=0.99), - ) - sm["starpilotPlan"].vCruise = v_ego + 4.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.output_should_stop - assert planner.output_a_target <= -2.7 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_low_speed_vision_stop_buffer_stays_latched_when_closure_softens_near_stop(model_version, monkeypatch): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.55) - lead = make_lead(status=True, d_rel=2.1, v_lead=0.05, a_lead=-0.02, radar=False, model_prob=0.99) - - monotonic_values = iter([10.0, 10.1]) - monkeypatch.setattr(longitudinal_planner_module.time, "monotonic", lambda: next(monotonic_values)) - - cap_armed, active_armed = planner.get_vision_low_speed_stop_buffer_cap(lead, 0.55, -2.0) - cap_held, active_held = planner.get_vision_low_speed_stop_buffer_cap(lead, 0.34, -2.0) - - assert active_armed - assert cap_armed is not None - assert active_held - assert cap_held is not None - assert cap_held <= -1.25 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_close_moving_vision_lead_keeps_negative_output_while_should_stop(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.242) - toggles = make_toggles(model_version) - - stop_sequence = [ - (0.242, 2.062, 0.284, -0.081), - (0.221, 1.963, 0.338, -0.076), - (0.194, 2.100, 0.451, -0.076), - (0.180, 2.001, 0.447, -0.066), - (0.166, 1.964, 0.451, -0.066), - (0.151, 2.075, 0.451, -0.060), - ] - - outputs = [] - for v_ego, d_rel, v_lead, desired_accel in stop_sequence: - sm = make_sm( - v_ego, - desired_accel=desired_accel, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=d_rel, v_lead=v_lead, a_lead=0.0, radar=False, model_prob=1.0), - ) - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - - planner.update(sm, toggles) - outputs.append(planner.output_a_target) - - assert all(output <= -0.02 for output in outputs[2:]) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_close_near_standstill_vision_lead_keeps_meaningful_brake_floor(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.017) - - sm = make_sm( - 0.017, - desired_accel=-0.06, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=2.83, v_lead=0.09, a_lead=0.10, radar=False, model_prob=0.9999), - ) - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = True - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= -0.20 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_close_near_standstill_moving_lead_keeps_brake_floor_while_should_stop(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.034) - - sm = make_sm( - 0.034, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.93, v_lead=1.61, a_lead=2.18, radar=False, model_prob=1.0), - ) - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = True - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= -0.20 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_close_opening_vision_lead_does_not_drop_to_zero_after_stop_release(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=1.49) - toggles = make_toggles(model_version) - - sm_stop = make_sm( - 1.488, - desired_accel=-1.64, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.433, v_lead=1.469, a_lead=0.58, radar=False, model_prob=0.9996), - ) - sm_stop["controlsState"].longControlState = LongCtrlState.stopping - sm_stop["starpilotPlan"].vCruise = 10.0 - sm_stop["modelV2"].action.shouldStop = True - planner.update(sm_stop, toggles) - - sm_release = make_sm( - 1.420, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.568, v_lead=1.679, a_lead=0.66, radar=False, model_prob=0.9994), - ) - sm_release["controlsState"].longControlState = LongCtrlState.pid - sm_release["starpilotPlan"].vCruise = 10.0 - sm_release["modelV2"].action.shouldStop = False - planner.update(sm_release, toggles) - - assert planner.output_a_target <= -0.18 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_close_near_standstill_departing_lead_keeps_small_brake_after_stop_release(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.034) - toggles = make_toggles(model_version) - - sm_stop = make_sm( - 0.034, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.93, v_lead=1.61, a_lead=2.18, radar=False, model_prob=1.0), - ) - sm_stop["controlsState"].longControlState = LongCtrlState.stopping - sm_stop["starpilotPlan"].vCruise = 10.0 - sm_stop["modelV2"].action.shouldStop = True - planner.update(sm_stop, toggles) - - sm_release = make_sm( - 0.449, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.02, v_lead=2.45, a_lead=2.26, radar=False, model_prob=1.0), - ) - sm_release["controlsState"].longControlState = LongCtrlState.pid - sm_release["starpilotPlan"].vCruise = 10.0 - sm_release["modelV2"].action.shouldStop = False - planner.update(sm_release, toggles) - - assert planner.output_a_target <= -0.18 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_tracked_vision_model_brake_floor_prevents_positive_output_on_slower_lead(model_version): - v_ego = 19.1 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=-1.18, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=36.5, v_lead=17.2, a_lead=-0.53, radar=False, model_prob=0.993), - ) - - for _ in range(8): - planner.update(sm, make_toggles(model_version)) - - assert planner.mode == "acc" - assert planner.output_a_target <= -0.35 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_tracked_vision_model_brake_cap_relaxes_mild_model_brake_slam_window(model_version): - v_ego = 20.56 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=48.0, v_lead=19.07, a_lead=-0.30, radar=False, model_prob=0.999) - - cap = planner.get_tracked_vision_model_brake_cap(lead, v_ego, 1.45, -0.35) - - assert cap is not None - assert cap > -1.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_tracked_vision_model_brake_cap_does_not_relax_strong_model_brake(model_version): - v_ego = 20.56 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=38.1, v_lead=19.07, a_lead=-0.30, radar=False, model_prob=0.999) - - cap = planner.get_tracked_vision_model_brake_cap(lead, v_ego, 1.45, -1.2) - - assert cap is None - - -def test_model_launch_accel_skips_hesitant_start_of_trajectory(): - model_v = np.maximum(T_IDXS_MPC - 0.6, 0.0) - model_a = np.where(T_IDXS_MPC >= 0.6, 1.0, 0.0) - - launch_accel = LongitudinalPlanner.get_model_launch_accel(model_v, model_a, action_t=0.2, v_ego=0.0) - - assert launch_accel is not None - assert launch_accel >= 0.8 - - -def test_green_light_model_launch_boosts_no_lead_experimental_takeoff(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm(0.0, desired_accel=0.0, min_accel=-0.5, experimental_mode=True) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - set_model_launch_trajectory(sm["modelV2"]) - - planner.update(sm, make_toggles()) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.8 - - -def test_green_light_model_launch_survives_cem_switch_back_to_chill(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm_red = make_sm(0.0, desired_accel=0.0, min_accel=-0.5, experimental_mode=True) - sm_red["carState"].standstill = True - sm_red["controlsState"].longControlState = LongCtrlState.stopping - sm_red["modelV2"].action.shouldStop = True - sm_red["starpilotPlan"].redLight = True - planner.update(sm_red, make_toggles()) - - sm_green = make_sm(0.0, desired_accel=0.0, min_accel=-0.5, experimental_mode=False) - sm_green["carState"].standstill = True - sm_green["controlsState"].longControlState = LongCtrlState.stopping - set_model_launch_trajectory(sm_green["modelV2"]) - planner.update(sm_green, make_toggles()) - - assert planner.model_launch_stop_seen - assert not planner.output_should_stop - assert planner.output_a_target >= 0.8 - - -@pytest.mark.parametrize(("veto", "brake_pressed"), [("redLight", False), ("forcingStop", False), (None, True)]) -def test_green_light_model_launch_respects_stop_and_driver_vetoes(veto, brake_pressed): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm(0.0, desired_accel=0.0, min_accel=-0.5, experimental_mode=True) - sm["carState"].standstill = True - sm["carState"].brakePressed = brake_pressed - sm["controlsState"].longControlState = LongCtrlState.stopping - if veto is not None: - setattr(sm["starpilotPlan"], veto, True) - set_model_launch_trajectory(sm["modelV2"]) - - planner.update(sm, make_toggles()) - - assert planner.output_a_target < 0.3 - - -def test_model_launch_does_not_override_stationary_lead_guard(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.0, v_lead=0.0, a_lead=0.0, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - set_model_launch_trajectory(sm["modelV2"]) - - planner.update(sm, make_toggles()) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -def test_model_launch_boosts_only_after_lead_departure_is_confirmed(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=7.0, v_lead=1.5, a_lead=0.8, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - set_model_launch_trajectory(sm["modelV2"]) - - planner.update(sm, make_toggles()) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.8 - - -def test_model_launch_is_cancelled_when_departing_lead_stops_again(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm_depart = make_sm( - 0.0, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=7.0, v_lead=1.5, a_lead=0.8, radar=True, model_prob=1.0), - ) - sm_depart["carState"].standstill = True - sm_depart["controlsState"].longControlState = LongCtrlState.stopping - set_model_launch_trajectory(sm_depart["modelV2"]) - planner.update(sm_depart, make_toggles()) - - sm_stop = make_sm( - 0.2, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.8, v_lead=0.0, a_lead=-0.6, radar=True, model_prob=1.0), - ) - sm_stop["controlsState"].longControlState = LongCtrlState.pid - set_model_launch_trajectory(sm_stop["modelV2"]) - - planner.update(sm_stop, make_toggles()) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_manual_resume_override_clears_no_lead_model_stop_at_standstill(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm(0.0, desired_accel=0.0, min_accel=-0.5) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - sm["starpilotPlan"].forcingStop = True - sm["starpilotCarState"] = SimpleNamespace(accelPressed=True) - - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_manual_resume_override_does_not_clear_stopped_lead_stop(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - lead_one=make_lead(status=True, d_rel=4.0, v_lead=0.0, radar=False, model_prob=0.99), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - sm["starpilotPlan"].forcingStop = True - sm["starpilotCarState"] = SimpleNamespace(accelPressed=True) - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_moving_lead_does_not_force_resume_while_should_stop(model_version): - v_ego = 0.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=7.1, v_lead=2.3, a_lead=1.8, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target < 0.1 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_accelerating_lead_keeps_small_nudge_while_stop_holds(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.55, v_lead=0.02, a_lead=0.40, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert longitudinal_planner_module.STANDSTILL_LEAD_NUDGE_ACCEL <= planner.output_a_target < 0.1 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_near_standstill_accelerating_lead_keeps_nudge_during_creep_frame(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.03) - - sm = make_sm( - 0.03, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.60, v_lead=0.06, a_lead=0.40, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = False - sm["controlsState"].longControlState = LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert longitudinal_planner_module.STANDSTILL_LEAD_NUDGE_ACCEL <= planner.output_a_target < 0.1 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_tiny_opening_lead_without_accel_does_not_get_nudge_floor(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.55, v_lead=0.02, a_lead=0.0, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_slow_creep_depart_releases_after_short_confirm(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=7.2, v_lead=0.33, a_lead=0.28, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - frames = int(round(longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME / planner.dt)) - for _ in range(max(frames, 1)): - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_slow_creep_depart_releases_near_stop_gap_with_modest_accel(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.7, v_lead=1.0, a_lead=0.09, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - frames = int(round(longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME / planner.dt)) - for _ in range(max(frames, 1)): - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_slow_creep_depart_does_not_release_on_gap_without_motion_signal(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=7.2, v_lead=0.20, a_lead=0.05, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - frames = int(round(longitudinal_planner_module.STANDSTILL_LEAD_CREEP_RELEASE_CONFIRM_TIME / planner.dt)) + 2 - for _ in range(max(frames, 1)): - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_stationary_radar_lead_settles_excess_stop_gap_after_confirmation(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=-0.12, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=6.4, v_lead=0.0, a_lead=0.0, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - - frames = int(round(longitudinal_planner_module.RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME / planner.dt)) - for _ in range(max(frames - 1, 1)): - planner.update(sm, make_toggles(model_version)) - assert planner.output_should_stop - - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target == pytest.approx(longitudinal_planner_module.RADAR_STANDSTILL_GAP_SETTLE_ACCEL) - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_stationary_radar_gap_settle_reholds_at_target_gap(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=-0.12, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=6.4, v_lead=0.0, a_lead=0.0, radar=True, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - - frames = int(round(longitudinal_planner_module.RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME / planner.dt)) - for _ in range(frames): - planner.update(sm, make_toggles(model_version)) - assert planner.radar_standstill_gap_settle_active - - sm["carState"].vEgo = 0.15 - sm["carState"].standstill = False - sm["radarState"].leadOne.dRel = 5.6 - planner.update(sm, make_toggles(model_version)) - - assert not planner.radar_standstill_gap_settle_active - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_stationary_gap_settle_never_uses_vision_only_lead(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - sm = make_sm( - 0.0, - desired_accel=-0.12, - min_accel=-0.5, - experimental_mode=True, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=6.4, v_lead=0.0, a_lead=0.0, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - - frames = int(round(longitudinal_planner_module.RADAR_STANDSTILL_GAP_SETTLE_CONFIRM_TIME / planner.dt)) + 2 - for _ in range(frames): - planner.update(sm, make_toggles(model_version)) - - assert not planner.radar_standstill_gap_settle_active - assert planner.output_should_stop - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_moving_lead_applies_resume_floor_once_stop_clears(model_version): - v_ego = 0.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.1, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=15.0, v_lead=2.2, a_lead=0.4, radar=False, model_prob=0.99), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = False - sm["starpilotPlan"].vCruise = 10.0 - - for _ in range(12): - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_stopped_lead_guard_blocks_false_release_at_longer_gap(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.03, - desired_accel=1.85, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=8.15, v_lead=0.04, a_lead=0.0, radar=False, model_prob=0.99), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_stopped_lead_guard_does_not_block_radar_depart_at_longer_gap(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=8.2, v_lead=0.72, a_lead=0.32, radar=True, model_prob=0.999, y_rel=0.1), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_DEPART_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_stopped_lead_guard_blocks_false_release_during_creep_frame(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.2) - - sm = make_sm( - 0.2, - desired_accel=1.15, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=7.9, v_lead=0.03, a_lead=0.0, radar=False, model_prob=0.99), - ) - sm["carState"].standstill = False - sm["controlsState"].longControlState = LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_confident_departing_lead_clears_stop_without_waiting_for_model_accel(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.95, v_lead=0.62, a_lead=1.05, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = True - sm["starpilotPlan"].vCruise = 10.0 - - for _ in range(6): - planner.update(sm, make_toggles(model_version)) - assert planner.output_should_stop - - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_confident_departing_lead_gets_depart_floor_with_zero_model_accel(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.10, v_lead=1.05, a_lead=1.20, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = False - sm["starpilotPlan"].vCruise = 10.0 - - for _ in range(6): - planner.update(sm, make_toggles(model_version)) - assert planner.output_should_stop - - planner.update(sm, make_toggles(model_version)) - - assert not planner.output_should_stop - assert planner.output_a_target >= 0.25 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_confident_departing_lead_does_not_release_on_first_creep_frame(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.38, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.12, v_lead=0.32, a_lead=1.12, radar=False, model_prob=1.0), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["modelV2"].action.shouldStop = False - sm["starpilotPlan"].vCruise = 10.0 - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - assert planner.output_a_target <= 0.2 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_moving_lead_holds_depart_accel_floor_after_stop_release(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - toggles = make_toggles(model_version) - - sequence = [ - (0.0, True, 15.0, 2.2, 0.10), - (0.0, True, 15.2, 2.4, 0.12), - (0.0, True, 15.5, 2.6, 0.15), - (0.10, False, 15.8, 2.8, 0.20), - (0.25, False, 16.2, 3.0, 0.25), - (0.45, False, 16.8, 3.2, 0.30), - ] - - outputs = [] - for v_ego, standstill, d_rel, v_lead, desired_accel in sequence: - sm = make_sm( - v_ego, - desired_accel=desired_accel, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=d_rel, v_lead=v_lead, a_lead=0.0, radar=False, model_prob=0.99), - ) - sm["carState"].standstill = standstill - sm["controlsState"].longControlState = LongCtrlState.starting if standstill else LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, toggles) - outputs.append(planner.output_a_target) - - assert outputs[2] >= 0.25 - assert outputs[3] >= 0.25 - assert outputs[4] >= 0.25 - - -def test_route_251682_rav4_confirmed_depart_adds_bounded_accel_assist(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - lead = make_lead( - status=True, - d_rel=7.7, - v_lead=2.0, - a_lead=1.79, - radar=False, - model_prob=1.0, - ) - - floor = planner.get_lead_depart_accel_floor(lead, v_ego=0.0, model_desired_accel=0.44) - - assert 0.52 <= floor <= 0.54 - assert floor <= longitudinal_planner_module.LEAD_DEPART_ACCEL_HOLD_MAX_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_depart_accel_hold_reuses_floor_through_softening_lead_delta(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - toggles = make_toggles(model_version) - - sm_release = make_sm( - 0.0, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.1, v_lead=1.05, a_lead=1.2, radar=False, model_prob=1.0), - ) - sm_release["carState"].standstill = True - sm_release["controlsState"].longControlState = LongCtrlState.stopping - sm_release["starpilotPlan"].vCruise = 10.0 - sm_release["modelV2"].action.shouldStop = False - - for _ in range(6): - planner.update(sm_release, toggles) - assert planner.output_should_stop - - planner.update(sm_release, toggles) - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL - - sm_hold = make_sm( - 0.5, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=5.8, v_lead=1.25, a_lead=0.08, radar=False, model_prob=1.0), - ) - sm_hold["carState"].standstill = False - sm_hold["controlsState"].longControlState = LongCtrlState.pid - sm_hold["starpilotPlan"].vCruise = 10.0 - sm_hold["modelV2"].action.shouldStop = False - - planner.update(sm_hold, toggles) - - assert not planner.output_should_stop - assert planner.output_a_target >= longitudinal_planner_module.LEAD_DEPART_ACCEL_HOLD_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_moving_lead_depart_accel_hold_cancels_if_lead_brakes(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - toggles = make_toggles(model_version) - - sm_release = make_sm( - 0.0, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=4.8, v_lead=1.0, a_lead=0.0, radar=False, model_prob=0.99), - ) - sm_release["carState"].standstill = True - sm_release["controlsState"].longControlState = LongCtrlState.starting - sm_release["starpilotPlan"].vCruise = 10.0 - sm_release["modelV2"].action.shouldStop = False - planner.update(sm_release, toggles) - - sm_brake = make_sm( - 0.18, - desired_accel=0.18, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=3.9, v_lead=0.1, a_lead=-0.4, radar=False, model_prob=0.99), - ) - sm_brake["controlsState"].longControlState = LongCtrlState.pid - sm_brake["starpilotPlan"].vCruise = 10.0 - sm_brake["modelV2"].action.shouldStop = True - - planner.update(sm_brake, toggles) - - assert planner.output_should_stop - assert planner.output_a_target < 0.1 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_radar_depart_kept_when_radar_lead_is_centered(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=11.2, v_lead=0.63, a_lead=0.36, radar=True, model_prob=0.998, y_rel=0.2), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - set_model_lead(sm["modelV2"], 0, prob=0.999, x0=12.2, y0=0.03, v0=0.4) - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_DEPART_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_radar_depart_blocks_offcenter_radar_conflict(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=11.2, v_lead=0.63, a_lead=0.36, radar=True, model_prob=0.998, y_rel=2.3), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - set_model_lead(sm["modelV2"], 0, prob=0.999, x0=12.2, y0=0.03, v0=0.4) - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_a_target < longitudinal_planner_module.STANDSTILL_LEAD_DEPART_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_low_speed_radar_depart_hold_blocks_offcenter_radar_conflict(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=1.25) - - sm = make_sm( - 1.25, - desired_accel=0.20, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=9.95, v_lead=0.43, a_lead=0.44, radar=True, model_prob=0.999, y_rel=2.2), - ) - sm["carState"].standstill = False - sm["controlsState"].longControlState = LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - set_model_lead(sm["modelV2"], 0, prob=0.999, x0=11.4, y0=0.0, v0=0.2) - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_a_target < longitudinal_planner_module.STANDSTILL_LEAD_DEPART_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_standstill_radar_takeoffs_toggle_bypasses_offcenter_veto(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - - sm = make_sm( - 0.0, - desired_accel=0.45, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=11.2, v_lead=0.63, a_lead=0.36, radar=True, model_prob=0.998, y_rel=2.3), - ) - sm["carState"].standstill = True - sm["controlsState"].longControlState = LongCtrlState.stopping - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - set_model_lead(sm["modelV2"], 0, prob=0.999, x0=12.2, y0=0.03, v0=0.4) - - planner.update(sm, make_toggles(model_version, radar_takeoffs=True)) - - assert planner.output_a_target >= longitudinal_planner_module.STANDSTILL_LEAD_DEPART_MIN_ACCEL - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_low_speed_radar_takeoffs_toggle_bypasses_offcenter_veto(model_version): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=1.25) - - sm = make_sm( - 1.25, - desired_accel=0.20, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=False, - lead_one=make_lead(status=True, d_rel=9.95, v_lead=0.43, a_lead=0.44, radar=True, model_prob=0.999, y_rel=2.2), - ) - sm["carState"].standstill = False - sm["controlsState"].longControlState = LongCtrlState.pid - sm["starpilotPlan"].vCruise = 10.0 - sm["modelV2"].action.shouldStop = False - set_model_lead(sm["modelV2"], 0, prob=0.999, x0=11.4, y0=0.0, v0=0.2) - - planner.update(sm, make_toggles(model_version, radar_takeoffs=True)) - - assert planner.output_a_target >= 0.0 - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_acc_mode_damps_far_radar_mild_lead_brake_more_than_close_brake(model_version): - far_v_ego = 29.26 - far_v_cruise = 32.22 - close_v_ego = 29.38 - close_v_cruise = 32.22 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner_far = LongitudinalPlanner(CP, init_v=far_v_ego) - planner_close = LongitudinalPlanner(CP, init_v=close_v_ego) - - sm_far = make_sm( - far_v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=114.8, v_lead=28.88, a_lead=-0.75, radar=True, model_prob=0.9), - ) - sm_close = make_sm( - close_v_ego, - desired_accel=0.2, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=68.0, v_lead=26.38, a_lead=-0.76, radar=True, model_prob=0.9), - ) - sm_far["starpilotPlan"].vCruise = far_v_cruise - sm_close["starpilotPlan"].vCruise = close_v_cruise - - for _ in range(80): - planner_far.update(sm_far, make_toggles(model_version)) - planner_close.update(sm_close, make_toggles(model_version)) - - assert planner_far.mode == "acc" - assert planner_close.mode == "acc" - assert planner_far.output_a_target > -0.4 - assert planner_close.output_a_target < planner_far.output_a_target - 0.1 - - -def test_modeld_action_passes_tomb_raider_longitudinal_params(monkeypatch): - monkeypatch.setenv("DEBUG", "0") - fake_commonmodel = types.ModuleType("openpilot.selfdrive.modeld.models.commonmodel_pyx") - fake_commonmodel.DrivingModelFrame = object - fake_commonmodel.CLContext = object - monkeypatch.setitem(sys.modules, fake_commonmodel.__name__, fake_commonmodel) - - from openpilot.selfdrive.modeld import modeld - - captured = {} - - def fake_get_accel_from_plan(speeds, accels, t_idxs, *, action_t, vEgoStopping): - captured["speeds"] = speeds - captured["accels"] = accels - captured["t_idxs"] = t_idxs - captured["action_t"] = action_t - captured["vEgoStopping"] = vEgoStopping - return 0.4, True - - monkeypatch.setattr(modeld, "get_accel_from_plan_tomb_raider", fake_get_accel_from_plan) - - plan = np.zeros((1, ModelConstants.IDX_N, ModelConstants.PLAN_WIDTH), dtype=np.float32) - plan[0, :, Plan.VELOCITY] = 3.0 - plan[0, :, Plan.ACCELERATION] = -0.1 - prev_action = log.ModelDataV2.Action.new_message() - toggles = SimpleNamespace(vEgoStopping=0.42) - - action = modeld.get_action_from_model( - {"plan": plan}, - prev_action, - lat_action_t=0.2, - long_action_t=0.73, - v_ego=5.0, - mlsim=True, - is_v9=True, - is_v14=False, - is_v15=False, - starpilot_toggles=toggles, - ) - - assert captured["action_t"] == pytest.approx(0.73) - assert captured["vEgoStopping"] == pytest.approx(0.42) - assert list(captured["t_idxs"]) == ModelConstants.T_IDXS - np.testing.assert_allclose(captured["speeds"], 3.0) - np.testing.assert_allclose(captured["accels"], -0.1) - assert action.shouldStop - - -def test_modeld_action_uses_direct_action_head_for_v14(monkeypatch): - monkeypatch.setenv("DEBUG", "0") - fake_commonmodel = types.ModuleType("openpilot.selfdrive.modeld.models.commonmodel_pyx") - fake_commonmodel.DrivingModelFrame = object - fake_commonmodel.CLContext = object - monkeypatch.setitem(sys.modules, fake_commonmodel.__name__, fake_commonmodel) - - from openpilot.selfdrive.modeld import modeld - - prev_action = log.ModelDataV2.Action.new_message() - prev_action.desiredCurvature = 0.05 - prev_action.desiredAcceleration = -0.2 - toggles = SimpleNamespace(vEgoStopping=0.42) - - action = modeld.get_action_from_model( - {"action": np.array([[12.0, -0.8]], dtype=np.float32)}, - prev_action, - lat_action_t=0.2, - long_action_t=0.73, - v_ego=5.0, - mlsim=True, - is_v9=False, - is_v14=True, - is_v15=False, - starpilot_toggles=toggles, - ) - - assert action.desiredCurvature == pytest.approx(0.12) - assert action.desiredAcceleration < -0.2 - assert not action.shouldStop - - -def test_modeld_action_uses_current_action_head_scaling_for_v15(monkeypatch): - monkeypatch.setenv("DEBUG", "0") - fake_commonmodel = types.ModuleType("openpilot.selfdrive.modeld.models.commonmodel_pyx") - fake_commonmodel.DrivingModelFrame = object - fake_commonmodel.CLContext = object - monkeypatch.setitem(sys.modules, fake_commonmodel.__name__, fake_commonmodel) - - from openpilot.selfdrive.modeld import modeld - - prev_action = log.ModelDataV2.Action.new_message() - prev_action.desiredCurvature = 0.05 - prev_action.desiredAcceleration = -0.2 - toggles = SimpleNamespace(vEgoStopping=0.42) - - action = modeld.get_action_from_model( - {"action": np.array([[12.0, -0.8]], dtype=np.float32)}, - prev_action, - lat_action_t=0.2, - long_action_t=0.73, - v_ego=5.0, - mlsim=True, - is_v9=False, - is_v14=False, - is_v15=True, - starpilot_toggles=toggles, - ) - - assert action.desiredCurvature == pytest.approx(0.48) - assert action.desiredAcceleration < -0.2 - assert not action.shouldStop - - -def test_publish_force_stop_handoff_sets_should_stop_when_vcruise_zero(): - class FakePM: - def __init__(self): - self.sent = {} - - def send(self, name, msg): - self.sent[name] = msg - - class FakeSM(dict): - def all_checks(self, service_list=None): - return True - - logMonoTime = {"modelV2": int(1e9)} - - v_ego = 5.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.output_a_target = -0.5 - planner.output_should_stop = False - planner.v_desired_trajectory = np.zeros(CONTROL_N) - planner.a_desired_trajectory = np.zeros(CONTROL_N) - planner.j_desired_trajectory = np.zeros(CONTROL_N) - planner.fcw = False - planner.mpc.source = "cruise" - planner.mpc.solve_time = 0.0 - pm = FakePM() - - sm = FakeSM(make_sm(v_ego, desired_accel=0.0, min_accel=-1.0, experimental_mode=False)) - sm["starpilotPlan"].forcingStop = True - sm["starpilotPlan"].forcingStopLength = 5.0 - sm["starpilotPlan"].vCruise = 0.0 - - planner.publish(sm, pm) - - assert pm.sent["longitudinalPlan"].longitudinalPlan.shouldStop - - -@pytest.mark.parametrize("model_version", ["v11", "v12", "v13", "v14", "v15"]) -def test_force_stop_handoff_sets_output_should_stop_before_zero_vcruise(model_version): - v_ego = 1.25 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm(v_ego, desired_accel=-0.35, min_accel=-1.0, experimental_mode=False) - sm["starpilotPlan"].forcingStop = True - sm["starpilotPlan"].forcingStopLength = 6.5 - sm["starpilotPlan"].vCruise = 0.4 - sm["modelV2"].action.shouldStop = False - - planner.update(sm, make_toggles(model_version)) - - assert planner.output_should_stop - - -def test_publish_force_stop_handoff_sets_should_stop_when_vcruise_low(): - class FakePM: - def __init__(self): - self.sent = {} - - def send(self, name, msg): - self.sent[name] = msg - - class FakeSM(dict): - def all_checks(self, service_list=None): - return True - - logMonoTime = {"modelV2": int(1e9)} - - v_ego = 1.25 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.output_a_target = -0.35 - planner.output_should_stop = False - planner.v_desired_trajectory = np.zeros(CONTROL_N) - planner.a_desired_trajectory = np.zeros(CONTROL_N) - planner.j_desired_trajectory = np.zeros(CONTROL_N) - planner.fcw = False - planner.mpc.source = "cruise" - planner.mpc.solve_time = 0.0 - pm = FakePM() - - sm = FakeSM(make_sm(v_ego, desired_accel=0.0, min_accel=-1.0, experimental_mode=False)) - sm["starpilotPlan"].forcingStop = True - sm["starpilotPlan"].forcingStopLength = 6.5 - sm["starpilotPlan"].vCruise = 0.4 - - planner.publish(sm, pm) - - assert pm.sent["longitudinalPlan"].longitudinalPlan.shouldStop - - -def test_allow_throttle_hysteresis_filters_gas_prob_chatter(): - v_ego = 10.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm(v_ego, desired_accel=0.0, min_accel=-1.0, experimental_mode=False, gas_press_prob=0.5) - toggles = make_toggles() - - planner.update(sm, toggles) - assert planner.model_allow_throttle - assert planner.allow_throttle - - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=0.37) - planner.update(sm, toggles) - assert planner.model_allow_throttle - assert planner.allow_throttle - - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=0.34) - for _ in range(4): - planner.update(sm, toggles) - assert planner.model_allow_throttle - assert planner.allow_throttle - planner.update(sm, toggles) - assert not planner.model_allow_throttle - assert not planner.allow_throttle - - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=0.43) - planner.update(sm, toggles) - assert not planner.model_allow_throttle - assert not planner.allow_throttle - - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=0.46) - for _ in range(4): - planner.update(sm, toggles) - assert not planner.model_allow_throttle - assert not planner.allow_throttle - planner.update(sm, toggles) - assert planner.model_allow_throttle - assert planner.allow_throttle - - -def test_allow_throttle_confirmation_filters_route_length_model_pulses(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm(v_ego, desired_accel=0.0, min_accel=-1.0, experimental_mode=False, gas_press_prob=0.6) - toggles = make_toggles() - - planner.update(sm, toggles) - - # Representative gasPressProb runs from route b85c25a4c6f99d83/0000000c: - # repeated 0.05-0.20 second threshold crossings must not change the coast cap. - for probability, frames in ((0.30, 2), (0.50, 1), (0.32, 3), (0.48, 4), (0.29, 4)): - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=probability) - for _ in range(frames): - planner.update(sm, toggles) - assert planner.model_allow_throttle - assert planner.allow_throttle - - # A sustained model request still applies the physical coast cap. - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=0.2) - for _ in range(5): - planner.update(sm, toggles) - assert not planner.model_allow_throttle - assert not planner.allow_throttle - - -def test_no_throttle_cap_stays_at_coast_limit_until_throttle_returns(): - v_ego = 8.5 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm(v_ego, desired_accel=0.0, min_accel=-3.0, experimental_mode=False, gas_press_prob=0.0) - sm["carControl"].orientationNED = [0.0, 0.1, 0.0] - toggles = make_toggles() - - for _ in range(5): - planner.update(sm, toggles) - - accel_coast = max(get_vehicle_min_accel(CP, v_ego), get_coast_accel(sm["carControl"].orientationNED[1])) - - assert not planner.allow_throttle - assert planner.output_a_target == pytest.approx(accel_coast, abs=1e-3) - - -def test_low_speed_follow_catchup_accel_cap_limits_close_vision_catchup(): - v_ego = 7.8 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=18.4, v_lead=8.2, radar=False, model_prob=0.98) - - cap = planner.get_lead_catchup_accel_cap(lead, v_ego, 1.45) - - assert cap is not None - assert 0.15 <= cap <= 0.45 - - -def test_route_8bc6_post_departure_catchup_cap_uses_continuous_allowance_for_accelerating_radar_lead(): - v_ego = 19.03 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.85, v_lead=19.47, a_lead=0.33, radar=True, model_prob=1.0, y_rel=-0.30, - ) - - cap = planner.get_lead_catchup_accel_cap(lead, v_ego, 1.45) - - assert cap is not None - assert 0.1 < cap < 0.3 - - -def test_route_8bc6_cruise_tracking_cap_uses_continuous_allowance_for_accelerating_radar_follow(): - v_ego = 18.744474411010742 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.650001525878906, v_lead=19.049156188964844, - a_lead=0.4783128798007965, radar=True, model_prob=0.9989967942237854, y_rel=-0.2, - ) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.3 < cap < 0.5 - - -def test_route_687_voacc_catchup_cap_uses_continuous_spacious_allowance(): - v_ego = 12.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=25.5, v_lead=12.10, a_lead=0.0, radar=False, model_prob=0.999, y_rel=0.10, - ) - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.15 < cap < 0.3 - - -def test_route_687_voacc_cruise_tracking_cap_uses_continuous_spacious_allowance(): - v_ego = 12.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=25.5, v_lead=12.10, a_lead=0.0, radar=False, model_prob=0.999, y_rel=0.10, - ) - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.15 < cap < 0.3 - - -def test_low_speed_follow_catchup_uses_raw_vehicle_speed_when_cluster_runs_high(): - v_ego = 7.8 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.6, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=16.0, v_lead=8.4, radar=False, model_prob=0.99), - ) - sm["carState"].vEgoCluster = 9.2 - sm["starpilotPlan"].vCruise = v_ego + 4.0 - - for _ in range(6): - planner.update(sm, make_toggles()) - - assert planner.output_a_target <= 0.20 - - -def test_low_speed_follow_transition_brake_cap_softens_first_sign_flip(): - v_ego = 7.7 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=18.6, v_lead=7.6, radar=False, model_prob=0.98) - - cap = planner.get_low_speed_follow_transition_brake_cap(lead, v_ego, 1.45, 0.59, -0.24) - - assert cap is not None - assert -0.14 <= cap <= -0.08 - - -def test_low_speed_follow_transition_brake_cap_stays_off_when_gap_is_tight(): - v_ego = 7.7 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=13.0, v_lead=7.6, radar=False, model_prob=0.98) - - cap = planner.get_low_speed_follow_transition_brake_cap(lead, v_ego, 1.45, 0.59, -0.24) - - assert cap is None - - -def test_far_near_speed_follow_keeps_uncertainty_smoothing_active(): - v_ego = 30.0 - - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=78.0, v_lead=29.2, radar=False, model_prob=0.96), - ) - sm["modelV2"] = make_model(v_ego, desired_accel=0.0, gas_press_prob=1.0, brake_press_prob=0.52) - toggles = make_toggles() - - for _ in range(12): - planner.update(sm, toggles) - - assert planner.mpc.filter_time_factor > 0.75 - - -def test_near_speed_follow_keeps_some_smoothing_under_high_uncertainty(): - v_ego = 31.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=53.0, v_lead=29.8, radar=False, model_prob=0.96) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=lead, - brake_press_prob=0.85, - ) - - for _ in range(16): - planner.update(sm, make_toggles()) - - assert planner.mpc.filter_time_factor >= 0.24 - - -def test_near_speed_follow_soft_brake_cap_limits_matched_follow_pulse(): - v_ego = 31.4 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=44.0, v_lead=30.1, radar=False, model_prob=0.96) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-1.0, - experimental_mode=False, - tracking_lead=True, - lead_one=lead, - brake_press_prob=0.85, - ) - - for _ in range(16): - planner.update(sm, make_toggles()) - - assert planner.mpc.filter_time_factor >= 0.24 - assert planner.output_a_target >= -0.33 - - -def test_near_speed_follow_soft_brake_cap_covers_slightly_opening_lead(): - v_ego = 29.58 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=44.44, v_lead=30.65, radar=False, model_prob=0.98) - - cap = planner.get_matched_follow_brake_cap(lead, v_ego, 1.45) - - assert cap is not None - assert cap >= -0.14 - assert cap <= -0.06 - - -def test_near_speed_follow_soft_brake_cap_extends_to_spacious_modest_closing(): - v_ego = 23.69 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=49.48, v_lead=21.64, a_lead=-0.014, radar=False, model_prob=0.998) - - cap = planner.get_matched_follow_brake_cap(lead, v_ego, 1.45) - - assert cap is not None - assert cap >= -0.33 - assert cap <= -0.22 - - -def test_near_speed_follow_soft_brake_cap_uses_raw_vehicle_speed_when_cluster_runs_high(): - v_ego = 23.0073 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=make_lead(status=True, d_rel=47.52, v_lead=21.68, a_lead=-0.0646, radar=False, model_prob=0.998), - ) - sm["carState"].vEgoCluster = 23.6931 - sm["starpilotPlan"].maxAcceleration = 0.61 - - for _ in range(6): - planner.update(sm, make_toggles()) - - assert not planner.lead_is_matched_follow_window(sm["radarState"].leadOne, sm["carState"].vEgoCluster, 1.45) - assert planner.output_a_target > -0.35 - assert planner.output_a_target < -0.22 - - -def test_near_speed_follow_soft_brake_cap_rejects_close_gap_even_with_modest_closing(): - v_ego = 37.19 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=34.70, v_lead=35.88, radar=False, model_prob=0.99) - - cap = planner.get_matched_follow_brake_cap(lead, v_ego, 1.0) - - assert cap is None - - -def test_follow_control_lead_prefers_active_lead1_for_matched_follow(): - v_ego = 23.3 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=80.0, v_lead=20.0, radar=False, model_prob=0.6) - planner.lead_two = make_lead(status=True, d_rel=49.9, v_lead=21.9, radar=False, model_prob=0.98) - planner.mpc.source = "lead1" - - follow_lead = planner.get_follow_control_lead(True, v_ego, 1.45) - - assert follow_lead is planner.lead_two - - -def test_follow_control_lead_disables_optional_matched_follow_override(): - v_ego = 23.3 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=80.0, v_lead=20.0, radar=False, model_prob=0.6) - planner.lead_two = make_lead(status=True, d_rel=49.9, v_lead=21.9, radar=False, model_prob=0.98) - planner.mpc.source = "lead1" - - follow_lead = planner.get_follow_control_lead(True, v_ego, 1.45, allow_optional_far_lead_logic=False) - - assert follow_lead is planner.lead_one - - -def test_follow_control_lead_keeps_matched_follow_lead_without_tracking_latch(): - v_ego = 27.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=61.99, v_lead=27.63, radar=False, model_prob=0.99) - - follow_lead = planner.get_follow_control_lead(False, v_ego, 1.45) - - assert follow_lead is planner.lead_one - - -def test_follow_control_lead_requires_real_lead_control_when_optional_logic_disabled(): - v_ego = 27.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.lead_one = make_lead(status=True, d_rel=61.99, v_lead=27.63, radar=False, model_prob=0.99) - - follow_lead = planner.get_follow_control_lead(False, v_ego, 1.45, allow_optional_far_lead_logic=False) - - assert follow_lead is None - - -def test_far_lead_soft_brake_cap_limits_high_confidence_distant_vision_lead(): - v_ego = 32.37 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=82.07, v_lead=30.63, a_lead=-0.01, radar=False, model_prob=0.99) - - cap = planner.get_far_lead_brake_cap(lead, v_ego, 1.70) - - assert cap is not None - assert cap > -0.2 - assert cap < -0.05 - - -def test_far_lead_soft_brake_cap_limits_spacious_mild_closing_radar_lead(): - v_ego = 25.61 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=55.1, v_lead=24.11, a_lead=0.22, radar=True, model_prob=0.99) - - cap = planner.get_far_lead_brake_cap(lead, v_ego, 1.13) - - assert cap is not None - assert -0.11 < cap < -0.04 - - -@pytest.mark.parametrize( - "v_lead,a_lead", - [ - (22.9, 0.0), - (24.11, -0.5), - ], -) -def test_far_lead_soft_brake_cap_rejects_urgent_radar_lead(v_lead, a_lead): - v_ego = 25.61 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=55.1, v_lead=v_lead, a_lead=a_lead, radar=True, model_prob=0.99) - - assert planner.get_far_lead_brake_cap(lead, v_ego, 1.13) is None - - -def test_experimental_release_state_arms_only_on_falling_edge(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP) - - planner.update_experimental_release_accel_state(True, 10.0, v_ego=23.96) - assert planner.experimental_release_accel_until == 0.0 - - planner.update_experimental_release_accel_state(False, 10.1, v_ego=23.96) - assert planner.experimental_release_accel_until == pytest.approx( - 10.1 + longitudinal_planner_module.EXPERIMENTAL_RELEASE_ACCEL_HOLD_TIME - ) - - planner.update_experimental_release_accel_state(True, 10.2) - assert planner.experimental_release_accel_until == 0.0 - - -def test_experimental_release_state_holds_longer_at_low_speed(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP) - - planner.update_experimental_release_accel_state(True, 10.0, v_ego=6.75) - planner.update_experimental_release_accel_state(False, 10.1, v_ego=6.75) - - assert planner.experimental_release_accel_until == pytest.approx( - 10.1 + longitudinal_planner_module.EXPERIMENTAL_RELEASE_ACCEL_LOW_SPEED_HOLD_TIME - ) - - -def test_experimental_release_accel_transition_damps_low_speed_slow_lead_handoff(): - v_ego = 6.75 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=11.0, v_lead=6.8, a_lead=0.0, radar=False, model_prob=0.99) - - target = planner.get_experimental_release_accel_target( - lead, - v_ego, - 1.13, - prev_output_a_target=-0.25, - output_a_target=-0.03, - release_active=True, - ) - - assert target == pytest.approx(-0.19) - - -def test_experimental_release_accel_transition_damps_moving_lead_handoff(): - v_ego = 23.96 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=55.15, v_lead=23.73, a_lead=0.40, radar=True, model_prob=0.997) - - target = planner.get_experimental_release_accel_target( - lead, - v_ego, - 1.13, - prev_output_a_target=0.03, - output_a_target=0.44, - release_active=True, - ) - - assert target == pytest.approx(0.09) - - -def test_experimental_release_accel_transition_does_not_mask_stopped_lead(): - v_ego = 23.96 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=35.0, v_lead=0.0, a_lead=-1.0, radar=True, model_prob=0.997) - - target = planner.get_experimental_release_accel_target( - lead, - v_ego, - 1.13, - prev_output_a_target=-0.4, - output_a_target=0.4, - release_active=True, - ) - - assert target is None - - -def test_planner_arms_experimental_release_accel_only_on_mode_exit(): - v_ego = 23.96 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=55.15, v_lead=23.73, a_lead=0.40, radar=True, model_prob=0.997) - sm = make_sm( - v_ego, - desired_accel=0.0, - min_accel=-1.0, - experimental_mode=True, - tracking_lead=True, - lead_one=lead, - ) - - release_states = [] - original = planner.get_experimental_release_accel_target - - def record_release_state(self, *args, **kwargs): - release_states.append(bool(args[-1])) - return original(*args, **kwargs) - - planner.get_experimental_release_accel_target = types.MethodType(record_release_state, planner) - planner.update(sm, make_toggles()) - sm["selfdriveState"].experimentalMode = False - planner.update(sm, make_toggles()) - - assert release_states == [False, True] - - -def test_matched_follow_transition_target_damps_large_comfort_sign_flip(): - v_ego = 20.3 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=45.6, v_lead=19.19, a_lead=0.0, radar=False, model_prob=0.99) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.12, - output_a_target=-0.40, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed > -0.05 - assert smoothed < 0.12 - - -def test_matched_follow_transition_target_skips_urgent_closure(): - v_ego = 31.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=35.0, v_lead=28.0, a_lead=0.0, radar=False, model_prob=0.99) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.10, - output_a_target=-0.60, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_matched_follow_transition_target_damps_low_speed_tracking_cruise_throttle_jitter(): - v_ego = 14.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=31.1, v_lead=14.5, a_lead=0.0, radar=False, model_prob=0.999) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.08, - output_a_target=0.46, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(0.14, abs=1e-6) - - -def test_route_8bc6_opening_radar_catchup_cap_does_not_stab_out_throttle(): - v_ego = 15.60 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=24.3, v_lead=16.61, a_lead=0.82, radar=True, model_prob=1.0) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.25, - prev_output_a_target=1.31, - output_a_target=0.32, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert 1.20 < smoothed < 1.31 - - -def test_opening_radar_catchup_smoothing_yields_immediately_if_lead_brakes(): - v_ego = 15.60 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=24.3, v_lead=16.61, a_lead=-0.50, radar=True, model_prob=1.0) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.25, - prev_output_a_target=1.31, - output_a_target=0.32, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_opening_radar_catchup_smoothing_has_no_pullaway_boundary_jump(): - v_ego = 16.30 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=25.5, v_lead=17.54, a_lead=0.68, radar=True, model_prob=1.0) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.25, - prev_output_a_target=0.51, - output_a_target=0.87, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed == pytest.approx(0.56, abs=1e-6) - - -def test_route_8bc6_radar_lead_source_handoff_keeps_catchup_transition_smooth(): - v_ego = 24.44 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=37.1, v_lead=24.46, a_lead=0.33, radar=True, model_prob=1.0) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.15, - prev_output_a_target=0.42, - output_a_target=0.26, - current_source="lead0", - tracking_lead_active=True, - ) - - assert smoothed == pytest.approx(0.37, abs=1e-6) - - -def test_opening_radar_catchup_smoothing_stays_off_inside_requested_headway(): - v_ego = 15.60 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=21.0, v_lead=16.61, a_lead=0.82, radar=True, model_prob=1.0) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.25, - prev_output_a_target=1.31, - output_a_target=0.32, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_matched_follow_transition_target_skips_low_speed_without_tracking(): - v_ego = 14.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=31.1, v_lead=14.5, a_lead=0.0, radar=False, model_prob=0.999) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.08, - output_a_target=0.46, - current_source="cruise", - tracking_lead_active=False, - ) - - assert smoothed is None - - -def test_matched_follow_transition_target_skips_low_speed_real_braking(): - v_ego = 14.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=29.0, v_lead=13.6, a_lead=0.0, radar=False, model_prob=0.999) - - smoothed = planner.get_matched_follow_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.08, - output_a_target=-0.30, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_cruise_tracking_lead_accel_cap_limits_mid_speed_follow_nibble(): - v_ego = 16.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=33.4, v_lead=16.0, a_lead=0.0, radar=False, model_prob=0.99, y_rel=0.12) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.3 <= cap <= 0.5 - - -def test_cruise_tracking_lead_accel_cap_blocks_unresolved_raw_close_lead_burst(): - v_ego = 17.6 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=41.9, v_lead=14.2, a_lead=0.0, radar=True, model_prob=0.99, y_rel=-0.97) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=False, - ) - - assert cap is not None - assert 0.0 <= cap <= 0.05 - - -def test_cruise_tracking_lead_accel_cap_skips_when_lead_clearly_pulls_away(): - v_ego = 14.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=35.0, v_lead=16.0, a_lead=0.0, radar=False, model_prob=0.99, y_rel=0.1) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is None - - -def test_cruise_tracking_lead_accel_cap_skips_accelerating_away_radar_lead(): - v_ego = 11.4 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=20.5, v_lead=12.4, a_lead=0.46, radar=True, model_prob=1.0, y_rel=0.1) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is None - - -def test_cruise_tracking_lead_accel_cap_continuously_limits_spacious_tracking_only_follow(): - v_ego = 18.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=45.0, v_lead=17.4, a_lead=0.0, radar=True, model_prob=1.0, y_rel=0.1) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.3 < cap < 0.55 - - -def test_route_8bc6_radar_follow_caps_do_not_flip_between_bypass_and_hold(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=17.35) - route_states = ( - (17.35, 36.2, 16.55, 0.60), - (17.26, 34.8, 17.36, 0.40), - (18.78, 35.2, 18.58, 0.40), - (18.87, 35.0, 19.07, 0.40), - ) - - caps = [] - for v_ego, d_rel, v_lead, a_lead in route_states: - lead = make_lead(status=True, d_rel=d_rel, v_lead=v_lead, a_lead=a_lead, - radar=True, model_prob=1.0, y_rel=0.2) - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - assert cap is not None - caps.append(cap) - - assert min(caps) > 0.25 - assert max(caps) < 0.65 - assert max(caps) - min(caps) < 0.35 - - -def test_inside_gap_closing_lead_cap_blocks_route_accel_burst(): - v_ego = 17.1 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=26.3, v_lead=16.5, a_lead=0.0, radar=True, model_prob=1.0) - - cap = planner.get_inside_gap_closing_lead_accel_cap(lead, v_ego, -1.0, 1.25) - - assert cap is not None - assert cap == pytest.approx(0.0) - - -def test_inside_gap_closing_lead_cap_strengthens_with_route_closure(): - v_ego = 19.8 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=23.3, v_lead=17.3, a_lead=0.0, radar=True, model_prob=1.0) - - cap = planner.get_inside_gap_closing_lead_accel_cap(lead, v_ego, -1.0, 1.25) - - assert cap is not None - assert -0.7 <= cap <= -0.5 - - -@pytest.mark.parametrize("lead", [ - make_lead(status=True, d_rel=36.0, v_lead=16.5, radar=True, model_prob=1.0), - make_lead(status=True, d_rel=26.3, v_lead=17.8, radar=True, model_prob=1.0), - make_lead(status=True, d_rel=26.3, v_lead=16.5, radar=False, model_prob=0.8), - make_lead(status=True, d_rel=26.3, v_lead=16.5, radar=True, model_prob=1.0, y_rel=2.0), -]) -def test_inside_gap_closing_lead_cap_ignores_normal_or_ambiguous_follow(lead): - v_ego = 17.1 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - - assert planner.get_inside_gap_closing_lead_accel_cap(lead, v_ego, -1.0, 1.25) is None - - -def test_inside_gap_closing_lead_cap_does_not_touch_standstill_departure(): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=0.0) - lead = make_lead(status=True, d_rel=5.0, v_lead=1.0, a_lead=0.5, radar=True, model_prob=1.0) - - assert planner.get_inside_gap_closing_lead_accel_cap(lead, 0.0, -1.0, 1.25) is None - - -def test_route_8bc6_post_departure_cruise_cap_uses_continuous_allowance_for_accelerating_radar_lead(): - v_ego = 19.03 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.85, v_lead=19.47, a_lead=0.33, radar=True, model_prob=1.0, y_rel=-0.30, - ) - - cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.2 < cap < 0.35 - - -def test_route_8bc6_catchup_cap_skips_comfortable_accelerating_radar_follow_outside_cap_window(): - v_ego = 24.108949661254883 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=36.75, v_lead=24.234233856201172, - a_lead=0.3050585687160492, radar=True, model_prob=0.9995405077934265, y_rel=-0.2, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.160530924797058, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is None - - -def test_route_8bc6_catchup_cap_skips_slightly_negative_delta_when_lead_accelerates_away(): - v_ego = 22.293441772460938 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=36.5, v_lead=22.264942169189453, - a_lead=0.2780209183692932, radar=True, model_prob=0.999357283115387, y_rel=0.35, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.2014657258987427, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap is None - - -def test_route_8bc6_catchup_cap_continuously_limits_accelerating_lead_when_source_flips_to_lead0(): - v_ego = 24.361867904663086 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=38.5, v_lead=24.46365737915039, - a_lead=0.4625629186630249, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.3549551963806152, - current_source="lead0", - tracking_lead_active=True, - ) - - assert cap is not None - assert 0.03 < cap < 0.10 - - -def test_route_8bc6_radar_matched_follow_catchup_cap_continuously_limits_mild_pullaway_after_lead_lock(): - v_ego = 23.96 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.6, v_lead=24.23, a_lead=0.16, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.16, - current_source="lead0", - tracking_lead_active=True, - ) - - assert planner.lead_is_matched_follow_window(lead, v_ego, 1.16) - assert cap is not None - assert 0.1 < cap < 0.25 - - -def test_route_8bc6_radar_matched_follow_catchup_cap_keeps_cap_when_pullaway_is_not_confirmed(): - v_ego = 23.96 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.6, v_lead=24.23, a_lead=0.08, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.16, - current_source="lead0", - tracking_lead_active=True, - ) - - assert planner.lead_is_matched_follow_window(lead, v_ego, 1.16) - assert cap is not None - - -def test_route_8bc6_radar_matched_follow_catchup_cap_skips_buffer_edge_square_wave(): - v_ego = 22.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=41.558, v_lead=22.3, a_lead=0.0, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert planner.lead_is_matched_follow_window(lead, v_ego, 1.45) - assert cap is None - - -def test_route_8bc6_radar_matched_follow_catchup_cap_holds_small_cap_for_slower_lead_on_cruise(): - v_ego = 22.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=39.108, v_lead=21.2, a_lead=0.0, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert planner.lead_is_matched_follow_window(lead, v_ego, 1.45) - assert cap == pytest.approx(0.04, abs=1e-6) - - -def test_route_8bc6_post_departure_settle_latch_bypasses_mild_closure_catchup_cap(): - v_ego = 16.4023914337 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=25.75, v_lead=15.9339208603, - a_lead=0.1164954603, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap_without_latch = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="lead0", - tracking_lead_active=True, - ) - - planner.post_departure_follow_settle_until = time.monotonic() + 5.0 - cap_with_latch = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="lead0", - tracking_lead_active=True, - ) - - assert cap_without_latch == pytest.approx(0.03, abs=1e-6) - assert cap_with_latch is None - - -@pytest.mark.parametrize("v_ego,d_rel,v_lead,a_lead", [ - (8.05, 14.75, 8.56, 0.25), - (10.65, 14.35, 11.59, 1.38), - (8.34, 11.25, 8.33, 0.97), -]) -def test_route_8bc6_rolling_departure_arms_settle_latch(v_ego, d_rel, v_lead, a_lead): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=d_rel, v_lead=v_lead, - a_lead=a_lead, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="lead0", - tracking_lead_active=True, - ) - - assert cap is None - assert planner.post_departure_follow_settle_until > time.monotonic() - - -def test_route_8bc6_radar_catchup_cap_enters_continuously_above_min_speed(): - v_ego = 8.69 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=11.25, v_lead=8.73, - a_lead=1.10, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="lead0", - tracking_lead_active=True, - ) - - assert planner.post_departure_follow_settle_until == 0.0 - assert 1.20 < cap < 1.30 - - -def test_rolling_departure_settle_latch_stays_active_through_headway_hysteresis(): - v_ego = 10.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - departing_lead = make_lead( - status=True, d_rel=13.4, v_lead=10.3, - a_lead=0.3, radar=True, model_prob=1.0, y_rel=0.0, - ) - settling_lead = make_lead( - status=True, d_rel=13.2, v_lead=10.2, - a_lead=0.1, radar=True, model_prob=1.0, y_rel=0.0, - ) - - assert planner.post_departure_follow_settle_active(departing_lead, v_ego, 1.25) - assert planner.post_departure_follow_settle_active(settling_lead, v_ego, 1.25) - - -def test_rolling_departure_settle_latch_supports_confident_vision_lead(): - v_ego = 10.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=13.4, v_lead=10.3, - a_lead=0.3, radar=False, model_prob=0.95, y_rel=0.0, - ) - - assert planner.post_departure_follow_settle_active(lead, v_ego, 1.25) - - -def test_rolling_departure_settle_latch_clears_for_stopped_lead(): - v_ego = 10.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - departing_lead = make_lead( - status=True, d_rel=13.4, v_lead=10.3, - a_lead=0.3, radar=True, model_prob=1.0, y_rel=0.0, - ) - stopped_lead = make_lead( - status=True, d_rel=12.0, v_lead=0.0, - a_lead=0.0, radar=True, model_prob=1.0, y_rel=0.0, - ) - - assert planner.post_departure_follow_settle_active(departing_lead, v_ego, 1.25) - assert not planner.post_departure_follow_settle_active(stopped_lead, v_ego, 1.25) - assert planner.post_departure_follow_settle_until == 0.0 - - -@pytest.mark.parametrize("v_ego,d_rel,v_lead,a_lead", [ - (10.0, 14.0, 10.5, -0.2), - (10.0, 12.5, 11.0, 0.5), - (20.0, 29.0, 20.5, 0.5), -]) -def test_rolling_departure_settle_latch_does_not_arm_without_safe_departure(v_ego, d_rel, v_lead, a_lead): - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=d_rel, v_lead=v_lead, - a_lead=a_lead, radar=True, model_prob=1.0, y_rel=0.0, - ) - - assert not planner.post_departure_follow_settle_active(lead, v_ego, 1.25) - assert planner.post_departure_follow_settle_until == 0.0 - - -def test_route_8bc6_post_departure_settle_latch_bypasses_mild_closure_cruise_cap(): - v_ego = 19.2975330353 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=28.9, v_lead=19.6019687653, - a_lead=0.1241656989, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap_without_latch = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - - planner.post_departure_follow_settle_until = time.monotonic() + 5.0 - cap_with_latch = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - - assert cap_without_latch is not None - assert 0.10 < cap_without_latch < 0.25 - assert cap_with_latch is None - - -def test_post_departure_settle_latch_does_not_bypass_when_lead_brakes_again(): - v_ego = 19.192998192 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.post_departure_follow_settle_until = time.monotonic() + 5.0 - lead = make_lead( - status=True, d_rel=30.5, v_lead=19.147550216, - a_lead=-0.16, radar=True, model_prob=1.0, y_rel=0.2, - ) - - catchup_cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - cruise_cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.25, - current_source="cruise", - tracking_lead_active=True, - ) - - assert catchup_cap is not None - assert cruise_cap is not None - assert planner.post_departure_follow_settle_until == 0.0 - - -def test_post_departure_settle_latch_clears_once_follow_has_settled_near_target(): - v_ego = 16.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - planner.post_departure_follow_settle_until = time.monotonic() + 5.0 - lead = make_lead( - status=True, d_rel=20.48, v_lead=16.25, - a_lead=0.18, radar=True, model_prob=1.0, y_rel=0.0, - ) - - cap = planner.get_lead_catchup_accel_cap( - lead, - v_ego, - 1.25, - current_source="lead0", - tracking_lead_active=True, - ) - - assert cap is not None - assert planner.post_departure_follow_settle_until == 0.0 - - -def test_post_departure_pullaway_bypass_does_not_skip_when_lead_brakes_again(): - v_ego = 19.03 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead( - status=True, d_rel=33.85, v_lead=18.90, a_lead=-0.35, radar=True, model_prob=1.0, y_rel=-0.30, - ) - - catchup_cap = planner.get_lead_catchup_accel_cap(lead, v_ego, 1.45) - cruise_cap = planner.get_cruise_tracking_lead_accel_cap( - lead, - v_ego, - 1.45, - current_source="cruise", - tracking_lead_active=True, - ) - - assert catchup_cap is not None - assert cruise_cap is not None - - -def test_cruise_tracking_lead_accel_transition_target_damps_mid_speed_reacquisition_burst(): - v_ego = 16.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=20.0, v_lead=17.4, a_lead=0.0, radar=False, model_prob=0.99, y_rel=0.18) - - smoothed = planner.get_cruise_tracking_lead_accel_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.10, - output_a_target=1.10, - current_source="cruise", - ) - - assert smoothed is not None - assert smoothed == pytest.approx(0.23, abs=1e-2) - - -def test_cruise_tracking_lead_accel_transition_target_skips_clear_pullaway(): - v_ego = 16.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=34.0, v_lead=19.2, a_lead=0.0, radar=False, model_prob=0.99, y_rel=0.12) - - smoothed = planner.get_cruise_tracking_lead_accel_transition_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.10, - output_a_target=1.10, - current_source="cruise", - ) - - assert smoothed is None - - -def test_mild_follow_zero_cross_guard_coasts_on_cruise_sign_flip(): - v_ego = 19.8 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=42.0, v_lead=19.0, a_lead=-0.15, radar=False, model_prob=0.99, y_rel=0.10) - - guarded = planner.get_mild_follow_zero_cross_guard_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.18, - output_a_target=-0.12, - current_source="cruise", - tracking_lead_active=True, - ) - - assert guarded == pytest.approx(0.0, abs=1e-6) - - -def test_mild_follow_zero_cross_guard_coasts_on_near_duplicate_sign_flip(): - v_ego = 24.5 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=51.0, v_lead=21.7, a_lead=-0.25, radar=False, model_prob=0.99, y_rel=0.08) - - guarded = planner.get_mild_follow_zero_cross_guard_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.33, - output_a_target=-0.13, - current_source="lead1", - tracking_lead_active=True, - ) - - assert guarded == pytest.approx(0.0, abs=1e-6) - - -def test_mild_follow_zero_cross_guard_skips_urgent_close_follow(): - v_ego = 17.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=16.0, v_lead=12.0, a_lead=-0.45, radar=False, model_prob=0.99, y_rel=0.05) - - guarded = planner.get_mild_follow_zero_cross_guard_target( - lead, - v_ego, - 1.45, - prev_output_a_target=0.22, - output_a_target=-0.28, - current_source="cruise", - tracking_lead_active=True, - ) - - assert guarded is None - - -def test_post_097_follow_logic_is_always_active(): - v_ego = 16.2 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - lead = make_lead(status=True, d_rel=33.4, v_lead=16.0, a_lead=0.0, radar=False, model_prob=0.99, y_rel=0.12) - - planner = LongitudinalPlanner(CP, init_v=v_ego) - sm = make_sm( - v_ego, - desired_accel=0.8, - min_accel=-0.5, - experimental_mode=False, - tracking_lead=True, - lead_one=lead, - ) - sm["starpilotPlan"].vCruise = v_ego + 8.0 - - calls = [] - - def record(name, return_value=None): - def _inner(self, *args, **kwargs): - calls.append(name) - return return_value - return types.MethodType(_inner, planner) - - planner.get_follow_control_lead = record("get_follow_control_lead", lead) - planner.get_lead_catchup_accel_cap = record("get_lead_catchup_accel_cap", None) - planner.get_tracked_vision_model_brake_floor = record("get_tracked_vision_model_brake_floor", None) - planner.get_low_speed_follow_transition_brake_cap = record("get_low_speed_follow_transition_brake_cap", None) - planner.get_tracked_vision_model_brake_cap = record("get_tracked_vision_model_brake_cap", None) - planner.get_cruise_tracking_lead_accel_cap = record("get_cruise_tracking_lead_accel_cap", None) - planner.get_cruise_tracking_lead_accel_transition_target = record("get_cruise_tracking_lead_accel_transition_target", None) - - planner.update(sm, make_toggles()) - - expected_calls = { - "get_lead_catchup_accel_cap", - "get_follow_control_lead", - "get_tracked_vision_model_brake_floor", - "get_low_speed_follow_transition_brake_cap", - "get_tracked_vision_model_brake_cap", - "get_cruise_tracking_lead_accel_cap", - "get_cruise_tracking_lead_accel_transition_target", - } - - assert expected_calls.issubset(set(calls)) - - -def test_near_duplicate_lead_source_hysteresis_prefers_previous_source(): - v_ego = 27.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=46.2, v_lead=25.5, a_lead=-0.05, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=46.8, v_lead=25.55, a_lead=-0.03, radar=False, model_prob=0.99) - - lead_0_bias, lead_1_bias = planner.mpc.get_near_duplicate_lead_source_hysteresis("lead0", lead_one, lead_two, v_ego) - - assert lead_0_bias == 0.0 - assert lead_1_bias > 0.0 - - -def test_stable_follow_cruise_hysteresis_applies_for_radar_lead(): - v_ego = 27.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=40.5, v_lead=26.3, a_lead=-0.02, radar=True, model_prob=1.0) - - hysteresis = planner.mpc.get_stable_follow_cruise_hysteresis(lead, v_ego, 1.45) - - assert hysteresis > 0.0 - - -def test_stable_follow_cruise_hysteresis_holds_pullaway_lead_longer_near_target_gap(): - v_ego = 15.0 - t_follow = 1.45 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_matched = make_lead(status=True, d_rel=22.0, v_lead=15.0, a_lead=0.02, radar=True, model_prob=1.0) - lead_pullaway = make_lead(status=True, d_rel=22.0, v_lead=16.4, a_lead=0.02, radar=True, model_prob=1.0) - - matched_hysteresis = planner.mpc.get_stable_follow_cruise_hysteresis(lead_matched, v_ego, t_follow) - pullaway_hysteresis = planner.mpc.get_stable_follow_cruise_hysteresis(lead_pullaway, v_ego, t_follow) - - assert pullaway_hysteresis > matched_hysteresis - - -def test_stable_follow_cruise_hysteresis_skips_fast_closing_radar_lead(): - v_ego = 27.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead = make_lead(status=True, d_rel=40.5, v_lead=21.5, a_lead=-0.02, radar=True, model_prob=1.0) - - hysteresis = planner.mpc.get_stable_follow_cruise_hysteresis(lead, v_ego, 1.45) - - assert hysteresis == 0.0 - - -def test_vision_follow_cruise_hold_keeps_high_confidence_matched_lead_through_small_crossover(): - v_ego = 22.5 - t_follow = 1.20 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=32.0, v_lead=22.0, a_lead=-0.02, radar=False, model_prob=0.99) - lead_two = make_lead(status=False) - - sticky = planner.mpc.get_vision_follow_cruise_hold( - "lead0", - lead_one, - lead_two, - 101.0, - 200.0, - 100.0, - v_ego, - t_follow, - True, - ) - - assert sticky == "lead0" - - -@pytest.mark.parametrize("tracking_lead, radar, model_prob, cruise_obstacle", [ - (False, False, 0.99, 100.0), - (True, True, 1.0, 100.0), - (True, False, 0.80, 100.0), - (True, False, 0.99, 98.0), -]) -def test_vision_follow_cruise_hold_skips_nonmatching_or_clear_cruise_cases( - tracking_lead, radar, model_prob, cruise_obstacle, -): - v_ego = 22.5 - t_follow = 1.20 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=32.0, v_lead=22.0, a_lead=-0.02, radar=radar, model_prob=model_prob) - lead_two = make_lead(status=False) - - sticky = planner.mpc.get_vision_follow_cruise_hold( - "lead0", - lead_one, - lead_two, - 101.0, - 200.0, - cruise_obstacle, - v_ego, - t_follow, - tracking_lead, - ) - - assert sticky is None - - -@pytest.mark.parametrize("prev_source, lead_accel", [ - ("cruise", -0.02), - ("lead0", -0.60), -]) -def test_vision_follow_cruise_hold_never_delays_restrictive_transition(prev_source, lead_accel): - v_ego = 22.5 - t_follow = 1.20 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=32.0, v_lead=22.0, a_lead=lead_accel, radar=False, model_prob=0.99) - lead_two = make_lead(status=False) - - sticky = planner.mpc.get_vision_follow_cruise_hold( - prev_source, - lead_one, - lead_two, - 101.0, - 200.0, - 100.0, - v_ego, - t_follow, - True, - ) - - assert sticky is None - - -def test_near_duplicate_lead_source_hysteresis_prefers_previous_source_for_identical_radar_track(): - v_ego = 27.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=34.6, v_lead=24.2, a_lead=-0.04, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=34.7, v_lead=24.2, a_lead=-0.04, radar=True, model_prob=1.0) - lead_one.vRel = -0.8 - lead_two.vRel = -0.78 - lead_one.radarTrackId = 123 - lead_two.radarTrackId = 123 - - lead_0_bias, lead_1_bias = planner.mpc.get_near_duplicate_lead_source_hysteresis("lead0", lead_one, lead_two, v_ego) - - assert lead_0_bias == 0.0 - assert lead_1_bias > 0.0 - - -def test_near_duplicate_leads_detect_identical_radar_track_below_45_mph(): - v_ego = 14.31 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=25.7, v_lead=14.61, a_lead=0.0, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=25.7, v_lead=14.61, a_lead=0.0, radar=True, model_prob=1.0) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - assert planner.mpc.leads_are_near_duplicates(lead_one, lead_two, v_ego) - - -def test_identical_radar_duplicate_source_hold_keeps_previous_label(): - v_ego = 21.6 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=33.5, v_lead=20.7, a_lead=-0.03, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=33.5, v_lead=20.7, a_lead=-0.03, radar=True, model_prob=1.0) - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - sticky = planner.mpc.get_identical_radar_duplicate_source_hold("lead1", lead_one, lead_two, 33.52, 33.50) - - assert sticky == "lead1" - - -def test_identical_radar_duplicate_cruise_hold_keeps_previous_lead_through_route_like_crossover(): - v_ego = 22.57 - t_follow = 1.20 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=32.3, v_lead=23.74, a_lead=0.67, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=32.3, v_lead=23.74, a_lead=0.67, radar=True, model_prob=1.0) - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - sticky = planner.mpc.get_identical_radar_duplicate_cruise_hold( - "lead0", - lead_one, - lead_two, - 144.92, - 144.91, - 135.10, - v_ego, - t_follow, - ) - - assert sticky == "lead0" - - -def test_identical_radar_duplicate_cruise_hold_skips_clear_pullaway(): - v_ego = 22.57 - t_follow = 1.20 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=48.0, v_lead=25.5, a_lead=0.45, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=48.0, v_lead=25.5, a_lead=0.45, radar=True, model_prob=1.0) - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - sticky = planner.mpc.get_identical_radar_duplicate_cruise_hold( - "lead0", - lead_one, - lead_two, - 180.0, - 180.0, - 150.0, - v_ego, - t_follow, - ) - - assert sticky is None - - -def test_identical_radar_duplicate_cruise_bias_penalizes_near_target_follow(): - v_ego = 23.8 - t_follow = 1.15 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=35.8, v_lead=23.2, a_lead=0.02, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=35.8, v_lead=23.2, a_lead=0.02, radar=True, model_prob=1.0) - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - bias = planner.mpc.get_identical_radar_duplicate_cruise_bias(lead_one, lead_two, v_ego, t_follow) - - assert bias > 0.0 - - -def test_identical_radar_duplicate_cruise_bias_skips_far_pullaway_follow(): - v_ego = 23.8 - t_follow = 1.15 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=52.0, v_lead=25.5, a_lead=0.08, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=52.0, v_lead=25.5, a_lead=0.08, radar=True, model_prob=1.0) - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - - bias = planner.mpc.get_identical_radar_duplicate_cruise_bias(lead_one, lead_two, v_ego, t_follow) - - assert bias == 0.0 - - -def test_near_duplicate_lead_source_hysteresis_skips_distinct_leads(): - v_ego = 27.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=41.0, v_lead=23.8, a_lead=0.0, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=48.0, v_lead=25.4, a_lead=0.0, radar=False, model_prob=0.99) - - lead_0_bias, lead_1_bias = planner.mpc.get_near_duplicate_lead_source_hysteresis("lead0", lead_one, lead_two, v_ego) - - assert lead_0_bias == 0.0 - assert lead_1_bias == 0.0 - - -def test_duplicate_vision_comfort_lead_prefers_centered_candidate_before_closer_offset_candidate(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.8, v_lead=24.2, a_lead=-0.03, radar=False, model_prob=0.99, y_rel=0.10) - lead_two = make_lead(status=True, d_rel=44.2, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99, y_rel=1.05) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - selected = planner.get_duplicate_vision_comfort_lead(v_ego) - - assert selected is lead_one - assert planner.duplicate_vision_comfort_lead_source == "lead0" - - -def test_duplicate_vision_comfort_lead_supports_mid_speed_follow_churn(): - v_ego = 16.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=30.0, v_lead=15.8, a_lead=0.02, radar=False, model_prob=1.0, y_rel=0.05) - lead_two = make_lead(status=True, d_rel=30.1, v_lead=15.82, a_lead=0.01, radar=False, model_prob=1.0, y_rel=0.08) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - selected = planner.get_duplicate_vision_comfort_lead(v_ego) - - assert selected is lead_one - - -def test_duplicate_vision_comfort_lead_latches_source_until_duplicate_cluster_resolves(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.8, v_lead=24.2, a_lead=-0.03, radar=False, model_prob=0.99, y_rel=0.10) - lead_two = make_lead(status=True, d_rel=44.2, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99, y_rel=1.05) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - initial = planner.get_duplicate_vision_comfort_lead(v_ego) - - lead_one.yRel = 1.25 - lead_two.yRel = 0.05 - lead_one.dRel = 44.4 - lead_two.dRel = 44.5 - latched = planner.get_duplicate_vision_comfort_lead(v_ego) - - assert initial is lead_one - assert latched is lead_one - assert planner.duplicate_vision_comfort_lead_source == "lead0" - - -def test_duplicate_vision_comfort_lead_resets_when_duplicate_cluster_clears(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.8, v_lead=24.2, a_lead=-0.03, radar=False, model_prob=0.99, y_rel=0.10) - lead_two = make_lead(status=True, d_rel=44.2, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99, y_rel=1.05) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - assert planner.get_duplicate_vision_comfort_lead(v_ego) is lead_one - - lead_two.dRel = 49.5 - assert planner.get_duplicate_vision_comfort_lead(v_ego) is None - assert planner.duplicate_vision_comfort_lead_source is None - - -def test_nonurgent_duplicate_vision_follow_keeps_comfort_smoothing(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=35.0, v_lead=20.5, a_lead=-0.05, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=35.2, v_lead=20.52, a_lead=-0.04, radar=False, model_prob=0.99) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - assert planner.is_nonurgent_duplicate_vision_follow(v_ego, 1.45) - - -@pytest.mark.parametrize("d_rel,v_lead,a_lead", [ - (24.0, 20.0, -0.05), # Low TTC. - (22.0, 23.0, -0.05), # Headway materially below the requested gap. - (35.0, 20.5, -0.50), # The lead is braking. -]) -def test_duplicate_vision_follow_preserves_urgent_panic_bypass(d_rel, v_lead, a_lead): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=d_rel, v_lead=v_lead, a_lead=a_lead, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=d_rel + 0.2, v_lead=v_lead + 0.02, a_lead=a_lead, radar=False, model_prob=0.99) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - assert not planner.is_nonurgent_duplicate_vision_follow(v_ego, 1.45) - - -def test_radar_duplicates_preserve_panic_bypass(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=35.0, v_lead=20.5, a_lead=-0.05, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=35.0, v_lead=20.5, a_lead=-0.05, radar=True, model_prob=1.0) - lead_one.radarTrackId = 17 - lead_two.radarTrackId = 17 - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - assert not planner.is_nonurgent_duplicate_vision_follow(v_ego, 1.45) - - -def test_near_duplicate_lead_transition_target_damps_same_source_sign_flip(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99) - lead_one.vRel = -0.95 - lead_two.vRel = -1.00 - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_two, - v_ego, - 1.45, - prev_output_a_target=-1.10, - output_a_target=0.13, - current_source="lead1", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(-0.92, abs=1e-6) - - -def test_near_duplicate_lead_transition_target_damps_tracking_cruise_sign_flip(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99) - lead_one.vRel = -0.95 - lead_two.vRel = -1.00 - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_two, - v_ego, - 1.45, - prev_output_a_target=-1.10, - output_a_target=0.13, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(-0.92, abs=1e-6) - - -def test_near_duplicate_lead_transition_target_damps_low_speed_duplicate_radar_handoff(): - v_ego = 17.61 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=41.9, v_lead=16.85, a_lead=0.0, radar=True, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=41.9, v_lead=16.85, a_lead=0.0, radar=True, model_prob=1.0) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - lead_one.radarTrackId = 2493 - lead_two.radarTrackId = 2493 - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_one, - v_ego, - 1.45, - prev_output_a_target=0.89, - output_a_target=0.05, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(0.57, abs=1e-6) - - -def test_near_duplicate_lead_transition_target_damps_mid_speed_duplicate_vision_handoff(): - v_ego = 17.6 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.8, v_lead=16.8, a_lead=0.0, radar=False, model_prob=1.0) - lead_two = make_lead(status=True, d_rel=44.9, v_lead=16.82, a_lead=0.0, radar=False, model_prob=1.0) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_one, - v_ego, - 1.25, - prev_output_a_target=0.49, - output_a_target=0.03, - current_source="cruise", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(0.17, abs=1e-6) - - -def test_near_duplicate_lead_transition_target_damps_generous_headway_duplicate_vision_sign_flip(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=54.0, v_lead=20.8, a_lead=-0.02, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=54.3, v_lead=20.82, a_lead=-0.01, radar=False, model_prob=0.99) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_two, - v_ego, - 1.45, - prev_output_a_target=0.70, - output_a_target=-0.61, - current_source="lead1", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(0.52, abs=1e-6) - - -def test_near_duplicate_lead_transition_target_skips_fast_duplicate_vision_sign_flip_when_headway_is_not_generous(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=43.0, v_lead=20.8, a_lead=-0.02, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=43.3, v_lead=20.82, a_lead=-0.01, radar=False, model_prob=0.99) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_two, - v_ego, - 1.45, - prev_output_a_target=0.70, - output_a_target=-0.61, - current_source="lead1", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_duplicate_slow_lead_brake_hold_prevents_zero_cross_from_duplicate_voacc_leads(): - v_ego = 24.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=19.2, v_lead=20.0, a_lead=-0.38, radar=False, model_prob=0.998) - lead_two = make_lead(status=True, d_rel=19.25, v_lead=20.02, a_lead=-0.41, radar=False, model_prob=0.996) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_duplicate_slow_lead_brake_hold_target( - lead_one, - v_ego, - 1.0, - prev_output_a_target=-3.50, - output_a_target=0.0, - current_source="lead0", - tracking_lead_active=True, - ) - - assert smoothed is not None - assert smoothed == pytest.approx(-3.28, abs=1e-6) - - -def test_duplicate_slow_lead_brake_hold_skips_distinct_leads(): - v_ego = 24.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=19.2, v_lead=20.0, a_lead=-0.38, radar=False, model_prob=0.998) - lead_two = make_lead(status=True, d_rel=24.0, v_lead=21.5, a_lead=-0.10, radar=False, model_prob=0.996) - lead_one.vRel = lead_one.vLead - v_ego - lead_two.vRel = lead_two.vLead - v_ego - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_duplicate_slow_lead_brake_hold_target( - lead_one, - v_ego, - 1.0, - prev_output_a_target=-3.50, - output_a_target=0.0, - current_source="lead0", - tracking_lead_active=True, - ) - - assert smoothed is None - - -def test_near_duplicate_lead_transition_target_skips_plain_cruise_without_tracking(): - v_ego = 25.0 - CP = CarInterface.get_non_essential_params(CAR.HONDA_CIVIC) - planner = LongitudinalPlanner(CP, init_v=v_ego) - lead_one = make_lead(status=True, d_rel=44.6, v_lead=24.05, a_lead=-0.03, radar=False, model_prob=0.99) - lead_two = make_lead(status=True, d_rel=45.1, v_lead=24.0, a_lead=-0.04, radar=False, model_prob=0.99) - lead_one.vRel = -0.95 - lead_two.vRel = -1.00 - planner.lead_one = lead_one - planner.lead_two = lead_two - - smoothed = planner.get_near_duplicate_lead_transition_target( - lead_two, - v_ego, - 1.45, - prev_output_a_target=-1.10, - output_a_target=0.13, - current_source="cruise", - tracking_lead_active=False, - ) - - assert smoothed is None diff --git a/selfdrive/controls/tests/test_starpilot_acceleration.py b/selfdrive/controls/tests/test_starpilot_acceleration.py index 25ddb3112..611b4b99d 100644 --- a/selfdrive/controls/tests/test_starpilot_acceleration.py +++ b/selfdrive/controls/tests/test_starpilot_acceleration.py @@ -18,7 +18,7 @@ from openpilot.starpilot.controls.lib.starpilot_acceleration import ( class FakePlanner: def __init__(self, *, v_cruise=0.0, slc_target=0.0, slc_offset=0.0, overridden_speed=0.0, - red_light=False, forcing_stop=False, disable_throttle=False): + red_light=False, forcing_stop=False): self.v_cruise = v_cruise self.starpilot_weather = SimpleNamespace(weather_id=0, reduce_acceleration=0.0) self.starpilot_vcruise = SimpleNamespace( @@ -27,8 +27,7 @@ class FakePlanner: forcing_stop=forcing_stop, slc=SimpleNamespace(overridden_speed=overridden_speed), ) - self.starpilot_cem = SimpleNamespace(stop_light_detected=red_light) - self.starpilot_following = SimpleNamespace(disable_throttle=disable_throttle) + self.longitudinal_intent = SimpleNamespace(stop_detected=red_light) def make_toggles(**overrides): diff --git a/selfdrive/controls/tests/test_starpilot_planner.py b/selfdrive/controls/tests/test_starpilot_planner.py index 5e3243aaa..a93751be8 100644 --- a/selfdrive/controls/tests/test_starpilot_planner.py +++ b/selfdrive/controls/tests/test_starpilot_planner.py @@ -21,7 +21,6 @@ class FakeSM(dict): def make_toggles(**overrides): defaults = { "compass": False, - "conditional_experimental_mode": False, "minimum_lane_change_speed": 100.0, "pause_lateral_below_speed": 10.0, "pause_lateral_below_signal": True, @@ -61,8 +60,7 @@ def make_planner(monkeypatch): monkeypatch.setattr(planner.starpilot_following, "update", lambda *args, **kwargs: None) monkeypatch.setattr(planner.starpilot_vcruise, "update", lambda *args, **kwargs: 0.0) monkeypatch.setattr(planner.starpilot_weather, "update_weather", lambda *args, **kwargs: None) - monkeypatch.setattr(planner.starpilot_cem, "stop_sign_and_light", lambda *args, **kwargs: None) - monkeypatch.setattr(planner, "update_lead_status", lambda *args, **kwargs: False) + monkeypatch.setattr(planner.longitudinal_intent, "update", lambda *args, **kwargs: None) return planner @@ -81,7 +79,6 @@ def test_lateral_resume_delay_zero_keeps_immediate_resume(monkeypatch): finally: planner.shutdown() - def test_lateral_resume_delay_holds_resume_after_low_speed_turn(monkeypatch): planner = make_planner(monkeypatch) @@ -116,68 +113,3 @@ def test_lateral_resume_delay_ignores_signal_cycles_that_never_slow_enough(monke assert planner.blinker_delay_active is False finally: planner.shutdown() - - -def test_radarless_follow_hold_applies_to_tracked_vision_lead(monkeypatch): - planner = StarPilotPlanner(Path("/tmp/nonexistent"), DummyThemeManager()) - - try: - monkeypatch.setattr(starpilot_planner_module.time, "monotonic", lambda: 100.0) - planner.model_length = 30.0 - planner.tracking_lead = True - planner.starpilot_following.t_follow = 1.45 - planner.lead_one = SimpleNamespace( - status=True, - dRel=46.0, - vLead=27.0, - aLeadK=0.0, - modelProb=0.98, - radar=False, - ) - - planner.update_lead_status(27.5) - assert planner.radarless_follow_hold_until > 100.0 - finally: - planner.shutdown() - - -def test_tracked_vision_lead_uses_exit_hysteresis_at_mid_speed(): - planner = StarPilotPlanner(Path("/tmp/nonexistent"), DummyThemeManager()) - - try: - planner.model_length = 174.0 - planner.tracking_lead = True - planner.tracking_lead_filter.x = 1.0 - planner.lead_one = SimpleNamespace( - status=True, - dRel=44.5, - vLead=16.7, - yRel=-0.69, - aLeadK=0.0, - modelProb=0.99, - radar=False, - ) - - assert planner.update_lead_status(16.8) - finally: - planner.shutdown() - - -def test_untracked_vision_lead_still_uses_strict_entry_gate(): - planner = StarPilotPlanner(Path("/tmp/nonexistent"), DummyThemeManager()) - - try: - planner.model_length = 174.0 - planner.lead_one = SimpleNamespace( - status=True, - dRel=44.5, - vLead=16.7, - yRel=-0.69, - aLeadK=0.0, - modelProb=0.99, - radar=False, - ) - - assert not planner.update_lead_status(16.8) - finally: - planner.shutdown() diff --git a/selfdrive/controls/tests/test_starpilot_vcruise.py b/selfdrive/controls/tests/test_starpilot_vcruise.py index 78670af9f..510ce8b5c 100644 --- a/selfdrive/controls/tests/test_starpilot_vcruise.py +++ b/selfdrive/controls/tests/test_starpilot_vcruise.py @@ -34,7 +34,7 @@ def make_vcruise(*, red_light=False, raw_model_stopped=False, forcing_stop=False params=FakeParams(), params_memory=FakeParams({"NavInstructionState": nav_state or {}}), lead_one=SimpleNamespace(status=False, dRel=float("inf"), vLead=0.0), - starpilot_cem=SimpleNamespace(stop_light_detected=red_light), + longitudinal_intent=SimpleNamespace(stop_detected=red_light), tracking_lead=False, driving_in_curve=False, model_length=60.0, @@ -432,9 +432,9 @@ def test_stop_then_turn_override_releases_after_stop_seen_window_expires(): sm["carState"].steeringAngleDeg = 30.0 toggles = make_toggles() - planner.starpilot_cem.stop_light_detected = True + planner.longitudinal_intent.stop_detected = True update_vcruise(vcruise, sm, toggles, now=0.0, v_ego=7.0) - planner.starpilot_cem.stop_light_detected = False + planner.longitudinal_intent.stop_detected = False now = FORCE_STOP_TURN_VETO_STOP_SEEN_HOLD_TIME + 0.5 for frame in range(12): @@ -521,7 +521,7 @@ def test_standstill_seeded_force_stop_hold_requires_clear_window_before_release( assert first == pytest.approx(0.0) assert vcruise.standstill_force_stop_hold - planner.starpilot_cem.stop_light_detected = False + planner.longitudinal_intent.stop_detected = False second = vcruise.update( controls_enabled=True, now=0.4, @@ -567,7 +567,7 @@ def test_standstill_seeded_force_stop_hold_accepts_datetime_now_without_crashing assert first == pytest.approx(0.0) assert vcruise.standstill_force_stop_hold - planner.starpilot_cem.stop_light_detected = False + planner.longitudinal_intent.stop_detected = False second = vcruise.update( controls_enabled=True, now=base + datetime.timedelta(seconds=0.4), diff --git a/selfdrive/controls/tests/test_unified_longitudinal_intent.py b/selfdrive/controls/tests/test_unified_longitudinal_intent.py new file mode 100644 index 000000000..77c57df64 --- /dev/null +++ b/selfdrive/controls/tests/test_unified_longitudinal_intent.py @@ -0,0 +1,159 @@ +from types import SimpleNamespace + +import pytest + +from openpilot.starpilot.common.experimental_state import CEStatus +from openpilot.starpilot.controls.lib.unified_longitudinal_intent import ( + MODEL_STOP_ENTER, + UnifiedLongitudinalIntent, +) + + +class FakeParamsMemory: + def __init__(self): + self.values = {} + + def put_int(self, key, value): + self.values[key] = value + + +def make_controller(): + planner = SimpleNamespace( + params_memory=FakeParamsMemory(), + driving_in_curve=False, + road_curvature_detected=False, + starpilot_vcruise=SimpleNamespace( + forcing_stop=False, + stop_sign_confirmed=False, + slc=SimpleNamespace(experimental_mode=False), + ), + ) + return planner, UnifiedLongitudinalIntent(planner) + + +def make_sm(*, v_ego=10.0, should_stop=False, model_distance=100.0, + end_speed=10.0, traffic=False, lead_one=None, lead_two=None): + model = SimpleNamespace( + action=SimpleNamespace(shouldStop=should_stop), + position=SimpleNamespace(x=[0.0, model_distance]), + velocity=SimpleNamespace(x=[v_ego, end_speed]), + ) + empty_lead = SimpleNamespace(status=False) + return { + "modelV2": model, + "carState": SimpleNamespace( + standstill=v_ego == 0.0, + leftBlinker=False, + rightBlinker=False, + steeringAngleDeg=0.0, + ), + "radarState": SimpleNamespace( + leadOne=lead_one or empty_lead, + leadTwo=lead_two or empty_lead, + ), + "starpilotCarState": SimpleNamespace(trafficModeEnabled=traffic), + } + + +def toggles(model_first=False): + return SimpleNamespace(longitudinal_model_preference=model_first) + + +def settle(controller, sm, *, v_ego=10.0, frames=20): + for _ in range(frames): + controller.update(v_ego, sm, toggles()) + + +def test_open_road_has_no_stop_intent(): + _, controller = make_controller() + sm = make_sm() + + settle(controller, sm) + + assert not controller.stop_detected + assert controller.status_value == CEStatus["OFF"] + + +def test_model_stop_is_filtered_then_latched(): + _, controller = make_controller() + sm = make_sm(model_distance=5.0, end_speed=0.0) + + while controller.stop_filter.x < MODEL_STOP_ENTER: + controller.update(10.0, sm, toggles()) + + assert controller.stop_detected + assert controller.status_value == CEStatus["STOP_LIGHT"] + + +def test_stop_intent_releases_with_hysteresis(): + _, controller = make_controller() + stop_scene = make_sm(should_stop=True) + settle(controller, stop_scene) + assert controller.stop_detected + + clear_scene = make_sm() + controller.update(10.0, clear_scene, toggles()) + assert controller.stop_detected + settle(controller, clear_scene) + assert not controller.stop_detected + + +@pytest.mark.parametrize("hard_stop", ["forcing_stop", "stop_sign_confirmed"]) +def test_explicit_stop_sources_pin_intent(hard_stop): + planner, controller = make_controller() + setattr(planner.starpilot_vcruise, hard_stop, True) + + controller.update(5.0, make_sm(v_ego=5.0), toggles()) + + assert controller.stop_detected + assert controller.status_value == CEStatus["STOP_LIGHT"] + + +def test_committed_turn_vetoes_model_stop_false_positive(): + planner, controller = make_controller() + planner.driving_in_curve = True + sm = make_sm(v_ego=4.0, should_stop=True) + sm["carState"].leftBlinker = True + sm["carState"].steeringAngleDeg = 60.0 + + settle(controller, sm, v_ego=4.0) + + assert not controller.stop_detected + + +def test_traffic_mode_vetoes_model_stop_but_not_explicit_force_stop(): + planner, controller = make_controller() + sm = make_sm(should_stop=True, traffic=True) + settle(controller, sm) + assert not controller.stop_detected + + planner.starpilot_vcruise.forcing_stop = True + controller.update(10.0, sm, toggles()) + assert controller.stop_detected + + +def test_either_credible_slow_lead_slot_sets_diagnostic_status(): + _, controller = make_controller() + slow_lead = SimpleNamespace( + status=True, + dRel=25.0, + vLead=4.0, + modelProb=0.95, + radar=False, + ) + sm = make_sm(v_ego=10.0, lead_two=slow_lead) + + settle(controller, sm) + + assert not controller.stop_detected + assert controller.status_value == CEStatus["LEAD"] + + +def test_model_first_preference_is_status_only_not_a_separate_controller(): + planner, controller = make_controller() + + controller.update(10.0, make_sm(), toggles(model_first=True)) + + assert not controller.stop_detected + assert controller.status_value == CEStatus["USER_OVERRIDDEN"] + assert planner.params_memory.values["CEStatus"] == CEStatus["USER_OVERRIDDEN"] diff --git a/selfdrive/selfdrived/selfdrived.py b/selfdrive/selfdrived/selfdrived.py index 626bbba04..2029595c8 100644 --- a/selfdrive/selfdrived/selfdrived.py +++ b/selfdrive/selfdrived/selfdrived.py @@ -736,10 +736,7 @@ class SelfdriveD: self.starpilot_events.add_from_msg(self.sm['starpilotPlan'].starpilotEvents) - if self.starpilot_toggles.conditional_experimental_mode or getattr(self.starpilot_toggles, "conditional_chill_mode", False): - self.experimental_mode = self.sm['starpilotPlan'].experimentalMode - else: - self.experimental_mode |= self.sm['starpilotPlan'].experimentalMode + self.experimental_mode = False if self.safe_mode else self.sm['starpilotPlan'].experimentalMode def data_sample(self): _car_state = messaging.recv_one(self.car_state_sock) @@ -885,10 +882,6 @@ class SelfdriveD: self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") - if self.safe_mode: - self.experimental_mode = False - elif not self.starpilot_toggles.conditional_experimental_mode: - self.experimental_mode = self.params.get_bool("ExperimentalMode") and self.CP.openpilotLongitudinalControl self.personality = log.LongitudinalPersonality.relaxed if self.safe_mode else self.params.get("LongitudinalPersonality", return_default=True) time.sleep(0.1) diff --git a/selfdrive/test/longitudinal_maneuvers/maneuver.py b/selfdrive/test/longitudinal_maneuvers/maneuver.py index 2d1e8e5b2..127797063 100644 --- a/selfdrive/test/longitudinal_maneuvers/maneuver.py +++ b/selfdrive/test/longitudinal_maneuvers/maneuver.py @@ -25,6 +25,7 @@ class Maneuver: self.e2e = kwargs.get("e2e", False) self.personality = kwargs.get("personality", 0) self.force_decel = kwargs.get("force_decel", False) + self.lead_move_started_at = None self.duration = duration self.title = title @@ -68,7 +69,13 @@ class Maneuver: print("Crashed!!!!") valid = False - if self.ensure_start and log['v_rel'] > 0 and log['acceleration'] < 1e-3: + if self.ensure_start and speed_lead > 0 and self.lead_move_started_at is None: + self.lead_move_started_at = plant.current_time + start_wait_expired = ( + self.lead_move_started_at is not None and + plant.current_time - self.lead_move_started_at > 0.5 + ) + if self.ensure_start and start_wait_expired and log['v_rel'] > 0 and log['acceleration'] < 1e-3: print('LongitudinalPlanner not starting!') valid = False diff --git a/selfdrive/test/longitudinal_maneuvers/plant.py b/selfdrive/test/longitudinal_maneuvers/plant.py index 222df45ff..878d616dc 100755 --- a/selfdrive/test/longitudinal_maneuvers/plant.py +++ b/selfdrive/test/longitudinal_maneuvers/plant.py @@ -10,15 +10,11 @@ from types import SimpleNamespace from cereal import log import cereal.messaging as messaging from opendbc.car.interfaces import ACCEL_MAX, ACCEL_MIN -from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.realtime import Ratekeeper, DT_MDL from openpilot.selfdrive.controls.lib.longcontrol import LongCtrlState -from openpilot.selfdrive.controls.lib.lead_behavior import should_hold_tracked_vision_lead, should_track_lead from openpilot.selfdrive.modeld.constants import ModelConstants from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import STOP_DISTANCE from openpilot.selfdrive.controls.radard import _LEAD_ACCEL_TAU -from openpilot.starpilot.common.starpilot_variables import THRESHOLD class Plant: @@ -91,7 +87,6 @@ class Plant: self.e2e = e2e self.personality = personality self.force_decel = force_decel - self.tracking_lead_filter = FirstOrderFilter(0.0, 0.5, DT_MDL) self.rk = Ratekeeper(self.rate, print_delay_threshold=100.0) self.ts = 1. / self.rate @@ -185,33 +180,8 @@ class Plant: car_state.carState.vCruise = float(v_cruise * 3.6) car_control.carControl.orientationNED = [0., float(pitch), 0.] - tracking_lead = bool(status) - if self.track_lead_with_gate: - tracking_candidate = should_track_lead( - status, - float(d_rel), - float(position.x[-1]) if len(position.x) else 0.0, - STOP_DISTANCE, - float(self.speed), - v_lead=float(v_lead), - radar=bool(self.only_radar), - ) - continuity_candidate = self.tracking_lead_filter.x >= THRESHOLD * 0.6 - if not tracking_candidate and continuity_candidate: - tracking_candidate = should_hold_tracked_vision_lead( - status, - float(d_rel), - float(position.x[-1]) if len(position.x) else 0.0, - STOP_DISTANCE, - float(self.speed), - model_prob=float(prob_lead), - y_rel=float(lead.yRel), - radar=bool(self.only_radar), - ) - self.tracking_lead_filter.update(tracking_candidate) - tracking_lead = self.tracking_lead_filter.x >= THRESHOLD - else: - self.tracking_lead_filter.update(float(status)) + # The planner must remain safe even if a legacy tracking diagnostic is false. + tracking_lead = bool(status and not self.track_lead_with_gate) # ******** get controlsState messages for plotting *** starpilot_plan = SimpleNamespace( diff --git a/selfdrive/ui/layouts/settings/starpilot/longitudinal.py b/selfdrive/ui/layouts/settings/starpilot/longitudinal.py index 40a18a180..3dd83becd 100644 --- a/selfdrive/ui/layouts/settings/starpilot/longitudinal.py +++ b/selfdrive/ui/layouts/settings/starpilot/longitudinal.py @@ -50,7 +50,6 @@ from openpilot.starpilot.common.accel_profile import ( normalize_acceleration_profile, normalize_deceleration_profile, ) -from openpilot.starpilot.common.experimental_state import sync_persist_experimental_state, sync_persist_chill_state from openpilot.common.constants import CV @@ -94,8 +93,8 @@ class AdaptiveSpeedView(CardHubManagerView): def _build_cards(self): return [ { - "title": tr("Conditional Drive Mode"), - "desc": tr("Configure automated switching between Experimental and Chill Modes based on set conditions."), + "title": tr("Longitudinal Preference"), + "desc": tr("Choose whether set speed or the driving model leads on open roads. Lead and stop safety are identical."), "icon": "steering", "on_click": lambda: self._controller._navigate_to("ce"), }, @@ -138,7 +137,7 @@ class LongitudinalManagerView(CardHubManagerView): }, { "title": tr("Adaptive Speed Controls"), - "desc": tr("Configure Curve Speed Controller and Conditional Experimental Mode triggers."), + "desc": tr("Configure Curve Speed Controller and the unified longitudinal preference."), "icon": "display", "on_click": lambda: self._controller._navigate_to("adaptive_speed"), }, @@ -164,17 +163,15 @@ class ConditionalDriveModeView(AdjustorTogglesPanelView): def __init__(self, controller: StarPilotLongitudinalLayout): super().__init__() - self._header_title = tr("Conditional Drive Mode") + self._header_title = tr("Longitudinal Preference") self._controller = controller - self._init_segmented_control() - self._init_adjustors() self._init_toggles() def _init_segmented_control(self): self._drive_mode_control = self._child( AetherSegmentedControl( - [tr("OFF"), tr("Experimental"), tr("Chill")], + [tr("Set-Speed First"), tr("Model First")], self._get_drive_mode_index, self._on_drive_mode_change, style=PANEL_STYLE, @@ -183,67 +180,24 @@ class ConditionalDriveModeView(AdjustorTogglesPanelView): ) def _get_drive_mode_index(self): - if self._controller._params.get_bool("ConditionalExperimental"): - return 1 - elif self._controller._params.get_bool("ConditionalChill"): - return 2 - return 0 + return int(self._controller._params.get_int("LongitudinalModelPreference")) def _on_drive_mode_change(self, idx): - if idx == 0: - self._controller._params.put_bool("ConditionalExperimental", False) - self._controller._params.put_bool("ConditionalChill", False) - elif idx == 1: - self._controller._params.put_bool("ConditionalExperimental", True) - self._controller._params.put_bool("ConditionalChill", False) - elif idx == 2: - self._controller._params.put_bool("ConditionalExperimental", False) - self._controller._params.put_bool("ConditionalChill", True) - self._update_pagination() + self._controller._params.put_int("LongitudinalModelPreference", int(idx)) + self._controller._params_memory.put_int("LongitudinalModelPreferenceOverride", -1) def _init_toggles(self): - if PANEL_STYLE.toggle_row_mode: - self._toggle_grid = TileGrid(columns=1, padding=12, min_tile_height=TOGGLE_MIN_HEIGHT) - else: - self._toggle_grid = TileGrid(columns=2, padding=12, min_tile_height=130.0) + self._toggle_grid = TileGrid(columns=1, padding=12, min_tile_height=TOGGLE_MIN_HEIGHT) self._child(self._toggle_grid) self.register_page_grid(self._toggle_grid) - - cem_defs = [ - {"title": tr("Curves"), "subtitle": tr("Switch to Experimental Mode on open-road curves."), "get_state": lambda: self._controller._params.get_bool("CECurves"), "set_state": lambda v: self._controller._params.put_bool("CECurves", v)}, - {"title": tr("Curves w/ Lead"), "subtitle": tr("Switch on curves even when following a lead."), "get_state": lambda: self._controller._params.get_bool("CECurvesLead"), "set_state": lambda v: self._controller._params.put_bool("CECurvesLead", v), "is_enabled": lambda: self._controller._params.get_bool("CECurves"), "disabled_label": tr("Turn on Curves first")}, - {"title": tr("Stop Lights/Signs"), "subtitle": tr("Switch when openpilot detects a stop."), "get_state": lambda: self._controller._params.get_bool("CEStopLights"), "set_state": lambda v: self._controller._params.put_bool("CEStopLights", v)}, - {"title": tr("Lead Ahead"), "subtitle": tr("Switch when a slower/stopped vehicle is ahead."), "get_state": lambda: self._controller._params.get_bool("CELead"), "set_state": lambda v: self._controller._params.put_bool("CELead", v)}, - {"title": tr("Slower Lead"), "subtitle": tr("Switch specifically for slower leads."), "get_state": lambda: self._controller._params.get_bool("CESlowerLead"), "set_state": lambda v: self._controller._params.put_bool("CESlowerLead", v), "is_enabled": lambda: self._controller._params.get_bool("CELead"), "disabled_label": tr("Turn on Lead first")}, - {"title": tr("Stopped Lead"), "subtitle": tr("Switch specifically for stopped leads."), "get_state": lambda: self._controller._params.get_bool("CEStoppedLead"), "set_state": lambda v: self._controller._params.put_bool("CEStoppedLead", v), "is_enabled": lambda: self._controller._params.get_bool("CELead"), "disabled_label": tr("Turn on Lead first")}, - {"title": tr("Signal Lane Detect"), "subtitle": tr("Don't trigger on turn signal if lines are clear."), "get_state": lambda: self._controller._params.get_bool("CESignalLaneDetection"), "set_state": lambda v: self._controller._params.put_bool("CESignalLaneDetection", v), "is_enabled": lambda: self._controller._params.get_int("CESignalSpeed") > 0, "disabled_label": tr("Needs Turn Signal speed > 0")}, - {"title": tr("Status Widget"), "subtitle": tr("Show condition trigger on the drive screen."), "get_state": lambda: self._controller._params.get_bool("ShowCEMStatus"), "set_state": lambda v: self._controller._params.put_bool("ShowCEMStatus", v)}, - {"title": tr("Persist Exp State"), "subtitle": tr("Keep manual Experimental override through reboots."), "get_state": lambda: self._controller._params.get_bool("PersistExperimentalState"), "set_state": self._controller._set_persist_experimental_state}, - ] - - ccm_defs = [ - {"title": tr("Stable Lead Ahead"), "subtitle": tr("Switch to Chill Mode when following a steady lead."), "get_state": lambda: self._controller._params.get_bool("CCMLead"), "set_state": lambda v: self._controller._params.put_bool("CCMLead", v)}, - {"title": tr("Launch Assist"), "subtitle": tr("Temporarily switch to Chill from a stop."), "get_state": lambda: self._controller._params.get_bool("CCMLaunchAssist"), "set_state": lambda v: self._controller._params.put_bool("CCMLaunchAssist", v)}, - {"title": tr("Status Widget"), "subtitle": tr("Show condition trigger on the drive screen."), "get_state": lambda: self._controller._params.get_bool("ShowCCMStatus"), "set_state": lambda v: self._controller._params.put_bool("ShowCCMStatus", v)}, - {"title": tr("Persist Chill State"), "subtitle": tr("Keep manual Chill override through reboots."), "get_state": lambda: self._controller._params.get_bool("PersistChillState"), "set_state": self._controller._set_persist_chill_state}, - ] - - self._cem_toggle_defs = cem_defs - self._ccm_toggle_defs = ccm_defs - - self._update_pagination() - - def _update_pagination(self): - mode = self._get_drive_mode_index() - page_size = self._compute_page_size(TOGGLE_ROW_HEIGHT) - if mode == 1: - pages = [self._cem_toggle_defs[i:i+page_size] for i in range(0, len(self._cem_toggle_defs), page_size)] - self._set_toggle_pages(pages) - elif mode == 2: - pages = [self._ccm_toggle_defs[i:i+page_size] for i in range(0, len(self._ccm_toggle_defs), page_size)] - self._set_toggle_pages(pages) - else: - self._set_toggle_pages([]) + self._set_toggle_pages([[ + { + "title": tr("Status Widget"), + "subtitle": tr("Show the active longitudinal constraint on the drive screen."), + "get_state": lambda: self._controller._params.get_bool("ShowCEMStatus"), + "set_state": lambda value: self._controller._params.put_bool("ShowCEMStatus", value), + }, + ]]) def _make_toggle_tile(self, info: dict) -> ToggleTile: cls = RowToggleTile if PANEL_STYLE.toggle_row_mode else ToggleTile @@ -261,189 +215,28 @@ class ConditionalDriveModeView(AdjustorTogglesPanelView): return cls(**kwargs) - def _init_adjustors(self): - speed_unit = self._controller._speed_unit() - is_metric = self._controller._is_metric() - max_speed = 150.0 if is_metric else 100.0 - - specs = { - "CESpeed": {"title": tr("Below Speed"), "subtitle": tr("Switch to Experimental Mode below this speed."), "min": 0, "max": max_speed, "step": 1.0, "unit": speed_unit, "presets": [0, 20, 35, 55, 75], "labels": {}, "get": lambda: float(self._controller._params.get_int("CESpeed"))}, - "CESpeedLead": {"title": tr("Speed w/ Lead"), "subtitle": tr("Switch below this speed when following a lead."), "min": 0, "max": max_speed, "step": 1.0, "unit": speed_unit, "presets": [0, 20, 35, 55, 75], "labels": {}, "get": lambda: float(self._controller._params.get_int("CESpeedLead"))}, - "CESignalSpeed": {"title": tr("Turn Signal Below"), "subtitle": tr("Switch when turn signal is on below this speed."), "min": 0, "max": max_speed, "step": 1.0, "unit": speed_unit, "presets": [0, 20, 35, 55, 75], "labels": {0.0: tr("Off")}, "get": lambda: float(self._controller._params.get_int("CESignalSpeed"))}, - "CEModelStopTime": {"title": tr("Predicted Stop In"), "subtitle": tr("Switch when openpilot predicts a stop within time."), "min": 0, "max": 10.0, "step": 1.0, "unit": "s", "presets": [0, 3, 5, 7, 10], "labels": {0.0: tr("Off")}, "get": lambda: float(self._controller._params.get_int("CEModelStopTime"))}, - "CCMSpeed": {"title": tr("Above Speed"), "subtitle": tr("Switch to Chill Mode on open roads above this speed."), "min": 0, "max": max_speed, "step": 1.0, "unit": speed_unit, "presets": [0, 35, 55, 65, 80], "labels": {}, "get": lambda: float(self._controller._params.get_int("CCMSpeed"))}, - "CCMSpeedLead": {"title": tr("Speed w/ Lead"), "subtitle": tr("Switch when following a stable lead above this speed."), "min": 0, "max": max_speed, "step": 1.0, "unit": speed_unit, "presets": [0, 35, 55, 65, 80], "labels": {}, "get": lambda: float(self._controller._params.get_int("CCMSpeedLead"))}, - "CCMSetSpeedMargin": {"title": tr("Set Speed Margin"), "subtitle": tr("How far below set speed before Chill engages."), "min": 0, "max": 30.0 if is_metric else 15.0, "step": 1.0, "unit": speed_unit, "presets": [0, 5, 10, 15], "labels": {}, "get": lambda: float(self._controller._params.get_int("CCMSetSpeedMargin"))}, - } - - self._cem_keys = ["CESpeed", "CESpeedLead", "CESignalSpeed", "CEModelStopTime"] - self._ccm_keys = ["CCMSpeed", "CCMSpeedLead", "CCMSetSpeedMargin"] - - for key, spec in specs.items(): - adjustor = self._child(AetherAdjustorRow( - spec["title"], spec["subtitle"], spec["min"], spec["max"], spec["step"], - get_value=spec["get"], - on_change=lambda _v: None, - on_commit=None, - unit=spec["unit"], - labels=spec["labels"], - presets=spec["presets"], - is_active=lambda: False, - set_active=lambda active, k=key: self._show_slider(k) if active else None, - style=PANEL_STYLE, color=PANEL_STYLE.accent - )) - adjustor.set_touch_valid_callback(lambda: self._scroll_panel.is_touch_valid()) - self._adjustor_rows[key] = adjustor - - def _show_slider(self, key: str): - is_metric = self._controller._is_metric() - speed_unit = self._controller._speed_unit() - max_speed = 150.0 if is_metric else 100.0 - - specs = { - "CESpeed": {"title": tr("Below Speed"), "min": 0, "max": max_speed, "unit": speed_unit, "labels": {}, "presets": [0, 20, 35, 55, 75]}, - "CESpeedLead": {"title": tr("Speed w/ Lead"), "min": 0, "max": max_speed, "unit": speed_unit, "labels": {}, "presets": [0, 20, 35, 55, 75]}, - "CESignalSpeed": {"title": tr("Turn Signal Below"), "min": 0, "max": max_speed, "unit": speed_unit, "labels": {0.0: tr("Off")}, "presets": [0, 20, 35, 55, 75]}, - "CEModelStopTime": {"title": tr("Predicted Stop In"), "min": 0, "max": 10.0, "unit": "s", "labels": {0.0: tr("Off")}, "presets": [0, 3, 5, 7, 10]}, - "CCMSpeed": {"title": tr("Above Speed"), "min": 0, "max": max_speed, "unit": speed_unit, "labels": {}, "presets": [0, 35, 55, 65, 80]}, - "CCMSpeedLead": {"title": tr("Speed w/ Lead"), "min": 0, "max": max_speed, "unit": speed_unit, "labels": {}, "presets": [0, 35, 55, 65, 80]}, - "CCMSetSpeedMargin": {"title": tr("Set Speed Margin"), "min": 0, "max": 30.0 if is_metric else 15.0, "unit": speed_unit, "labels": {}, "presets": [0, 5, 10, 15]}, - } - - spec = specs[key] - original_val = float(self._controller._params.get_int(key)) - - def on_close(res, val): - if res == DialogResult.CONFIRM: - self._controller._params.put_int(key, int(val)) - - gui_app.push_widget(AetherSliderDialog( - title=spec["title"], - min_val=float(spec["min"]), max_val=float(spec["max"]), step=1.0, - current_val=original_val, - on_close=on_close, presets=[float(p) for p in spec["presets"]], - unit=spec["unit"], labels=spec["labels"], color=PANEL_STYLE.accent - )) - def _draw_header(self, rect: rl.Rectangle): pass def _measure_content_height(self, content_width: float) -> float: - mode = self._get_drive_mode_index() - if mode == 0: - return self.TAB_HEIGHT + self.TAB_BOTTOM_GAP - - keys = self._cem_keys if mode == 1 else self._ccm_keys - grid = self._toggle_grid - - col_width = (content_width - SECTION_GAP) / 2 if self._uses_two_columns(content_width) else content_width - - for key in keys: - self._adjustor_rows[key].custom_row_height = None - - default_adjustor_h = float(AETHER_LIST_METRICS.adjustor_row_height) - left_h = len(keys) * default_adjustor_h + 16.0 - - num_tiles = 4 if self._has_pagination else len(grid.tiles) - if PANEL_STYLE.toggle_row_mode: - rows = num_tiles - tile_h = TOGGLE_ROW_HEIGHT - else: - rows = (num_tiles + 1) // 2 if self._uses_two_columns(content_width) else num_tiles - tile_h = grid.min_tile_height - - pagination_space = 32.0 if self._has_pagination else 0.0 - tiles_h = rows * tile_h + (rows - 1) * grid.gap + grid.gap * 2 + pagination_space - - right_h = tiles_h - - if self._uses_two_columns(content_width): - max_natural_h = max(left_h, right_h) - section_overhead = SECTION_HEADER_HEIGHT + SECTION_HEADER_GAP - - if self._scroll_rect: - available_h = self._scroll_rect.height - section_overhead - self.TAB_HEIGHT - self.TAB_BOTTOM_GAP - 6.0 - else: - available_h = max_natural_h - - max_container_h = available_h - - left_row_h = max(95.0, (max_container_h - 16.0) / max(1, len(keys))) - for key in keys: - self._adjustor_rows[key].custom_row_height = left_row_h - - self._left_container_h = max_container_h - self._tiles_container_h = max_container_h - - return self._compute_two_column_height(section_overhead + max_container_h) + self.TAB_HEIGHT + self.TAB_BOTTOM_GAP - else: - self._left_container_h = left_h - self._tiles_container_h = right_h - total = left_h + SECTION_GAP + right_h + SECTION_HEADER_HEIGHT * 2 + SECTION_HEADER_GAP * 2 - return total + self.TAB_HEIGHT + self.TAB_BOTTOM_GAP + self._tiles_container_h = TOGGLE_ROW_HEIGHT + 24.0 + return self.TAB_HEIGHT + self.TAB_BOTTOM_GAP + SECTION_HEADER_HEIGHT + SECTION_HEADER_GAP + self._tiles_container_h def _draw_scroll_content(self, rect: rl.Rectangle, content_width: float): y = rect.y + self._scroll_offset - - header_w = content_width - bar_rect = rl.Rectangle(rect.x, y, header_w, self.TAB_HEIGHT) + bar_rect = rl.Rectangle(rect.x, y, content_width, self.TAB_HEIGHT) draw_list_group_shell(bar_rect, style=PANEL_STYLE) self._drive_mode_control.render(bar_rect) - y += self.TAB_HEIGHT + self.TAB_BOTTOM_GAP - mode = self._get_drive_mode_index() - if mode == 0: - return - - keys = self._cem_keys if mode == 1 else self._ccm_keys - grid = self._toggle_grid - - col_width = (content_width - SECTION_GAP) / 2 if self._uses_two_columns(content_width) else content_width - - draw_section_header(rl.Rectangle(rect.x, y, col_width, SECTION_HEADER_HEIGHT), tr("Values"), style=PANEL_STYLE) - if self._uses_two_columns(content_width): - draw_section_header(rl.Rectangle(rect.x + col_width + SECTION_GAP, y, col_width, SECTION_HEADER_HEIGHT), tr("Triggers"), style=PANEL_STYLE) - + draw_section_header(rl.Rectangle(rect.x, y, content_width, SECTION_HEADER_HEIGHT), tr("Diagnostics"), style=PANEL_STYLE) y += SECTION_HEADER_HEIGHT + SECTION_HEADER_GAP - - self._draw_adjustors(y, rect.x, col_width, keys) - - tg_columns = 1 if PANEL_STYLE.toggle_row_mode else 2 - if self._uses_two_columns(content_width): - self._draw_two_column_tile_grid( - grid, rect.x + col_width + SECTION_GAP, y, col_width, - self._tiles_container_h, title=None, style=PANEL_STYLE, - columns=tg_columns) - else: - y += self._left_container_h + SECTION_GAP - draw_section_header(rl.Rectangle(rect.x, y, col_width, SECTION_HEADER_HEIGHT), tr("Triggers"), style=PANEL_STYLE) - y += SECTION_HEADER_HEIGHT + SECTION_HEADER_GAP - self._draw_two_column_tile_grid( - grid, rect.x, y, col_width, - self._tiles_container_h, title=None, style=PANEL_STYLE, - columns=tg_columns) - - def _draw_adjustors(self, y: float, x: float, width: float, keys: list[str]): - draw_list_group_shell(rl.Rectangle(x, y, width, self._left_container_h), style=PANEL_STYLE) - current_y = y + 4 - for index, key in enumerate(keys): - adjustor = self._adjustor_rows[key] - row_h = adjustor.measure_height(width) - row_rect = rl.Rectangle(x, current_y, width, row_h) - adjustor.set_is_last(index == len(keys) - 1) - adjustor.set_parent_rect(self._scroll_rect) - adjustor.render(row_rect) - current_y += row_h + self._draw_two_column_tile_grid( + self._toggle_grid, rect.x, y, content_width, self._tiles_container_h, + title=None, style=PANEL_STYLE, columns=1, + ) def _get_active_elements(self): - mode = self._get_drive_mode_index() - elems = [self._drive_mode_control] - if mode == 1: - elems += [self._adjustor_rows[k] for k in self._cem_keys] - elif mode == 2: - elems += [self._adjustor_rows[k] for k in self._ccm_keys] - elems.append(self._toggle_grid) - return elems + return [self._drive_mode_control, self._toggle_grid] # ═══════════════════════════════════════════════════════════════ @@ -479,9 +272,6 @@ class StarPilotLongitudinalLayout(_SettingsPage): def _build_view(self): ol = lambda: starpilot_state.car_state.hasOpenpilotLongitudinal - ce_on = lambda: self._params.get_bool("ConditionalExperimental") - cc_on = lambda: self._params.get_bool("ConditionalChill") - ce_lead = lambda: ce_on() and self._params.get_bool("CELead") csc_on = lambda: self._params.get_bool("CurveSpeedController") confirmation_on = lambda: self._params.get_bool("SLCConfirmation") @@ -659,7 +449,7 @@ class StarPilotLongitudinalLayout(_SettingsPage): on_click=lambda k=key: self._show_slider(k, *self._speed_range(), unit=self._speed_unit()), )) - # ── 4. Adaptive Speed Controls Rows (CES + CSC + CCM) ── + # ── 4. Adaptive Speed Controls Rows ── self._curve_speed_controller_rows = [ SettingRow("CalibratedLatAccel", "value", tr_noop("Calibrated Lateral Accel"), subtitle=tr_noop("The learned lateral acceleration from collected driving data. Higher values allow faster cornering."), @@ -945,37 +735,19 @@ class StarPilotLongitudinalLayout(_SettingsPage): if state: self._params.put_bool("EVTuning", False) - def _set_persist_experimental_state(self, state: bool): - sync_persist_experimental_state(self._params, self._params_memory, state) - - def _set_persist_chill_state(self, state: bool): - sync_persist_chill_state(self._params, self._params_memory, state) - def _get_conditional_mode_label(self) -> str: - if self._params.get_bool("ConditionalExperimental"): - return tr("Conditional Experimental") - elif self._params.get_bool("ConditionalChill"): - return tr("Conditional Chill") - else: - return tr("OFF") + return tr("Model First") if self._params.get_int("LongitudinalModelPreference") else tr("Set-Speed First") def _show_conditional_mode_selector(self): - options = ["OFF", "Conditional Experimental", "Conditional Chill"] + options = ["Set-Speed First", "Model First"] current = self._get_conditional_mode_label() def on_select(res): if res == DialogResult.CONFIRM and dialog.selection: - if dialog.selection == "OFF": - self._params.put_bool("ConditionalExperimental", False) - self._params.put_bool("ConditionalChill", False) - elif dialog.selection == "Conditional Experimental": - self._params.put_bool("ConditionalExperimental", True) - self._params.put_bool("ConditionalChill", False) - elif dialog.selection == "Conditional Chill": - self._params.put_bool("ConditionalExperimental", False) - self._params.put_bool("ConditionalChill", True) + self._params.put_int("LongitudinalModelPreference", int(dialog.selection == "Model First")) + self._params_memory.put_int("LongitudinalModelPreferenceOverride", -1) - dialog = MultiOptionDialog(tr("Conditional Drive Mode"), options, current, callback=on_select) + dialog = MultiOptionDialog(tr("Longitudinal Preference"), options, current, callback=on_select) gui_app.push_widget(dialog) def _reset_curve_data(self): @@ -1003,8 +775,6 @@ class StarPilotLongitudinalLayout(_SettingsPage): _SPEED_RESCALE_KEYS = ( "Offset1", "Offset2", "Offset3", "Offset4", "Offset5", "Offset6", "Offset7", "CustomCruise", "CustomCruiseLong", "SetSpeedOffset", - "CESpeed", "CESpeedLead", "CESignalSpeed", - "CCMSpeed", "CCMSpeedLead", "CCMSetSpeedMargin", ) # Distance-typed int params stored in the current unit (ft or m); rescaled diff --git a/selfdrive/ui/lib/mode_banner.py b/selfdrive/ui/lib/mode_banner.py index 8bee4cbc5..b822de805 100644 --- a/selfdrive/ui/lib/mode_banner.py +++ b/selfdrive/ui/lib/mode_banner.py @@ -8,17 +8,11 @@ from openpilot.starpilot.common.experimental_state import requested_experimental class ModeBannerVariant(StrEnum): CHILL = "chill" EXPERIMENTAL = "experimental" - CONDITIONAL_EXPERIMENTAL = "conditional_experimental" - CONDITIONAL_CHILL = "conditional_chill" def get_mode_banner_variant(params, params_memory=None) -> ModeBannerVariant: if params.get_bool("SafeMode"): return ModeBannerVariant.CHILL - if params.get_bool("ConditionalExperimental"): - return ModeBannerVariant.CONDITIONAL_EXPERIMENTAL - if params.get_bool("ConditionalChill"): - return ModeBannerVariant.CONDITIONAL_CHILL if requested_experimental_mode(params, params_memory): return ModeBannerVariant.EXPERIMENTAL return ModeBannerVariant.CHILL @@ -38,29 +32,11 @@ def _lerp_color(start: rl.Color, end: rl.Color, progress: float, alpha: int) -> ) -def _conditional_colors(variant: ModeBannerVariant, alpha: int) -> tuple[rl.Color, rl.Color, rl.Color, rl.Color]: - blue = _color(35, 149, 255, alpha) - mint = _color(20, 255, 171, alpha) - orange = _color(255, 138, 22, alpha) - red = _color(219, 56, 34, alpha) - if variant == ModeBannerVariant.CONDITIONAL_EXPERIMENTAL: - return blue, mint, orange, red - return orange, red, blue, mint - - def mode_banner_color(variant: ModeBannerVariant, progress: float, alpha: int = 255) -> rl.Color: progress = max(0.0, min(1.0, progress)) if variant == ModeBannerVariant.CHILL: return _lerp_color(_color(20, 255, 171, alpha), _color(35, 149, 255, alpha), progress, alpha) - if variant == ModeBannerVariant.EXPERIMENTAL: - return _lerp_color(_color(255, 155, 63, alpha), _color(219, 56, 34, alpha), progress, alpha) - - dominant_start, dominant_end, target_start, target_end = _conditional_colors(variant, alpha) - if progress <= 0.58: - return _lerp_color(dominant_start, dominant_end, progress / 0.58, alpha) - if progress <= 0.80: - return _lerp_color(dominant_end, target_start, (progress - 0.58) / 0.22, alpha) - return _lerp_color(target_start, target_end, ((progress - 0.80) / 0.20) * 0.67, alpha) + return _lerp_color(_color(255, 155, 63, alpha), _color(219, 56, 34, alpha), progress, alpha) def mode_atom_color(variant: ModeBannerVariant, progress: float, alpha: int = 255) -> rl.Color: @@ -71,25 +47,7 @@ def mode_atom_color(variant: ModeBannerVariant, progress: float, alpha: int = 25 def draw_mode_banner_gradient(rect: rl.Rectangle, variant: ModeBannerVariant, alpha: int = 255) -> None: - if variant in (ModeBannerVariant.CHILL, ModeBannerVariant.EXPERIMENTAL): - rl.draw_rectangle_gradient_h( - int(rect.x), int(rect.y), int(rect.width), int(rect.height), - mode_banner_color(variant, 0.0, alpha), mode_banner_color(variant, 1.0, alpha), - ) - return - - transition_start = int(rect.x + rect.width * 0.58) - transition_end = int(rect.x + rect.width * 0.80) - right = int(rect.x + rect.width) rl.draw_rectangle_gradient_h( - int(rect.x), int(rect.y), transition_start - int(rect.x), int(rect.height), - mode_banner_color(variant, 0.0, alpha), mode_banner_color(variant, 0.58, alpha), - ) - rl.draw_rectangle_gradient_h( - transition_start, int(rect.y), transition_end - transition_start, int(rect.height), - mode_banner_color(variant, 0.58, alpha), mode_banner_color(variant, 0.80, alpha), - ) - rl.draw_rectangle_gradient_h( - transition_end, int(rect.y), right - transition_end, int(rect.height), - mode_banner_color(variant, 0.80, alpha), mode_banner_color(variant, 1.0, alpha), + int(rect.x), int(rect.y), int(rect.width), int(rect.height), + mode_banner_color(variant, 0.0, alpha), mode_banner_color(variant, 1.0, alpha), ) diff --git a/selfdrive/ui/lib/starpilot_status.py b/selfdrive/ui/lib/starpilot_status.py index 98ac23486..37e9b813a 100644 --- a/selfdrive/ui/lib/starpilot_status.py +++ b/selfdrive/ui/lib/starpilot_status.py @@ -64,33 +64,21 @@ def get_screen_edge_color(state: UIState): def get_experimental_mode_banner_text(state: UIState): - conditional_enabled = state.params.get_bool("ConditionalExperimental") - - # With CEM enabled, only surface banner text for explicit manual override states. - # Automatic CEM transitions should only be reflected by path/border coloring. - if conditional_enabled: - if state.conditional_status in CEM_MANUAL_OVERRIDE_STATUSES: - return "OVERRIDDEN" - return None - if state.sm["selfdriveState"].experimentalMode: - return "EXPERIMENTAL" - return "CHILL" + return "MODEL FIRST" + return "SET-SPEED FIRST" def get_mode_transition_banner_text(state: UIState): enabled = state.sm["selfdriveState"].enabled lateral_active = enabled or state.always_on_lateral_active - conditional_enabled = state.params.get_bool("ConditionalExperimental") if state.status == UIStatus.OVERRIDE: return "OVERRIDE" if state.switchback_mode_enabled and lateral_active: return "SWITCHBACK" - if conditional_enabled and enabled and state.conditional_status in CEM_MANUAL_OVERRIDE_STATUSES: - return "OVERRIDDEN" if enabled and state.sm["selfdriveState"].experimentalMode: - return "EXPERIMENTAL" + return "MODEL FIRST" if enabled: - return "CHILL" + return "SET-SPEED FIRST" return None diff --git a/selfdrive/ui/onroad/exp_button.py b/selfdrive/ui/onroad/exp_button.py index d2476c2b3..08581f552 100644 --- a/selfdrive/ui/onroad/exp_button.py +++ b/selfdrive/ui/onroad/exp_button.py @@ -6,9 +6,8 @@ from openpilot.system.ui.lib.application import gui_app from openpilot.system.ui.widgets import Widget from openpilot.common.filter_simple import FirstOrderFilter from openpilot.starpilot.common.experimental_state import ( - CEStatus, - next_manual_ce_status, - sync_manual_ce_state, + requested_experimental_mode, + toggle_longitudinal_model_preference, ) @@ -35,7 +34,6 @@ class ExpButton(Widget): "disengaged": rl.Color(0, 0, 0, 166), "switchback": rl.Color(0x8b, 0x6c, 0xc5, 255), "aol": rl.Color(0x0a, 0xba, 0xb5, 255), - "cem_disabled": rl.Color(0xff, 0xff, 0x00, 255), "experimental": rl.Color(0xda, 0x6f, 0x25, 255), "traffic": rl.Color(0xc9, 0x22, 0x31, 255), } @@ -50,7 +48,7 @@ class ExpButton(Widget): def _update_state(self) -> None: selfdrive_state = ui_state.sm["selfdriveState"] - self._experimental_mode = selfdrive_state.experimentalMode + self._experimental_mode = requested_experimental_mode(self._params, ui_state.params_memory) self._engageable = selfdrive_state.engageable or selfdrive_state.enabled or ui_state.always_on_lateral_active # Smooth steering angle for rotating wheel @@ -65,8 +63,6 @@ class ExpButton(Widget): self._bg_color = self._bg_colors["switchback"] elif ui_state.always_on_lateral_active: self._bg_color = self._bg_colors["aol"] - elif ui_state.conditional_status == 1: - self._bg_color = self._bg_colors["cem_disabled"] elif self._held_or_actual_mode(): self._bg_color = self._bg_colors["experimental"] elif ui_state.traffic_mode_enabled: @@ -77,20 +73,9 @@ class ExpButton(Widget): def _handle_mouse_release(self, _): super()._handle_mouse_release(_) if self._is_toggle_allowed(): - if self._params.get_bool("ConditionalExperimental"): - current_status = ui_state.params_memory.get_int("CEStatus", default=CEStatus["OFF"]) - override_value = next_manual_ce_status(current_status, self._experimental_mode) - ui_state.params_memory.put_int("CEStatus", override_value) - sync_manual_ce_state(self._params, override_value) - self._held_mode = None - self._hold_end_time = None - else: - new_mode = not self._experimental_mode - self._params.put_bool("ExperimentalMode", new_mode) - - # Hold new state temporarily - self._held_mode = new_mode - self._hold_end_time = time.monotonic() + self._hold_duration + new_mode = toggle_longitudinal_model_preference(self._params, ui_state.params_memory) + self._held_mode = new_mode + self._hold_end_time = time.monotonic() + self._hold_duration def _render(self, rect: rl.Rectangle) -> None: center_x = int(self._rect.x + self._rect.width // 2) diff --git a/selfdrive/ui/tests/test_mode_banner.py b/selfdrive/ui/tests/test_mode_banner.py index c2046eaa8..c932c5581 100644 --- a/selfdrive/ui/tests/test_mode_banner.py +++ b/selfdrive/ui/tests/test_mode_banner.py @@ -17,26 +17,10 @@ def _rgb(color): return color.r, color.g, color.b -def test_mode_banner_variant_tracks_fixed_and_conditional_modes(): +def test_mode_banner_variant_tracks_longitudinal_preference(): assert get_mode_banner_variant(FakeParams()) == ModeBannerVariant.CHILL - assert get_mode_banner_variant(FakeParams({"ExperimentalMode": True})) == ModeBannerVariant.EXPERIMENTAL - assert get_mode_banner_variant(FakeParams({"ConditionalExperimental": True})) == ModeBannerVariant.CONDITIONAL_EXPERIMENTAL - assert get_mode_banner_variant(FakeParams({"ConditionalChill": True})) == ModeBannerVariant.CONDITIONAL_CHILL - assert get_mode_banner_variant(FakeParams({"SafeMode": True, "ConditionalExperimental": True})) == ModeBannerVariant.CHILL - - -def test_conditional_gradients_keep_full_major_and_partial_minor_colors(): - conditional_experimental = ModeBannerVariant.CONDITIONAL_EXPERIMENTAL - assert _rgb(mode_banner_color(conditional_experimental, 0.0)) == (35, 149, 255) - assert _rgb(mode_banner_color(conditional_experimental, 0.58)) == (20, 255, 171) - assert _rgb(mode_banner_color(conditional_experimental, 0.80)) == (255, 138, 22) - assert _rgb(mode_banner_color(conditional_experimental, 1.0)) == (231, 83, 30) - - conditional_chill = ModeBannerVariant.CONDITIONAL_CHILL - assert _rgb(mode_banner_color(conditional_chill, 0.0)) == (255, 138, 22) - assert _rgb(mode_banner_color(conditional_chill, 0.58)) == (219, 56, 34) - assert _rgb(mode_banner_color(conditional_chill, 0.80)) == (35, 149, 255) - assert _rgb(mode_banner_color(conditional_chill, 1.0)) == (25, 220, 199) + assert get_mode_banner_variant(FakeParams(ints={"LongitudinalModelPreference": 1})) == ModeBannerVariant.EXPERIMENTAL + assert get_mode_banner_variant(FakeParams({"SafeMode": True}, {"LongitudinalModelPreference": 1})) == ModeBannerVariant.CHILL def test_atom_gradients_use_compact_icon_directions(): @@ -44,7 +28,3 @@ def test_atom_gradients_use_compact_icon_directions(): assert _rgb(mode_atom_color(ModeBannerVariant.CHILL, 1.0)) == (20, 255, 171) assert _rgb(mode_atom_color(ModeBannerVariant.EXPERIMENTAL, 0.0)) == (255, 155, 63) assert _rgb(mode_atom_color(ModeBannerVariant.EXPERIMENTAL, 1.0)) == (219, 56, 34) - - for variant in (ModeBannerVariant.CONDITIONAL_EXPERIMENTAL, ModeBannerVariant.CONDITIONAL_CHILL): - assert _rgb(mode_atom_color(variant, 0.0)) == _rgb(mode_banner_color(variant, 0.0)) - assert _rgb(mode_atom_color(variant, 1.0)) == _rgb(mode_banner_color(variant, 1.0)) diff --git a/selfdrive/ui/widgets/exp_mode_button.py b/selfdrive/ui/widgets/exp_mode_button.py index b1fd40f14..6715740dc 100644 --- a/selfdrive/ui/widgets/exp_mode_button.py +++ b/selfdrive/ui/widgets/exp_mode_button.py @@ -40,12 +40,7 @@ class ExperimentalModeButton(Widget): rl.draw_line_ex(rl.Vector2(line_x, rect.y), rl.Vector2(line_x, rect.y + rect.height), 3, separator_color) # Draw text label (left aligned) - if self.mode_variant == ModeBannerVariant.CONDITIONAL_EXPERIMENTAL: - text = tr("CONDITIONAL EXPERIMENTAL") - elif self.mode_variant == ModeBannerVariant.CONDITIONAL_CHILL: - text = tr("CONDITIONAL CHILL") - else: - text = tr("EXPERIMENTAL MODE ON") if self.experimental_mode else tr("CHILL MODE ON") + text = tr("MODEL FIRST") if self.experimental_mode else tr("SET-SPEED FIRST") text_x = rect.x + self.horizontal_padding font = gui_app.font(FontWeight.NORMAL) diff --git a/starpilot/common/experimental_state.py b/starpilot/common/experimental_state.py index df7b356ac..4d1e708a6 100644 --- a/starpilot/common/experimental_state.py +++ b/starpilot/common/experimental_state.py @@ -1,15 +1,13 @@ #!/usr/bin/env python3 -from __future__ import annotations - from openpilot.common.params import Params -PERSIST_EXPERIMENTAL_STATE_PARAM = "PersistExperimentalState" -PERSISTED_CE_STATUS_PARAM = "PersistedCEStatus" -CE_STATUS_PARAM = "CEStatus" -PERSIST_CHILL_STATE_PARAM = "PersistChillState" -PERSISTED_CC_STATUS_PARAM = "PersistedCCStatus" -CC_STATUS_PARAM = "CCStatus" +CE_STATUS_PARAM = "CEStatus" +CC_STATUS_PARAM = "CCStatus" +LONGITUDINAL_PREFERENCE_PARAM = "LongitudinalModelPreference" +LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM = "LongitudinalModelPreferenceOverride" + +# Status values stay schema-compatible with the existing onroad widgets. CEStatus = { "OFF": 0, "USER_DISABLED": 1, @@ -22,6 +20,7 @@ CEStatus = { "STOP_LIGHT": 8, } +# Kept only so older/mici status renderers can safely read a stale CCStatus. CCStatus = { "OFF": 0, "USER_EXPERIMENTAL": 1, @@ -30,161 +29,17 @@ CCStatus = { "SPEED": 6, } -MANUAL_CE_STATUSES = { - CEStatus["USER_DISABLED"], - CEStatus["USER_OVERRIDDEN"], -} - -MANUAL_CC_STATUSES = { - CCStatus["USER_EXPERIMENTAL"], - CCStatus["USER_CHILL"], -} - - -def is_manual_ce_status(status: int) -> bool: - return int(status) in MANUAL_CE_STATUSES - - -def is_manual_cc_status(status: int) -> bool: - return int(status) in MANUAL_CC_STATUSES - - -def normalize_persisted_ce_status(status: int) -> int: - status = int(status) - return status if status in MANUAL_CE_STATUSES else CEStatus["OFF"] - - -def normalize_persisted_cc_status(status: int) -> int: - status = int(status) - return status if status in MANUAL_CC_STATUSES else CCStatus["OFF"] - - -def get_persisted_ce_status(params: Params) -> int: - return normalize_persisted_ce_status(params.get_int(PERSISTED_CE_STATUS_PARAM, default=CEStatus["OFF"])) - - -def get_persisted_cc_status(params: Params) -> int: - return normalize_persisted_cc_status(params.get_int(PERSISTED_CC_STATUS_PARAM, default=CCStatus["OFF"])) - - -def set_persisted_ce_status(params: Params, status: int) -> int: - normalized = normalize_persisted_ce_status(status) - params.put_int(PERSISTED_CE_STATUS_PARAM, normalized) - return normalized - - -def set_persisted_cc_status(params: Params, status: int) -> int: - normalized = normalize_persisted_cc_status(status) - params.put_int(PERSISTED_CC_STATUS_PARAM, normalized) - return normalized - - -def clear_persisted_ce_status(params: Params) -> None: - params.put_int(PERSISTED_CE_STATUS_PARAM, CEStatus["OFF"]) - - -def clear_persisted_cc_status(params: Params) -> None: - params.put_int(PERSISTED_CC_STATUS_PARAM, CCStatus["OFF"]) - - -def sync_persist_experimental_state(params: Params, params_memory: Params | None, enabled: bool) -> None: - params.put_bool(PERSIST_EXPERIMENTAL_STATE_PARAM, enabled) - if enabled: - current_status = params_memory.get_int(CE_STATUS_PARAM, default=CEStatus["OFF"]) if params_memory is not None else CEStatus["OFF"] - set_persisted_ce_status(params, current_status) - else: - clear_persisted_ce_status(params) - - -def sync_persist_chill_state(params: Params, params_memory: Params | None, enabled: bool) -> None: - params.put_bool(PERSIST_CHILL_STATE_PARAM, enabled) - if enabled: - current_status = params_memory.get_int(CC_STATUS_PARAM, default=CCStatus["OFF"]) if params_memory is not None else CCStatus["OFF"] - set_persisted_cc_status(params, current_status) - else: - clear_persisted_cc_status(params) - - -def sync_manual_ce_state(params: Params, status: int) -> int: - return set_persisted_ce_status(params, status) if params.get_bool(PERSIST_EXPERIMENTAL_STATE_PARAM) else clear_and_return_off(params) - - -def sync_manual_cc_state(params: Params, status: int) -> int: - return set_persisted_cc_status(params, status) if params.get_bool(PERSIST_CHILL_STATE_PARAM) else clear_cc_and_return_off(params) - - -def clear_and_return_off(params: Params) -> int: - clear_persisted_ce_status(params) - return CEStatus["OFF"] - - -def clear_cc_and_return_off(params: Params) -> int: - clear_persisted_cc_status(params) - return CCStatus["OFF"] - - -def next_manual_ce_status(current_status: int, experimental_mode: bool) -> int: - if is_manual_ce_status(current_status): - return CEStatus["OFF"] - return CEStatus["USER_DISABLED"] if experimental_mode else CEStatus["USER_OVERRIDDEN"] - - -def next_manual_cc_status(current_status: int, experimental_mode: bool) -> int: - if is_manual_cc_status(current_status): - return CCStatus["OFF"] - return CCStatus["USER_CHILL"] if experimental_mode else CCStatus["USER_EXPERIMENTAL"] - def requested_experimental_mode(params: Params, params_memory: Params | None = None) -> bool: if params.get_bool("SafeMode"): return False - if params.get_bool("ConditionalExperimental"): - status = params_memory.get_int(CE_STATUS_PARAM, default=CEStatus["OFF"]) if params_memory is not None else CEStatus["OFF"] - if not is_manual_ce_status(status): - status = get_persisted_ce_status(params) - return status == CEStatus["USER_OVERRIDDEN"] - - if params.get_bool("ConditionalChill"): - status = params_memory.get_int(CC_STATUS_PARAM, default=CCStatus["OFF"]) if params_memory is not None else CCStatus["OFF"] - if not is_manual_cc_status(status): - status = get_persisted_cc_status(params) - if not is_manual_cc_status(status): - return True - return status == CCStatus["USER_EXPERIMENTAL"] - - return params.get_bool("ExperimentalMode") + persistent = params.get_int(LONGITUDINAL_PREFERENCE_PARAM, default=0) + override = params_memory.get_int(LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM, default=-1) if params_memory is not None else -1 + return bool(override if override in (0, 1) else persistent) -def restore_persisted_ce_state(params: Params, params_memory: Params) -> int: - current_status = params_memory.get_int(CE_STATUS_PARAM, default=CEStatus["OFF"]) - if is_manual_ce_status(current_status): - sync_manual_ce_state(params, current_status) - return current_status - - if not params.get_bool(PERSIST_EXPERIMENTAL_STATE_PARAM): - return current_status - - restored_status = get_persisted_ce_status(params) - if restored_status != CEStatus["OFF"]: - params_memory.put_int(CE_STATUS_PARAM, restored_status) - return restored_status - - return current_status - - -def restore_persisted_cc_state(params: Params, params_memory: Params) -> int: - current_status = params_memory.get_int(CC_STATUS_PARAM, default=CCStatus["OFF"]) - if is_manual_cc_status(current_status): - sync_manual_cc_state(params, current_status) - return current_status - - if not params.get_bool(PERSIST_CHILL_STATE_PARAM): - return current_status - - restored_status = get_persisted_cc_status(params) - if restored_status != CCStatus["OFF"]: - params_memory.put_int(CC_STATUS_PARAM, restored_status) - return restored_status - - return current_status +def toggle_longitudinal_model_preference(params: Params, params_memory: Params) -> bool: + requested = not requested_experimental_mode(params, params_memory) + params_memory.put_int(LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM, int(requested)) + return requested diff --git a/starpilot/common/safe_mode.py b/starpilot/common/safe_mode.py index 422fa06f9..c9dcfe2af 100644 --- a/starpilot/common/safe_mode.py +++ b/starpilot/common/safe_mode.py @@ -107,26 +107,8 @@ SAFE_MODE_MANAGED_KEYS = ( "ReduceLateralAccelerationRain", "ReduceLateralAccelerationRainStorm", "ReduceLateralAccelerationSnow", - "ConditionalExperimental", - "ConditionalChill", - "CECurves", - "CECurvesLead", - "CELead", - "CESlowerLead", - "CEStoppedLead", - "CESpeed", - "CESpeedLead", - "CCMLead", - "CCMLaunchAssist", - "CCMSetSpeedMargin", - "CCMSpeed", - "CCMSpeedLead", - "CEModelStopTime", - "CEStopLights", - "CESignalSpeed", - "CESignalLaneDetection", - "PersistChillState", - "ShowCCMStatus", + "LongitudinalModelPreference", + "ShowCEMStatus", "CurveSpeedController", "SpeedLimitController", "SetSpeedLimit", diff --git a/starpilot/common/starpilot_variables.py b/starpilot/common/starpilot_variables.py index 68ff27724..e4ac6b19b 100644 --- a/starpilot/common/starpilot_variables.py +++ b/starpilot/common/starpilot_variables.py @@ -802,28 +802,12 @@ class StarPilotVariables: self.migrate_prius_cluster_offset(str(toggle.car_model)) toggle.cluster_offset = self.get_value("ClusterOffset", cast=float, condition=toggle.car_make == "toyota") - toggle.conditional_experimental_mode = toggle.openpilot_longitudinal and self.get_value("ConditionalExperimental") - toggle.conditional_chill_mode = toggle.openpilot_longitudinal and not toggle.conditional_experimental_mode and self.get_value("ConditionalChill") - toggle.conditional_curves = self.get_value("CECurves", condition=toggle.conditional_experimental_mode) - toggle.conditional_curves_lead = self.get_value("CECurvesLead", condition=toggle.conditional_curves) - toggle.conditional_lead = self.get_value("CELead", condition=toggle.conditional_experimental_mode) - toggle.conditional_slower_lead = self.get_value("CESlowerLead", condition=toggle.conditional_lead) - toggle.conditional_stopped_lead = self.get_value("CEStoppedLead", condition=toggle.conditional_lead) - toggle.conditional_limit = self.get_value("CESpeed", cast=float, condition=toggle.conditional_experimental_mode, conversion=speed_conversion) - toggle.conditional_limit_lead = self.get_value("CESpeedLead", cast=float, condition=toggle.conditional_experimental_mode, conversion=speed_conversion) - toggle.conditional_model_stop_time = self.get_value("CEModelStopTime", cast=float, condition=toggle.conditional_experimental_mode and self.get_value("CEStopLights")) - toggle.conditional_signal = self.get_value("CESignalSpeed", cast=float, condition=toggle.conditional_experimental_mode, conversion=speed_conversion) - toggle.conditional_signal_lane_detection = self.get_value("CESignalLaneDetection", condition=toggle.conditional_signal != 0) - toggle.conditional_chill_speed = self.get_value("CCMSpeed", cast=float, condition=toggle.conditional_chill_mode, conversion=speed_conversion) - toggle.conditional_chill_speed_lead = self.get_value("CCMSpeedLead", cast=float, condition=toggle.conditional_chill_mode, conversion=speed_conversion) - toggle.conditional_chill_speed_margin = self.get_value("CCMSetSpeedMargin", cast=float, condition=toggle.conditional_chill_mode, conversion=speed_conversion) - toggle.conditional_chill_lead = self.get_value("CCMLead", condition=toggle.conditional_chill_mode) - toggle.conditional_chill_launch_assist = self.get_value("CCMLaunchAssist", condition=toggle.conditional_chill_mode) - toggle.cem_status = ( - self.get_value("ShowCEMStatus", condition=toggle.conditional_experimental_mode) or - self.get_value("ShowCCMStatus", condition=toggle.conditional_chill_mode) or - toggle.debug_mode + persistent_preference = self.get_value("LongitudinalModelPreference", cast=int, min=0, max=1) + drive_override = self.params_memory.get_int("LongitudinalModelPreferenceOverride", default=-1) + toggle.longitudinal_model_preference = not toggle.safe_mode and bool( + drive_override if drive_override in (0, 1) else persistent_preference ) + toggle.cem_status = self.get_value("ShowCEMStatus") or toggle.debug_mode toggle.curve_speed_controller = toggle.openpilot_longitudinal and self.get_value("CurveSpeedController") toggle.csc_status = self.get_value("ShowCSCStatus", condition=toggle.curve_speed_controller) or toggle.debug_mode diff --git a/starpilot/common/tests/test_accel_profile.py b/starpilot/common/tests/test_accel_profile.py index e2ecc127e..e6bfcaa0a 100644 --- a/starpilot/common/tests/test_accel_profile.py +++ b/starpilot/common/tests/test_accel_profile.py @@ -17,12 +17,12 @@ def test_truck_curves_match_expected_values(): assert get_accel_profile_curve_values(ACCELERATION_PROFILES["SPORT_PLUS"], ev_tuning=False, truck_tuning=True) == A_CRUISE_MAX_VALS_SPORT_PLUS_TRUCK -def test_standard_truck_curve_keeps_mid_high_speed_authority(): +def test_standard_truck_curve_relaxes_at_highway_speed(): values = get_accel_profile_curve_values(ACCELERATION_PROFILES["STANDARD"], ev_tuning=False, truck_tuning=True) - assert interpolate_accel_profile(20.0, values) >= 1.18 - assert interpolate_accel_profile(25.0, values) >= 0.98 - assert interpolate_accel_profile(30.0, values) >= 0.90 + assert 0.5 <= interpolate_accel_profile(20.0, values) <= 0.6 + assert interpolate_accel_profile(25.0, values) == 0.45 + assert 0.35 < interpolate_accel_profile(30.0, values) < 0.45 def test_truck_profiles_remain_ordered(): @@ -32,4 +32,7 @@ def test_truck_profiles_remain_ordered(): sport_plus = get_accel_profile_curve_values(ACCELERATION_PROFILES["SPORT_PLUS"], ev_tuning=False, truck_tuning=True) for e, s, sp, spp in zip(eco, standard, sport, sport_plus, strict=True): - assert e < s < sp < spp + assert e <= s <= sp <= spp + assert any(e < s for e, s in zip(eco, standard, strict=True)) + assert any(s < sp for s, sp in zip(standard, sport, strict=True)) + assert any(sp < spp for sp, spp in zip(sport, sport_plus, strict=True)) diff --git a/starpilot/common/tests/test_experimental_state.py b/starpilot/common/tests/test_experimental_state.py index b1ae1939d..5a7628d53 100644 --- a/starpilot/common/tests/test_experimental_state.py +++ b/starpilot/common/tests/test_experimental_state.py @@ -1,10 +1,7 @@ from openpilot.starpilot.common.experimental_state import ( - CC_STATUS_PARAM, - CCStatus, - CE_STATUS_PARAM, - CEStatus, + LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM, requested_experimental_mode, - restore_persisted_cc_state, + toggle_longitudinal_model_preference, ) @@ -16,9 +13,6 @@ class FakeParams: def get_bool(self, key): return bool(self.bools.get(key, False)) - def put_bool(self, key, value): - self.bools[key] = bool(value) - def get_int(self, key, default=0): return int(self.ints.get(key, default)) @@ -26,54 +20,34 @@ class FakeParams: self.ints[key] = int(value) -def test_requested_experimental_mode_defaults_to_experimental_in_ccm_auto(): - params = FakeParams(bools={"ConditionalChill": True}) - params_memory = FakeParams(ints={CC_STATUS_PARAM: CCStatus["OFF"]}) - - assert requested_experimental_mode(params, params_memory) is True +def test_set_speed_first_is_default(): + assert not requested_experimental_mode(FakeParams(), FakeParams()) -def test_requested_experimental_mode_respects_ccm_manual_override(): - params = FakeParams(bools={"ConditionalChill": True}) - - params_memory = FakeParams(ints={CC_STATUS_PARAM: CCStatus["USER_CHILL"]}) - assert requested_experimental_mode(params, params_memory) is False - - params_memory = FakeParams(ints={CC_STATUS_PARAM: CCStatus["USER_EXPERIMENTAL"]}) - assert requested_experimental_mode(params, params_memory) is True +def test_persistent_model_first_preference_is_respected(): + params = FakeParams(ints={"LongitudinalModelPreference": 1}) + assert requested_experimental_mode(params, FakeParams()) -def test_requested_experimental_mode_prefers_cem_if_both_conditional_modes_are_enabled(): - params = FakeParams(bools={"ConditionalExperimental": True, "ConditionalChill": True}) +def test_drive_override_takes_priority_without_changing_persistent_default(): + params = FakeParams(ints={"LongitudinalModelPreference": 0}) + params_memory = FakeParams(ints={LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM: 1}) - params_memory = FakeParams(ints={ - CE_STATUS_PARAM: CEStatus["OFF"], - CC_STATUS_PARAM: CCStatus["USER_EXPERIMENTAL"], - }) - assert requested_experimental_mode(params, params_memory) is False - - params_memory = FakeParams(ints={ - CE_STATUS_PARAM: CEStatus["USER_OVERRIDDEN"], - CC_STATUS_PARAM: CCStatus["USER_CHILL"], - }) - assert requested_experimental_mode(params, params_memory) is True + assert requested_experimental_mode(params, params_memory) + assert params.get_int("LongitudinalModelPreference") == 0 -def test_requested_experimental_mode_safe_mode_overrides_ccm(): - params = FakeParams(bools={"SafeMode": True, "ConditionalChill": True}) - params_memory = FakeParams(ints={CC_STATUS_PARAM: CCStatus["USER_EXPERIMENTAL"]}) +def test_exp_button_flips_preference_for_current_drive(): + params = FakeParams(ints={"LongitudinalModelPreference": 0}) + params_memory = FakeParams() - assert requested_experimental_mode(params, params_memory) is False + assert toggle_longitudinal_model_preference(params, params_memory) + assert params_memory.get_int(LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM) == 1 + assert not toggle_longitudinal_model_preference(params, params_memory) + assert params_memory.get_int(LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM) == 0 -def test_restore_persisted_cc_state_rehydrates_manual_override(): - params = FakeParams( - bools={"PersistChillState": True}, - ints={"PersistedCCStatus": CCStatus["USER_CHILL"]}, - ) - params_memory = FakeParams(ints={CC_STATUS_PARAM: CCStatus["OFF"]}) - - restored_status = restore_persisted_cc_state(params, params_memory) - - assert restored_status == CCStatus["USER_CHILL"] - assert params_memory.get_int(CC_STATUS_PARAM) == CCStatus["USER_CHILL"] +def test_safe_mode_forces_set_speed_first(): + params = FakeParams(bools={"SafeMode": True}, ints={"LongitudinalModelPreference": 1}) + params_memory = FakeParams(ints={LONGITUDINAL_PREFERENCE_OVERRIDE_PARAM: 1}) + assert not requested_experimental_mode(params, params_memory) diff --git a/starpilot/controls/lib/conditional_chill_mode.py b/starpilot/controls/lib/conditional_chill_mode.py deleted file mode 100644 index 9fa91e768..000000000 --- a/starpilot/controls/lib/conditional_chill_mode.py +++ /dev/null @@ -1,350 +0,0 @@ -#!/usr/bin/env python3 -import time - -from openpilot.common.constants import CV - -from openpilot.starpilot.common.experimental_state import ( - CCStatus, - is_manual_cc_status, - restore_persisted_cc_state, -) - - -class ConditionalChillMode: - CCM_STOP_MODEL_TIME = 7.0 - CHILL_SPEED_ENTRY_CONFIRM_TIME = 0.35 - CHILL_LEAD_ENTRY_CONFIRM_TIME = 1.0 - CHILL_LAUNCH_ENTRY_CONFIRM_TIME = 0.0 - CHILL_EXIT_BUFFER_TIME = 0.35 - CHILL_MIN_DWELL_TIME = 1.2 - - CHILL_LAUNCH_EXIT_SPEED = 15 * CV.MPH_TO_MS - CHILL_LAUNCH_MAX_ENTRY_SPEED = 1.0 - CHILL_LAUNCH_MAX_BRAKE = 0.2 - CHILL_LAUNCH_MAX_CLOSING_SPEED = 0.75 - CHILL_LAUNCH_MIN_LEAD_SPEED = 0.35 - CHILL_LAUNCH_MIN_LEAD_DELTA = 0.2 - CHILL_LAUNCH_MIN_LEAD_VREL = 0.2 - CHILL_LAUNCH_MIN_LEAD_ACCEL = 0.08 - - STABLE_LEAD_MIN_MODEL_PROB = 0.9 - STABLE_LEAD_MAX_BRAKE = 0.2 - STABLE_LEAD_MIN_SPEED = 1.5 - STABLE_LEAD_MAX_DISTANCE = 90.0 - STABLE_LEAD_MAX_DISTANCE_TIME = 4.5 - STABLE_LEAD_MAX_CLOSING_SPEED = 1.25 - STABLE_LEAD_MAX_CLOSING_RATIO = 0.05 - - ADJACENT_LEAD_VETO_MIN_SPEED = 1.0 - ADJACENT_LEAD_VETO_MAX_DISTANCE = 65.0 - ADJACENT_LEAD_VETO_MAX_DISTANCE_TIME = 3.5 - ADJACENT_LEAD_VETO_MAX_LATERAL_OFFSET = 5.5 - - LOW_SPEED_STOP_SCENE_MAX_SPEED = 18 * CV.MPH_TO_MS - - def __init__(self, StarPilotPlanner, detector): - self.starpilot_planner = StarPilotPlanner - self.detector = detector - self.params = self.starpilot_planner.params - self.params_memory = self.starpilot_planner.params_memory - - self.experimental_mode = True - self.status_value = CCStatus["OFF"] - self._active_auto_status = CCStatus["OFF"] - self._candidate_since = 0.0 - self._soft_exit_since = 0.0 - self._chill_hold_until = 0.0 - self._prev_cc_status = None - self._launch_active = False - self._launch_forced_exit = False - - def update(self, v_ego, v_cruise, sm, starpilot_toggles): - now = time.monotonic() - safe_mode = self.params.get_bool("SafeMode") - - self.status_value = CCStatus["OFF"] if safe_mode else restore_persisted_cc_state(self.params, self.params_memory) - - if is_manual_cc_status(self.status_value): - self._reset_timers() - self.experimental_mode = self.status_value == CCStatus["USER_EXPERIMENTAL"] - self._write_status(self.status_value) - return - - self._refresh_detector(v_ego, sm) - auto_status, launch_candidate = self._get_chill_status(v_ego, v_cruise, sm, starpilot_toggles) - - if safe_mode or self._has_hard_veto(v_ego, sm, allow_launch=launch_candidate): - self._reset_timers() - self.experimental_mode = False if safe_mode else True - self.status_value = CCStatus["OFF"] - self._write_status(CCStatus["OFF"]) - return - - chill_candidate = auto_status != CCStatus["OFF"] - entry_confirm_time = self._get_entry_confirm_time(auto_status, launch_candidate) - - if chill_candidate: - if self._candidate_since == 0.0: - self._candidate_since = now - self._soft_exit_since = 0.0 - - if not self.experimental_mode or (now - self._candidate_since) >= entry_confirm_time: - self.experimental_mode = False - self._active_auto_status = auto_status - self._chill_hold_until = max(self._chill_hold_until, now + self.CHILL_MIN_DWELL_TIME) - self.status_value = self._active_auto_status if not self.experimental_mode else CCStatus["OFF"] - else: - self._candidate_since = 0.0 - if not self.experimental_mode: - if self._launch_forced_exit: - self.experimental_mode = True - self._active_auto_status = CCStatus["OFF"] - self.status_value = CCStatus["OFF"] - self._soft_exit_since = 0.0 - self._chill_hold_until = 0.0 - self._launch_forced_exit = False - self._write_status(CCStatus["OFF"]) - return - - if self._soft_exit_since == 0.0: - self._soft_exit_since = now - - hold_active = now < self._chill_hold_until - exit_buffer_active = (now - self._soft_exit_since) < self.CHILL_EXIT_BUFFER_TIME - if hold_active or exit_buffer_active: - self.status_value = self._active_auto_status - else: - self.experimental_mode = True - self._active_auto_status = CCStatus["OFF"] - self.status_value = CCStatus["OFF"] - else: - self._soft_exit_since = 0.0 - self.status_value = CCStatus["OFF"] - - self._write_status(self.status_value if not self.experimental_mode else CCStatus["OFF"]) - - def _reset_timers(self): - self._active_auto_status = CCStatus["OFF"] - self._candidate_since = 0.0 - self._soft_exit_since = 0.0 - self._chill_hold_until = 0.0 - self._launch_active = False - self._launch_forced_exit = False - - def _refresh_detector(self, v_ego, sm): - detector_toggles = type("DetectorToggles", (), { - "conditional_curves": True, - "conditional_curves_lead": True, - "conditional_lead": True, - "conditional_slower_lead": True, - "conditional_stopped_lead": True, - })() - self.detector.curve_detection(v_ego, detector_toggles) - self.detector.slow_lead(detector_toggles, v_ego) - self.detector.stop_sign_and_light(v_ego, sm, self.CCM_STOP_MODEL_TIME) - - def _has_hard_veto(self, v_ego, sm, allow_launch=False): - if sm["carState"].standstill and not allow_launch: - return True - - if sm["carState"].leftBlinker or sm["carState"].rightBlinker: - return True - - if sm["starpilotCarState"].trafficModeEnabled: - return True - - if self.starpilot_planner.starpilot_vcruise.slc.experimental_mode: - return True - - if self.detector.curve_detected or self.detector.slow_lead_detected or self.detector.stop_light_detected: - return True - - if self.starpilot_planner.starpilot_vcruise.stop_sign_confirmed or self.starpilot_planner.starpilot_vcruise.forcing_stop: - return True - - if self._adjacent_lead_ambiguous(sm, v_ego): - return True - - return self._low_speed_stop_scene(v_ego) and not allow_launch - - def _low_speed_stop_scene(self, v_ego): - if v_ego >= self.LOW_SPEED_STOP_SCENE_MAX_SPEED: - return False - - if self.starpilot_planner.raw_model_stopped or self.starpilot_planner.model_stopped or self.detector.stop_light_model_detected: - return True - - lead = self.starpilot_planner.lead_one - if not getattr(lead, "status", False): - return False - - lead_distance = float(getattr(lead, "dRel", float("inf"))) - lead_speed = float(getattr(lead, "vLead", float("inf"))) - lead_distance_limit = max(40.0, v_ego * self.STABLE_LEAD_MAX_DISTANCE_TIME) - return lead_distance < lead_distance_limit and lead_speed < max(6.0, v_ego + 0.5) - - def _get_chill_status(self, v_ego, v_cruise, sm, starpilot_toggles): - if getattr(starpilot_toggles, "conditional_chill_launch_assist", False): - launch_status = self._get_launch_status(v_ego, sm) - if launch_status != CCStatus["OFF"]: - return launch_status, True - - lead = self.starpilot_planner.lead_one - lead_status = bool(getattr(lead, "status", False)) - tracking_lead = bool(getattr(self.starpilot_planner, "tracking_lead", False)) - set_speed_error = max(0.0, v_cruise - v_ego) - - if (not lead_status and not tracking_lead and - v_ego >= starpilot_toggles.conditional_chill_speed and - set_speed_error >= starpilot_toggles.conditional_chill_speed_margin): - return CCStatus["SPEED"], False - - if not starpilot_toggles.conditional_chill_lead: - return CCStatus["OFF"], False - - if v_ego < starpilot_toggles.conditional_chill_speed_lead or not lead_status or not tracking_lead: - return CCStatus["OFF"], False - - lead_distance = float(getattr(lead, "dRel", float("inf"))) - lead_speed = float(getattr(lead, "vLead", 0.0)) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - lead_prob = float(getattr(lead, "modelProb", 0.0)) - closing_speed = max(0.0, v_ego - lead_speed) - max_closing_speed = max(self.STABLE_LEAD_MAX_CLOSING_SPEED, self.STABLE_LEAD_MAX_CLOSING_RATIO * v_ego) - max_distance = min(self.STABLE_LEAD_MAX_DISTANCE, max(35.0, v_ego * self.STABLE_LEAD_MAX_DISTANCE_TIME)) - lead_confident = bool(getattr(lead, "radar", False)) or lead_prob >= self.STABLE_LEAD_MIN_MODEL_PROB - - if not lead_confident: - return CCStatus["OFF"], False - - if lead_distance >= max_distance or lead_speed <= self.STABLE_LEAD_MIN_SPEED: - return CCStatus["OFF"], False - - if lead_brake > self.STABLE_LEAD_MAX_BRAKE or closing_speed > max_closing_speed: - return CCStatus["OFF"], False - - return CCStatus["LEAD"], False - - def _get_launch_status(self, v_ego, sm): - if self._launch_active and self._launch_exit_required(v_ego, sm): - self._launch_active = False - self._launch_forced_exit = True - return CCStatus["OFF"] - - if self._launch_active: - return self._get_launch_cc_status() - - if not self._launch_scene_eligible(v_ego, sm): - return CCStatus["OFF"] - - self._launch_forced_exit = False - self._launch_active = True - return self._get_launch_cc_status() - - def _launch_scene_eligible(self, v_ego, sm): - if v_ego > self.CHILL_LAUNCH_MAX_ENTRY_SPEED and not self._launch_active: - return False - - selfdrive_state = self._get_sm_service(sm, "selfdriveState") - longitudinal_plan = self._get_sm_service(sm, "longitudinalPlan") - starpilot_plan = self._get_sm_service(sm, "starpilotPlan") - if selfdrive_state is None or longitudinal_plan is None: - return False - - if not bool(getattr(selfdrive_state, "enabled", False)): - return False - - if ( - self.detector.stop_light_detected or - self.detector.stop_light_model_detected or - self.starpilot_planner.raw_model_stopped or - self.starpilot_planner.model_stopped or - self.starpilot_planner.starpilot_vcruise.stop_sign_confirmed or - self.starpilot_planner.starpilot_vcruise.forcing_stop or - bool(getattr(starpilot_plan, "redLight", False)) or - bool(getattr(starpilot_plan, "forcingStop", False)) - ): - return False - - if bool(getattr(longitudinal_plan, "shouldStop", False)) or not bool(getattr(longitudinal_plan, "allowThrottle", False)): - return False - - lead = getattr(self.starpilot_planner, "lead_one", None) - lead_status = bool(getattr(lead, "status", False)) - tracking_lead = bool(getattr(self.starpilot_planner, "tracking_lead", False)) - if not lead_status and not tracking_lead: - return True - - lead_speed = float(getattr(lead, "vLead", 0.0)) - lead_brake = max(0.0, -float(getattr(lead, "aLeadK", 0.0))) - lead_accel = float(getattr(lead, "aLeadK", 0.0)) - lead_delta = lead_speed - float(v_ego) - lead_vrel = float(getattr(lead, "vRel", lead_delta)) - closing_speed = max(0.0, v_ego - lead_speed) - - return ( - lead_speed >= self.CHILL_LAUNCH_MIN_LEAD_SPEED and - lead_delta >= self.CHILL_LAUNCH_MIN_LEAD_DELTA and - lead_vrel >= self.CHILL_LAUNCH_MIN_LEAD_VREL and - lead_accel >= self.CHILL_LAUNCH_MIN_LEAD_ACCEL and - lead_brake <= self.CHILL_LAUNCH_MAX_BRAKE and - closing_speed <= self.CHILL_LAUNCH_MAX_CLOSING_SPEED - ) - - def _launch_exit_required(self, v_ego, sm): - if v_ego >= self.CHILL_LAUNCH_EXIT_SPEED: - return True - - if not self._launch_scene_eligible(v_ego, sm): - return True - - return False - - def _get_launch_cc_status(self): - lead = getattr(self.starpilot_planner, "lead_one", None) - lead_status = bool(getattr(lead, "status", False)) - tracking_lead = bool(getattr(self.starpilot_planner, "tracking_lead", False)) - return CCStatus["LEAD"] if lead_status or tracking_lead else CCStatus["SPEED"] - - def _get_entry_confirm_time(self, auto_status, launch_candidate): - if launch_candidate: - return self.CHILL_LAUNCH_ENTRY_CONFIRM_TIME - - if auto_status == CCStatus["LEAD"]: - return self.CHILL_LEAD_ENTRY_CONFIRM_TIME - - return self.CHILL_SPEED_ENTRY_CONFIRM_TIME - - def _adjacent_lead_ambiguous(self, sm, v_ego): - radar_state = self._get_sm_service(sm, "starpilotRadarState") - if radar_state is None: - return False - - max_distance = min(self.ADJACENT_LEAD_VETO_MAX_DISTANCE, max(25.0, v_ego * self.ADJACENT_LEAD_VETO_MAX_DISTANCE_TIME)) - for lead in (getattr(radar_state, "leadLeft", None), getattr(radar_state, "leadRight", None)): - if lead is None or not getattr(lead, "status", False): - continue - - lateral_offset = abs(float(getattr(lead, "yRel", 0.0))) - if lateral_offset > self.ADJACENT_LEAD_VETO_MAX_LATERAL_OFFSET: - continue - - if float(getattr(lead, "dRel", float("inf"))) < max_distance and float(getattr(lead, "vLead", 0.0)) > self.ADJACENT_LEAD_VETO_MIN_SPEED: - return True - - return False - - @staticmethod - def _get_sm_service(sm, key): - if isinstance(sm, dict): - return sm.get(key) - - try: - return sm[key] - except (KeyError, IndexError, TypeError, AttributeError): - return None - - def _write_status(self, status_value): - if status_value != self._prev_cc_status: - self.params_memory.put_int("CCStatus", status_value) - self._prev_cc_status = status_value diff --git a/starpilot/controls/lib/conditional_experimental_mode.py b/starpilot/controls/lib/conditional_experimental_mode.py deleted file mode 100644 index b13fec29e..000000000 --- a/starpilot/controls/lib/conditional_experimental_mode.py +++ /dev/null @@ -1,521 +0,0 @@ -#!/usr/bin/env python3 -import time -import numpy as np - -from openpilot.common.filter_simple import FirstOrderFilter -from openpilot.common.realtime import DT_MDL -from openpilot.common.constants import CV - -from openpilot.starpilot.common.experimental_state import ( - CEStatus, - is_manual_ce_status, - restore_persisted_ce_state, -) -from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, THRESHOLD - -def interp(x, xp, fp): - return float(np.interp(x, xp, fp)) - - -def scale_threshold(v_ego): - # Speed-based lead threshold behavior (v_ego in m/s) - return interp(v_ego, [0.0, 17.9, 26.8, 35.8, 44.7], [0.58, 0.60, 0.62, 0.75, 0.90]) - - -class ConditionalExperimentalMode: - # ===== CONDITIONAL EXPERIMENTAL MODE SPEED-BASED TUNING ===== - # Speed ranges: [0-35, 35-55, 55-70, 70+ mph] - - # FILTER TIME CONSTANTS (Lower = More responsive, Higher = Smoother) - # [City, Urban Hwy, Rural Hwy, High Speed] - FILTER_TIME_CURVES = [0.9, 0.8, 0.6, 0.5] # Faster detection at highway speeds - FILTER_TIME_LEADS = [0.9, 0.8, 0.7, 0.5] # Less sensitive at 70+ mph for slow leads - FILTER_TIME_LIGHTS = [0.9, 0.8, 0.75, 0.55] # Less sensitive at 60+ mph for stoplights - - # HIGHWAY LIGHT DETECTION MULTIPLIERS - # How much to increase model stop time at highway speeds - LIGHT_BOOSTS = [1.0, 1.2, 1.1, 1.0] # Keep conservative boost for highest speeds - LIGHT_SPEED_LOW = 50 * CV.MPH_TO_MS # 50 mph threshold - LIGHT_SPEED_HIGH = 60 * CV.MPH_TO_MS # 60 mph threshold - LIGHT_MAX_TIME = 9 # Balanced max time preserving city performance - LOW_SPEED_LIGHT_FILTER_TIME = 0.35 - LEAD_CLEAR_FILTER_TIME_LOW = 0.6 - LEAD_CLEAR_FILTER_TIME_HIGH = 0.35 - STOP_LIGHT_ON_MARGIN = 2.5 - STOP_LIGHT_OFF_MARGIN = 4.0 - STOP_LIGHT_MODEL_HOLD_STRONG_MARGIN = 10.0 - STOP_LIGHT_LEAD_BLOCK_MARGIN = 15.0 - STOP_LIGHT_HANDOFF_MAX_LEAD_SPEED = 2.0 - STOP_LIGHT_DETECTED_HOLD_TIME = 4.0 - STOP_APPROACH_LATCH_TIME = 1.0 - STOP_APPROACH_MAX_LEAD_SPEED = 4.5 - STOP_APPROACH_MIN_MODEL_PROB = 0.9 - SLOW_LEAD_CONTINUITY_MIN_MODEL_PROB = 0.85 - SLOW_LEAD_CONTINUITY_MAX_DISTANCE_TIME = 4.0 - SLOW_LEAD_CONTINUITY_MIN_EGO = 2.5 - SLOW_LEAD_CONTINUITY_HOLD_TIME = 1.25 - SLOW_LEAD_FORCE_CLEAR_TIME = 0.75 - SLOW_LEAD_MODE_RELEASE_HOLD_TIME = 1.5 - SLOW_LEAD_MIN_CLOSING_SPEED = 0.75 - SLOW_LEAD_CLEAR_FASTER_FACTOR = 0.5 - SLOW_RADAR_LEAD_TRIGGER_MAX_DISTANCE_TIME = 2.5 - SLOW_RADAR_LEAD_TRIGGER_MIN_DISTANCE = 40.0 - POST_STOP_LAUNCH_TRIGGER_SUPPRESS_TIME = 2.0 - TURN_STOP_LIGHT_VETO_MAX_SPEED = 15 * CV.MPH_TO_MS - TURN_STOP_LIGHT_VETO_STEERING_ANGLE = 45.0 - - # ===== END TUNING PARAMETERS ===== - - # Current active values - FILTER_TIME_CURVE = 0.8 - FILTER_TIME_LEAD = 0.8 - FILTER_TIME_LIGHT = 0.8 - LIGHT_BOOST_LOW = 1.15 - LIGHT_BOOST_HIGH = 1.2 - - # Small latch to avoid frame-to-frame mode chatter. - CEM_TRANSITION_GUARD_TIME = 0.50 - CEM_TRANSITION_BUFFER_TIME = 0.25 - - @staticmethod - def get_speed_based_param(speed_mph, param_array): - """Get parameter value based on current speed using smooth interpolation between breakpoints [0, 35, 55, 70]""" - return interp(speed_mph, [0, 35, 55, 70], param_array) - - def __init__(self, StarPilotPlanner): - self.starpilot_planner = StarPilotPlanner - self.params = self.starpilot_planner.params - self.params_memory = self.starpilot_planner.params_memory - - # Faster filters with hysteresis for better responsiveness - self.curvature_filter = FirstOrderFilter(0, self.FILTER_TIME_CURVE, DT_MDL) - self.slow_lead_filter = FirstOrderFilter(0, self.FILTER_TIME_LEAD, DT_MDL) - self.stop_light_filter = FirstOrderFilter(0, self.FILTER_TIME_LIGHT, DT_MDL) - self.lead_clear_filter = FirstOrderFilter(0, self.LEAD_CLEAR_FILTER_TIME_LOW, DT_MDL) - - self.curve_detected = False - self.slow_lead_detected = False - self.prev_tracking_lead = bool(getattr(self.starpilot_planner, "tracking_lead", False)) - self.slow_lead_clear_since = 0.0 - self.slow_lead_continuity_until = 0.0 - self.experimental_mode = False - self.stop_light_detected = False - self.stop_light_model_detected = False - self.stop_light_detected_hold_until = 0.0 - self.stop_approach_hold_until = 0.0 - self.standstill_stop_reason = None - self.prev_experimental_mode = False # For hysteresis - self.mode_hold_until = 0.0 - self.mode_false_since = 0.0 - self.slow_lead_mode_hold_until = 0.0 - self._prev_ce_status = None - self.prev_standstill = False - self.prev_standstill_stop_hold = False - self.standstill_stop_release_pending = False - self.post_stop_launch_trigger_suppress_until = 0.0 - - def update(self, v_ego, sm, starpilot_toggles): - now = time.monotonic() - standstill = bool(sm["carState"].standstill) - current_standstill_stop_hold = False - released_standstill_stop_hold = self.prev_standstill and self.prev_standstill_stop_hold and not standstill - completed_pending_stop_release = self.standstill_stop_release_pending and not standstill - - if released_standstill_stop_hold or completed_pending_stop_release: - self.post_stop_launch_trigger_suppress_until = now + self.POST_STOP_LAUNCH_TRIGGER_SUPPRESS_TIME - self.mode_hold_until = 0.0 - self.mode_false_since = 0.0 - self.slow_lead_mode_hold_until = 0.0 - self.prev_experimental_mode = False - self.standstill_stop_release_pending = False - - if not standstill: - self.standstill_stop_reason = None - - self.status_value = CEStatus["OFF"] if self.params.get_bool("SafeMode") else restore_persisted_ce_state(self.params, self.params_memory) - - if not is_manual_ce_status(self.status_value) and not standstill: - self.update_conditions(v_ego, sm, starpilot_toggles) - - triggered = self.check_conditions(v_ego, sm, starpilot_toggles) - if triggered: - self.mode_hold_until = now + self.CEM_TRANSITION_GUARD_TIME - self.mode_false_since = 0.0 - if self.status_value == CEStatus["LEAD"]: - self.slow_lead_mode_hold_until = now + self.SLOW_LEAD_MODE_RELEASE_HOLD_TIME - else: - self.slow_lead_mode_hold_until = 0.0 - elif self.prev_experimental_mode and self.mode_false_since == 0.0: - self.mode_false_since = now - elif not self.prev_experimental_mode: - self.mode_false_since = 0.0 - - hold_active = now < self.mode_hold_until - transition_buffer_active = self.mode_false_since != 0.0 and (now - self.mode_false_since) < self.CEM_TRANSITION_BUFFER_TIME - slow_lead_hold_active = bool( - starpilot_toggles.conditional_lead and - now < self.slow_lead_mode_hold_until and - self.has_credible_slow_lead_context(v_ego) - ) - if slow_lead_hold_active and not triggered: - self.status_value = CEStatus["LEAD"] - elif not slow_lead_hold_active: - self.slow_lead_mode_hold_until = 0.0 - - self.experimental_mode = triggered or slow_lead_hold_active or hold_active or transition_buffer_active - self.prev_experimental_mode = self.experimental_mode - ce_write_value = self.status_value if self.experimental_mode else CEStatus["OFF"] - if ce_write_value != self._prev_ce_status: - self.params_memory.put_int("CEStatus", ce_write_value) - self._prev_ce_status = ce_write_value - elif not is_manual_ce_status(self.status_value): - self.mode_hold_until = 0.0 - self.mode_false_since = 0.0 - self.slow_lead_mode_hold_until = 0.0 - - # Keep the stop-light path live at standstill so EXP stays pinned for a red - # light / stop sign. Stop signs latch until pedal, while stop lights can - # immediately release to CHILL when the model clears the stop. - self.stop_sign_and_light(v_ego, sm, starpilot_toggles.conditional_model_stop_time) - standstill_stop_hold = self.get_standstill_stop_hold(sm) - current_standstill_stop_hold = standstill_stop_hold - - if current_standstill_stop_hold: - self.standstill_stop_release_pending = False - elif self.prev_standstill_stop_hold: - self.standstill_stop_release_pending = True - - if self.standstill_stop_release_pending: - self.post_stop_launch_trigger_suppress_until = now + self.POST_STOP_LAUNCH_TRIGGER_SUPPRESS_TIME - - self.experimental_mode = standstill_stop_hold - self.prev_experimental_mode = self.experimental_mode - self.status_value = CEStatus["STOP_LIGHT"] if self.experimental_mode else CEStatus["OFF"] - ce_write_value = self.status_value - if ce_write_value != self._prev_ce_status: - self.params_memory.put_int("CEStatus", ce_write_value) - self._prev_ce_status = ce_write_value - else: - self.mode_hold_until = 0.0 - self.mode_false_since = 0.0 - self.slow_lead_mode_hold_until = 0.0 - self._prev_ce_status = None - self.standstill_stop_release_pending = False - self.experimental_mode = self.status_value == CEStatus["USER_OVERRIDDEN"] - self.prev_experimental_mode = self.experimental_mode - self.stop_light_detected &= not is_manual_ce_status(self.status_value) - self.stop_light_filter.x = 0 - - self.prev_standstill = standstill - self.prev_standstill_stop_hold = current_standstill_stop_hold - - def has_credible_slow_lead_context(self, v_ego): - lead = self.starpilot_planner.lead_one - if lead is None or not bool(getattr(lead, "status", False)): - return False - - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - if not lead_radar and lead_prob < self.SLOW_LEAD_CONTINUITY_MIN_MODEL_PROB: - return False - - lead_distance = float(getattr(lead, "dRel", float("inf"))) - return lead_distance < max(40.0, float(v_ego) * self.SLOW_LEAD_CONTINUITY_MAX_DISTANCE_TIME) - - def get_standstill_stop_hold(self, sm): - dash_stop_sign = ( - bool(getattr(self.starpilot_planner.starpilot_vcruise, "stop_sign_confirmed", False)) or - bool(getattr(sm["starpilotCarState"], "dashboardStopSign", 0) > 0) - ) - force_stop_active = bool(getattr(self.starpilot_planner.starpilot_vcruise, "forcing_stop", False)) - model_stopped = bool(getattr(self.starpilot_planner, "model_stopped", False)) - pedal_override = bool(getattr(sm["carState"], "gasPressed", False) or getattr(sm["starpilotCarState"], "accelPressed", False)) - - if pedal_override or not bool(sm["carState"].standstill): - self.standstill_stop_reason = None - return False - - if dash_stop_sign: - self.standstill_stop_reason = "sign" - elif self.stop_light_detected or force_stop_active or model_stopped: - if self.standstill_stop_reason is None: - self.standstill_stop_reason = "light" - elif self.standstill_stop_reason == "light": - self.standstill_stop_reason = None - - if self.standstill_stop_reason == "sign": - return True - - return bool(self.stop_light_detected or force_stop_active or model_stopped) - - def check_conditions(self, v_ego, sm, starpilot_toggles): - launch_trigger_suppressed = time.monotonic() < self.post_stop_launch_trigger_suppress_until - below_speed = not launch_trigger_suppressed and starpilot_toggles.conditional_limit > v_ego >= 1 and not self.starpilot_planner.starpilot_following.following_lead - below_speed_with_lead = not launch_trigger_suppressed and starpilot_toggles.conditional_limit_lead > v_ego >= 1 and self.starpilot_planner.starpilot_following.following_lead - if below_speed or below_speed_with_lead: - self.status_value = CEStatus["SPEED"] - return True - - desired_lane = self.starpilot_planner.lane_width_left if sm["carState"].leftBlinker else self.starpilot_planner.lane_width_right - lane_available = desired_lane >= starpilot_toggles.lane_detection_width or not starpilot_toggles.conditional_signal_lane_detection - if v_ego < starpilot_toggles.conditional_signal and (sm["carState"].leftBlinker or sm["carState"].rightBlinker) and not lane_available: - self.status_value = CEStatus["SIGNAL"] - return True - - if starpilot_toggles.conditional_curves and self.curve_detected and (starpilot_toggles.conditional_curves_lead or not self.starpilot_planner.starpilot_following.following_lead): - self.status_value = CEStatus["CURVATURE"] - return True - - if not launch_trigger_suppressed and starpilot_toggles.conditional_lead and self.slow_lead_detected and v_ego <= 35.31: - self.status_value = CEStatus["LEAD"] - return True - - if starpilot_toggles.conditional_model_stop_time != 0 and self.stop_light_detected: - self.status_value = CEStatus["STOP_LIGHT"] - return True - - if self.starpilot_planner.starpilot_vcruise.slc.experimental_mode: - self.status_value = CEStatus["SPEED_LIMIT"] - return True - - return False - - def update_conditions(self, v_ego, sm, starpilot_toggles): - self.curve_detection(v_ego, starpilot_toggles) - self.slow_lead(starpilot_toggles, v_ego) - self.stop_sign_and_light(v_ego, sm, starpilot_toggles.conditional_model_stop_time) - - def curve_detection(self, v_ego, starpilot_toggles): - self.curvature_filter.update(self.starpilot_planner.road_curvature_detected or self.starpilot_planner.driving_in_curve) - self.curve_detected = bool(self.curvature_filter.x >= THRESHOLD and v_ego > CRUISING_SPEED) - - def slow_lead(self, starpilot_toggles, v_ego): - now = time.monotonic() - lead = self.starpilot_planner.lead_one - tracking_lead = bool(getattr(self.starpilot_planner, "tracking_lead", False)) - lead_status = bool(getattr(lead, "status", False)) - lead_distance = float(getattr(lead, "dRel", float("inf"))) - lead_speed = float(getattr(lead, "vLead", float("inf"))) - lead_prob = float(getattr(lead, "modelProb", 1.0)) - lead_radar = bool(getattr(lead, "radar", False)) - closing_speed = max(0.0, v_ego - lead_speed) - min_closing_speed = max(self.SLOW_LEAD_MIN_CLOSING_SPEED, 0.04 * v_ego) - - if not starpilot_toggles.conditional_stopped_lead and v_ego < self.SLOW_LEAD_CONTINUITY_MIN_EGO: - self.clear_slow_lead_state(tracking_lead) - return - - radar_slow_lead_in_range = bool( - not lead_radar or - lead_distance < max(self.SLOW_RADAR_LEAD_TRIGGER_MIN_DISTANCE, - v_ego * self.SLOW_RADAR_LEAD_TRIGGER_MAX_DISTANCE_TIME) - ) - slower_lead = bool( - starpilot_toggles.conditional_slower_lead and - self.starpilot_planner.starpilot_following.slower_lead and - radar_slow_lead_in_range - ) - stopped_lead = bool( - starpilot_toggles.conditional_stopped_lead and - lead_status and - lead_speed < 1 and - lead_distance < max(40.0, v_ego * self.SLOW_LEAD_CONTINUITY_MAX_DISTANCE_TIME) - ) - vision_slow_lead_candidate = bool( - lead_status and - not lead_radar and - lead_prob >= self.SLOW_LEAD_CONTINUITY_MIN_MODEL_PROB and - lead_distance < max(40.0, v_ego * self.SLOW_LEAD_CONTINUITY_MAX_DISTANCE_TIME) and - closing_speed >= min_closing_speed and - lead_speed < max(v_ego - 0.5, 2.0) - ) - - lead_threshold = scale_threshold(v_ego) - adjusted_threshold = lead_threshold * (1.0 + 0.2 * (1.0 - lead_prob)) # Higher threshold for lower confidence - - if lead_status and not slower_lead and not stopped_lead and closing_speed < (min_closing_speed * self.SLOW_LEAD_CLEAR_FASTER_FACTOR): - self.clear_slow_lead_state(tracking_lead) - return - - if tracking_lead and (slower_lead or stopped_lead or vision_slow_lead_candidate): - self.slow_lead_continuity_until = now + self.SLOW_LEAD_CONTINUITY_HOLD_TIME - elif self.prev_tracking_lead and not tracking_lead and self.slow_lead_detected and vision_slow_lead_candidate: - self.slow_lead_continuity_until = now + self.SLOW_LEAD_CONTINUITY_HOLD_TIME - - raw_vision_slow_lead = bool( - starpilot_toggles.conditional_slower_lead and - not tracking_lead and - now < self.slow_lead_continuity_until and - vision_slow_lead_candidate - ) - tracked_vision_mode_continuation = bool( - starpilot_toggles.conditional_slower_lead and - tracking_lead and - self.prev_experimental_mode and - vision_slow_lead_candidate - ) - - slow_lead_active = bool(slower_lead or raw_vision_slow_lead or stopped_lead or tracked_vision_mode_continuation) - if slow_lead_active: - self.slow_lead_clear_since = 0.0 - self.slow_lead_filter.update(True) - self.slow_lead_detected = bool(self.slow_lead_filter.x >= adjusted_threshold) - elif tracking_lead: - if self.slow_lead_clear_since == 0.0: - self.slow_lead_clear_since = now - - if (now - self.slow_lead_clear_since) >= self.SLOW_LEAD_FORCE_CLEAR_TIME: - self.clear_slow_lead_state(tracking_lead) - else: - self.slow_lead_filter.update(False) - self.slow_lead_detected = bool(self.slow_lead_filter.x >= adjusted_threshold) - else: - self.clear_slow_lead_state(tracking_lead) - - self.prev_tracking_lead = tracking_lead - - def clear_slow_lead_state(self, tracking_lead): - self.slow_lead_filter.update(False) - self.slow_lead_detected = False - self.slow_lead_clear_since = 0.0 - self.slow_lead_continuity_until = 0.0 - self.prev_tracking_lead = tracking_lead - - def reset_stop_light_state(self): - self.stop_light_filter.x = 0 - self.stop_light_detected = False - self.stop_light_model_detected = False - self.stop_light_detected_hold_until = 0.0 - self.lead_clear_filter.x = 0 - self.stop_approach_hold_until = 0.0 - - def in_committed_turn_scene(self, v_ego, sm): - car_state = sm["carState"] - if bool(getattr(car_state, "standstill", False)) or v_ego > self.TURN_STOP_LIGHT_VETO_MAX_SPEED: - return False - - if not (bool(getattr(car_state, "leftBlinker", False)) or bool(getattr(car_state, "rightBlinker", False))): - return False - - steering_angle = abs(float(getattr(car_state, "steeringAngleDeg", 0.0))) - return bool( - steering_angle >= self.TURN_STOP_LIGHT_VETO_STEERING_ANGLE or - getattr(self.starpilot_planner, "driving_in_curve", False) - ) - - def stop_sign_and_light(self, v_ego, sm, model_time): - now = time.monotonic() - - # While the dashboard has confirmed a stop sign on this approach, pin CEM in EXP. - # Approaches routinely exceed the mode_hold_until/mode_false_since hysteresis (0.5s/0.25s), - # so without this the model briefly losing the sign drops CEM to CHILL and stalls the - # force-stop activation path. Latch is owned by starpilot_vcruise. - if getattr(self.starpilot_planner.starpilot_vcruise, 'stop_sign_confirmed', False): - self.stop_light_filter.x = 1.0 - self.stop_light_detected = True - return - - if self.in_committed_turn_scene(v_ego, sm): - self.reset_stop_light_state() - return - - if not sm["starpilotCarState"].trafficModeEnabled: - speed_mph = v_ego * CV.MS_TO_MPH # Convert m/s to mph - - # Interp for smooth scaling in 35-45 mph - bp = [0, 35, 45] - low_filter_time = 0.0 # No filtering under 35 mph - tuned_filter_time_curves = self.FILTER_TIME_CURVES[1] # At 35-55 mph - tuned_filter_time_leads = self.FILTER_TIME_LEADS[1] - tuned_filter_time_lights = self.FILTER_TIME_LIGHTS[1] - low_boost = 1.0 - tuned_boost = self.LIGHT_BOOSTS[1] - low_cap_factor = 0.0 # No cap under 35 mph - tuned_cap_factor = 1.0 - - filter_time_curves = interp(speed_mph, bp, [low_filter_time, low_filter_time, tuned_filter_time_curves]) - filter_time_leads = interp(speed_mph, bp, [low_filter_time, low_filter_time, tuned_filter_time_leads]) - filter_time_lights = interp(speed_mph, bp, [self.LOW_SPEED_LIGHT_FILTER_TIME, self.LOW_SPEED_LIGHT_FILTER_TIME, tuned_filter_time_lights]) - lead_clear_filter_time = interp(speed_mph, bp, [self.LEAD_CLEAR_FILTER_TIME_LOW, self.LEAD_CLEAR_FILTER_TIME_LOW, self.LEAD_CLEAR_FILTER_TIME_HIGH]) - light_boost = interp(speed_mph, bp, [low_boost, low_boost, tuned_boost]) - cap_factor = interp(speed_mph, bp, [low_cap_factor, low_cap_factor, tuned_cap_factor]) - - # Update filter times with interp - self.curvature_filter.update_alpha(filter_time_curves) - self.slow_lead_filter.update_alpha(filter_time_leads) - self.stop_light_filter.update_alpha(filter_time_lights) - self.lead_clear_filter.update_alpha(lead_clear_filter_time) - - # Disable stoplight detection at very high speeds to prevent false positives - if speed_mph > 75: # Disable above 75 mph - self.reset_stop_light_state() - return - - # Adjust model time with interp boost and gradual cap - adjusted_model_time = model_time * light_boost - if cap_factor > 0: - adjusted_model_time = min(adjusted_model_time, self.LIGHT_MAX_TIME * cap_factor + model_time * (1 - cap_factor)) # Gradual cap - - stop_threshold = max(v_ego * adjusted_model_time, 0.0) - if self.stop_light_model_detected: - model_stopping = self.starpilot_planner.model_length < stop_threshold + self.STOP_LIGHT_OFF_MARGIN - else: - model_stopping = self.starpilot_planner.model_length < max(stop_threshold - self.STOP_LIGHT_ON_MARGIN, 0.0) - self.stop_light_model_detected = model_stopping - - # `model_stopped` is a coarse horizon-length check (< 50 m with current constants) - # used elsewhere for force-stop/green-light behavior. Reusing it here causes - # ordinary low-speed cruising to look like a stop prediction and can latch the - # STOP_LIGHT CEM trigger. For the CEM detector, key strictly off the configured - # "predicted stop within N seconds" threshold. - # Key off relevant raw lead presence, not trackingLead. Vision-only GM can - # flap trackingLead around the model-length threshold while leadOne remains - # present; far/stale leads should not suppress true stop-light detection. - lead = getattr(self.starpilot_planner, "lead_one", None) - lead_distance = float(getattr(lead, "dRel", float("inf"))) - lead_speed = float(getattr(lead, "vLead", float("inf"))) - lead_radar = bool(getattr(lead, "radar", False)) - lead_prob = float(getattr(lead, "modelProb", 1.0 if lead_radar else 0.0)) - tracking_lead = bool(self.starpilot_planner.tracking_lead) - lead_relevant = bool(getattr(lead, "status", False)) and lead_distance < stop_threshold + self.STOP_LIGHT_LEAD_BLOCK_MARGIN - vision_stop_approach = ( - lead_relevant and - not lead_radar and - lead_prob >= self.STOP_APPROACH_MIN_MODEL_PROB and - lead_speed < self.STOP_APPROACH_MAX_LEAD_SPEED - ) - stop_approach_hold_active = now < self.stop_approach_hold_until - trackable_stop_approach = vision_stop_approach and not tracking_lead - if (self.stop_light_detected or self.stop_light_model_detected or stop_approach_hold_active) and trackable_stop_approach: - self.stop_approach_hold_until = now + self.STOP_APPROACH_LATCH_TIME - stop_approach_latched = now < self.stop_approach_hold_until and trackable_stop_approach - handoff_to_stopped_lead = ( - lead_relevant and - not tracking_lead and - ( - (self.stop_light_detected and lead_speed < self.STOP_LIGHT_HANDOFF_MAX_LEAD_SPEED) or - stop_approach_latched - ) - ) - if handoff_to_stopped_lead: - lead_cleared = True - else: - self.lead_clear_filter.update(not lead_relevant) - lead_cleared = self.lead_clear_filter.x >= THRESHOLD - self.stop_light_filter.update(model_stopping and lead_cleared) - model_detector_active = bool(self.stop_light_filter.x >= THRESHOLD**2 and lead_cleared) - detector_active = bool(model_detector_active or handoff_to_stopped_lead or stop_approach_latched) - model_hold_qualifies = bool( - self.starpilot_planner.model_stopped or - self.starpilot_planner.model_length < max(stop_threshold - self.STOP_LIGHT_MODEL_HOLD_STRONG_MARGIN, 0.0) - ) - if model_detector_active and model_hold_qualifies: - self.stop_light_detected_hold_until = now + self.STOP_LIGHT_DETECTED_HOLD_TIME - - hold_context_ok = bool((not lead_relevant) or trackable_stop_approach) - self.stop_light_detected = bool( - detector_active or - (hold_context_ok and now < self.stop_light_detected_hold_until) - ) - else: - self.reset_stop_light_state() diff --git a/starpilot/controls/lib/starpilot_acceleration.py b/starpilot/controls/lib/starpilot_acceleration.py index 4d5c486e4..023d55519 100644 --- a/starpilot/controls/lib/starpilot_acceleration.py +++ b/starpilot/controls/lib/starpilot_acceleration.py @@ -212,9 +212,8 @@ class StarPilotAcceleration: stop_context = ( sm["carState"].standstill or getattr(sm["controlsState"], "forceDecel", False) or - getattr(self.starpilot_planner.starpilot_cem, "stop_light_detected", False) or - getattr(self.starpilot_planner.starpilot_vcruise, "forcing_stop", False) or - getattr(self.starpilot_planner.starpilot_following, "disable_throttle", False) + self.starpilot_planner.longitudinal_intent.stop_detected or + getattr(self.starpilot_planner.starpilot_vcruise, "forcing_stop", False) ) if (getattr(starpilot_toggles, "speed_limit_controller", False) and v_ego > SLC_COAST_MIN_SPEED and diff --git a/starpilot/controls/lib/starpilot_events.py b/starpilot/controls/lib/starpilot_events.py index c748ba5f5..05c775f7b 100644 --- a/starpilot/controls/lib/starpilot_events.py +++ b/starpilot/controls/lib/starpilot_events.py @@ -71,7 +71,7 @@ class StarPilotEvents: if not self.starpilot_planner.model_stopped and self.stopped_for_light and starpilot_toggles.green_light_alert: self.events.add(StarPilotEventName.greenLight) - self.stopped_for_light = self.starpilot_planner.starpilot_cem.stop_light_detected + self.stopped_for_light = self.starpilot_planner.longitudinal_intent.stop_detected else: self.stopped_for_light = False diff --git a/starpilot/controls/lib/starpilot_following.py b/starpilot/controls/lib/starpilot_following.py index df1eca5f3..1b5062449 100644 --- a/starpilot/controls/lib/starpilot_following.py +++ b/starpilot/controls/lib/starpilot_following.py @@ -2,8 +2,7 @@ import numpy as np from openpilot.common.constants import CV -from openpilot.selfdrive.controls.lib.lead_behavior import should_disable_far_lead_throttle -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import COMFORT_BRAKE, LEAD_DANGER_FACTOR, desired_follow_distance, get_jerk_factor, get_T_FOLLOW +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import LEAD_DANGER_FACTOR, desired_follow_distance, get_jerk_factor, get_T_FOLLOW from openpilot.starpilot.common.starpilot_variables import CITY_SPEED_LIMIT, MAX_T_FOLLOW @@ -18,10 +17,6 @@ class StarPilotFollowing: def __init__(self, StarPilotPlanner): self.starpilot_planner = StarPilotPlanner - self.disable_throttle = False - self.following_lead = False - self.slower_lead = False - self.acceleration_jerk = 0 self.danger_jerk = 0 self.desired_follow_distance = 0 @@ -78,28 +73,10 @@ class StarPilotFollowing: self.danger_jerk = self.base_danger_jerk self.speed_jerk = self.base_speed_jerk - self.following_lead = self.starpilot_planner.tracking_lead and self.starpilot_planner.lead_one.dRel < (self.t_follow * 2) * v_ego - self.slower_lead = False - if self.starpilot_planner.starpilot_weather.weather_id != 0: self.t_follow = min(self.t_follow + self.starpilot_planner.starpilot_weather.increase_following_distance, MAX_T_FOLLOW) - self.disable_throttle = False - if self.starpilot_planner.tracking_lead and self.starpilot_planner.lead_one.status: - lead_distance = self.starpilot_planner.lead_one.dRel - v_lead = self.starpilot_planner.lead_one.vLead - closing_speed = max(0.0, v_ego - v_lead) - desired_gap = float(desired_follow_distance(v_ego, v_lead, self.t_follow)) - self.disable_throttle = should_disable_far_lead_throttle(v_ego, lead_distance, desired_gap, closing_speed, self.following_lead) - if long_control_active and self.starpilot_planner.tracking_lead: - self.update_follow_values(self.starpilot_planner.lead_one.dRel, v_ego, self.starpilot_planner.lead_one.vLead, starpilot_toggles) self.desired_follow_distance = int(desired_follow_distance(v_ego, self.starpilot_planner.lead_one.vLead, self.t_follow)) else: self.desired_follow_distance = 0 - - def update_follow_values(self, lead_distance, v_ego, v_lead, starpilot_toggles): - if starpilot_toggles.conditional_slower_lead and v_lead < v_ego: - distance_factor = max(lead_distance - (v_lead * self.t_follow), 1) - braking_offset = float(np.clip(min(v_ego - v_lead, v_lead) - COMFORT_BRAKE, 1, distance_factor)) - self.slower_lead = braking_offset > 1 diff --git a/starpilot/controls/lib/starpilot_vcruise.py b/starpilot/controls/lib/starpilot_vcruise.py index de73c8eb6..a0146680a 100644 --- a/starpilot/controls/lib/starpilot_vcruise.py +++ b/starpilot/controls/lib/starpilot_vcruise.py @@ -270,7 +270,7 @@ class StarPilotVCruise: long_control_active = sm["carControl"].longActive raw_stop_seen = bool( - self.starpilot_planner.starpilot_cem.stop_light_detected + self.starpilot_planner.longitudinal_intent.stop_detected or getattr(self.starpilot_planner, "raw_model_stopped", False) or sm["starpilotCarState"].dashboardStopSign > 0 ) @@ -303,11 +303,11 @@ class StarPilotVCruise: and not stop_then_turn ) - # CEM/model path: model predicted stop within ACTIVATION_M. + # Unified model path: model predicted stop within ACTIVATION_M. # Exclude when a lead is present (raw or filtered) — the handoff_to_stopped_lead path - # in CEM can set stop_light_detected even with a lead present, which would incorrectly + # can report stop intent even with a lead present, which would incorrectly # activate Force Stop and stop the car far behind the lead instead of letting ACC handle it. - cem_path = (self.starpilot_planner.starpilot_cem.stop_light_detected + cem_path = (self.starpilot_planner.longitudinal_intent.stop_detected and controls_enabled and starpilot_toggles.force_stops and self.starpilot_planner.model_length < ACTIVATION_M and self.override_force_stop_timer <= 0 @@ -388,7 +388,7 @@ class StarPilotVCruise: elif self.standstill_force_stop_hold: self.force_stop_timer = max(self.force_stop_timer, 0.5) elif (self.forcing_stop and sm["carState"].standstill and not dash_active and - not self.starpilot_planner.starpilot_cem.stop_light_detected and not raw_model_stopped): + not self.starpilot_planner.longitudinal_intent.stop_detected and not raw_model_stopped): self.force_stop_timer = 0.0 else: self.force_stop_timer = max(self.force_stop_timer - DT_MDL * 0.25, 0.0) diff --git a/starpilot/controls/lib/unified_longitudinal_intent.py b/starpilot/controls/lib/unified_longitudinal_intent.py new file mode 100644 index 000000000..6105b8685 --- /dev/null +++ b/starpilot/controls/lib/unified_longitudinal_intent.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +import numpy as np + +from openpilot.common.constants import CV +from openpilot.common.filter_simple import FirstOrderFilter +from openpilot.common.realtime import DT_MDL +from openpilot.starpilot.common.experimental_state import CEStatus + + +MODEL_STOP_TIME = 7.0 +MODEL_STOP_ENTER = 0.63 +MODEL_STOP_EXIT = 0.28 +MODEL_STOP_FILTER_TIME = 0.35 +SLOW_LEAD_FILTER_TIME = 0.35 +TURN_VETO_MAX_SPEED = 15.0 * CV.MPH_TO_MS +TURN_VETO_MIN_STEERING_ANGLE = 45.0 +MAX_STOP_DETECTION_SPEED = 75.0 * CV.MPH_TO_MS + + +class UnifiedLongitudinalIntent: + """Small scene detector for continuous longitudinal planning. + + This class never selects a planner mode. It reports model stop intent and a + UI reason while the longitudinal planner continuously considers cruise, + model, curves, and both leads. + """ + + def __init__(self, starpilot_planner): + self.starpilot_planner = starpilot_planner + self.params_memory = starpilot_planner.params_memory + self.stop_filter = FirstOrderFilter(0.0, MODEL_STOP_FILTER_TIME, DT_MDL) + self.lead_filter = FirstOrderFilter(0.0, SLOW_LEAD_FILTER_TIME, DT_MDL) + self.stop_detected = False + self.status_value = CEStatus["OFF"] + self._last_status = None + + @staticmethod + def _committed_turn(v_ego, car_state, driving_in_curve): + if car_state.standstill or v_ego > TURN_VETO_MAX_SPEED: + return False + if not (car_state.leftBlinker or car_state.rightBlinker): + return False + return abs(float(car_state.steeringAngleDeg)) >= TURN_VETO_MIN_STEERING_ANGLE or driving_in_curve + + def _model_stop_candidate(self, v_ego, sm): + model = sm["modelV2"] + if bool(getattr(model.action, "shouldStop", False)): + return True + if not len(model.position.x): + return False + + model_length = max(float(model.position.x[-1]), 0.0) + end_speed = float(model.velocity.x[-1]) if len(model.velocity.x) else v_ego + stop_distance = max(v_ego * MODEL_STOP_TIME - 2.5, 0.0) + return model_length < stop_distance and end_speed < max(2.0, 0.2 * v_ego) + + @staticmethod + def _slow_lead_candidate(v_ego, sm): + candidates = [] + for lead in (sm["radarState"].leadOne, sm["radarState"].leadTwo): + if not bool(getattr(lead, "status", False)): + continue + d_rel = float(getattr(lead, "dRel", np.inf)) + v_lead = float(getattr(lead, "vLead", v_ego)) + model_prob = float(getattr(lead, "modelProb", 1.0 if getattr(lead, "radar", False) else 0.0)) + credible = bool(getattr(lead, "radar", False)) or model_prob >= 0.85 + if credible and d_rel < max(40.0, 3.0 * v_ego) and v_lead < v_ego - 0.75: + candidates.append(lead) + return bool(candidates) + + def update(self, v_ego, sm, starpilot_toggles): + car_state = sm["carState"] + force_stop = bool(getattr(self.starpilot_planner.starpilot_vcruise, "forcing_stop", False)) + stop_sign = bool(getattr(self.starpilot_planner.starpilot_vcruise, "stop_sign_confirmed", False)) + traffic_mode = bool(sm["starpilotCarState"].trafficModeEnabled) + turn_veto = self._committed_turn(v_ego, car_state, self.starpilot_planner.driving_in_curve) + + model_stop = self._model_stop_candidate(v_ego, sm) + model_stop &= not traffic_mode and not turn_veto and v_ego <= MAX_STOP_DETECTION_SPEED + self.stop_filter.update(model_stop) + + if force_stop or stop_sign: + self.stop_detected = True + self.stop_filter.x = 1.0 + elif self.stop_detected: + self.stop_detected = self.stop_filter.x > MODEL_STOP_EXIT + else: + self.stop_detected = self.stop_filter.x >= MODEL_STOP_ENTER + + slow_lead = self._slow_lead_candidate(v_ego, sm) + self.lead_filter.update(slow_lead) + slow_lead = self.lead_filter.x >= MODEL_STOP_ENTER + + signal = bool(car_state.leftBlinker or car_state.rightBlinker) and v_ego < 15.0 + curve = bool(self.starpilot_planner.road_curvature_detected or self.starpilot_planner.driving_in_curve) + slc_request = bool(self.starpilot_planner.starpilot_vcruise.slc.experimental_mode) + + if self.stop_detected: + status = CEStatus["STOP_LIGHT"] + elif slow_lead: + status = CEStatus["LEAD"] + elif signal: + status = CEStatus["SIGNAL"] + elif curve: + status = CEStatus["CURVATURE"] + elif slc_request: + status = CEStatus["SPEED_LIMIT"] + elif bool(getattr(starpilot_toggles, "longitudinal_model_preference", False)): + status = CEStatus["USER_OVERRIDDEN"] + else: + status = CEStatus["OFF"] + + self.status_value = status + if status != self._last_status: + self.params_memory.put_int("CEStatus", status) + self._last_status = status diff --git a/starpilot/controls/starpilot_card.py b/starpilot/controls/starpilot_card.py index 5a2678582..25801102c 100644 --- a/starpilot/controls/starpilot_card.py +++ b/starpilot/controls/starpilot_card.py @@ -6,14 +6,7 @@ from openpilot.common.params import Params from openpilot.selfdrive.car.cruise import CRUISE_LONG_PRESS, ButtonType from openpilot.selfdrive.selfdrived.events import ET -from openpilot.starpilot.common.experimental_state import ( - CCStatus, - CEStatus, - next_manual_cc_status, - next_manual_ce_status, - sync_manual_cc_state, - sync_manual_ce_state, -) +from openpilot.starpilot.common.experimental_state import toggle_longitudinal_model_preference from openpilot.starpilot.common.favorite_slots import toggle_favorite_slot from openpilot.starpilot.common.starpilot_utilities import is_FrogsGoMoo from openpilot.starpilot.common.starpilot_variables import ERROR_LOGS_PATH, GearShifter, NON_DRIVING_GEARS @@ -104,18 +97,7 @@ class StarPilotCard: if getattr(starpilot_toggles, "safe_mode", False): return - if starpilot_toggles.conditional_experimental_mode: - current_status = self.params_memory.get_int("CEStatus", default=CEStatus["OFF"]) - override_value = next_manual_ce_status(current_status, sm["selfdriveState"].experimentalMode) - self.params_memory.put_int("CEStatus", override_value) - sync_manual_ce_state(self.params, override_value) - elif getattr(starpilot_toggles, "conditional_chill_mode", False): - current_status = self.params_memory.get_int("CCStatus", default=CCStatus["OFF"]) - override_value = next_manual_cc_status(current_status, sm["selfdriveState"].experimentalMode) - self.params_memory.put_int("CCStatus", override_value) - sync_manual_cc_state(self.params, override_value) - else: - self.params.put_bool_nonblocking("ExperimentalMode", not sm["selfdriveState"].experimentalMode) + toggle_longitudinal_model_preference(self.params, self.params_memory) def update(self, carState, starpilotCarState, sm, starpilot_toggles): self.switchback_mode_enabled = self.params_memory.get_bool("SwitchbackModeEnabled") diff --git a/starpilot/controls/starpilot_planner.py b/starpilot/controls/starpilot_planner.py index 719a5e3dc..9440c0bfc 100644 --- a/starpilot/controls/starpilot_planner.py +++ b/starpilot/controls/starpilot_planner.py @@ -4,33 +4,23 @@ import math import time import cereal.messaging as messaging -import numpy as np from openpilot.common.constants import CV -from openpilot.common.filter_simple import FirstOrderFilter from openpilot.common.gps import get_gps_location_service from openpilot.common.params import Params from openpilot.common.realtime import DT_MDL from openpilot.selfdrive.car.cruise import V_CRUISE_MAX, V_CRUISE_UNSET -from openpilot.selfdrive.controls.lib.lead_behavior import ( - is_radarless_matched_follow_window, - should_hold_tracked_vision_lead, - should_track_lead, -) -from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST, STOP_DISTANCE +from openpilot.selfdrive.controls.lib.longitudinal_mpc_lib.long_mpc import A_CHANGE_COST, DANGER_ZONE_COST, J_EGO_COST from openpilot.starpilot.common.starpilot_utilities import calculate_lane_width, calculate_road_curvature -from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, MINIMUM_LATERAL_ACCELERATION, PLANNER_TIME, THRESHOLD -from openpilot.starpilot.controls.lib.conditional_chill_mode import ConditionalChillMode -from openpilot.starpilot.controls.lib.conditional_experimental_mode import ConditionalExperimentalMode +from openpilot.starpilot.common.starpilot_variables import CRUISING_SPEED, MINIMUM_LATERAL_ACCELERATION, PLANNER_TIME from openpilot.starpilot.controls.lib.starpilot_acceleration import StarPilotAcceleration from openpilot.starpilot.controls.lib.starpilot_events import StarPilotEvents from openpilot.starpilot.controls.lib.starpilot_following import StarPilotFollowing from openpilot.starpilot.controls.lib.starpilot_vcruise import StarPilotVCruise +from openpilot.starpilot.controls.lib.unified_longitudinal_intent import UnifiedLongitudinalIntent from openpilot.starpilot.controls.lib.weather_checker import WeatherChecker -RADARLESS_TRACK_HOLD_TIME = 0.45 - def _sanitize_json_value(value): if isinstance(value, float): @@ -52,11 +42,10 @@ class StarPilotPlanner: self.params_memory = Params(memory=True) self.starpilot_acceleration = StarPilotAcceleration(self) - self.starpilot_cem = ConditionalExperimentalMode(self) - self.starpilot_ccm = ConditionalChillMode(self, self.starpilot_cem) self.starpilot_events = StarPilotEvents(self, error_log, ThemeManager) self.starpilot_following = StarPilotFollowing(self) self.starpilot_vcruise = StarPilotVCruise(self) + self.longitudinal_intent = UnifiedLongitudinalIntent(self) self.starpilot_weather = WeatherChecker(self) self.driving_in_curve = False @@ -82,7 +71,6 @@ class StarPilotPlanner: self._lane_width_counter = 0 self.lateral_acceleration = 0 self.model_length = 0 - self.lead_path_y = 0 self.road_curvature = 0 self.time_to_curve = 0 self.v_cruise = 0 @@ -91,9 +79,6 @@ class StarPilotPlanner: self.gps_location_service = get_gps_location_service(self.params) - self.tracking_lead_filter = FirstOrderFilter(0, 0.5, DT_MDL) - self.radarless_follow_hold_until = 0.0 - def shutdown(self): self.starpilot_vcruise.slc.shutdown() self.starpilot_weather.executor.shutdown(wait=False, cancel_futures=True) @@ -189,13 +174,6 @@ class StarPilotPlanner: self.CS_prev_right_blinker = CS.rightBlinker self.model_length = sm["modelV2"].position.x[-1] - model_position = sm["modelV2"].position - model_path_y = getattr(model_position, "y", []) - if len(model_path_y) == len(model_position.x): - self.lead_path_y = float(np.interp(self.lead_one.dRel, model_position.x, model_path_y)) - else: - self.lead_path_y = 0.0 - self.raw_model_stopped = self.model_length < CRUISING_SPEED * PLANNER_TIME self.model_stopped = self.raw_model_stopped or self.starpilot_vcruise.forcing_stop @@ -203,24 +181,11 @@ class StarPilotPlanner: self.road_curvature_detected = (1 / abs(self.road_curvature))**0.5 < v_ego > CRUISING_SPEED and not (sm["carState"].leftBlinker or sm["carState"].rightBlinker) - if not sm["carState"].standstill: - self.tracking_lead = self.update_lead_status(v_ego) + self.tracking_lead = bool(self.lead_one.status) self.starpilot_following.update(controls_enabled, v_ego, sm, starpilot_toggles) - conditional_tracking_active = controls_enabled or sm["starpilotCarState"].alwaysOnLateralEnabled - if conditional_tracking_active and bool(getattr(starpilot_toggles, "conditional_experimental_mode", False)): - # Keep CEM's filters warm in AOL so engagement can inherit the current scene. - self.starpilot_cem.update(v_ego, sm, starpilot_toggles) - self.starpilot_ccm.experimental_mode = True - elif conditional_tracking_active and bool(getattr(starpilot_toggles, "conditional_chill_mode", False)): - self.starpilot_ccm.update(v_ego, v_cruise, sm, starpilot_toggles) - self.starpilot_cem.experimental_mode = False - else: - self.starpilot_ccm.experimental_mode = True - self.starpilot_cem.experimental_mode = False - self.starpilot_cem.curve_detected = False - self.starpilot_cem.stop_sign_and_light(v_ego, sm, PLANNER_TIME - 2) + self.longitudinal_intent.update(v_ego, sm, starpilot_toggles) self.v_cruise = self.starpilot_vcruise.update(controls_enabled, now, time_validated, v_cruise, v_ego, sm, starpilot_toggles) @@ -231,52 +196,6 @@ class StarPilotPlanner: else: self.starpilot_weather.weather_id = 0 - def update_lead_status(self, v_ego): - following_lead = should_track_lead( - self.lead_one.status, - self.lead_one.dRel, - self.model_length, - STOP_DISTANCE, - v_ego, - v_lead=self.lead_one.vLead, - radar=bool(getattr(self.lead_one, "radar", False)), - ) - continuity_candidate = self.tracking_lead or self.tracking_lead_filter.x >= THRESHOLD * 0.6 - if not following_lead and continuity_candidate: - following_lead = should_hold_tracked_vision_lead( - self.lead_one.status, - self.lead_one.dRel, - self.model_length, - STOP_DISTANCE, - v_ego, - model_prob=float(getattr(self.lead_one, "modelProb", 0.0)), - y_rel=float(getattr(self.lead_one, "yRel", 0.0)), - path_y=self.lead_path_y, - radar=bool(getattr(self.lead_one, "radar", False)), - ) - now_t = time.monotonic() - lead_radar = bool(getattr(self.lead_one, "radar", False)) - t_follow = max(float(getattr(self.starpilot_following, "t_follow", 0.0)), 1.45) - matched_follow_window = self.lead_one.status and is_radarless_matched_follow_window( - v_ego, - self.lead_one.dRel, - self.lead_one.vLead, - t_follow, - radar=lead_radar, - lead_brake=max(0.0, -float(getattr(self.lead_one, "aLeadK", 0.0))), - lead_prob=float(getattr(self.lead_one, "modelProb", 0.0)), - ) - if matched_follow_window and (following_lead or self.tracking_lead or self.tracking_lead_filter.x >= THRESHOLD * 0.6): - self.radarless_follow_hold_until = now_t + RADARLESS_TRACK_HOLD_TIME - elif lead_radar or not self.lead_one.status: - self.radarless_follow_hold_until = 0.0 - - if not following_lead and matched_follow_window and now_t < self.radarless_follow_hold_until: - following_lead = True - - self.tracking_lead_filter.update(following_lead) - return self.tracking_lead_filter.x >= THRESHOLD - def publish(self, theme_updated, sm, pm, starpilot_toggles, serialized_toggles=""): starpilot_plan_send = messaging.new_message("starpilotPlan") starpilot_plan_send.valid = sm.all_checks(service_list=["carState", "controlsState", "selfdriveState", "radarState"]) @@ -293,16 +212,15 @@ class StarPilotPlanner: starpilotPlan.cscTraining = self.starpilot_vcruise.csc.enable_training starpilotPlan.desiredFollowDistance = int(self.starpilot_following.desired_follow_distance) - starpilotPlan.disableThrottle = self.starpilot_following.disable_throttle + starpilotPlan.disableThrottle = False starpilotPlan.trackingLead = self.tracking_lead - conditional_experimental_mode = False - if starpilot_toggles.conditional_experimental_mode: - conditional_experimental_mode = self.starpilot_cem.experimental_mode - elif starpilot_toggles.conditional_chill_mode: - conditional_experimental_mode = self.starpilot_ccm.experimental_mode - - starpilotPlan.experimentalMode = conditional_experimental_mode or self.starpilot_vcruise.slc.experimental_mode + starpilotPlan.experimentalMode = bool( + not getattr(starpilot_toggles, "safe_mode", False) and ( + starpilot_toggles.longitudinal_model_preference or + self.longitudinal_intent.status_value != 0 + ) + ) starpilotPlan.forcingStop = self.starpilot_vcruise.forcing_stop starpilotPlan.forcingStopLength = self.starpilot_vcruise.tracked_model_length @@ -327,7 +245,7 @@ class StarPilotPlanner: starpilotPlan.maxAcceleration = float(self.starpilot_acceleration.max_accel) starpilotPlan.minAcceleration = float(self.starpilot_acceleration.min_accel) - starpilotPlan.redLight = self.starpilot_cem.stop_light_detected + starpilotPlan.redLight = self.longitudinal_intent.stop_detected starpilotPlan.roadCurvature = self.road_curvature diff --git a/starpilot/controls/tests/test_starpilot_card.py b/starpilot/controls/tests/test_starpilot_card.py index 8b5ce9b49..e13c9bb20 100644 --- a/starpilot/controls/tests/test_starpilot_card.py +++ b/starpilot/controls/tests/test_starpilot_card.py @@ -70,7 +70,6 @@ def make_toggles(**overrides): "bookmark_via_cancel_long": False, "bookmark_via_cancel_very_long": False, "bookmark_via_lkas": False, - "conditional_experimental_mode": False, "experimental_mode_via_lkas": False, "force_coast_via_lkas": False, "lkas_allowed_for_aol": False, @@ -592,21 +591,20 @@ def test_pacifica_hybrid_main_aol_waits_for_set_press(monkeypatch, tmp_path): assert ret.alwaysOnLateralEnabled is False -def test_conditional_chill_wheel_override_cycles_manual_state(monkeypatch, tmp_path): +def test_wheel_override_temporarily_flips_model_preference(monkeypatch, tmp_path): monkeypatch.setattr(spc, "Params", FakeParams) monkeypatch.setattr(spc, "is_FrogsGoMoo", lambda: False) monkeypatch.setattr(spc, "ERROR_LOGS_PATH", tmp_path) card = spc.StarPilotCard(SimpleNamespace(brand="gm"), SimpleNamespace(alternativeExperience=0)) sm = make_sm() - toggles = make_toggles(conditional_chill_mode=True) - - sm["selfdriveState"].experimentalMode = True - card.handle_experimental_mode(sm, toggles) - assert card.params_memory.get_int("CCStatus") == spc.CCStatus["USER_CHILL"] + toggles = make_toggles() card.handle_experimental_mode(sm, toggles) - assert card.params_memory.get_int("CCStatus") == spc.CCStatus["OFF"] + assert card.params_memory.get_int("LongitudinalModelPreferenceOverride") == 1 + + card.handle_experimental_mode(sm, toggles) + assert card.params_memory.get_int("LongitudinalModelPreferenceOverride") == 0 def test_cancel_button_short_press_can_run_independent_mapping(monkeypatch, tmp_path): diff --git a/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json b/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json index a5b7e69cc..3c7e2454e 100644 --- a/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json +++ b/starpilot/system/the_galaxy/assets/components/tools/device_settings_layout.json @@ -589,123 +589,29 @@ "settings_tier": "advanced" }, { - "key": "ConditionalExperimental", - "label": "Conditional Experimental Mode", - "description": "Automatically switch to \"Experimental Mode\" when set conditions are met. Allows the model to handle challenging situations with smarter decision making.", - "data_type": "bool", - "ui_type": "toggle", - "is_parent_toggle": true, - "settings_tier": "simple" - }, - { - "key": "PersistExperimentalState", - "label": "Persist Experimental State", - "description": "Keep your manual Conditional Experimental override through reboots until you manually clear it.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CESpeed", - "label": "Below", - "description": "Switch to \"Experimental Mode\" when driving below this speed without a lead to help openpilot handle low-speed situations more smoothly.", + "key": "LongitudinalModelPreference", + "label": "Longitudinal Preference", + "description": "Set-Speed First prioritizes steady cruise on open roads. Model First gives the driving model more influence. Both use the same lead and stop safety.", "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CESpeedLead", - "label": "Below (With Lead)", - "description": "Switch to \"Experimental Mode\" when driving below this speed with a lead.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CECurves", - "label": "Curve Detected Ahead", - "description": "Switch to \"Experimental Mode\" when a curve is detected to allow the model to set an appropriate speed for the curve.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CEStopLights", - "label": "\\\"Detected\\\" Stop Lights/Signs", - "description": "Switch to \"Experimental Mode\" whenever the driving model \"detects\" a red light or stop sign.\n\nDisclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CELead", - "label": "Lead Detected Ahead", - "description": "Switch to \"Experimental Mode\" when a slower or stopped vehicle is detected. Can make braking smoother and more reliable on some vehicles.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalExperimental", - "is_parent_toggle": true, - "settings_tier": "simple" - }, - { - "key": "CESlowerLead", - "label": "Slower Lead", - "description": "Switch to \"Experimental Mode\" when a slower lead vehicle is detected ahead.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CELead", - "settings_tier": "simple" - }, - { - "key": "CEStoppedLead", - "label": "Stopped Lead", - "description": "Switch to \"Experimental Mode\" when a stopped lead vehicle is detected ahead.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CELead", - "settings_tier": "simple" - }, - { - "key": "CEModelStopTime", - "label": "Predicted Stop In", - "description": "Switch to \"Experimental Mode\" when openpilot predicts a stop within the set time. This is usually triggered when the model \"sees\" a red light or stop sign ahead.\n\nDisclaimer: openpilot does not explicitly detect traffic lights or stop signs. In \"Experimental Mode\", openpilot makes end-to-end driving decisions from camera input, which means it may stop even when there's no clear reason!", - "data_type": "float", - "ui_type": "numeric", - "min": 0.0, - "max": 9.0, - "parent_key": "ConditionalExperimental", - "settings_tier": "simple" - }, - { - "key": "CESignalSpeed", - "label": "Turn Signal Below", - "description": "Switch to \"Experimental Mode\" when using a turn signal below the set speed to allow the model to choose an appropriate speed for smoother left and right turns.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalExperimental", + "ui_type": "dropdown", + "options": [ + { + "value": 0, + "label": "Set-Speed First" + }, + { + "value": 1, + "label": "Model First" + } + ], "settings_tier": "simple" }, { "key": "ShowCEMStatus", - "label": "Status Widget", - "description": "Show which condition triggered \"Experimental Mode\" on the driving screen.", + "label": "Longitudinal Status", + "description": "Show which constraint is currently influencing the unified longitudinal planner.", "data_type": "bool", "ui_type": "toggle", - "parent_key": "ConditionalExperimental", "settings_tier": "simple" }, { @@ -1860,87 +1766,6 @@ "parent_key": "SpeedLimitController", "settings_tier": "advanced" }, - { - "key": "ConditionalChill", - "label": "Conditional Chill Mode", - "description": "Keep \"Experimental Mode\" on by default, but temporarily switch to \"Chill Mode\" in simple cruising scenes where speed holding is usually better.", - "data_type": "bool", - "ui_type": "toggle", - "is_parent_toggle": true, - "settings_tier": "advanced" - }, - { - "key": "PersistChillState", - "label": "Persist Chill State", - "description": "Keep your manual Conditional Chill override through reboots until you manually clear it.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "CCMSpeed", - "label": "Above", - "description": "Switch to \"Chill Mode\" on open roads above this speed when no lead is detected and the car is still below the set speed.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "CCMSpeedLead", - "label": "Above (With Lead)", - "description": "Switch to \"Chill Mode\" when following a stable lead above this speed.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "CCMLead", - "label": "Stable Lead Ahead", - "description": "Switch to \"Chill Mode\" when following a steady, well-tracked lead vehicle at cruising speeds.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "CCMLaunchAssist", - "label": "Launch Assist", - "description": "Temporarily switch to \"Chill Mode\" when starting from a stop if planner is already allowing throttle. Useful if your car launches too slowly from lights or stop signs.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "CCMSetSpeedMargin", - "label": "Set Speed Margin", - "description": "How far below the set speed the car must be before open-road Conditional Chill can engage.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 15.0, - "step": 1.0, - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, - { - "key": "ShowCCMStatus", - "label": "Status Widget", - "description": "Show which condition triggered \"Chill Mode\" on the driving screen.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "ConditionalChill", - "settings_tier": "advanced" - }, { "key": "SLCAbbreviatedSources", "label": "Show Abbreviated Icon Sources", diff --git a/starpilot/system/the_galaxy/tests/test_device_settings_layout.py b/starpilot/system/the_galaxy/tests/test_device_settings_layout.py index 3fe48bf4b..704e20199 100644 --- a/starpilot/system/the_galaxy/tests/test_device_settings_layout.py +++ b/starpilot/system/the_galaxy/tests/test_device_settings_layout.py @@ -43,7 +43,7 @@ def test_galaxy_layout_contains_basic_mode_controls(): assert {"AlwaysOnLateral", "LaneChanges", "QOLLateral"} <= sections["Lateral (Steering)"].keys() assert { - "ConditionalExperimental", + "LongitudinalModelPreference", "CurveSpeedController", "AccelerationProfile", "DecelerationProfile", @@ -86,7 +86,7 @@ def test_requested_simple_and_advanced_settings_tiers(): assert lateral[key]["settings_tier"] == "advanced" for key in ( - "ConditionalExperimental", + "LongitudinalModelPreference", "CurveSpeedController", "LongitudinalTune", "AccelerationProfile", @@ -102,7 +102,6 @@ def test_requested_simple_and_advanced_settings_tiers(): "TacoTune", "NavLongitudinalAllowed", "SpeedLimitController", - "ConditionalChill", ): assert longitudinal[key]["settings_tier"] == "advanced" diff --git a/starpilot/system/the_galaxy/the_galaxy.py b/starpilot/system/the_galaxy/the_galaxy.py index aeedda037..c58580a00 100644 --- a/starpilot/system/the_galaxy/the_galaxy.py +++ b/starpilot/system/the_galaxy/the_galaxy.py @@ -61,7 +61,6 @@ from openpilot.starpilot.common.maps_catalog import ( schedule_label, schedule_param_value, ) -from openpilot.starpilot.common.experimental_state import sync_persist_chill_state, sync_persist_experimental_state from openpilot.starpilot.common.favorite_slots import ( FAVORITE_ACTION_OPTIONS, FAVORITE_SLOTS_PARAM, @@ -936,15 +935,7 @@ _TROUBLESHOOT_PERSONALITY_KEYS = [ ] _TROUBLESHOOT_CEM_KEYS = [ - "ConditionalExperimental", - "CESpeed", - "CESpeedLead", - "CECurves", - "CELead", - "CESlowerLead", - "CEStoppedLead", - "CEModelStopTime", - "CESignalSpeed", + "LongitudinalModelPreference", "ShowCEMStatus", ] @@ -4510,22 +4501,6 @@ def setup(app): "updated": updated, }), 200 - if key in {"ConditionalExperimental", "ConditionalChill"}: - enabled = str_val.strip() in ("1", "true", "True") - params.put_bool(key, enabled) - - updated = {key: enabled} - if enabled: - other_key = "ConditionalChill" if key == "ConditionalExperimental" else "ConditionalExperimental" - params.put_bool(other_key, False) - updated[other_key] = False - - update_starpilot_toggles() - return jsonify({ - "message": f"Parameter '{key}' updated successfully.", - "updated": updated, - }), 200 - if key == "CustomAccelProfile": enabled = str_val.strip() in ("1", "true", "True") params.put_bool(key, enabled) @@ -4545,30 +4520,6 @@ def setup(app): "updated": updated, }), 200 - if key == "PersistExperimentalState": - enabled = str_val.strip() in ("1", "true", "True") - sync_persist_experimental_state(params, params_memory, enabled) - update_starpilot_toggles() - return jsonify({ - "message": f"Parameter '{key}' updated successfully.", - "updated": { - "PersistExperimentalState": enabled, - "PersistedCEStatus": params.get_int("PersistedCEStatus", default=0), - }, - }), 200 - - if key == "PersistChillState": - enabled = str_val.strip() in ("1", "true", "True") - sync_persist_chill_state(params, params_memory, enabled) - update_starpilot_toggles() - return jsonify({ - "message": f"Parameter '{key}' updated successfully.", - "updated": { - "PersistChillState": enabled, - "PersistedCCStatus": params.get_int("PersistedCCStatus", default=0), - }, - }), 200 - if key == "IsRHD": enabled = str_val.strip() in ("1", "true", "True") params.put_bool("IsRHD", enabled) diff --git a/tools/StarPilot/generate_galaxy_layout.py b/tools/StarPilot/generate_galaxy_layout.py index 1ad9153a7..76fbc9fa2 100755 --- a/tools/StarPilot/generate_galaxy_layout.py +++ b/tools/StarPilot/generate_galaxy_layout.py @@ -25,6 +25,26 @@ DROPDOWN_MAPPING = { # Custom controls implemented outside the tuple vectors in Qt settings panels. # Inject these so regenerated galaxy layouts retain equivalent functionality. INJECTED_SECTION_PARAMS = { + "Longitudinal (Speed & Following)": [ + { + "key": "LongitudinalModelPreference", + "label": "Longitudinal Preference", + "description": "Set-Speed First prioritizes steady cruise on open roads. Model First gives the driving model more influence. Both use the same lead and stop safety.", + "data_type": "int", + "ui_type": "dropdown", + "options": [ + {"value": 0, "label": "Set-Speed First"}, + {"value": 1, "label": "Model First"}, + ], + }, + { + "key": "ShowCEMStatus", + "label": "Longitudinal Status", + "description": "Show which constraint is currently influencing the unified longitudinal planner.", + "data_type": "bool", + "ui_type": "toggle", + }, + ], "Vehicle": [ { "key": "CarMake", @@ -61,13 +81,35 @@ INJECTED_SECTION_PARAMS = { # Keys explicitly hidden from The Galaxy's generic settings UI. HIDDEN_KEYS = { + "CCMLaunchAssist", + "CCMLead", + "CCMSetSpeedMargin", + "CCMSpeed", + "CCMSpeedLead", + "CECurves", + "CECurvesLead", + "CELead", + "CEModelStopTime", + "CESignalLaneDetection", + "CESignalSpeed", + "CESlowerLead", + "CESpeed", + "CESpeedLead", + "CEStopLights", + "CEStoppedLead", + "ConditionalChill", + "ConditionalExperimental", "FrogsGoMoosTweak", "HumanAcceleration", "DisableWideRoad", "LockDoorsTimer", "NewLongAPI", - "ToyotaDoors", + "PersistChillState", + "PersistExperimentalState", "ReverseCruise", + "ShowCCMStatus", + "ShowCEMStatus", + "ToyotaDoors", } HIDDEN_SECTION_NAMES = {"Model & Customization"} @@ -168,8 +210,6 @@ PARENT_KEYS_MAPPING = { "longitudinal_settings.cc": { "advancedLongitudinalTuneKeys": "AdvancedLongitudinalTune", "aggressivePersonalityKeys": "AggressivePersonalityProfile", - "conditionalChillKeys": "ConditionalChill", - "conditionalExperimentalKeys": "ConditionalExperimental", "curveSpeedKeys": "CurveSpeedController", "customDrivingPersonalityKeys": "CustomPersonalities", "longitudinalTuneKeys": "LongitudinalTune", @@ -546,58 +586,8 @@ def parse_cpp_file(filename): if key in child_to_parent: s["parent_key"] = child_to_parent[key] if key in ALL_PARENT_KEYS: s["is_parent_toggle"] = True - if key == "CELead": - s["is_parent_toggle"] = True - items.append(s) - # Mirror CELead's split sub-toggles from StarPilotButtonToggleControl. - if key == "CELead": - items.extend([ - { - "key": "CESlowerLead", - "label": "Slower Lead", - "description": "Switch to \"Experimental Mode\" when a slower lead vehicle is detected ahead.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CELead", - }, - { - "key": "CEStoppedLead", - "label": "Stopped Lead", - "description": "Switch to \"Experimental Mode\" when a stopped lead vehicle is detected ahead.", - "data_type": "bool", - "ui_type": "toggle", - "parent_key": "CELead", - }, - ]) - - # Mirror CESpeed/CCMSpeed's dual sliders (with-lead variants) from Qt. - if key == "CESpeed": - items.append({ - "key": "CESpeedLead", - "label": "Below (With Lead)", - "description": "Switch to \"Experimental Mode\" when driving below this speed with a lead.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalExperimental", - }) - elif key == "CCMSpeed": - items.append({ - "key": "CCMSpeedLead", - "label": "Above (With Lead)", - "description": "Switch to \"Chill Mode\" when following a stable lead above this speed.", - "data_type": "int", - "ui_type": "numeric", - "min": 0.0, - "max": 99.0, - "step": 1.0, - "parent_key": "ConditionalChill", - }) - return items

s3(v0}$Rn;1j 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