fixed 优化移动逻辑

This commit is contained in:
王鹏
2026-03-25 15:41:48 +08:00
parent 9ab1e8737c
commit 7e26264463
3 changed files with 30 additions and 12 deletions

View File

@@ -304,7 +304,11 @@ class CoordinatePatrol:
# 2. 距离判断 # 2. 距离判断
dist = self.get_distance(current_pos, target_pos) dist = self.get_distance(current_pos, target_pos)
if dist < threshold: if dist < threshold:
self.stop_all() # 到点后保持平滑过渡:不松开 W只松开左右修正键
# 避免 patrol 连续多点时出现“刹一下再走”的抖动。
pyautogui.keyUp("a")
pyautogui.keyUp("d")
self.reset_stuck()
return True return True
# 3. 计算角度差 # 3. 计算角度差
@@ -325,26 +329,27 @@ class CoordinatePatrol:
# 在死区内,确保转向键松开,直线前进 # 在死区内,确保转向键松开,直线前进
pyautogui.keyUp("a") pyautogui.keyUp("a")
pyautogui.keyUp("d") pyautogui.keyUp("d")
else: elif abs_diff > self.angle_threshold_deg:
# 在死区外,需要修正方 # 超出阈值:执行平滑脉冲转
turn_key = "d" if angle_diff > 0 else "a" turn_key = "d" if angle_diff > 0 else "a"
other_key = "a" if angle_diff > 0 else "d" other_key = "a" if angle_diff > 0 else "d"
# 松开反方向键 # 松开反方向键
pyautogui.keyUp(other_key) pyautogui.keyUp(other_key)
# 计算本次修正的时长 # 获取针对平滑移动优化的短脉冲时长
# 边走边转时duration 应比原地转向更短,建议使用 0.05s - 0.1s 的短脉冲
duration = self._turn_duration_from_angle(abs_diff) duration = self._turn_duration_from_angle(abs_diff)
# 关键:执行短促转向脉冲
# 限制单次修正时间,防止转过头导致“画龙”
safe_duration = min(duration, 0.15)
pyautogui.keyDown(turn_key) pyautogui.keyDown(turn_key)
time.sleep(safe_duration) # 短暂物理延迟确保按键生效 # sleep 极短 (建议 < 0.1s),不会造成移动卡顿
time.sleep(duration)
pyautogui.keyUp(turn_key) pyautogui.keyUp(turn_key)
self.last_turn_end_time = time.time() self.last_turn_end_time = time.time()
else:
# 在死区与阈值之间:为了平滑,不进行任何按键动作,仅靠 W 前进
pyautogui.keyUp("a")
pyautogui.keyUp("d")
return False return False
@@ -490,6 +495,10 @@ class CoordinatePatrol:
if not path: if not path:
self.stop_all() self.stop_all()
return True return True
# 阻塞模式下的状态轮询间隔:尽量贴近“每帧高频控制”,避免转向脉冲后等待过久导致抖动。
poll_sleep_sec = 0.02
points = [(float(p[0]), float(p[1])) for p in path] points = [(float(p[0]), float(p[1])) for p in path]
if not forward: if not forward:
points = points[::-1] points = points[::-1]
@@ -502,7 +511,7 @@ class CoordinatePatrol:
return False return False
if self._ensure_mounted(state): if self._ensure_mounted(state):
break break
time.sleep(0.05) time.sleep(poll_sleep_sec)
for i, target in enumerate(points): for i, target in enumerate(points):
self.logger.info(f">>> 路径点 {i + 1}/{len(points)}: {target}") self.logger.info(f">>> 路径点 {i + 1}/{len(points)}: {target}")
@@ -514,7 +523,7 @@ class CoordinatePatrol:
arrived = self.navigate_to_point(state, target, arrival_threshold) arrived = self.navigate_to_point(state, target, arrival_threshold)
if arrived: if arrived:
break break
time.sleep(0.05) time.sleep(poll_sleep_sec)
self.stop_all() self.stop_all()
self.logger.info(">>> 路径走完") self.logger.info(">>> 路径走完")
return True return True

View File

@@ -50,3 +50,12 @@
- **运行时透传**`start_game_loop``GameLoopWorker``AutoBotMove` 全链路透传并生效。 - **运行时透传**`start_game_loop``GameLoopWorker``AutoBotMove` 全链路透传并生效。
- **兼容性**`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`,减少航点/转向后的抖动。