Commit Graph
4 Commits
Author SHA1 Message Date
DeeJanuzandClaude Opus 5.5 d3ec6877ae hands: skeleton keeps a tracked hand's side while the model's call hovers; README
A hand whose running left/right call wandered across 0.5 got mirrored
mid-track: the palm normal turned over (the PR #3 gestures take's 90th
percentile change per update, fingers moving, 94 -> 32 degrees). Now it
keeps its side while the call is within 0.25 of 0.5.

hands/README.md: the Skeleton section, with what replays measured, the
new settings and ft-handreplay options.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:17:13 -06:00
DeeJanuzandClaude Opus 5.5 6accce9769 hands: skeleton chains also start from last frame's pose
Each chain runs Gauss-Newton from the measured bone directions and from
last frame's angles, and keeps the better fit, so it hops less between
two poses that fit about as well: tip jitter tails 2-6% lower in the lit
and dim recordings, for 25 -> 42 us median per hand on a big core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 13:09:54 -06:00
DeeJanuzandClaude Opus 5.5 f9408a6612 hands: skeleton side hysteresis, glitch-aware filter, finger twist
- Fingers get a small twist at the knuckle (±25°): without it the fitted
  index tip sat a median 8 mm across the finger from the measured one in
  the PR #3 gestures take, and 11 mm from the labels against 7.7 mm.
- The other side wins only after 3 frames in a row of fitting far
  better, and then sticks while the hand is tracked (110 flips in the dim
  recording before, 6 after): each switch reset the filter.
- A chain fitting its landmarks worse than 15 mm moves the filter (and
  its speed) less: those frames are mostly a hidden landmark misplaced.
- Calibration skips phalanges far off the average hand's proportions and
  drifts at most 0.02 mm a sample after settling.
- ft-handreplay: the fit timed alone on a little and a big core, the
  palm normal's steadiness, rest meaning the fingers still too, and
  --skeleton-dump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:55:27 -06:00
DeeJanuzandClaude Opus 5.5 e9cb33389d hands: per-user skeleton fit, fh_hands version 2
ft-hands fits a skeleton to each hand's 21 landmarks after the 3D step
(track/skeleton.{h,cpp}):

- Bone lengths and palm shape are learned per side from clean stereo
  frames (medians, then a slow running median), with the model's average
  hand times Hand::scale, or the other side, as the prior.
- Each frame: the palm as a rigid body, then each finger and the thumb as
  a chain with joint limits (Gauss-Newton), the chain bases allowed a few
  mm off the rigid palm. Landmarks are weighted by their triangulation
  residual and down-weighted along the line of sight.
- The pose (palm centre, palm rotation, joint angles) is filtered, not the
  points; each finger's cutoff follows its own speed.
- An elbow from the arm model in frame-hands' notes/forearm.md.

The hands file goes to version 2: version 1's struct is unchanged and an
fh_hand_fit_t per hand follows it (joints as position + quaternion,
bone lengths, angles, elbow, pinch point, fit quality, head-frame
velocities). Version 1's points and capsules come from the skeleton
(HANDS_SKELETON=0 or --skeleton 0 for the old ones). The hand
recorder's reader accepts version 2.

ft-handreplay reports the fit (track/skeval.h): time, residual,
calibration, bone-length spread, jitter, tip lag, elbow, and with
--labels the distance to frame-hands' auto-labels. SetReader reads a
hand-recorder take's later parts (sets-2.bin, ...).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:33:11 -06:00