手勢提取依據所采用傳感器的不同,可以分為基於視覺,基於慣性傳感器,基於FSR,基於EMG傳感器的方法。其中基於視覺的方法使用場景有限,且無法獲取精確的手指關節角度;基於FSR的方法難以布置傳感器且難以獲取手指基關節的橫向轉動角位置;基於EMG的傳感器目前來看僅僅純在於醫療和實驗場景中,日常功能性使用受限於EMG采集的方式。故目前市場上已經商用的高精度的手勢手套大部分為基於慣性傳感器與磁力計的方法,如VR手套。
本文來源於作者的碩士畢設課題,需要用到實時的手勢提取作為控制器的輸入量,由此開始了這個低成本高精度的手勢提取手套的研發,目前原理性問題已經解決。本文將從以下部分說明:
1. 硬件及傳感器選擇
2. 傳感器數據的處理
3. 姿態的融合,關節角度提取
4. 優化方案
由於碩士論文還沒開始寫,更沒有發表,本人也還沒畢業,所以本文只說明實現原理與步驟, 暫不提供源碼: https://github.com/ShieldQiQi/MRH-HardwareCode
一、硬件及傳感器選擇
硬件MCU考慮到成本,使用的是stm32f103c8t6,然而由於姿態解算需要大量的矩陣及浮點運算,所以實際運行起來(每個MCU處理3個傳感器單元)還是有點吃力的。IMU采用經典的MPU6050,磁力計使用國產芯片QMC5883L。
二、傳感器數據處理
1.總概
擺在我們面前的有兩種傳感器,MPU6050集成了三軸的加速度和三軸的角速度,QMC5883L集成了三軸的磁場強度。由於我們使用磁力計僅僅用於姿態解算,所以並不關心磁場的幅值,采樣后直接歸一化即可。而加速度可用於位置積分,角速度可用於姿態矩陣或者四元數的積分,但在用於提取姿態矩陣時也需要歸一化。
我沒有采用MPU6050內置的BMP解算姿態,我需要自己融合以獲得更加靈活的效果。具體到怎么使用I2C協議提取QMC和MPU我這里不做詳細說明,畢竟Github上開源代碼一大堆。我將數據手套傳感器網絡模塊化處理,每根手指由一套傳感器網絡來采集關節角度,具體拓撲圖如圖2-1所示:
圖2-1 傳感器網絡拓撲
在上圖2-1中,每根手指由3片傳感器單元覆蓋,其中手指基座處的傳感器固定於手背,其它兩片分別位於近指節和中指節。
2.傳感器采樣的原始數據處理
單根手指上分布有三個傳感器單元,除了中指節上的傳感器外,其它兩個需要同時用到MPU6050和QMC5883L。
1.第三個傳感器不需要QMC是因為我們近指節和中指節之間只有一個自由度,如果近指節上的姿態已知,我們僅僅通過中指節上的加速度計就可以得到近指節和中指節之間的關節角度(注意奇點問題),然后由這個角度和前一個連桿的姿態獲得中指節的姿態。
2.MPU6050集成了陀螺儀和加速度計,實際實驗發現該傳感器在靜止狀態下角速度輸出平穩,角速度和加速度存在一定偏移,如果使用積分求姿態,一定要對角速度的偏移進行修正,如:在靜止狀態下采取各軸角速度的平均值,然后把該數據作為后期實際應用的偏置即可。
3.QMC5883L由於各種環境因素和磁場干擾環境的存在,波動較大(最好用隊列做個平滑濾波),且偏移較大而且每顆芯片偏移都不一致,所以對每片都需要進行詳細的橢圓模型校准:當我們把磁力計的軸做一個球面旋轉,那么最終在該軸上的磁場強度理論上為一個球體,然而由於傳感器制造和環境的不同,實際上每個軸在不同的方向測得的最大磁場強度都不一樣(偏置),而且對於XYZ三個軸,每個軸的最大變化范圍也不一樣(說明為橢球的原因),所以需要我們對每個軸的磁場強度先進行偏置,然后磁場強度歸一化,只有這樣得到的數據才是相對准確的,不然用未修正的數據得到的關節角度或者連桿姿態誤差很大。
三、姿態的融合,關節角度提取
1.姿態提取
當我們已經能夠獲得單根手指三個傳感器的原始數據后,以單個傳感器為例,我們就可以通過三軸加速度和三軸磁場強度獲取靜止狀態下的傳感器姿態矩陣,即所在的指節(連桿矩陣):
$$ Matrix=\left[ \begin{matrix} eastX & eastY & eastZ \\ magnetHorizX & magnetHorizY & magnetHorizZ \\ accelX & accelY & accelZ \end{matrix} \right] \tag{1} $$
在上式(1)中,
1.第三行為加速度獲得的三軸加速度歸一化后的結果,靜止時,該向量為重力加速度的反向同模向量(參考加速度計原理),所以可以理解為全局坐標系的天軸在傳感器(MPU6050)坐標系的各軸上的投影,反過來就是傳感器坐標系在全局坐標系天軸(Z軸)上的投影,所以歸一化后我們可以直接作為傳感器姿態矩陣的第三行。
2.第二行同理可由磁力計(磁場指向北,所以可以作為北軸(Y軸))獲得(需要提前變換到MPU6050的矩陣里表示),但值得注意的是,由於磁場強度在我們北半球並不是平行於地面,而是斜插向地面,所以需要將其分解為一個指向北平行於地面的向量和一個與重力同向的向量,然后取水平平行向量歸一化作為第二行即可,至於如何分解,這種小問題就留給讀者吧。
3.第一行(東軸)我們直接根據第二行(北軸)和第三行(天軸)向量做叉乘得到。
2.關節角度提取
獲得基座和近指節的姿態矩陣后,通過第三個傳感器的加速度計獲得第三個傳感器姿態矩陣的第三行,第二個傳感器姿態矩陣與第三傳感器姿態矩陣是一個繞自身X軸旋轉Theta角度的關系(具體繞哪個軸看安裝的位置),然后就可以解出該角度,利用該角度可繼續獲得第三傳感器姿態矩陣的另外兩行(其實得到角度后就沒必要再算該矩陣了)(注意奇點問題)。
同理,我們通過第一和第二傳感器的姿態矩陣之間的運算,可以直接得到基關節出兩個正交的自由度(使用D-H法建模,逆解得出關節角度解析式)。
四、優化方案
靜止時我們可以通過加速度計和磁力計獲得姿態,進而得到關節角度,但是由於運動過程中,加速度計測得的不再僅僅包含重力加速度,而是存在一些其它隨機方向的加速度分量,所以此時得到的姿態不再准確,需要我們利用角速度積分得到新的姿態矩陣,關於如何運用,請看我的上一篇博文:
https://www.cnblogs.com/QiQi-Robotics/p/14562475.html
最簡單的,我們可以采取靜止時使用加速度計法,運動時采用積分法,一旦靜止下來,就會通過加速度法對姿態進行修正以防止積分的累計誤差。更為人們做研究的是一些卡爾曼濾波方法,利用積分做預測,利用加速度法直接解算做修正,但是由於二者的預測和測量的誤差協方差是不定的,所以理論上是得不到最佳的最小誤差效果,但應該可以通過工程實驗大致確定一個參數范圍以獲得一個比較好的效果。我正在實驗中。
discre kalman fliter
2021-04-11更新,分別測試了兩段式互補濾波,連續式互補濾波以及卡爾曼濾波,效果如下圖:
從左到右依次為:連續互補濾波;兩段式互補濾波;卡爾曼濾波(紅線為濾波后,綠線為濾波前)
五、目前效果