空中滑鼠是利用陀螺儀輸出的資料,對螢幕上的游標進行控制的裝置。原理看起來相對簡單,但實現起來,也有不少需要解決的問題。本文是作者在之前開發時的總結。
基本原理
將空中滑鼠的x軸(pitch)角速度和z軸(yaw)對映到滑鼠的移動速度上。因此抓握裝置的方式就事先要確定,比如哪面朝前,哪面朝上。靈敏度也需要通過實驗進行確定。如果能夠獲取螢幕的解析度或者螢幕尺寸從而進行動態調節,則效果更佳。
抗靜態偏移
滑鼠在不移動的時候,游標自然是不能移動的。但不得不指出,廉價的陀螺儀本身會有靜態輸出。有些甚至能達到20度/s。 好在偏移通常不會因為環境而發生變化。所以需要在出廠前進行校正。這種問題比較容易解決。
平滑演算法
消費級陀螺儀由於成本所限,精度必然不會很高,資料會出現抖動。通過提高取樣速率,即所謂的過取樣技術,對同一時刻多個資料進行濾波和平滑,從而盡可能準確地反饋當時的運動狀態。
運動平面不匹配
如上圖所示,如果以z為軸,向y方向旋轉,那麼滑鼠會劃出一條水平的軌跡。但當裝置本身發生一定傾斜,如在x軸上有乙個旋轉角,那麼像剛才的移動,就會劃出一條斜線。這可能會對使用者造成費解。如果擁有加速度計,測量裝置的傾斜程度,通過感測器融合演算法,就能相對而言避免這類問題。但演算法要求較高。
旋轉,而不是位移
普通滑鼠都是基於位移的,移動多少,游標就移動多少。但空鼠不是,空鼠是基於旋轉的。如果把空鼠在不旋轉的基礎上,移動一定距離,會發現游標完全沒有變化(可能會因為一些干擾造成晃動)。這會讓使用者費解。可能有演算法會試圖通過所謂的加速度積分獲取位移來考慮水平或垂直運動。但這種演算法肯定是不行的,因為感測器的精度限制會非常不準確,基本沒有解決的可能性。
防按鍵抖動
普通滑鼠的按鍵基本都做在滑鼠的頂部,所以按鍵不會造成滑鼠位移。想象按鍵若做在滑鼠側面,而且按鍵很硬的話,可能就會出現抖動。因此空中滑鼠對按鍵的要求很高,需要盡可能的軟,同時還能有明確的觸覺反饋。在按下去的時候,能盡量讓滑鼠不發生位移。最麻煩的是雙擊操作,雙擊時人點選滑鼠的力量通常比單擊大不少。而且會有兩次連續的抖動。如果位移過遠,作業系統會將其認為是一次拖拽操作,而非雙擊操作,這需要額外的處理。
手勢識別
這涉及到比較高階的問題,空鼠顯然脫離鍵盤,一些快捷操作無法實現,通過一定的手勢能夠檢測特定的動作,從而觸發之前定義的操作。但這涉及到機器學習的話題,而且需要較高的使用者學習成本。同樣的操作,不同使用者做出來的特徵可能完全不同。
休眠
電池供電系統,功耗是必須考慮的,可考慮在一定時間內沒有檢測到運動,則自動進入低功耗模式,間歇式的傳送資料。
結論
通過基本原理實現最簡單的空鼠並不困難,但使用者體驗並不好。通過加入其它方法,能夠有效提公升準確性。但必須指出,解決運動平面不匹配的方法雖然能解決匹配問題,會降低實時性,產生類似時滯的感覺,所以取捨還需要具體分析。
不同感測器和硬體設計,需要調節引數,通過反覆的實驗對比,確定合理的方案。
原創 空中滑鼠一DMP尤拉角
正在搞六軸感測器,今天移植了mpu6050的mothiondriver的dmp韌體到stm32上了,能夠穩定地輸出尤拉角 也就是俯仰角 航向角 橫滾角 和xyz三軸加速度值,在電腦的上位機模擬了裝置的姿態 dmp韌體的功能之一 在mpu6050晶元內部進行姿態結算融合,大大減輕mcu的負擔 dmp的...
演算法小討論
舉例說 假設你們班級有30個人,假設按照成績高低已經把試卷排列好了,你想找出數學成績在75分的人。第一種辦法,就是簡單的順次查詢,找到就退出。複雜度o n 第二種辦法,把試卷分兩羅,大概在中間那張如果小於75分,就把上邊的再分兩羅再執行上邊步驟,按照這個辦法找到為止。每次輸入範圍是上次的一半,遞迴,...
回溯演算法討論
目前為止,我見過的關於回溯演算法最精準的定義來自於leetcode。具體如下 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選...