TRASHCAN-CV_
A two-wheeled bin that watches the room, fits a ballistic trajectory to anything thrown toward it, and drives to the landing point before the object gets there.
- Catch rate
- 84%
- n = 250 throws, nine people, indoor, mixed lighting
- Loop latency
- 41 ms
- frame capture to motor command, median of 1000 cycles
- Top speed
- 2.4 m/s
- loaded, on vinyl tile
- Build
- 31 d
- Brief → Unattended 100-throw run
- △4 · 04-19
- Reprinted the camera mast in PETG after two PLA masts crept in sunlight.
- △3 · 04-08
- Ballistic fit window 120 ms → 90 ms. Catch rate 79% → 84%.
- △2 · 03-29
- Moved the vision loop off the G4 onto the Orin. Steering wobble gone.
- △1 · 03-25
- Lid: servo flap → torsion spring with solenoid release. Commit point moved 200 ms later.
- Latency, p99
- 58 ms · same 1000 cycles
- Mass
- 9.60 kg · scale, n=1
- Parts
- 412
- Machined here
- 38
- Height
- 975 mm
- Wheelbase
- 340 mm
- Flight time
- 700 ms · 3 m throw, typical
- Impact error
- 80 mm · predicted vs actual at 3 m, RMS over 250 throws
What we were asked for.
We wanted a demonstrator that forced perception and motion to agree in real time, on a machine that fails visibly when it gets it wrong. A bin that catches thrown rubbish is unforgiving in a useful way: the object is in the air for about 700 ms, the answer has to be right the first time, and everyone in the room can see whether it worked.
The internal brief was one sentence and one number: catch a thrown object more often than not, from anywhere in a 4 × 4 m room, in under six weeks.
The targets, and what we actually hit.
| Constraint | Target | Achieved | How measured |
|---|---|---|---|
| Detect-to-command budget | < 50 ms | 41 ms | timestamped at capture and at CAN frame, median of 1000 |
| Arc needed for a usable fit | ≤ 100 ms | 90 ms | fit residual vs window length, swept offline |
| Traverse 1 m and settle | < 350 ms | 380 msMissed | encoder, settle band ±20 mm |
| Predicted impact error at 3 m | ± 120 mm | ± 80 mm | motion capture ground truth, n = 250 |
| Mass | < 12 kg | 9.6 kg | scale |
| Runtime | > 20 min continuous | 22 min | full-speed duty cycle to pack cutoff |
Targets were set at kickoff, before the first part was cut. A target we missed stays on the sheet with the number we actually got.
How it moves.
Two direct-drive hub motors, differential steering, and no casters — a caster at 2.4 m/s with a hard stop puts the whole mass into a shimmy we could not tune out. Instead the bin is a statically unstable two-wheeler held upright by the controller, which cost us a week of firmware and bought back 300 g and about 40 ms of settling time.
The lid is the part we got wrong twice. The first version was a servo-driven flap that had to be open before the object arrived, which meant committing to a catch 200 ms earlier than we wanted. The second used a torsion-spring lid released by a solenoid: 60 ms to fully open, no commitment until the last moment. That is the version in the drawing.
What it runs on.
One 4-layer board, 82 × 96 mm, carrying a dual field-oriented-control stage and the power tree. We split vision and control deliberately: an Orin Nano runs the detector, an STM32G4 closes the motion loop at 20 kHz, and they talk over CAN at 1 Mbit.
Putting the loop on the same processor as the model was tried and abandoned in week two — inference jitter was showing up as steering wobble.
| Subsystem | Specification |
|---|---|
| Board | 4-layer, 82 × 96 mm, 2 spins |
| MCU | STM32G474, 170 MHz |
| Motor drive | Dual FOC, 20 kHz, 24 V, 15 A peak |
| Compute | Jetson Orin Nano 8 GB |
| Link | CAN, 1 Mbit |
| Pack | 6S 3000 mAh, 22 min continuous |
| Bring-up to first spin | 4 days |
How it sees.
Two global-shutter mono cameras at 120 fps, 1440 × 1080, baseline 180 mm, hard-synced. Rolling shutter was never an option: at 8 m/s a rolling sensor smears the object across enough rows to move the centroid by more than our capture window.
Detection is a small single-class detector trained on 11,000 frames we collected ourselves over two days with a throwing rig, quantised to INT8 and running at 120 fps with 9 ms of headroom. It only has to find one thing: an object in flight. Everything else — trajectory, impact point, whether to commit — is a ballistic fit over the first 90 ms with drag ignored, which is wrong in principle and accurate to ±80 mm in the room we care about.
| Metric | Value | Method | Conditions | Sample |
|---|---|---|---|---|
| Detector throughput | 120 fps | INT8, on-device | Orin Nano, 1440×1080 mono, 9 ms headroom | |
| Detection recall, in flight | 0.97 | held-out set | even lighting | n = 1,400 frames |
| Detection recall, backlit | 0.81 | held-out set | object against a window | n = 380 frames |
| Commit decision time | 90 ms after release | ballistic fit over first 90 ms | drag ignored |
Where it fails
- Backlit throws against a window: the detector loses the object about one throw in eight.
- Objects with lift — paper plates, flat lids — break the ballistic assumption entirely. We do not attempt them.
- Throws with an arc under 1.2 m arrive before the 90 ms fit window closes.
- Two objects in the air at once: it commits to the first and ignores the second.
What it did.
250 recorded throws by nine people who were told to try to beat it. 210 caught. Of the 40 misses, 23 were the backlit-window case, 9 were objects with lift, and 8 were genuinely bad predictions.
It ran 100 throws unattended with three misses, which is the run we consider the deliverable. The traverse-and-settle target was missed by 30 ms and we left it missed — closing it means either more torque or less mass, and both were the wrong trade for a demonstrator.
Elapsed days between recorded milestones, drawn to scale from the dates. The overall dimension runs from the brief to the last entry.
What changed since.
| Rev | Date | Change | By |
|---|---|---|---|
| △4 | 2026-04-19 | Reprinted the camera mast in PETG after two PLA masts crept in sunlight. | RM |
| △3 | 2026-04-08 | Ballistic fit window 120 ms → 90 ms. Catch rate 79% → 84%. | RM |
| △2 | 2026-03-29 | Moved the vision loop off the G4 onto the Orin. Steering wobble gone. | DZ |
| △1 | 2026-03-25 | Lid: servo flap → torsion spring with solenoid release. Commit point moved 200 ms later. | DZ |
What we would do next
The backlit failure is a sensor problem, not a model problem. We would put an IR-pass filter and an 850 nm illuminator on it before touching the training set again.
The single-object limitation is a tracker we did not write. A simple IOU tracker with a two-object cap is about a day.
We would move the ballistic fit off the Orin entirely. The whole prediction is forty lines of math and it does not need a GPU.
Who built it, and when.
- Entry
- INTERNAL
- Status
- ● SHIPPED
- Brief
- 2026-03-02
- Demo
- 2026-04-02
- Elapsed
- 31 d
- Built by
- DZ, RM
- MEC
- Mechanical design
- FAB
- Fabrication and finishing
- ELE
- Electronics and PCB
- FRM
- Firmware
- CTL
- Controls and motion
- CV
- Perception and learned models