mirror of
https://github.com/DeeJanuz/frametop.git
synced 2026-10-06 05:00:08 +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
+7
-7
@@ -21,8 +21,8 @@
|
||||
// (set 1's eyes always share one pitch, and while it's lost an eye it keeps that
|
||||
// eye's yaw where it was: set 2 is each eye's own reading). From the head's origin,
|
||||
// not the eye's.
|
||||
// "own":SRC our own tracker (frame-eyes fe-trackd), from
|
||||
// /dev/shm/frame-eyes-gaze; adds "age" (ms since its frame), "eyes":[[hy,hp],[hy,hp]]
|
||||
// "own":SRC our own tracker (gaze/tracker/ft-eyes), from
|
||||
// /dev/shm/frametop-eyes-gaze; adds "age" (ms since its frame), "eyes":[[hy,hp],[hy,hp]]
|
||||
// (left, right; null for an eye it doesn't see), "ehit":[HIT,HIT] where each of those
|
||||
// lands, and "slip":[[x,y],[x,y]] (left, right: each eye's shift in its camera image
|
||||
// since the calibration, pixels; null until a click has measured it). {"ok":0}
|
||||
@@ -163,8 +163,8 @@ bool ReadSample(const EyeFile &f, EyeSample &s) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// --- Our own tracker: /dev/shm/frame-eyes-gaze, written by frame-eyes' fe-trackd ---
|
||||
// Layout (fe-trackd's docstring): u32 seq (odd while written), u32 version, f64 t, f32 yaw,
|
||||
// --- Our own tracker: /dev/shm/frametop-eyes-gaze, written by gaze/tracker/ft-eyes ---
|
||||
// Layout (ft-eyes' docstring): u32 seq (odd while written), u32 version, f64 t, f32 yaw,
|
||||
// pitch, u32 flags (bit 0 right eye, 1 left, 2 right slip known, 3 left), u32 n, then f32
|
||||
// right yaw, pitch, left yaw, pitch; slip right x, y, left x, y; pupils (unused here).
|
||||
struct OwnSample {
|
||||
@@ -176,7 +176,7 @@ struct OwnSample {
|
||||
|
||||
class OwnFile {
|
||||
public:
|
||||
// Reopened when it appears or is replaced, since fe-trackd may start after us.
|
||||
// Reopened when it appears or is replaced, since ft-eyes may start after us.
|
||||
bool Read(OwnSample &o) {
|
||||
const double now = NowRaw();
|
||||
if (!p_ || now - checked_ > 2.0) Reopen(now);
|
||||
@@ -206,10 +206,10 @@ private:
|
||||
void Reopen(double now) {
|
||||
checked_ = now;
|
||||
struct stat st {};
|
||||
if (stat("/dev/shm/frame-eyes-gaze", &st) != 0) return Close();
|
||||
if (stat("/dev/shm/frametop-eyes-gaze", &st) != 0) return Close();
|
||||
if (p_ && st.st_ino == ino_) return;
|
||||
Close();
|
||||
const int fd = open("/dev/shm/frame-eyes-gaze", O_RDONLY | O_CLOEXEC);
|
||||
const int fd = open("/dev/shm/frametop-eyes-gaze", O_RDONLY | O_CLOEXEC);
|
||||
if (fd < 0) return;
|
||||
if (fstat(fd, &st) == 0 && size_t(st.st_size) >= kSize) {
|
||||
void *m = mmap(nullptr, kSize, PROT_READ, MAP_SHARED, fd, 0);
|
||||
|
||||
Reference in new issue
Block a user