Snap prepare route to nearest point
This commit is contained in:
@@ -305,6 +305,8 @@ class AutoBotMove:
|
|||||||
self.prepare_route_index = 0
|
self.prepare_route_index = 0
|
||||||
self.prepare_route_completed = not bool(self.prepare_route_waypoints)
|
self.prepare_route_completed = not bool(self.prepare_route_waypoints)
|
||||||
self.is_running_prepare_route = bool(self.prepare_route_waypoints)
|
self.is_running_prepare_route = bool(self.prepare_route_waypoints)
|
||||||
|
self.prepare_route_snapped = False
|
||||||
|
self.prepare_route_snap_max_dist = 10.0
|
||||||
layout = load_layout_config()
|
layout = load_layout_config()
|
||||||
self.patrol_controller = CoordinatePatrol(
|
self.patrol_controller = CoordinatePatrol(
|
||||||
waypoints,
|
waypoints,
|
||||||
@@ -340,12 +342,52 @@ class AutoBotMove:
|
|||||||
def _has_prepare_route(self) -> bool:
|
def _has_prepare_route(self) -> bool:
|
||||||
return bool(self.prepare_route_waypoints)
|
return bool(self.prepare_route_waypoints)
|
||||||
|
|
||||||
|
def _snap_prepare_route_to_nearest(self, state):
|
||||||
|
if self.prepare_route_snapped or self.prepare_route_completed or not self._has_prepare_route():
|
||||||
|
return
|
||||||
|
self.prepare_route_snapped = True
|
||||||
|
|
||||||
|
try:
|
||||||
|
current_pos = (float(state.get('x')), float(state.get('y')))
|
||||||
|
except Exception:
|
||||||
|
return
|
||||||
|
|
||||||
|
best_idx = None
|
||||||
|
best_dist = None
|
||||||
|
for idx, point in enumerate(self.prepare_route_waypoints):
|
||||||
|
try:
|
||||||
|
target = (float(point[0]), float(point[1]))
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
dist = self.patrol_controller.get_distance(current_pos, target)
|
||||||
|
if best_dist is None or dist < best_dist:
|
||||||
|
best_idx = idx
|
||||||
|
best_dist = dist
|
||||||
|
|
||||||
|
if best_idx is None or best_dist is None:
|
||||||
|
return
|
||||||
|
if best_dist > self.prepare_route_snap_max_dist:
|
||||||
|
print(
|
||||||
|
f">>> [准备路线] 离准备路线最近点仍较远({best_dist:.2f}),"
|
||||||
|
"从第 1 个点开始"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.prepare_route_index = best_idx
|
||||||
|
self.patrol_controller.reset_stuck()
|
||||||
|
print(
|
||||||
|
f">>> [准备路线] 智能接入最近点 {best_idx + 1}/"
|
||||||
|
f"{len(self.prepare_route_waypoints)},距离 {best_dist:.2f}"
|
||||||
|
)
|
||||||
|
|
||||||
def _run_prepare_route_step(self, state):
|
def _run_prepare_route_step(self, state):
|
||||||
if self.prepare_route_completed or not self._has_prepare_route():
|
if self.prepare_route_completed or not self._has_prepare_route():
|
||||||
self.prepare_route_completed = True
|
self.prepare_route_completed = True
|
||||||
self.is_running_prepare_route = False
|
self.is_running_prepare_route = False
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self._snap_prepare_route_to_nearest(state)
|
||||||
|
|
||||||
if self.prepare_route_index >= len(self.prepare_route_waypoints):
|
if self.prepare_route_index >= len(self.prepare_route_waypoints):
|
||||||
self.prepare_route_completed = True
|
self.prepare_route_completed = True
|
||||||
self.is_running_prepare_route = False
|
self.is_running_prepare_route = False
|
||||||
|
|||||||
Reference in New Issue
Block a user