卡爾曼濾波數(shù)據(jù)處理技巧通俗理解及python實現(xiàn)
學習前言
好久沒用過arduino了,接下去要用arduino和超聲波做個小實驗,對于讀取的模擬量肯定要進行濾波呀,不然這模擬量咋咋呼呼的怎么用
什么是卡爾曼濾波
先看看百度百科解釋哈:卡爾曼濾波(Kalman filtering)是一種利用線性系統(tǒng)狀態(tài)方程,通過系統(tǒng)輸入輸出觀測數(shù)據(jù),對系統(tǒng)狀態(tài)進行最優(yōu)估計的算法。由于觀測數(shù)據(jù)中包括系統(tǒng)中的噪聲和干擾的影響,所以最優(yōu)估計也可看作是濾波過程。
重要的事說三遍:
還不如不看!
還不如不看??!
還不如不看?。。?/p>
其實大家并不需要把卡爾曼濾波當作一種很復(fù)雜的東西,用通俗的話來講,卡爾曼濾波算法只是一種 濾波算法,它的功能就是 濾波,濾波的作用就是減少噪聲與干擾對數(shù)據(jù)測量的影響。
卡爾曼濾波是怎么濾波的
接下來我會用一句話概括卡爾曼濾波的操作過程:
卡爾曼濾波是一種通過 歷史數(shù)據(jù)、歷史積累誤差、當前測量數(shù)據(jù)與當前誤差 聯(lián)合計算出的當前被測量的最優(yōu)預(yù)測值。
首先大家要先理解什么是當前被測量的最優(yōu)預(yù)測值:
里面有兩個重要的概念,分別是 最優(yōu) 和 預(yù)測值 :
這意味著:
1、卡爾曼濾波的結(jié)果不是確確實實被測量出來的,而是利用公式計算出來的預(yù)測結(jié)果(并不是說預(yù)測結(jié)果就不好,測量還存在誤差呢?。?;
2、最優(yōu)是因為卡爾曼濾波考慮的非常多,它結(jié)合了四個參數(shù)對當前的被測量進行預(yù)測,所以效果比較好。
接下里大家要理解 歷史數(shù)據(jù)、歷史積累誤差、當前測量數(shù)據(jù)與當前誤差 的概念。
我會通過實例給大家講講這四個東西的概念。
卡爾曼濾波實例
假設(shè)我們現(xiàn)在在用超聲波測距離!現(xiàn)在是t時間,我們需要用t-1時間的距離來估計t時間的距離。
設(shè)在t-1時刻,超聲波的被測量的最優(yōu)預(yù)測值為50cm,而到t-1時刻的積累誤差3cm,你自己對預(yù)測的不確定誤差為4cm,那么在t-1時刻,其總誤差為(32+42)1/2=5cm。
在t時刻,超聲波測得的實際值53cm,測量誤差為2cm,那我們要怎么去相信上一時刻的預(yù)測值和這一時刻的實際值呢?因為二者都不是準的,我們可以利用誤差來計算。
因此,我們結(jié)合 歷史數(shù)據(jù)、歷史積累誤差、當前測量數(shù)據(jù)與當前誤差 來計算:
所以當前的最優(yōu)預(yù)測值為52.59。
卡爾曼濾波的python代碼實現(xiàn)
import numpy as np import matplotlib.pyplot as plt # Q為這一輪的心里的預(yù)估誤差 Q = 0.00001 # R為下一輪的測量誤差 R = 0.1 # Accumulated_Error為上一輪的估計誤差,具體呈現(xiàn)為所有誤差的累計 Accumulated_Error = 1 # 初始舊值 kalman_adc_old = 0 SCOPE = 50 def kalman(ADC_Value): global kalman_adc_old global Accumulated_Error # 新的值相比舊的值差太大時進行跟蹤 if (abs(ADC_Value-kalman_adc_old)/SCOPE > 0.25): Old_Input = ADC_Value*0.382 + kalman_adc_old*0.618 else: Old_Input = kalman_adc_old # 上一輪的 總誤差=累計誤差^2+預(yù)估誤差^2 Old_Error_All = (Accumulated_Error**2 + Q**2)**(1/2) # R為這一輪的預(yù)估誤差 # H為利用均方差計算出來的雙方的相信度 H = Old_Error_All**2/(Old_Error_All**2 + R**2) # 舊值 + 1.00001/(1.00001+0.1) * (新值-舊值) kalman_adc = Old_Input + H * (ADC_Value - Old_Input) # 計算新的累計誤差 Accumulated_Error = ((1 - H)*Old_Error_All**2)**(1/2) # 新值變?yōu)榕f值 kalman_adc_old = kalman_adc return kalman_adc array = np.array([50]*200) s = np.random.normal(0, 5, 200) test_array = array + s plt.plot(test_array) adc=[] for i in range(200): adc.append(kalman(test_array[i])) plt.plot(adc) plt.plot(array) plt.show()
實驗結(jié)果為:
以上就是卡爾曼濾波數(shù)據(jù)處理技巧通俗理解及python實現(xiàn)的詳細內(nèi)容,更多關(guān)于python卡爾曼濾波數(shù)據(jù)處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決安裝tensorflow遇到無法卸載numpy 1.8.0rc1的問題
今天小編就為大家分享一篇解決安裝tensorflow遇到無法卸載numpy 1.8.0rc1的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06如何在PyCharm中配置使用Anaconda環(huán)境
這篇文章主要介紹了如何在PyCharm中配置使用Anaconda環(huán)境,圖文講解寫的非常詳細簡單易懂,還不會的小伙伴快來看看吧2023-03-03Python之lambda匿名函數(shù)及map和filter的用法
今天小編就為大家分享一篇關(guān)于Python之lambda匿名函數(shù)及map和filter的用法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03