mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-06 06:00:09 +02:00
Bring our own eye tracker into the gaze folder, run by the gaze service
frame-eyes, a separate project until now, becomes gaze/tracker:
- ft-eyegrab (was fe-bufprobe) copies the eye-camera frames, read-only, out of
SteamVR's eyetracking process. It runs as the system service
frametop-eyegrab.service, which gaze/tracker/install.sh installs to
/etc/frametop with sudo. It keeps only CAP_SYS_PTRACE, CAP_DAC_READ_SEARCH, and
CAP_CHOWN, and copies frames only while /dev/shm/frametop-eyes-want is fresh,
holding none of the tracker's buffers otherwise.
- ft-eyes (was fe-trackd) runs under ft-gazed in the dev container, with
build/venv's pinned numpy and OpenCV: while Eye tracker is Own tracker, or on
the probe's lease ("eyes SECONDS"). No sudo password or fe-live script at
run time any more.
- lab/ holds the research tools (ft-eyes-score, -e2e, -record, -replay,
-session) and findings.md. Recordings live outside the repo, in
~/.local/share/frametop/eyes/captures; .gitignore catches stray frame dumps.
Its socket is now @ft_eyes, its output /dev/shm/frametop-eyes-gaze, and its state
~/.local/state/frametop/gaze/eyes. On practice1 -> practice2 the whole live path
(ft-eyes-e2e) gives 1.30 deg median and 3.18 for the worst tenth, as before the
move (1.30, 3.21).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5565a25444
commit
ed75614f62
27 files changed
+3021
-45
No files matched your search
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
# ft-eyes-session: record the eye cameras and SteamVR's gaze together, for SECONDS (default 10),
|
||||
# as a new recording NAME in ~/.local/share/frametop/eyes/captures (FT_EYES_CAPTURES).
|
||||
# Usage: gaze/tracker/lab/ft-eyes-session NAME [SECONDS]
|
||||
#
|
||||
# frames.raw, index.txt, clocks.txt every eye-camera frame (ft-eyes-record, from the shared
|
||||
# frames of frametop-eyegrab.service; no root)
|
||||
# gaze.jsonl ft-gaze's samples (gaze/build/ft-gaze)
|
||||
# Both are timed on CLOCK_MONOTONIC_RAW ("t" in gaze.jsonl, the last column of index.txt).
|
||||
set -euo pipefail
|
||||
lab=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
||||
repo=$(cd "$lab/../../.." && pwd)
|
||||
name=${1:?usage: ft-eyes-session NAME [SECONDS]}
|
||||
secs=${2:-10}
|
||||
out=${FT_EYES_CAPTURES:-$HOME/.local/share/frametop/eyes/captures}/$name
|
||||
[ -e "$out" ] && { echo "$out exists" >&2; exit 1; }
|
||||
|
||||
# ft-gaze runs in the dev container; start it first, it takes a moment to connect. It quits
|
||||
# when its stdin closes (--watch-stdin): killing distrobox doesn't reach it in the container.
|
||||
# The recorder makes the folder; ft-gaze's output waits for it.
|
||||
tmp=$(mktemp -d)
|
||||
sleep $((secs + 3)) | "$HOME/.local/bin/distrobox" enter dev -- "$repo/gaze/build/ft-gaze" \
|
||||
--watch-stdin > "$tmp/gaze.jsonl" 2> "$tmp/gaze.log" &
|
||||
gaze=$!
|
||||
sleep 2
|
||||
python3 "$lab/ft-eyes-record" "$name" "$secs"
|
||||
wait $gaze || true
|
||||
mv "$tmp/gaze.jsonl" "$tmp/gaze.log" "$out/"
|
||||
rmdir "$tmp"
|
||||
echo "$(wc -l < "$out/index.txt") frames, $(wc -l < "$out/gaze.jsonl") gaze samples in $out"
|
||||
Reference in new issue
Block a user