sky0hunter/way-to-gaze
GitHub: sky0hunter/way-to-gaze
该项目通过逆向工程 USB 协议在 Linux/Sway/Wayland 上驱动 Tobii Eye Tracker 5,实现无需双手的眼动追踪光标控制。
Stars: 0 | Forks: 0
# gaze 方式
[](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, 云资产清单, 人机交互, 无后门, 眼动追踪, 逆向工具, 逆向工程