70 lines
2.1 KiB
Python
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()
|