Steam Controller Auto-Charge: Haptic Feedbackによる自律走行

Steam Controller Auto-Charge: Haptic Feedbackによる自律走行

概要

Steam Controller Auto-Chargeは、Steam Controllerをテーブルトップ上で磁気充電用チャージング・パックへと自律的に移動させるオープンソース・プロジェクトです。このシステムは、頭上からのカメラ・トラッキング、コンピュータ・ビジョン、およびコントローラーの内蔵ハプティック・モーターを組み合わせることで、物理的な移動メカニズムを実現しています。

技術的実装

このプロジェクトは、WebHID、OpenCV.js、およびWebAssemblyを組み合わせて、同一デバイス内でのナビゲーション・ループを処理します。

コンピュータ・ビジョンとトラッキング

システムは、頭上のウェブカメラを使用してコントローラーと充電用チャージング・パックを監視します。トラッキングは、OpenCV.jsのLucas-Kanadeオプティカルフロー・アルゴリズム(calcOpticalFlowPyrLK)を使用して、ハードウェア上のユーザー選択ポイントを追跡します。流動的なトラッキング・ループを維持するため、プロジェクトはオブジェクト検出をWeb Workerへオフロードし、WebAssembly (WASM) にコンパイルされたRustベースの畳み込みニューラルネットワーク (CNN) を使用しています。

ハプティック駆動による移動

コントローラーは、内蔵のデュアル Linear Resonant Actuators (LRAs) を通じて70Hzの非対称ハプティック・パルスを発生させることで、物理的に移動します。これらのパルスは、デバイスを表面上で這わせるのに十分な振動誘発移動を生み出します。

穏やかなドッキングを確実にするため、システムは「Proximity Creep Mode」を実装しており、コントローラーが充電用チャージング・パックから150ピクセル以内に近づくと、ハプティック・パルスの周波数を50%減少させます。

WebHIDテレメトリと通信

アプリケーションはWebHID APIを介してSteam Controllerに接続し、入力とテレメトリのストリーミングを可能にします。システムは、デバイスの状態を確認するために、特に2つのレポートIDを監視します:

  • Report ID 67 (0x43): ライブのバッテリー残量(%)とバッテリー・セルの電圧 (mV) を表示するために使用されます。
  • Report ID 121 (0x79): 磁気充電が正常に開始されたことを確認するためにインターセプトされます。

システム・アーキテクチャ

アプリケーションはVue 3フレームワークを使用して構築されており、以下のアーキテクチャ構成要素で構成されています:

  • App.vue: カメラ・ストリーム、UIのリアクティビティ、PIDトラッキング・ループ、およびOpenCV.jsのオプティカルフロー・ロジックを管理します。
  • steamController.ts: WebHID抽象化クラスであり、LRAパルスおよびバッテリー・ポーリングに必要な特定のバイト・ペイロードをAPIコールにマッピングします。
  • objectDetector.ts & objectWorker.ts: メイン・スレッドのブロッキングを防ぐため、視覚的処理をWeb Workerへオフロードする処理を担います。
  • wasm-object-detect/: 高性能な処理のためにWASMにコンパイルされた、オブジェクト検出システムのRust実装です。

セットアップと要件

システムをデプロイするには、WebHIDをサポートするChromiumベースのブラウザ、頭上のウェブカメラ、およびビルド依存関係のためのNixパッケージ・マネージャーが必要です。プロジェクトは、単一のコマンドで開始できます:

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

コミュニティの洞察

コミュニティのユーザーは、このアプローチとiPhone用のCycloramicアプリなどの他のハプティック駆動型移動アプリとの類似性を指摘しています。あるユーザーは、コントローラーのオンボード・ジャイロおよびマイクが、将来的にはさらに洗練されたナビゲーション・ソリューションを提供できる可能性があると強調しています。

Sources