Files
uav-search/examples/demo_strip_patrol.py
robinson 0d2e580f12 init
2026-09-03 15:50:33 +08:00

70 lines
2.1 KiB
Python

#!/usr/bin/env python3
"""Evaluate a fixed deployment (no optimization)."""
from __future__ import annotations
import argparse
from pathlib import Path
import matplotlib.pyplot as plt
from uavsearch.geometry import RectRegion
from uavsearch.problem import CoverageProblem, evaluate_deployment, random_deployment
from uavsearch.sim import PatrolVisualizer
def main() -> None:
parser = argparse.ArgumentParser(description="Evaluate one UAV deployment")
parser.add_argument("--width", type=float, default=1000.0)
parser.add_argument("--height", type=float, default=800.0)
parser.add_argument("--uavs", type=int, default=4)
parser.add_argument("--radius", type=float, default=50.0)
parser.add_argument("--speed", type=float, default=15.0)
parser.add_argument("--seed", type=int, default=42)
parser.add_argument("--partition", choices=["uniform", "voronoi"], default="uniform")
parser.add_argument("--grid-density", type=float, default=4.0)
parser.add_argument("--save", type=str, default=None)
args = parser.parse_args()
region = RectRegion.from_size(args.width, args.height)
problem = CoverageProblem(
region=region,
n_uavs=args.uavs,
sensor_radius=args.radius,
speed=args.speed,
partition_mode=args.partition,
grid_density=args.grid_density,
)
positions = random_deployment(problem, seed=args.seed)
result = evaluate_deployment(problem, positions)
print(f"Objective T_max = {result.objective_value:.2f}s")
print(result.summary_line())
from uavsearch.sim import PatrolSimulator
sim = PatrolSimulator(
region, result.solution.paths, args.speed, args.radius, grid_density=args.grid_density
)
sim.run(result.max_patrol_period * 2.5)
viz = PatrolVisualizer(region)
fig = viz.plot_simulation_snapshot(
sim,
result.solution.paths,
result.solution.metrics,
title="Deployment Evaluation",
partition=result.solution.partition,
)
if args.save:
Path(args.save).parent.mkdir(parents=True, exist_ok=True)
fig.savefig(args.save, dpi=150, bbox_inches="tight")
else:
plt.show()
if __name__ == "__main__":
main()