Files
ruvnet--RuView/v2/crates/ruview-swarm/viz/sample_levy.jsonl
T
rUv 0d3d835bf8 feat(swarm): add ruview-swarm crate — drone swarm control system (ADR-148) (#862)
* feat(swarm): add wifi-densepose-swarm crate implementing ADR-148 drone swarm control system

New crate `wifi-densepose-swarm` with hierarchical-mesh swarm topology,
Raft consensus, MAPPO MARL, CSI sensing integration, and ITAR-gated
coordination features. Closes 3 of 7 milestones (M1, M2, M5) with 5/5
ADR-148 SOTA performance targets met.

## Modules (45 source files, 14 modules)

- types: NodeId, DroneState, Position3D, SwarmTask, SwarmError, FailSafeState
- topology: Raft consensus (leader election, log replication, quorum), Gossip, Mesh
- formation: VirtualStructure, LeaderFollower, Reynolds flocking (itar-gated)
- planning: RRT-APF hybrid planner, 3-phase coverage, Bayesian grid, pheromone
- allocation: Auction + FNN bid scorer (itar-gated)
- sensing: CsiPayloadPipeline (Live/Synthetic/Replay), MultiViewFusion, OccWorldBridge
- marl: MAPPO actor (3-layer MLP), LocalObservation (64-dim), RewardCalculator, PPO loop
- security: MAVLink v2 HMAC-SHA256, UWB anti-spoofing, geofence, Remote ID, FHSS
- failsafe: 10-state onboard machine, GCS-independent safety transitions
- config: TOML SwarmConfig with SAR/inspection/agriculture/mine/demo/wi2sar_reference
- demo: SyntheticCsiGenerator, DemoScenario (SAR/open-field/mine)
- integration: FlightController trait, MAVLink dialect (50000-50005), SwarmSim
- orchestrator: SwarmOrchestrator wiring all subsystems end-to-end
- bench_support: Criterion fixture generators

## ITAR compliance

Swarming coordination features gated behind `itar-unrestricted` feature
per USML Category VIII(h)(12). Default build compiles clean stubs.

## Benchmark results (criterion, release mode)

- MARL actor inference: 3.3 µs (target ≤ 5 ms — 1,516× headroom)
- RRT-APF planning (100 iter): 0.043 ms (target < 300 ms — 6,946× headroom)
- MultiView CSI fusion (3 UAVs): 58.5 ns (target < 10 ms — 171,000× headroom)
- 3-view localization: 1.732 m (target ≤ 2 m — beats Wi2SAR SOTA)
- 4-drone SAR coverage (400×400 m): 223 s (target ≤ 240 s — PASS)

## Tests

- --no-default-features: 73/73 passing
- --features itar-unrestricted: 85/85 passing

Closes #861

Co-Authored-By: claude-flow <ruv@ruv.net>

* refactor(swarm): rename wifi-densepose-swarm → ruview-swarm

The swarm control system is a RuView-level capability (drone coordination,
Raft consensus, MARL) that operates above the wifi-densepose sensing layer
rather than being a sub-component of it. Rename aligns with the project
identity and separates coordination infrastructure from sensing modules.

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix(swarm): resolve all clippy warnings + add MARL convergence test

- planning/probability_grid: map_or(true,…) → is_none_or (clippy::unnecessary_map_or)
- planning/pheromone: &mut Vec<T> → &mut [T] on evaporate+deposit (clippy::ptr_arg)
- marl/observation: fix doc lazy-continuation warning on TOTAL line
- marl/trainer: manual Default impl → #[derive(Default)] + #[default] on Demo variant

Also adds test_marl_convergence_improves_mean_return: fills 64-transition
ReplayBuffer with mixed rewards (steps 0-31: negative, 32-63: positive),
runs ppo_update, asserts mean_return is finite and non-zero.

Result: 0 clippy warnings · 74/74 tests (default) · 86/86 (itar-unrestricted)

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): integrate Ruflo AI-agent capabilities into ruview-swarm

Adds a feature-gated Ruflo integration layer connecting ruview-swarm to the
claude-flow daemon's AgentDB, AIDefence, and SONA intelligence subsystems.
Default build is unaffected (all paths behind `Option<Box<dyn RufloBackend>>`).

## New module: src/ruflo/

- backend.rs: RufloBackend trait (9 async methods) + RufloError, MissionMemoryEntry,
  PatternEntry, MavlinkScanResult types (always compiled)
- mock_backend.rs: MockRufloBackend in-memory impl for testing (always compiled, 5 tests)
- http_backend.rs: HttpRufloBackend — JSON-RPC 2.0 → claude-flow daemon localhost:3000
  (gated behind `ruflo` feature, requires reqwest)
- mission_summary.rs: MissionSummary serializer with pattern description + confidence
  scoring from victim recall, coverage %, collision penalty (always compiled, 3 tests)

## 4 capability areas

1. MissionMemory   → memory_store / memory_search       (cross-mission victim memory)
2. PatternLearner  → agentdb_pattern-store / -search     (HNSW SONA trajectory patterns)
3. MavlinkDefence  → aidefence_is_safe / aidefence_scan  (scan MAVLink before accepting)
4. IntelligenceHooks → trajectory-start/step/end          (SONA learning loop)

## SwarmOrchestrator integration

- with_ruflo(backend): builder to attach a backend
- start_trajectory(task) / finish_trajectory(success, key): SONA mission lifecycle
- receive_peer_detection_checked(): AIDefence scan before accepting peer detections

## Cargo feature

`ruflo = ["dep:reqwest", "dep:serde_json"]` — optional, not in default

## Tests

- --no-default-features: 82/82 pass (8 new ruflo tests)
- --features ruflo,itar-unrestricted: 94/94 pass

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): M7 mission profiles with victim confirmation reports + pre-merge docs

Adds end-to-end mission runners producing structured MissionReport output,
and updates project docs (CHANGELOG, README, CLAUDE.md) per pre-merge checklist.

## M7 Mission Profiles (integration/mission_report.rs + swarm_sim.rs)

- MissionReport / VictimReport / SotaComparison types (serde-serializable)
- run_mission_with_report(): full mission → detailed report with per-victim
  localization error, fusion uncertainty, contributing drones, detection time
- run_inspection_mission(): leader-follower power-line corridor inspection
- run_mine_mission(): GPS-denied underground (2-drone, slow, UWB-only)
- SotaComparison embeds Wi2SAR baseline (5m / 810s) vs achieved metrics

## Docs (pre-merge checklist)

- CHANGELOG.md: ruview-swarm + Ruflo integration + performance entries
- README.md: ruview-swarm row
- CLAUDE.md: Key Rust Crates table row + ADR-148 in ADR list

## Tests
- --no-default-features: 86/86 pass
- --features ruflo,itar-unrestricted: 98/98 pass

Co-Authored-By: claude-flow <ruv@ruv.net>

* fix(swarm): convergence-assist for victim fusion + 5s Ruflo HTTP timeout

Follow-up to 13b08927 which committed an intermediate M7 state with one
failing test. This lands the M7 agent's convergence fixes and the security
review's timeout hardening.

## Fixes
- swarm_sim.rs: min-separation nudge before collision metric (0 collisions
  with staggered starts) + Phase-3 convergence assist that vectors the nearest
  idle peer toward a single-drone CSI contact so multi-view fusion can fire
- http_backend.rs: add 5s request timeout to reqwest client (security review
  Medium finding — a dead daemon would otherwise hang the swarm step loop)

## Security review verdict (HttpRufloBackend)
Safe to merge. No credentials in requests, serde_json prevents injection,
fail-open on daemon-down is documented and appropriate for SAR missions,
MAVLink passed as structured text (not raw bytes). Timeout fix applied.

## Tests
- --no-default-features: 87/87 pass
- --features ruflo,itar-unrestricted: 100/100 pass

Co-Authored-By: claude-flow <ruv@ruv.net>

* perf(swarm): add PPO training-throughput benchmark + fix bench crate-name imports

- bench_ppo_update: PPO update over 64-transition buffer — 244 µs median
- fix: bench imports referenced stale `wifi_densepose_swarm` (pre-rename),
  corrected to `ruview_swarm` so the bench target compiles

M6 benchmark suite now 5/5 compiling and running. Tests unchanged: 87/100.

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): real Candle autodiff PPO + A-MAPPO role attention + GPU training (M4)

Replaces the finite-difference PPO placeholder with a real GPU-capable Candle
0.9 autodiff trainer, adds A-MAPPO heterogeneous-role attention, a runnable
training binary, and right-sized GCP/local launch scripts. This is the unlock
that makes "GPU long training cycles" actually mean something — the previous
ppo_update did no gradient descent.

## Real autodiff PPO (feature `train`, optional `cuda`)
- candle_ppo.rs: CandleActorCritic (64→128→64 MLP + action/value heads +
  learnable log_std), CandlePpoConfig, CandleTrainer with GAE and a genuine
  optimizer.backward_step over the network. select_device() picks CUDA when
  built --features cuda and a GPU is present, else CPU.
- Verified: 5-episode CPU smoke run shows value_loss 12643→12375 (critic
  actually learning); safetensors checkpoint saved. Placeholder never moved weights.

## A-MAPPO heterogeneous-role attention (role_attention.rs, always compiled)
Addresses the four sensor-vs-relay edge cases:
- relay attention floor (prevents collapse — relays produce no CSI)
- role-segmented sensor/relay attention pools (variable neighbor cardinality)
- sensor-gated triangulation-geometry penalty (protects 3-view fusion baseline,
  ADR-148 §4.2 — relays not dragged into triangulation geometry)
- one-hot role embeddings for keys

## Training binary
- src/bin/train_marl.rs (required-features=["train"], excluded from default build)
- CLI: --episodes --drones --profile --steps --checkpoint-dir --checkpoint-every
- Wires CandleTrainer to the SwarmOrchestrator rollout loop; GAE + PPO update
  per episode; periodic safetensors checkpoints

## Right-sized launch (scripts/gcp/)
- provision_marl.sh: g2-standard-16 (1× L4, 16 vCPU, ~$1.40/hr) — NOT the
  $29/hr A100×8 box. MARL is rollout-bound not matmul-bound; ~21× cheaper.
- run_marl_train.sh: GCP rsync + train + checkpoint pull
- run_marl_train_local.sh: local RTX 5080, $0
- A100×8 provision_training.sh left for OccWorld (which saturates the GPUs)

