Steam Controller Auto-Charge: 通过触觉反馈实现自主导航

Steam Controller Auto-Charge: 通过触觉反馈实现自主导航

概述

Steam Controller Auto-Charge 是一个开源项目,它使 Steam Controller 能够自主在桌面移动到其磁性充电底座上。该系统通过结合顶置摄像头追踪、计算机视觉和控制器内部的触觉马达,创造出一种物理移动机制。

技术实现

该项目结合使用 WebHID、OpenCV.js 和 WebAssembly 来处理同设备导航循环。

计算机视觉与追踪

系统使用顶置摄像头监控控制器和充电底座。追踪是通过 OpenCV.js 使用 Lucas-Kanade 光流算法 (calcOpticalFlowPyrLK) 来追踪硬件上用户选择的点。为了保持流畅的追踪循环,该项目将目标检测任务卸载到 Web Worker,并使用编译为 WebAssembly (WASM) 的基于 Rust 的卷积神经网络 (CNN)。

触觉驱动移动

控制器通过其内部的双线性谐振执行器 (LRAs) 发射 70Hz 的非对称触觉脉冲来驱动物理移动。这些脉冲产生的振动诱导移动足以让设备在表面上爬行。

为了确保平稳对接,系统实现了“接近蠕行模式 (Proximity Creep Mode)”,一旦控制器进入充电底座 150 像素范围内,该模式就会将触觉脉冲频率降低 50%。

WebHID 遥测与通信

应用程序通过 WebHID API 连接到 Steam Controller,从而允许其流式传输输入和遥测数据。系统专门监控两个报告 ID 来获取设备状态:

  • Report ID 67 (0x43): 用于显示实时电池百分比和电池单体电压 (mV)。
  • Report ID 121 (0x79): 被拦截以确认磁性充电是否已成功启动。

系统架构

应用程序使用 Vue 3 框架构建,包含以下架构组件:

  • App.vue: 管理摄像头流、UI 响应式、PID 追踪循环以及 OpenCV.js 光流逻辑。
  • steamController.ts: 一个 WebHID 抽象类,将 API 调用映射到 LRA 脉冲和电池轮询所需的特定字节负载。
  • objectDetector.ts & objectWorker.ts: 处理将视觉处理任务卸载到 Web Worker,以防止主线程阻塞。
  • wasm-object-detect/: 目标检测系统的 Rust 实现,编译为 WASM 以实现高性能处理。

安装与要求

要部署该系统,用户需要一个支持 WebHID 的 Chromium 系浏览器、一个顶置摄像头以及用于构建依赖项的 Nix 包管理器。该项目可以通过单个命令启动:

nix-shell --run "npm install && npm run dev"

社区见解

社区用户注意到这种方法与其他基于触觉的移动应用(例如 iPhone 的 Cycloramic 应用)之间的相似性。一位用户强调,控制器的内置陀螺仪和麦克风在未来可能提供更复杂的导航解决方案。

Sources