Commit Graph
1 Commits
Author SHA1 Message Date
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