From 7e262644638d740922ee38865da9e1ae9c0ed23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E9=B9=8F?= Date: Wed, 25 Mar 2026 15:41:48 +0800 Subject: [PATCH] =?UTF-8?q?fixed=20=E4=BC=98=E5=8C=96=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/coordinate_patrol.cpython-311.pyc | Bin 23147 -> 23629 bytes coordinate_patrol.py | 33 +++++++++++------- docs/history.md | 9 +++++ 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/__pycache__/coordinate_patrol.cpython-311.pyc b/__pycache__/coordinate_patrol.cpython-311.pyc index 6a4e09b1c8a1be13518722067ab1214935be8f67..231199908bdc578af56aed23f5f1ac0cf7cdb55e 100644 GIT binary patch delta 3392 zcmb_e4Qx}_6@J%_|DR(A>_D9Or;voa1QL?+o6!JEfDVWSNeHAZO-(O$n4~n!&qxyJzH*KmOd~CSw78j znZQYqN#G{%5#$o&_5HyTWCqy)|FkX#t8FH%3%SjPq(RNt38l7%9Ana$l-iBBR*VjT z+@PA^sI8#DjC1DEDe0)BTJX1J?6+z?nxWc`nPA`2LU7nWv6|{7#oomk4BEfyxbwlq zq03Nq@5S@Or}qzC{K4JVULLym%J6$X9X|5@=O4c|boqPtuN=8^^mwR&cWI%a{&$83 zuG~4(fB(Xnd;Ra;>p%VZ$G!J29KtAf-}qT57TFnXjU=?@M7()NJQ_=ch6aw^KmYpO z({B&|0QwCK}8DsHXdImZ}ICuc|%HOhPV9!FS(sZ!rhO=PM zS2My*?p@Zq4DQMUECla3k6CyDM&SAIoy^%R0NXR?vpP7Q`E3^JyPa8KX8GXp zwwlF0y5L2xr^F$$;E`CX#+Q)o;F_)_@TZO?VstAm?uV=1?_w`Gsj}cI!ypiBZf)awc1VTMq$s!4* zOgk`lotKhBs7oVDA()4tWTsgxBL^vhMiUK!*7bVA)jSR z5gX{+qLdpgA$%a*k^xtP9-9^Q^@fyW`yjZ!xbM@sHHJ-92`?@f9qsffVyM=W$oMH@ zT?{6D!#dl8>ypw58EywXa4VFRVXv2xaJF&=JX7ZPI=V5GDtBWNs-qjJ>#-&LhadBW zd+bw!6SHEd&aVZxV^JW^#OM&|aXm46%p*zdSrE$42~HdHbO?i&;&ao-d?!32!PnE)HbNL7*nl14)O)YomO<(dgLk8 zIKW!&XEQ|lmE}{@cR_b~E-Qz9`5yRX!PGei%{j}{DG;{LM4D!Ty~4gFRy6e$V~hUx zBcK|vIJ?1Dv3Bp+ag}&G#ub9&qIAURCyB6u(-!d!1f2xi31SF}Z;~>{waA~NdD~`8`B=6Ge_E=;8k+zIs|D-n9Z&JQ`fQi+(>(u$zF+H{U~$ zBS|^)8|X@>$YS>K^oQvZ36fR3y+}MuDr{s-R zKzMakIg{b?s#Vnwz6U~W~u|wNEu@Nb!9(h)4R=ap45sk-m>cp^ebvA5R zZ8qSRG_9^-YTxnIPn)m@{cBwg`!UQ|zqq!?q#6%MNkffv5+68)|I?$#oHXi=q*=|t zf2Qvm=>x}RY?1+M>;vm9NsFkuMsvLc?j<=eY;?h2*88A$nH#cev*1mmORkZ&zWNk4 zr5!9#UE$$><5=BAXS%AYDunl^I|B#q?Y|VlTgRHZS&Kv?6-pgH2`QTv z>)Ng%>)Ir>iT1c3!zd2CT)b5mSVO8xW$uV~b~fvsnzo}^*IH6$asSeJ8BMZi%AAOB zJSHhig!AZ5P1PMZF`+EFI{m$_!hDyc^)i&yKVls*OTIvF<}IkLpU39Fp8A!AFWis| z2j#-+a^Z-}Vw>~jG|4yn#G)HH#e+G;Ba+=#A^<+CuVy7s*ih@Ly5TM!bQfQD7ms9F zoh7ipp$yN+xrS>?g^1G9!9>D%3z`rF)gW~E@ee7yi_^I4^__eBV;?S0XehEUXwB!itwq zhw{zaB0-uFT9)bN8Ex6FCEDU@`sNa*Ng+ldKXG$;fqb+{`~<-V1bqaw&F@L+nj>yx z*wH0!hA%dUT|Sd{L>h-BuyIRbW|)!lYuE{Y+*0W&F?mL$sqh4pG!<9r55W1RUCY;5*&`#; P!|`vz|HU`VilF}iw72-= delta 3021 zcmaJ@eNa@_6@T|FZ@+lUF3PfeEc>A>@JIjwK{N_u1thi$l@FuX)U3P}7Gxp!Eio~> z8jYP=<1|iBr^!qv5!$JZyBNtjM&=%kruGM%R9+(l6O zaTtDc-??wkyZ4;m`Q7{5>+COYv%K#)9Ciuqy^n6hKIyxf*Us1n=|0w`Fl!pjepa4~ zliWd&N8lvLCnzQG5|pLySo}=B!{8s*HYPzZSP0WSE&yAoSWe1GY1D+T2^$m0W!(hx zwooVs=giAf(rc2g;Irlavu=JZN4LDLz)5=Jtg z;nNG!k_s0b8r*fvvLJjT?{&+fjQ&Li&CZR?4};E4EDSF>KgWXUTh0bEYXDX_+#!%j*bCsM5kHm+gd<%_pdDMs|4jGB5p)s*uUWIPW$$juv;aBk! zO`a~cH+{m>YpQL)8BXO{9ARP$jTFJ6M~8VdYGjm1A`)-V6tOej2LCGAfWHrxwzKna zq;v$Ac)RpznfYL+?ynCj8ZR0e5!7|0}&PX( zmpe2P9U5ESej(Vkl9QA-E;2~T5?RU;juOMS6SNWx5DXG%1l0tBj$fh?aWbP!;&u%F zC^-aObsAL?Jc6L*Wm8o{4lBWkB*AwyH|vF2?J(xZTV2Iw(;e0Irt%=pcMs(t-ZupY z#F>vKarBCmWG}$`;p+6wns%867HglBl&0-)s@4r}Z1TEo$MI#|ejFLD+m2%$Q?`T$ zZf`1UE5096l18bwgz34LF#lJm2Ev$>v|~TeK7@^l8Ez!}Fw;-~mu-2}J}%f>zdo0C zFKl`pyl->E-SYgr#Dia14|_wUjt4yj@O=GR&rGPKB|ek1>ER31Z2zjZ!-c zOXjW3%9_vOk7X2{&&n%cN2A@W%cu_daItaE$@>+Scnm`cj&fpeKOd#%9s&|1ew1LG zAWlGx9&Qx&>o%?U0amZ@m`~D+g#?^HaF{BYrLUmslmC~itG&++`kmmcpzA?;T;(h( z134(8yq7?HrVZZR?9X`ypW#oNea?)-h#ZL?(x-TYv<=e7?Fk z{d7|)bKF&3FNe>Czt(fU=WGw$Xnt2&GE069Za&)3X_bn+zxOo#&eQb6k$F$sf~W0l z*T-h5EHG_-vwYrLx8SWi8@{Ky7u2#>N9NVa1+{Wct^A|vI=|;aYF-U3sG&JE1T{52 z_0P_Nvr{}s3m%8AmI>xaUvIgny4DnBBMf)=%=PqI3%t}Z>J|lAtxvWfVDH?>>`>cT z&JI9dXXK>N7^+6b9y4Nb6!rKJs(LJ*$d+PNA&By;+03SyWR!0vC?OCh83~q<;%qrq z#3o}Ij^dG#;C!Vx8H)=goP3&hxj3+EcRh2!)b5V0R1TlbGuydqwW$}H^Z%N zKm1~c6aLw4Gg(qraBkRur*P5&wLKmfd(3IZW7?jy!eEc4P$UoRt*x>%JiCSZSxNmG z%}HxA=Mrk=m6ek}WlP#Pi@Ot~qRX~=FVM|t`HR1iVXpU#pIQ_TBx)&5&d9Z!_=`9+ zNIt}2ZS?J8AHuc1Z6RV;_u^-0ot(l>kyf_0wgx`D_Je!BJoCZn*#K{V{QeEi;$RZp zyV6)0TQoj39>s=FdQEMrbYIPxN6iEti! zCaN2#?sS(}Hmu;S{s!|OsP|5Tc_7H{Lft?OD}yHoc2*?jRqul8om0I_PK&MV<8@NW z#_8ty;_8Ls>Ltl;3kran1G}*J)_q~;=6P3O!4;Tu1(x!yjv(m!>Tu?EX)(OD@A6jB zF)PB=jW?ZD_LHhCUw!x+v=KJ;z_sV)C#snOKYgMfqdE5<+_DlW!wjK! zQ<#-v;Fwpy%zht||Hl3;UaAOwuZ8?u5&AXOt;zk}nwuBE`U8g}0h$qwtI|y@HZ&eh zj7;cR*$mU9=seMD;?z%(j|##s5`3TFDgl-BvXoUAabuy2Be%ev1Km!y;$D(gpcWbj z6Ge|Ra{dP%hIa~1pPMwIgkec diff --git a/coordinate_patrol.py b/coordinate_patrol.py index 2bd9b6a..b52e33a 100644 --- a/coordinate_patrol.py +++ b/coordinate_patrol.py @@ -304,7 +304,11 @@ class CoordinatePatrol: # 2. 距离判断 dist = self.get_distance(current_pos, target_pos) if dist < threshold: - self.stop_all() + # 到点后保持平滑过渡:不松开 W,只松开左右修正键 + # 避免 patrol 连续多点时出现“刹一下再走”的抖动。 + pyautogui.keyUp("a") + pyautogui.keyUp("d") + self.reset_stuck() return True # 3. 计算角度差 @@ -325,26 +329,27 @@ class CoordinatePatrol: # 在死区内,确保转向键松开,直线前进 pyautogui.keyUp("a") pyautogui.keyUp("d") - else: - # 在死区外,需要修正方向 + elif abs_diff > self.angle_threshold_deg: + # 超出阈值:执行平滑脉冲转向 turn_key = "d" if angle_diff > 0 else "a" other_key = "a" if angle_diff > 0 else "d" # 松开反方向键 pyautogui.keyUp(other_key) - # 计算本次修正的时长 - # 边走边转时,duration 应比原地转向更短,建议使用 0.05s - 0.1s 的短脉冲 + # 获取针对平滑移动优化的短脉冲时长 duration = self._turn_duration_from_angle(abs_diff) - - # 限制单次修正时间,防止转过头导致“画龙” - safe_duration = min(duration, 0.15) - + # 关键:执行短促转向脉冲 pyautogui.keyDown(turn_key) - time.sleep(safe_duration) # 短暂物理延迟确保按键生效 + # sleep 极短 (建议 < 0.1s),不会造成移动卡顿 + time.sleep(duration) pyautogui.keyUp(turn_key) self.last_turn_end_time = time.time() + else: + # 在死区与阈值之间:为了平滑,不进行任何按键动作,仅靠 W 前进 + pyautogui.keyUp("a") + pyautogui.keyUp("d") return False @@ -490,6 +495,10 @@ class CoordinatePatrol: if not path: self.stop_all() return True + + # 阻塞模式下的状态轮询间隔:尽量贴近“每帧高频控制”,避免转向脉冲后等待过久导致抖动。 + poll_sleep_sec = 0.02 + points = [(float(p[0]), float(p[1])) for p in path] if not forward: points = points[::-1] @@ -502,7 +511,7 @@ class CoordinatePatrol: return False if self._ensure_mounted(state): break - time.sleep(0.05) + time.sleep(poll_sleep_sec) for i, target in enumerate(points): self.logger.info(f">>> 路径点 {i + 1}/{len(points)}: {target}") @@ -514,7 +523,7 @@ class CoordinatePatrol: arrived = self.navigate_to_point(state, target, arrival_threshold) if arrived: break - time.sleep(0.05) + time.sleep(poll_sleep_sec) self.stop_all() self.logger.info(">>> 路径走完") return True diff --git a/docs/history.md b/docs/history.md index f65abde..180611c 100644 --- a/docs/history.md +++ b/docs/history.md @@ -50,3 +50,12 @@ - **运行时透传**:`start_game_loop` → `GameLoopWorker` → `AutoBotMove` 全链路透传并生效。 - **兼容性**:`AutoBotMove` 保留默认值,旧配置文件可直接运行。 +### `navigate_to_point` 对齐 `navigate` 优化 + +- **到点处理**:`coordinate_patrol.py` 的 `navigate_to_point` 到达判定后不再调用 `stop_all()`,改为仅松开左右修正键并保持 `W` 前进,从而实现连续平滑过渡。 +- **转向触发逻辑**:`navigate_to_point` 转向决策按 `navigate` 的三档策略调整(死区直行、阈值外脉冲转向、死区与阈值之间不修正),降低航点附近左右抖动。 + +### `navigate_path` 对齐 `navigate` 优化 + +- **轮询间隔**:`coordinate_patrol.py` 的 `navigate_path` 阻塞等待轮询由固定 `time.sleep(0.05)` 调整为局部 `poll_sleep_sec = 0.02`,让阻塞模式控制频率更接近 `navigate`,减少航点/转向后的抖动。 +