## Tests
- --no-default-features: 91/91 (87 + 4 role_attention)
- --features train: 96/96 (+ 5 candle_ppo, incl. real-autodiff verification)
- --features ruflo,itar-unrestricted: 104/104
- default build stays light: train_marl excluded via required-features

Co-Authored-By: claude-flow <ruv@ruv.net>

* docs(adr-148): mark M4 complete — real GPU autodiff training; overall 98%

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): training visualizer — JSONL telemetry + self-contained HTML viewer

Adds an offline, dependency-free visualization for the drone training system:
a top-down swarm replay synced with training-metric curves, fed by a JSONL
telemetry log the trainer emits. No server, no build step, no CDN.

## Telemetry recorder (integration/telemetry.rs, always compiled, no new deps)
- TelemetryRecorder writes newline-delimited JSON: one `meta` (profile, area,
  ground-truth victims), many `step` (per-tick drone x/y/heading/battery/detection
  + coverage%), and per-episode `episode` (mean_return, policy_loss, value_loss).
- Written by hand (no serde_json) so it stays in the default build; 2 tests.

## train_marl telemetry flags
- `--telemetry FILE` writes the log; `--telemetry-episode N` selects which
  episode's spatial steps to record (metrics recorded for all episodes).

## Visualizer (viz/swarm_viz.html — single file, vanilla JS + canvas)
- LEFT: top-down replay — heading-oriented drone triangles (cyan/lime on
  detection), victim markers, growing coverage heatmap, detection pulse rings,
  play/pause/scrub/speed controls + live coverage/detection readout.
- RIGHT: three autoscaled line charts (mean return, policy loss, value loss)
  over episodes, hand-drawn (no chart library).
- Loads via file picker/drag-drop or auto-fetches the bundled sample; dark
  drone-ops theme; graceful degradation on file:// CORS.
- viz/sample_telemetry.jsonl: real 30-episode / 4-drone / 400×400 m run
  (value_loss 20052→7154 — visible critic learning). Parses 1 meta / 60 step / 30 episode.

## Usage
  cargo run --release -p ruview-swarm --features train,cuda --bin train_marl -- \
      --episodes 5000 --telemetry run.jsonl
  open v2/crates/ruview-swarm/viz/swarm_viz.html  # load run.jsonl

Tests unchanged (91 default / 96 train / 104 ruflo+itar); telemetry adds 2.

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): selectable flight + self-learning patterns, wired into training + viz

Adds multiple flight/coverage-optimization strategies and self-learning
strategies, selectable from the trainer, and fixes drone clustering — the
demo sweep now covers 36% of the area (was ~0.9%) with 4 disjoint strips.

## Flight patterns (planning/patterns.rs) — `FlightPattern`
- PartitionedLawnmower (new default): area split into per-drone strips → no
  overlap, coverage scales ~linearly with swarm size (clustering fix)
- Boustrophedon (baseline), Spiral, Pheromone (stigmergic), PotentialField,
  LevyFlight. from_str/name/all + next_target(&PatternContext).

## Self-learning patterns (marl/learning.rs) — `LearningPattern`
- Mappo (CTDE centralized critic), Ippo (independent, jamming-robust),
  MappoCuriosity (count-based intrinsic novelty), MetaRl (MAML fast-adapt).
- CuriosityModule (visit_bonus = beta/sqrt(count), novelty decays on revisit),
  MetaAdapter (base + fast-weights, reset_fast/consolidate), shaped_reward().

## Trainer wiring (bin/train_marl.rs)
- --flight-pattern {boustrophedon|partitioned|spiral|pheromone|potential|levy}
- --learn-pattern  {mappo|ippo|curiosity|meta}
- Rollout now moves each drone per the selected FlightPattern (PatternContext
  with visited trail + live peers), curiosity-shapes the reward, and logs
  CTDE vs independent. Telemetry meta profile carries the pattern labels so the
  viewer header shows `flight=… · learn=…`.

## Verification
- Browser pass (viz at localhost:8777): partitioned run renders 4 distinct
  serpentine coverage bands, header shows the patterns, final coverage 36.3%,
  scrubber/speed/playback work, ZERO console errors. Screenshot confirmed.
- Regenerated viz/sample_telemetry.jsonl: 1 meta / 120 step / 30 episode,
  coverage 0.9% → 36.3%.

## Tests
- --no-default-features: 103/103 (was 91; +6 patterns +6 learning)
- --features train: 108/108

Co-Authored-By: claude-flow <ruv@ruv.net>

* feat(swarm): add flight-pattern telemetry presets for the visualizer

5 loadable presets (verified browser-distinct, physics-ordered coverage):
pheromone ~44% > potential ~40% > partitioned 36% > spiral ~13% > levy ~5%.
Load any in viz/swarm_viz.html to compare flight strategies without retraining.

Co-Authored-By: claude-flow <ruv@ruv.net>

* chore(swarm): clippy-clean + publish guard for ruview-swarm

- ruview-swarm src is now 0 clippy warnings across default/train/full feature
  sets (derive Default, targeted allows for intentional from_str + bounded
  casts + borrow-required index loops; removed redundant unsigned .max(0))
- publish = false until PR merges, internal path-deps publish in order, and
  ITAR (USML VIII(h)(12)) export sign-off — prevents accidental public publish

Tests unchanged: 103 default / 108 train / 116 ruflo+itar / 120 full+train.
(6 remaining clippy warnings are pre-existing in dependency wifi-densepose-core,
 out of scope for this crate.)

Co-Authored-By: claude-flow <ruv@ruv.net>

* ci(swarm): add ruview-swarm CI guard

