卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C++_C_MATLAB)_第1頁(yè)
卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C++_C_MATLAB)_第2頁(yè)
卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C++_C_MATLAB)_第3頁(yè)
卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C++_C_MATLAB)_第4頁(yè)
卡爾曼濾波簡(jiǎn)介及其算法實(shí)現(xiàn)代碼(C++_C_MATLAB)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論