docs: add physical rover setup reference

This commit is contained in:
2026-09-10 22:06:15 +03:00
parent 19d08523eb
commit 1b0ebe1b5a
7 changed files with 163 additions and 57 deletions
+15 -16
View File
@@ -1,22 +1,19 @@
#!/usr/bin/env python3
"""Строит кратчайший маршрут по сетке маркеров 6x6 без ROS."""
"""Строит кратчайший маршрут по регулярной сетке ArUco без ROS."""
import argparse
from collections import deque
SIZE = 6
def neighbors(marker: int):
row, column = divmod(marker, SIZE)
def neighbors(marker: int, size: int):
row, column = divmod(marker, size)
for dr, dc in ((-1, 0), (1, 0), (0, -1), (0, 1)):
next_row, next_column = row + dr, column + dc
if 0 <= next_row < SIZE and 0 <= next_column < SIZE:
yield next_row * SIZE + next_column
if 0 <= next_row < size and 0 <= next_column < size:
yield next_row * size + next_column
def build_route(start: int, target: int, blocked: set[int]):
def build_route(start: int, target: int, blocked: set[int], size: int):
queue = deque([start])
previous = {start: None}
@@ -24,7 +21,7 @@ def build_route(start: int, target: int, blocked: set[int]):
current = queue.popleft()
if current == target:
break
for candidate in neighbors(current):
for candidate in neighbors(current, size):
if candidate not in blocked and candidate not in previous:
previous[candidate] = current
queue.append(candidate)
@@ -42,8 +39,9 @@ def build_route(start: int, target: int, blocked: set[int]):
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("start", type=int, help="Стартовый маркер 0..35")
parser.add_argument("target", type=int, help="Целевой маркер 0..35")
parser.add_argument("start", type=int, help="ID стартового маркера")
parser.add_argument("target", type=int, help="ID целевого маркера")
parser.add_argument("--size", type=int, default=5, help="5 для реального поля, 6 для Webots")
parser.add_argument(
"--blocked",
type=int,
@@ -53,13 +51,15 @@ def main():
)
args = parser.parse_args()
if not 0 <= args.start < SIZE * SIZE or not 0 <= args.target < SIZE * SIZE:
parser.error("start и target должны быть от 0 до 35")
if args.size < 2:
parser.error("--size должен быть не меньше 2")
if not 0 <= args.start < args.size**2 or not 0 <= args.target < args.size**2:
parser.error(f"start и target должны быть от 0 до {args.size**2 - 1}")
blocked = set(args.blocked)
blocked.discard(args.start)
blocked.discard(args.target)
route = build_route(args.start, args.target, blocked)
route = build_route(args.start, args.target, blocked, args.size)
if route is None:
raise SystemExit("Маршрут не найден")
print(" -> ".join(map(str, route)))
@@ -67,4 +67,3 @@ def main():
if __name__ == "__main__":
main()