卡爾曼濾波數據處理技巧通俗理解及python實現_第1頁
卡爾曼濾波數據處理技巧通俗理解及python實現_第2頁
卡爾曼濾波數據處理技巧通俗理解及python實現_第3頁
卡爾曼濾波數據處理技巧通俗理解及python實現_第4頁
卡爾曼濾波數據處理技巧通俗理解及python實現_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第卡爾曼濾波數據處理技巧通俗理解及python實現目錄學習前言什么是卡爾曼濾波卡爾曼濾波是怎么濾波的卡爾曼濾波實例卡爾曼濾波的python代碼實現

學習前言

好久沒用過arduino了,接下去要用arduino和超聲波做個小實驗,對于讀取的模擬量肯定要進行濾波呀,不然這模擬量咋咋呼呼的怎么用

什么是卡爾曼濾波

先看看百度百科解釋哈:卡爾曼濾波(Kalmanfiltering)是一種利用線性系統狀態方程,通過系統輸入輸出觀測數據,對系統狀態進行最優估計的算法。由于觀測數據中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。

重要的事說三遍:

還不如不看!

還不如不看!!

還不如不看!!!

其實大家并不需要把卡爾曼濾波當作一種很復雜的東西,用通俗的話來講,卡爾曼濾波算法只是一種濾波算法,它的功能就是濾波,濾波的作用就是減少噪聲與干擾對數據測量的影響。

卡爾曼濾波是怎么濾波的

接下來我會用一句話概括卡爾曼濾波的操作過程:

卡爾曼濾波是一種通過歷史數據、歷史積累誤差、當前測量數據與當前誤差聯合計算出的當前被測量的最優預測值。

首先大家要先理解什么是當前被測量的最優預測值:

里面有兩個重要的概念,分別是最優和預測值:

這意味著:

1、卡爾曼濾波的結果不是確確實實被測量出來的,而是利用公式計算出來的預測結果(并不是說預測結果就不好,測量還存在誤差呢!);

2、最優是因為卡爾曼濾波考慮的非常多,它結合了四個參數對當前的被測量進行預測,所以效果比較好。

接下里大家要理解歷史數據、歷史積累誤差、當前測量數據與當前誤差的概念。

我會通過實例給大家講講這四個東西的概念。

卡爾曼濾波實例

假設我們現在在用超聲波測距離!現在是t時間,我們需要用t-1時間的距離來估計t時間的距離。

設在t-1時刻,超聲波的被測量的最優預測值為50cm,而到t-1時刻的積累誤差3cm,你自己對預測的不確定誤差為4cm,那么在t-1時刻,其總誤差為(32+42)1/2=5cm。

在t時刻,超聲波測得的實際值53cm,測量誤差為2cm,那我們要怎么去相信上一時刻的預測值和這一時刻的實際值呢?因為二者都不是準的,我們可以利用誤差來計算。

因此,我們結合歷史數據、歷史積累誤差、當前測量數據與當前誤差來計算:

所以當前的最優預測值為52.59。

卡爾曼濾波的python代碼實現

importnumpyasnp

importmatplotlib.pyplotasplt

#Q為這一輪的心里的預估誤差

Q=0.00001

#R為下一輪的測量誤差

R=0.1

#Accumulated_Error為上一輪的估計誤差,具體呈現為所有誤差的累計

Accumulated_Error=1

#初始舊值

kalman_adc_old=0

SCOPE=50

defkalman(ADC_Value):

globalkalman_adc_old

globalAccumulated_Error

#新的值相比舊的值差太大時進行跟蹤

if(abs(ADC_Value-kalman_adc_old)/SCOPE0.25):

Old_Input=ADC_Value*0.382+kalman_adc_old*0.618

else:

Old_Input=kalman_adc_old

#上一輪的總誤差=累計誤差^2+預估誤差^2

Old_Error_All=(Accumulated_Error**2+Q**2)**(1/2)

#R為這一輪的預估誤差

#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)

#新值變為舊值

kalman_adc_old=kalman_adc

returnkalman_adc

array=np.array([50]*200)

s=np.random.normal(0,5,200)

test_array=array+s

plt.plot(test_array)

adc=[]

foriinrange(200):

adc.append(kalman(test_array[i]))

plt.plot(adc)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論