From 97b7fc837c2ff3dd27f58e328ea27d91c9c7c5fb Mon Sep 17 00:00:00 2001 From: DeeJanuz <45082401+DeeJanuz@users.noreply.github.com> Date: Fri, 2 Oct 2026 21:30:50 -0600 Subject: [PATCH] Hands: shorter recording sessions with pose sweeps The second real session took 16 minutes, half of it 36 still poses. Labels come from the auto-labeller, so what matters is variety, not clean holds. A sweep step shows a strip of pose pictures and lights one every 4 s while the hands move slowly near and far; each cue is a prompt event with "cue": true. The core session is now 15 steps, about 5 minutes recorded. The pose groups, the one-hand sweeps' groups and the cue order are shuffled per session, seeded from its id and saved in session.json. A quick round (--quick, or the checklist's choice) is about 2 minutes for extra lighting. Touch the dot has 6 dots, the push sections two heights. Co-Authored-By: Claude Opus 5.5 --- hands/rec/DESIGN.md | 61 ++++++--- hands/rec/ft_handrec.py | 29 +++-- hands/rec/main.qml | 69 +++++++++- hands/rec/panel/ft-handpanel.cpp | 95 +++++++++++++- hands/rec/rehearse.sh | 13 +- hands/rec/script.json | 148 +++++++--------------- hands/rec/session.py | 210 +++++++++++++++++++++++++++---- hands/rec/tests/test_session.py | 176 ++++++++++++++++++++++++++ 8 files changed, 631 insertions(+), 170 deletions(-) diff --git a/hands/rec/DESIGN.md b/hands/rec/DESIGN.md index a37b65a..63a317e 100644 --- a/hands/rec/DESIGN.md +++ b/hands/rec/DESIGN.md @@ -78,13 +78,14 @@ No name, email, or account. The contributor id is random, so several sessions fr "checklist": {"objects": ["pencil", "phone", "cup", "keyboard", "mouse", "gamepad", "small"], "own_objects": ["..."], "controllers": "straps|none", "sleeves": "short|long|", "rings": false, "watch": false, "notes": ""}, "device": {"steamos": "", "steamvr": "", "cameras": [{"name", "width", "height"}]}, - "mode": "step|auto", "takes": ["01-hand-size", "..."], + "mode": "step|auto", "quick": false, "shuffle": {"seed": 123, "sweeps": {"pose-sweeps": [{"id", "hands", "cues"}]}}, + "takes": ["01-hand-size", "..."], "camera": {"status": "ok|unknown|degraded", "reason": "..."}, "stop_reason": "..."} ``` `camera` is the camera check's verdict at the start (no paths or log lines: those go to `session.log`). `stop_reason` is there when a session was stopped at the no-hands screen, with the check's result. -A session started before step mode existed has no `mode`: it ran as `auto`. +A session started before step mode existed has no `mode`: it ran as `auto`. `quick` and `shuffle` (below, "Sweeps" and "Quick round") are missing from sessions before the sweeps. ### calibration.json @@ -132,7 +133,7 @@ prompt the hold: its labels start here wait the hold is over: no labels from here; part N stops ``` -The touch-the-dot targets after the first follow straight on: no `ready` or `wait` between them. `redo` marks a try done again (R): `from` is that step's `ready` (or its `prompt` if it had none), `to` its end. Its prompt is skipped; the sets stay. In auto mode there's no `ready` or `wait`, and the intro is a recorded prompt `
/intro`. `nohands` marks the first hand-size step stopped because no hand was seen (below, "Camera check"); a `redo` over the same range follows it, so the try gets no labels. Readers that knew only `prompt` and `end` keep working, but they'd give the countdown to the step before: `hub_review.py` (frame-hands `train/hub`) shows it as "(countdown)" and redone prompts as "(redone)"; `FORMAT.md` in the dataset repo has the rules. +The touch-the-dot targets after the first follow straight on: no `ready` or `wait` between them. `redo` marks a try done again (R): `from` is that step's `ready` (or its `prompt` if it had none), `to` its end. Its prompt is skipped; the sets stay. In auto mode there's no `ready` or `wait`, and the intro is a recorded prompt `
/intro`. `nohands` marks the first hand-size step stopped because no hand was seen (below, "Camera check"); a `redo` over the same range follows it, so the try gets no labels. A sweep step (below, "Sweeps") has a `prompt` per cue, each with its `pose`, `"cue": true` and `"step"`, the step's id; its `ready`, `wait` and `redo` carry the step's id. Readers that knew only `prompt` and `end` keep working, but they'd give the countdown to the step before: `hub_review.py` (frame-hands `train/hub`) shows it as "(countdown)", redone prompts as "(redone)" and cues as "[pose] text"; `FORMAT.md` in the dataset repo has the rules. ### poses.jsonl @@ -171,6 +172,7 @@ Commands (UTF-8; `|` starts a new line in text): | `big ` | Large cyan text under the instruction: the countdown (empty clears it). | | `keys ` | The faint key hints along the bottom. | | `rec on` / `rec off` | The red "Rec" by the step line. | +| `strip \|\|