Steam Controller Auto-Charge: Haptic Feedback를 통한 자율 주행

Steam Controller Auto-Charge: Haptic Feedback를 통한 자율 주행

개요

Steam Controller Auto-Charge는 Steam Controller가 테이블 위를 자율적으로 이동하여 자기식 충전용 퍽(puck)에 도달할 수 있게 하는 오픈 소스 프로젝트입니다. 이 시스템은 오버헤드 카메라 트래킹, 컴퓨터 비전, 그리고 컨트롤러의 내부 햅틱 모터를 결합하여 물리적 이동 메커니즘을 생성함으로써 이를 구현합니다.

기술적 구현

이 프로젝트는 동일 장치 내 내비게이션 루프를 처리하기 위해 WebHID, OpenCV.js, 그리고 WebAssembly의 조합을 활용합니다.

컴퓨터 비전 및 트래킹

시스템은 오버헤드 웹캠을 사용하여 컨트롤러와 충전용 퍽을 모니터링합니다. 트래킹은 OpenCV.js를 통해 Lucas-Kanade 광학 흐름(optical flow) 알고리즘(calcOpticalFlowPyrLK)을 사용하여 하드웨어 상의 사용자 선택 지점을 추적합니다. 유연한 트래킹 루프를 유지하기 위해, 프로젝트는 WebAssembly (WASM)로 컴파일된 Rust 기반의 Convolutional Neural Network (CNN)를 사용하여 객체 탐지를 Web Worker로 오프로드합니다.

햅틱 기반 이동

컨트롤러는 내부의 듀얼 Linear Resonant Actuators (LRAs)를 통해 70Hz 비대칭 햅틱 펄스를 발사함으로써 물리적으로 이동합니다. 이러한 펄스는 장치가 표면을 따라 기어갈 수 있을 만큼 충분한 진동 유도 이동을 생성합니다.

부드러운 도킹을 보장하기 위해, 시스템은 컨트롤러가 충전용 퍽의 150픽셀 이내로 들어오면 햅틱 펄스 주파수를 50% 감소시키는 "Proximity Creep Mode"를 구현합니다.

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: LRA 펄스 및 배터리 폴링에 필요한 특정 바이트 페이로드를 API 호출에 매핑하는 WebHID 추상화 클래스입니다.
  • 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