How we measure, and what happens when we miss.
The site is generated from a project record, and the field that holds a measurement cannot be empty. There is no way to write “TBD”, no fallback string and no default value — a measurement we did not take simply has no cell, and the row is shorter. That is not editorial discipline, it is a build error, which is the only kind of discipline that survives a deadline.
Targets are written down at kickoff, before anyone knows whether they are reachable, and printed afterwards beside what we actually achieved. Missed rows stay on the sheet with the delta. On BDR-26-04 that is 1/6, and we left it there, because closing the gap meant more torque or less mass and both were the wrong trade for a demonstrator.
- Target
- < 350 ms
- Measured
- 380 ms · Δ +30 ms
- Caught on
- encoder, settle band ±20 mm
We do not have a publication record. What we have instead is printed below: the instruments, the rigs and their uncertainties, the code and data we have put in public, and everything we have written down.
| MACHINE | WORKING VOLUME | HELD TOLERANCE |
|---|---|---|
| Vertical mill, 3-axis with 4th-axis rotary | 460 × 250 × 400 mm | ± 0.05 mm |
| Abrasive water jet | 1200 × 1200 mm | ± 0.10 mm |
| Toolroom lathe | 300 mm swing, 700 mm centres | ± 0.02 mm |
| SLA printer | 145 × 145 × 185 mm | ± 0.15 mm |
| FDM printers, two | 256 × 256 × 256 mm | ± 0.30 mm |
In-house since 2025–2026. The tolerance column is what we hold in production on 6061 and Delrin, checked on a granite plate against a dial indicator — not the machine’s stated repeatability, which is better and less useful.
| RIG | MEASURES | UNCERTAINTY |
|---|---|---|
| Throwing rig, built here | Release velocity and angle, repeatably, without a person in the loopUsed on BDR-26-04 | ± 0.15 m/sRange 2 – 9 m/s |
| Motion-capture volume, borrowed | Ground-truth position of a thrown object against the predicted impact pointUsed on BDR-26-04 | ± 1.5 mmRange 4 × 4 × 2.5 m |
| Motor dynamometer, built here | Torque, speed and electrical input power on a drive under loadUsed on BDR-26-04 | ± 2 %Range 1.5 kW, 6000 rpm |
| Go/no-go gauge set, cut here | Crease and edge position against a machined datum faceUsed on BDR-26-03 | ± 0.05 mmRange 0 – 40 mm |
| Granite plate and dial indicator | Flatness, travel and switch actuation depthUsed on BDR-26-02, BDR-26-03 | ± 0.002 mmRange 0 – 12.7 mm |
| Bench scale | Assembled mass, weighed once, at handoverUsed on BDR-26-04, BDR-26-02 | ± 2 gRange 0 – 15 kg |
| Logic analyzer on a toggled pin | Control loop period and interrupt jitter, on the running machineUsed on BDR-26-04, BDR-26-02 | ± 2 nsRange 500 MSa/s |
| Oscilloscope with current probe | Phase current, switching behaviour and shunt calibrationUsed on BDR-26-04 | ± 3 %Range 200 MHz, 30 A |
Where a rig was built here, the uncertainty is what we measured against a reference we trust more. Where it was bought, it is the manufacturer’s and we say so. The uncertainty column is the figure we use when we decide whether a target was hit, so it is the one to attack first.
Every number on this site had to be taken by someone
A rate carries its sample size in the same breath as its value. The catch-rate cell on BDR-26-04 reads 84% and immediately below it, in the same strip, n = 250 throws, nine people, indoor, mixed lighting. A percentage with no denominator is a marketing figure and the build rejects it.
Every constraint row also carries how it was measured — the instrument, the reference, the number of samples. That column is the methods section, and it is the reason the numbers on this site are worth arguing with. A figure you cannot argue with is a figure nobody has to believe.
Changes are dated and attributed. When a number moves, the old value and the new one both appear in the revision log with the initials of whoever moved it, so a reader who saw a sheet last month can see exactly what happened to it since. We do not quietly edit a result.
Open repositories and datasets
| REPOSITORY OR DATASET | WHAT IT IS | LICENCE |
|---|---|---|
| bdrlab/ballistic-fit | The trajectory fit and impact predictor from the catching bin, with the test vectors it was validated against and the residual sweep that set the fit window. | MIT |
| bdrlab/throw-set | Every labelled frame we collected for the detector: two hard-synced global-shutter cameras, mixed indoor lighting, including the backlit subset our own model fails on. | CC BY 4.0 |
| bdrlab/foc-g4 | The field-oriented current loop for the STM32G4, with the dynamometer traces it was tuned against and the identification scripts. | MIT |
| bdrlab/crease-gauge | Go/no-go gauge geometry and the inspection procedure from the folding cell, released with the client’s written agreement. | CC BY-SA 4.0 |
| bdrlab/sheet | The record schema and typesetting this site runs on, including the assertion that makes an unmeasured number impossible to publish. | MIT |
Each of these can be cloned and run by someone who has never spoken to us, which is most of what a citation is for. The dataset includes the subset our own detector fails on; releasing only the easy frames would make the number in the register unreproducible.
Writing and talks
| DATE | TITLE | VENUE |
|---|---|---|
| 2026-04-22 | The ballistic fit is forty lines of math and it does not need a GPU | SELF-PUBLISHED |
| 2026-03-30 | Backlit throws: a sensor problem we spent two weeks trying to fix with a model | SELF-PUBLISHED — negative result |
| 2026-02-18 | Six identical stations beat one clever head | Hardware meetup, Toronto |
| 2026-01-27 | What a hard stop buys you and what it costs at changeover | SELF-PUBLISHED — negative result |
| 2025-12-09 | Fitting a keyboard to one hand: three key-well revisions in seventeen days | SELF-PUBLISHED |
Newest first. Notes, talks and results that went the wrong way, in one list.
The things that did not work
The failure modes printed on each sheet are the short version — the conditions under which a machine we shipped stops working, written while it was still fresh. The long version is in the notes: approaches we spent real weeks on and abandoned, a filter that looked right on the bench and was wrong in a room with a window, and the mechanisms we handed over with a known fault and a written explanation of why we chose to leave it in.
A lab that only publishes the things that worked is a lab whose numbers you cannot use.