Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
142 commits
Select commit Hold shift + click to select a range
8714821
Bump pre-commit ruff to v0.15.12 and move lint keys under [lint]
isaac0804 Oct 14, 2026
7ef7709
Move strategy_table into utama_core.analysis
isaac0804 Oct 14, 2026
f39d35e
Remove unused defense, referee, rsim and obstacle helpers
isaac0804 Oct 14, 2026
7316a0c
Remove unused scenario banks v5 and v6
isaac0804 Oct 14, 2026
6fff9da
Split strategy_runner into side, sim-recovery, vision-stream and live…
isaac0804 Oct 14, 2026
690f817
Share one git_revision helper between the benchmark and scenario-benc…
isaac0804 Oct 14, 2026
9968ff4
Point the real-robots work-area row at its doc and the real data_proc…
isaac0804 Oct 14, 2026
47c9296
Drop duplicate linux-64 main task and document build-planner
isaac0804 Oct 14, 2026
bb017c5
Replace vector.py's __main__ self-check with a unit assertion
isaac0804 Oct 14, 2026
e7ecd25
Remove unreferenced pipeline.drawio.png diagram
isaac0804 Oct 14, 2026
d49d5ce
Remove leftover commented-out class signatures and a stub
isaac0804 Oct 14, 2026
863ccf0
Remove the duplicate referee GUI demo from the test tree
isaac0804 Oct 14, 2026
15780ad
Drop motion_stats' unused Optional import
isaac0804 Oct 14, 2026
e635b55
docs: sim realism plan, with value-model and structured-search priori…
isaac0804 Oct 16, 2026
716e58a
physics_ranges: ball deceleration, robot motion and dropout ranges fr…
isaac0804 Oct 16, 2026
89e4407
Realism scorecard: shot detection, real xG and shot outcomes in utama…
isaac0804 Oct 16, 2026
0d4baa9
Merge realism/physics-ranges: ball, robot motion and dropout ranges
isaac0804 Oct 16, 2026
9e37f1e
sim_realism.md: Phase 1 ball, robot motion and dropout results
isaac0804 Oct 16, 2026
9b40660
Seeded sim noise: per-robot latency, kick speed noise, vision noise
isaac0804 Oct 16, 2026
0459b0a
STRATEGY_DEVELOPMENT.md: resolve leftover merge-conflict markers
isaac0804 Oct 11, 2026
921874c
Merge realism/sim-knobs: seeded latency, kick speed and vision noise …
isaac0804 Oct 16, 2026
b91a7d6
round_robin: key cached matches and the summary by --match-seconds
isaac0804 Oct 16, 2026
b4cdc21
Realism scorecard reference: real 2025-2026 Division B xG model and rows
isaac0804 Oct 16, 2026
dcc6088
Merge realism/scorecard: realism scorecard and real xG reference
isaac0804 Oct 16, 2026
9483605
sim_realism.md: Phase 0 done; correct live time and pooled ratios
isaac0804 Oct 16, 2026
b4a51d2
sim_realism.md: robot motion reflects the planner as well as hardware
isaac0804 Oct 16, 2026
07ab988
convert_ssl_log: keep the tracker's kicks, visibility and raw camera …
isaac0804 Oct 16, 2026
e74c1b1
Merge realism/converter-extras: keep tracker kicks, visibility and ra…
isaac0804 Oct 16, 2026
bea0e9c
Realism scorecard: post vs wide vs crossed, reaction time, pass offse…
isaac0804 Oct 16, 2026
7ba0eb7
convert_ssl_log: --keep-raw keeps each download per year and reuses it
isaac0804 Oct 16, 2026
47fa771
sim_realism.md: robots fielded, breakdowns, stoppages, held-out years
isaac0804 Oct 16, 2026
9c57462
WIP: scorecard extension unfinished items
isaac0804 Oct 16, 2026
5de4cde
WIP: SimNoise physics knobs: ball friction, kick direction, substeps,…
isaac0804 Oct 16, 2026
fa89d8e
convert_ssl_log: cap each conversion's memory (--max-memory-gb, defau…
isaac0804 Oct 16, 2026
1bf9675
Realism reference rebuilt from 53 real 2025-26 Div B matches (new rows)
isaac0804 Oct 16, 2026
d0ab044
Format physics knobs (black)
isaac0804 Oct 16, 2026
7e2ce1f
Merge realism/physics-knobs: SimNoise ball friction, kick direction, …
isaac0804 Oct 16, 2026
cf32943
FORK_NOTES: physics-knobs rSim build installed, knobs-off match ident…
isaac0804 Oct 16, 2026
7fd6fbd
convert_ssl_log: resume a download the share cut short, check sizes
isaac0804 Oct 16, 2026
aff97ea
Test: a dribbled ball stays at the kicker with two-phase ball friction
isaac0804 Oct 16, 2026
bd7f72c
sim_realism.md: raw vision noise, kick spread, first two calibration …
isaac0804 Oct 16, 2026
cdcfde7
Realism shots: a ball already past the goal line is not a shot
isaac0804 Oct 16, 2026
85c7a2c
Realism reference rebuilt without post-goal bounces (959 attempts, AU…
isaac0804 Oct 16, 2026
075f5b2
Merge realism/scorecard-more: wide/post/crossed split, reaction time,…
isaac0804 Oct 16, 2026
c47cb6f
Test fake for _download takes the expected size
isaac0804 Oct 16, 2026
a7fef90
sim_realism.md: post-goal bounces removed from the real reference; ke…
isaac0804 Oct 16, 2026
657b569
sim_realism.md: first sensitivity sweep (seed, latency, kick direction)
isaac0804 Oct 16, 2026
aaca351
pixi builds rc-robosim from vendor/rSim (our fork), not the PyPI 1.2
isaac0804 Oct 16, 2026
bd88f7a
FORK_NOTES: how to rebuild after a source change
isaac0804 Oct 16, 2026
7a29479
sim_realism.md: chips ruled out as the keeper gap
isaac0804 Oct 16, 2026
dbfdaae
Merge branch 'realism/rsim-build' into sim-realism-20261016
isaac0804 Oct 16, 2026
cc101f8
sim_realism.md: 28-match v3 sample
isaac0804 Oct 16, 2026
da39065
Merge remote-tracking branch 'origin/cleanup/repo-hygiene' into sim-r…
isaac0804 Oct 16, 2026
f9d2091
sim_realism.md: new baseline round-robin with v3 noise
isaac0804 Oct 16, 2026
c2be2e8
sim_realism.md: real-data value model, first results
isaac0804 Oct 16, 2026
10b7cd5
sim_realism.md: value model pass 3 (data fixes)
isaac0804 Oct 16, 2026
2372924
Expected standings: rank strategies by shots on target as well as goals
isaac0804 Oct 17, 2026
274cda3
Strategy evaluation: reference pool, paired sequential test, match le…
isaac0804 Oct 17, 2026
e0c845d
Evaluation docs cleanup; retire the ladder
isaac0804 Oct 17, 2026
239fa28
Fingerprints ignore comments, docstrings and formatting
isaac0804 Oct 17, 2026
a9845fd
Retire the scenario bench
isaac0804 Oct 17, 2026
f862fc9
Regression moments: replayed field states with a fixed check
isaac0804 Oct 17, 2026
1403812
Referee override: push-out targets in a corner stay on the pitch
isaac0804 Oct 17, 2026
c64fc6f
Planner: a robot pressed against another robot may drive straight away
isaac0804 Oct 17, 2026
a06e003
Regression moments: three more field states from the 20261017 run
isaac0804 Oct 17, 2026
d714aa2
Regression moments: hand-made templates and tactic moments
isaac0804 Oct 17, 2026
864c390
Merge branch 'worktree-agent-a99981719ccc76470' into sim-realism-2026…
isaac0804 Oct 17, 2026
5b159c0
Regression moments: a tactic that never runs fails; play --seed, foul…
isaac0804 Oct 17, 2026
935da77
Planner: a robot inside the ball's keep-out circle never closes on th…
isaac0804 Oct 17, 2026
acea97c
Regression moments: requires and outcome checks
isaac0804 Oct 17, 2026
20ca197
Regression moments: keeps_clear measures the robot's own approach; re…
isaac0804 Oct 17, 2026
b1d9e36
Merge requires conditions and outcome checks for regression moments
isaac0804 Oct 17, 2026
12b4641
Referee: a free kick is taken once the ball moves 0.05 m
isaac0804 Oct 17, 2026
065e176
Regression moments: our_placement_completes known_failure gives the c…
isaac0804 Oct 17, 2026
01339d2
Regression moments: remove tactic moments and unused checks
isaac0804 Oct 17, 2026
c47b12a
Docs: debugging a foul or failure, with the bugs found so far
isaac0804 Oct 17, 2026
78685f7
Ball placement: our placer routes round the ball to its approach point
isaac0804 Oct 17, 2026
00fc51c
Regression moments: drop our_placement_completes and its check
isaac0804 Oct 17, 2026
718ce2f
Moments: play under seeds, against another commit, events, scratch st…
isaac0804 Oct 17, 2026
c3fd09c
Moments: play --against runs this judge on the other commit's code
isaac0804 Oct 17, 2026
e2c2938
Docs: a reproducing moment is not required; what to try when a captur…
isaac0804 Oct 17, 2026
1b7f748
Scenario: a time counts from the replay's first frame, as the sidecar…
isaac0804 Oct 17, 2026
6707000
repro_from_replay: --help says which strategy name forms it takes
isaac0804 Oct 17, 2026
29cfe03
moments fouls: --by counts per strategy, rule, tactic or restart; out…
isaac0804 Oct 17, 2026
72e9b84
Rolling-ball receive point: clamp to the field
isaac0804 Oct 17, 2026
fec14b9
moments: play --follow steers opponents along their recorded poses
isaac0804 Oct 17, 2026
9c22488
Revert "moments: play --follow steers opponents along their recorded …
isaac0804 Oct 17, 2026
ad3918b
Docs: debug a foul from the trace to the code; moments only for resta…
isaac0804 Oct 17, 2026
50c0799
Hide pygame's support banner in tool and test output
isaac0804 Oct 17, 2026
d6beb8b
Add tools/setup_worktree.sh for parallel-agent worktrees
isaac0804 Oct 17, 2026
e4605cc
replay_trace: --events lists kicks, possession, referee and fouls; --…
isaac0804 Oct 17, 2026
cec154a
repro_from_replay: --summary per robot; document the --trace-out JSON…
isaac0804 Oct 17, 2026
332a318
moments fouls: --json
isaac0804 Oct 17, 2026
8450a3a
Debugging a foul: mention --events, --summary, --json and setup_worktree
isaac0804 Oct 17, 2026
a64ed72
fix(carry): count reaction time before braking in carry_exhausted
isaac0804 Oct 17, 2026
6febfa3
repro_from_replay: play with the replay's own sim noise by default
isaac0804 Oct 17, 2026
423f63a
moments fouls --json: name each foul's match replay
isaac0804 Oct 17, 2026
1731e90
Planner: push a robot inside the ball's keep-out past the edge, not o…
isaac0804 Oct 17, 2026
abae53a
Release hygiene: no local paths in the realism reference, stale bench…
isaac0804 Oct 17, 2026
e9a540a
FORK_NOTES: pixi builds this fork now; fresh-clone build checked
isaac0804 Oct 17, 2026
ea31ace
Catalog and signal report: results of the 2026-10-17 round-robin
isaac0804 Oct 17, 2026
bf81198
Signal report: figures that explain results, not rank colours
isaac0804 Oct 17, 2026
0d28a40
Add plan_snapshot: draw what FastPathPlanner decided on one tick
isaac0804 Oct 17, 2026
aa8ea82
Document plan_snapshot and add the kick-off keep-out example
isaac0804 Oct 17, 2026
635affd
Motion-planning benchmark: --figures for trajectories and a summary
isaac0804 Oct 17, 2026
cf0b262
Docs: README one-tick diagram from the current code
isaac0804 Oct 17, 2026
0026296
Tools: package dependency graph, with the replay/analysis import rule
isaac0804 Oct 17, 2026
aa97543
Docs: flowcharts for debugging a foul and for evaluating a strategy
isaac0804 Oct 17, 2026
17abdd2
Docs: Mermaid diagrams for the tactic-kernel model and referee restarts
isaac0804 Oct 17, 2026
5e97e09
Docs: diagram the per-tick partition order in tactic model design dec…
isaac0804 Oct 17, 2026
906dc8b
Docs: Mermaid diagrams for match data, goal ledger and signals
isaac0804 Oct 17, 2026
fea5417
Docs: Mermaid diagrams for the rsim tick and the real robot path
isaac0804 Oct 17, 2026
9b4e138
Docs: referee state machine, architecture and foul-to-restart diagrams
isaac0804 Oct 17, 2026
d40ec84
Docs: motion-planning control-scheme and FastPathPlanner decision dia…
isaac0804 Oct 17, 2026
2f1073b
Docs: referee prose matches the code; fpp diagram shows _leaving as a…
isaac0804 Oct 17, 2026
f0b6da5
tools: match_timeline swimlanes for one match window
isaac0804 Oct 17, 2026
6310c1a
docs: match_timeline in tools.md and the observability section
isaac0804 Oct 17, 2026
98f279d
Add restart picture: where the referee override sends every robot
isaac0804 Oct 17, 2026
c288849
Docs: restart picture in Referee handling, tools row, example images
isaac0804 Oct 17, 2026
d174cae
Add plan_trace: the fast-path planner over a time window
isaac0804 Oct 17, 2026
6f73acf
Docs: plan_trace in tools.md, debugging guide and the fpp section
isaac0804 Oct 17, 2026
f93d6c6
Add tools/pitch_maps.py: how each strategy plays, on the pitch
isaac0804 Oct 17, 2026
b0a4ff8
Docs: on-the-pitch figures for the signal report
isaac0804 Oct 17, 2026
3716f29
evaluate.py --explain: on-pitch pictures of a candidate against the c…
isaac0804 Oct 17, 2026
850102f
Docs: --explain pictures, with the round-robin example
isaac0804 Oct 17, 2026
205fac3
Add a shared Finding format; match_timeline, plan_trace and pitch_map…
isaac0804 Oct 17, 2026
d26dfdf
restart_picture writes findings for every restart; the stop deadband …
isaac0804 Oct 17, 2026
74592a7
Docs: --findings on the four picture tools and the Finding format
isaac0804 Oct 17, 2026
92401d6
tactic_thrash counts flip-backs, not switches
isaac0804 Oct 17, 2026
09ec222
Docs: visual_guide.md, the game drawn on the pitch
isaac0804 Oct 17, 2026
d1ba3fa
Add tools/triage.py: findings, pictures and an index per run dir
isaac0804 Oct 17, 2026
1973dac
Docs: triage.py is the start of a match diagnosis
isaac0804 Oct 17, 2026
632470a
triage: picture a stall with the match timeline, not a guessed plan_t…
isaac0804 Oct 17, 2026
d3c66f5
Docs: triage as the start of the visual guide, with a stall it found
isaac0804 Oct 17, 2026
102c9d9
Docs: position and shot maps in the README and glossary; what the lin…
isaac0804 Oct 17, 2026
0d8367e
Docs: README opens with the position and shot maps
isaac0804 Oct 17, 2026
3f70eec
Docs: README cleanup
isaac0804 Oct 17, 2026
dc5a06f
Docs: README without the strategy maps; they stay in the visual guide
isaac0804 Oct 17, 2026
2d75f88
Docs: a drawn one-tick pipeline picture for the README and pipeline_m…
isaac0804 Oct 17, 2026
98cf441
Docs: shared style for drawn pictures, and a test that their names exist
isaac0804 Oct 17, 2026
2581a2f
Docs: seven architecture diagrams drawn instead of Mermaid
isaac0804 Oct 17, 2026
a2b9c37
Tests: corner-route seed 28 may stick on some CPUs
isaac0804 Oct 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,6 @@ ssl-game-controller/
replays
renders/
scratch/
scenario_bench_results/
benchmark_results/

# local agent-tool config dirs
Expand Down
4 changes: 2 additions & 2 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ repos:
- id: black
args: ["--line-length", "120"]
files: \.py$
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: v0.0.261 # replace with latest stable version
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.15.12
hooks:
- id: ruff
args: ["--fix"] # auto-fix issues like formatting, unused imports
Expand Down
53 changes: 31 additions & 22 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,48 +17,55 @@ exists yet: say so in your change rather than guessing.
| Area | Paths | Doc | Notes |
|---|---|---|---|
| Strategy / tactics | `utama_core/engine/`, `strategy/`, `tactics/`, `skills/` | `docs/STRATEGY_DEVELOPMENT.md` | Engine changes are rare: a new primitive, not a new strategy |
| Strategy evaluation | `tools/evaluation/`, `tools/scenario_bench.py`, `utama_core/scenario_bench/`, `utama_core/replay/`, `utama_core/analysis/` | `docs/STRATEGY_DEVELOPMENT.md`, `docs/signals.md` | Change evaluation and strategy in separate commits, so results stay comparable |
| Strategy evaluation | `tools/evaluation/`, `utama_core/replay/`, `utama_core/analysis/` | `docs/STRATEGY_DEVELOPMENT.md`, `docs/signals.md` | Change evaluation and strategy in separate commits, so results stay comparable |
| Referee | `utama_core/custom_referee/` | `docs/custom_referee.md` | |
| Motion planning | `utama_core/motion_planning/`, `tools/motion_planning_benchmark.py` | `docs/motion_planning_comparison.md` | |
| Simulation | `utama_core/rsoccer_simulator/`, `vendor/rSim/` | `vendor/rSim/FORK_NOTES.md` | `vendor/rSim` is the C++ physics fork; `rsoccer_simulator` is the Python env on top of it |
| Real robots (radio, vision, controllers) | `utama_core/team_controller/`, `data_processing/` | `TODO` (see `team_controller/README.md`) | |
| Real robots (radio, vision, controllers) | `utama_core/team_controller/`, `utama_core/data_processing/` | `utama_core/team_controller/README.md` (brief) | |

## Glossary

One term per thing; reuse these instead of coining new ones.

- **Round-robin / tournament run** — every strategy config plays every other once
(`tools/evaluation/round_robin.py`); writes `replays/tournament_<id>/summary.json`. The ground truth for
"which strategy is better". Slow in full; with `--reuse` only matches whose code changed rerun.
- **Standings** — a round-robin's ranking. `round_robin.py` prints wins and draws;
`metric_correlation.py` uses points per match (3 a win, 1 a draw) and goal difference.
- **Start** — one situation (see below) the scenario bench replays for 10 s, tagged with its
type from the candidate's view. In code: `BenchScenario` (`scenario_bench/start.py`), and
"scenario" in flags and enums.
- **Bank** — a versioned list of starts (`utama_core/scenario_bench/banks/bank_vN.json`),
harvested from one round-robin's replays, up to 40 of each situation type.
- **Scenario bench** — `tools/scenario_bench.py`: a fast paired A/B screen of a candidate
against a baseline on a bank, each start against the opponent it came from; it estimates the
change in goals per match as Σ situations per match (real or sim weights) × the change in
P(goal within 10 s). A diagnostic, not a ranking: it cannot see a candidate change how often
situations happen or score from build-up longer than 10 s, so rank with matches.
- **Bench validators** — `tools/bench_vs_standings.py` and `tools/metric_correlation.py` check
how far the bench and cheap proxy metrics agree with round-robin results.
(`tools/evaluation/round_robin.py`); writes `replays/tournament_<id>/summary.json` and adds its matches to the evaluation ledger.
The check for stalls and the occasional health check of the whole catalog; a single
strategy is judged with `evaluate.py` (below). With `--reuse` only matches whose code changed rerun.
- **Standings** — only a round-robin's ranking: wins and draws as `round_robin.py` prints them,
or points per match (3 a win, 1 a draw) as `metric_correlation.py` computes them. Not the
verdict on a strategy; see Evaluation.
- **Motion planning benchmark** — `tools/motion_planning_benchmark.py`: the planner alone on
fixed scenarios. Unrelated to the scenario bench or any strategy.
fixed scenarios. Unrelated to any strategy.
- **Moment / regression moment** — a field state (from a replay or by hand) that reproduced a
bug, with a check of the right behaviour (`utama_core/tests/moments/*.json`, `tools/moments.py`).
A cheap end-to-end check, run in `pixi run test`, that a fixed bug stays fixed; the unit test at
the cause is the real protection. Not a ranking and not a gate on strategies. The workflow and
the bugs found so far: `docs/STRATEGY_DEVELOPMENT.md`, "Debugging a foul or failure".
- **Pitch zones** — defensive / middle / attacking third, left wing / centre / right wing, the
box, danger: defined once, with a diagram, in `docs/pitch_zones.md`. Use those names.
- **Catch rate** — a diagnostic reported from the bank, never a gate (±4–8 pts between runs).
- **Catch rate** — a diagnostic (share of reachable passes received), never a gate (±4–8 pts between runs).
- **Position map / shot map** — on-pitch pictures of a strategy over many matches, drawn by
`tools/pitch_maps.py` (and `evaluate.py --explain` for a candidate against the champion), always
turned so the strategy attacks right. Position map: a heatmap of where the outfield robots stand in
live play, with the ball and without it, plus each robot's mean position. Shot map: every shot at
the spot it was struck from, own and conceded. They explain how a strategy plays; never a ranking.
- **Signal** — an interpretable measure of how a strategy plays (shots, danger conceded, real
ball losses, stalls ...), for explaining results, never a target. All listed in `docs/signals.md`.
- **Evaluation / ratings / reference pool / ledger** — `tools/evaluation/evaluate.py`: is a
candidate stronger than the champion of a fixed, versioned reference pool
(`tools/evaluation/pools/pool_vN.json`)? Rounds of matches against the pool's opponents under
seeded sim noise, decided on paired results (candidate and champion against the same opponent
under the same noise) and stopping once the answer is clear; ratings (strength ± SD in goals
per match, `analysis/ratings.py`) over every match in the ledger (`replays/eval/ledger.jsonl`).
Goals only: shots, xG and the other signals were tested as rankers and rejected
(`docs/signals.md`, "Ranking"). The day-to-day way to judge a strategy.
- **Situation / goal ledger** — a situation starts when a restart goes live or a side wins the
ball in open play; the goal ledger (`utama_core/analysis/goal_ledger.py`) gives each goal to
the latest situation less than 10 s before it, so goals per match = Σ situations per match ×
P(goal). Situation types: own / opponent ball won or free kick in each third, own / opponent
kickoff or penalty, force start. See `docs/signals.md`.
- **Situation rates** — how often each situation type happens per team per live minute, from
real Division B matches or our round-robin (`banks/situation_rates_{real,sim}.json`,
`goal_ledger --rates`): the scenario bench's weights.
real Division B matches or our round-robin (`goal_ledger --rates PATH`).

## Repo map

Expand Down Expand Up @@ -111,6 +118,8 @@ declarations) — check there before reintroducing one of them.
- **Always pass `--headless`** when running any simulator/integration test:
`pixi run pytest utama_core/tests/ --headless`. Much faster; there is no reason to run
with graphics in an agent loop.
- A git worktree for a parallel agent: run `tools/setup_worktree.sh` inside it (links `.pixi`,
copies the compiled planner/simulator `.so` files; without them tests differ).
- `pixi run test` runs the default suite; `pixi run lint` runs the full pre-commit stack
(black, ruff, isort) — run both before considering a change done.
- `--level quick|full` (defined in the root `conftest.py`, not `utama_core/tests/
Expand Down
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/First-Order-RoboCup-SSL/Utama-Core)
# Utama Core

[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/First-Order-RoboCup-SSL/Utama-Core)

First Order Robotics' software stack for [RoboCup SSL](https://ssl.robocup.org/) (Small Size
League), where teams of six autonomous robots play football. It covers vision and referee
input, motion planning, robot control, an in-process referee, a fast simulator (rsim), and the
Expand Down Expand Up @@ -28,6 +29,7 @@ real robots are optional ([external setup](docs/setup_external.md)).
| Task | Start here |
|---|---|
| Writing or changing a strategy, tactic or skill | [docs/STRATEGY_DEVELOPMENT.md](docs/STRATEGY_DEVELOPMENT.md), [docs/strategies.md](docs/strategies.md) |
| Seeing what the robots did, and why | [docs/visual_guide.md](docs/visual_guide.md); `tools/triage.py RUN_DIR` for a run's worst problems |
| Judging whether a strategy is better | [docs/STRATEGY_DEVELOPMENT.md](docs/STRATEGY_DEVELOPMENT.md), [docs/signals.md](docs/signals.md), [docs/signal_report.md](docs/signal_report.md) |
| The referee | [docs/custom_referee.md](docs/custom_referee.md) |
| Motion planning | [docs/motion_planning_comparison.md](docs/motion_planning_comparison.md) |
Expand All @@ -50,7 +52,6 @@ Everything lives under `utama_core/`:
- `run/`: the main loop (`StrategyRunner`)
- `replay/`: replay files, the match-result cache and code fingerprints
- `analysis/`: offline analyses of tournament runs and replays (ball losses, chances, restarts, stalls)
- `scenario_bench/`: the scenario bench's starts, banks, harvester and scorer
- `rsoccer_simulator/`: the Python simulator environment over the rSim physics fork in `vendor/rSim/`
- `team_controller/`, `data_processing/`: vision, robot radio and referee input
- `dashboard/`: the browser dashboard
Expand All @@ -71,9 +72,12 @@ Scripts live in `tools/` (tournaments in `tools/evaluation/`) and `examples/`; s

## System design

![Dataflow Diagram](assets/images/pipeline_new.drawio.png)
One tick of `StrategyRunner`, from vision, robot and referee data to robot commands:

How vision, robot and referee data become one `Game` state: [docs/pipeline_method.md](docs/pipeline_method.md).
![One tick of StrategyRunner](docs/img/pipeline/one_tick.png)

The same tick as a diagram, with every module: [docs/architecture.md](docs/architecture.md). How
vision, robot and referee data become one `Game`: [docs/pipeline_method.md](docs/pipeline_method.md).

## Contributing

Expand All @@ -87,7 +91,3 @@ Work on a branch and open a pull request into `main`. A pull request needs:
5. an approval from an assigned reviewer.

Editor setup, pre-commit troubleshooting and the pixi environments: [docs/contributing.md](docs/contributing.md).

## Milestones

- 2024 November 20 - First goal in grSim (featuring ray casting)
Binary file removed assets/images/pipeline.drawio.png
Binary file not shown.
Binary file removed assets/images/pipeline_new.drawio.png
Binary file not shown.
2 changes: 2 additions & 0 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
# tests, so every machine runs the same code. Set before numba is imported; rsim worker
# processes inherit it.
os.environ.setdefault("NUMBA_CPU_NAME", "generic")
# Hide pygame's "Hello from the pygame community" banner from test output (tools set it too).
os.environ.setdefault("PYGAME_HIDE_SUPPORT_PROMPT", "1")


def pytest_addoption(parser):
Expand Down
5 changes: 4 additions & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ Every doc in this folder, by kind. New to the repo: the [README](../README.md) f

## How to

- [STRATEGY_DEVELOPMENT.md](STRATEGY_DEVELOPMENT.md): writing and evaluating strategies and tactics: the tactic-kernel model, referee restarts, lessons from past tactic bugs, round-robins, the scenario bench, observability tools. Read before any strategy-layer change.
- [STRATEGY_DEVELOPMENT.md](STRATEGY_DEVELOPMENT.md): writing and evaluating strategies and tactics: the tactic-kernel model, referee restarts, lessons from past tactic bugs, round-robins, observability tools. Read before any strategy-layer change.
- [custom_referee.md](custom_referee.md): the in-process `CustomReferee`: architecture, usage, profiles, and its known gaps.
- [custom_referee_gui.md](custom_referee_gui.md): the referee operator panel in the dashboard.
- [referee_integration.md](referee_integration.md): how referee commands reach robots (`RefereeOverride`) and what each command requires.
- [motion_planning_comparison.md](motion_planning_comparison.md): the motion-planning benchmark and how to read it.
- [motion_planning_results.md](motion_planning_results.md): its latest full run.
- [tools.md](tools.md): every script and pixi task, by purpose.
- [visual_guide.md](visual_guide.md): the game drawn on the pitch from real replays (how each strategy plays, one match over time, a restart, the motion planner), what each picture has shown us, and how to draw it.
- [setup_external.md](setup_external.md): grSim, the official GameController and AutoReferee, SSL Vision for real robots.
- [contributing.md](contributing.md): editor setup, commits, pull requests and releases.

Expand All @@ -20,6 +21,7 @@ Every doc in this folder, by kind. New to the repo: the [README](../README.md) f
- [scheduling_math_model.md](scheduling_math_model.md): a mathematical model of tactic scheduling and role allocation, a companion to the above.
- [custom_referee_design_decisions.md](custom_referee_design_decisions.md): rule-by-rule decisions from auditing `CustomReferee` against the SSL rulebook.
- [pipeline_method.md](pipeline_method.md): how vision, robot and referee data are refined into one `Game` state, and one tick from state to robot commands.
- [architecture.md](architecture.md): the one-tick diagram, and the generated package dependency graph with its import-rule check.

## Current results

Expand All @@ -31,6 +33,7 @@ Every doc in this folder, by kind. New to the repo: the [README](../README.md) f
## Open work

- [roadmap.md](roadmap.md): larger open workstreams, and one-line pointers to finished ones.
- [sim_realism.md](sim_realism.md): how far rsim is from real matches, the realism scorecard, and the plan to close the gap with measured, randomized physics.
- [testing_gaps.md](testing_gaps.md): kinds of testing gap that let bugs through, numbered (code cites them by number).
- [investigation_default_vs_lowblock_stalemate.md](investigation_default_vs_lowblock_stalemate.md): why `default` vs `low_block` stays 0-0; partly fixed.
- [investigation_ball_contact_orientation_divergence.md](investigation_ball_contact_orientation_divergence.md): a robot pinned against the ball rotates away from contact; localized, not fixed.
Loading
Loading