在上一篇博客中提到了利用磁場強度推算傳感器位置坐標的公式,下面就介紹怎么利用智能手機完成磁鐵的追蹤(任何具有磁感應器的裝置均可以),這里主要是利用Android手機。
1:程序步驟:
-
首先將磁鐵放置在遠離手機的位置,然后拿着手機在空中做"倒8"字運動(就是這個運動軌跡:
)。這樣做的目的就是標准化手機的磁感應器,因為磁感應裝置很容易受到磁場的干擾變得不精准。
-
將手機放置平穩,然后記錄當前的磁場強度,作為"原始磁場"(這個磁場必須精准可以取多次的平均值)。Android開發中需要用到SensorEventListener類。
-
然后將磁體放在距離手機20cm左右的距離,且磁鐵位置在手機所在的水平線之上。之所以這么做是因為磁場強度和距離的k次冪成反比,如果太近會影響手機的磁感應器,太遠磁場衰減的又太快。位於手機所在的水平線之上,是因為之前說過在xy平面上,上一篇所推的公式是不可用的。
-
記錄當前的磁場作為"中心磁場", "中心磁場"減去"原始磁場"就是磁體在手機的磁感應器位置產生的磁場強度。然后根據上一篇的公式就可以計算一個"中心位置"。
-
移動磁鐵,根據磁場的變化就可以實時的減去原始磁場,然后計算出磁感應器相對於磁鐵的位置。然后減去"中心位置"就是得到了一個"相對於中心位置"的"移動"。
-
如圖1:r1和r2的矢量位置可以通過上一篇的公式計算出來,然后r3=r1-r2就是磁鐵相對於中心的移動位置,知道這個值就可以追蹤磁鐵的相對移動位置。
圖1
2:磁場強度值的平滑濾波:
上述方法利用android進行編碼后發現效果很差,主要是因為利用磁感應器得到的磁場值是不平滑的,磁場值無時無刻不在波動。造成了磁鐵在定位時位置也在波動。如圖2就是原始的未經過平滑過的磁場值,可以看到磁場的波動很大。圖中的三個線就是磁場在xyz三個軸上產生的磁場值。
圖2
因此需要對磁場值進行平滑濾波,我用的辦法是卡爾曼濾波算法,有興趣的可以去查一下資料,這里不做詳細的介紹。主要介紹一下我針對本算法對卡爾曼算法做的一些改變。圖3是卡爾曼的5個方程(圖片中的-2應該改成-1),圖4是針對方程的說明。因為這里磁場值為xyz三個軸上的分量為一維的值,所以用不到矩陣的計算,所以上述公式化簡后是比較簡單的(參考:http://blog.chinaunix.net/uid-26694208-id-3184442.html)。
圖3
圖4
這里需要針對Q和R兩個參數進行說明,Q:說是噪聲協方差矩陣,我理解就是Q的大小決定了最優值是更接近於測量值還是估計值。R:為過程噪聲協方差,我理解就是再不做任何處理的情況下測量磁場值,然后根據測量值計算方差就是R,可以通過實驗得到R的值。
而Q的值這需要進行判斷,假設,K值就決定了Q的大小。當Q越大(k越大)時卡爾曼中的最優值就越接近於測量值,而Q越小(k越小)卡爾曼中的最優值就越接近於先驗估計值。通俗的講就是Q越大平滑的效果就越不好,而平滑后的值就越"跟隨"(所謂的"跟隨"就是原始測量值進行快速變化時,經過平滑過的值也很好的跟着變化)。而Q越小平滑的效果就越好,而平滑后的值越"不跟隨"。
舉個例子,假設測量的三個值為[0,1.0,0],如果Q值很大那么平滑后的效果為[0,0.8,0]。而如果Q值很小平滑后的值為[0,0.1,0]。
所以必須找一個好的Q值做出"平滑"和"跟隨"之間的平衡,在試驗過程中我把k值設為-4結果平滑的效果不錯,可以很好的定位磁鐵的位置(第一篇博客中的演示視頻中的k值就是-4)。之前說過演示視頻不是最終的結果,然后我對Q值得計算做了一下設想:既然又要做到"平滑"又要做到"跟隨",那么就可以根據磁場值的變化動態的確定Q的值。即當磁場變化越大時就增加Q的值使之"跟隨",當磁場變化越小時就減小Q的值使之更加"平滑"。假設在卡爾曼濾波中,當前的測量值為,上一狀態的最優值為
。而兩者之差的絕對值為
,然后假設
和k為
的函數
。
接下來就是確定函數,根據設想
越大k就應該越大,而
越小k越小。那么首先想到的就是線性函數
(a,b為未知數)。得出的實驗效果如圖5(黑色線為原始磁場,綠色為平滑后的磁場),可以看到這種方法確實可以做到即"平滑"又"跟隨"。但是仔細觀察圖片你會發現當磁場劇烈變化到平穩的過程中,"綠色"線總是不能很快的回到平穩狀態(不能很快的接近黑色線)。
圖5
因為是平均映射,所以為了解決不能很快平穩的問題,需要一個"非平均映射"。即當
變小時需要k值變小的速度要遠大於
,因此想到非平均映射函數log。因此假設
(計算a和b的值可以找兩個點帶入計算,比如當
為0.1時k=-7,
為3.0時k=-1,然后計算a和b。這兩個參數就可以很好的做到"平滑"和"跟隨")。然后得到實驗結果如圖6(黑色為原始磁場,藍色誰平均映射,紅色為非平均映射):可以看出紅色線的效果明顯好於藍色線。[注:上述關於卡爾曼濾波均是本人的理解,並不能保證理論上也正確。而實驗結果還不錯。如果有人有更好的方法或者意見請務必和我聯系E-mail:1219186770@qq.com]
圖6
3:注意事項:
上面的介紹就是編程需要的知識,我是在android進行實驗的,在其他設備上也應該沒問題。下面介紹一下需要注意的地方。
-
實驗前拿着手機"畫"倒8字,為了標准化磁感應器。不然不標准的吃感應器沒辦法進行精確測量。
-
保證磁鐵在手機的上面和側面,因為之前介紹過在xy平面上述的公式是不成立的。
-
磁鐵不要距離太遠和太近,太遠無法檢測磁場,太近會影響磁感應器。
現在關於利用智能手機(Android)追蹤磁鐵的內容全部介紹完了,如果有人有問題,想法,興趣等可以聯系我。