sky0hunter/way-to-gaze

GitHub: sky0hunter/way-to-gaze

该项目通过逆向工程 USB 协议在 Linux/Sway/Wayland 上驱动 Tobii Eye Tracker 5,实现无需双手的眼动追踪光标控制。

Stars: 0 | Forks: 0

# gaze 方式 [![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/sky0hunter/way-to-gaze/actions/workflows/ci.yml) 使用 Tobii Eye Tracker 5 在 Sway/Wayland 下进行眼动追踪光标控制。看着某个位置,光标就会瞬移过去;微调定位则通过头部的微小移动来完成。全程无需动手。 ## 问题所在 Tobii Eye Tracker 5 不支持 Linux。其消费级软件栈是 Windows 专用的,而在 Linux 上,设备虽然能被枚举,但始终处于暗屏状态 —— IS5 EyeChip 需要一个未公开的 USB 激活序列才能产生任何数据。除此之外,原始的眼动数据过于抖动且精度不足(大约一度的视角),无法直接用于驱动光标。 ## 解决方案 - **设备启动** —— 逆向工程的 24 条 USB 初始化指令序列(源自对 USB 流量的观察,参见[互操作性](#interoperability))可激活 IR 照明器和传感器流水线(`usb_driver.py`, `device_init.py`)。 - **眼动数据** —— 对 Tobii 的 stream engine 库的 CFFI 绑定,以约 33 Hz 的频率提供眼动、眼睛位置和状态检测回调(`stream_engine.py`)。库本身不包含在内;请参阅下文。 - **数据过滤** —— 使用中值滤波消除眨眼尖峰,然后使用 1€ filter(Casiez 等人,CHI 2012)进行自适应抖动消除。 - **校准** —— 全屏注视网格通过带有异常值剔除的多项式映射,将归一化的眼动数据转换为屏幕像素坐标。存储在 `~/.config/way-to-gaze/calibration.json` 中。 - **MAGIC 式融合** —— 检测到扫视时,通过简短的动画将光标瞬移至注视点;在非扫视期间,头部移动(根据 3D 眼睛位置)会微调光标以实现精准定位。渲染线程以 120 Hz 进行插值,并驱动虚拟的 uinput 指针。 - **桌面集成** —— GTK4 Layer Shell 校准界面、可选的眼动覆盖层和实时调整面板、托盘图标、Sway IPC 点击聚焦以及 Waybar 状态模块。 ## 依赖要求 - Tobii Eye Tracker 5 - Sway(或除 Sway IPC 部分以外的其他 wlroots 合成器) - Python 3.10+,带有 gtk4-layer-shell 的 GTK4,PyGObject - Tobii 的 `libtobii_stream_engine.so` 和 `tobiiusbserviced`,您必须自行获取 —— 参见 [tobii_eye_tracker_linux_installer](https://github.com/Eitol/tobii_eye_tracker_linux_installer)。将该 `.so` 文件放在代码库根目录的 `lib/` 文件夹中。 ## 安装说明 ``` git clone https://github.com/sky0hunter/way-to-gaze cd way-to-gaze python -m venv .venv && source .venv/bin/activate pip install -e ".[sound]" # [sound] adds optional tongue-click detection sudo cp udev/*.rules /etc/udev/rules.d/ # device + uinput access sudo udevadm control --reload ``` `systemd/` 中的 systemd 单元涵盖了 USB 服务、一次性设备初始化以及应用程序本身 —— 在安装它们之前,请将其中的路径调整为您检出的代码库路径。设备初始化需要 root 权限(原始 USB 控制传输);您可以要么让 `way-to-gaze-init.service` 在开机时处理它并使用 `--no-init` 参数运行应用,要么以 root 身份运行一次应用。 ## 使用说明 ``` way-to-gaze --calibrate # run this first: fullscreen fixation grid way-to-gaze # normal cursor mode way-to-gaze --diagnostic # print gaze data, no cursor injection way-to-gaze --test-origin # print 3D eye positions way-to-gaze --panel # with live-tuning control panel way-to-gaze --overlay # with gaze confidence overlay way-to-gaze --no-init # skip USB init (already done at boot) ``` 操作绑定至 F13–F20(左键单击、右键单击、拖拽、滚动、暂停、重新校准、精准模式、面板)—— 其理念是您可以将多余的按键或脚踏板重新映射到这些功能上。绑定以及所有过滤/融合参数都保存在 `~/.config/way-to-gaze/config.toml` 中;面板可以对它们进行实时调整。 `waybar/way-to-gaze.sh` 用于在 Waybar 中渲染追踪状态,而 `sway/way-to-gaze.conf` 会禁用焦点跟随鼠标,这样仅凭眼动就永远不会抢占焦点。 ## 互操作性 此处实现的 USB 协议完全源自对设备与现有软件之间 USB 流量的观察,仅出于互操作性的目的(符合指令 2009/24/EC 的规定)。本代码库不包含也不分发任何 Tobii 的软件、固件或 SDK 代码。stream-engine 后端要求您自行获取 Tobii 自己的库。 本项目未得到 Tobii AB 的认可或附属关系。 ## 许可证 MIT —— 参见 [LICENSE](LICENSE)。
标签:Linux桌面, Python, Sway, USB驱动, Wayland, 云资产清单, 人机交互, 无后门, 眼动追踪, 逆向工具, 逆向工程