AnalysisBenchmark analysis

Key findings

Same configs, two engines — the real bridge is the ground truth

Real fleet ceiling (warehouse_xl)

8robots
collapses beyond

Bridge missions at 12–20 robots

0/ 15 min
fleet freezes

central_aisle vs offline estimate

-92%
1 vs 13 missions

Best RL gain over FIFO

23%
contended configs only

Fleet scaling

warehouse_xl · 4 chargers · FIFO — does adding robots add throughput?

The offline engine peaks at 12 robots (24 missions). The real bridge peaks at 4 and completes zero missions from 12 robots up — every 12–20-robot run ended in a detected fleet freeze. Safe real-world ceiling on this floor: 8 robots.

Layout comparison

6 robots · 2 chargers · FIFO — the floor plan is the only variable

Both engines rank standard first. They disagree hardest on central_aisle: usable offline (13 missions), near-total freeze on the real bridge (1 mission, 15 of 30 observation windows frozen) — the single centre aisle becomes a one-lane choke point once charging traffic joins mission traffic.

Charger scaling

warehouse_xl · 20 robots · FIFO

ChargersOffline missionsOffline block (s)Bridge missionsBridge block (s)
1145170015966
2145306015674
3174979016003
4146011016028

1 → 4 chargers changes nothing in either engine: block time stays flat and the bridge fleet stays frozen. At this fleet size the constraint is floor space and junctions, not charging capacity.

FIFO vs RL

Missions per 15 min, matched configs

ConfigFIFORLRL vs FIFO
warehouse_xl · 6r · 4c (bridge)1011+10%
warehouse_xl · 20r · 4c (bridge)00both freeze
central_aisle · 6r · 2c (offline)1316+23%
standard · 6r · 2c (offline)1818no change
zoned_io · 6r · 2c (offline)88no change
warehouse_xl · 6r · 2c (offline)1818no change

RL earns +10–23% only where contention exists (central_aisle, dense fleets short of collapse). In sparse configs it matches FIFO exactly, and at 20 robots both policies freeze — priority ordering cannot break structural deadlocks.

Method & caveats

How these numbers were produced, and where they can mislead

Two engines, same configs

  • Offline batch engine (scripts/scenario_suite.py): deterministic, no battery model. Its rows feed the Recent benchmarks table and /compare.
  • Real ROS bridge, headless (warehouse_rviz_bridge.py under a fake clock): full traffic manager, reservations, safety stops, station yields, dock gates and battery — the code production runs. 900 s of simulation per scenario, no RViz.

Caveats

  • Offline numbers are optimistic upper bounds: that engine has no battery model and less physical friction (no safety stops, station yields, or dock gates).
  • charger_wait_time reads 0 even during charger crises — it only counts waiting AT a station, not being blocked on the way to one. The live production fleet shows exactly this blind spot.
  • Production DB still enforces the old limits (≤10 robots, ≤2 chargers), so the 12–20-robot rows live only in data/benchmark_runs.jsonl until migration 014 is applied.