現代 MacBook Pro 內建了未文件化的 MEMS 加速度計與陀螺儀,由感測器處理單元 (SPU) 管理。此專案透過 IOKit HID 介面讀取這兩項感測器數據,同時也能讀取相同的介面上的筆電蓋角度與環境光感測器。
此專案利用了 Haptyk - 一款將打字力道轉化為機械鍵盤聲響的免費 macOS App,透過加速度計實現。另一個專案 taigrr/spank 則能透過拍打 MacBook 來觸發其發聲,同樣使用 Apple Silicon 加速度計透過 IOKit HID。
Apple Silicon 晶片 (M2/M3/M4/M5) 內建了難以尋找的 MEMS IMU (加速度計 + 陀螺儀),由感測器處理單元 (SPU) 管理。它並未透過任何公開 API 或框架暴露。此專案透過 IOKit HID 回呼,以約 800Hz 的頻率讀取原始的 3 軸加速度和角速度數據。
目前僅在 MacBook Pro M3 Pro 上測試過,可能適用於其他 Apple Silicon Mac,但無法保證。
感測器位於 IOKit 註冊表中的 AppleSPUHIDDevice 下,使用 vendor usage page 0xFF00。usage 3 是加速度計,usage 9 是陀螺儀 (被認為是同一物理 IMU,根據拆解推測為 Bosch BMI286)。驅動程式是 AppleSPUHIDDriver,屬於感測器處理單元的一部分。我們使用 IOHIDDeviceCreate 開啟它,並透過 IOHIDDeviceRegisterInputReportCallback 註冊非同步回呼。數據以 22 位元組的 HID 報告形式傳輸,x/y/z 值為小端序的 int32,位於位移 6、10、14。除以 65536 可獲得以 g (加速度計) 或 deg/s (陀螺儀) 為單位的數值。回呼速率約為 100Hz (從約 800Hz 的原生速率降頻而來)。
透過融合加速度計與陀螺儀數據,並使用 Mahony AHRS 四元數濾波器計算方向,然後顯示為翻滾/俯仰/偏航儀表。
您可以使用以下指令驗證您的機器上是否存在該裝置:
如果您安裝了外部管理的環境 (homebrew python),請使用 venv:
需要 root (sudo) 權限,因為 IOKit HID 裝置存取需要提升的權限。注意:靜止時加速度計讀數約為 1g (重力)。使用 macimu.filters.remove_gravity() 來隔離動態加速度。
透過 Mahony 四元數濾波器融合加速度計與陀螺儀數據,您無需進行任何數學運算。
每個樣本都包含來自 HID 報告的精確時間戳記 (mach_absolute_time),而非 Python 端時鐘。每個報告都有其獨特的時間戳記。
濾波器 (來自 macimu.filters import ...) -- biquad butterworth,無外部依賴。
例外情況:macimu.SensorNotFound (如果沒有 SPU 裝置),PermissionError (如果不是 root)。
演示包含震動偵測、方向儀表、實驗性心跳偵測 (BCG)、筆電蓋角度、環境光,以及可選的鍵盤閃爍功能。
motion_live.py 可以根據震動強度近乎即時地閃爍鍵盤背光。該儲存庫現已包含 KBPulse,並在 KBPulse/bin/KBPulse 提供了預建的 Apple Silicon 二進位檔。
如果您安裝了 uv / uvx,您也可以直接執行:
將手腕放在筆電觸控板附近的區域,等待 10-20 秒讓訊號穩定。這利用了心臟搏動的機械震動,透過手臂傳遞到機殼,即心臟搏動圖 (ballistocardiography)。此功能為實驗性質,不保證可靠,僅作為展示感測器能偵測到什麼的有趣應用。BCG 的頻帶寬為 0.8-3Hz,透過對濾波訊號進行自相關來估計 BPM。
與 Apple 或任何雇主無關。
透過 IOKit HID 讀取 Apple Silicon MacBook 上未文件化的 MEMS 加速度計與陀螺儀。