日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Matlab】扩展卡尔曼滤波器原理及仿真(初学者入门专用)

發(fā)布時間:2025/3/11 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Matlab】扩展卡尔曼滤波器原理及仿真(初学者入门专用) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 0.引言及友情鏈接
  • 1.場景預(yù)設(shè)
  • 2.擴(kuò)展卡爾曼濾波器
  • 3.仿真及效果

0.引言及友情鏈接

\qquad卡爾曼濾波器(Kalman Filter, KF)是傳感器融合(Sensor Fusion)的基礎(chǔ),雖然知乎、CSDN、GitHub等平臺已有大量的學(xué)習(xí)資料,但還是建議大家在看完B站Matlab Tech Talk有關(guān)卡爾曼濾波器視頻后再進(jìn)入深入學(xué)習(xí)。友情鏈接提供如下:

  • B站Matlab官方視頻
  • 卡爾曼濾波器介紹(CSDN,初學(xué)者專用)
  • 卡爾曼濾波器介紹(知乎,進(jìn)階篇)
  • 擴(kuò)展卡爾曼濾波器原理(知乎,適合入門)
  • 擴(kuò)展卡爾曼與無跡卡爾曼(知乎,進(jìn)階篇)
  • 擴(kuò)展卡爾曼濾波器公式推導(dǎo)(Github.io)

