First Order Robotics' software stack for RoboCup SSL (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 strategy layer that decides what every robot does.
-
Install pixi (
curl -fsSL https://pixi.sh/install.sh | sh) and open a new terminal. -
pixi installin the repository root, thenpixi run precommit-installso every commit is linted. -
pixi run testruns the test suite (add--headlesswhen calling pytest directly). -
Play one headless match between two strategies and save its replay:
pixi run python tools/evaluation/round_robin.py --pair tiki_taka low_block -
pixi run python dashboard_server.pyand open http://localhost:8080 to watch replays and browse tournament results.
Everything runs in rsim with the in-process referee; grSim, the official GameController and real robots are optional (external setup).
| Task | Start here |
|---|---|
| Writing or changing a strategy, tactic or skill | docs/STRATEGY_DEVELOPMENT.md, docs/strategies.md |
| Seeing what the robots did, and why | 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/signals.md, docs/signal_report.md |
| The referee | docs/custom_referee.md |
| Motion planning | docs/motion_planning_comparison.md |
| The simulator | vendor/rSim/FORK_NOTES.md |
| Real robots, vision, radio | utama_core/team_controller/README.md, docs/setup_external.md |
| Which script does what | docs/tools.md |
| Everything else | docs/README.md, the index of every doc |
Coding agents: read AGENTS.md first (CLAUDE.md is a symlink to it).
Everything lives under utama_core/:
strategy/: the strategies (one module perbuild_*_kernel_strategyfactory, re-exported bykernel_strategy.py)tactics/,skills/,shared/: reusable tactics, per-robot skills, and geometry they shareengine/: the tactic-kernel infrastructure (Strategy,Tactic,TickContext,MatchLog, referee overrides)custom_referee/: the in-process referee (rules, state machine, restart positioning, profiles)motion_planning/: path planning and motion controlrun/: the main loop (StrategyRunner)replay/: replay files, the match-result cache and code fingerprintsanalysis/: offline analyses of tournament runs and replays (ball losses, chances, restarts, stalls)rsoccer_simulator/: the Python simulator environment over the rSim physics fork invendor/rSim/team_controller/,data_processing/: vision, robot radio and referee inputdashboard/: the browser dashboardentities/,config/,global_utils/: data classes, settings and constants, utilitiestests/: all tests
Scripts live in tools/ (tournaments in tools/evaluation/) and examples/; see
docs/tools.md.
- Distances in metres, velocities in metres per second.
- Angles in radians, normalised to [-pi, pi]; heading 0 faces the positive x-axis (left to right).
- The centre of the field is (0, 0). Unless stated otherwise, blue defends the left and yellow the right.
One tick of StrategyRunner, from vision, robot and referee data to robot commands:
The same tick as a diagram, with every module: docs/architecture.md. How
vision, robot and referee data become one Game: docs/pipeline_method.md.
Work on a branch and open a pull request into main. A pull request needs:
- a
release:major,release:minororrelease:patchlabel: every merge tomainreleases a new version automatically; - passing CI (tests and lint;
pixi run testandpixi run lintlocally); - to be up to date with
main; - every Copilot comment reviewed (not necessarily accepted);
- an approval from an assigned reviewer.
Editor setup, pre-commit troubleshooting and the pixi environments: docs/contributing.md.

