From 22408781f7d7df5ff0395f80c1b15d6407acd0ff Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Fri, 29 Jul 2022 13:52:24 -0700 Subject: [PATCH] Remove RHD toggle: determine by driver side instead (#24802) * driverview * auto choose * useless * remove * modeld not use toggle * remove from params * should have commissue anyway * delete icon file * deal with init more elegantly and prohibit switching when engaged * nonblock save when not unstable * filter very low speeds * a few more secs dont harm * draw icon * match * radius * use const * ref commit * new transs * put_bool_nonblocking * 5k route tune * ref comm Co-authored-by: Comma Device --- common/params.cc | 2 +- .../offroad/icon_openpilot_mirrored.png | Bin 18150 -> 0 bytes selfdrive/modeld/modeld.cc | 5 +- selfdrive/modeld/models/driving.cc | 8 +- selfdrive/modeld/models/driving.h | 2 +- selfdrive/monitoring/dmonitoringd.py | 9 +- selfdrive/monitoring/driver_monitor.py | 20 ++- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/ui/qt/offroad/driverview.cc | 5 +- selfdrive/ui/qt/offroad/settings.cc | 6 - selfdrive/ui/qt/onroad.cc | 4 +- selfdrive/ui/qt/onroad.h | 2 + selfdrive/ui/translations/main_ko.ts | 156 +++++++++--------- selfdrive/ui/translations/main_zh-CHS.ts | 156 +++++++++--------- selfdrive/ui/translations/main_zh-CHT.ts | 156 +++++++++--------- 15 files changed, 270 insertions(+), 263 deletions(-) delete mode 100644 selfdrive/assets/offroad/icon_openpilot_mirrored.png diff --git a/common/params.cc b/common/params.cc index 1ead28d6cd..11b24fe9c1 100644 --- a/common/params.cc +++ b/common/params.cc @@ -124,7 +124,7 @@ std::unordered_map keys = { {"IsMetric", PERSISTENT}, {"IsOffroad", CLEAR_ON_MANAGER_START}, {"IsOnroad", PERSISTENT}, - {"IsRHD", PERSISTENT}, + {"IsRhdDetected", PERSISTENT}, {"IsTakingSnapshot", CLEAR_ON_MANAGER_START}, {"IsTestedBranch", CLEAR_ON_MANAGER_START}, {"IsUpdateAvailable", CLEAR_ON_MANAGER_START}, diff --git a/selfdrive/assets/offroad/icon_openpilot_mirrored.png b/selfdrive/assets/offroad/icon_openpilot_mirrored.png deleted file mode 100644 index 23a7d5a5528b7811887b68448dad93be1705e48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18150 zcmW(+1zgi_6Cd3@y1PdA=k@iC{mJ2OGrrb?*D#1 ztLORMbI(0@Pu+cQNhU_xB!mov004kQS4ZOs0DuYn?~RX*uGxJV=868oc2PA{1ppc{ zi0)uG=rWt5&J#lbAeaXLh>QgQZqQYcy8yr|Q2<~c3IKo$003I=k`9Oh`T?eczP1M7 zF(G537hNLo*0Fwx{zg*)>;dmvT+h%y@ceWQHSvC7;~x zxe2|q2_|=DJZ1Ys?_+P_LQHp%(q%+9RWX8M4^MeQdT#-!EQ-PeE{o!fRPa1UznDbh zlXZOj+K4^Wz^Dd_+6IN&0gu;HQ4Wk!$usIPj=rfC7U_yW+PrhxJjccGd1X`wU#UOA}oiLkD&!|2CSy zft02=4CR|+1*yVU0HwiQT160DlH08R}+yDHlxh>P5BTp&Smilup7VLvu}KuSO-;DQ=0l_ znHH3QJQye*_I8m&NMlSZO^qpU0B1MyQr5^ucYPsYj4mEl;Mw@LnoIsUF#5#LPbH)| z`Hn8uQrZDK9@b_pBE%I0sUnZ0o}u|O%VJ)g8%yZG6A$C#dH&cR@r^Guj@pO5V?Feb zdLWefrizv4z1>w3L!2=}L0FTvnY!#5GxdC>a?dcfx*Pjg6hqw0Kx|=ETH8cQlpe<@ z!@0Jy!IMt!G=?~JD+bysB5-+5^XtSW2Kz1dyGs8JQYk|16Q-5;aT6^YZOR5Z)~bA? z@4hh%ajycoJT)x8WzA>hI5~(a^_$pv!WpFqQ)bpNSK{@vcL0_PMIME#hVcG4Ti7kmyRK;8tB|JW~g z9<_@5GBf9qn@6Gbjc+sl#R>V6eys`RFOkqxnMq$adYF0|2dNdY-3d8^-hqiiBN^67 zMB8*{Rh)&{?Xu8oG3NmU{S&46JbrPSM3eDn0lHIrs;6fl*v zO8kQ4gA<@p&U}TeBl#O?iE2%3W~pSga^&~jC{r|TIy-J{mpq)L`p8p-I&U9U#Lfpxq||1;v= zG?69;fQo0Z zj=66WHJ>ozn0k}F(S4mv8G^t#Xi(beU2dT2B)!d#GJDHG&7W}B3;Mcq1|j%vVgm-1 z6=W<=V!Khi=4yZ-l$5k2+^EwRlB?xd4;m+thSazgDlH1E=00W`UM@-hP74-!gw&I{ zqzLo+wgN#!FWoQuOfPB9!1ymQZm{3)1rk=DU5P0U{OD> zsGG#_n#6buOk=IMM@084#nN*v9OJxB$(k%|VjsCmAqdd3!JifBx5fq|9uvb%AmTYK z83h`{8M-ueFZ!pabV@p{e~1R|;&lQ3gCXofO6s7#>4HcCcvdrTy5jIlsszN^MnBr1 z@5Q!^8%6kQ4J{<+DbJ@Y3ksPKQNdQ9roo6wYTvir<5!w7!LqdVvkcmL?nx=_ZBrAuG#g~PFd!)5aWmMBTC53! zQxwQKf$PTpFc9n-lQIjIWMn@?ItEJ64-3BT;|t^oPH-@u2`fm2(Z#!sd2dkTj#n}Z z4{OTm+2|Ui4jRrzkW%_oK?UCQWk;2jchhp7Na5m~QPcnpR3&UvjbsgNbhAAA|G*=g z@xN#+@mW!I&pxrytT-IfIUfk<2r)+@z~C*L=FE8rcG;#P8GE%8lY*eHzQ^M=(PRT$k`Lzf>sClsdbnb!mUn>j^mWe64=!#p@qUf~J*dWJ|; z4cE#pnK^NT>)O+|UzG-kS$`eG!L?YgvgHihf7uZ8Lw84G3`fvA^IR$`1#FA2R@-};FUUS^$t&s4_^aSM>ZKT%81>7gSPg?Oo80Xn@q&vR8?PptEP zD^=kp}t3heN8whFZHWJus~ zB>B9fH+$g1T&(B9PO$!G0;n*?ctzGdO)L)@;?-pRc)ae6l1r47427JWA8q$ukV*)g zScP-Qjytd(=TE6P!NkIaU8&agW}Lr4IcLplrgcVGbqj_u9BTYd_`I36+~f+wq~rvReCT;o1nPM&sFr&N zb6X=4PIuW!Hfm^Ji*%iMig$gRpL#YcorR z-$ZMtr(Ab~A5o_Q8!a;2Ruf-95!OMxULA=CC&?oFa!7e zsvvVcCA{FPWmu<8(}E^=6@WZz|4}no)0F1dtar6>vGRM4y0h3tUz?FUP(bE3=R8OO z0=D61K=51M`h9=bl$p^u^)=>aBhB)RViR8mHd!>1ygu z1a|M=z5UV&6lzwFXX#23DG(#0JMvM3f}v+K+dMRXFk<(rQG|bWiWHS4FdO&px_N71 z8I`5SedTYD>U{Pk)_kRZJS-R&We0we^sCh|p6r8N|I&Z73H1d>1K&%A(otDAr3=}i zA6_Zg)shQ5^nrU6x|jR2-*R3^e5elN?^jl1O%QlMI)=7?+~JwU&A;nUh`pS@U`p=2 zYPL34-jlu8+ffeHfg9UZ)?Sf~pSiGpI!dVCI_J!Fxj}r|vTGsG#I=|HHkEpp%+2z9 zfcRRby2|V|ecmtV&W|hH`ONe=XF^lC;UGf$-1H~9{#Gjq^doZ|U3eX25@Pl_=@1Cu z-Hj-8O&_dhIo7!nwErdxUDpT`xCQsF9%rSaG&lFXi?^B;*_o>)FK?iXzx>hQNq5dCHl451*QwCXnF^IF#23(e4-f z>~;3OADatzMsB(Z#363yWyV0jz$Uq+{YEw^RZ|+t+bz?a!1c8frTbe0aF50uY650H zVbGeNZVcIs`^n6J6V&1tn)LQ<^Bl?MaSpnc61n$n;Gz!1Y=1}K(=PVa9W~3Z=P)B{ zhw-=FFZA?X6@^48_trALf|SK;8WvXoqBo#o)J&%W-amuC}GwN$yom)l3Ae$j>j?fy!cAPy0Bp zTfq?A(Xama4YGa^RO086?7-OSE&X0D_XBE{n(6X7J$mX_5UPPcnP_2hHYEO#hxw^0 zdyQOib189%kbrJ-Q@>HMwI;ar4l8^C(sy6YX$lNLlr$+LRGA)jvQ{>^7Jh?7n2Rgh zVrzVAvj0sfy%Ax+XYb1h1P*c3^_d&3sta1_fm>r#{e3AnE#`C54Ip>XJ8}X!|8o4CZm~d9 zI7XOV7GQDBQ>vcBUt!IhY>e2a;k+Ah^%fbGfw68Sd%wERbN!qER)xh(v8}Pc-=anC zh1nhXI#9dlYUB3&VXFhZ;bhLQ)aeT;r5iHaLm2rydHra&H&@LkKI5HARoiADUDrdZ zW<#;5m;oH(RG1x8m~4;c{$RZ}hQ<7INn7{%Re4N6?k`h~%K&mCD;X_QpuT8sHgi`K z4WXg^uRYQmssq0WUrksTFU||kEQ0N)conwnVaY&ld_+P_zz^Rj-`5HQs%$nvY7hXx z;ALakg5m?7_-HWsQ@@w2nu}ylW!qZp56&pXq+hN3|I;sH&?KO|TR?Umsz#{OIVeWj zTN~UA^66!+XRUbLhqWR{x^)-(qvlFQ!fb%tt|u&b$IT=6*~%*&SK+7{4M;SeDRUjK z-Sq2+L@&5qu!+Tlpk5zTA5Xm~;D+;O_$%c{uzE73_`>+j?F-o5fs(;WqdSz~kW^k+ zRk3LV_Ab{J0TQTE_*&H;6`{>WGW7CZFy6q4gLB88M;yWYw1H%q^e%w&L9!5)#YLpR zKm_Xqk5g|KUxl+jdRJ+giGW2!)=FkKlTyyM87=TNu^ zV)l|0i}<@1xawO)#%@%V*rbhYw0g1lbGSe{FFW%aLcvI@v?PMJsyQQJH5GklCpxWN zBt}p#+9_K$r~$srUVFrdz0ZIQPuTD)6(;ltXSR(p{31G4Ij&YLRSP^ zqF*PnXedJ$=uEfDrcC%A#f^t=P=TqH%7=NmK|=}-E!~O8WY?HhSK2EIe8xJYDDe<#lWFnz& zqa(WER^Z%j>=V<_%~^I4M)5e^i=BY;?gaFZAXsm_NWwUN4W6b1iLhG9_W8bxNWK^q zyP-;P%>B-LUhLC#J-!3NqkFf>WE(Z^Q`h_&&_IfHN;16fbQ&YOYx+&9cM%v^=*$~3 zyoQZOOXK)7yze6XzJZjv_=9%`GQ zU%?0jPO@GR+7}d}#D8t<6}Yt+HxQURTDw!vv0IY}LSLR`{+Ljwc}m1y7gy|E_1pT> ztcy}`)fa1aA$6K?tj^oSXD&UU8_fp#A*#TsN`#^;vaW^Uc_P%!HtOlj(%(|}UzNMW zH+19&j@`RRtpZpJ@^pKp(jGYQTQ7$Dy)$G1Z@7$5J}O4YN1{XJ3-oe|Cp7&H{7o}4 zy)2=>rES@hbG2lv)JhU9YhVi*Z*jH705OIFjm$b69g(0AwQ2;D3# zq@Gm@OM{Qe(5Q+kE6+`X;~Y++PY+;vLSbv;T%Yu zTb;{AU9)Ldw=LLgCn+3R(4DuYyVH;u^h0wc7{TsgVKaGt!DJ$= z$c)L4e={)dv49A&T$E$?p62`OBLxPsb>V|f5x!Nrl>7;NH;PZ|^aY+xa^LvsQq3w9 z38kA|sZ@?#m$2Rc_FAQDf9Js*38I_&(A=)auTnr?@VrUR)@~t#sP_U9vUQsNk0%=U z;PfS^|L2LzvL$zT5mc17sk@n&x67-gMa@fzu=@fLymgu_H}c$S6M^%PWYhuY;=a!lc3tzeX~UY7#ikcRHw6I)C;Ah^zrj2d^fr!|y;VQ&6}Wd(h*Rnb7>8VF zmj5!(JBUmSNa=nV*E(;D&&5lP(DIwzI9GJ56kDk~VWB{RSv6 zp;r1p(&))FI{9CZf1*?Sw+&jKq5CFy*C%%SbS%+;f7e1~Z!cX3%3FE@$vb_B1Of9x9&;HcnDY~yL>CJ>RY z*?1giY@ZEEuvS4|q%7YPCpp`zyIH0FgNm^<+Gtr3$b4vHPPxX`*C$F!f-HD8w1j#p z{XKx7?LiUENcJpNE)dTg9eRt}!dIY8-!N=i-fyn`k3>JJn0E~@g1Ago#r@)B0KZa0@^2;iWly{9D#e2k=m`SGb+=V)6uDCO4+a6qj%fQYny` z&N5a!6MLTsp_z7Mf1F}d()i*AtYPl>`WA*vFR4zO4i zA(J8uNkPs#wlK6;0W1 zK0WCnZyB1ivZ%stw>iF|CaWWnGddho(ryWY#9izP812M>JpQ4&5che`0Fl*1Cw=5! zEjUh|m3tjA!|w-iuZ+r1LtzQAY0>eP4#GF(^B*aby-Fgd#ZvO|YY}e1AT54d`Z#Drbg38>7D#E^JZHf* z@>n*DmSCz8(axMHq9xYv1}2Qn_r~oR+7s8d1ePQr3&xA%K6*VQ_tv$%k~9WiX$n_C zsolA6n(C(HGbo--xLpY!lc!eVn~;@3_8dT6jf zW5serF@96klyvDsDON*2tmk&NmYAwt{ZHmrruF{N$4$ytb3mn5;^dnTQ+ZKhj70yqUDBQv%!@3x^xplozG{vCx_Y9mU^~KgCy| z`nT~_L5!~zaG8wI@7UDbDw!q>&!c7c0Tg2)uW_( z2KUQ`!_OW$(nS6%mbJp5DN<4CN1;&4%BHc!o`ZG%R+-~ z7jL+dbTv3Mxfmq1I%QRuKeq3h2zQNvcPOl2xzAwPUx{r`nXSa;pI@7*p?Al-RDuF0 z1==#$%an+Zw8bUu=6Goi0!3EOyO_5(rw2WituSBBkdw@k*F0rjnwy2KC-L;`u}6 z{h{bj-sB3WPZ^Exleb7i&1Pru+|Ne_;O&nI&Zb>8rfYQwq7(!vV*>^w*3#$8ysBN|r+-7B3hN7G7GVG>x8%X2Yn5pTt%*=@f7!idHBOWb&(RAQYb| zbicw~s0!;;yl8Y08`?M#;)>})2B2mgqn}#w0$x;K@Z~Kerf);C`Gp2RS}E(Efa<{s zb}jVY;d;W!z)-yWJ-E+fBsY-K8hsiX|2iD6)uLc-JYky3uLJq>#c$iUVLz>Y#mDl# zpEI%qY48qKGi8o17ji0dR^Oa>2W3vxc;!Z|*I(kfeRvG{W>SnVCqK(yAdOLgO> z63B`DfO9C5T!gX#8hZ@HX}!OKf(o2n)2Pvpupw26_=mkg+d) zobWb*NJM#y2o6NSfu>60QU{IgsDuD1pm@T*mWzGD+b-_oq}0l2L{D)r4W8GWxF8mG zlGlvO?Rh@Wd9LsRS4TfFJ3-9UCYqAhIgl$86CwLi*BwGxUKV6zqt;c>y^G13-z{h% z%igICu{*$v&D`7Q+LB2*$wBildhW~^w;C9mF}dsEubZNiDN~=9W4V&;2$VwW!RJh; zC&VWfvxzKV_ep~Z1PwHmqz;UrD7&EV%0HuMqm+006V7UCVLKK|3#Y3E`-E| zQ^f1Ln>f5}WYAoogYoF*PYhxm0)%ZupfGKr z7Mo<~9*A?$R={hTuyrFyzcNQR!Qy^m0znTBE9=l00NB>g#)t z(zs#h5u+PNs-iGUDqAE5A{jLC={SY@_-)#hiQj&JV3&qn>Dok_e&g$pyyU~2HfS-4-rePUn}k-vRalR2~nHRfvPS=&43XmZXuPVC}OE(Xw#HN z7`^|C|GGOgL?dgs)#PwJBJZiO|8&1l9Nmp#$Wbd`7wVIH^`A-*GB_b<)y0YG+eAKf zozeMk?9YK1E>UQv-@cDjp~u0o4$7rjFR(x}D3}pTR%x0#%*i=vO+ht zBBs?vTU#xSV+NFkrhfS77X1qQA1-^P!{>(%M9Mh9V^h_2;gWHqBZW!rT@VIkEdDyd`@Q(K$JumvVXv@U$AzOY2`_-Y})UV(!lnr}cJ zx~d(`gw-k>mwA;)+TdjhHR<9yV3S>qElyq{Jr0X@h#P?(rU&K|K=(C1C~GM{`^8Br zS_Jn0exAB%VF1dMyeMj=%E`Pl>hV{@aB>)6&VV zmWuciS#1~V+;p)hlmL*dZd5w?HyTRDl-06{3Sla?HRIWu~o1Razj?;>)0e1^v9wJ$ns_>;N{y-3tYr{G%NjeA=IUjC8 z{R&eWtZ5WdIy~cWd#^kWdGl$dcO;=jXsEE|TvJsAn$~ z@Qy1yr)U}FXsS+QtQ{@Ir~7+nmc9`4A6b*KxqK>F4aLswSS?;4J8*RUbop^zpey5h z$uO^5^(rvsR3LrC_&F7YBMw?XzkO?ugQQRw3CZE6g30R8m>sc=9V(B}od(Q%zkt8^ zjZCtE2Nl>Gd3{ z1T{@-se7dP5ZpWPv^oerM5_usfiP%Sy!CqmWL-=X=W&n7aF8o_L9f@x7ZY6ISY55L zwmM{DEkkAGuw4vda}k|89A-rY=U}?RKa`s7spOdab-#SPT!T$z&sPCeUh4lj%puhv z;C|Wk_yz4<_<2#^E{G>HqoVjKevwxd2-R!zM+P@bxLc&D>Bg#iDx#Nx*^`+mJ#?Cd z-kry)@=!!C0$7uB;${c zD&Z3drIZO#iwR!+KqpWhF5Enuc%9Pu3OAN~(AJ<|FltY&|v-?Jcfv zS}(q7O#SAY!nz~rU$D{5588nPj`pK+?xJ3$`klDsb&hiNq2`!c}9U}CV z{uRX4noOUcJ5WWAiF$2nbfp_0byj9xI}0^8T7gsFvJ*Wb-Bvv?MSBYlAXvsoU$+Wb ztClq$^x17K*i114wDn*pd{~tD+U?L+WOd5Loeqo4$AvTR%K z+aR+JZ4%dyQL7_%mB(A4ytjzWU<9qDEL@zSqU^Y#ZD^Pi#f?(s!l9ZOG-zBbACqL= zbm}4#jL_TK%#SJCmL}|VaY@(0I!jNX{0y(%i{=eY9~LUzz5g)9vB&m0(%8G_dM>;P zp50Dl__Eh047Q0herX>b{`HC|pnxcK;3@W*!V&NUYH2ov^Jdv9SqKHwC<&PPe)#Hp zTVYgQVBZKuTUdebNy>_r7*d9y)+g_J=0bG>uMO8Cxd%I%v0ECN_yMJ=Q6w|jeblM~ z0H~kgF5O7y$u9pYx-1*#n_wvOXD^N09?m}{pCb#nrp#isg>Q_FIPI}t_>ab!s^Vd2R!O*>d zsK3Nx+fs!8WLV28vKNokGx0=?H(n}d?2u2(uwKcjeQ{8A!1yGtG_@+$Iq_|SK>20;qH)C z=wp5N9PRpD@@>m8)0U+QKP+QI{Wtb?%p67AkS`e<=gzBiWgcH(idtXEgQiu!4h(kL zZ;KHQs7H8YX|^p)d9+-K^=dkqoZ$x7=PGG{V@JjMLb+Z-v!evXR;|zC=y6s^Ts~=s za7t)00ia6SBJEXAx3Eioi;*?qSdwaFnYS4pt;1!&u&AnGvO>H4e8`GZ9{9POMF*?} zfyuaX)E=jbV%Nam#BH*E5_wJZ1N_183*OvW_?Agk0U@o#_^QO_zhQWBoJ^sD-EPbF zuqB#0k!(`djQ}2>Jw#|qS_%tJgcSTt04L$lY_Q{145ra1PrsE4d?(uxS?^2t~f5W)Zu z`@~$J#sW0fHrNtj{%t;!Z?I8iTHqvE%O}nIJGG^RV!D8z!s>Q5W=Qcq+$&M(8Kv)~{XjLJu`6LoUiXJ4+ zsXC0$rHx?z8;*PAYLiv){QqeFHT$+&2VBXVi4iv4tZO;Eu|DSDT@`gl-#Brn6~@Hh zgg^eoH-G$FoWzqjopyLZk+Ab`@=j1}sq-3t`@!z>wOQo|^T>L*NUvuetlSTuJ#JO} zm^fry=q&80@R4zGby6Fra}g1<$Q(8DmTYd>LVG$s+{7~eu@FiFtaJTP%6x5EJ+{Wj z11+u|c(cdGO(S}LTGfmWu8lkfeeLu3W6IU%e`ji=hOrR5t1SKax9^$(ttLMGgqB9C zFH}cl_jWg7bq9O@%4U@`SGruI!C!t1(?C=(IDt4B>eOtiKu-sNq8#Sn+Y>OLwiZbx&7!QBea<@r=`D1W0W`(1M1S9by`s0IJa}7!_5{Z zbf3zw^0&=7Jgakv22TsK81+465zmY(F3nL+rFkU$Xb5PVdu<35SAzs*R0>#F7e$w* zZ(+(mBMx`_Gy9s!GML_Viz;g|aF!$mGW}Ed_bQaZ!uq3z*mp_6tAseZC~Nn6&@<<0 zYM||3I!t#5u`~AC;Hy9RqUzvCl`|8Q7nptK^Mv!Eb_--g$6{zJ;h#kEpdAt^^y2yu zJ53ou{6gF(do>(5y1NeS9>)tgu6u~PN6e(8Xm66a|5Fx? zD*jq$DK*U!xt$qp`o4l)A~p*g@jQLOIf^InQFFFwOPJ3~+_c*Mw%y zyU`CH!;xxV$1~1awk~Z=NYRtc2oy@F4oSEkUW#|-$5<5RwkP(%L%X~u2GpVBPY8C_ zMQr2Na|5$~BiEO(BemCMm{fl20`DODfUZL9*-;JgiU8J?o70)h#DMo;``#1(%utV1!p~g+@auM5v zpehBuITQUGoQa+;%<~=`!;sN}qtPJxo(7%+<8Q=Am|}o+Hd|0VlCXCJ)Wp95${Cc| zWn+#e*M}%ahD0$(x>@0hxQF;QF^&`oY4(CzpC+qX(as$>Z0z=t<^D{It(C`4HWiaS zy&s(Lw2fzdt4_X|&bEvlSzNz}Ey_kyoH)y8@NNjhaNQ@bb)o3hgn$BjJ(5yLw8WWe zYJkNyicKWJS5t&)7ipW37n8$kU6T0H15p+R2xOdl%WYLjt<|Vj+3Rt+ zDUc#lx&c*Gm{32B3#m7>1mre+$PS*t(gRc<~0k-MC7*^CNStpIX16MPH3c8Bh{~b!pG@QaoEHqDF4hWr`%oEaGh-ST_e0(JV zm~1csT_{@8&Hv>llXpQ-9965wbGESrv>D5-|b`wYPC?O!uMmIEJ@Ud3NYx@BEFgq zo4SQROBFGB2F5?|7~bPqU)FCFduMaFHYH866%=Hf(mnCFQs7`ncU^mKlEs!W%Hg3s zD6gzBaI@DlTxD)_LR@b2h3XdqfQWTBNxEYw2gX8yfBWDI&-%g8&%XB~J5D4Vg*DH&rb70xrF+U(;T$pk+GTM~gV*{Or zAo9`wGtl=<`d+ZLS_FOoQ~B3Ed?OqR-<08OlQ-tkq9%4G3w|%|K(nQ=l2op21S;xo z8$QgTfpBH4W2e;r8N8jMo;$IuU2RQ~HeDCkPoMaEmQiAysuMa4H+q)7#kR+$fU>(; zN@gFI5?b5srtOVydwfUNKM-zqZ9?e<9!E$`K(X)WL)4mw4Bq^y#%Nmd>wksst9#o| ze;8;oP3mP;0>^Q>21?Ae4L8;%KtD>7;NARlnbN*ImHND;QP=;kkeyiv^KO`2Vb>XN z91?LHoaRYt(aEx~cVCidy}dzIWF5_Y#FOp593$ zF5L;rb?~iNwqt`1)-zh+A-Eg0kt`0?b=Ma>I6P}F`W^enwQe%I2@W?3u@iEm#-(Ro zTRTO}tB#950~+!&{!(RhGE3awX75P6To_f07had#Q*qeD*mLK9=P|!dS_^SOefk5W zS7FG1s^r7Y-!Y7L-850*I_Z{eYylGePA%i@Ajyi8p8tct1Ct zyCsSJoxX3+i?bSG+zt9DnsRFNDTlOLg{Lw0+#G01BhtVW5Z`BpP1E#Xxs?H>9hD~! z(lxp`NTzX!&MnTAT=nc;bBi%=wu~J6{mLRK!YX}bd;eG#vwi-C|4=B**CDm5=)#mv z^72%Xv2}9u4o^l8FFT>s0~B^YSkNf~((cKZa>mqcP|(gMp8lh)e{{OjLE}Wlsvl~f zY1{s>?-6?!xhIACVU%j!`7QXD@9q9y-veZwqw}6A(DBeNtnK}8>k&`sqn*X9;D2{_IlEZe zf1!AZJs+?@yvu=CbLP7@2Yh+{_$uNBUMzQ46w5dwiSc06Tj2n(uo!%}?B+$)j~#Qf z7;F*|Y&W<2^l%;pob zv|IneZGT6>7$38*7UbrJ{H6^;9W~cJe-NqH?tLw7S;oV(P(x~Tn2Ul8F@@=-zY5F6 zOEtK3Oo{bvQPVj+R?xcvC&_8&%O$R<|GBug;`=e?h#)68F0=#exze4N4w4Sq(^Sox z*~A?iAV+rHTZhjCZSj*XiUhqaTt8Ls7vL<{Y;XOAU>)OF8Yb8$DeON33xog>f8M*!x|@4VjO3{eCJzsyo9p0zgbG$5(u7E#RVD4Aev19B2o9>%QWyLR)TBO z*9orZNAzkliCC#lNN|gs|Z@#c7MN*0N@56;QT;#+1tx^Ym zwvE+rdTMBI9luED4OG%vy3G!Y{NM^}^pJwTI*ASFA3|j-`*aY@uDP+qz|dJ9nv_kH ze9C>jQ;#E35S_nazq9~?E4U_VBb1~m>au(T6gjBo%2uUym0-kNg>oy~}wNkf?K znHI25iVTYpD^-9%0XT9zDZ1Unm-<#e2^2O@+UjB<7 zGk;67t|w>bLjwM?@cse!9}fTC<*w)0yTYK2o!~io=|I(2>i?oYI0F;vW1x+NSK(3_ zR)8yo5h=2T_7`;rU3Q;~S8EPpEyM7iFiYOGwym#3o7 z^5!$Sx}vqQn%=SV1d8)iMaRU?`6M^=yl9R=LE#^(?#Bc-Z$&)>ig{^2uhYcB`>kBr zS;RBYG6+C3sfqy|%U=k16$vA&#eU4%MsMuWy(uh`TilHm@ri9t#&5#2o1{f?Y{q<` zi}p7vVsSncsgBHM!GZd3`t#}nga>QWZT#cuV`;27>Ny(ghT36G1c1--jY)QGb7@d* z^Q1}Fwx!=E;j8=aom~ooT$8g<0vuypl489&DT%cHLt*Jf;q$UL*}s0xV*#u%dgTgr zFrC&NB>HnbEk&tCsydsK6Hh6Q#6r-jAd+_|kNKSq5TzEfQ~c)x2Lj}`o@yH&t1wC| zmik(r1fOf@x=~ZGWBp7$d`3-xw4fu9srC%0%(C9q`!YZRnNVq40=5vxBRK& z&aHMCDN|lI*j~|`gnNa|G6ekmxfnagg3~8n5S7g=)x%Ifp_jk^v#;?Az`pn>jvyWs z+9--DByopDHwn1Lq|R|;8Kq&a(_i7d`BEhqi6gu0;a$5%a+v(3tRfBi6OqJrPVxx{RQPI-u3`V^J2 z?p2n@xPCR-LGK8+94q{eBV4OF2(~;#%z4nMpHYhZ0~R73!nCpZB3-1`BzJw1SGoEM z^B;H$g1-Lk(CzOXfu_7l;e0W|mzV^YhkI9>`^J{pop)bnJ}~XbYHvU#4|K|iGF-&d z*5s#V)lp&{`p*cA{7br`{2*8>YoMQ_lj%)B4^&X;x!g%8slIRG7U<%i3`bcR&55i* z!ZPv$vaSE{R7PO=1e;hz-Hlp}cw}<;*lt>A;0fLCd(p{on(`0V`e36Pgp>qR$RE+X zymZvdJUyTCEf7xjzk$1Rft{7yExHlwC6?iqxl`W1;XC=uB6S?h)jOcvP2f%tA%mBW z%g_Fx+OLaKXXi3|eD`{AubmIJ8p{8s{Ijba+r9?9i5{H6Kj+!^sXkL^|KMYf%^|^H z%|KP^wbhBiJZYA+dx%U~4{b1pTBYH_Q=0L;PMAV>-eW(i@~kUlZ$x--uz31!`nCxx z_;L-OI-tp6@qIfDFI11nx(#j9D5hRGFn`KJ5U4J^xh)AmiSIpM2J|+X<#v|1@Z+bx zo@(BaxBxVjxVYgJ>y7YdEqV6XMo;UG?1|~KUcKgao64SQs(I;j)j=k=G%{YznX7ja z5!#L)5*O6N<9<7H_8Q*dm#0`-L3wzfpI0eQ)iesM@s1SXXBpE&H3W~MyzPCtbY=FK zLS*I5<;L=vxAaSC|&%OmW^6J>M0CtbLCx5ah2eK zzT4Yd;q>-p$dSqW)b4RIzu-V{NV9#@-%Ww0``o`@q3ELWlB*RfE4H8g>XDsh9-5r8 zm`JMgZ$qW}l-i!aagwl!zNuPDmfJ5R0TZB);9Wf%;+e0gYBt2~;{!C|=R?1UBn0CR z?0uT}EFb=wW<7`8D8tydfK6xkt@M~NOsSG{2t~b;)(L{v?Py4b(=_2 zwT5X%(TzeRLXiN(HO%*=gjxPp40J`gaM6V~82?LkGlSXh(K!1nUy{ zibo&3zk>Z<8w0>Y6)|AKN*2fsKV#Z^pTd>gDZ|8d!gzP`Wa9KYPk7&2j5Ae~1YzId z&~Lh}EsR=6P#MuxI@>HdNdJb73tRuxj@Ykl>~bS@$ehO%e56iL0s+8fgpt_xFHf+; zHwjQav}(<1m2a9OqhVME19m+uzT(1S4+hGqDF6oaF|*EbB|rHV2mTkn*GBZVqZv?x z?T5*fa_VCc*L(44r#xm+m^mmM8-=zZ39ZAY&k3LeW7*d&Z#k#)P4ZvyQ$}pd4ihjs zGCagl_OSS2EaALzRfHNV`VLfylGfaW&M*gJdf~XUCH+QVuoto90i-4b+z8rX{O5f! zJ)alusc8$8s~trW(cm(muTI;2%~CE086lc=QSCUb-kG?JP5z!^)FW*%a4?{_AnIj| zJ5`i4VV_4|P{FTTSg|8G1lu(^fY%LUsvTm}7jBh)> zugf=6$et+pNnyOt>GQSP=)&((Ff;({!~Z&TC2V1nDv*{&%f$v|s{BI>aj2plD&oB! zT+kFu}2MERnL4K{@!IF`S64WuEa8E z60ZV}fGLX+9YjuT!rFvdD}t#~w(5W~8ifx}uQPi~HS*Sh$iRCSvgs44Ug|3z3GA&f z?T=)+*e6P}VNEoRRT&LDBk<^U>wzMr-_mgb-Z9X(*5|e7j*b0OE9}8yWX{a?n_aq+ zdi*qV2`z6u#tSPUN88`SZPj&2i%-aA=Sq+nRs%k%^{=1%ambAC`bqIW^(pa=-BTF< z^S$a?Xk);cP{2TO7nj?MXs$1f-Bn%Eo6x=Ww!t!%510UGJHX>-XN*Yu!d-z~ zAwP4GsC8&s-j5f5ftQYXe$bMMz8`1FbRe2UWRFnjSI_n!C3fZ~Dh2xP#gC0NAvpb^ zc#X}E$3UD=ErLYdvR5{xI zal*Pf5j}L}s^UOE8FD2c$Wt;$b!C6_nly^5-Pi$K_?k$12fSCymOv6JFe{X~SkmM8GJUrYPaFA3(z7 z1iV3CoFE=spJHMgIK`>U?dOZ%PFmsT|lg$2zUZt}S#wNZv4`BamJd zZpwrvCO!NAe&3cMsg{7&7B5>~13Zwp@m~LAc3C5e16k=PWrm=2nM@ zS`xAo_0FX7V({a?b9tj*bw_N3k|IKUr-K_4>_>OcYUVA@+v#f}SG{f$?qA*!(vaAW zfl1lPoLskA@&?JPcztxa(xNG1ZGpB=R&$K$Ef1^qfwP6pJ8)`$ z(YyEz+JYgBRQe3875UNXVbx$P20G{Fv_Q#g!Gc#&CAxQB=b~R=VP{akO1{^i9;Mz; zZu1}()eTIf+fcRA@ye@)aAq%O)H|AW$I%_9{#Ja2A`*T^ywdH;X#nu2q?l`q5Km&o zJ)ni_hTN20@-UdkEzNvPy`6p^bwN5lCi6e6Bgz0{#IFnHn#PJXSn+zllX_^WVahSi zU|?|k;hj*V=tZ7Q--v)U@VLtw7NBDnWq9Gj&vxGZGq9?;s?t~)3z{&gFMAxnxDrFZ z82Q(BC_u*F-tWyC)t-07qbxChARdHjz4CQCxd?me^*GZ}Q_i07PROhrb05s{`57mo zaH?sc-Hb2iA`x2bsx-KUq;PmQ zq({|mL1&{rtDkbskFJdQ{4U{pPBXKtLL-D7`;+X0SzUCmEJ@kbsZ>ydo|{*w&AH~S z{?Q`F_BQqHiQq#WtQA}wCWp_Mp(a-t>L6oT2sS#ItN@r9EI{QOH0j2Z4c%IsGH$~| z9b_xtoU;tgf#iyG;cr|=7bp2?JDY42TlJEQY8@wel?NvJ1i;cDsex;3Tb0VTEpUy^ zr7Rq5u{%DHM_DE>)zo*L#8@p7kS@(1W{DlZ7;)%{>EY$5);zuBr~_|sP4z}>XMI%b z)e>Ir%eL*&ir|~ys8}nbpXhg#KXgmUdKRX z&i1$#h~xTxP6ep;zZ_lvkjk)HImiL~ot6^QS<%3!UM_ zKjMvpCR_meHdMbJLY<61m|Q!pP?(*-!)*vhJYzNirvp+2P+Rl8E}nd4(nGtcQD-0+ z_;Rf)LtT!BBGa<8!Kr9)A!;Y@SyIiQ|0>%6J^Ba*}ZXZI>;i7 z!ujj=d~iC-$P^WfQ$B3G^me$-G^8MHZUb#S(Ya{EZ2ZUaL`eZ`dRaOSye}RcD2bDi z#>ot# &extrinsics, bool wide_camera void run_model(ModelState &model, VisionIpcClient &vipc_client_main, VisionIpcClient &vipc_client_extra, bool main_wide_camera, bool use_extra_client) { // messaging PubMaster pm({"modelV2", "cameraOdometry"}); - SubMaster sm({"lateralPlan", "roadCameraState", "liveCalibration"}); + SubMaster sm({"lateralPlan", "roadCameraState", "liveCalibration", "driverMonitoringState"}); // setup filter to track dropped frames FirstOrderFilter frame_dropped_filter(0., 10., 1. / MODEL_FREQ); @@ -111,6 +111,7 @@ void run_model(ModelState &model, VisionIpcClient &vipc_client_main, VisionIpcCl // TODO: path planner timeout? sm.update(0); int desire = ((int)sm["lateralPlan"].getLateralPlan().getDesire()); + bool is_rhd = ((bool)sm["driverMonitoringState"].getDriverMonitoringState().getIsRHD()); frame_id = sm["roadCameraState"].getRoadCameraState().getFrameId(); if (sm.updated("liveCalibration")) { auto extrinsic_matrix = sm["liveCalibration"].getLiveCalibration().getExtrinsicMatrix(); @@ -146,7 +147,7 @@ void run_model(ModelState &model, VisionIpcClient &vipc_client_main, VisionIpcCl } double mt1 = millis_since_boot(); - ModelOutput *model_output = model_eval_frame(&model, buf_main, buf_extra, model_transform_main, model_transform_extra, vec_desire, prepare_only); + ModelOutput *model_output = model_eval_frame(&model, buf_main, buf_extra, model_transform_main, model_transform_extra, vec_desire, is_rhd, prepare_only); double mt2 = millis_since_boot(); float model_execution_time = (mt2 - mt1) / 1000.0; diff --git a/selfdrive/modeld/models/driving.cc b/selfdrive/modeld/models/driving.cc index 59c0b249d9..9bf7e62184 100644 --- a/selfdrive/modeld/models/driving.cc +++ b/selfdrive/modeld/models/driving.cc @@ -49,14 +49,12 @@ void model_init(ModelState* s, cl_device_id device_id, cl_context context) { #endif #ifdef TRAFFIC_CONVENTION - const int idx = Params().getBool("IsRHD") ? 1 : 0; - s->traffic_convention[idx] = 1.0; s->m->addTrafficConvention(s->traffic_convention, TRAFFIC_CONVENTION_LEN); #endif } ModelOutput* model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* wbuf, - const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool prepare_only) { + const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool is_rhd, bool prepare_only) { #ifdef DESIRE if (desire_in != NULL) { for (int i = 1; i < DESIRE_LEN; i++) { @@ -72,6 +70,10 @@ ModelOutput* model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* wbuf, } #endif + int rhd_idx = is_rhd; + s->traffic_convention[rhd_idx] = 1.0; + s->traffic_convention[1-rhd_idx] = 0.0; + // if getInputBuf is not NULL, net_input_buf will be auto net_input_buf = s->frame->prepare(buf->buf_cl, buf->width, buf->height, buf->stride, buf->uv_offset, transform, static_cast(s->m->getInputBuf())); s->m->addImage(net_input_buf, s->frame->buf_size); diff --git a/selfdrive/modeld/models/driving.h b/selfdrive/modeld/models/driving.h index 97e65fbc0e..d551bdf488 100644 --- a/selfdrive/modeld/models/driving.h +++ b/selfdrive/modeld/models/driving.h @@ -268,7 +268,7 @@ struct ModelState { void model_init(ModelState* s, cl_device_id device_id, cl_context context); ModelOutput *model_eval_frame(ModelState* s, VisionBuf* buf, VisionBuf* buf_wide, - const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool prepare_only); + const mat3 &transform, const mat3 &transform_wide, float *desire_in, bool is_rhd, bool prepare_only); void model_free(ModelState* s); void model_publish(PubMaster &pm, uint32_t vipc_frame_id, uint32_t vipc_frame_id_extra, uint32_t frame_id, float frame_drop, const ModelOutput &net_outputs, uint64_t timestamp_eof, diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index c31e9da43b..35eee5b035 100755 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -3,7 +3,7 @@ import gc import cereal.messaging as messaging from cereal import car -from common.params import Params +from common.params import Params, put_bool_nonblocking from common.realtime import set_realtime_priority from selfdrive.controls.lib.events import Events from selfdrive.locationd.calibrationd import Calibration @@ -20,7 +20,7 @@ def dmonitoringd_thread(sm=None, pm=None): if sm is None: sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'controlsState', 'modelV2'], poll=['driverStateV2']) - driver_status = DriverStatus(rhd=Params().get_bool("IsRHD")) + driver_status = DriverStatus(rhd_saved=Params().get_bool("IsRhdDetected")) sm['liveCalibration'].calStatus = Calibration.INVALID sm['liveCalibration'].rpyCalib = [0, 0, 0] @@ -83,6 +83,11 @@ def dmonitoringd_thread(sm=None, pm=None): } pm.send('driverMonitoringState', dat) + # save rhd virtual toggle every 5 mins + if (sm['driverStateV2'].frameId % 6000 == 0 and + driver_status.wheelpos_learner.filtered_stat.n > driver_status.settings._WHEELPOS_FILTER_MIN_COUNT and + driver_status.wheel_on_right == (driver_status.wheelpos_learner.filtered_stat.M > driver_status.settings._WHEELPOS_THRESHOLD)): + put_bool_nonblocking("IsRhdDetected", driver_status.wheel_on_right) def main(sm=None, pm=None): dmonitoringd_thread(sm, pm) diff --git a/selfdrive/monitoring/driver_monitor.py b/selfdrive/monitoring/driver_monitor.py index 48d4303aa5..9ff3125c15 100644 --- a/selfdrive/monitoring/driver_monitor.py +++ b/selfdrive/monitoring/driver_monitor.py @@ -57,8 +57,9 @@ class DRIVER_MONITOR_SETTINGS(): self._POSE_OFFSET_MIN_COUNT = int(60 / self._DT_DMON) # valid data counts before calibration completes, 1min cumulative self._POSE_OFFSET_MAX_COUNT = int(360 / self._DT_DMON) # stop deweighting new data after 6 min, aka "short term memory" + self._WHEELPOS_CALIB_MIN_SPEED = 11 self._WHEELPOS_THRESHOLD = 0.5 - self._WHEELPOS_FILTER_MIN_COUNT = int(5 / self._DT_DMON) + self._WHEELPOS_FILTER_MIN_COUNT = int(15 / self._DT_DMON) # allow 15 seconds to converge wheel side self._RECOVERY_FACTOR_MAX = 5. # relative to minus step change self._RECOVERY_FACTOR_MIN = 1.25 # relative to minus step change @@ -115,7 +116,7 @@ class DriverBlink(): self.right_blink = 0. class DriverStatus(): - def __init__(self, rhd=False, settings=DRIVER_MONITOR_SETTINGS()): + def __init__(self, rhd_saved=False, settings=DRIVER_MONITOR_SETTINGS()): # init policy settings self.settings = settings @@ -138,7 +139,8 @@ class DriverStatus(): self.driver_distracted = False self.driver_distraction_filter = FirstOrderFilter(0., self.settings._DISTRACTED_FILTER_TS, self.settings._DT_DMON) self.wheel_on_right = False - self.rhd_toggled = rhd + self.wheel_on_right_last = None + self.wheel_on_right_default = rhd_saved self.face_detected = False self.terminal_alert_cnt = 0 self.terminal_time = 0 @@ -227,13 +229,18 @@ class DriverStatus(): def update_states(self, driver_state, cal_rpy, car_speed, op_engaged): rhd_pred = driver_state.wheelOnRightProb - if car_speed > 0.01: + # calibrates only when there's movement and either face detected + if car_speed > self.settings._WHEELPOS_CALIB_MIN_SPEED and (driver_state.leftDriverData.faceProb > self.settings._FACE_THRESHOLD or + driver_state.rightDriverData.faceProb > self.settings._FACE_THRESHOLD): self.wheelpos_learner.push_and_update(rhd_pred) if self.wheelpos_learner.filtered_stat.n > self.settings._WHEELPOS_FILTER_MIN_COUNT: self.wheel_on_right = self.wheelpos_learner.filtered_stat.M > self.settings._WHEELPOS_THRESHOLD else: - self.wheel_on_right = rhd_pred > self.settings._WHEELPOS_THRESHOLD - driver_data = driver_state.rightDriverData if self.rhd_toggled else driver_state.leftDriverData + self.wheel_on_right = self.wheel_on_right_default # use default/saved if calibration is unfinished + # make sure no switching when engaged + if op_engaged and self.wheel_on_right_last is not None and self.wheel_on_right_last != self.wheel_on_right: + self.wheel_on_right = self.wheel_on_right_last + driver_data = driver_state.rightDriverData if self.wheel_on_right else driver_state.leftDriverData if not all(len(x) > 0 for x in (driver_data.faceOrientation, driver_data.facePosition, driver_data.faceOrientationStd, driver_data.facePositionStd, driver_data.readyProb, driver_data.notReadyProb)): @@ -243,6 +250,7 @@ class DriverStatus(): self.pose.roll, self.pose.pitch, self.pose.yaw = face_orientation_from_net(driver_data.faceOrientation, driver_data.facePosition, cal_rpy) if self.wheel_on_right: self.pose.yaw *= -1 + self.wheel_on_right_last = self.wheel_on_right self.pose.pitch_std = driver_data.faceOrientationStd[0] self.pose.yaw_std = driver_data.faceOrientationStd[1] model_std_max = max(self.pose.pitch_std, self.pose.yaw_std) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 22cc2442b1..35226a30eb 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -cfe79d760f161a46e48b60c1debe11b8f300e717 \ No newline at end of file +912413daa4c36a788cf2c801fc49829d46ae3072 \ No newline at end of file diff --git a/selfdrive/ui/qt/offroad/driverview.cc b/selfdrive/ui/qt/offroad/driverview.cc index 5bf70584a1..be8b84d45e 100644 --- a/selfdrive/ui/qt/offroad/driverview.cc +++ b/selfdrive/ui/qt/offroad/driverview.cc @@ -31,7 +31,6 @@ DriverViewScene::DriverViewScene(QWidget* parent) : sm({"driverStateV2"}), QWidg void DriverViewScene::showEvent(QShowEvent* event) { frame_updated = false; - is_rhd = params.getBool("IsRHD"); params.putBool("IsDriverViewEnabled", true); } @@ -60,7 +59,7 @@ void DriverViewScene::paintEvent(QPaintEvent* event) { cereal::DriverStateV2::Reader driver_state = sm["driverStateV2"].getDriverStateV2(); cereal::DriverStateV2::DriverData::Reader driver_data; - // is_rhd = driver_state.getWheelOnRightProb() > 0.5; + is_rhd = driver_state.getWheelOnRightProb() > 0.5; driver_data = is_rhd ? driver_state.getRightDriverData() : driver_state.getLeftDriverData(); bool face_detected = driver_data.getFaceProb() > 0.7; @@ -85,7 +84,7 @@ void DriverViewScene::paintEvent(QPaintEvent* event) { // icon const int img_offset = 60; - const int img_x = rect().left() + img_offset; + const int img_x = is_rhd ? rect().right() - FACE_IMG_SIZE - img_offset : rect().left() + img_offset; const int img_y = rect().bottom() - FACE_IMG_SIZE - img_offset; p.setOpacity(face_detected ? 1.0 : 0.2); p.drawPixmap(img_x, img_y, face_img); diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 0956f6c8dd..e6e21bd8d3 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -41,12 +41,6 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { tr("Receive alerts to steer back into the lane when your vehicle drifts over a detected lane line without a turn signal activated while driving over 31 mph (50 km/h)."), "../assets/offroad/icon_warning.png", }, - { - "IsRHD", - tr("Enable Right-Hand Drive"), - tr("Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat."), - "../assets/offroad/icon_openpilot_mirrored.png", - }, { "IsMetric", tr("Use Metric System"), diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index fbfa7e646d..0ab1424023 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -217,6 +217,7 @@ void NvgWindow::updateState(const UIState &s) { if (sm.frame % (UI_FREQ / 2) == 0) { setProperty("engageable", cs.getEngageable() || cs.getEnabled()); setProperty("dmActive", sm["driverMonitoringState"].getDriverMonitoringState().getIsActiveMode()); + setProperty("rightHandDM", sm["driverMonitoringState"].getDriverMonitoringState().getIsRHD()); } if (s.scene.calibration_valid) { @@ -381,7 +382,8 @@ void NvgWindow::drawHud(QPainter &p) { // dm icon if (!hideDM) { - drawIcon(p, radius / 2 + (bdr_s * 2), rect().bottom() - footer_h / 2, + int dm_icon_x = rightHandDM ? rect().right() - radius / 2 - (bdr_s * 2) : radius / 2 + (bdr_s * 2); + drawIcon(p, dm_icon_x, rect().bottom() - footer_h / 2, dm_img, blackColor(70), dmActive ? 1.0 : 0.2); } p.restore(); diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index dc1e69da2a..7f51a73510 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -39,6 +39,7 @@ class NvgWindow : public CameraViewWidget { Q_PROPERTY(bool engageable MEMBER engageable); Q_PROPERTY(bool dmActive MEMBER dmActive); Q_PROPERTY(bool hideDM MEMBER hideDM); + Q_PROPERTY(bool rightHandDM MEMBER rightHandDM); Q_PROPERTY(int status MEMBER status); public: @@ -62,6 +63,7 @@ private: bool engageable = false; bool dmActive = false; bool hideDM = false; + bool rightHandDM = false; bool has_us_speed_limit = false; bool has_eu_speed_limit = false; int status = STATUS_DISENGAGED; diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 9928a57e14..fe10008635 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -108,152 +108,152 @@ DevicePanel - + Dongle ID Dongle ID - + N/A N/A - + Serial Serial - + Driver Camera 운전자 카메라 - + PREVIEW 미리보기 - + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) 운전자 모니터링이 좋은 가시성을 갖도록 운전자를 향한 카메라를 미리 봅니다. (차량연결은 해제되어있어야 합니다) - + Reset Calibration 캘리브레이션 재설정 - + RESET 재설정 - + Are you sure you want to reset calibration? 캘리브레이션을 재설정하시겠습니까? - + Review Training Guide 트레이닝 가이드 다시보기 - + REVIEW 다시보기 - + Review the rules, features, and limitations of openpilot openpilot의 규칙, 기능 및 제한 다시보기 - + Are you sure you want to review the training guide? 트레이닝 가이드를 다시보시겠습니까? - + Regulatory 규제 - + VIEW 보기 - + Change Language 언어 변경 - + CHANGE 변경 - + Select a language 언어를 선택하세요 - + Reboot 재부팅 - + Power Off 전원 종료 - + openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required. openpilot은 장치를 좌측 또는 우측은 4° 이내, 위쪽 5° 또는 아래쪽은 8° 이내로 설치해야 합니다. openpilot은 지속적으로 보정되므로 리셋이 거의 필요하지 않습니다. - + Your device is pointed %1° %2 and %3° %4. 사용자의 장치가 %1° %2 및 %3° %4를 가리키고 있습니다. - + down 아래로 - + up 위로 - + left 좌측으로 - + right 우측으로 - + Are you sure you want to reboot? 재부팅 하시겠습니까? - + Disengage to Reboot 재부팅 하려면 해제하세요 - + Are you sure you want to power off? 전원을 종료하시겠습니까? - + Disengage to Power Off 전원을 종료하려면 해제하세요 @@ -294,7 +294,7 @@ DriverViewScene - + camera starting 카메라 시작중 @@ -498,20 +498,20 @@ location set mph - - + + MAX MAX - - + + SPEED SPEED - - + + LIMIT LIMIT @@ -710,33 +710,33 @@ location set SettingsWindow - + × × - + Device 장치 - - + + Network 네트워크 - + Toggles 토글 - + Software 소프트웨어 - + Navigation 네비게이션 @@ -975,89 +975,89 @@ location set SoftwarePanel - + Git Branch Git 브렌치 - + Git Commit Git 커밋 - + OS Version OS 버전 - + Version 버전 - + Last Update Check 최신 업데이트 검사 - + The last time openpilot successfully checked for an update. The updater only runs while the car is off. 최근에 openpilot이 업데이트를 성공적으로 확인했습니다. 업데이트 프로그램은 차량 연결이 해제되었을때만 작동합니다. - + Check for Update 업데이트 확인 - + CHECKING 확인중 - + Switch Branch 브랜치 변경 - + ENTER 입력하세요 - - + + The new branch will be pulled the next time the updater runs. 다음 업데이트 프로그램이 실행될 때 새 브랜치가 적용됩니다. - + Enter branch name 브랜치명 입력 - + UNINSTALL 제거 - + Uninstall %1 %1 제거 - + Are you sure you want to uninstall? 제거하시겠습니까? - + failed to fetch update 업데이트를 가져올수없습니다 - - + + CHECK 확인 @@ -1165,72 +1165,70 @@ location set 차량이 50km/h(31mph) 이상의 속도로 주행하는 동안 방향 지시등이 활성화되지 않은 상태에서 감지된 차선 위를 주행할 경우 차선이탈 경고를 사용합니다. - Enable Right-Hand Drive - 우측핸들 사용 + 우측핸들 사용 - Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat. - openpilot이 좌측 교통 규칙을 준수하고 우측 운전석에서 운전자 모니터링을 수행합니다. + openpilot이 좌측 교통 규칙을 준수하고 우측 운전석에서 운전자 모니터링을 수행합니다. - + Use Metric System 미터법 사용 - + Display speed in km/h instead of mph. mph 대신 km/h로 속도를 표시합니다. - + Record and Upload Driver Camera 운전자 카메라 녹화 및 업로드 - + Upload data from the driver facing camera and help improve the driver monitoring algorithm. 운전자 카메라에서 데이터를 업로드하고 운전자 모니터링 알고리즘을 개선합니다. - + Disengage On Accelerator Pedal 가속페달 조작시 해제 - + When enabled, pressing the accelerator pedal will disengage openpilot. 활성화된 경우 가속 페달을 누르면 openpilot이 해제됩니다. - + Show ETA in 24h format 24시간 형식으로 도착예정시간 표시 - + Use 24h format instead of am/pm 오전/오후 대신 24시간 형식 사용 - + Show Map on Left Side of UI UI 왼쪽에 지도 표시 - + Show map on left side when in split screen view. 분할 화면 보기에서 지도를 왼쪽에 표시합니다. - + openpilot Longitudinal Control openpilot Longitudinal Control - + openpilot will disable the car's radar and will take over control of gas and brakes. Warning: this disables AEB! openpilot은 차량'의 레이더를 무력화시키고 가속페달과 브레이크의 제어를 인계받을 것이다. 경고: AEB를 비활성화합니다! diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index da0841c3b5..5c949b0d3b 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -108,152 +108,152 @@ DevicePanel - + Dongle ID 设备ID(Dongle ID) - + N/A N/A - + Serial 序列号 - + Driver Camera 驾驶员摄像头 - + PREVIEW 预览 - + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) 打开并预览驾驶员摄像头,以确保驾驶员监控具有良好视野。仅熄火时可用。 - + Reset Calibration 重置设备校准 - + RESET 重置 - + Are you sure you want to reset calibration? 您确定要重置设备校准吗? - + Review Training Guide 新手指南 - + REVIEW 查看 - + Review the rules, features, and limitations of openpilot 查看openpilot的使用规则,以及其功能和限制。 - + Are you sure you want to review the training guide? 您确定要查看新手指南吗? - + Regulatory 监管信息 - + VIEW 查看 - + Change Language 切换语言 - + CHANGE 切换 - + Select a language 选择语言 - + Reboot 重启 - + Power Off 关机 - + openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required. openpilot要求设备安装的偏航角在左4°和右4°之间,俯仰角在上5°和下8°之间。一般来说,openpilot会持续更新校准,很少需要重置。 - + Your device is pointed %1° %2 and %3° %4. 您的设备校准为%1° %2、%3° %4。 - + down 朝下 - + up 朝上 - + left 朝左 - + right 朝右 - + Are you sure you want to reboot? 您确定要重新启动吗? - + Disengage to Reboot 取消openpilot以重新启动 - + Are you sure you want to power off? 您确定要关机吗? - + Disengage to Power Off 取消openpilot以关机 @@ -294,7 +294,7 @@ DriverViewScene - + camera starting 正在启动相机 @@ -496,20 +496,20 @@ location set mph - - + + MAX 最高定速 - - + + SPEED SPEED - - + + LIMIT LIMIT @@ -708,33 +708,33 @@ location set SettingsWindow - + × × - + Device 设备 - - + + Network 网络 - + Toggles 设定 - + Software 软件 - + Navigation 导航 @@ -973,89 +973,89 @@ location set SoftwarePanel - + Git Branch Git Branch - + Git Commit Git Commit - + OS Version 系统版本 - + Version 软件版本 - + Last Update Check 上次检查更新 - + The last time openpilot successfully checked for an update. The updater only runs while the car is off. 上一次成功检查更新的时间。更新程序仅在汽车熄火时运行。 - + Check for Update 检查更新 - + CHECKING 正在检查更新 - + Switch Branch 切换分支 - + ENTER 输入 - - + + The new branch will be pulled the next time the updater runs. 分支将在更新服务下次启动时自动切换。 - + Enter branch name 输入分支名称 - + UNINSTALL 卸载 - + Uninstall %1 卸载 %1 - + Are you sure you want to uninstall? 您确定要卸载吗? - + failed to fetch update 获取更新失败 - - + + CHECK 查看 @@ -1163,72 +1163,70 @@ location set 车速超过31mph(50km/h)时,若检测到车辆越过车道线且未打转向灯,系统将发出警告以提醒您返回车道。 - Enable Right-Hand Drive - 启用右舵模式 + 启用右舵模式 - Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat. - 允许openpilot遵守左侧交通惯例并在右侧驾驶座上执行驾驶员监控。 + 允许openpilot遵守左侧交通惯例并在右侧驾驶座上执行驾驶员监控。 - + Use Metric System 使用公制单位 - + Display speed in km/h instead of mph. 显示车速时,以km/h代替mph。 - + Record and Upload Driver Camera 录制并上传驾驶员摄像头 - + Upload data from the driver facing camera and help improve the driver monitoring algorithm. 上传驾驶员摄像头的数据,帮助改进驾驶员监控算法。 - + Disengage On Accelerator Pedal 踩油门时取消控制 - + When enabled, pressing the accelerator pedal will disengage openpilot. 启用后,踩下油门踏板将取消openpilot。 - + Show ETA in 24h format 以24小时格式显示预计到达时间 - + Use 24h format instead of am/pm 使用24小时制代替am/pm - + Show Map on Left Side of UI 在介面左侧显示地图 - + Show map on left side when in split screen view. 在分屏模式中,将地图置于屏幕左侧。 - + openpilot Longitudinal Control openpilot纵向控制 - + openpilot will disable the car's radar and will take over control of gas and brakes. Warning: this disables AEB! openpilot将禁用车辆的雷达并接管油门和刹车的控制。警告:AEB将被禁用! diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 85d40c60a3..d1b1566a5a 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -108,152 +108,152 @@ DevicePanel - + Dongle ID Dongle ID - + N/A 無法使用 - + Serial 序號 - + Driver Camera 駕駛員攝像頭 - + PREVIEW 預覽 - + Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off) 預覽駕駛員監控鏡頭畫面,以確保其具有良好視野。(僅在熄火時可用) - + Reset Calibration 重置校準 - + RESET 重置 - + Are you sure you want to reset calibration? 您確定要重置校準嗎? - + Review Training Guide 觀看使用教學 - + REVIEW 觀看 - + Review the rules, features, and limitations of openpilot 觀看 openpilot 的使用規則、功能和限制 - + Are you sure you want to review the training guide? 您確定要觀看使用教學嗎? - + Regulatory 法規/監管 - + VIEW 觀看 - + Change Language 更改語言 - + CHANGE 更改 - + Select a language 選擇語言 - + Reboot 重新啟動 - + Power Off 關機 - + openpilot requires the device to be mounted within 4° left or right and within 5° up or 8° down. openpilot is continuously calibrating, resetting is rarely required. openpilot 需要將裝置固定在左右偏差 4° 以內,朝上偏差 5° 以内或朝下偏差 8° 以内。鏡頭在後台會持續自動校準,很少有需要重置的情况。 - + Your device is pointed %1° %2 and %3° %4. 你的設備目前朝%2 %1° 以及朝%4 %3° 。 - + down - + up - + left - + right - + Are you sure you want to reboot? 您確定要重新啟動嗎? - + Disengage to Reboot 請先取消控車才能重新啟動 - + Are you sure you want to power off? 您確定您要關機嗎? - + Disengage to Power Off 請先取消控車才能關機 @@ -294,7 +294,7 @@ DriverViewScene - + camera starting 開啟相機中 @@ -498,20 +498,20 @@ location set mph - - + + MAX 最高 - - + + SPEED 速度 - - + + LIMIT 速限 @@ -713,33 +713,33 @@ location set SettingsWindow - + × × - + Device 設備 - - + + Network 網路 - + Toggles 設定 - + Software 軟體 - + Navigation 導航 @@ -978,89 +978,89 @@ location set SoftwarePanel - + Git Branch Git 分支 - + Git Commit Git 提交 - + OS Version 系統版本 - + Version 版本 - + Last Update Check 上次檢查時間 - + The last time openpilot successfully checked for an update. The updater only runs while the car is off. 上次成功檢查更新的時間。更新系統只會在車子熄火時執行。 - + Check for Update 檢查更新 - + CHECKING 檢查中 - + Switch Branch 切換分支 - + ENTER 切換 - - + + The new branch will be pulled the next time the updater runs. 新的分支將會在下次檢查更新時切換過去。 - + Enter branch name 輸入分支名稱 - + UNINSTALL 卸載 - + Uninstall %1 卸載 %1 - + Are you sure you want to uninstall? 您確定您要卸載嗎? - + failed to fetch update 下載更新失敗 - - + + CHECK 檢查 @@ -1168,72 +1168,70 @@ location set 車速在時速 50 公里 (31 英里) 以上且未打方向燈的情況下,如果偵測到車輛駛出目前車道線時,發出車道偏離警告。 - Enable Right-Hand Drive - 啟用右駕模式 + 啟用右駕模式 - Allow openpilot to obey left-hand traffic conventions and perform driver monitoring on right driver seat. - openpilot 將對右側駕駛進行監控 (但仍遵守靠左駕的交通慣例)。 + openpilot 將對右側駕駛進行監控 (但仍遵守靠左駕的交通慣例)。 - + Use Metric System 使用公制單位 - + Display speed in km/h instead of mph. 啟用後,速度單位顯示將從 mp/h 改為 km/h。 - + Record and Upload Driver Camera 記錄並上傳駕駛監控影像 - + Upload data from the driver facing camera and help improve the driver monitoring algorithm. 上傳駕駛監控的錄像來協助我們提升駕駛監控的準確率。 - + Disengage On Accelerator Pedal 油門取消控車 - + When enabled, pressing the accelerator pedal will disengage openpilot. 啟用後,踩踏油門將會取消 openpilot 控制。 - + Show ETA in 24h format 預計到達時間單位改用 24 小時制 - + Use 24h format instead of am/pm 使用 24 小時制。(預設值為 12 小時制) - + Show Map on Left Side of UI 將地圖顯示在畫面的左側 - + Show map on left side when in split screen view. 進入分割畫面後,地圖將會顯示在畫面的左側。 - + openpilot Longitudinal Control openpilot 縱向控制 - + openpilot will disable the car's radar and will take over control of gas and brakes. Warning: this disables AEB! openpilot 將會關閉雷達訊號並接管油門和剎車的控制。注意:這也會關閉自動緊急煞車 (AEB) 系統!