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,使其能夠串流輸入與遙測數據。系統特別監控兩個用於裝置狀態的 Report 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 app)非常相似。一位使用者強調,控制器的內建陀螺儀與麥克風在未來可能提供更精用的導航解決方案。

Sources