您好,登錄后才能下訂單哦!
這篇文章主要介紹“python怎么實(shí)現(xiàn)卡爾曼濾波數(shù)據(jù)處理”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“python怎么實(shí)現(xiàn)卡爾曼濾波數(shù)據(jù)處理”文章能幫助大家解決問(wèn)題。
先看看百度百科解釋哈:卡爾曼濾波(Kalman filtering)是一種利用線性系統(tǒng)狀態(tài)方程,通過(guò)系統(tǒng)輸入輸出觀測(cè)數(shù)據(jù),對(duì)系統(tǒng)狀態(tài)進(jìn)行最優(yōu)估計(jì)的算法。由于觀測(cè)數(shù)據(jù)中包括系統(tǒng)中的噪聲和干擾的影響,所以最優(yōu)估計(jì)也可看作是濾波過(guò)程。
重要的事說(shuō)三遍:
還不如不看!
還不如不看!!
還不如不看!??!
其實(shí)大家并不需要把卡爾曼濾波當(dāng)作一種很復(fù)雜的東西,用通俗的話來(lái)講,卡爾曼濾波算法只是一種 濾波算法,它的功能就是 濾波,濾波的作用就是減少噪聲與干擾對(duì)數(shù)據(jù)測(cè)量的影響。
接下來(lái)我會(huì)用一句話概括卡爾曼濾波的操作過(guò)程:
卡爾曼濾波是一種通過(guò) 歷史數(shù)據(jù)、歷史積累誤差、當(dāng)前測(cè)量數(shù)據(jù)與當(dāng)前誤差 聯(lián)合計(jì)算出的當(dāng)前被測(cè)量的最優(yōu)預(yù)測(cè)值。
首先大家要先理解什么是當(dāng)前被測(cè)量的最優(yōu)預(yù)測(cè)值:
里面有兩個(gè)重要的概念,分別是 最優(yōu) 和 預(yù)測(cè)值 :
這意味著:
1、卡爾曼濾波的結(jié)果不是確確實(shí)實(shí)被測(cè)量出來(lái)的,而是利用公式計(jì)算出來(lái)的預(yù)測(cè)結(jié)果(并不是說(shuō)預(yù)測(cè)結(jié)果就不好,測(cè)量還存在誤差呢!);
2、最優(yōu)是因?yàn)榭柭鼮V波考慮的非常多,它結(jié)合了四個(gè)參數(shù)對(duì)當(dāng)前的被測(cè)量進(jìn)行預(yù)測(cè),所以效果比較好。
接下里大家要理解 歷史數(shù)據(jù)、歷史積累誤差、當(dāng)前測(cè)量數(shù)據(jù)與當(dāng)前誤差 的概念。
我會(huì)通過(guò)實(shí)例給大家講講這四個(gè)東西的概念。
假設(shè)我們現(xiàn)在在用超聲波測(cè)距離!現(xiàn)在是t時(shí)間,我們需要用t-1時(shí)間的距離來(lái)估計(jì)t時(shí)間的距離。
設(shè)在t-1時(shí)刻,超聲波的被測(cè)量的最優(yōu)預(yù)測(cè)值為50cm,而到t-1時(shí)刻的積累誤差3cm,你自己對(duì)預(yù)測(cè)的不確定誤差為4cm,那么在t-1時(shí)刻,其總誤差為(32+42)1/2=5cm。
在t時(shí)刻,超聲波測(cè)得的實(shí)際值53cm,測(cè)量誤差為2cm,那我們要怎么去相信上一時(shí)刻的預(yù)測(cè)值和這一時(shí)刻的實(shí)際值呢?因?yàn)槎叨疾皇菧?zhǔn)的,我們可以利用誤差來(lái)計(jì)算。
因此,我們結(jié)合 歷史數(shù)據(jù)、歷史積累誤差、當(dāng)前測(cè)量數(shù)據(jù)與當(dāng)前誤差 來(lái)計(jì)算:
所以當(dāng)前的最優(yōu)預(yù)測(cè)值為52.59。
import numpy as np import matplotlib.pyplot as plt # Q為這一輪的心里的預(yù)估誤差 Q = 0.00001 # R為下一輪的測(cè)量誤差 R = 0.1 # Accumulated_Error為上一輪的估計(jì)誤差,具體呈現(xiàn)為所有誤差的累計(jì) Accumulated_Error = 1 # 初始舊值 kalman_adc_old = 0 SCOPE = 50 def kalman(ADC_Value): global kalman_adc_old global Accumulated_Error # 新的值相比舊的值差太大時(shí)進(jìn)行跟蹤 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 # 上一輪的 總誤差=累計(jì)誤差^2+預(yù)估誤差^2 Old_Error_All = (Accumulated_Error**2 + Q**2)**(1/2) # R為這一輪的預(yù)估誤差 # H為利用均方差計(jì)算出來(lái)的雙方的相信度 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) # 計(jì)算新的累計(jì)誤差 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()
實(shí)驗(yàn)結(jié)果為:
關(guān)于“python怎么實(shí)現(xiàn)卡爾曼濾波數(shù)據(jù)處理”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。