Thesis
The product is a trusted 20.0 m result
Not an AI gym camera. Not a Guinness stunt. Those are tactics. If a level-plus-shuttle is trusted, leaderboards, 50c official stamps, gym nights, friend challenges, and a world-record day all sit on top. If it is not trusted, none of that matters.
History
How the beep test became several tests
Luc Léger’s maximal 20 m shuttle is simple: run, turn, touch the line with the beep. The forks that followed changed the clock, the start speed, and what “the score” even is. Mixed laps and levels are not the same number.
What is actually judged
A legal shuttle is a timed one-foot line touch before the beep, not “a person-box arrived.” Turning short of the line is a named error. The folk stop rule is two consecutive misses (sometimes “not within 3 m”). Léger 1988 itself only says stop when the subject can no longer follow the pace. KIT’s administration uses a foot-on-line standard and a three-successive-miss variant. So “official” is a choice we have to publish — the literature will not hand us one wording.
| Version | Stage | Start / increment | What is scored |
|---|---|---|---|
| 1982 Léger & Lambert | 2 min | 8.0 km/h, +0.5 / 2 min | Two-minute stage |
| 1988 Léger | 1 min | 8.5 km/h, +0.5 / min | Last announced stage → speed → VO2 |
| Eurofit / PACER-style | 1 min | 8.0 then 9.0, then +0.5 | Last completed lap |
| QUB | 1 min | 8.0 km/h, +0.5 / min | Protocol-specific |
Léger speed at stage is often written X = 8 + 0.5 × stage, then VO2max Y = 31.025 + 3.238X − 3.248A + 0.1536AX with adult age A fixed at 18. Use it as a derived field, not the public score. The public score is level + shuttle.
Decisions
What we would lock before writing code
These are the calls in the notes after sitting with the conversation dump. They are product law until we replace them in writing.
- Protocol = 1988 Léger. Start 8.5 km/h, one-minute stages, +0.5 km/h. Score last completed level + shuttle. Convert anything else to last-stage speed before comparing.
- Fail rule = two consecutive misses, foot on the line. Publish it. Do not silently mix PACER’s two-total-misses wording.
- Distance is tape-certified. AR may walk and draw the court. A steel tape (or laser disto) makes the metre official. GPS never does.
- Audio is ours. The recording device plays the beep track. YouTube + a Bluetooth speaker is not a result.
- Identity is claimed before the test (name, lane, bib). No stranger re-ID mid-shuttle in v1.
- Judging is a reviewable assist. Line-crossing timestamps + human confirm + failure clip. Automatic DQ is a later privilege we have not earned.
- 50c is a stamp, not the business. It marks “this one counts.” Club nights and season packs are where money might live.
- Web first, one room, 6–12 people. Native is for camera control and background audio once the ritual is boring in a good way.
- We are a sanctioning body with an app attached. An API to existing beep apps comes after we own the evidence standard, not instead of it.
- Guinness is a campaign, not Phase 3. A 24-hour global day is the right shape of stunt, and only after 100 rooms run without us in them.
- Say the data out loud. Percentile vs self, then vs age/sex/region. No Tesla-shadow story.
Concepts
Walk the court, then leave the phone to watch
The strongest phone application is not “point YOLO at a gym.” It is a two-act ritual: map a true 20.0 m while the device is moving, then park it so both lines stay in frame.
1. Map
ARKit / ARCore tracks the phone with visual-inertial odometry. Hit-test the floor, create an ARAnchor at line A, walk, anchor line B. Snapshot an ARWorldMap once mapping status is mapped.
2. Certify
Lay a steel tape (or fire a laser disto) between the same marks. The official length is the tape. AR is how the camera understands where those marks are in its image.
3. Watch
Place the phone so both lines stay in view. Play the app beep. Claim each runner. Record geometry, an audio hash, and a clip of every miss.
What pose models can see, and what they cannot officiate
Competence · design fit
How you know it is 20.0 m
A 2% error on this court is 40 cm — enough to turn a legal touch into a miss, or the reverse. The method that draws the pretty overlay is not automatically the method that certifies the metre.
| Method | Error on a 20 m course | Indoor | Bare gym floor | Official metre | Design fit |
|---|---|---|---|---|---|
| Phone GPS (L1) | 3–15 m outdoors; often no lock indoors | No | No | Fail | ●○○○○ None. Error is a large fraction of the court. |
| Dual-frequency GNSS (L1/L5) | ~1–5 m outdoors; still indoor-blind | No | No | Fail | ●○○○○ Better hike GPS. Still not a shuttle court. |
| ARKit VIO walk (Measure-style) | Often ~1–5% (20–100 cm); drift on the order of cm/s in lab VIO work. Apple publishes no accuracy spec. | If textured | Poor | Assist only | ●●●○○ Best setup UX. Not the official metre. Shiny wood is a worst case. |
| ARCore VIO walk | Same order as ARKit. Keep virtual objects within ~8 m of their anchor — so a 20 m court needs two end anchors, not one. | If textured | Poor | Assist only | ●●●○○ Android parity for the walk. Same honesty problem. |
| LiDAR / depth, phone parked | Most accurate roughly 0.5–5 m. A still phone cannot “see” a trusted 20.0 m with depth. | Partial | Partial | Fail | ●●○○○ Floor plane and near-line geometry. Not course length. |
| ARKit/ARCore walk + steel tape | Tape ± ~5 mm–2 cm. AR only has to stay registered to those two marks. | Yes | Yes | Pass | ●●●●● Preferred official path. AR draws; tape certifies. |
| Steel tape only | Class II tape is millimetres over 20 m. | Yes | Yes | Pass | ●●●●○ Perfect metre, no camera model. Fine for a human-judged night. |
| Two phones on taped lines | Tape owns distance. New risk is clock sync, not metres. | Yes | Yes | Pass | ●●●●● Best line-call geometry. Each camera is close to a foot. |
| Laser disto / survey wheel | Disto typically ±1–3 mm; wheel about 0.1% if used well. | Yes | Yes | Pass | ●●●●○ Faster certify step than a floppy 20 m tape. Still not a product. |
ARKit drift figure from published VIO comparisons (e.g. Kim et al., relative pose error on the order of 0.02 m/s). Scale error in the wild is commonly single-digit percent and worse on feature-poor floors. Treat every AR-only centimetre as untrusted until a tape or disto agrees.
Implementation
Four paths that can merge
Do not start four companies. Start the smallest night that produces a number. The other paths are how that night grows, or how it dies cheaply.
Web ritual kit
Browser camera + built-in speaker + a setup wizard. Measure with tape, type 20.0, place one wide phone, claim 6–12 runners, human-confirm misses, 50c stamp. Learn whether anyone cares before ARKit.
Walk · map · park
ARKit world tracking, plane hit-tests, two ARAnchors, ARWorldMap snapshot, then a parked session that keeps both lines in view. Android follows with ARCore if A and B feel like a sport.
One phone per line
Far-line pixels-per-centimetre is the silent killer of a single wide camera. Two phones sitting on taped lines see feet. They must share one audio clock.
Publish, then ingest
Once the evidence standard exists — audio hash, geometry, identity, failure clip — other beep apps may submit. That is the Strava move, inverted: we are the sanction, they are clients.
Suggested sequence
- Phase 0 — 10 official tests from people you can text. Charge the 50c.
- Phase 1 — one recurring room. Friend-challenge only after they come back unprompted.
- Phase 2 — one vertical (club preseason, PT studio, school sport). Not “gyms” as a category.
- Phase 3 — publish the protocol, then an API.
- Phase 4 — a 24-hour global beep day. Guinness only if a category exists without eating a year.
Failure modes
Problems, and which path they actually hurt
A 90% automatic judge will be treated as 0% official. Most of these are design problems, not model-zoo problems.
| Problem | Why it matters | A Web | B ARKit | C Dual cam | Mitigation |
|---|---|---|---|---|---|
| Course is not 20.0 m | Every later number is fan fiction. | High | High | Med | Tape or disto lock. Never GPS. AR walk is UX only. |
| Feature-poor gym floor | VIO loses scale and anchors on shiny wood / rubber. | Low | High | Low | Add cones, bibs, tape crosses. Do not trust a parked AR session in the dark. |
| Far-line resolution | Ultrawide warp + few px/cm at 20 m. Cannot see a toe. | High | High | Low | Path C, or human confirm of the far miss. |
| COCO-17 has no toe | Ankle ≠ line touch. Box-bottom midpoint is not a foot. | Med | Med | Med | BlazePose-class toes for assist only. Human on the call. |
| Two-miss rule disagreement | Léger / PACER / KIT do not say the same thing. | Med | Med | Med | Publish 1988 + two consecutive + foot-on-line. |
| Audio latency | BT speaker + YouTube is a different test. | High | Med | High | Device speaker. Hash the track. Log beep-to-frame time. |
| Phone-to-phone clock | Dual cameras without one clock invent misses. | n/a | n/a | High | One audio master. Others slave to the beep, not NTP hopes. |
| Occlusion / ID swap | Overlapping kids in the same kit exchange identities. | High | High | Med | Lanes + bibs claimed before the start. One athlete in v0 is allowed. |
| Late-stage frame rate | Contact timing at ≥14 km/h may want ~100 fps. | Med | Med | Med | Do not claim millisecond DQ from 30 fps video. |
| Parked-phone tracking loss | ARKit/ARCore do not promise a still official camera once a body fills the frame. | n/a | High | Low | Freeze the line pixels after certify. Treat live AR pose as advisory. |
| Cheating & generous mates | 18 m courts, early starts, kind line calls. | High | Med | Med | Evidence pack on every official stamp. Assume bad faith on the public board. |
| No adult percentile table | Tomkinson/Zhang are youth. Ramsbottom is a VO2 look-up. | Med | Med | Med | Ship vs-self first. Build the adult table from our own official tests. |
| Protocol soup | Ingesting other apps without conversion poisons the board. | Low | Low | Low | Path D only after the spec. Convert to last-stage speed. |
Documentation
ARKit (and the ARCore twins)
Path B is an Apple world-tracking app: move to measure, anchor both ends, snapshot the map, then try to keep those anchors while the device is still. Read these first, in this order.
ARKit · Apple
ARKit frameworkTop of the tree. Session, configuration, anchors, frames. Understanding world trackingVisual-inertial odometry. Why the phone must move to get metric scale. ARWorldTrackingConfigurationThe session type for a 20 m walk. ARAnchorLock line A and line B in world space. You want two. ARWorldMapSnapshot after mapping status is mapped / extending. Saving and loading world dataRelocalize so the saved end-line anchors return. Tracking and visualizing planesHit-test the gym floor, not empty air. ARRaycastQueryCast a ray onto the gym floor to place an end-line. ARHitTestResultOlder hit-test result type; still the mental model for “where is the floor.” RealityKit scene understandingPlane and mesh path if the app is RealityKit-first. Visualizing a reconstructed sceneLiDAR mesh — useful near a line, not a 20 m tape replacement.ARCore · Android parity
ARCore fundamentalsMotion tracking, environmental understanding, light. Hit-testsPose in metres on a real surface. This is the walk. Working with anchorsKeep objects near their anchor. 20 m ⇒ two anchors. PoseTranslations are metres. Raw world coords are per-frame. Cloud AnchorsOnly interesting if two devices must share the same court map. Depth APIBest ~0.5–5 m. Do not use a parked depth read as 20.0 m.Protocol and comparison sources
- Léger & Lambert 1982 — first 20 m multistage paper.
- Léger 1988 — one-minute protocol.
- Ramsbottom et al. — level / shuttle VO2 look-up.
- Mayorga-Vega 2015 meta-analysis — criterion validity; miss-rule fog.
- Tomkinson 2017 — youth norms, 50 countries.
- Zhang 2020 — Chinese youth percentiles; reprints international last-stage speeds.
- KIT 20 m shuttle administration — foot-on-line, turning short is an error.
- YOLO-Pose — person + 17 keypoints to the ankles.
- Young et al. — smartphone gait vs Vicon; fps warning at speed.