一階卡爾曼學習記錄

2021-08-19 04:28:50 字數 3639 閱讀 4019

控制系統的測量訊號總是包含測量雜訊和其他擾動訊號。傳統的卡爾曼濾波器是一種線性濾波器,能處理測量值和受控量是線性關係的濾波過程,快速過濾訊號中的白雜訊,提高控制系統的穩定性和控制精度。卡爾曼濾波是時域估計方法,能對時變、非平穩訊號、多維訊號進行處理,不需要頻域變換,採用遞推演算法,運算量小,存貯量小,實現簡單。

卡爾曼有五個基本公式,前兩個是**公式,後三個是更新公式,卡爾曼就是通過計算**值和測量值的方差之比來估計**值和測量值佔真值的權重,即更相信哪個值。下面用通俗的說法說明一階卡爾曼公式。

用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...