当前位置: 首页 > news >正文

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

目录

  • 简介
  • 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的优点:

在这里插入图片描述

http://www.lryc.cn/news/14761.html

相关文章:

  • JAVA开发(运行JAR包怎么指定虚拟机内存大小)
  • 领导力的终极奥义
  • 1-MATLAB APP Design-图像的输入与输出
  • 【C++】内存管理
  • Dilworth定理
  • 使用loading动画让你的条件渲染页面更高级
  • Renegade:基于MPC+Bulletproofs构建的anonymous DEX
  • 二、Plugin The chain/event/query function
  • 了解 PostgreSQL 的扩展查询协议
  • 接入网关和隔离网关
  • 实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?
  • 如何锁定Word文档部分文字不被修改
  • 聊聊8万8的私董会,很扎心
  • 卷积网络与全连接网络的区别
  • 【5000左右电脑配置清单】预算不高于5000,不带显示器的电脑配置清单推荐
  • 在 4G 内存的机器上,申请 8G 内存会怎么样?
  • JavaSE学习day9 集合(基础班结束)
  • Python爬虫进阶 - win和linux下selenium使用代理
  • 力扣-从不订购的客户
  • 速来!掘金数据时代2022年度隐私计算评选活动火热报名中!
  • Springboot @Test 给Controller接口 写 单元测试
  • ISO 6721-1~12 ,塑料-电动机械性能的测定,2022更新
  • vue3.2中使用swiper缩略图轮播教程
  • 边玩边学,13个 Python 小游戏真有趣啊(含源码)
  • MySQL数据文件迁移(不关闭SELinux)
  • uboot / linux添加/去除 版本号LOCALVERSION
  • 2023北京养老展,北京养老展会,北京养老产业展览会
  • 华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】
  • 带你彻底了解浮点型数据的存储
  • 【牛客刷题专栏】0x0C:JZ4 二维数组中的查找(C语言编程题)