滤波算法 | 无迹卡尔曼滤波(UKF)算法及其MATLAB实现

简介

本文接着分享位姿跟踪和滤波算法中用到的一些常用程序,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~)

本文分享无迹卡尔曼滤波(UKF)算法的一些基本公式和MATLAB程序。

UKF滤波

首先简单介绍一下UKF滤波的优点和公式。本文偏工程性介绍,因此UKF的原理就不再过多介绍了。

滤波流程和公式

首先需要明确滤波模型中的状态变量、状态方程和测量方程。

状态变量x=[ ]
状态方程x(k+1) = f(x(k))
测量方程z(k+1) = h(x(k+1))

很简单对吧?

接着求解介绍求解流程 :

  1. 相比于一般的卡尔曼滤波,UKF算法增加了两次无迹变换,公式为:
    在这里插入图片描述
    权重和方差计算公式为:

  2. Sigma点传播:

在这里插入图片描述

  1. 计算x的预测值和协方差矩阵:

在这里插入图片描述
4. 得到一组新的Sigma点:

在这里插入图片描述
5. 代入观测方程中,得到测量量的预估值:
在这里插入图片描述

  1. 获得观测量的预测值和协方差矩阵:

在这里插入图片描述

  1. 更新状态变量和协方差矩阵:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

另外,每次写论文画卡尔曼流程图中,都找不到参考的模板。我自己画了个滤波流程图,不一定符合每个人的审美,以备参考:

在这里插入图片描述

MATLAB程序

MATLAB程序如下,包括main.m函数和ukf.m函数:

main.m


P=[]
Q=[]
R=[]


f=@(x)[]
h=@(x)[]

z_msm = []
x0=[]
ux = x0;   
                                                            % 滤波初始值
for k=2:n_before_colli
    [xukf(:,k), P] = ukf(f_before,ux,P,h_before,z_pre(:,k),Q,R);
    ux=xukf(:,k);                                                          % k时刻的状态变量估计值
end


ukf.m

function [X,P]=ukf(ffun,X,P,hfun,Z,Q,R)
x_temp = X;

L=numel(X);
m=numel(Z);
% alpha=1e-2;

alpha = 2;
ki=0;
beta=2;
% alpha = 2;
% ki=3-L;
% beta=2;

lambda=alpha^2*(L+ki)-L;
c=L+lambda;
Wm=[lambda/c 0.5/c+zeros(1,2*L)];
Wc=Wm;
Wc(1)=Wc(1)+(1-alpha^2+beta);
c=sqrt(c);
Xsigmaset=sigmas(X,P,c); 
[X1means,X1,P1,X2]=ut(ffun,Xsigmaset,Wm,Wc,L,Q);   
[Zpre,Z1,Pzz,Z2]=ut(hfun,X1,Wm,Wc,m,R);
Pxz=X2*diag(Wc)*Z2';
K=Pxz*inv(Pzz);
X=X1means+K*(Z-Zpre);
P=P1-K*Pxz';

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%d%%%%%
% UT
function [Xmeans,Xsigma_pre,P,Xdiv]=ut(fun,Xsigma,Wm,Wc,n,COV)
LL=size(Xsigma,2);
Xmeans=zeros(n,1);
Xsigma_pre=zeros(n,LL);
for k=1:LL                
    Xsigma_pre(:,k)=fun(Xsigma(:,k));
    Xmeans=Xmeans+Wm(k)*Xsigma_pre(:,k);
end
Xdiv=Xsigma_pre-Xmeans(:,ones(1,LL));
P=Xdiv*diag(Wc)*Xdiv'+COV;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sigma
function Xset=sigmas(X,P,c)
A = c*chol(P)';
Y = X(:,ones(1,numel(X)));
Xset = [X Y+A Y-A];

结论

PS:为了避免论文查重,以下内容从正文中剪切。

UKF的优点:

在这里插入图片描述

  • 13
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
MATLAB基于无迹卡尔曼滤波(Unscented Kalman Filter, UKF算法的程序可以通过以下步骤实现: 1. 首先,定义系统的状态方程和测量方程。状态方程描述了系统的动态行为,测量方程描述了系统输出的测量模型。 2. 初始化系统状态和协方差矩阵。系统状态是需要估计的量,协方差矩阵是描述状态估计的不确定性的矩阵。 3. 进入循环,对每个时间步进行以下操作: a. 预测阶段: - 使用状态方程和前一个时间步的估计值来预测当前时间步的系统状态和协方差矩阵。 - 通过定义方差和权重矩阵,计算预测状态的一组sigma点。 b. 修正阶段: - 对每个预测状态的sigma点进行观测,通过测量方程将其映射到测量空间,得到对应的预测测量的sigma点。 - 利用预测测量的sigma点,计算预测测量均值和协方差矩阵。 - 根据测量值与预测测量的偏移,调整预测状态和协方差矩阵,得到修正后的估计状态和协方差矩阵。 4. 循环结束后,得到整个时间段的状态估计值。 无迹卡尔曼滤波相较于传统的卡尔曼滤波算法,采用了一种非线性变换方式,通过一组状态的sigma点来近似非线性函数。这样可以更好地处理非线性系统,并且减少了线性化误差。 在MATLAB中,可以通过相关的函数和工具箱来实现无迹卡尔曼滤波算法。常用函数包括"unscentedKalmanFilter"用于创建无迹卡尔曼滤波器对象,"predict"和"correct"方法用于执行预测和修正阶段的操作。用户可以根据具体的系统和测量方程进行参数设置和状态估计。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值