空中鼠標是利用陀螺儀輸出的數據,對屏幕上的光標進行控制的設備。原理看起來相對簡單,但實現起來,也有不少需要解決的問題。本文是作者在之前開發時的總結。
基本原理
將空中鼠標的X軸(Pitch)角速度和Z軸(Yaw)映射到鼠標的移動速度上。因此抓握設備的方式就事先要確定,比如哪面朝前,哪面朝上。靈敏度也需要通過實驗進行確定。如果能夠獲取屏幕的分辨率或者屏幕尺寸從而進行動態調節,則效果更佳。
抗靜態偏移
鼠標在不移動的時候,光標自然是不能移動的。但不得不指出,廉價的陀螺儀本身會有靜態輸出。有些甚至能達到20度/s。 好在偏移通常不會因為環境而發生變化。所以需要在出廠前進行校正。這種問題比較容易解決。
平滑算法
消費級陀螺儀由於成本所限,精度必然不會很高,數據會出現抖動。通過提高采樣速率,即所謂的過采樣技術,對同一時刻多個數據進行濾波和平滑,從而盡可能准確地反饋當時的運動狀態。
運動平面不匹配
如上圖所示,如果以Z為軸,向Y方向旋轉,那么鼠標會划出一條水平的軌跡。但當設備本身發生一定傾斜,如在X軸上有一個旋轉角,那么像剛才的移動,就會划出一條斜線。這可能會對用戶造成費解。如果擁有加速度計,測量設備的傾斜程度,通過傳感器融合算法,就能相對而言避免這類問題。但算法要求較高。
旋轉,而不是位移
普通鼠標都是基於位移的,移動多少,光標就移動多少。但空鼠不是,空鼠是基於旋轉的。如果把空鼠在不旋轉的基礎上,移動一定距離,會發現光標完全沒有變化(可能會因為一些干擾造成晃動)。這會讓用戶費解。可能有算法會試圖通過所謂的加速度積分獲取位移來考慮水平或垂直運動。但這種算法肯定是不行的,因為傳感器的精度限制會非常不准確,基本沒有解決的可能性。
防按鍵抖動
普通鼠標的按鍵基本都做在鼠標的頂部,所以按鍵不會造成鼠標位移。想象按鍵若做在鼠標側面,而且按鍵很硬的話,可能就會出現抖動。因此空中鼠標對按鍵的要求很高,需要盡可能的軟,同時還能有明確的觸覺反饋。在按下去的時候,能盡量讓鼠標不發生位移。最麻煩的是雙擊操作,雙擊時人點擊鼠標的力量通常比單擊大不少。而且會有兩次連續的抖動。如果位移過遠,操作系統會將其認為是一次拖拽操作,而非雙擊操作,這需要額外的處理。
手勢識別
這涉及到比較高級的問題,空鼠顯然脫離鍵盤,一些快捷操作無法實現,通過一定的手勢能夠檢測特定的動作,從而觸發之前定義的操作。但這涉及到機器學習的話題,而且需要較高的用戶學習成本。同樣的操作,不同用戶做出來的特征可能完全不同。
休眠
電池供電系統,功耗是必須考慮的,可考慮在一定時間內沒有檢測到運動,則自動進入低功耗模式,間歇式的發送數據。
結論
通過基本原理實現最簡單的空鼠並不困難,但用戶體驗並不好。通過加入其它方法,能夠有效提升准確性。但必須指出,解決運動平面不匹配的方法雖然能解決匹配問題,會降低實時性,產生類似時滯的感覺,所以取舍還需要具體分析。
不同傳感器和硬件設計,需要調節參數,通過反復的實驗對比,確定合理的方案。


