Robolyst Robolyst
← All scouting metrics

OPR

Offensive Power Rating estimates how many points a team adds to whatever alliance they are on. It is the oldest number in FIRST scouting and still the most useful one, because it solves a problem a scouting sheet can't: in FTC you never see a team play alone, so you never directly observe what any single robot contributed.

The problem it solves

An FTC qualification match gives you one number per alliance: the score. That score is the combined work of two robots. Watch one match and you cannot say which of them earned it. Watch ten, though, and each team has appeared alongside a different mix of partners. The scores overlap, and the overlaps are what let you pull the contributions apart.

OPR is the answer to: what single number for each team, added up per alliance, would come closest to reproducing every score at this event?

How it is computed

Each alliance in each qualification match becomes one equation. If teams 1234 and 5678 played together and scored 148, that is:

x₁₂₃₄ + x₅₆₇₈ = 148

Stack every alliance-match at the event and you get a tall system: one row per alliance appearance, one column per team, a 1 wherever a team was on that alliance and a 0 everywhere else. There are far more rows than columns and no exact solution — teams don't play the same every match — so it is solved by least squares, picking the ratings that minimise the total squared error across all of them.

Robolyst solves the normal equations with a small ridge term (λ = 1e-6) added to the diagonal. That term does nothing to a healthy event and keeps the solve stable at a tiny one, where two teams may have played every single match together and are mathematically inseparable.

Only qualification matches are used. Playoff alliances are chosen, not assigned, which destroys the independence the fit depends on — the best team is on the best alliance by construction. Alliances with no teams recorded are dropped rather than fed in as a zero row, which is what made remote-format seasons produce nonsense OPRs elsewhere.

Penalties

An alliance's final score includes penalty points its opponent gave away. Fit against the raw final and a team gets credit for fouls they had nothing to do with. Clean OPR is the same solve run against the final minus the opponent's committed fouls, and it is the number to use when comparing teams across events with different officiating.

One detail trips up nearly everyone reading FIRST's API: the foul field on an alliance is the penalty points that alliance committed, and those points are awarded to the other side. So to clean an alliance's score you subtract the opponent's foul value, not its own.

What OPR cannot tell you

  • Defense. A robot that stops 40 points of opponent scoring shows up nowhere in an offensive fit. That is what CCWM is for.
  • Consistency. Two teams averaging 60 are the same to OPR whether one scores 60 every match or alternates 20 and 100. See consistency and reliability.
  • Anything across events. OPR is fit inside one event and is only meaningful relative to the teams there. A 90 at a stacked regional is a different robot from a 90 at a six-team scrimmage.
  • Small samples. Under a full qualification schedule the fit is under-determined and the numbers move a lot on one match. Robolyst's season leaderboards drop teams below six counted matches for this reason.

What to use instead, when you can

When FIRST publishes per-section score details for a season, OPRc is strictly better: it is penalty-free by construction, can never credit a team with negative scoring, and breaks a team's output down by phase of the match. OPR remains the fallback for older seasons and the common denominator across all of them.

Every event page's Rankings tab shows both, alongside the schedule-adjusted and luck columns that say how much of a team's number came from the draw.