版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C+/C/MATLAB)卡爾曼濾波器簡(jiǎn)介 近來(lái)發(fā)現(xiàn)有些問(wèn)題很多人都很感興趣。所以在這里希望能盡自己能力跟大家討論一些力所能及的算法?,F(xiàn)在先討論一下卡爾曼濾波器,如果時(shí)間和能力允許,我還希望能夠?qū)憣?xiě)其他的算法,例如遺傳算法,傅立葉變換,數(shù)字濾波,神經(jīng)網(wǎng)絡(luò),圖像處理等等。因?yàn)檫@里不能寫(xiě)復(fù)雜的數(shù)學(xué)公式,所以也只能形象的描述。希望如果哪位是這方面的專家,歡迎討論更正。卡爾曼濾波器 Kalman Filter1 什么是卡爾曼濾波器(What is the Kalman Filter?)在學(xué)習(xí)卡爾曼濾波
2、器之前,首先看看為什么叫“卡爾曼”。跟其他著名的理論(例如傅立葉變換,泰勒級(jí)數(shù)等等)一樣,卡爾曼也是一個(gè)人的名字,而跟他們不同的是,他是個(gè)現(xiàn)代人!卡爾曼全名Rudolf Emil Kalman,匈牙利數(shù)學(xué)家,1930年出生于匈牙利首都布達(dá)佩斯。1953,1954年于麻省理工學(xué)院分別獲得電機(jī)工程學(xué)士及碩士學(xué)位。1957年于哥倫比亞大學(xué)獲得博士學(xué)位。我們現(xiàn)在要學(xué)習(xí)的卡爾曼濾波器,正是源于他的博士論文和1960年發(fā)表的論文A New Approach to Linear Filtering and Prediction Problems(線性濾波與預(yù)測(cè)問(wèn)題的新方法)。如果對(duì)這編論文有興趣,可以到這里
3、的地址下載: /welch/media/pdf/Kalman1960.pdf。 簡(jiǎn)單來(lái)說(shuō),卡爾曼濾波器是一個(gè)“optimal recursive data processing algorithm(最優(yōu)化自回歸數(shù)據(jù)處理算法)”。對(duì)于解決很大部分的問(wèn)題,他是最優(yōu),效率最高甚至是最有用的。他的廣泛應(yīng)用已經(jīng)超過(guò)30年,包括機(jī)器人導(dǎo)航,控制,傳感器數(shù)據(jù)融合甚至在軍事方面的雷達(dá)系統(tǒng)以及導(dǎo)彈追蹤等等。近年來(lái)更被應(yīng)用于計(jì)算機(jī)圖像處理,例如頭臉識(shí)別,圖像分割,圖像邊緣檢測(cè)等等。2卡爾曼濾波器的介紹(Introduction to the Kalman Filter)為了
4、可以更加容易的理解卡爾曼濾波器,這里會(huì)應(yīng)用形象的描述方法來(lái)講解,而不是像大多數(shù)參考書(shū)那樣羅列一大堆的數(shù)學(xué)公式和數(shù)學(xué)符號(hào)。但是,他的5條公式是其核心內(nèi)容。結(jié)合現(xiàn)代的計(jì)算機(jī),其實(shí)卡爾曼的程序相當(dāng)?shù)暮?jiǎn)單,只要你理解了他的那5條公式。在介紹他的5條公式之前,先讓我們來(lái)根據(jù)下面的例子一步一步的探索。假設(shè)我們要研究的對(duì)象是一個(gè)房間的溫度。根據(jù)你的經(jīng)驗(yàn)判斷,這個(gè)房間的溫度是恒定的,也就是下一分鐘的溫度等于現(xiàn)在這一分鐘的溫度(假設(shè)我們用一分鐘來(lái)做時(shí)間單位)。假設(shè)你對(duì)你的經(jīng)驗(yàn)不是100%的相信,可能會(huì)有上下偏差幾度。我們把這些偏差看成是高斯白噪聲(White Gaussian Noise),也就是這些偏差跟前后
5、時(shí)間是沒(méi)有關(guān)系的而且符合高斯分配(Gaussian Distribution)。另外,我們?cè)诜块g里放一個(gè)溫度計(jì),但是這個(gè)溫度計(jì)也不準(zhǔn)確的,測(cè)量值會(huì)比實(shí)際值偏差。我們也把這些偏差看成是高斯白噪聲。好了,現(xiàn)在對(duì)于某一分鐘我們有兩個(gè)有關(guān)于該房間的溫度值:你根據(jù)經(jīng)驗(yàn)的預(yù)測(cè)值(系統(tǒng)的預(yù)測(cè)值)和溫度計(jì)的值(測(cè)量值)。下面我們要用這兩個(gè)值結(jié)合他們各自的噪聲來(lái)估算出房間的實(shí)際溫度值。假如我們要估算k時(shí)刻的是實(shí)際溫度值。首先你要根據(jù)k-1時(shí)刻的溫度值,來(lái)預(yù)測(cè)k時(shí)刻的溫度。因?yàn)槟阆嘈艤囟仁呛愣ǖ模阅銜?huì)得到k時(shí)刻的溫度預(yù)測(cè)值是跟 k-1時(shí)刻一樣的,假設(shè)是23度,同時(shí)該值的高斯噪聲的偏差是5度(5是這樣得到的:如
6、果k-1時(shí)刻估算出的最優(yōu)溫度值的偏差是3,你對(duì)自己預(yù)測(cè)的不確定度是4度,他們平方相加再開(kāi)方,就是5)。然后,你從溫度計(jì)那里得到了k時(shí)刻的溫度值,假設(shè)是25度,同時(shí)該值的偏差是4度。由于我們用于估算k時(shí)刻的實(shí)際溫度有兩個(gè)溫度值,分別是23度和25度。究竟實(shí)際溫度是多少呢?相信自己還是相信溫度計(jì)呢?究竟相信誰(shuí)多一點(diǎn),我們可以用他們的 covariance(協(xié)方差)來(lái)判斷。因?yàn)镵g2=52/(52+42),所以Kg=0.78,我們可以估算出k時(shí)刻的實(shí)際溫度值是:23+0.78* (25-23)=24.56度??梢钥闯?,因?yàn)闇囟扔?jì)的covariance比較小(比較相信溫度計(jì)),所以估算出的最優(yōu)溫度值偏
7、向溫度計(jì)的值?,F(xiàn)在我們已經(jīng)得到k時(shí)刻的最優(yōu)溫度值了,下一步就是要進(jìn)入k+1時(shí)刻,進(jìn)行新的最優(yōu)估算。到現(xiàn)在為止,好像還沒(méi)看到什么自回歸的東西出現(xiàn)。對(duì)了,在進(jìn)入 k+1時(shí)刻之前,我們還要算出k時(shí)刻那個(gè)最優(yōu)值(24.56度)的偏差。算法如下:(1-Kg)*52)0.5=2.35。這里的5就是上面的k時(shí)刻你預(yù)測(cè)的那個(gè)23度溫度值的偏差,得出的2.35就是進(jìn)入k+1時(shí)刻以后k時(shí)刻估算出的最優(yōu)溫度值的偏差(對(duì)應(yīng)于上面的3)。就是這樣,卡爾曼濾波器就不斷的把covariance遞歸,從而估算出最優(yōu)的溫度值。他運(yùn)行的很快,而且它只保留了上一時(shí)刻的covariance。上面的Kg,就是卡爾曼增益(Kalman
8、Gain)。他可以隨不同的時(shí)刻而改變他自己的值,是不是很神奇!下面就要言歸正傳,討論真正工程系統(tǒng)上的卡爾曼。3 卡爾曼濾波器算法(The Kalman Filter Algorithm)在這一部分,我們就來(lái)描述源于Dr Kalman 的卡爾曼濾波器。下面的描述,會(huì)涉及一些基本的概念知識(shí),包括概率(Probability),隨即變量(Random Variable),高斯或正態(tài)分配(Gaussian Distribution)還有State-space Model等等。但對(duì)于卡爾曼濾波器的詳細(xì)證明,這里不能一一描述。首先,我們先要引入一個(gè)離散控制過(guò)程
9、的系統(tǒng)。該系統(tǒng)可用一個(gè)線性隨機(jī)微分方程(Linear Stochastic Difference equation)來(lái)描述:X(k)=A X(k-1)+B U(k)+W(k) 再加上系統(tǒng)的測(cè)量值:Z(k)=H X(k)+V(k) 上兩式子中,X(k)是k時(shí)刻的系統(tǒng)狀態(tài),U(k)是k時(shí)刻對(duì)系統(tǒng)的控制量。A和B是系統(tǒng)參數(shù),對(duì)于多模型系統(tǒng),他們?yōu)榫仃?。Z(k)是k時(shí)刻的測(cè)量值,H 是測(cè)量系統(tǒng)的參數(shù),對(duì)于多測(cè)量系統(tǒng),H為矩陣。W(k)和V(k)分別表示過(guò)程和測(cè)量的噪聲。他們被假設(shè)成高斯白噪聲(White Gaussian Noise),他們的covariance 分別是Q,R(這里我們假設(shè)他們不隨系統(tǒng)
10、狀態(tài)變化而變化)。對(duì)于滿足上面的條件(線性隨機(jī)微分系統(tǒng),過(guò)程和測(cè)量都是高斯白噪聲),卡爾曼濾波器是最優(yōu)的信息處理器。下面我們來(lái)用他們結(jié)合他們的covariances 來(lái)估算系統(tǒng)的最優(yōu)化輸出(類似上一節(jié)那個(gè)溫度的例子)。首先我們要利用系統(tǒng)的過(guò)程模型,來(lái)預(yù)測(cè)下一狀態(tài)的系統(tǒng)。假設(shè)現(xiàn)在的系統(tǒng)狀態(tài)是k,根據(jù)系統(tǒng)的模型,可以基于系統(tǒng)的上一狀態(tài)而預(yù)測(cè)出現(xiàn)在狀態(tài):X(k|k-1)=A X(k-1|k-1)+B U(k) . (1)式(1)中,X(k|k-1)是利用上一狀態(tài)預(yù)測(cè)的結(jié)果,X(k-1|k-1)是上一狀態(tài)最優(yōu)的結(jié)果,U(k)為現(xiàn)在狀態(tài)的控制量,如果沒(méi)有控制量,它可以為0。到現(xiàn)在為止,我們的系統(tǒng)結(jié)果已經(jīng)
11、更新了,可是,對(duì)應(yīng)于X(k|k-1)的covariance還沒(méi)更新。我們用P表示covariance:P(k|k-1)=A P(k-1|k-1) A+Q (2)式 (2)中,P(k|k-1)是X(k|k-1)對(duì)應(yīng)的covariance,P(k-1|k-1)是X(k-1|k-1)對(duì)應(yīng)的 covariance,A表示A的轉(zhuǎn)置矩陣,Q是系統(tǒng)過(guò)程的covariance。式子1,2就是卡爾曼濾波器5個(gè)公式當(dāng)中的前兩個(gè),也就是對(duì)系統(tǒng)的預(yù)測(cè)?,F(xiàn)在我們有了現(xiàn)在狀態(tài)的預(yù)測(cè)結(jié)果,然后我們?cè)偈占F(xiàn)在狀態(tài)的測(cè)量值。結(jié)合預(yù)測(cè)值和測(cè)量值,我們可以得到現(xiàn)在狀態(tài)(k)的最優(yōu)化估算值X(k|k):X(k|k)= X(k|k-1
12、)+Kg(k)*(Z(k)-H X(k|k-1) (3)其中Kg為卡爾曼增益(Kalman Gain):Kg(k)= P(k|k-1) H / (H P(k|k-1) H + R) (4)到現(xiàn)在為止,我們已經(jīng)得到了k狀態(tài)下最優(yōu)的估算值X(k|k)。但是為了要另卡爾曼濾波器不斷的運(yùn)行下去直到系統(tǒng)過(guò)程結(jié)束,我們還要更新k狀態(tài)下X(k|k)的covariance:P(k|k)=(I-Kg(k) H)P(k|k-1) (5)其中I 為1的矩陣,對(duì)于單模型單測(cè)量,I=1。當(dāng)系統(tǒng)進(jìn)入k+1狀態(tài)時(shí),P(k|k)就是式子(2)的P(k-1|k-1)。這樣,算法就可以自回歸的運(yùn)算下去??柭鼮V波器的原理基本描述
13、了,式子1,2,3,4和5就是他的5 個(gè)基本公式。根據(jù)這5個(gè)公式,可以很容易的實(shí)現(xiàn)計(jì)算機(jī)的程序。下面,我會(huì)用程序舉一個(gè)實(shí)際運(yùn)行的例子。4 簡(jiǎn)單例子(A Simple Example)這里我們結(jié)合第二第三節(jié),舉一個(gè)非常簡(jiǎn)單的例子來(lái)說(shuō)明卡爾曼濾波器的工作過(guò)程。所舉的例子是進(jìn)一步描述第二節(jié)的例子,而且還會(huì)配以程序模擬結(jié)果。根據(jù)第二節(jié)的描述,把房間看成一個(gè)系統(tǒng),然后對(duì)這個(gè)系統(tǒng)建模。當(dāng)然,我們見(jiàn)的模型不需要非常地精確。我們所知道的這個(gè)房間的溫度是跟前一時(shí)刻的溫度相同的,所以A=1。沒(méi)有控制量,所以U(k)=0。因此得出:X(k|k-1)=X(k-1|k-1)
14、 . (6)式子(2)可以改成:P(k|k-1)=P(k-1|k-1) +Q (7)因?yàn)闇y(cè)量的值是溫度計(jì)的,跟溫度直接對(duì)應(yīng),所以H=1。式子3,4,5可以改成以下:X(k|k)= X(k|k-1)+Kg(k)*(Z(k)-X(k|k-1) (8)Kg(k)= P(k|k-1) / (P(k|k-1) + R) (9)P(k|k)=(1-Kg(k))P(k|k-1) (10)現(xiàn)在我們模擬一組測(cè)量值作為輸入。假設(shè)房間的真實(shí)溫度為25度,我模擬了200個(gè)測(cè)量值,這些測(cè)量值的平均值為25度,但是加入了標(biāo)準(zhǔn)偏差為幾度的高斯白噪聲(在圖中為藍(lán)線)。為了令卡爾曼濾波器開(kāi)始工作,我們需要告訴卡爾曼兩個(gè)零時(shí)刻的
15、初始值,是X(0|0)和P(0|0)。他們的值不用太在意,隨便給一個(gè)就可以了,因?yàn)殡S著卡爾曼的工作,X會(huì)逐漸的收斂。但是對(duì)于P,一般不要取0,因?yàn)檫@樣可能會(huì)令卡爾曼完全相信你給定的X(0|0)是系統(tǒng)最優(yōu)的,從而使算法不能收斂。我選了 X(0|0)=1度,P(0|0)=10。該系統(tǒng)的真實(shí)溫度為25度,圖中用黑線表示。圖中紅線是卡爾曼濾波器輸出的最優(yōu)化結(jié)果(該結(jié)果在算法中設(shè)置了Q=1e-6,R=1e-1)。最佳線性濾波理論起源于 40 年代美國(guó)科學(xué)家 Wiener 和前蘇聯(lián)科學(xué)家 等人的研究工作,后人統(tǒng)稱為維納濾波理論。從理論上說(shuō),維納濾波的最大缺點(diǎn)是必須用到無(wú)限過(guò)去的數(shù)據(jù),不適用于實(shí)時(shí)處理。為了
16、克服這一缺點(diǎn), 60 年代 Kalman 把狀態(tài)空間模型引入濾波理論,并導(dǎo)出了一套遞推估計(jì)算法,后人稱之為卡爾曼濾波理論??柭鼮V波是以最小均方誤差為估計(jì)的最佳準(zhǔn)則,來(lái)尋求一套遞推估計(jì)的算法,其基本思想是:采用信號(hào)與噪聲的狀態(tài)空間模型,利用前一時(shí)刻地估計(jì)值和現(xiàn)時(shí)刻的觀測(cè)值來(lái)更新對(duì)狀態(tài)變量的估計(jì),求出現(xiàn)時(shí)刻的估計(jì)值。它適合于實(shí)時(shí)處理和計(jì)算機(jī)運(yùn)算。 現(xiàn)設(shè)線性時(shí)變系統(tǒng)的離散狀態(tài)防城和觀測(cè)方程為: X(k) = F(k,k-1)·X(k-1)+T(k,k-1)·U(k-1) Y(k) = H(k)·X(k)+N(k) 其中,X(k)和Y(k)分別是k時(shí)刻的狀態(tài)
17、矢量和觀測(cè)矢量 F(k,k-1)為狀態(tài)轉(zhuǎn)移矩陣 U(k)為k時(shí)刻動(dòng)態(tài)噪聲 T(k,k-1)為系統(tǒng)控制矩陣 H(k)為k時(shí)刻觀測(cè)矩陣 N(k)為k時(shí)刻觀測(cè)噪聲 則卡爾曼濾波的算法流程為: 預(yù)估計(jì)X(k)= F(k,k-1)·X(k-1) 1. 計(jì)算預(yù)估計(jì)協(xié)方差矩陣C(k)=F(k,k-1)×C(k)×F(k,k-1)'+T(k,k-1)×Q(k)×T(k,k-1)'Q(k) = U(k)×U(k)' 2. 計(jì)算卡爾曼增益矩陣K(k) = C(k)×H(k)'
18、×H(k)×C(k)×H(k)'+R(k)(-1)R(k) = N(k)×N(k)' 3. 更新估計(jì)X(k)=X(k)+K(k)×Y(k)-H(k)×X(k) 4. 計(jì)算更新后估計(jì)協(xié)防差矩陣C(k) = I-K(k)×H(k)×C(k)×I-K(k)×H(k)'+K(k)×R(k)×K(k)' 5. X(k+1) = X(k)C(k+1) = C(k)重復(fù)以上步驟 atlab實(shí)現(xiàn)代碼此碼為本人原創(chuàng),僅供交流,
19、謝決轉(zhuǎn)載!*% Constant Velocity Model Kalman Filter Simulation %=clear all; close all; clc;% Initial condition 初始條件ts = 1; % Sampling timet = 0:ts:100;T = length(t);%T表示t的長(zhǎng)度101% Initial state 初始狀態(tài)x = 0 40 0 20' x_hat = 0 0 0 0'% Process noise covariance 預(yù)測(cè)噪聲的協(xié)方差q = 5Q = q*eye(2);% Measurement nois
20、e covariance 測(cè)量噪聲的協(xié)方差r = 5R = r*eye(2);% Process and measurement noise 預(yù)測(cè)以及測(cè)量的噪聲w = sqrt(Q)*randn(2,T); % Process noisev = sqrt(R)*randn(2,T); % Measurement noise% Estimate error covariance initialization 預(yù)測(cè)協(xié)方差初始化p = 5;P(:,:,1) = p*eye(4);%= % Continuous-time state space mode
21、l 狀態(tài)空間模型%x_dot(t) = Ax(t)+Bu(t)z(t) = Cx(t)+Dn(t)%A = 0 1 0 0; 0 0 0 0; 0 0 0 1; 0 0 0 0;B = 0 0; 1 0; 0 0;
22、 0 1;C = 1 0 0 0; 0 0 1 0;D = 1 0; 0 1;% Discrete-time state space model 離散狀態(tài)模型%x(k+1) = Fx(k)+Gw(k)z(k) = Hx(k)+Iv(k)Continuous to discrete form by zoh 連續(xù)轉(zhuǎn)為離散%sysc = ss(A,B,C,D);sysd = c2d(sysc, ts, '
23、;zoh');F G H I = ssdata(sysd);% Practice state of targetfor i = 1:T-1 x(:,i+1) = F*x(:,i);endx = x+G*w; % State variable with noisez = H*x+I*v; % Measurement value with noise%= % Kalman Filter for i = 1:T-1 % Prediction phase
24、; x_hat(:,i+1) = F*x_hat(:,i); % State estimate predict 預(yù)測(cè)模型 P(:,:,i+1) = F*P(:,:,i)*F'+G*Q*G' % Tracking error covariance predict 預(yù)測(cè)協(xié)方差 P_predict
25、ed(:,:,i+1) = P(:,:,i+1); % Kalman gain 卡爾曼增益 K = P(:,:,i+1)*H'*inv(H*P(:,:,i+1)*H'+R); % Updata step 狀態(tài)更新 x_hat(:,i+1) = x_hat(:,i+1)+K*(z(:,i+1)-H*x_hat(:,i+1);
26、60; % State estimate update 協(xié)方差更新 P(:,:,i+1) = P(:,:,i+1)-K*H*P(:,:,i+1); % Tracking error cov
27、ariance update P_updated(:,:,i+1) = P(:,:,i+1); end%=% Estimate error 預(yù)測(cè)錯(cuò)誤差值 x_error = x-
28、x_hat;% Graph 1 practical and tracking position figure(1)plot(x(1,:),x(3,:),'r');hold on;plot(x_hat(1,:),x_hat(3,:),'g.');title('2D Target Position')legend('Practical Position','Tracking Position')xlabel('X axis m')ylabel('Y axis m')hold off;%
29、Graph 2 figure(2) plot(t,x(1,:),grid on;hold on;plot(t,x_hat(1,:),'r'),grid on;title('Practical and Tracking Position on X axis')legend('Practical Position','Tracking Position')xlabel('Time sec')ylabel('Position m')hold off;% Graph 3figure(3) plot(t,x_
30、error(1,:),grid on;title('Position Error on X axis')xlabel('Time sec')ylabel('Position RMSE m')hold off;% Graph 4figure(4)plot(t,x(2,:),grid on;hold on;plot(t,x_hat(2,:),'r'),grid on;title('Practical and Tracking Velocity on X axis')legend('Practical Veloc
31、ity','Tracking Velocity')xlabel('Time sec')ylabel('Velocity m/sec')hold off;% Graph 5figure(5)plot(t,x_error(2,:),grid on;title('Velocity Error on X axis')xlabel('Time sec')ylabel('Velocity RMSE m/sec')hold off;%=*c語(yǔ)言實(shí)現(xiàn)代碼轉(zhuǎn)-#include "stdlib.h&q
32、uot;#include "rinv.c"int lman(n,m,k,f,q,r,h,y,x,p,g)int n,m,k;double f,q,r,h,y,x,p,g; int i,j,kk,ii,l,jj,js; double *e,*a,*b; e=malloc(m*m*sizeof(double); l=m; if (l<n) l=n; a=malloc(l*l*sizeof(dou
33、ble); b=malloc(l*l*sizeof(double); for (i=0; i<=n-1; i+) for (j=0; j<=n-1; j+) ii=i*l+j; aii=0.0; for (kk=0; kk<=n-1; kk+) &
34、#160; aii=aii+pi*n+kk*fj*n+kk; for (i=0; i<=n-1; i+) for (j=0; j<=n-1; j+) ii=i*n+j; pii=qii;
35、160; for (kk=0; kk<=n-1; kk+) pii=pii+fi*n+kk*akk*l+j; for (ii=2; ii<=k; ii+) for (i=0; i<=n-1; i+
36、) for (j=0; j<=m-1; j+) jj=i*l+j; ajj=0.0; for (kk=0; kk<=n-1; kk+)
37、; ajj=ajj+pi*n+kk*hj*n+kk; for (i=0; i<=m-1; i+) for (j=0; j<=m-1; j+) jj=i*m+j; ejj=rjj;
38、 for (kk=0; kk<=n-1; kk+) ejj=ejj+hi*n+kk*akk*l+j; js=ri
39、nv(e,m); if (js=0) free(e); free(a); free(b); return(js); for (i=0; i<=n-1; i+) for (j=0; j<=m-1; j+)
40、 jj=i*m+j; gjj=0.0; for (kk=0; kk<=m-1; kk+) gjj=gjj+ai*l+kk*ej*m+kk;
41、 for (i=0; i<=n-1; i+) jj=(ii-1)*n+i; xjj=0.0; for (j=0; j<=n-1; j+)
42、60; xjj=xjj+fi*n+j*x(ii-2)*n+j; for (i=0; i<=m-1; i+) jj=i*l; bjj=y(ii-1)*m+i;
43、160; for (j=0; j<=n-1; j+) bjj=bjj-hi*n+j*x(ii-1)*n+j; for (i=0; i<=n-1; i+) &
44、#160; jj=(ii-1)*n+i; for (j=0; j<=m-1; j+) xjj=xjj+gi*m+j*bj*l;
45、; if (ii<k) for (i=0; i<=n-1; i+) for (j=0; j<=n-1; j+) jj=i*l+
46、j; ajj=0.0; for (kk=0; kk<=m-1; kk+) ajj=ajj-gi*m+kk*hkk*n+j;
47、160; if (i=j) ajj=1.0+ajj; for (i=0; i<=n-1; i+)
48、160; for (j=0; j<=n-1; j+) jj=i*l+j; bjj=0.0; for (kk=0; kk<=n-1; kk+)
49、160; bjj=bjj+ai*l+kk*pkk*n+j; for (i=0; i<=n-1; i+)
50、; for (j=0; j<=n-1; j+) jj=i*l+j; ajj=0.0; for (kk=0; kk<=n-1; kk+)
51、; ajj=ajj+bi*l+kk*fj*n+kk; for (i=0; i<=n-1; i+)
52、160; for (j=0; j<=n-1; j+) jj=i*n+j; pjj=qjj; for (kk=0; kk<=n-1; kk+)
53、160; pjj=pjj+fi*n+kk*aj*l+kk; free(e); free(a); free(b); &
54、#160; return(js);*C+實(shí)現(xiàn)代碼轉(zhuǎn)-/ kalman.h: interface for the kalman class./#if !defined(AFX_KALMAN_H_ED3D740F_01D2_4616_8B74_8BF57636F2C0_INCLUDED_)#define AFX_KALMAN_H_ED3D740F_01D2_4616_8B74_8BF57636F2C0_INCLUDED_#if _MSC_VER > 1000#pragma once#endif / _MSC_VER > 1000#include <math.h>#inclu
55、de "cv.h"class kalman public:void init_kalman(int x,int xv,int y,int yv);CvKalman* cvkalman;CvMat* state; CvMat* process_noise;CvMat* measurement;const CvMat* prediction;CvPoint2D32f get_predict(float x, float y);kalman(int x=0,int xv=0,int y=0,int yv=0);/virtual kalman();#endif / !defined
56、(AFX_KALMAN_H_ED3D740F_01D2_4616_8B74_8BF57636F2C0_INCLUDED_)=kalman.cpp=#include "kalman.h"#include <stdio.h>/* tester de printer toutes les valeurs des vecteurs*/* tester de changer les matrices du noises */* replace state by cvkalman->state_post ? */CvRandState rng;const double
57、 T = 0.1;kalman:kalman(int x,int xv,int y,int yv) cvkalman = cvCreateKalman( 4, 4, 0 ); state = cvCreateMat( 4, 1, CV_32FC1 ); process_noise = cvCreateMat( 4, 1, CV_32FC1 ); measurement = cvCreateMat( 4,
58、 1, CV_32FC1 ); int code = -1; /* create matrix data */ const float A = 1, T, 0, 0, 0, 1, 0, 0, 0, 0, 1, T, 0, 0, 0, 1; con
59、st float H = 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0; const float P = pow(320,2), pow(320,2)/T, 0, 0, pow(320,2)/T, pow(320,2)/pow(T,2), 0,
60、0, 0, 0, pow(240,2), pow(240,2)/T, 0, 0, pow(240,2)/T, pow(240,2)/pow(T,2) ; const float Q = pow(T,3)/3, pow(T,2)/2, 0, 0, pow(T,2)/2, T, 0, 0, 0, 0, pow(T,3)/3, pow(T,2)/2, 0, 0, pow(T
61、,2)/2, T ; const float R = 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ; cvRandInit( &rng, 0, 1, -1, CV_RAND_UNI );
62、 cvZero( measurement ); cvRandSetRange( &rng, 0, 0.1, 0 ); rng.disttype = CV_RAND_NORMAL; cvRand( &rng, state ); memcpy( cvkalman->transition_matrix->data.fl, A, sizeof(A); memc
63、py( cvkalman->measurement_matrix->data.fl, H, sizeof(H); memcpy( cvkalman->process_noise_cov->data.fl, Q, sizeof(Q); memcpy( cvkalman->error_cov_post->data.fl, P, sizeof(P); memcpy( cvkalman->measurement_noise_cov->data.fl
64、, R, sizeof(R); /cvSetIdentity( cvkalman->process_noise_cov, cvRealScalar(1e-5) ); /cvSetIdentity( cvkalman->error_cov_post, cvRealScalar(1);/cvSetIdentity( cvkalman->measurement_noise_cov, cvRealScalar(1e-1) ); /* cho
65、ose initial state */ state->data.fl0=x; state->data.fl1=xv; state->data.fl2=y; state->data.fl3=yv; cvkalman->state_post->data.fl0=x; cvkalman->state_post->data.fl1=xv; cvkalman->state_post->data.fl2=y; cvkalman->state_post->data.fl3=yv;cvRandSetRange( &rng, 0, sqrt(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度片石銷售渠道拓展與加盟合同4篇
- 二零二四年度藝術(shù)品買賣合同關(guān)鍵內(nèi)容
- 二零二四年度智能交通信號(hào)設(shè)備采購(gòu)中介服務(wù)合同范本3篇
- 二零二五年度車庫(kù)租賃與車位租賃及安防服務(wù)合同3篇
- 2025年度啤酒生產(chǎn)線智能化改造合同4篇
- 2025年度戶外活動(dòng)專用柴油發(fā)電機(jī)租賃合同范本4篇
- 二零二五年度農(nóng)村灌溉渠水溝修復(fù)勞務(wù)合同文本4篇
- 二零二四年昆山XX小區(qū)物業(yè)退費(fèi)法院判決合同執(zhí)行監(jiān)督與評(píng)估報(bào)告3篇
- 二零二四年礦產(chǎn)資源開(kāi)發(fā)與勘探合同
- 二零二四年度養(yǎng)殖場(chǎng)養(yǎng)殖技術(shù)顧問(wèn)雇傭合同范本3篇
- 三年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)附答案
- 中醫(yī)診療方案腎病科
- 2025年安慶港華燃?xì)庀薰菊衅腹ぷ魅藛T14人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 人教版(2025新版)七年級(jí)下冊(cè)數(shù)學(xué)第七章 相交線與平行線 單元測(cè)試卷(含答案)
- 玩具有害物質(zhì)風(fēng)險(xiǎn)評(píng)估-洞察分析
- 《論文的寫(xiě)作技巧》課件
- 空氣自動(dòng)站儀器運(yùn)營(yíng)維護(hù)項(xiàng)目操作說(shuō)明以及簡(jiǎn)單故障處理
- 2022年12月Python-一級(jí)等級(jí)考試真題(附答案-解析)
- T-CHSA 020-2023 上頜骨缺損手術(shù)功能修復(fù)重建的專家共識(shí)
- Hypermesh lsdyna轉(zhuǎn)動(dòng)副連接課件完整版
- 小學(xué)六年級(jí)數(shù)學(xué)計(jì)算題100道(含答案)
評(píng)論
0/150
提交評(píng)論