\qquad在此感謝各位辛勤的知乎、CSDN作者及B站分享視頻的Up主。未學(xué)習(xí)卡爾曼濾波器的讀者可學(xué)習(xí)鏈接中的1和2,本文將介紹擴(kuò)展卡爾曼濾波器(Extended Kalman Filter, EKF)的原理并以一個有關(guān)汽車運(yùn)動的Matlab仿真說明其應(yīng)用。
\qquad看過我上一篇介紹KF的博客的讀者肯定知道KF設(shè)計的目的和結(jié)構(gòu),即讓狀態(tài)估計的方差隨時間推移趨于0,然而由于KF針對的是隨機(jī)系統(tǒng),這一點(diǎn)往往做不到,而只能使其收斂為一個常數(shù)。EKF和KF的結(jié)構(gòu)差不多,只不過EKF針對的是非線性系統(tǒng)的濾波器。不含隨機(jī)噪聲的非線性系統(tǒng)狀態(tài)方程如下:
Nonlinear System:
{x(k)=f(x(k?1),u(k?1))y(k)=g(x(k),u(k))\begin{cases} x(k)=f(x(k-1),u(k-1))\\ y(k)=g(x(k),u(k))\\ \end{cases} {x(k)=f(x(k?1),u(k?1))y(k)=g(x(k),u(k))?
引入EKF后,其結(jié)構(gòu)框圖如下:

\qquad其中x^\hat{x}x^為估計狀態(tài),www為過程噪聲(一般由控制變量uuu引入,但也可能由物理系統(tǒng)本身的不確定性引入),而vvv為測量噪聲。根據(jù)Matlab的幫助文檔介紹,噪聲也分為兩種——加入型噪聲(Additive Noise)和非加入型噪聲(Nonadditive Noise),其分類取決于噪聲是否在非線性函數(shù)內(nèi)部,二者的狀態(tài)方程形式如下:
Additive Noise:
{x(k)=f(x(k?1),u(k))+w(k)y(k)=g(x(k),u(k))+v(k)\begin{cases} x(k)=f(x(k-1),u(k))+w(k)\\ y(k)=g(x(k),u(k))+v(k)\\ \end{cases} {x(k)=f(x(k?1),u(k))+w(k)y(k)=g(x(k),u(k))+v(k)?
Nonadditive Noise
{x(k)=f(x(k?1),u(k),w(k))y(k)=g(x(k),u(k),v(k))\begin{cases} x(k)=f(x(k-1),u(k),w(k))\\ y(k)=g(x(k),u(k),v(k))\\ \end{cases} {x(k)=f(x(k?1),u(k),w(k))y(k)=g(x(k),u(k),v(k))?
從上述表達(dá)式也可以看出加入型噪聲是非加入型的特例。

1.場景預(yù)設(shè)

\qquad為了應(yīng)用EKF,需要構(gòu)造一個非線性系統(tǒng),與前一篇講述KF的博文保持連續(xù)性。這次使用的仍然所示一維的汽車運(yùn)動模型,狀態(tài)變量仍然選擇汽車的位移和速度(x=[p,v]T)(x=[p,v]^T)(x=[p,v]T),但這次控制變量為u(k)u(k)u(k)為汽車的功率/汽車的質(zhì)量,重新構(gòu)造狀態(tài)方程如下:
{x˙=f(x,u)=A0?x+B0?Tu/(B0?x)y=g(x)=12(C0?x)T(C0?x)\begin{cases} \dot{x}=f(x,u)=A_0^* x+B_0^{*T}u/(B_0^*x)\\ y=g(x)=\frac{1}{2}(C_0^*x)^T(C_0^*x) \end{cases} {x˙=f(x,u)=A0??x+B0?T?u/(B0??x)y=g(x)=21?(C0??x)T(C0??x)?
其中A0?=[0100],B0?=C0?=[01]A_0^*=\begin{bmatrix} 0 &1\\0 & 0 \end{bmatrix},B_0^*=C_0^*=\begin{bmatrix}0 &1\end{bmatrix}A0??=[00?10?],B0??=C0??=[0?1?]
為了與控制變量uuu保持一致性,此處的測量yyy為單位質(zhì)量產(chǎn)生的動能。為了不失一般性,添加非加入型噪聲如下(同樣以yvy_vyv?表示測量值,yyy表示實(shí)際值,y^\hat{y}y^?表示估計值):
{x˙=f(x,u)=A0?x+B0?T(u+w)/(B0?x)yv=g(x)=12(C0?x)T(C0?x)+v\begin{cases} \dot{x}=f(x,u)=A_0^* x+B_0^{*T}(u+w)/(B_0^*x)\\ y_v=g(x)=\frac{1}{2}(C_0^*x)^T(C_0^*x)+v \end{cases} {x˙=f(x,u)=A0??x+B0?T?(u+w)/(B0??x)yv?=g(x)=21?(C0??x)T(C0??x)+v?
設(shè)定采樣時間dtdtdt,狀態(tài)方程化為離散形式:
{x(n)=f(x(n?1),u(n?1))=A0+B0T(u(n?1)+w)/(B0x(n?1))yv(n)=g(x(n))=12(C0x(n))T(C0x(n))+v\begin{cases} x(n)=f(x(n-1),u(n-1))=A_0+B_0^T(u(n-1)+w)/(B_0x(n-1))\\ y_v(n)=g(x(n))=\frac{1}{2}(C_0x(n))^T(C_0x(n))+v \end{cases} {x(n)=f(x(n?1),u(n?1))=A0?+B0T?(u(n?1)+w)/(B0?x(n?1))yv?(n)=g(x(n))=21?(C0?x(n))T(C0?x(n))+v?
其中A0=[1dt01],B0=[01]A_0=\begin{bmatrix} 1 &dt\\0 & 1 \end{bmatrix},B_0=\begin{bmatrix}0 &1\end{bmatrix}A0?=[10?dt1?],B0?=[0?1?]
與上一篇博文不同,設(shè)E((B0w?B0w ̄)T(B0w?B0w ̄))=Q,E((v?v ̄)T(v?v ̄))=RE((B_0w-\overline{B_0w})^T(B_0w-\overline{B_0w}))=Q,E((v-\overline{v})^T(v-\overline{v}))=RE((B0?w?B0?w?)T(B0?w?B0?w?))=Q,E((v?v)T(v?v))=R

2.擴(kuò)展卡爾曼濾波器

\qquad與上一篇博文一樣,本文不會從概率論或者最優(yōu)化理論的角度對EKF的公式加以深入推導(dǎo),但會詳細(xì)列出EKF最優(yōu)估計的算法步驟。步驟會與Matlab的幫助文檔的計算順序略有出入,但經(jīng)過實(shí)驗(yàn)比較之后結(jié)果幾乎沒有差異。

  • 設(shè)定初始狀態(tài)變量的估計值x^0\hat{x}_0x^0?,并計算以下導(dǎo)數(shù)及P的初始值:A0=?f?x∣x^0,u0G0=?f?w∣x^0,u0C0=?g?x∣x^0S0=?g?v∣x^0P0=G0QG0TA_0= \frac{\partial f}{\partial x}|_{\hat{x}_0,u_0}\\[2ex]G_0=\frac{\partial f}{\partial w}|_{\hat{x}_0,u_0}\\[2ex]C_0=\frac{\partial g}{\partial x}|_{\hat{x}_0}\\[2ex]S_0=\frac{\partial g}{\partial v}|_{\hat{x}_0}\\[2ex]P_0=G_0QG_0^TA0?=?x?f?x^0?,u0??G0?=?w?f?x^0?,u0??C0?=?x?g?x^0??S0?=?v?g?x^0??P0?=G0?QG0T?k=1k=1k=1
  • 獲取當(dāng)前測量量yvy_vyv?,計算狀態(tài)變量的先驗(yàn)估計x^k?=f(x^k?1,uk?1)\hat{x}_k^-=f(\hat{x}_{k-1},u_{k-1})x^k??=f(x^k?1?,uk?1?)
  • 計算以下導(dǎo)數(shù):Ak=?f?x∣x^k?,ukGk=?f?w∣x^k?,ukCk=?g?x∣x^k?Sk=?g?v∣x^k?A_k= \frac{\partial f}{\partial x}|_{\hat{x}_k^-,u_k}\\[2ex]G_k=\frac{\partial f}{\partial w}|_{\hat{x}_k^-,u_k}\\[2ex]C_k=\frac{\partial g}{\partial x}|_{\hat{x}_k^-}\\[2ex]S_k=\frac{\partial g}{\partial v}|_{\hat{x}_k^-}\\[2ex]Ak?=?x?f?x^k??,uk??Gk?=?w?f?x^k??,uk??Ck?=?x?g?x^k???Sk?=?v?g?x^k???并順帶計算Pk?=AkPAkT+GkQGkTP_k^-=A_kPA_k^T+G_kQG_k^TPk??=Ak?PAkT?+Gk?QGkT?
  • 計算EKF的最優(yōu)增益Kk=Pk?CkT(CkPk?CkT+SkRSkT)?1K_k=P_k^-C_k^T(C_kP_k^-C_k^T+S_kRS_k^T)^{-1}Kk?=Pk??CkT?(Ck?Pk??CkT?+Sk?RSkT?)?1
  • 更新Pk=(I?KkCk)Pk?P_k=(I-K_kC_k)P_k^-Pk?=(I?Kk?Ck?)Pk??并計算狀態(tài)變量的后驗(yàn)估計x^k=x^k?+Kk(yv?g(xk?))\hat{x}_k=\hat{x}^-_k+K_k(y_v-g(x^-_k))x^k?=x^k??+Kk?(yv??g(xk??))
  • 計算測量量的估計值y^k=g(x^k)\hat{y}_k=g(\hat{x}_k)y^?k?=g(x^k?),令k=k+1k=k+1k=k+1,轉(zhuǎn)步2
  • 3.仿真及效果

    仿真的Matlab代碼如下:

    % 模擬要求汽車在一維空間的加速和減速過程 % 控制變量u是汽車的加速度 % 狀態(tài)變量x=[p,v],x^hat=[v,a] % w為控制變量的隨機(jī)擾動,v為測量的隨機(jī)擾動 % Q為w的方差,R為v的方差,假設(shè)w與v相互獨(dú)立 clear dt = 0.1; % 采樣間隔 m = 1e3; % 汽車自重 N = 100; % 仿真數(shù) Q = 2e-4; % 過程噪聲的協(xié)方差矩陣 R = 0.01; % 測量噪聲的方差 x0 = [0;0.5]; % 初始位置和速度 xh0 = [1;0.4]; % x0的估計 A0 = [1,dt;0,1]; B0 = [0,1]; f = @(x,u)(A0*x+B0'*dt*u./(B0*x)); % 系統(tǒng)方程的非線性函數(shù) C0 = sqrt([0,10]); g = @(x,v)(1/2*(C0*x)'*(C0*x)+v); % 輸出方程的非線性函數(shù) A = @(x,u)(A0+[0,0;0,-dt*u/x(2)^2]); % pf/px 2*2 G = @(x)([0;-dt/x(2)]); % pf/pw 2*1 C = @(x)(C0.*x'); % pg/px 1*2 S = 1; % pg/pv 2*1 P = G(xh0)*Q*G(xh0)'; % 2*2 I = eye(2); u = 0.01*ones(1,N); % 功率恒定 1*1 w = sqrt(Q)*randn(1,N); % 控制變量的誤差1*N v = sqrt(R)*randn(1,N); % 測量誤差1*N ye_list = zeros(size(u)); % 估計值 yv_list = zeros(size(u)); % 測量值 y_list = zeros(size(u)); % 實(shí)際值 cov_list = zeros(size(u)); % 測量方差 for i = 1:numel(u)xreal = f(x0,u(i)); % 真實(shí)的狀態(tài)變量yreal = g(x0,0); % 真實(shí)的測量x1 = f(x0,u(i)+w(i)); % 含噪聲的狀態(tài)變量 2*1yv = g(x0,v(i)); % 含噪聲的測量 1*1xfe = f(xh0,u(i));Pfe = A(xfe,u(i))*P*A(xfe,u(i))'+G(xfe)*Q*G(xfe)';K = Pfe*C(xfe)'/(C(xfe)*Pfe*C(xfe)'+S*R*S'); % 卡爾曼最優(yōu)增益 2*1P = (I - K*C(xfe))*Pfe; % 當(dāng)前狀態(tài)先驗(yàn)估計協(xié)方差xh1 = xfe+K*(yv-g(xfe,0)); % 狀態(tài)預(yù)測ye = g(xh1,0);x0 = x1;xh0 = xh1;y_list(i) = yreal;yv_list(i) = yv;ye_list(i) = ye;cov_list(i) = C(xh1)*P*C(xh1)'; end ax = (1:N).*dt; figure(1); subplot(2,2,1) plot(ax,y_list,ax,yv_list,ax,ye_list) legend('實(shí)際','測量','估計','Location','best') title('汽車的動能') ylabel('動能/J') xlabel('時間/s') subplot(2,2,2) plot(ax,yv_list-y_list,ax,ye_list-y_list) legend('測量','估計','Location','best') title('汽車的動能誤差') ylabel('動能/J') xlabel('時間/s') subplot(2,2,[3,4]) plot(ax,cov_list) legend('測量方差','Location','best') title('測量方差') ylabel('方差/m^2') xlabel('時間/s')

    \qquad這里設(shè)定的汽車的功率/質(zhì)量為恒定的0.01,汽車初速度為1m/s,為恒功率加速過程,根據(jù)能量守恒定律,其測量量(單位質(zhì)量的動能)應(yīng)成近似線性增長。相關(guān)效果圖如下:

    \qquad通過效果圖可以看出,雖然初始狀態(tài)時估計值x^0\hat{x}_0x^0?與真實(shí)值x0x_0x0?相差較大造成EKF的誤差較測量值較大,但是經(jīng)過一段時間推移后,EKF的測量誤差逐漸減小并較測量值有了顯著提升。EKF算法對于非線性系統(tǒng)是近似收斂的,從測量方差的走勢也可以看出。需要指出的是這里的測量方差是單位質(zhì)量的動能,真實(shí)的動能需要乘上汽車的質(zhì)量。
    \qquad希望本文對您有幫助,謝謝閱讀。若有異議,歡迎評論區(qū)指正!

    總結(jié)

    以上是生活随笔為你收集整理的【Matlab】扩展卡尔曼滤波器原理及仿真(初学者入门专用)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。