控制系統的測量訊號總是包含測量雜訊和其他擾動訊號。傳統的卡爾曼濾波器是一種線性濾波器,能處理測量值和受控量是線性關係的濾波過程,快速過濾訊號中的白雜訊,提高控制系統的穩定性和控制精度。卡爾曼濾波是時域估計方法,能對時變、非平穩訊號、多維訊號進行處理,不需要頻域變換,採用遞推演算法,運算量小,存貯量小,實現簡單。
卡爾曼有五個基本公式,前兩個是**公式,後三個是更新公式,卡爾曼就是通過計算**值和測量值的方差之比來估計**值和測量值佔真值的權重,即更相信哪個值。下面用通俗的說法說明一階卡爾曼公式。
用k-1
時刻的值來**當前
k時刻的狀態值
x(k|k-1)
和誤差協方差
p (k|k-1)
,(k|k-1)
表示用k-1
時刻的值來算
k時刻,表示是**的。
(k-1|k-1)
表示k-1
時刻的最優值。
(k|k)表示k
時刻的最優值,是最終需要得到的值。
**公式:
x(k|k-1)
=x(k-1|k-1)
假設每一時刻的值是不變化的。
p(k|k-1)
=p(k-1|k-1)+q
q是過程雜訊,代表測得**值的準確與否,要小
更新公式:
kg =p(k|k-1) /(p(k|k-1) +r)
r是測量雜訊,代表測量雜訊,即採集資料的波動
kg是卡爾曼增益。
r越小,
kg越大,表示越相信測量值,
kg代表相信測量值的程度
x(k|k) = (1 – kg) · x(k|k-1) + kg · z(k)
相信**值
1-kg
,相信測量值
kg。算出此刻的最優值
p(k|k) = (1 – kg) · p(k|k-1)
更新此刻的協方差。相信原來值的
1-kg
。 **和注釋如下:
n = 200;
x(1)=25;
for k = 2:n;
x(k) = 25+5*randn;
%25附近的乙個訊號,均方差是
5 end
klm.q =0.01;
過程雜訊
代表測得**值的準確與否,也就是模型一定要準確。要是你**和原來相差太多,就失去
了**的意義。這個值越小,濾波後的曲線越平穩
.一般來說,這個值是
adc自身的跳動。
klm.r =25;
測量雜訊
代表你測得不准,也就是說這個值應該和訊號的白雜訊方差差不多。這個值可以自適應.這個
值越大,濾波後的曲線越平穩。一般來說,這個值是訊號的跳動。初始時,
r=訊號方差。如
果方差越大,
r就要減少來適應。要更貼合上公升或者下降曲線
klm.x_last = x(1);
klm.p_last = 0;
klm.x_now(1)= x(1);
for t = 2:n;
klm.x_pre = klm.x_last;
klm.p_pre =klm.p_last + klm.q;
認為這個值不會變化,但實際會有這麼大的變化,
klm.kg
= klm.p_pre / (klm.p_pre + klm.r); r
是測量雜訊,如果
r很小,
kg就無限接近於
1,就認為測得的就是真實曲線。起不到
濾波的效果。代表**的值的方差佔總方差中的比例,也就是不相信**值的比
例,也就是相信測量值的比例
klm.x_now(t) = (1 - klm.kg) * klm.x_pre +klm.kg * x(t);
%真實值就等於相信
x(t) kg
,相信**值
1-kg
klm.p_now=
(1 - klm.kg) * klm.p_pre;
%**的
p裡面就有
1-kg
是可以被信任的。
klm.p_last =klm.p_now;
klm.x_last = klm.x_now(t);
endt=1:n;
plot(t,x,'r',t,klm.x_now);holdon;
結果如下:
濾波後的值大約是
25,很接近真值,說明卡爾曼濾波是起作用的。
klm.q = 0.01;
q是過程雜訊,代表測得**值的準確與否,也就是模型一定要準確。要是你**和原來相差太多,就失去了**的意義。這個值越小,濾波後的曲線越平穩。越大,越接近測量曲線。一般來說,這個值是
adc自身的跳動。
q = 0
時代表你**
100%
準確,曲線就是一條水平線。
klm.r = 25;
r測量雜訊,代表你測得不准,也就是說這個值應該和訊號的白雜訊方差差不多。這個值可以自適應,這個值越大,濾波後的曲線越平穩,越小越接近測量曲線。一般來說,這個值是訊號的方差。初始時,
r=訊號方差。如果方差越大,
r就要減少來適應,要更貼合上公升或者下降曲線。
q = 0:0.05:1
r = 25
曲線如圖
所示:
q = 0
時,為中間的水平線,**完全正確,濾波器輸出的值一直都是初始值25。
逐漸增大的過程中,濾波後的曲線越來越接近測量曲線。
這個值取小一些比較好,根據實際情況而定,可以是測量工具本身的誤差。比如
adc採集乙個雜訊很小的固定電壓有一定的波動,
q等於這個波動的方差
。或者除錯時,逐個試一下,從小到大試。
q = 0.01
r = 0:5:50
曲線如圖
所示:
r= 0
時,無濾波作用,輸出就是測量曲線,表示測量得完全不准,濾波器一點都不相信它測量的值。
r逐漸減小的過程中,濾波後的曲線越來越接近測量曲線。這個值並不是越大越好,越大曲線越平滑,對響應不敏感;
r越小曲線越接近測量值,
vod調節越頻繁,但響應快。
這個值取大一些比較好,根據實際情況而定,通常是先計算
200個測量點的方差,取這個方差作為初始r
。或者除錯時,逐個試一下,從大到小除錯。
建立乙個
kalman
結構體;
typedef structkalman;
kalman klm;
unsigned long
kal_man
(unsigned long
res)//
採集值
提前對klm.x_last
賦值乙個測量值,
klm.p_last
賦值乙個比較小的值,但不能為
0.
一階規則學習
受限於命題邏輯表達能力,命題規則學習難以處理物件之間的關係 relation 而關係資訊再很多任務中是很重要的,要用一階邏輯表示,使用一階規則學習。描述了樣例間關係的資料稱為關係資料 relational data 有原樣本屬性轉化而來的原子公式稱為背景知識 backgroundknowledge ...
學習卡爾曼濾波
偶然機會想學學 最起碼知道一下 卡爾曼濾波,以前學人工智慧課程學過濾波演算法,但是老師只是提了一下有這個東西,一直不知道如何用它來解決問題。1,參考資料 http www.cs.unc.edu welch kalman 裡面有乙個 an introduction to the kalman filt...
卡爾曼濾波學習
clear clc f 1 1 0 1 b 0.5 1 h 0 1 x 10 10 初始狀態 u 1 加速度 p 1 0 0 1 初始協方差矩陣 q 0.001 0 0 0.001 z 1 1000 測量值,勻加速運動 noise 15 randn 1,1000 測量雜訊100個 z z noise...