Files
ruvnet--RuView/v2/crates/ruview-swarm/viz/sample_spiral.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
50 KiB
JSON

{"type":"meta","profile":"sar · flight=spiral · 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":132.4876,"policy_loss":-129.5060,"value_loss":218518.5938,"victims_found":0}
{"type":"episode","ep":1,"mean_return":132.4876,"policy_loss":-209.0675,"value_loss":218347.4375,"victims_found":0}
{"type":"episode","ep":2,"mean_return":132.4876,"policy_loss":-295.6345,"value_loss":218168.9531,"victims_found":0}
{"type":"episode","ep":3,"mean_return":132.4876,"policy_loss":-392.3826,"value_loss":217971.0625,"victims_found":0}
{"type":"episode","ep":4,"mean_return":132.4876,"policy_loss":-504.0201,"value_loss":217738.5781,"victims_found":0}
{"type":"episode","ep":5,"mean_return":132.4876,"policy_loss":-628.8607,"value_loss":217474.8281,"victims_found":0}
{"type":"episode","ep":6,"mean_return":132.4876,"policy_loss":-771.4684,"value_loss":217171.8750,"victims_found":0}
{"type":"episode","ep":7,"mean_return":132.4876,"policy_loss":-936.7915,"value_loss":216822.7812,"victims_found":0}
{"type":"episode","ep":8,"mean_return":132.4876,"policy_loss":-1128.8857,"value_loss":216425.1094,"victims_found":0}
{"type":"episode","ep":9,"mean_return":132.4876,"policy_loss":-1352.4432,"value_loss":215961.6875,"victims_found":0}
{"type":"episode","ep":10,"mean_return":132.4876,"policy_loss":-1610.8960,"value_loss":215415.8281,"victims_found":0}
{"type":"episode","ep":11,"mean_return":132.4876,"policy_loss":-1911.4857,"value_loss":214772.7656,"victims_found":0}
{"type":"episode","ep":12,"mean_return":132.4876,"policy_loss":-2260.4644,"value_loss":214029.3906,"victims_found":0}
{"type":"episode","ep":13,"mean_return":132.4876,"policy_loss":-2662.1604,"value_loss":213180.5000,"victims_found":0}
{"type":"episode","ep":14,"mean_return":132.4876,"policy_loss":-3122.8921,"value_loss":212218.7188,"victims_found":0}
{"type":"episode","ep":15,"mean_return":132.4876,"policy_loss":-3644.7505,"value_loss":211141.8594,"victims_found":0}
{"type":"episode","ep":16,"mean_return":132.4876,"policy_loss":-4234.3257,"value_loss":209940.2500,"victims_found":0}
{"type":"episode","ep":17,"mean_return":132.4876,"policy_loss":-4891.8579,"value_loss":208607.4062,"victims_found":0}
{"type":"episode","ep":18,"mean_return":132.4876,"policy_loss":-5623.4009,"value_loss":207148.4219,"victims_found":0}
{"type":"step","ep":19,"step":0,"t":0.00,"coverage":0.0159,"drones":[{"id":0,"x":15.66,"y":15.66,"hdg":0.785,"batt":100.0,"det":false},{"id":1,"x":209.58,"y":17.99,"hdg":1.623,"batt":100.0,"det":false},{"id":2,"x":17.99,"y":209.58,"hdg":-0.053,"batt":100.0,"det":false},{"id":3,"x":204.34,"y":204.34,"hdg":-2.356,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":1,"t":1.00,"coverage":0.0205,"drones":[{"id":0,"x":21.32,"y":21.30,"hdg":0.784,"batt":100.0,"det":false},{"id":1,"x":209.26,"y":25.98,"hdg":1.611,"batt":100.0,"det":false},{"id":2,"x":25.98,"y":209.23,"hdg":-0.044,"batt":100.0,"det":false},{"id":3,"x":202.21,"y":201.51,"hdg":-2.217,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":2,"t":2.00,"coverage":0.0248,"drones":[{"id":0,"x":26.93,"y":27.01,"hdg":0.794,"batt":100.0,"det":false},{"id":1,"x":208.93,"y":33.98,"hdg":1.612,"batt":100.0,"det":false},{"id":2,"x":33.98,"y":209.04,"hdg":-0.024,"batt":100.0,"det":false},{"id":3,"x":201.94,"y":204.98,"hdg":1.648,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":3,"t":3.00,"coverage":0.0295,"drones":[{"id":0,"x":32.43,"y":32.82,"hdg":0.813,"batt":100.0,"det":false},{"id":1,"x":208.44,"y":41.96,"hdg":1.633,"batt":100.0,"det":false},{"id":2,"x":41.98,"y":208.98,"hdg":-0.007,"batt":100.0,"det":false},{"id":3,"x":198.18,"y":207.81,"hdg":2.497,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":4,"t":4.00,"coverage":0.0348,"drones":[{"id":0,"x":37.84,"y":38.72,"hdg":0.829,"batt":100.0,"det":false},{"id":1,"x":207.65,"y":49.92,"hdg":1.669,"batt":100.0,"det":false},{"id":2,"x":49.98,"y":208.88,"hdg":-0.012,"batt":100.0,"det":false},{"id":3,"x":192.11,"y":207.22,"hdg":-3.045,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":5,"t":5.00,"coverage":0.0392,"drones":[{"id":0,"x":43.23,"y":44.63,"hdg":0.831,"batt":100.0,"det":false},{"id":1,"x":206.56,"y":57.85,"hdg":1.707,"batt":100.0,"det":false},{"id":2,"x":57.97,"y":208.47,"hdg":-0.051,"batt":100.0,"det":false},{"id":3,"x":186.76,"y":201.89,"hdg":-2.357,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":6,"t":6.00,"coverage":0.0455,"drones":[{"id":0,"x":48.77,"y":50.40,"hdg":0.806,"batt":100.0,"det":false},{"id":1,"x":205.34,"y":65.75,"hdg":1.725,"batt":100.0,"det":false},{"id":2,"x":65.91,"y":207.51,"hdg":-0.121,"batt":100.0,"det":false},{"id":3,"x":185.75,"y":193.95,"hdg":-1.698,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":7,"t":7.00,"coverage":0.0508,"drones":[{"id":0,"x":54.60,"y":55.87,"hdg":0.754,"batt":100.0,"det":false},{"id":1,"x":204.36,"y":73.69,"hdg":1.693,"batt":100.0,"det":false},{"id":2,"x":73.77,"y":206.01,"hdg":-0.188,"batt":100.0,"det":false},{"id":3,"x":189.29,"y":186.78,"hdg":-1.112,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":8,"t":8.00,"coverage":0.0567,"drones":[{"id":0,"x":60.75,"y":60.99,"hdg":0.695,"batt":100.0,"det":false},{"id":1,"x":204.17,"y":81.69,"hdg":1.594,"batt":100.0,"det":false},{"id":2,"x":81.59,"y":204.34,"hdg":-0.210,"batt":100.0,"det":false},{"id":3,"x":196.02,"y":182.45,"hdg":-0.572,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":9,"t":9.00,"coverage":0.0616,"drones":[{"id":0,"x":67.06,"y":65.91,"hdg":0.662,"batt":100.0,"det":false},{"id":1,"x":205.05,"y":89.64,"hdg":1.460,"batt":100.0,"det":false},{"id":2,"x":89.48,"y":202.99,"hdg":-0.170,"batt":100.0,"det":false},{"id":3,"x":204.01,"y":182.02,"hdg":-0.054,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":10,"t":10.00,"coverage":0.0663,"drones":[{"id":0,"x":73.31,"y":70.90,"hdg":0.674,"batt":100.0,"det":false},{"id":1,"x":206.63,"y":97.49,"hdg":1.373,"batt":100.0,"det":false},{"id":2,"x":97.45,"y":202.37,"hdg":-0.077,"batt":100.0,"det":false},{"id":3,"x":211.21,"y":185.51,"hdg":0.452,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":11,"t":11.00,"coverage":0.0717,"drones":[{"id":0,"x":79.27,"y":76.23,"hdg":0.730,"batt":100.0,"det":false},{"id":1,"x":208.13,"y":105.34,"hdg":1.382,"batt":100.0,"det":false},{"id":2,"x":105.44,"y":202.79,"hdg":0.052,"batt":100.0,"det":false},{"id":3,"x":215.83,"y":192.04,"hdg":0.955,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":12,"t":12.00,"coverage":0.0762,"drones":[{"id":0,"x":84.75,"y":82.06,"hdg":0.816,"batt":100.0,"det":false},{"id":1,"x":208.88,"y":113.31,"hdg":1.476,"batt":100.0,"det":false},{"id":2,"x":113.29,"y":204.35,"hdg":0.196,"batt":100.0,"det":false},{"id":3,"x":216.71,"y":199.99,"hdg":1.461,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":13,"t":13.00,"coverage":0.0806,"drones":[{"id":0,"x":89.62,"y":88.41,"hdg":0.916,"batt":100.0,"det":false},{"id":1,"x":208.42,"y":121.29,"hdg":1.628,"batt":100.0,"det":false},{"id":2,"x":120.86,"y":206.94,"hdg":0.330,"batt":100.0,"det":false},{"id":3,"x":213.56,"y":207.35,"hdg":1.975,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":14,"t":14.00,"coverage":0.0855,"drones":[{"id":0,"x":93.90,"y":95.17,"hdg":1.006,"batt":100.0,"det":false},{"id":1,"x":206.47,"y":129.05,"hdg":1.817,"batt":100.0,"det":false},{"id":2,"x":128.23,"y":210.04,"hdg":0.397,"batt":100.0,"det":false},{"id":3,"x":207.15,"y":212.13,"hdg":2.500,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":15,"t":15.00,"coverage":0.0897,"drones":[{"id":0,"x":97.88,"y":102.11,"hdg":1.050,"batt":100.0,"det":false},{"id":1,"x":202.94,"y":136.23,"hdg":2.028,"batt":100.0,"det":false},{"id":2,"x":136.10,"y":211.49,"hdg":0.182,"batt":100.0,"det":false},{"id":3,"x":199.19,"y":212.94,"hdg":3.041,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":16,"t":16.00,"coverage":0.0942,"drones":[{"id":0,"x":102.30,"y":108.78,"hdg":0.985,"batt":100.0,"det":false},{"id":1,"x":197.94,"y":142.48,"hdg":2.246,"batt":100.0,"det":false},{"id":2,"x":142.14,"y":206.24,"hdg":-0.716,"batt":100.0,"det":false},{"id":3,"x":192.02,"y":209.39,"hdg":-2.683,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":17,"t":17.00,"coverage":0.0984,"drones":[{"id":0,"x":108.22,"y":114.16,"hdg":0.739,"batt":100.0,"det":false},{"id":1,"x":191.83,"y":147.64,"hdg":2.440,"batt":100.0,"det":false},{"id":2,"x":146.58,"y":199.58,"hdg":-0.982,"batt":100.0,"det":false},{"id":3,"x":187.93,"y":202.52,"hdg":-2.107,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":18,"t":18.00,"coverage":0.1023,"drones":[{"id":0,"x":115.46,"y":117.56,"hdg":0.438,"batt":100.0,"det":false},{"id":1,"x":190.65,"y":152.79,"hdg":1.797,"batt":100.0,"det":false},{"id":2,"x":152.06,"y":193.76,"hdg":-0.815,"batt":100.0,"det":false},{"id":3,"x":188.37,"y":194.53,"hdg":-1.516,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":19,"t":19.00,"coverage":0.1058,"drones":[{"id":0,"x":123.03,"y":120.15,"hdg":0.329,"batt":100.0,"det":false},{"id":1,"x":198.65,"y":152.93,"hdg":0.017,"batt":100.0,"det":false},{"id":2,"x":158.94,"y":189.66,"hdg":-0.537,"batt":100.0,"det":false},{"id":3,"x":193.24,"y":188.18,"hdg":-0.917,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":20,"t":20.00,"coverage":0.1091,"drones":[{"id":0,"x":130.41,"y":123.24,"hdg":0.397,"batt":100.0,"det":false},{"id":1,"x":206.09,"y":155.87,"hdg":0.377,"batt":100.0,"det":false},{"id":2,"x":166.76,"y":188.00,"hdg":-0.210,"batt":100.0,"det":false},{"id":3,"x":200.85,"y":185.71,"hdg":-0.314,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":21,"t":21.00,"coverage":0.1116,"drones":[{"id":0,"x":137.19,"y":127.48,"hdg":0.559,"batt":100.0,"det":false},{"id":1,"x":211.97,"y":161.28,"hdg":0.744,"batt":100.0,"det":false},{"id":2,"x":174.66,"y":189.23,"hdg":0.154,"batt":100.0,"det":false},{"id":3,"x":208.52,"y":187.95,"hdg":0.285,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":22,"t":22.00,"coverage":0.1134,"drones":[{"id":0,"x":142.92,"y":133.06,"hdg":0.772,"batt":100.0,"det":false},{"id":1,"x":215.45,"y":168.49,"hdg":1.122,"batt":100.0,"det":false},{"id":2,"x":181.44,"y":193.48,"hdg":0.560,"batt":100.0,"det":false},{"id":3,"x":213.63,"y":194.11,"hdg":0.878,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":23,"t":23.00,"coverage":0.1155,"drones":[{"id":0,"x":147.14,"y":139.86,"hdg":1.016,"batt":100.0,"det":false},{"id":1,"x":215.88,"y":176.48,"hdg":1.516,"batt":100.0,"det":false},{"id":2,"x":185.57,"y":200.33,"hdg":1.028,"batt":100.0,"det":false},{"id":3,"x":214.47,"y":202.07,"hdg":1.466,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":24,"t":24.00,"coverage":0.1172,"drones":[{"id":0,"x":149.41,"y":147.53,"hdg":1.283,"batt":100.0,"det":false},{"id":1,"x":213.04,"y":183.96,"hdg":1.935,"batt":100.0,"det":false},{"id":2,"x":185.28,"y":208.32,"hdg":1.607,"batt":100.0,"det":false},{"id":3,"x":210.78,"y":209.17,"hdg":2.050,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":25,"t":25.00,"coverage":0.1203,"drones":[{"id":0,"x":149.39,"y":155.53,"hdg":1.573,"batt":100.0,"det":false},{"id":1,"x":207.18,"y":189.41,"hdg":2.391,"batt":100.0,"det":false},{"id":2,"x":179.55,"y":213.91,"hdg":2.369,"batt":100.0,"det":false},{"id":3,"x":203.79,"y":213.06,"hdg":2.633,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":26,"t":26.00,"coverage":0.1222,"drones":[{"id":0,"x":146.71,"y":163.07,"hdg":1.913,"batt":100.0,"det":false},{"id":1,"x":199.40,"y":191.26,"hdg":2.909,"batt":100.0,"det":false},{"id":2,"x":171.62,"y":212.86,"hdg":-3.011,"batt":100.0,"det":false},{"id":3,"x":195.81,"y":212.45,"hdg":-3.065,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":27,"t":27.00,"coverage":0.1241,"drones":[{"id":0,"x":138.99,"y":165.18,"hdg":2.875,"batt":100.0,"det":false},{"id":1,"x":191.98,"y":188.27,"hdg":-2.759,"batt":100.0,"det":false},{"id":2,"x":166.82,"y":206.46,"hdg":-2.215,"batt":100.0,"det":false},{"id":3,"x":189.51,"y":207.52,"hdg":-2.477,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":28,"t":28.00,"coverage":0.1247,"drones":[{"id":0,"x":144.13,"y":159.05,"hdg":-0.873,"batt":100.0,"det":false},{"id":1,"x":188.50,"y":181.07,"hdg":-2.021,"batt":100.0,"det":false},{"id":2,"x":166.67,"y":198.46,"hdg":-1.589,"batt":100.0,"det":false},{"id":3,"x":187.04,"y":199.91,"hdg":-1.885,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":29,"t":29.00,"coverage":0.1253,"drones":[{"id":0,"x":151.14,"y":155.18,"hdg":-0.504,"batt":100.0,"det":false},{"id":1,"x":191.20,"y":173.54,"hdg":-1.225,"batt":100.0,"det":false},{"id":2,"x":170.62,"y":191.50,"hdg":-1.056,"batt":100.0,"det":false},{"id":3,"x":189.28,"y":192.23,"hdg":-1.288,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":30,"t":30.00,"coverage":0.1266,"drones":[{"id":0,"x":159.05,"y":153.98,"hdg":-0.150,"batt":100.0,"det":false},{"id":1,"x":198.22,"y":169.70,"hdg":-0.500,"batt":100.0,"det":false},{"id":2,"x":177.39,"y":187.25,"hdg":-0.561,"batt":100.0,"det":false},{"id":3,"x":195.45,"y":187.14,"hdg":-0.689,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":31,"t":31.00,"coverage":0.1277,"drones":[{"id":0,"x":166.87,"y":155.63,"hdg":0.208,"batt":100.0,"det":false},{"id":1,"x":206.17,"y":170.65,"hdg":0.119,"batt":100.0,"det":false},{"id":2,"x":185.37,"y":186.65,"hdg":-0.075,"batt":100.0,"det":false},{"id":3,"x":203.42,"y":186.43,"hdg":-0.089,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":32,"t":32.00,"coverage":0.1281,"drones":[{"id":0,"x":173.58,"y":159.99,"hdg":0.576,"batt":100.0,"det":false},{"id":1,"x":212.44,"y":175.62,"hdg":0.670,"batt":100.0,"det":false},{"id":2,"x":192.66,"y":189.93,"hdg":0.423,"batt":100.0,"det":false},{"id":3,"x":210.40,"y":190.32,"hdg":0.509,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":33,"t":33.00,"coverage":0.1281,"drones":[{"id":0,"x":178.15,"y":166.56,"hdg":0.963,"batt":100.0,"det":false},{"id":1,"x":215.44,"y":183.04,"hdg":1.187,"batt":100.0,"det":false},{"id":2,"x":197.32,"y":196.43,"hdg":0.949,"batt":100.0,"det":false},{"id":3,"x":213.99,"y":197.47,"hdg":1.106,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":34,"t":34.00,"coverage":0.1281,"drones":[{"id":0,"x":179.65,"y":174.42,"hdg":1.382,"batt":100.0,"det":false},{"id":1,"x":214.44,"y":190.97,"hdg":1.696,"batt":100.0,"det":false},{"id":2,"x":197.70,"y":204.42,"hdg":1.523,"batt":100.0,"det":false},{"id":3,"x":212.96,"y":205.41,"hdg":1.700,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":35,"t":35.00,"coverage":0.1281,"drones":[{"id":0,"x":177.37,"y":182.09,"hdg":1.860,"batt":100.0,"det":false},{"id":1,"x":209.63,"y":197.37,"hdg":2.216,"batt":100.0,"det":false},{"id":2,"x":193.28,"y":211.09,"hdg":2.156,"batt":100.0,"det":false},{"id":3,"x":207.67,"y":211.41,"hdg":2.293,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":36,"t":36.00,"coverage":0.1281,"drones":[{"id":0,"x":171.19,"y":187.17,"hdg":2.453,"batt":100.0,"det":false},{"id":1,"x":202.20,"y":200.33,"hdg":2.762,"batt":100.0,"det":false},{"id":2,"x":185.65,"y":213.47,"hdg":2.840,"batt":100.0,"det":false},{"id":3,"x":199.93,"y":213.44,"hdg":2.886,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":37,"t":37.00,"coverage":0.1283,"drones":[{"id":0,"x":163.24,"y":186.27,"hdg":-3.029,"batt":100.0,"det":false},{"id":1,"x":194.37,"y":198.68,"hdg":-2.934,"batt":100.0,"det":false},{"id":2,"x":178.25,"y":210.42,"hdg":-2.751,"batt":100.0,"det":false},{"id":3,"x":192.38,"y":210.79,"hdg":-2.804,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":38,"t":38.00,"coverage":0.1286,"drones":[{"id":0,"x":159.34,"y":179.29,"hdg":-2.080,"batt":100.0,"det":false},{"id":1,"x":189.04,"y":192.72,"hdg":-2.300,"batt":100.0,"det":false},{"id":2,"x":174.25,"y":203.49,"hdg":-2.094,"batt":100.0,"det":false},{"id":3,"x":187.62,"y":204.36,"hdg":-2.209,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":39,"t":39.00,"coverage":0.1286,"drones":[{"id":0,"x":161.57,"y":171.60,"hdg":-1.288,"batt":100.0,"det":false},{"id":1,"x":188.55,"y":184.73,"hdg":-1.632,"batt":100.0,"det":false},{"id":2,"x":174.92,"y":195.52,"hdg":-1.487,"batt":100.0,"det":false},{"id":3,"x":187.29,"y":196.37,"hdg":-1.612,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":40,"t":40.00,"coverage":0.1286,"drones":[{"id":0,"x":167.76,"y":166.54,"hdg":-0.685,"batt":100.0,"det":false},{"id":1,"x":193.12,"y":178.17,"hdg":-0.962,"batt":100.0,"det":false},{"id":2,"x":179.77,"y":189.16,"hdg":-0.919,"batt":100.0,"det":false},{"id":3,"x":191.52,"y":189.58,"hdg":-1.014,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":41,"t":41.00,"coverage":0.1286,"drones":[{"id":0,"x":175.64,"y":165.16,"hdg":-0.174,"batt":100.0,"det":false},{"id":1,"x":200.71,"y":175.63,"hdg":-0.322,"batt":100.0,"det":false},{"id":2,"x":187.23,"y":186.24,"hdg":-0.373,"batt":100.0,"det":false},{"id":3,"x":198.84,"y":186.36,"hdg":-0.414,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":42,"t":42.00,"coverage":0.1286,"drones":[{"id":0,"x":183.28,"y":167.53,"hdg":0.301,"batt":100.0,"det":false},{"id":1,"x":208.40,"y":177.84,"hdg":0.279,"batt":100.0,"det":false},{"id":2,"x":195.11,"y":187.59,"hdg":0.169,"batt":100.0,"det":false},{"id":3,"x":206.71,"y":187.83,"hdg":0.185,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":43,"t":43.00,"coverage":0.1286,"drones":[{"id":0,"x":189.03,"y":173.10,"hdg":0.769,"batt":100.0,"det":false},{"id":1,"x":213.68,"y":183.85,"hdg":0.850,"batt":100.0,"det":false},{"id":2,"x":201.12,"y":192.87,"hdg":0.720,"batt":100.0,"det":false},{"id":3,"x":212.37,"y":193.48,"hdg":0.784,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":44,"t":44.00,"coverage":0.1286,"drones":[{"id":0,"x":191.55,"y":180.69,"hdg":1.251,"batt":100.0,"det":false},{"id":1,"x":215.00,"y":191.74,"hdg":1.405,"batt":100.0,"det":false},{"id":2,"x":203.32,"y":200.56,"hdg":1.293,"batt":100.0,"det":false},{"id":3,"x":213.88,"y":201.33,"hdg":1.381,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":45,"t":45.00,"coverage":0.1286,"drones":[{"id":0,"x":189.99,"y":188.54,"hdg":1.767,"batt":100.0,"det":false},{"id":1,"x":211.98,"y":199.15,"hdg":1.957,"batt":100.0,"det":false},{"id":2,"x":200.77,"y":208.14,"hdg":1.895,"batt":100.0,"det":false},{"id":3,"x":210.71,"y":208.68,"hdg":1.978,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":46,"t":46.00,"coverage":0.1286,"drones":[{"id":0,"x":184.40,"y":194.27,"hdg":2.344,"batt":100.0,"det":false},{"id":1,"x":205.49,"y":203.82,"hdg":2.519,"batt":100.0,"det":false},{"id":2,"x":194.24,"y":212.77,"hdg":2.525,"batt":100.0,"det":false},{"id":3,"x":203.97,"y":212.98,"hdg":2.574,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":47,"t":47.00,"coverage":0.1286,"drones":[{"id":0,"x":176.48,"y":195.36,"hdg":3.005,"batt":100.0,"det":false},{"id":1,"x":197.49,"y":204.15,"hdg":3.099,"batt":100.0,"det":false},{"id":2,"x":186.25,"y":212.54,"hdg":-3.113,"batt":100.0,"det":false},{"id":3,"x":195.97,"y":212.76,"hdg":-3.113,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":48,"t":48.00,"coverage":0.1286,"drones":[{"id":0,"x":169.87,"y":190.84,"hdg":-2.542,"batt":100.0,"det":false},{"id":1,"x":190.73,"y":199.88,"hdg":-2.578,"batt":100.0,"det":false},{"id":2,"x":179.97,"y":207.58,"hdg":-2.472,"batt":100.0,"det":false},{"id":3,"x":189.48,"y":208.08,"hdg":-2.517,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":49,"t":49.00,"coverage":0.1286,"drones":[{"id":0,"x":168.00,"y":183.07,"hdg":-1.807,"batt":100.0,"det":false},{"id":1,"x":187.77,"y":192.45,"hdg":-1.951,"batt":100.0,"det":false},{"id":2,"x":177.75,"y":199.89,"hdg":-1.852,"batt":100.0,"det":false},{"id":3,"x":186.75,"y":200.56,"hdg":-1.919,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":50,"t":50.00,"coverage":0.1286,"drones":[{"id":0,"x":171.32,"y":175.79,"hdg":-1.142,"batt":100.0,"det":false},{"id":1,"x":189.81,"y":184.72,"hdg":-1.313,"batt":100.0,"det":false},{"id":2,"x":180.22,"y":192.28,"hdg":-1.257,"batt":100.0,"det":false},{"id":3,"x":188.73,"y":192.81,"hdg":-1.321,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":51,"t":51.00,"coverage":0.1286,"drones":[{"id":0,"x":178.14,"y":171.60,"hdg":-0.551,"batt":100.0,"det":false},{"id":1,"x":196.02,"y":179.68,"hdg":-0.681,"batt":100.0,"det":false},{"id":2,"x":186.44,"y":187.25,"hdg":-0.680,"batt":100.0,"det":false},{"id":3,"x":194.74,"y":187.52,"hdg":-0.722,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":52,"t":52.00,"coverage":0.1286,"drones":[{"id":0,"x":186.14,"y":171.53,"hdg":-0.009,"batt":100.0,"det":false},{"id":1,"x":204.00,"y":179.14,"hdg":-0.068,"batt":100.0,"det":false},{"id":2,"x":194.39,"y":186.34,"hdg":-0.114,"batt":100.0,"det":false},{"id":3,"x":202.68,"y":186.55,"hdg":-0.122,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":53,"t":53.00,"coverage":0.1286,"drones":[{"id":0,"x":193.11,"y":175.44,"hdg":0.512,"batt":100.0,"det":false},{"id":1,"x":210.92,"y":183.15,"hdg":0.526,"batt":100.0,"det":false},{"id":2,"x":201.58,"y":189.85,"hdg":0.453,"batt":100.0,"det":false},{"id":3,"x":209.78,"y":190.22,"hdg":0.477,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":54,"t":54.00,"coverage":0.1286,"drones":[{"id":0,"x":197.23,"y":182.31,"hdg":1.031,"batt":100.0,"det":false},{"id":1,"x":214.52,"y":190.30,"hdg":1.104,"batt":100.0,"det":false},{"id":2,"x":205.70,"y":196.71,"hdg":1.030,"batt":100.0,"det":false},{"id":3,"x":213.58,"y":197.26,"hdg":1.076,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":55,"t":55.00,"coverage":0.1286,"drones":[{"id":0,"x":197.27,"y":190.31,"hdg":1.566,"batt":100.0,"det":false},{"id":1,"x":213.68,"y":198.25,"hdg":1.675,"batt":100.0,"det":false},{"id":2,"x":205.29,"y":204.70,"hdg":1.622,"batt":100.0,"det":false},{"id":3,"x":212.76,"y":205.22,"hdg":1.674,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":56,"t":56.00,"coverage":0.1286,"drones":[{"id":0,"x":192.99,"y":197.07,"hdg":2.134,"batt":100.0,"det":false},{"id":1,"x":208.67,"y":204.49,"hdg":2.248,"batt":100.0,"det":false},{"id":2,"x":200.39,"y":211.01,"hdg":2.231,"batt":100.0,"det":false},{"id":3,"x":207.60,"y":211.33,"hdg":2.272,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":57,"t":57.00,"coverage":0.1286,"drones":[{"id":0,"x":185.60,"y":200.13,"hdg":2.749,"batt":100.0,"det":false},{"id":1,"x":201.05,"y":206.95,"hdg":2.830,"batt":100.0,"det":false},{"id":2,"x":192.72,"y":213.28,"hdg":2.854,"batt":100.0,"det":false},{"id":3,"x":199.89,"y":213.48,"hdg":2.869,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":58,"t":58.00,"coverage":0.1286,"drones":[{"id":0,"x":177.89,"y":198.02,"hdg":-2.874,"batt":100.0,"det":false},{"id":1,"x":193.37,"y":204.71,"hdg":-2.858,"batt":100.0,"det":false},{"id":2,"x":185.17,"y":210.62,"hdg":-2.803,"batt":100.0,"det":false},{"id":3,"x":192.31,"y":210.93,"hdg":-2.816,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":59,"t":59.00,"coverage":0.1286,"drones":[{"id":0,"x":173.23,"y":191.51,"hdg":-2.192,"batt":100.0,"det":false},{"id":1,"x":188.36,"y":198.47,"hdg":-2.248,"batt":100.0,"det":false},{"id":2,"x":180.57,"y":204.07,"hdg":-2.183,"batt":100.0,"det":false},{"id":3,"x":187.49,"y":204.55,"hdg":-2.218,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":60,"t":60.00,"coverage":0.1286,"drones":[{"id":0,"x":173.56,"y":183.52,"hdg":-1.529,"batt":100.0,"det":false},{"id":1,"x":187.91,"y":190.48,"hdg":-1.627,"batt":100.0,"det":false},{"id":2,"x":180.52,"y":196.07,"hdg":-1.578,"batt":100.0,"det":false},{"id":3,"x":187.09,"y":196.56,"hdg":-1.620,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":61,"t":61.00,"coverage":0.1286,"drones":[{"id":0,"x":178.49,"y":177.21,"hdg":-0.908,"batt":100.0,"det":false},{"id":1,"x":192.20,"y":183.73,"hdg":-1.005,"batt":100.0,"det":false},{"id":2,"x":184.93,"y":189.40,"hdg":-0.986,"batt":100.0,"det":false},{"id":3,"x":191.28,"y":189.74,"hdg":-1.021,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":62,"t":62.00,"coverage":0.1286,"drones":[{"id":0,"x":186.06,"y":174.65,"hdg":-0.326,"batt":100.0,"det":false},{"id":1,"x":199.60,"y":180.69,"hdg":-0.390,"batt":100.0,"det":false},{"id":2,"x":192.29,"y":186.26,"hdg":-0.404,"batt":100.0,"det":false},{"id":3,"x":198.58,"y":186.47,"hdg":-0.421,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":63,"t":63.00,"coverage":0.1286,"drones":[{"id":0,"x":193.85,"y":176.46,"hdg":0.229,"batt":100.0,"det":false},{"id":1,"x":207.42,"y":182.37,"hdg":0.213,"batt":100.0,"det":false},{"id":2,"x":200.17,"y":187.64,"hdg":0.173,"batt":100.0,"det":false},{"id":3,"x":206.45,"y":187.89,"hdg":0.179,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":64,"t":64.00,"coverage":0.1286,"drones":[{"id":0,"x":199.57,"y":182.06,"hdg":0.774,"batt":100.0,"det":false},{"id":1,"x":212.97,"y":188.13,"hdg":0.804,"batt":100.0,"det":false},{"id":2,"x":206.00,"y":193.11,"hdg":0.754,"batt":100.0,"det":false},{"id":3,"x":212.15,"y":193.50,"hdg":0.778,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":65,"t":65.00,"coverage":0.1286,"drones":[{"id":0,"x":201.53,"y":189.81,"hdg":1.324,"batt":100.0,"det":false},{"id":1,"x":214.43,"y":196.00,"hdg":1.387,"batt":100.0,"det":false},{"id":2,"x":207.80,"y":200.91,"hdg":1.343,"batt":100.0,"det":false},{"id":3,"x":213.69,"y":201.35,"hdg":1.377,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":66,"t":66.00,"coverage":0.1286,"drones":[{"id":0,"x":199.01,"y":197.41,"hdg":1.891,"batt":100.0,"det":false},{"id":1,"x":211.34,"y":203.38,"hdg":1.968,"batt":100.0,"det":false},{"id":2,"x":204.89,"y":208.36,"hdg":1.944,"batt":100.0,"det":false},{"id":3,"x":210.54,"y":208.71,"hdg":1.975,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":67,"t":67.00,"coverage":0.1286,"drones":[{"id":0,"x":192.67,"y":202.28,"hdg":2.486,"batt":100.0,"det":false},{"id":1,"x":204.69,"y":207.83,"hdg":2.552,"batt":100.0,"det":false},{"id":2,"x":198.22,"y":212.79,"hdg":2.555,"batt":100.0,"det":false},{"id":3,"x":203.80,"y":213.01,"hdg":2.574,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":68,"t":68.00,"coverage":0.1286,"drones":[{"id":0,"x":184.67,"y":202.52,"hdg":3.112,"batt":100.0,"det":false},{"id":1,"x":196.69,"y":207.81,"hdg":-3.139,"batt":100.0,"det":false},{"id":2,"x":190.23,"y":212.55,"hdg":-3.112,"batt":100.0,"det":false},{"id":3,"x":195.80,"y":212.77,"hdg":-3.111,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":69,"t":69.00,"coverage":0.1286,"drones":[{"id":0,"x":178.16,"y":197.88,"hdg":-2.523,"batt":100.0,"det":false},{"id":1,"x":190.11,"y":203.26,"hdg":-2.537,"batt":100.0,"det":false},{"id":2,"x":183.84,"y":207.73,"hdg":-2.496,"batt":100.0,"det":false},{"id":3,"x":189.33,"y":208.06,"hdg":-2.513,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":70,"t":70.00,"coverage":0.1286,"drones":[{"id":0,"x":175.77,"y":190.24,"hdg":-1.874,"batt":100.0,"det":false},{"id":1,"x":187.32,"y":195.76,"hdg":-1.927,"batt":100.0,"det":false},{"id":2,"x":181.35,"y":200.13,"hdg":-1.887,"batt":100.0,"det":false},{"id":3,"x":186.64,"y":200.53,"hdg":-1.914,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":71,"t":71.00,"coverage":0.1286,"drones":[{"id":0,"x":178.33,"y":182.67,"hdg":-1.244,"batt":100.0,"det":false},{"id":1,"x":189.37,"y":188.03,"hdg":-1.312,"batt":100.0,"det":false},{"id":2,"x":183.58,"y":192.45,"hdg":-1.288,"batt":100.0,"det":false},{"id":3,"x":188.67,"y":192.79,"hdg":-1.315,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":72,"t":72.00,"coverage":0.1286,"drones":[{"id":0,"x":184.74,"y":177.87,"hdg":-0.642,"batt":100.0,"det":false},{"id":1,"x":195.49,"y":182.88,"hdg":-0.699,"batt":100.0,"det":false},{"id":2,"x":189.71,"y":187.31,"hdg":-0.697,"batt":100.0,"det":false},{"id":3,"x":194.71,"y":187.54,"hdg":-0.715,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":73,"t":73.00,"coverage":0.1286,"drones":[{"id":0,"x":192.72,"y":177.36,"hdg":-0.064,"batt":100.0,"det":false},{"id":1,"x":203.46,"y":182.14,"hdg":-0.093,"batt":100.0,"det":false},{"id":2,"x":197.66,"y":186.42,"hdg":-0.112,"batt":100.0,"det":false},{"id":3,"x":202.65,"y":186.62,"hdg":-0.116,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":74,"t":74.00,"coverage":0.1286,"drones":[{"id":0,"x":199.74,"y":181.20,"hdg":0.501,"batt":100.0,"det":false},{"id":1,"x":210.46,"y":186.01,"hdg":0.505,"batt":100.0,"det":false},{"id":2,"x":204.78,"y":190.07,"hdg":0.473,"batt":100.0,"det":false},{"id":3,"x":209.73,"y":190.34,"hdg":0.484,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":75,"t":75.00,"coverage":0.1286,"drones":[{"id":0,"x":203.64,"y":188.19,"hdg":1.062,"batt":100.0,"det":false},{"id":1,"x":214.12,"y":193.13,"hdg":1.096,"batt":100.0,"det":false},{"id":2,"x":208.67,"y":197.06,"hdg":1.063,"batt":100.0,"det":false},{"id":3,"x":213.48,"y":197.41,"hdg":1.083,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":76,"t":76.00,"coverage":0.1286,"drones":[{"id":0,"x":203.14,"y":196.17,"hdg":1.633,"batt":100.0,"det":false},{"id":1,"x":213.21,"y":201.08,"hdg":1.685,"batt":100.0,"det":false},{"id":2,"x":207.96,"y":205.02,"hdg":1.660,"batt":100.0,"det":false},{"id":3,"x":212.58,"y":205.36,"hdg":1.684,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":77,"t":77.00,"coverage":0.1286,"drones":[{"id":0,"x":198.31,"y":202.55,"hdg":2.219,"batt":100.0,"det":false},{"id":1,"x":208.06,"y":207.20,"hdg":2.270,"batt":100.0,"det":false},{"id":2,"x":202.85,"y":211.18,"hdg":2.263,"batt":100.0,"det":false},{"id":3,"x":207.36,"y":211.42,"hdg":2.281,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":78,"t":78.00,"coverage":0.1286,"drones":[{"id":0,"x":190.70,"y":205.03,"hdg":2.827,"batt":100.0,"det":false},{"id":1,"x":200.37,"y":209.41,"hdg":2.862,"batt":100.0,"det":false},{"id":2,"x":195.14,"y":213.31,"hdg":2.873,"batt":100.0,"det":false},{"id":3,"x":199.64,"y":213.50,"hdg":2.880,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":79,"t":79.00,"coverage":0.1286,"drones":[{"id":0,"x":183.10,"y":202.53,"hdg":-2.824,"batt":100.0,"det":false},{"id":1,"x":192.78,"y":206.87,"hdg":-2.819,"batt":100.0,"det":false},{"id":2,"x":187.62,"y":210.57,"hdg":-2.793,"batt":100.0,"det":false},{"id":3,"x":192.10,"y":210.81,"hdg":-2.800,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":80,"t":80.00,"coverage":0.1286,"drones":[{"id":0,"x":178.43,"y":196.04,"hdg":-2.194,"batt":100.0,"det":false},{"id":1,"x":187.95,"y":200.50,"hdg":-2.219,"batt":100.0,"det":false},{"id":2,"x":182.98,"y":204.06,"hdg":-2.190,"batt":100.0,"det":false},{"id":3,"x":187.35,"y":204.37,"hdg":-2.206,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":81,"t":81.00,"coverage":0.1286,"drones":[{"id":0,"x":178.48,"y":188.04,"hdg":-1.565,"batt":100.0,"det":false},{"id":1,"x":187.62,"y":192.50,"hdg":-1.613,"batt":100.0,"det":false},{"id":2,"x":182.85,"y":196.06,"hdg":-1.588,"batt":100.0,"det":false},{"id":3,"x":187.05,"y":196.38,"hdg":-1.609,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":82,"t":82.00,"coverage":0.1286,"drones":[{"id":0,"x":183.11,"y":181.52,"hdg":-0.954,"batt":100.0,"det":false},{"id":1,"x":191.94,"y":185.78,"hdg":-0.999,"batt":100.0,"det":false},{"id":2,"x":187.23,"y":189.37,"hdg":-0.990,"batt":100.0,"det":false},{"id":3,"x":191.32,"y":189.62,"hdg":-1.007,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":83,"t":83.00,"coverage":0.1286,"drones":[{"id":0,"x":190.59,"y":178.69,"hdg":-0.361,"batt":100.0,"det":false},{"id":1,"x":199.33,"y":182.72,"hdg":-0.392,"batt":100.0,"det":false},{"id":2,"x":194.61,"y":186.26,"hdg":-0.399,"batt":100.0,"det":false},{"id":3,"x":198.67,"y":186.45,"hdg":-0.407,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":84,"t":84.00,"coverage":0.1286,"drones":[{"id":0,"x":198.36,"y":180.60,"hdg":0.241,"batt":100.0,"det":false},{"id":1,"x":207.12,"y":184.56,"hdg":0.232,"batt":100.0,"det":false},{"id":2,"x":202.43,"y":187.93,"hdg":0.210,"batt":100.0,"det":false},{"id":3,"x":206.49,"y":188.15,"hdg":0.214,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":85,"t":85.00,"coverage":0.1286,"drones":[{"id":0,"x":203.99,"y":186.28,"hdg":0.790,"batt":100.0,"det":false},{"id":1,"x":212.67,"y":190.32,"hdg":0.804,"batt":100.0,"det":false},{"id":2,"x":208.12,"y":193.56,"hdg":0.780,"batt":100.0,"det":false},{"id":3,"x":212.11,"y":193.84,"hdg":0.792,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":86,"t":86.00,"coverage":0.1286,"drones":[{"id":0,"x":205.81,"y":194.07,"hdg":1.342,"batt":100.0,"det":false},{"id":1,"x":214.21,"y":198.17,"hdg":1.377,"batt":100.0,"det":false},{"id":2,"x":209.85,"y":201.37,"hdg":1.353,"batt":100.0,"det":false},{"id":3,"x":213.70,"y":201.68,"hdg":1.371,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":87,"t":87.00,"coverage":0.1286,"drones":[{"id":0,"x":202.65,"y":201.42,"hdg":1.977,"batt":100.0,"det":false},{"id":1,"x":210.75,"y":205.38,"hdg":2.019,"batt":100.0,"det":false},{"id":2,"x":206.47,"y":208.62,"hdg":2.007,"batt":100.0,"det":false},{"id":3,"x":210.20,"y":208.87,"hdg":2.023,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":88,"t":88.00,"coverage":0.1286,"drones":[{"id":0,"x":196.03,"y":205.91,"hdg":2.546,"batt":100.0,"det":false},{"id":1,"x":203.98,"y":209.65,"hdg":2.578,"batt":100.0,"det":false},{"id":2,"x":199.70,"y":212.88,"hdg":2.580,"batt":100.0,"det":false},{"id":3,"x":203.39,"y":213.07,"hdg":2.589,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":89,"t":89.00,"coverage":0.1286,"drones":[{"id":0,"x":188.03,"y":205.74,"hdg":-3.120,"batt":100.0,"det":false},{"id":1,"x":195.99,"y":209.34,"hdg":-3.103,"batt":100.0,"det":false},{"id":2,"x":191.71,"y":212.43,"hdg":-3.086,"batt":100.0,"det":false},{"id":3,"x":195.40,"y":212.62,"hdg":-3.086,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":90,"t":90.00,"coverage":0.1286,"drones":[{"id":0,"x":181.62,"y":200.95,"hdg":-2.500,"batt":100.0,"det":false},{"id":1,"x":189.54,"y":204.60,"hdg":-2.508,"batt":100.0,"det":false},{"id":2,"x":185.36,"y":207.56,"hdg":-2.487,"batt":100.0,"det":false},{"id":3,"x":189.01,"y":207.80,"hdg":-2.495,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":91,"t":91.00,"coverage":0.1286,"drones":[{"id":0,"x":178.94,"y":193.41,"hdg":-1.912,"batt":100.0,"det":false},{"id":1,"x":186.65,"y":197.14,"hdg":-1.941,"batt":100.0,"det":false},{"id":2,"x":182.64,"y":200.04,"hdg":-1.918,"batt":100.0,"det":false},{"id":3,"x":186.18,"y":200.32,"hdg":-1.933,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":92,"t":92.00,"coverage":0.1286,"drones":[{"id":0,"x":181.84,"y":185.96,"hdg":-1.200,"batt":100.0,"det":false},{"id":1,"x":189.24,"y":189.57,"hdg":-1.241,"batt":100.0,"det":false},{"id":2,"x":185.33,"y":192.50,"hdg":-1.227,"batt":100.0,"det":false},{"id":3,"x":188.75,"y":192.75,"hdg":-1.243,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":93,"t":93.00,"coverage":0.1286,"drones":[{"id":0,"x":188.17,"y":181.06,"hdg":-0.659,"batt":100.0,"det":false},{"id":1,"x":195.42,"y":184.49,"hdg":-0.689,"batt":100.0,"det":false},{"id":2,"x":191.51,"y":187.42,"hdg":-0.688,"batt":100.0,"det":false},{"id":3,"x":194.88,"y":187.61,"hdg":-0.697,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":94,"t":94.00,"coverage":0.1286,"drones":[{"id":0,"x":196.14,"y":180.37,"hdg":-0.086,"batt":100.0,"det":false},{"id":1,"x":203.38,"y":183.64,"hdg":-0.106,"batt":100.0,"det":false},{"id":2,"x":199.46,"y":186.48,"hdg":-0.118,"batt":100.0,"det":false},{"id":3,"x":202.83,"y":186.65,"hdg":-0.121,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":95,"t":95.00,"coverage":0.1286,"drones":[{"id":0,"x":202.88,"y":184.68,"hdg":0.569,"batt":100.0,"det":false},{"id":1,"x":210.09,"y":187.99,"hdg":0.574,"batt":100.0,"det":false},{"id":2,"x":206.26,"y":190.70,"hdg":0.555,"batt":100.0,"det":false},{"id":3,"x":209.60,"y":190.91,"hdg":0.562,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":96,"t":96.00,"coverage":0.1286,"drones":[{"id":0,"x":206.88,"y":191.60,"hdg":1.046,"batt":100.0,"det":false},{"id":1,"x":213.97,"y":194.99,"hdg":1.065,"batt":100.0,"det":false},{"id":2,"x":210.27,"y":197.62,"hdg":1.046,"batt":100.0,"det":false},{"id":3,"x":213.52,"y":197.88,"hdg":1.058,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":97,"t":97.00,"coverage":0.1286,"drones":[{"id":0,"x":205.83,"y":199.53,"hdg":1.703,"batt":100.0,"det":false},{"id":1,"x":212.63,"y":202.87,"hdg":1.739,"batt":100.0,"det":false},{"id":2,"x":209.05,"y":205.53,"hdg":1.723,"batt":100.0,"det":false},{"id":3,"x":212.18,"y":205.77,"hdg":1.739,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":98,"t":98.00,"coverage":0.1286,"drones":[{"id":0,"x":200.64,"y":205.62,"hdg":2.276,"batt":100.0,"det":false},{"id":1,"x":207.27,"y":208.82,"hdg":2.304,"batt":100.0,"det":false},{"id":2,"x":203.72,"y":211.49,"hdg":2.300,"batt":100.0,"det":false},{"id":3,"x":206.79,"y":211.68,"hdg":2.310,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":99,"t":99.00,"coverage":0.1289,"drones":[{"id":0,"x":193.09,"y":208.26,"hdg":2.805,"batt":100.0,"det":false},{"id":1,"x":199.66,"y":211.28,"hdg":2.829,"batt":100.0,"det":false},{"id":2,"x":196.09,"y":213.90,"hdg":2.836,"batt":100.0,"det":false},{"id":3,"x":199.15,"y":214.05,"hdg":2.841,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":100,"t":100.00,"coverage":0.1289,"drones":[{"id":0,"x":185.83,"y":204.89,"hdg":-2.706,"batt":100.0,"det":false},{"id":1,"x":192.41,"y":207.91,"hdg":-2.707,"batt":100.0,"det":false},{"id":2,"x":188.89,"y":210.40,"hdg":-2.689,"batt":100.0,"det":false},{"id":3,"x":191.94,"y":210.59,"hdg":-2.694,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":101,"t":101.00,"coverage":0.1289,"drones":[{"id":0,"x":181.08,"y":198.46,"hdg":-2.208,"batt":100.0,"det":false},{"id":1,"x":187.56,"y":201.54,"hdg":-2.221,"batt":100.0,"det":false},{"id":2,"x":184.16,"y":203.95,"hdg":-2.205,"batt":100.0,"det":false},{"id":3,"x":187.14,"y":204.18,"hdg":-2.214,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":102,"t":102.00,"coverage":0.1289,"drones":[{"id":0,"x":181.17,"y":190.46,"hdg":-1.559,"batt":100.0,"det":false},{"id":1,"x":187.40,"y":193.54,"hdg":-1.592,"batt":100.0,"det":false},{"id":2,"x":184.12,"y":195.95,"hdg":-1.575,"batt":100.0,"det":false},{"id":3,"x":186.99,"y":196.19,"hdg":-1.589,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":103,"t":103.00,"coverage":0.1289,"drones":[{"id":0,"x":186.32,"y":184.34,"hdg":-0.872,"batt":100.0,"det":false},{"id":1,"x":192.38,"y":187.28,"hdg":-0.899,"batt":100.0,"det":false},{"id":2,"x":189.13,"y":189.71,"hdg":-0.895,"batt":100.0,"det":false},{"id":3,"x":191.94,"y":189.90,"hdg":-0.904,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":104,"t":104.00,"coverage":0.1289,"drones":[{"id":0,"x":193.55,"y":180.93,"hdg":-0.441,"batt":100.0,"det":false},{"id":1,"x":199.53,"y":183.71,"hdg":-0.463,"batt":100.0,"det":false},{"id":2,"x":196.28,"y":186.12,"hdg":-0.466,"batt":100.0,"det":false},{"id":3,"x":199.06,"y":186.26,"hdg":-0.472,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":105,"t":105.00,"coverage":0.1289,"drones":[{"id":0,"x":201.17,"y":183.37,"hdg":0.310,"batt":100.0,"det":false},{"id":1,"x":207.16,"y":186.12,"hdg":0.306,"batt":100.0,"det":false},{"id":2,"x":203.94,"y":188.41,"hdg":0.290,"batt":100.0,"det":false},{"id":3,"x":206.72,"y":188.57,"hdg":0.293,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":106,"t":106.00,"coverage":0.1289,"drones":[{"id":0,"x":206.62,"y":189.22,"hdg":0.821,"batt":100.0,"det":false},{"id":1,"x":212.56,"y":192.02,"hdg":0.830,"batt":100.0,"det":false},{"id":2,"x":209.42,"y":194.24,"hdg":0.816,"batt":100.0,"det":false},{"id":3,"x":212.16,"y":194.44,"hdg":0.823,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":107,"t":107.00,"coverage":0.1289,"drones":[{"id":0,"x":208.50,"y":197.00,"hdg":1.334,"batt":100.0,"det":false},{"id":1,"x":214.25,"y":199.84,"hdg":1.358,"batt":100.0,"det":false},{"id":2,"x":211.25,"y":202.03,"hdg":1.341,"batt":100.0,"det":false},{"id":3,"x":213.89,"y":202.25,"hdg":1.353,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":108,"t":108.00,"coverage":0.1289,"drones":[{"id":0,"x":204.43,"y":203.88,"hdg":2.106,"batt":100.0,"det":false},{"id":1,"x":209.99,"y":206.61,"hdg":2.133,"batt":100.0,"det":false},{"id":2,"x":207.02,"y":208.82,"hdg":2.127,"batt":100.0,"det":false},{"id":3,"x":209.60,"y":209.00,"hdg":2.137,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":109,"t":109.00,"coverage":0.1289,"drones":[{"id":0,"x":198.04,"y":208.70,"hdg":2.495,"batt":100.0,"det":false},{"id":1,"x":203.50,"y":211.29,"hdg":2.517,"batt":100.0,"det":false},{"id":2,"x":200.54,"y":213.50,"hdg":2.517,"batt":100.0,"det":false},{"id":3,"x":203.08,"y":213.64,"hdg":2.523,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":110,"t":110.00,"coverage":0.1289,"drones":[{"id":0,"x":190.07,"y":208.03,"hdg":-3.058,"batt":100.0,"det":false},{"id":1,"x":195.54,"y":210.54,"hdg":-3.048,"batt":100.0,"det":false},{"id":2,"x":192.58,"y":212.66,"hdg":-3.036,"batt":100.0,"det":false},{"id":3,"x":195.12,"y":212.80,"hdg":-3.036,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":111,"t":111.00,"coverage":0.1289,"drones":[{"id":0,"x":184.29,"y":202.50,"hdg":-2.378,"batt":100.0,"det":false},{"id":1,"x":189.72,"y":205.05,"hdg":-2.385,"batt":100.0,"det":false},{"id":2,"x":186.84,"y":207.09,"hdg":-2.372,"batt":100.0,"det":false},{"id":3,"x":189.35,"y":207.27,"hdg":-2.378,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":112,"t":112.00,"coverage":0.1289,"drones":[{"id":0,"x":181.18,"y":195.13,"hdg":-1.970,"batt":100.0,"det":false},{"id":1,"x":186.48,"y":197.73,"hdg":-1.988,"batt":100.0,"det":false},{"id":2,"x":183.71,"y":199.72,"hdg":-1.972,"batt":100.0,"det":false},{"id":3,"x":186.15,"y":199.93,"hdg":-1.982,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":113,"t":113.00,"coverage":0.1289,"drones":[{"id":0,"x":184.69,"y":187.94,"hdg":-1.117,"batt":100.0,"det":false},{"id":1,"x":189.80,"y":190.45,"hdg":-1.144,"batt":100.0,"det":false},{"id":2,"x":187.08,"y":192.47,"hdg":-1.136,"batt":100.0,"det":false},{"id":3,"x":189.44,"y":192.64,"hdg":-1.147,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":114,"t":114.00,"coverage":0.1289,"drones":[{"id":0,"x":190.72,"y":182.68,"hdg":-0.717,"batt":100.0,"det":false},{"id":1,"x":195.73,"y":185.08,"hdg":-0.736,"batt":100.0,"det":false},{"id":2,"x":193.02,"y":187.11,"hdg":-0.735,"batt":100.0,"det":false},{"id":3,"x":195.34,"y":187.25,"hdg":-0.741,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":115,"t":115.00,"coverage":0.1289,"drones":[{"id":0,"x":198.69,"y":182.00,"hdg":-0.086,"batt":100.0,"det":false},{"id":1,"x":203.69,"y":184.29,"hdg":-0.099,"batt":100.0,"det":false},{"id":2,"x":200.97,"y":186.24,"hdg":-0.108,"batt":100.0,"det":false},{"id":3,"x":203.30,"y":186.37,"hdg":-0.110,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":116,"t":116.00,"coverage":0.1289,"drones":[{"id":0,"x":204.92,"y":187.02,"hdg":0.679,"batt":100.0,"det":false},{"id":1,"x":209.88,"y":189.35,"hdg":0.685,"batt":100.0,"det":false},{"id":2,"x":207.23,"y":191.22,"hdg":0.672,"batt":100.0,"det":false},{"id":3,"x":209.53,"y":191.38,"hdg":0.677,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":117,"t":117.00,"coverage":0.1289,"drones":[{"id":0,"x":209.34,"y":193.69,"hdg":0.985,"batt":100.0,"det":false},{"id":1,"x":214.23,"y":196.07,"hdg":0.997,"batt":100.0,"det":false},{"id":2,"x":211.66,"y":197.89,"hdg":0.984,"batt":100.0,"det":false},{"id":3,"x":213.91,"y":198.08,"hdg":0.991,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":118,"t":118.00,"coverage":0.1289,"drones":[{"id":0,"x":207.62,"y":201.51,"hdg":1.787,"batt":100.0,"det":false},{"id":1,"x":212.32,"y":203.84,"hdg":1.812,"batt":100.0,"det":false},{"id":2,"x":209.83,"y":205.67,"hdg":1.802,"batt":100.0,"det":false},{"id":3,"x":211.99,"y":205.84,"hdg":1.813,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":119,"t":119.00,"coverage":0.1289,"drones":[{"id":0,"x":201.84,"y":207.03,"hdg":2.379,"batt":100.0,"det":false},{"id":1,"x":206.44,"y":209.26,"hdg":2.396,"batt":100.0,"det":false},{"id":2,"x":203.96,"y":211.11,"hdg":2.395,"batt":100.0,"det":false},{"id":3,"x":206.09,"y":211.25,"hdg":2.400,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":120,"t":120.00,"coverage":0.1289,"drones":[{"id":0,"x":194.33,"y":209.80,"hdg":2.788,"batt":100.0,"det":false},{"id":1,"x":198.89,"y":211.90,"hdg":2.805,"batt":100.0,"det":false},{"id":2,"x":196.39,"y":213.72,"hdg":2.810,"batt":100.0,"det":false},{"id":3,"x":198.52,"y":213.83,"hdg":2.813,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":121,"t":121.00,"coverage":0.1289,"drones":[{"id":0,"x":187.51,"y":205.63,"hdg":-2.593,"batt":100.0,"det":false},{"id":1,"x":192.05,"y":207.75,"hdg":-2.596,"batt":100.0,"det":false},{"id":2,"x":189.61,"y":209.48,"hdg":-2.583,"batt":100.0,"det":false},{"id":3,"x":191.72,"y":209.62,"hdg":-2.588,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":122,"t":122.00,"coverage":0.1289,"drones":[{"id":0,"x":182.25,"y":199.60,"hdg":-2.287,"batt":100.0,"det":false},{"id":1,"x":186.75,"y":201.76,"hdg":-2.294,"batt":100.0,"det":false},{"id":2,"x":184.38,"y":203.43,"hdg":-2.284,"batt":100.0,"det":false},{"id":3,"x":186.45,"y":203.60,"hdg":-2.289,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":123,"t":123.00,"coverage":0.1289,"drones":[{"id":0,"x":182.60,"y":191.60,"hdg":-1.527,"batt":100.0,"det":false},{"id":1,"x":186.92,"y":193.76,"hdg":-1.550,"batt":100.0,"det":false},{"id":2,"x":184.64,"y":195.43,"hdg":-1.538,"batt":100.0,"det":false},{"id":3,"x":186.63,"y":195.60,"hdg":-1.549,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":124,"t":124.00,"coverage":0.1289,"drones":[{"id":0,"x":188.34,"y":186.03,"hdg":-0.771,"batt":100.0,"det":false},{"id":1,"x":192.56,"y":188.09,"hdg":-0.788,"batt":100.0,"det":false},{"id":2,"x":190.29,"y":189.77,"hdg":-0.787,"batt":100.0,"det":false},{"id":3,"x":192.25,"y":189.90,"hdg":-0.792,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":125,"t":125.00,"coverage":0.1289,"drones":[{"id":0,"x":195.36,"y":182.19,"hdg":-0.500,"batt":100.0,"det":false},{"id":1,"x":199.52,"y":184.14,"hdg":-0.516,"batt":100.0,"det":false},{"id":2,"x":197.24,"y":185.81,"hdg":-0.517,"batt":100.0,"det":false},{"id":3,"x":199.18,"y":185.91,"hdg":-0.522,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":126,"t":126.00,"coverage":0.1289,"drones":[{"id":0,"x":202.74,"y":185.27,"hdg":0.395,"batt":100.0,"det":false},{"id":1,"x":206.91,"y":187.21,"hdg":0.394,"batt":100.0,"det":false},{"id":2,"x":204.66,"y":188.80,"hdg":0.383,"batt":100.0,"det":false},{"id":3,"x":206.59,"y":188.93,"hdg":0.386,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":127,"t":127.00,"coverage":0.1289,"drones":[{"id":0,"x":208.15,"y":191.16,"hdg":0.828,"batt":100.0,"det":false},{"id":1,"x":212.28,"y":193.13,"hdg":0.834,"batt":100.0,"det":false},{"id":2,"x":210.09,"y":194.67,"hdg":0.824,"batt":100.0,"det":false},{"id":3,"x":212.00,"y":194.82,"hdg":0.829,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":128,"t":128.00,"coverage":0.1289,"drones":[{"id":0,"x":210.00,"y":198.95,"hdg":1.338,"batt":100.0,"det":false},{"id":1,"x":213.99,"y":200.95,"hdg":1.355,"batt":100.0,"det":false},{"id":2,"x":211.89,"y":202.47,"hdg":1.344,"batt":100.0,"det":false},{"id":3,"x":213.73,"y":202.63,"hdg":1.352,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":129,"t":129.00,"coverage":0.1289,"drones":[{"id":0,"x":205.13,"y":205.30,"hdg":2.225,"batt":100.0,"det":false},{"id":1,"x":209.02,"y":207.21,"hdg":2.242,"batt":100.0,"det":false},{"id":2,"x":206.93,"y":208.75,"hdg":2.239,"batt":100.0,"det":false},{"id":3,"x":208.74,"y":208.88,"hdg":2.245,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":130,"t":130.00,"coverage":0.1289,"drones":[{"id":0,"x":199.02,"y":210.46,"hdg":2.440,"batt":100.0,"det":false},{"id":1,"x":202.83,"y":212.29,"hdg":2.455,"batt":100.0,"det":false},{"id":2,"x":200.75,"y":213.82,"hdg":2.454,"batt":100.0,"det":false},{"id":3,"x":202.53,"y":213.93,"hdg":2.459,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":131,"t":131.00,"coverage":0.1289,"drones":[{"id":0,"x":191.12,"y":209.21,"hdg":-2.984,"batt":100.0,"det":false},{"id":1,"x":194.94,"y":210.99,"hdg":-2.979,"batt":100.0,"det":false},{"id":2,"x":192.87,"y":212.45,"hdg":-2.970,"batt":100.0,"det":false},{"id":3,"x":194.65,"y":212.57,"hdg":-2.970,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":132,"t":132.00,"coverage":0.1289,"drones":[{"id":0,"x":185.72,"y":203.30,"hdg":-2.311,"batt":100.0,"det":false},{"id":1,"x":189.51,"y":205.11,"hdg":-2.317,"batt":100.0,"det":false},{"id":2,"x":187.49,"y":206.53,"hdg":-2.308,"batt":100.0,"det":false},{"id":3,"x":189.25,"y":206.67,"hdg":-2.312,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":133,"t":133.00,"coverage":0.1289,"drones":[{"id":0,"x":182.35,"y":196.05,"hdg":-2.006,"batt":100.0,"det":false},{"id":1,"x":186.06,"y":197.90,"hdg":-2.017,"batt":100.0,"det":false},{"id":2,"x":184.12,"y":199.28,"hdg":-2.007,"batt":100.0,"det":false},{"id":3,"x":185.82,"y":199.44,"hdg":-2.013,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":134,"t":134.00,"coverage":0.1289,"drones":[{"id":0,"x":186.53,"y":189.22,"hdg":-1.022,"batt":100.0,"det":false},{"id":1,"x":190.11,"y":191.00,"hdg":-1.040,"batt":100.0,"det":false},{"id":2,"x":188.19,"y":192.40,"hdg":-1.036,"batt":100.0,"det":false},{"id":3,"x":189.85,"y":192.53,"hdg":-1.042,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":135,"t":135.00,"coverage":0.1289,"drones":[{"id":0,"x":192.51,"y":183.91,"hdg":-0.725,"batt":100.0,"det":false},{"id":1,"x":196.02,"y":185.61,"hdg":-0.738,"batt":100.0,"det":false},{"id":2,"x":194.12,"y":187.02,"hdg":-0.737,"batt":100.0,"det":false},{"id":3,"x":195.75,"y":187.13,"hdg":-0.742,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":136,"t":136.00,"coverage":0.1289,"drones":[{"id":0,"x":200.50,"y":183.40,"hdg":-0.065,"batt":100.0,"det":false},{"id":1,"x":204.00,"y":185.02,"hdg":-0.074,"batt":100.0,"det":false},{"id":2,"x":202.09,"y":186.38,"hdg":-0.080,"batt":100.0,"det":false},{"id":3,"x":203.72,"y":186.47,"hdg":-0.082,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":137,"t":137.00,"coverage":0.1289,"drones":[{"id":0,"x":206.17,"y":189.03,"hdg":0.782,"batt":100.0,"det":false},{"id":1,"x":209.65,"y":190.69,"hdg":0.787,"batt":100.0,"det":false},{"id":2,"x":207.79,"y":191.99,"hdg":0.778,"batt":100.0,"det":false},{"id":3,"x":209.40,"y":192.11,"hdg":0.782,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":138,"t":138.00,"coverage":0.1289,"drones":[{"id":0,"x":210.91,"y":195.48,"hdg":0.937,"batt":100.0,"det":false},{"id":1,"x":214.34,"y":197.16,"hdg":0.944,"batt":100.0,"det":false},{"id":2,"x":212.54,"y":198.43,"hdg":0.935,"batt":100.0,"det":false},{"id":3,"x":214.12,"y":198.57,"hdg":0.940,"batt":100.0,"det":false}]}
{"type":"step","ep":19,"step":139,"t":139.00,"coverage":0.1289,"drones":[{"id":0,"x":208.47,"y":203.10,"hdg":1.881,"batt":100.0,"det":false},{"id":1,"x":211.76,"y":204.74,"hdg":1.899,"batt":100.0,"det":false},{"id":2,"x":210.00,"y":206.02,"hdg":1.893,"batt":100.0,"det":false},{"id":3,"x":211.53,"y":206.14,"hdg":1.900,"batt":100.0,"det":false}]}
{"type":"episode","ep":19,"mean_return":132.4876,"policy_loss":-6445.3413,"value_loss":205555.6875,"victims_found":0}