feat(deck-pose): markerless pose-input daemon (phase 1 spike) #906
Closed
lytedev
wants to merge 4 commits from
deck-pose into main
pull from: deck-pose
merge into: lytedev:main
lytedev:main
lytedev:propose/module-directory-scanner
lytedev:propose/special-args-cleanup
lytedev:propose/limine-fallback
lytedev:propose/household-kiosk
lytedev:propose/xwayland-ei-display-from-client
lytedev:propose/steamdeck-mouse-steps-aside-for-games
lytedev:propose/assistant-watch
lytedev:propose/lpcamm-watch
lytedev:propose/agents-where-information-lives
lytedev:propose/tuwunel-1.9.2
lytedev:propose/pin-flake-registry
lytedev:propose/headscale-0-29-3
lytedev:propose/canary-freshness-per-repo
lytedev:propose/boot-guard-efivars-fix
lytedev:propose/deck-dock-panel-under-niri
lytedev:propose/admindevice-ssh-anything
lytedev:propose/kdeconnect-announce
lytedev:steamdeck-mgba
lytedev:propose/doorbell-no-internet
lytedev:propose/ha-list-tasks
lytedev:propose/ha-music-not-found
lytedev:propose/bc250-40cu-measured
lytedev:propose/multiboot-foxtrot-dragon
lytedev:propose/pitft-stmpe-drive
lytedev:propose/foxtrot-multiboot-prep
lytedev:propose/pitft-no-smartd
lytedev:propose/kexec-luks-reboot
lytedev:propose/foxtrot-multiboot
lytedev:propose/model-eval
lytedev:propose/foxtrot-vm-seats
lytedev:iamb-sender
lytedev:propose/calendar-alarms
lytedev:pinephone-niri
lytedev:push-tsntxvxynzps
lytedev:propose/spoof-reject-cleanups
lytedev:propose/finance-pipeline
lytedev:steamframe-plan
lytedev:pinephone-buildable
lytedev:deck-pose-wip
lytedev:aerc-open-html
lytedev:local-auth-unification
lytedev:iamb-dotfiles
lytedev:esphome-music-panel
lytedev:wifi-system-profile
lytedev:gauge-history
lytedev:validate-gate-fix2
lytedev:validate-slot-no-hugepages
lytedev:pinephone-reenable
lytedev:cyberdeck-research
lytedev:git-anon-ratelimit
lytedev:headscale-basedomain
lytedev:ssd-fast-tier
lytedev:hold-impermanence-flip
lytedev:gate-dummy-eval
lytedev:zen-browser
lytedev:initrd-remote-unlock
lytedev:beefcake-rpool-backup
lytedev:sec-sso-plan
lytedev:sec-mail
lytedev:flab-lid-wake
lytedev:hearth-k8s
lytedev:zulip
lytedev:router-guest-vlan
lytedev:headscale-extra-records
lytedev:beefcake-advertise-lan
lytedev:push-qrvuuqmxtznv
lytedev:voxtype-per-host-model
lytedev:cleanup
lytedev:push-kanidm-opt-in
lytedev:push-voxtype-flake-fix
lytedev:push-uvqqknxvqlvy
lytedev:push-qrqsxkmlrevert
lytedev:fix-kanidm-uid-attr-map
lytedev:nix-on-droid
lytedev:self-hosted-dns
lytedev:fix-runner-tmpfs-revert
lytedev:beefcake-email
lytedev:beefcake-immich
lytedev:firefox-nightly-devedition
lytedev:fix-bun-baseline
lytedev:flab-stuff
lytedev:printer-sftp
lytedev:dragon-vr-monado
lytedev:clever-vr-game-clamshell-mode-detection
lytedev:wireguard-mesh
lytedev:rescue-beefcake-unpushed-nix
No reviewers
Labels
No labels
bug
enhancement
question
scary
upstream
Milestone
Clear milestone
No items
No milestone
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set
Reference
lytedev/nix!906
Loading…
Reference in a new issue
No description provided.
Delete branch "deck-pose"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Phase 1 of a markerless full-body pose-input system for the
steamdeckhost — camera-only body tracking as a game input platform, modelled on the Nex Playground.This is the latency spike only. No gesture layer, no socket API, no games; those are phase 2 and are only worth building if these numbers hold. Full plan and open questions:
issues/open/deck-pose.md. Runbook, budget and rationale:lib/doc/deck-pose.md.Nothing is deployed and nothing is enabled. The steamdeck host sets
lyte.deck-pose.enable = false.What is here
v4l2 capture → MJPEG/YUYV/GREY decode → MoveNet MultiPose Lightning → IoU tracking → One Euro smoothing → debug overlay with a live per-stage latency readout. Crane-built, packaged, NixOS module, docs, issue.
Two findings that contradicted the plan
TFLite is unreachable from this repo.
nixpkgs.tensorflow-liteis marked broken, and every Rust TFLite binding either builds TensorFlow with bazel or downloads a prebuilt runtime from a build script — neither survives the nix sandbox. Took the documented fallback: ONNX Runtime viaort(load-dynamic, dlopening nixpkgsonnxruntime1.26.0), with the same Apache-2.0 MoveNet weights as an ONNX re-export pinned by commit and hash.int8 is ~12x SLOWER than float32, measured, not assumed:
ORT's CPU kernels leave the dynamic-quantised QDQ nodes unfused and fall back to slow integer convolutions. Default is float32; int8 stays packaged so the comparison can be repeated on the Deck.
Measured
On dragon (not the target), OBSBOT Meet 2 at 1280x720 MJPEG 60fps, 256x256 model input, headless:
That figure is dequeue→present-returned. It excludes sensor exposure before dequeue and present→photons, both real and both invisible from inside the process — the doc says so explicitly rather than letting it read as glass-to-glass.
Model output layout ((y, x, score) x17 then the bbox) was validated empirically against a real person image, not taken on faith.
Design points worth reviewing
DROPPEDcount is the mechanism working.Checks
nix build .#deck-pose— builds; wrapped binary runs against a real camera with the model and ORT baked incargo clippy --all-targetsclean,cargo fmtandnix fmtcleannixosConfigurations.steamdeckevaluates both with the module off (as committed) and forced onNeeds Daniel
Superseded by #915, which consolidates the whole markerless-pose-input program into a single WIP branch against
main. Every commit from this PR is preserved there — nothing was squashed, so the root-cause writeups in the commit messages are intact. Closing here; review happens on #915.Pull request closed