Path-scoped guard for v2/crates/ruview-swarm/** (ADR-148). Complements the
main ci.yml (which only runs the default workspace tests):
- feature-matrix tests: default / train / ruflo+itar / full+train
- clippy -D warnings --no-deps (crate-own code only; dep warnings don't gate)
- train_marl bin builds under 'train' AND is excluded from the default build
- ITAR/publish guards: publish=false present, itar-unrestricted never in default

All steps verified locally green before commit.

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-05-30 16:00:59 -04:00

162 lines
49 KiB
JSON

{"type":"meta","profile":"sar · flight=levy_flight · learn=curiosity","drones":4,"area_w":400.00,"area_h":400.00,"victims":[[80.00,120.00],[240.00,180.00]]}
{"type":"episode","ep":0,"mean_return":40.6910,"policy_loss":15.2719,"value_loss":12032.7422,"victims_found":0}
{"type":"episode","ep":1,"mean_return":40.6910,"policy_loss":-6.7265,"value_loss":11992.9619,"victims_found":0}
{"type":"episode","ep":2,"mean_return":40.6910,"policy_loss":-28.3518,"value_loss":11954.5889,"victims_found":0}
{"type":"episode","ep":3,"mean_return":40.6910,"policy_loss":-50.8272,"value_loss":11913.7246,"victims_found":0}
{"type":"episode","ep":4,"mean_return":40.6910,"policy_loss":-75.4711,"value_loss":11870.9639,"victims_found":0}
{"type":"episode","ep":5,"mean_return":40.6910,"policy_loss":-102.5510,"value_loss":11825.7627,"victims_found":0}
{"type":"episode","ep":6,"mean_return":40.6910,"policy_loss":-132.1274,"value_loss":11776.8301,"victims_found":0}
{"type":"episode","ep":7,"mean_return":40.6910,"policy_loss":-163.8047,"value_loss":11723.4932,"victims_found":0}
{"type":"episode","ep":8,"mean_return":40.6910,"policy_loss":-198.6059,"value_loss":11663.5625,"victims_found":0}
{"type":"episode","ep":9,"mean_return":40.6910,"policy_loss":-238.1701,"value_loss":11596.6914,"victims_found":0}
{"type":"episode","ep":10,"mean_return":40.6910,"policy_loss":-284.1328,"value_loss":11522.3838,"victims_found":0}
{"type":"episode","ep":11,"mean_return":40.6910,"policy_loss":-336.2621,"value_loss":11440.9395,"victims_found":0}
{"type":"episode","ep":12,"mean_return":40.6910,"policy_loss":-395.5074,"value_loss":11352.6396,"victims_found":0}
{"type":"episode","ep":13,"mean_return":40.6910,"policy_loss":-463.2714,"value_loss":11257.4121,"victims_found":0}
{"type":"episode","ep":14,"mean_return":40.6910,"policy_loss":-539.9746,"value_loss":11156.9658,"victims_found":0}
{"type":"episode","ep":15,"mean_return":40.6910,"policy_loss":-626.7112,"value_loss":11052.9521,"victims_found":0}
{"type":"episode","ep":16,"mean_return":40.6910,"policy_loss":-724.2371,"value_loss":10946.5713,"victims_found":0}
{"type":"episode","ep":17,"mean_return":40.6910,"policy_loss":-835.2675,"value_loss":10841.5166,"victims_found":0}
{"type":"episode","ep":18,"mean_return":40.6910,"policy_loss":-960.2383,"value_loss":10738.6182,"victims_found":0}
{"type":"step","ep":19,"step":0,"t":0.00,"coverage":0.0148,"drones":[{"id":0,"x":17.05,"y":13.77,"hdg":0.491,"batt":100.0,"det":false},{"id":1,"x":213.61,"y":17.14,"hdg":1.102,"batt":100.0,"det":false},{"id":2,"x":8.93,"y":217.93,"hdg":1.706,"batt":100.0,"det":false},{"id":3,"x":204.53,"y":215.83,"hdg":2.325,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":1,"t":1.00,"coverage":0.0202,"drones":[{"id":0,"x":10.79,"y":18.75,"hdg":2.471,"batt":100.0,"det":false},{"id":1,"x":206.36,"y":13.76,"hdg":-2.706,"batt":100.0,"det":false},{"id":2,"x":7.50,"y":210.06,"hdg":-1.750,"batt":100.0,"det":false},{"id":3,"x":205.22,"y":207.86,"hdg":-1.484,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":2,"t":2.00,"coverage":0.0227,"drones":[{"id":0,"x":18.00,"y":15.28,"hdg":-0.448,"batt":100.0,"det":false},{"id":1,"x":214.15,"y":11.93,"hdg":-0.231,"batt":100.0,"det":false},{"id":2,"x":14.93,"y":213.03,"hdg":0.380,"batt":100.0,"det":false},{"id":3,"x":210.75,"y":213.64,"hdg":0.807,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":3,"t":3.00,"coverage":0.0239,"drones":[{"id":0,"x":17.50,"y":23.27,"hdg":1.633,"batt":100.0,"det":false},{"id":1,"x":210.28,"y":18.94,"hdg":2.075,"batt":100.0,"det":false},{"id":2,"x":8.58,"y":217.89,"hdg":2.488,"batt":100.0,"det":false},{"id":3,"x":203.17,"y":211.09,"hdg":-2.817,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":4,"t":4.00,"coverage":0.0242,"drones":[{"id":0,"x":12.69,"y":16.87,"hdg":-2.216,"batt":100.0,"det":false},{"id":1,"x":210.61,"y":10.94,"hdg":-1.530,"batt":100.0,"det":false},{"id":2,"x":13.21,"y":211.37,"hdg":-0.953,"batt":100.0,"det":false},{"id":3,"x":210.71,"y":208.41,"hdg":-0.342,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":5,"t":5.00,"coverage":0.0253,"drones":[{"id":0,"x":20.33,"y":19.24,"hdg":0.300,"batt":100.0,"det":false},{"id":1,"x":215.51,"y":17.26,"hdg":0.911,"batt":100.0,"det":false},{"id":2,"x":13.60,"y":219.36,"hdg":1.522,"batt":100.0,"det":false},{"id":3,"x":206.44,"y":215.18,"hdg":2.133,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":6,"t":6.00,"coverage":0.0253,"drones":[{"id":0,"x":13.41,"y":23.24,"hdg":2.618,"batt":100.0,"det":false},{"id":1,"x":207.75,"y":15.33,"hdg":-2.897,"batt":100.0,"det":false},{"id":2,"x":9.45,"y":212.53,"hdg":-2.117,"batt":100.0,"det":false},{"id":3,"x":205.61,"y":207.22,"hdg":-1.675,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":7,"t":7.00,"coverage":0.0256,"drones":[{"id":0,"x":17.81,"y":16.56,"hdg":-0.988,"batt":100.0,"det":false},{"id":1,"x":215.27,"y":12.60,"hdg":-0.347,"batt":100.0,"det":false},{"id":2,"x":17.30,"y":214.03,"hdg":0.189,"batt":100.0,"det":false},{"id":3,"x":211.19,"y":212.96,"hdg":0.800,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":8,"t":8.00,"coverage":0.0264,"drones":[{"id":0,"x":18.85,"y":24.49,"hdg":1.441,"batt":100.0,"det":false},{"id":1,"x":211.56,"y":19.69,"hdg":2.053,"batt":100.0,"det":false},{"id":2,"x":14.49,"y":221.52,"hdg":1.930,"batt":100.0,"det":false},{"id":3,"x":203.26,"y":211.89,"hdg":-3.008,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":9,"t":9.00,"coverage":0.0264,"drones":[{"id":0,"x":13.97,"y":18.15,"hdg":-2.227,"batt":100.0,"det":false},{"id":1,"x":209.04,"y":12.10,"hdg":-1.891,"batt":100.0,"det":false},{"id":2,"x":17.80,"y":214.23,"hdg":-1.144,"batt":100.0,"det":false},{"id":3,"x":210.15,"y":207.83,"hdg":-0.533,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":10,"t":10.00,"coverage":0.0272,"drones":[{"id":0,"x":21.92,"y":19.02,"hdg":0.109,"batt":100.0,"det":false},{"id":1,"x":215.06,"y":17.37,"hdg":0.720,"batt":100.0,"det":false},{"id":2,"x":19.70,"y":222.00,"hdg":1.331,"batt":100.0,"det":false},{"id":3,"x":207.25,"y":215.28,"hdg":1.942,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":11,"t":11.00,"coverage":0.0273,"drones":[{"id":0,"x":17.11,"y":25.41,"hdg":2.216,"batt":100.0,"det":false},{"id":1,"x":207.07,"y":16.95,"hdg":-3.089,"batt":100.0,"det":false},{"id":2,"x":15.06,"y":215.49,"hdg":-2.189,"batt":100.0,"det":false},{"id":3,"x":204.91,"y":207.63,"hdg":-1.866,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":12,"t":12.00,"coverage":0.0278,"drones":[{"id":0,"x":21.28,"y":18.59,"hdg":-1.022,"batt":100.0,"det":false},{"id":1,"x":215.04,"y":16.23,"hdg":-0.090,"batt":100.0,"det":false},{"id":2,"x":23.06,"y":215.47,"hdg":-0.002,"batt":100.0,"det":false},{"id":3,"x":211.48,"y":212.20,"hdg":0.609,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":13,"t":13.00,"coverage":0.0289,"drones":[{"id":0,"x":23.80,"y":26.18,"hdg":1.250,"batt":100.0,"det":false},{"id":1,"x":212.75,"y":23.89,"hdg":1.861,"batt":100.0,"det":false},{"id":2,"x":17.22,"y":220.93,"hdg":2.389,"batt":100.0,"det":false},{"id":3,"x":203.49,"y":212.67,"hdg":3.084,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":14,"t":14.00,"coverage":0.0291,"drones":[{"id":0,"x":17.61,"y":21.12,"hdg":-2.457,"batt":100.0,"det":false},{"id":1,"x":207.02,"y":18.31,"hdg":-2.369,"batt":100.0,"det":false},{"id":2,"x":19.09,"y":213.15,"hdg":-1.336,"batt":100.0,"det":false},{"id":3,"x":209.48,"y":207.36,"hdg":-0.725,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":15,"t":15.00,"coverage":0.0294,"drones":[{"id":0,"x":25.58,"y":20.46,"hdg":-0.083,"batt":100.0,"det":false},{"id":1,"x":213.93,"y":22.34,"hdg":0.528,"batt":100.0,"det":false},{"id":2,"x":22.43,"y":220.42,"hdg":1.139,"batt":100.0,"det":false},{"id":3,"x":208.05,"y":215.24,"hdg":1.750,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":16,"t":16.00,"coverage":0.0297,"drones":[{"id":0,"x":19.72,"y":25.91,"hdg":2.392,"batt":100.0,"det":false},{"id":1,"x":206.00,"y":23.44,"hdg":3.003,"batt":100.0,"det":false},{"id":2,"x":20.23,"y":212.73,"hdg":-1.849,"batt":100.0,"det":false},{"id":3,"x":204.31,"y":208.17,"hdg":-2.058,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":17,"t":17.00,"coverage":0.0306,"drones":[{"id":0,"x":25.88,"y":20.79,"hdg":-0.693,"batt":100.0,"det":false},{"id":1,"x":212.03,"y":18.18,"hdg":-0.718,"batt":100.0,"det":false},{"id":2,"x":28.08,"y":211.19,"hdg":-0.194,"batt":100.0,"det":false},{"id":3,"x":211.62,"y":211.41,"hdg":0.417,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":18,"t":18.00,"coverage":0.0319,"drones":[{"id":0,"x":29.79,"y":27.77,"hdg":1.059,"batt":100.0,"det":false},{"id":1,"x":211.23,"y":26.14,"hdg":1.670,"batt":100.0,"det":false},{"id":2,"x":24.04,"y":218.09,"hdg":2.101,"batt":100.0,"det":false},{"id":3,"x":203.87,"y":213.38,"hdg":2.892,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":19,"t":19.00,"coverage":0.0320,"drones":[{"id":0,"x":23.66,"y":22.63,"hdg":-2.444,"batt":100.0,"det":false},{"id":1,"x":206.90,"y":19.41,"hdg":-2.143,"batt":100.0,"det":false},{"id":2,"x":24.39,"y":210.10,"hdg":-1.527,"batt":100.0,"det":false},{"id":3,"x":208.74,"y":207.04,"hdg":-0.916,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":20,"t":20.00,"coverage":0.0331,"drones":[{"id":0,"x":31.36,"y":20.46,"hdg":-0.274,"batt":100.0,"det":false},{"id":1,"x":214.45,"y":22.06,"hdg":0.337,"batt":100.0,"det":false},{"id":2,"x":29.05,"y":216.59,"hdg":0.948,"batt":100.0,"det":false},{"id":3,"x":208.84,"y":215.04,"hdg":1.559,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":21,"t":21.00,"coverage":0.0333,"drones":[{"id":0,"x":26.65,"y":26.93,"hdg":2.201,"batt":100.0,"det":false},{"id":1,"x":206.88,"y":24.65,"hdg":2.812,"batt":100.0,"det":false},{"id":2,"x":21.53,"y":213.88,"hdg":-2.795,"batt":100.0,"det":false},{"id":3,"x":203.82,"y":208.81,"hdg":-2.249,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":22,"t":22.00,"coverage":0.0338,"drones":[{"id":0,"x":26.23,"y":18.94,"hdg":-1.623,"batt":100.0,"det":false},{"id":1,"x":213.94,"y":20.88,"hdg":-0.491,"batt":100.0,"det":false},{"id":2,"x":28.94,"y":210.87,"hdg":-0.385,"batt":100.0,"det":false},{"id":3,"x":211.61,"y":210.60,"hdg":0.226,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":23,"t":23.00,"coverage":0.0345,"drones":[{"id":0,"x":31.41,"y":25.04,"hdg":0.868,"batt":100.0,"det":false},{"id":1,"x":214.68,"y":28.84,"hdg":1.479,"batt":100.0,"det":false},{"id":2,"x":24.98,"y":217.82,"hdg":2.090,"batt":100.0,"det":false},{"id":3,"x":204.38,"y":214.01,"hdg":2.701,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":24,"t":24.00,"coverage":0.0347,"drones":[{"id":0,"x":23.57,"y":23.44,"hdg":-2.941,"batt":100.0,"det":false},{"id":1,"x":208.55,"y":23.71,"hdg":-2.444,"batt":100.0,"det":false},{"id":2,"x":23.80,"y":209.91,"hdg":-1.718,"batt":100.0,"det":false},{"id":3,"x":207.95,"y":206.86,"hdg":-1.107,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":25,"t":25.00,"coverage":0.0347,"drones":[{"id":0,"x":30.72,"y":19.85,"hdg":-0.466,"batt":100.0,"det":false},{"id":1,"x":216.46,"y":24.87,"hdg":0.145,"batt":100.0,"det":false},{"id":2,"x":29.62,"y":215.40,"hdg":0.757,"batt":100.0,"det":false},{"id":3,"x":209.57,"y":214.69,"hdg":1.368,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":26,"t":26.00,"coverage":0.0348,"drones":[{"id":0,"x":28.91,"y":27.65,"hdg":1.799,"batt":100.0,"det":false},{"id":1,"x":209.52,"y":28.85,"hdg":2.620,"batt":100.0,"det":false},{"id":2,"x":21.83,"y":213.54,"hdg":-2.908,"batt":100.0,"det":false},{"id":3,"x":203.45,"y":209.53,"hdg":-2.441,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":27,"t":27.00,"coverage":0.0348,"drones":[{"id":0,"x":24.44,"y":21.01,"hdg":-2.163,"batt":100.0,"det":false},{"id":1,"x":212.71,"y":21.51,"hdg":-1.161,"batt":100.0,"det":false},{"id":2,"x":28.54,"y":209.18,"hdg":-0.577,"batt":100.0,"det":false},{"id":3,"x":211.45,"y":209.81,"hdg":0.034,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":28,"t":28.00,"coverage":0.0348,"drones":[{"id":0,"x":30.68,"y":26.01,"hdg":0.676,"batt":100.0,"det":false},{"id":1,"x":214.95,"y":29.19,"hdg":1.287,"batt":100.0,"det":false},{"id":2,"x":25.97,"y":216.76,"hdg":1.898,"batt":100.0,"det":false},{"id":3,"x":205.50,"y":215.16,"hdg":2.409,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":29,"t":29.00,"coverage":0.0348,"drones":[{"id":0,"x":22.68,"y":25.89,"hdg":-3.126,"batt":100.0,"det":false},{"id":1,"x":208.44,"y":24.54,"hdg":-2.521,"batt":100.0,"det":false},{"id":2,"x":23.31,"y":209.21,"hdg":-1.910,"batt":100.0,"det":false},{"id":3,"x":207.65,"y":207.45,"hdg":-1.299,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":30,"t":30.00,"coverage":0.0348,"drones":[{"id":0,"x":29.02,"y":21.01,"hdg":-0.657,"batt":100.0,"det":false},{"id":1,"x":216.43,"y":24.17,"hdg":-0.046,"batt":100.0,"det":false},{"id":2,"x":30.06,"y":213.50,"hdg":0.565,"batt":100.0,"det":false},{"id":3,"x":210.73,"y":214.84,"hdg":1.176,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":31,"t":31.00,"coverage":0.0350,"drones":[{"id":0,"x":27.06,"y":28.76,"hdg":1.818,"batt":100.0,"det":false},{"id":1,"x":210.38,"y":29.40,"hdg":2.429,"batt":100.0,"det":false},{"id":2,"x":22.11,"y":214.38,"hdg":3.031,"batt":100.0,"det":false},{"id":3,"x":203.74,"y":210.93,"hdg":-2.632,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":32,"t":32.00,"coverage":0.0350,"drones":[{"id":0,"x":23.65,"y":21.52,"hdg":-2.011,"batt":100.0,"det":false},{"id":1,"x":213.19,"y":21.91,"hdg":-1.212,"batt":100.0,"det":false},{"id":2,"x":27.86,"y":208.82,"hdg":-0.768,"batt":100.0,"det":false},{"id":3,"x":211.64,"y":209.68,"hdg":-0.157,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":33,"t":33.00,"coverage":0.0352,"drones":[{"id":0,"x":30.73,"y":25.25,"hdg":0.485,"batt":100.0,"det":false},{"id":1,"x":216.85,"y":29.03,"hdg":1.096,"batt":100.0,"det":false},{"id":2,"x":26.71,"y":216.73,"hdg":1.716,"batt":100.0,"det":false},{"id":3,"x":206.21,"y":215.55,"hdg":2.318,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":34,"t":34.00,"coverage":0.0356,"drones":[{"id":0,"x":28.43,"y":32.91,"hdg":1.863,"batt":100.0,"det":false},{"id":1,"x":209.57,"y":25.70,"hdg":-2.712,"batt":100.0,"det":false},{"id":2,"x":24.53,"y":209.04,"hdg":-1.847,"batt":100.0,"det":false},{"id":3,"x":206.85,"y":207.58,"hdg":-1.490,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":35,"t":35.00,"coverage":0.0364,"drones":[{"id":0,"x":35.79,"y":29.80,"hdg":-0.400,"batt":100.0,"det":false},{"id":1,"x":217.35,"y":23.82,"hdg":-0.237,"batt":100.0,"det":false},{"id":2,"x":31.97,"y":211.96,"hdg":0.374,"batt":100.0,"det":false},{"id":3,"x":211.28,"y":214.24,"hdg":0.985,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":36,"t":36.00,"coverage":0.0375,"drones":[{"id":0,"x":35.35,"y":37.79,"hdg":1.627,"batt":100.0,"det":false},{"id":1,"x":212.40,"y":30.10,"hdg":2.238,"batt":100.0,"det":false},{"id":2,"x":24.82,"y":215.54,"hdg":2.678,"batt":100.0,"det":false},{"id":3,"x":203.68,"y":211.74,"hdg":-2.823,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":37,"t":37.00,"coverage":0.0375,"drones":[{"id":0,"x":30.12,"y":31.73,"hdg":-2.283,"batt":100.0,"det":false},{"id":1,"x":212.40,"y":22.10,"hdg":-1.571,"batt":100.0,"det":false},{"id":2,"x":29.41,"y":208.99,"hdg":-0.959,"batt":100.0,"det":false},{"id":3,"x":211.03,"y":208.59,"hdg":-0.404,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":38,"t":38.00,"coverage":0.0377,"drones":[{"id":0,"x":37.78,"y":34.04,"hdg":0.293,"batt":100.0,"det":false},{"id":1,"x":217.07,"y":28.60,"hdg":0.948,"batt":100.0,"det":false},{"id":2,"x":29.85,"y":216.97,"hdg":1.516,"batt":100.0,"det":false},{"id":3,"x":206.81,"y":215.39,"hdg":2.127,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":39,"t":39.00,"coverage":0.0380,"drones":[{"id":0,"x":30.33,"y":36.96,"hdg":2.768,"batt":100.0,"det":false},{"id":1,"x":209.30,"y":26.71,"hdg":-2.904,"batt":100.0,"det":false},{"id":2,"x":24.57,"y":210.97,"hdg":-2.293,"batt":100.0,"det":false},{"id":3,"x":205.93,"y":207.44,"hdg":-1.682,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":40,"t":40.00,"coverage":0.0380,"drones":[{"id":0,"x":34.38,"y":30.06,"hdg":-1.040,"batt":100.0,"det":false},{"id":1,"x":216.67,"y":23.61,"hdg":-0.398,"batt":100.0,"det":false},{"id":2,"x":32.43,"y":212.42,"hdg":0.182,"batt":100.0,"det":false},{"id":3,"x":211.54,"y":213.14,"hdg":0.793,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":41,"t":41.00,"coverage":0.0380,"drones":[{"id":0,"x":35.46,"y":37.99,"hdg":1.435,"batt":100.0,"det":false},{"id":1,"x":213.01,"y":30.72,"hdg":2.046,"batt":100.0,"det":false},{"id":2,"x":25.35,"y":216.14,"hdg":2.657,"batt":100.0,"det":false},{"id":3,"x":203.60,"y":212.13,"hdg":-3.015,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":42,"t":42.00,"coverage":0.0380,"drones":[{"id":0,"x":29.71,"y":32.43,"hdg":-2.373,"batt":100.0,"det":false},{"id":1,"x":210.84,"y":23.02,"hdg":-1.845,"batt":100.0,"det":false},{"id":2,"x":28.62,"y":208.84,"hdg":-1.151,"batt":100.0,"det":false},{"id":3,"x":210.47,"y":208.02,"hdg":-0.540,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":43,"t":43.00,"coverage":0.0380,"drones":[{"id":0,"x":37.67,"y":33.24,"hdg":0.102,"batt":100.0,"det":false},{"id":1,"x":216.89,"y":28.26,"hdg":0.713,"batt":100.0,"det":false},{"id":2,"x":30.57,"y":216.60,"hdg":1.324,"batt":100.0,"det":false},{"id":3,"x":207.62,"y":215.49,"hdg":1.935,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":44,"t":44.00,"coverage":0.0384,"drones":[{"id":0,"x":33.06,"y":39.78,"hdg":2.185,"batt":100.0,"det":false},{"id":1,"x":208.90,"y":27.88,"hdg":-3.095,"batt":100.0,"det":false},{"id":2,"x":25.73,"y":210.23,"hdg":-2.220,"batt":100.0,"det":false},{"id":3,"x":205.23,"y":207.86,"hdg":-1.873,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":45,"t":45.00,"coverage":0.0389,"drones":[{"id":0,"x":37.03,"y":32.84,"hdg":-1.052,"batt":100.0,"det":false},{"id":1,"x":215.41,"y":23.24,"hdg":-0.620,"batt":100.0,"det":false},{"id":2,"x":33.73,"y":210.15,"hdg":-0.009,"batt":100.0,"det":false},{"id":3,"x":211.83,"y":212.39,"hdg":0.602,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":46,"t":46.00,"coverage":0.0395,"drones":[{"id":0,"x":39.60,"y":40.41,"hdg":1.244,"batt":100.0,"det":false},{"id":1,"x":213.17,"y":30.91,"hdg":1.855,"batt":100.0,"det":false},{"id":2,"x":27.54,"y":215.21,"hdg":2.456,"batt":100.0,"det":false},{"id":3,"x":203.84,"y":212.90,"hdg":3.077,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":47,"t":47.00,"coverage":0.0398,"drones":[{"id":0,"x":32.90,"y":36.05,"hdg":-2.564,"batt":100.0,"det":false},{"id":1,"x":205.84,"y":27.71,"hdg":-2.730,"batt":100.0,"det":false},{"id":2,"x":29.35,"y":207.42,"hdg":-1.342,"batt":100.0,"det":false},{"id":3,"x":209.80,"y":207.56,"hdg":-0.731,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":48,"t":48.00,"coverage":0.0400,"drones":[{"id":0,"x":40.86,"y":35.33,"hdg":-0.089,"batt":100.0,"det":false},{"id":1,"x":212.78,"y":31.70,"hdg":0.522,"batt":100.0,"det":false},{"id":2,"x":32.74,"y":214.67,"hdg":1.133,"batt":100.0,"det":false},{"id":3,"x":208.42,"y":215.44,"hdg":1.744,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":49,"t":49.00,"coverage":0.0406,"drones":[{"id":0,"x":35.04,"y":40.82,"hdg":2.386,"batt":100.0,"det":false},{"id":1,"x":204.86,"y":32.85,"hdg":2.997,"batt":100.0,"det":false},{"id":2,"x":25.60,"y":211.07,"hdg":-2.675,"batt":100.0,"det":false},{"id":3,"x":204.63,"y":208.40,"hdg":-2.064,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":50,"t":50.00,"coverage":0.0406,"drones":[{"id":0,"x":36.22,"y":32.91,"hdg":-1.423,"batt":100.0,"det":false},{"id":1,"x":210.73,"y":27.42,"hdg":-0.747,"batt":100.0,"det":false},{"id":2,"x":33.44,"y":209.48,"hdg":-0.200,"batt":100.0,"det":false},{"id":3,"x":211.97,"y":211.59,"hdg":0.411,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":51,"t":51.00,"coverage":0.0409,"drones":[{"id":0,"x":40.19,"y":39.86,"hdg":1.052,"batt":100.0,"det":false},{"id":1,"x":209.99,"y":35.38,"hdg":1.663,"batt":100.0,"det":false},{"id":2,"x":31.20,"y":217.16,"hdg":1.853,"batt":100.0,"det":false},{"id":3,"x":204.23,"y":213.61,"hdg":2.886,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":52,"t":52.00,"coverage":0.0409,"drones":[{"id":0,"x":34.51,"y":34.22,"hdg":-2.360,"batt":100.0,"det":false},{"id":1,"x":205.64,"y":28.66,"hdg":-2.145,"batt":100.0,"det":false},{"id":2,"x":31.50,"y":209.17,"hdg":-1.534,"batt":100.0,"det":false},{"id":3,"x":209.06,"y":207.24,"hdg":-0.923,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":53,"t":53.00,"coverage":0.0417,"drones":[{"id":0,"x":42.19,"y":32.01,"hdg":-0.281,"batt":100.0,"det":false},{"id":1,"x":213.21,"y":31.26,"hdg":0.330,"batt":100.0,"det":false},{"id":2,"x":36.21,"y":215.63,"hdg":0.941,"batt":100.0,"det":false},{"id":3,"x":209.21,"y":215.24,"hdg":1.552,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":54,"t":54.00,"coverage":0.0419,"drones":[{"id":0,"x":37.52,"y":38.50,"hdg":2.194,"batt":100.0,"det":false},{"id":1,"x":205.66,"y":33.90,"hdg":2.805,"batt":100.0,"det":false},{"id":2,"x":28.71,"y":212.85,"hdg":-2.786,"batt":100.0,"det":false},{"id":3,"x":204.14,"y":209.04,"hdg":-2.256,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":55,"t":55.00,"coverage":0.0422,"drones":[{"id":0,"x":37.07,"y":30.51,"hdg":-1.628,"batt":100.0,"det":false},{"id":1,"x":209.96,"y":27.15,"hdg":-1.003,"batt":100.0,"det":false},{"id":2,"x":36.11,"y":209.79,"hdg":-0.392,"batt":100.0,"det":false},{"id":3,"x":211.95,"y":210.78,"hdg":0.219,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":56,"t":56.00,"coverage":0.0423,"drones":[{"id":0,"x":42.28,"y":36.58,"hdg":0.861,"batt":100.0,"det":false},{"id":1,"x":210.75,"y":35.12,"hdg":1.472,"batt":100.0,"det":false},{"id":2,"x":32.18,"y":216.76,"hdg":2.083,"batt":100.0,"det":false},{"id":3,"x":204.74,"y":214.24,"hdg":2.694,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":57,"t":57.00,"coverage":0.0423,"drones":[{"id":0,"x":34.43,"y":35.04,"hdg":-2.947,"batt":100.0,"det":false},{"id":1,"x":203.97,"y":30.87,"hdg":-2.582,"batt":100.0,"det":false},{"id":2,"x":30.96,"y":208.86,"hdg":-1.725,"batt":100.0,"det":false},{"id":3,"x":208.27,"y":207.06,"hdg":-1.114,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":58,"t":58.00,"coverage":0.0423,"drones":[{"id":0,"x":41.56,"y":31.40,"hdg":-0.472,"batt":100.0,"det":false},{"id":1,"x":211.89,"y":31.97,"hdg":0.139,"batt":100.0,"det":false},{"id":2,"x":36.81,"y":214.31,"hdg":0.750,"batt":100.0,"det":false},{"id":3,"x":209.93,"y":214.89,"hdg":1.361,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":59,"t":59.00,"coverage":0.0425,"drones":[{"id":0,"x":38.21,"y":38.66,"hdg":2.003,"batt":100.0,"det":false},{"id":1,"x":204.98,"y":36.00,"hdg":2.614,"batt":100.0,"det":false},{"id":2,"x":28.84,"y":213.65,"hdg":-3.058,"batt":100.0,"det":false},{"id":3,"x":203.79,"y":209.77,"hdg":-2.447,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":60,"t":60.00,"coverage":0.0425,"drones":[{"id":0,"x":36.35,"y":30.88,"hdg":-1.805,"batt":100.0,"det":false},{"id":1,"x":208.13,"y":28.65,"hdg":-1.167,"batt":100.0,"det":false},{"id":2,"x":35.51,"y":209.24,"hdg":-0.583,"batt":100.0,"det":false},{"id":3,"x":211.78,"y":209.99,"hdg":0.028,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":61,"t":61.00,"coverage":0.0427,"drones":[{"id":0,"x":42.62,"y":35.85,"hdg":0.670,"batt":100.0,"det":false},{"id":1,"x":210.41,"y":36.31,"hdg":1.281,"batt":100.0,"det":false},{"id":2,"x":32.99,"y":216.83,"hdg":1.892,"batt":100.0,"det":false},{"id":3,"x":205.36,"y":214.76,"hdg":2.503,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":62,"t":62.00,"coverage":0.0427,"drones":[{"id":0,"x":34.62,"y":35.80,"hdg":-3.136,"batt":100.0,"det":false},{"id":1,"x":203.88,"y":31.70,"hdg":-2.528,"batt":100.0,"det":false},{"id":2,"x":30.28,"y":209.30,"hdg":-1.916,"batt":100.0,"det":false},{"id":3,"x":207.46,"y":207.04,"hdg":-1.305,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":63,"t":63.00,"coverage":0.0427,"drones":[{"id":0,"x":40.96,"y":30.92,"hdg":-0.657,"batt":100.0,"det":false},{"id":1,"x":211.86,"y":31.28,"hdg":-0.053,"batt":100.0,"det":false},{"id":2,"x":37.06,"y":213.54,"hdg":0.559,"batt":100.0,"det":false},{"id":3,"x":212.28,"y":213.42,"hdg":0.924,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":64,"t":64.00,"coverage":0.0427,"drones":[{"id":0,"x":39.05,"y":38.69,"hdg":1.811,"batt":100.0,"det":false},{"id":1,"x":207.88,"y":38.22,"hdg":2.092,"batt":100.0,"det":false},{"id":2,"x":29.12,"y":214.48,"hdg":3.024,"batt":100.0,"det":false},{"id":3,"x":205.27,"y":209.56,"hdg":-2.639,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":65,"t":65.00,"coverage":0.0427,"drones":[{"id":0,"x":35.74,"y":31.40,"hdg":-1.997,"batt":100.0,"det":false},{"id":1,"x":211.74,"y":31.21,"hdg":-1.068,"batt":100.0,"det":false},{"id":2,"x":34.84,"y":208.89,"hdg":-0.775,"batt":100.0,"det":false},{"id":3,"x":213.17,"y":208.26,"hdg":-0.164,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":66,"t":66.00,"coverage":0.0430,"drones":[{"id":0,"x":42.85,"y":35.08,"hdg":0.478,"batt":100.0,"det":false},{"id":1,"x":215.44,"y":38.30,"hdg":1.089,"batt":100.0,"det":false},{"id":2,"x":33.80,"y":216.82,"hdg":1.700,"batt":100.0,"det":false},{"id":3,"x":207.77,"y":214.17,"hdg":2.311,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":67,"t":67.00,"coverage":0.0431,"drones":[{"id":0,"x":34.99,"y":36.58,"hdg":2.953,"batt":100.0,"det":false},{"id":1,"x":208.14,"y":35.02,"hdg":-2.719,"batt":100.0,"det":false},{"id":2,"x":29.71,"y":209.95,"hdg":-2.108,"batt":100.0,"det":false},{"id":3,"x":208.36,"y":206.19,"hdg":-1.497,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":68,"t":68.00,"coverage":0.0431,"drones":[{"id":0,"x":40.24,"y":30.54,"hdg":-0.855,"batt":100.0,"det":false},{"id":1,"x":215.91,"y":33.09,"hdg":-0.244,"batt":100.0,"det":false},{"id":2,"x":37.18,"y":212.82,"hdg":0.367,"batt":100.0,"det":false},{"id":3,"x":212.83,"y":212.82,"hdg":0.978,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":69,"t":69.00,"coverage":0.0434,"drones":[{"id":0,"x":39.76,"y":38.53,"hdg":1.630,"batt":100.0,"det":false},{"id":1,"x":211.00,"y":39.41,"hdg":2.231,"batt":100.0,"det":false},{"id":2,"x":30.95,"y":217.84,"hdg":2.462,"batt":100.0,"det":false},{"id":3,"x":205.21,"y":210.37,"hdg":-2.830,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":70,"t":70.00,"coverage":0.0434,"drones":[{"id":0,"x":34.02,"y":32.96,"hdg":-2.372,"batt":100.0,"det":false},{"id":1,"x":210.95,"y":31.41,"hdg":-1.577,"batt":100.0,"det":false},{"id":2,"x":35.50,"y":211.26,"hdg":-0.966,"batt":100.0,"det":false},{"id":3,"x":212.72,"y":207.59,"hdg":-0.355,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":71,"t":71.00,"coverage":0.0437,"drones":[{"id":0,"x":41.69,"y":35.23,"hdg":0.287,"batt":100.0,"det":false},{"id":1,"x":215.94,"y":37.66,"hdg":0.898,"batt":100.0,"det":false},{"id":2,"x":36.00,"y":219.25,"hdg":1.509,"batt":100.0,"det":false},{"id":3,"x":208.54,"y":214.41,"hdg":2.120,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":72,"t":72.00,"coverage":0.0437,"drones":[{"id":0,"x":34.51,"y":38.76,"hdg":2.684,"batt":100.0,"det":false},{"id":1,"x":208.15,"y":35.83,"hdg":-2.910,"batt":100.0,"det":false},{"id":2,"x":30.67,"y":213.28,"hdg":-2.299,"batt":100.0,"det":false},{"id":3,"x":207.60,"y":206.47,"hdg":-1.688,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":73,"t":73.00,"coverage":0.0437,"drones":[{"id":0,"x":38.60,"y":31.88,"hdg":-1.034,"batt":100.0,"det":false},{"id":1,"x":216.01,"y":34.36,"hdg":-0.185,"batt":100.0,"det":false},{"id":2,"x":38.55,"y":214.68,"hdg":0.176,"batt":100.0,"det":false},{"id":3,"x":213.25,"y":212.13,"hdg":0.787,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":74,"t":74.00,"coverage":0.0439,"drones":[{"id":0,"x":39.74,"y":39.80,"hdg":1.429,"batt":100.0,"det":false},{"id":1,"x":212.40,"y":41.50,"hdg":2.040,"batt":100.0,"det":false},{"id":2,"x":31.49,"y":218.45,"hdg":2.651,"batt":100.0,"det":false},{"id":3,"x":205.31,"y":211.17,"hdg":-3.021,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":75,"t":75.00,"coverage":0.0439,"drones":[{"id":0,"x":33.95,"y":34.28,"hdg":-2.380,"batt":100.0,"det":false},{"id":1,"x":209.97,"y":33.87,"hdg":-1.879,"batt":100.0,"det":false},{"id":2,"x":34.71,"y":211.12,"hdg":-1.157,"batt":100.0,"det":false},{"id":3,"x":212.14,"y":207.02,"hdg":-0.546,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":76,"t":76.00,"coverage":0.0441,"drones":[{"id":0,"x":41.91,"y":35.04,"hdg":0.095,"batt":100.0,"det":false},{"id":1,"x":216.05,"y":39.07,"hdg":0.706,"batt":100.0,"det":false},{"id":2,"x":36.71,"y":218.87,"hdg":1.318,"batt":100.0,"det":false},{"id":3,"x":209.34,"y":214.51,"hdg":1.929,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":77,"t":77.00,"coverage":0.0441,"drones":[{"id":0,"x":35.18,"y":39.37,"hdg":2.570,"batt":100.0,"det":false},{"id":1,"x":208.06,"y":38.75,"hdg":-3.102,"batt":100.0,"det":false},{"id":2,"x":34.14,"y":211.29,"hdg":-1.897,"batt":100.0,"det":false},{"id":3,"x":206.91,"y":206.89,"hdg":-1.880,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":78,"t":78.00,"coverage":0.0447,"drones":[{"id":0,"x":42.14,"y":35.42,"hdg":-0.517,"batt":100.0,"det":false},{"id":1,"x":214.54,"y":34.06,"hdg":-0.627,"batt":100.0,"det":false},{"id":2,"x":42.14,"y":211.16,"hdg":-0.016,"batt":100.0,"det":false},{"id":3,"x":213.53,"y":211.38,"hdg":0.595,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":79,"t":79.00,"coverage":0.0456,"drones":[{"id":0,"x":44.76,"y":42.97,"hdg":1.237,"batt":100.0,"det":false},{"id":1,"x":212.35,"y":41.75,"hdg":1.848,"batt":100.0,"det":false},{"id":2,"x":36.35,"y":216.68,"hdg":2.380,"batt":100.0,"det":false},{"id":3,"x":205.56,"y":211.94,"hdg":3.070,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":80,"t":80.00,"coverage":0.0456,"drones":[{"id":0,"x":38.49,"y":38.00,"hdg":-2.470,"batt":100.0,"det":false},{"id":1,"x":209.31,"y":34.35,"hdg":-1.960,"batt":100.0,"det":false},{"id":2,"x":38.11,"y":208.88,"hdg":-1.349,"batt":100.0,"det":false},{"id":3,"x":211.47,"y":206.56,"hdg":-0.738,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":81,"t":81.00,"coverage":0.0459,"drones":[{"id":0,"x":46.46,"y":37.23,"hdg":-0.096,"batt":100.0,"det":false},{"id":1,"x":216.28,"y":38.29,"hdg":0.515,"batt":100.0,"det":false},{"id":2,"x":41.55,"y":216.10,"hdg":1.126,"batt":100.0,"det":false},{"id":3,"x":210.15,"y":214.45,"hdg":1.737,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":82,"t":82.00,"coverage":0.0459,"drones":[{"id":0,"x":40.67,"y":42.76,"hdg":2.379,"batt":100.0,"det":false},{"id":1,"x":208.37,"y":39.50,"hdg":2.990,"batt":100.0,"det":false},{"id":2,"x":34.38,"y":212.55,"hdg":-2.682,"batt":100.0,"det":false},{"id":3,"x":206.31,"y":207.43,"hdg":-2.071,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":83,"t":83.00,"coverage":0.0461,"drones":[{"id":0,"x":41.80,"y":34.84,"hdg":-1.429,"batt":100.0,"det":false},{"id":1,"x":215.01,"y":35.03,"hdg":-0.592,"batt":100.0,"det":false},{"id":2,"x":42.21,"y":210.91,"hdg":-0.207,"batt":100.0,"det":false},{"id":3,"x":213.67,"y":210.58,"hdg":0.404,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":84,"t":84.00,"coverage":0.0464,"drones":[{"id":0,"x":45.81,"y":41.76,"hdg":1.046,"batt":100.0,"det":false},{"id":1,"x":214.32,"y":43.00,"hdg":1.657,"batt":100.0,"det":false},{"id":2,"x":37.08,"y":217.04,"hdg":2.268,"batt":100.0,"det":false},{"id":3,"x":205.94,"y":212.65,"hdg":2.879,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":85,"t":85.00,"coverage":0.0466,"drones":[{"id":0,"x":38.38,"y":38.80,"hdg":-2.762,"batt":100.0,"det":false},{"id":1,"x":209.93,"y":36.32,"hdg":-2.151,"batt":100.0,"det":false},{"id":2,"x":37.32,"y":209.05,"hdg":-1.540,"batt":100.0,"det":false},{"id":3,"x":210.73,"y":206.25,"hdg":-0.929,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":86,"t":86.00,"coverage":0.0466,"drones":[{"id":0,"x":46.05,"y":36.53,"hdg":-0.287,"batt":100.0,"det":false},{"id":1,"x":217.52,"y":38.86,"hdg":0.324,"batt":100.0,"det":false},{"id":2,"x":42.07,"y":215.48,"hdg":0.935,"batt":100.0,"det":false},{"id":3,"x":210.93,"y":214.24,"hdg":1.546,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":87,"t":87.00,"coverage":0.0469,"drones":[{"id":0,"x":43.24,"y":44.02,"hdg":1.930,"batt":100.0,"det":false},{"id":1,"x":209.98,"y":41.55,"hdg":2.799,"batt":100.0,"det":false},{"id":2,"x":34.92,"y":211.90,"hdg":-2.677,"batt":100.0,"det":false},{"id":3,"x":205.83,"y":208.08,"hdg":-2.262,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":88,"t":88.00,"coverage":0.0470,"drones":[{"id":0,"x":42.49,"y":36.06,"hdg":-1.665,"batt":100.0,"det":false},{"id":1,"x":214.24,"y":34.78,"hdg":-1.009,"batt":100.0,"det":false},{"id":2,"x":42.29,"y":208.80,"hdg":-0.398,"batt":100.0,"det":false},{"id":3,"x":213.65,"y":209.77,"hdg":0.213,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":89,"t":89.00,"coverage":0.0470,"drones":[{"id":0,"x":47.74,"y":42.09,"hdg":0.854,"batt":100.0,"det":false},{"id":1,"x":215.08,"y":42.73,"hdg":1.466,"batt":100.0,"det":false},{"id":2,"x":38.42,"y":215.80,"hdg":2.077,"batt":100.0,"det":false},{"id":3,"x":207.67,"y":215.09,"hdg":2.414,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":90,"t":90.00,"coverage":0.0470,"drones":[{"id":0,"x":39.89,"y":40.57,"hdg":-2.950,"batt":100.0,"det":false},{"id":1,"x":209.50,"y":37.00,"hdg":-2.343,"batt":100.0,"det":false},{"id":2,"x":37.14,"y":207.90,"hdg":-1.732,"batt":100.0,"det":false},{"id":3,"x":211.16,"y":207.89,"hdg":-1.121,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":91,"t":91.00,"coverage":0.0472,"drones":[{"id":0,"x":46.99,"y":36.88,"hdg":-0.479,"batt":100.0,"det":false},{"id":1,"x":217.43,"y":38.06,"hdg":0.132,"batt":100.0,"det":false},{"id":2,"x":43.03,"y":213.31,"hdg":0.743,"batt":100.0,"det":false},{"id":3,"x":212.87,"y":215.70,"hdg":1.354,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":92,"t":92.00,"coverage":0.0473,"drones":[{"id":0,"x":43.69,"y":44.17,"hdg":1.996,"batt":100.0,"det":false},{"id":1,"x":210.55,"y":42.13,"hdg":2.607,"batt":100.0,"det":false},{"id":2,"x":35.05,"y":212.70,"hdg":-3.065,"batt":100.0,"det":false},{"id":3,"x":206.69,"y":210.62,"hdg":-2.454,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":93,"t":93.00,"coverage":0.0475,"drones":[{"id":0,"x":41.78,"y":36.40,"hdg":-1.812,"batt":100.0,"det":false},{"id":1,"x":214.13,"y":34.97,"hdg":-1.107,"batt":100.0,"det":false},{"id":2,"x":41.70,"y":208.25,"hdg":-0.590,"batt":100.0,"det":false},{"id":3,"x":214.69,"y":210.79,"hdg":0.021,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":94,"t":94.00,"coverage":0.0475,"drones":[{"id":0,"x":48.08,"y":41.32,"hdg":0.663,"batt":100.0,"det":false},{"id":1,"x":216.47,"y":42.63,"hdg":1.274,"batt":100.0,"det":false},{"id":2,"x":40.00,"y":216.07,"hdg":1.785,"batt":100.0,"det":false},{"id":3,"x":208.30,"y":215.60,"hdg":2.496,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":95,"t":95.00,"coverage":0.0475,"drones":[{"id":0,"x":40.08,"y":41.35,"hdg":3.138,"batt":100.0,"det":false},{"id":1,"x":209.90,"y":38.06,"hdg":-2.534,"batt":100.0,"det":false},{"id":2,"x":37.24,"y":208.56,"hdg":-1.923,"batt":100.0,"det":false},{"id":3,"x":210.35,"y":207.87,"hdg":-1.312,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":96,"t":96.00,"coverage":0.0477,"drones":[{"id":0,"x":47.41,"y":38.14,"hdg":-0.414,"batt":100.0,"det":false},{"id":1,"x":217.88,"y":37.59,"hdg":-0.059,"batt":100.0,"det":false},{"id":2,"x":44.05,"y":212.75,"hdg":0.552,"batt":100.0,"det":false},{"id":3,"x":213.52,"y":215.21,"hdg":1.163,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":97,"t":97.00,"coverage":0.0480,"drones":[{"id":0,"x":45.55,"y":45.92,"hdg":1.805,"batt":100.0,"det":false},{"id":1,"x":211.90,"y":42.90,"hdg":2.416,"batt":100.0,"det":false},{"id":2,"x":36.13,"y":213.90,"hdg":2.998,"batt":100.0,"det":false},{"id":3,"x":206.48,"y":211.40,"hdg":-2.645,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":98,"t":98.00,"coverage":0.0480,"drones":[{"id":0,"x":41.85,"y":38.83,"hdg":-2.052,"batt":100.0,"det":false},{"id":1,"x":213.32,"y":35.02,"hdg":-1.392,"batt":100.0,"det":false},{"id":2,"x":41.81,"y":208.27,"hdg":-0.781,"batt":100.0,"det":false},{"id":3,"x":214.28,"y":209.61,"hdg":-0.226,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":99,"t":99.00,"coverage":0.0481,"drones":[{"id":0,"x":48.97,"y":42.46,"hdg":0.472,"batt":100.0,"det":false},{"id":1,"x":217.07,"y":42.09,"hdg":1.083,"batt":100.0,"det":false},{"id":2,"x":40.83,"y":216.21,"hdg":1.694,"batt":100.0,"det":false},{"id":3,"x":208.92,"y":215.55,"hdg":2.305,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":100,"t":100.00,"coverage":0.0483,"drones":[{"id":0,"x":41.13,"y":44.01,"hdg":2.947,"batt":100.0,"det":false},{"id":1,"x":209.73,"y":38.90,"hdg":-2.732,"batt":100.0,"det":false},{"id":2,"x":36.69,"y":209.36,"hdg":-2.114,"batt":100.0,"det":false},{"id":3,"x":209.46,"y":207.57,"hdg":-1.503,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":101,"t":101.00,"coverage":0.0484,"drones":[{"id":0,"x":46.34,"y":37.94,"hdg":-0.862,"batt":100.0,"det":false},{"id":1,"x":217.48,"y":36.92,"hdg":-0.250,"batt":100.0,"det":false},{"id":2,"x":44.18,"y":212.18,"hdg":0.361,"batt":100.0,"det":false},{"id":3,"x":213.97,"y":214.18,"hdg":0.972,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":102,"t":102.00,"coverage":0.0484,"drones":[{"id":0,"x":45.99,"y":45.93,"hdg":1.613,"batt":100.0,"det":false},{"id":1,"x":212.62,"y":43.27,"hdg":2.225,"batt":100.0,"det":false},{"id":2,"x":36.55,"y":214.59,"hdg":2.836,"batt":100.0,"det":false},{"id":3,"x":206.34,"y":211.78,"hdg":-2.837,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":103,"t":103.00,"coverage":0.0484,"drones":[{"id":0,"x":41.32,"y":39.44,"hdg":-2.195,"batt":100.0,"det":false},{"id":1,"x":212.51,"y":35.27,"hdg":-1.584,"batt":100.0,"det":false},{"id":2,"x":41.06,"y":207.98,"hdg":-0.973,"batt":100.0,"det":false},{"id":3,"x":213.83,"y":208.95,"hdg":-0.362,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":104,"t":104.00,"coverage":0.0484,"drones":[{"id":0,"x":49.01,"y":41.65,"hdg":0.280,"batt":100.0,"det":false},{"id":1,"x":217.54,"y":41.50,"hdg":0.891,"batt":100.0,"det":false},{"id":2,"x":41.60,"y":215.96,"hdg":1.502,"batt":100.0,"det":false},{"id":3,"x":209.69,"y":215.80,"hdg":2.113,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":105,"t":105.00,"coverage":0.0484,"drones":[{"id":0,"x":42.70,"y":46.58,"hdg":2.479,"batt":100.0,"det":false},{"id":1,"x":209.74,"y":39.71,"hdg":-2.917,"batt":100.0,"det":false},{"id":2,"x":36.44,"y":209.85,"hdg":-2.272,"batt":100.0,"det":false},{"id":3,"x":208.71,"y":207.86,"hdg":-1.695,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":106,"t":106.00,"coverage":0.0486,"drones":[{"id":0,"x":47.43,"y":40.12,"hdg":-0.939,"batt":100.0,"det":false},{"id":1,"x":216.97,"y":36.29,"hdg":-0.442,"batt":100.0,"det":false},{"id":2,"x":44.33,"y":211.19,"hdg":0.169,"batt":100.0,"det":false},{"id":3,"x":214.39,"y":213.49,"hdg":0.780,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":107,"t":107.00,"coverage":0.0489,"drones":[{"id":0,"x":48.61,"y":48.03,"hdg":1.422,"batt":100.0,"det":false},{"id":1,"x":213.40,"y":43.45,"hdg":2.033,"batt":100.0,"det":false},{"id":2,"x":37.30,"y":215.01,"hdg":2.644,"batt":100.0,"det":false},{"id":3,"x":206.44,"y":212.58,"hdg":-3.028,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":108,"t":108.00,"coverage":0.0489,"drones":[{"id":0,"x":42.79,"y":42.55,"hdg":-2.386,"batt":100.0,"det":false},{"id":1,"x":207.97,"y":37.58,"hdg":-2.317,"batt":100.0,"det":false},{"id":2,"x":40.46,"y":207.66,"hdg":-1.164,"batt":100.0,"det":false},{"id":3,"x":213.25,"y":208.38,"hdg":-0.553,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":109,"t":109.00,"coverage":0.0491,"drones":[{"id":0,"x":50.76,"y":43.26,"hdg":0.089,"batt":100.0,"det":false},{"id":1,"x":214.09,"y":42.73,"hdg":0.700,"batt":100.0,"det":false},{"id":2,"x":42.52,"y":215.40,"hdg":1.311,"batt":100.0,"det":false},{"id":3,"x":210.50,"y":215.89,"hdg":1.922,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":110,"t":110.00,"coverage":0.0494,"drones":[{"id":0,"x":44.05,"y":47.63,"hdg":2.564,"batt":100.0,"det":false},{"id":1,"x":206.09,"y":42.46,"hdg":-3.108,"batt":100.0,"det":false},{"id":2,"x":36.12,"y":210.59,"hdg":-2.497,"batt":100.0,"det":false},{"id":3,"x":208.02,"y":208.28,"hdg":-1.886,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":111,"t":111.00,"coverage":0.0494,"drones":[{"id":0,"x":46.62,"y":40.05,"hdg":-1.244,"batt":100.0,"det":false},{"id":1,"x":212.54,"y":37.73,"hdg":-0.633,"batt":100.0,"det":false},{"id":2,"x":44.12,"y":210.41,"hdg":-0.022,"batt":100.0,"det":false},{"id":3,"x":214.67,"y":212.73,"hdg":0.589,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":112,"t":112.00,"coverage":0.0498,"drones":[{"id":0,"x":49.29,"y":47.59,"hdg":1.231,"batt":100.0,"det":false},{"id":1,"x":210.40,"y":45.44,"hdg":1.842,"batt":100.0,"det":false},{"id":2,"x":40.86,"y":217.72,"hdg":1.990,"batt":100.0,"det":false},{"id":3,"x":206.69,"y":213.35,"hdg":3.064,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":113,"t":113.00,"coverage":0.0498,"drones":[{"id":0,"x":43.53,"y":42.03,"hdg":-2.374,"batt":100.0,"det":false},{"id":1,"x":207.32,"y":38.06,"hdg":-1.966,"batt":100.0,"det":false},{"id":2,"x":42.57,"y":209.90,"hdg":-1.355,"batt":100.0,"det":false},{"id":3,"x":212.58,"y":207.93,"hdg":-0.744,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":114,"t":114.00,"coverage":0.0503,"drones":[{"id":0,"x":51.49,"y":41.21,"hdg":-0.103,"batt":100.0,"det":false},{"id":1,"x":214.31,"y":41.95,"hdg":0.509,"batt":100.0,"det":false},{"id":2,"x":46.06,"y":217.10,"hdg":1.120,"batt":100.0,"det":false},{"id":3,"x":211.30,"y":215.83,"hdg":1.731,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":115,"t":115.00,"coverage":0.0503,"drones":[{"id":0,"x":45.74,"y":46.78,"hdg":2.372,"batt":100.0,"det":false},{"id":1,"x":206.41,"y":43.21,"hdg":2.984,"batt":100.0,"det":false},{"id":2,"x":38.87,"y":213.60,"hdg":-2.689,"batt":100.0,"det":false},{"id":3,"x":207.42,"y":208.83,"hdg":-2.078,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":116,"t":116.00,"coverage":0.0503,"drones":[{"id":0,"x":46.91,"y":38.86,"hdg":-1.425,"batt":100.0,"det":false},{"id":1,"x":211.84,"y":37.34,"hdg":-0.825,"batt":100.0,"det":false},{"id":2,"x":46.69,"y":211.91,"hdg":-0.214,"batt":100.0,"det":false},{"id":3,"x":214.80,"y":211.93,"hdg":0.397,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":117,"t":117.00,"coverage":0.0505,"drones":[{"id":0,"x":50.96,"y":45.76,"hdg":1.039,"batt":100.0,"det":false},{"id":1,"x":211.20,"y":45.31,"hdg":1.650,"batt":100.0,"det":false},{"id":2,"x":41.59,"y":218.07,"hdg":2.261,"batt":100.0,"det":false},{"id":3,"x":207.09,"y":214.05,"hdg":2.872,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":118,"t":118.00,"coverage":0.0505,"drones":[{"id":0,"x":43.51,"y":42.85,"hdg":-2.769,"batt":100.0,"det":false},{"id":1,"x":205.54,"y":39.65,"hdg":-2.356,"batt":100.0,"det":false},{"id":2,"x":41.78,"y":210.07,"hdg":-1.547,"batt":100.0,"det":false},{"id":3,"x":211.83,"y":207.61,"hdg":-0.936,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":119,"t":119.00,"coverage":0.0506,"drones":[{"id":0,"x":51.17,"y":40.53,"hdg":-0.294,"batt":100.0,"det":false},{"id":1,"x":213.14,"y":42.15,"hdg":0.317,"batt":100.0,"det":false},{"id":2,"x":46.58,"y":216.48,"hdg":0.928,"batt":100.0,"det":false},{"id":3,"x":212.08,"y":215.61,"hdg":1.539,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":120,"t":120.00,"coverage":0.0509,"drones":[{"id":0,"x":46.58,"y":47.09,"hdg":2.181,"batt":100.0,"det":false},{"id":1,"x":205.63,"y":44.89,"hdg":2.792,"batt":100.0,"det":false},{"id":2,"x":38.85,"y":214.41,"hdg":-2.880,"batt":100.0,"det":false},{"id":3,"x":206.94,"y":209.48,"hdg":-2.269,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":121,"t":121.00,"coverage":0.0509,"drones":[{"id":0,"x":46.13,"y":39.10,"hdg":-1.627,"batt":100.0,"det":false},{"id":1,"x":209.84,"y":38.09,"hdg":-1.016,"batt":100.0,"det":false},{"id":2,"x":46.20,"y":211.26,"hdg":-0.405,"batt":100.0,"det":false},{"id":3,"x":214.77,"y":211.12,"hdg":0.206,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":122,"t":122.00,"coverage":0.0509,"drones":[{"id":0,"x":51.42,"y":45.10,"hdg":0.848,"batt":100.0,"det":false},{"id":1,"x":210.73,"y":46.04,"hdg":1.459,"batt":100.0,"det":false},{"id":2,"x":42.37,"y":218.28,"hdg":2.070,"batt":100.0,"det":false},{"id":3,"x":207.61,"y":214.67,"hdg":2.681,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":123,"t":123.00,"coverage":0.0509,"drones":[{"id":0,"x":43.72,"y":42.95,"hdg":-2.870,"batt":100.0,"det":false},{"id":1,"x":205.12,"y":40.34,"hdg":-2.349,"batt":100.0,"det":false},{"id":2,"x":41.04,"y":210.39,"hdg":-1.738,"batt":100.0,"det":false},{"id":3,"x":211.04,"y":207.45,"hdg":-1.127,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":124,"t":124.00,"coverage":0.0511,"drones":[{"id":0,"x":50.79,"y":39.22,"hdg":-0.485,"batt":100.0,"det":false},{"id":1,"x":213.05,"y":41.35,"hdg":0.126,"batt":100.0,"det":false},{"id":2,"x":46.96,"y":215.77,"hdg":0.737,"batt":100.0,"det":false},{"id":3,"x":214.54,"y":214.64,"hdg":1.118,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":125,"t":125.00,"coverage":0.0511,"drones":[{"id":0,"x":47.54,"y":46.53,"hdg":1.990,"batt":100.0,"det":false},{"id":1,"x":208.33,"y":47.80,"hdg":2.202,"batt":100.0,"det":false},{"id":2,"x":38.98,"y":215.21,"hdg":-3.071,"batt":100.0,"det":false},{"id":3,"x":208.33,"y":209.60,"hdg":-2.460,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":126,"t":126.00,"coverage":0.0514,"drones":[{"id":0,"x":45.58,"y":38.77,"hdg":-1.819,"batt":100.0,"det":false},{"id":1,"x":213.57,"y":41.76,"hdg":-0.857,"batt":100.0,"det":false},{"id":2,"x":45.60,"y":210.71,"hdg":-0.596,"batt":100.0,"det":false},{"id":3,"x":216.32,"y":209.72,"hdg":0.015,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":127,"t":127.00,"coverage":0.0520,"drones":[{"id":0,"x":51.92,"y":43.65,"hdg":0.656,"batt":100.0,"det":false},{"id":1,"x":215.96,"y":49.39,"hdg":1.268,"batt":100.0,"det":false},{"id":2,"x":43.18,"y":218.34,"hdg":1.879,"batt":100.0,"det":false},{"id":3,"x":209.97,"y":214.58,"hdg":2.490,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":128,"t":128.00,"coverage":0.0520,"drones":[{"id":0,"x":43.92,"y":43.74,"hdg":3.131,"batt":100.0,"det":false},{"id":1,"x":209.36,"y":44.87,"hdg":-2.541,"batt":100.0,"det":false},{"id":2,"x":40.37,"y":210.85,"hdg":-1.930,"batt":100.0,"det":false},{"id":3,"x":211.96,"y":206.83,"hdg":-1.319,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":129,"t":129.00,"coverage":0.0520,"drones":[{"id":0,"x":50.15,"y":38.73,"hdg":-0.677,"batt":100.0,"det":false},{"id":1,"x":217.34,"y":44.34,"hdg":-0.066,"batt":100.0,"det":false},{"id":2,"x":47.21,"y":215.00,"hdg":0.545,"batt":100.0,"det":false},{"id":3,"x":215.18,"y":214.15,"hdg":1.156,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":130,"t":130.00,"coverage":0.0522,"drones":[{"id":0,"x":49.05,"y":46.65,"hdg":1.709,"batt":100.0,"det":false},{"id":1,"x":211.39,"y":49.69,"hdg":2.409,"batt":100.0,"det":false},{"id":2,"x":39.48,"y":217.05,"hdg":2.883,"batt":100.0,"det":false},{"id":3,"x":208.12,"y":210.39,"hdg":-2.652,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":131,"t":131.00,"coverage":0.0522,"drones":[{"id":0,"x":43.37,"y":41.02,"hdg":-2.361,"batt":100.0,"det":false},{"id":1,"x":212.76,"y":41.81,"hdg":-1.399,"batt":100.0,"det":false},{"id":2,"x":45.12,"y":211.38,"hdg":-0.788,"batt":100.0,"det":false},{"id":3,"x":216.00,"y":208.98,"hdg":-0.177,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":132,"t":132.00,"coverage":0.0527,"drones":[{"id":0,"x":50.52,"y":44.61,"hdg":0.465,"batt":100.0,"det":false},{"id":1,"x":216.56,"y":48.85,"hdg":1.076,"batt":100.0,"det":false},{"id":2,"x":44.19,"y":219.32,"hdg":1.687,"batt":100.0,"det":false},{"id":3,"x":210.68,"y":214.96,"hdg":2.298,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":133,"t":133.00,"coverage":0.0527,"drones":[{"id":0,"x":42.71,"y":46.33,"hdg":2.924,"batt":100.0,"det":false},{"id":1,"x":209.22,"y":45.67,"hdg":-2.732,"batt":100.0,"det":false},{"id":2,"x":40.01,"y":212.50,"hdg":-2.121,"batt":100.0,"det":false},{"id":3,"x":211.17,"y":206.97,"hdg":-1.510,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":134,"t":134.00,"coverage":0.0527,"drones":[{"id":0,"x":47.88,"y":40.23,"hdg":-0.868,"batt":100.0,"det":false},{"id":1,"x":217.00,"y":43.80,"hdg":-0.235,"batt":100.0,"det":false},{"id":2,"x":47.51,"y":215.28,"hdg":0.354,"batt":100.0,"det":false},{"id":3,"x":215.72,"y":213.55,"hdg":0.965,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":135,"t":135.00,"coverage":0.0527,"drones":[{"id":0,"x":47.59,"y":48.22,"hdg":1.607,"batt":100.0,"det":false},{"id":1,"x":212.18,"y":50.19,"hdg":2.218,"batt":100.0,"det":false},{"id":2,"x":39.90,"y":217.74,"hdg":2.829,"batt":100.0,"det":false},{"id":3,"x":208.07,"y":211.20,"hdg":-2.843,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":136,"t":136.00,"coverage":0.0527,"drones":[{"id":0,"x":42.87,"y":41.76,"hdg":-2.201,"batt":100.0,"det":false},{"id":1,"x":211.97,"y":42.19,"hdg":-1.597,"batt":100.0,"det":false},{"id":2,"x":44.36,"y":211.10,"hdg":-0.979,"batt":100.0,"det":false},{"id":3,"x":215.54,"y":208.32,"hdg":-0.368,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":137,"t":137.00,"coverage":0.0527,"drones":[{"id":0,"x":50.57,"y":43.93,"hdg":0.274,"batt":100.0,"det":false},{"id":1,"x":217.04,"y":48.38,"hdg":0.885,"batt":100.0,"det":false},{"id":2,"x":44.96,"y":219.07,"hdg":1.496,"batt":100.0,"det":false},{"id":3,"x":211.45,"y":215.19,"hdg":2.107,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":138,"t":138.00,"coverage":0.0527,"drones":[{"id":0,"x":43.18,"y":46.99,"hdg":2.749,"batt":100.0,"det":false},{"id":1,"x":209.23,"y":46.65,"hdg":-2.923,"batt":100.0,"det":false},{"id":2,"x":42.47,"y":211.47,"hdg":-1.888,"batt":100.0,"det":false},{"id":3,"x":210.41,"y":207.26,"hdg":-1.701,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":139,"t":139.00,"coverage":0.0533,"drones":[{"id":0,"x":50.53,"y":43.83,"hdg":-0.406,"batt":100.0,"det":false},{"id":1,"x":216.44,"y":43.18,"hdg":-0.448,"batt":100.0,"det":false},{"id":2,"x":50.36,"y":212.77,"hdg":0.163,"batt":100.0,"det":false},{"id":3,"x":216.13,"y":212.85,"hdg":0.774,"batt":100.0,"det":false}]}
{"type":"episode","ep":19,"mean_return":40.6910,"policy_loss":-1099.2715,"value_loss":10639.4414,"victims_found":0}