利用智能手機(Android)追蹤一塊磁鐵(二)

來源:互聯網
上載者:User

標籤:

在上一篇部落格中提到了利用磁場強度推算感應器位置座標的公式,下面就介紹怎麼利用智能手機完成磁鐵的追蹤(任何具有磁感應器的裝置均可以),這裡主要是利用Android手機。

?

1:程式步驟:

  1. 首先將磁鐵放置在遠離手機的位置,然後拿著手機在空中做"倒8"字運動(就是這個運動軌跡:)。這樣做的目的就是標準化手機的磁感應器,因為磁感應裝置很容易受到磁場的幹擾變得不精準。
  2. 將手機放置平穩,然後記錄當前的磁場強度,作為"原始磁場"(這個磁場必須精準可以取多次的平均值)。Android開發中需要用到SensorEventListener類。
  3. 然後將磁體放在距離手機20cm左右的距離,且磁鐵位置在手機所在的水平線之上。之所以這麼做是因為磁場強度和距離的k次冪成反比,如果太近會影響手機的磁感應器,太遠磁場衰減的又太快。位於手機所在的水平線之上,是因為之前說過在xy平面上,上一篇所推的公式是停用。
  4. 記錄當前的磁場作為"中心磁場", "中心磁場"減去"原始磁場"就是磁體在手機的磁感應器位置產生的磁場強度。然後根據上一篇的公式就可以計算一個"中心位置"。
  5. 移動磁鐵,根據磁場的變化就可以即時的減去原始磁場,然後計算出磁感應器相對於磁鐵的位置。然後減去"中心位置"就是得到了一個"相對於中心位置"的"移動"。
  6. 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:[email protected]]

圖6

?

3:注意事項:

????上面的介紹就是編程需要的知識,我是在android進行實驗的,在其他裝置上也應該沒問題。下面介紹一下需要注意的地方。

  1. 實驗前拿著手機"畫"倒8字,為了標準化磁感應器。不然不標準的吃感應器沒辦法進行精確測量。
  2. 保證磁鐵在手機的上面和側面,因為之前介紹過在xy平面上述的公式是不成立的。
  3. 磁鐵不要距離太遠和太近,太遠無法檢測磁場,太近會影響磁感應器。

?

現在關於利用智能手機(Android)追蹤磁鐵的內容全部介紹完了,如果有人有問題,想法,興趣等可以聯絡我E-mail:[email protected]

利用智能手機(Android)追蹤一塊磁鐵(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.