无迹卡尔曼滤波算法(UKF)详细推倒及其仿真(matlab)

著名学者Julier等提出近似非线性函数的均值和方差远比近似非线性函数本身更容易,因此提出了基于确定性采样的UKF算法。
该算法的核心思想是:采用UT变换,利用一组Sigma采样点来描述随机变量的高斯分布,然后通过非线性函数的传递,再利用加权统计线性回归技术来近似非x线性函数的后验均值和方差。
相比于EKF,UKF的估计精度能够达到泰勒级数展开的二阶精度。

  1. UT变换
  2. 采样策略
  3. UKF算法流程
  4. UKF算法仿真

UT变换
采样策略:
根据Sigma点采样策略不同,相应的Sigma点以及均值权值和方差权值也不尽相同,因此UT变换的估计精度也会有差异,但总体来说,其估计精度能够达到泰勒级数展开的二阶精度。
为保证随机变量x经过采样之后得到的Sigma采样点仍具有原变量的必要特性,所以采样点的选取应满足:
采样策略
下面介绍两种经常使用的采样策略:比例采样和比例修正对称采样
比例采样
比例修正对称采样
比例修正对称采样
系统
UKF
UKF
至此UKF算法介绍完毕。
UKF算法仿真:
仿真的例子与上一篇EKF仿真的非线性系统相同。
主程序:

clear all;
clc;
tf = 50; 
Q = 10;w=sqrt(Q)*randn(1,tf); 
R = 1;v=sqrt(R)*randn(1,tf);
P =eye(1);
x=zeros(1,tf);
Xnew=zeros(1,tf);
x(1,1)=0.1; 
Xnew(1,1)=x(1,1);
z=zeros(1,tf);
z(1)=x(1,1)^2/20+v(1); 
zjian=zeros(1,tf);
zjian(1,1)=z(1);
linear = 0.5;
for k = 2 : tf 
    % 模拟系统 
    x(:,k) = linear * x(:,k-1) + (2.5 * x(:,k-1) / (1 + x(:,k-1)^2)) + 8 * cos(1.2*(k-1)) + w(k-1); %状态值 
    z(k) = (x(:,k)^2 / 20) + v(k);%观测值
    f=@(x)(linear * x + (2.5 * x / (1 + x^2)) + 8 * cos(1.2*(k-1)));
    h=@(x)(x^2 / 20);
   [Xnew(:,k),P(:,:,k)] = ukf(f,Xnew(:,k-1),P(:,:,k-1),h,z(k),Q,R); 
end
   figure;
   t = 2 : tf;
   plot(t,x(1,t),'b',t,Xnew(1,t),'r:');
   legend('真实值','UKF估计值');

Sigma点集选取(2n+1个):

function X = sigmas(x,P,c)  % x:参考点,P:协方差,c:系数,X:Sigma点
A = c*chol(P)';  
Y = x(:,ones(1,numel(x)));  
X = [x Y+A Y-A]; 

UT变换:

function [y,Y,P,Y1] = ut(f,X,Wm,Wc,n,R)  %f:非线性函数,X: sigma点 Wm:均值权值 Wc:方差权值
L = size(X,2);  
y = zeros(n,1);  
Y = zeros(n,L);  
for k=1:L  
    Y(:,k) = f(X(:,k));  %非线性传递后结果 r
    y = y+Wm(k)*Y(:,k);  %均值
end  
Y1 = Y-y(:,ones(1,L));  
P = Y1*diag(Wc)*Y1'+R;    %协方差

UKF:

function [x,P] = ukf(fstate, x, P, hmeas, z, Q, R)    
L = numel(x);                                 %状态数量
m = numel(z);                                 %量测数量 
a = 1e-3;                                     %默认  
ki = 0;                                       %默认
beta = 2;                                     %默认  
lambda = a^2*(L+ki)-L;                          
c = L+lambda;                                
Wm = [lambda/c 0.5/c+zeros(1,2*L)];          
Wc = Wm;  
Wc(1) = Wc(1)+(1-a^2+beta);                
c = sqrt(c);  
X = sigmas(x,P,c);                            
[x1,X1,P1,X2] = ut(fstate,X,Wm,Wc,L,Q);                       
[z1,Z1,P2,Z2] = ut(hmeas,X1,Wm,Wc,m,R);          
% 滤波部分  
P12 = X2*diag(Wc)*Z2';                          
K = P12*inv(P2);  
x = x1+K*(z-z1);                                
P = P1-K*P12'; 

仿真结果:
UKF仿真结果

参考文献:CKF及鲁棒滤波在飞行器姿态估计中的应用研究[D]. 黄蔚.哈尔滨工程大学

  • 80
    点赞
  • 602
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
UKF (Unscented Kalman Filter) 是一种用于状态估计的滤波器,它是对传统的卡尔曼滤波器的扩展。UKF 通过在状态空间中使用一组称为 sigma 点的采样点来近似非线性函数的传播和测量模型。这些 sigma 点在通过预测和更新步骤时被传递,并用于计算均值和方差。在 MATLAB 中,你可以使用 Robotics System Toolbox 中的 `unscentedKalmanFilter` 函数来实现 UKF。 以下是一个简单的示例代码,演示如何使用 UKF 来估计一个简单线性模型的状态: ```matlab % 定义系统模型 A = [1 1; 0 1]; C = [1 0]; Q = 0.1*eye(2); % 系统过程噪声协方差 R = 1; % 测量噪声协方差 % 初始化 UKF ukf = unscentedKalmanFilter(@stateTransitionFcn, @measurementFcn); % 设置初始状态和协方差 initState = [0; 0]; initCovariance = eye(2); initialize(ukf, initState, initCovariance); % 生成模拟测量数据 T = 100; % 时间步数 measurements = zeros(T, 1); % 存储测量结果 trueStates = zeros(T, 2); % 存储真实状态 for t = 1:T trueState = A*initState + sqrt(Q)*randn(2, 1); measurement = C*trueState + sqrt(R)*randn; [estimatedState, estimatedCovariance] = correct(ukf, measurement); trueStates(t, :) = trueState'; measurements(t) = measurement; end % 绘制结果 figure; plot(1:T, trueStates(:, 1), 'b', 'LineWidth', 2); hold on; plot(1:T, measurements, 'r', 'LineWidth',2); plot(1:T, ukf.State(:, 1), 'k--', 'LineWidth', 2); legend('True State', 'Measurements', 'Estimated State'); xlabel('Time'); ylabel('State'); function xk1 = stateTransitionFcn(xk, wk) A = [1 1; 0 1]; Q = 0.1*eye(2); xk1 = A*xk + sqrt(Q)*wk; end function yk = measurementFcn(xk, vk) C = [1 0]; R = 1; yk = C*xk + sqrt(R)*vk; end ``` 这个示例中,我们定义了一个简单的线性系统模型,使用随机噪声生成模拟测量数据,并通过 UKF 来估计系统的状态。你可以根据自己的需求调整系统模型和噪声参数。希望这个示例能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值