【逐行注释】三维EKF的MATLAB代码|附下载链接

在这里插入图片描述

程序概况

基于MATLAB的EKF(扩展卡尔曼滤波)代码解析。状态转移和观测都是非线性的,也就是说会涉及到雅克比矩阵的求解。我尽量将模型设计复杂一点,便于拿到手以后改成自己想要的形式。

源代码与注释

下载链接(需付费,谨慎消费):https://download.csdn.net/download/callmeup/89673052

或关注这一篇文章,订阅专栏后可以获得更多的代码,专栏持续更新中:https://blog.csdn.net/callmeup/article/details/141506480

运行结果

第一幅图是三维的状态量输出与对比:
在这里插入图片描述

第二幅图是三维的误差值时序图对比:
在这里插入图片描述

第三幅图是三轴的误差CDF图像对比:
在这里插入图片描述

CDF图像:CDF(Cumulative Distribution Function)是指概率分布函数的累积分布函数,用于描述连续随机变量的概率分布。CDF图像是指以随机变量为横坐标,以累积概率为纵坐标的图形,用来展示随机变量的累积概率分布。在图像中,横坐标表示随机变量的取值,纵坐标表示该取值对应的累积概率。

代码块解析

绘图模块:主要使用plot绘制时序图,t是1:100的向量,将其与 X X X X e k f X_{ekf} Xekf连用,代表X轴为1~100,Y轴的值为后面 X X X X e k f X_{ekf} Xekf的值:
在这里插入图片描述

绘制CDF图像的代码块:
在这里插入图片描述

在figure后面加上hold on,可以固定住窗口上的图像,在绘制新图时,旧图不会被抹去。

误差计算:如下
在这里插入图片描述

使用fprintf这个输出的语句,后面引号内的紫色内容直接输出,%d为整型,在输出时%d的位置输出后面的计算内容。

如需更多讲解,见文章末尾的卡片,可以添加微信。

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的 MATLAB 代码示例,用于比较基于6维UKF和EKF的状态估计方法: ``` % 状态转移矩阵 A = [1 0.5 0 0 0 0; 0 1 0 0 0 0; 0 0 1 0.5 0 0; 0 0 0 1 0 0; 0 0 0 0 1 0.5; 0 0 0 0 0 1]; % 状态转移噪声协方差矩阵 Q = [0.01^2 0 0 0 0 0; 0 (0.01/4)^2 0 0 0 0; 0 0 0.01^2 0 0 0; 0 0 0 (0.01/4)^2 0 0; 0 0 0 0 0.01^2 0; 0 0 0 0 (0.01/4)^2 0.01^2]; % 测量矩阵 H = [1 0 0 0 0 0; 0 0 1 0 0 0; 0 0 0 0 1 0]; % 测量噪声协方差矩阵 R = [0.1^2 0 0; 0 (0.1/4)^2 0; 0 0 0.1^2]; % 初始状态 x0 = [0; 0; 0; 0; 0; 0]; % 初始状态协方差矩阵 P0 = eye(6); % 生成观测数据 N = 100; y = simulate_data(A, Q, H, R, x0, N); % EKF状态估计 [x_hat_ekf, P_ekf] = ekf(A, Q, H, R, y, x0, P0); % UKF状态估计 [x_hat_ukf, P_ukf] = ukf(A, Q, H, R, y, x0, P0); % 绘图 plot_states(y, x_hat_ekf, x_hat_ukf); ``` 其中,`simulate_data` 函数用于生成观测数据,`ekf` 和 `ukf` 函数分别实现了EKF和UKF状态估计方法,`plot_states` 函数用于绘制状态估计结果。以下是 `simulate_data` 函数的代码实现: ``` function y = simulate_data(A, Q, H, R, x0, N) % 生成观测数据 x = zeros(size(A, 1), N); y = zeros(size(H, 1), N); x(:, 1) = x0; for k = 2:N x(:, k) = mvnrnd(A*x(:, k-1), Q)'; y(:, k) = mvnrnd(H*x(:, k), R)'; end end ``` 以下是 `ekf` 函数的代码实现: ``` function [x_hat, P] = ekf(A, Q, H, R, y, x0, P0) % EKF状态估计 x_hat = zeros(size(A, 1), size(y, 2)); x_hat(:, 1) = x0; P = P0; for k = 2:size(y, 2) % 预测步骤 x_hat(:, k) = A*x_hat(:, k-1); P = A*P*A' + Q; % 更新步骤 K = P*H'/(H*P*H' + R); x_hat(:, k) = x_hat(:, k) + K*(y(:, k) - H*x_hat(:, k)); P = (eye(size(P)) - K*H)*P; end end ``` 以下是 `ukf` 函数的代码实现: ``` function [x_hat, P] = ukf(A, Q, H, R, y, x0, P0) % UKF状态估计 x_hat = zeros(size(A, 1), size(y, 2)); x_hat(:, 1) = x0; P = P0; for k = 2:size(y, 2) % 预测步骤 [x_sigma, w_sigma] = unscented_transform(x_hat(:, k-1), P, sqrtm(Q)); [x_pred, P_pred] = calculate_moments(x_sigma, w_sigma, A, []); P_pred = P_pred + Q; % 更新步骤 [y_sigma, w_sigma] = unscented_transform(x_pred, P_pred, sqrtm(R)); [y_pred, Pyy, Pxy] = calculate_moments(y_sigma, w_sigma, [], H); K = Pxy/Pyy; x_hat(:, k) = x_pred + K*(y(:, k) - y_pred); P = P_pred - K*Pyy*K'; end end function [x_sigma, w_sigma] = unscented_transform(x, P, W) % 无损变换 n = length(x); lambda = n + trace(P)/norm(W)^2 - n; X = [x, x+sqrt(n+lambda)*W, x-sqrt(n+lambda)*W]; w_sigma = [lambda/(n+lambda), repmat(1/(2*(n+lambda)), 1, 2*n)]; x_sigma = X; end function [x, P] = calculate_moments(X, w, A, C) % 计算均值和协方差矩阵 x = X*w'; n = size(X, 1); P = zeros(n); if ~isempty(A) for i = 1:2*n+1 P = P + w(i)*(A*X(:, i) - x)*(A*X(:, i) - x)'; end end if ~isempty(C) Pyy = zeros(size(C, 1)); Pxy = zeros(n, size(C, 1)); for i = 1:2*n+1 Pyy = Pyy + w(i)*(C*X(:, i) - C*x)*(C*X(:, i) - C*x)'; Pxy = Pxy + w(i)*(X(:, i) - x)*(C*X(:, i) - C*x)'; end P = [P, Pxy; Pxy', Pyy]; end end ``` 以下是 `plot_states` 函数的代码实现: ``` function plot_states(y, x_hat_ekf, x_hat_ukf) % 绘制状态估计结果 figure; subplot(3, 1, 1); plot(y(1, :), 'b'); hold on; plot(x_hat_ekf(1, :), 'r--'); plot(x_hat_ukf(1, :), 'g--'); legend('真实状态', 'EKF估计', 'UKF估计'); title('状态1'); subplot(3, 1, 2); plot(y(2, :), 'b'); hold on; plot(x_hat_ekf(3, :), 'r--'); plot(x_hat_ukf(3, :), 'g--'); legend('真实状态', 'EKF估计', 'UKF估计'); title('状态2'); subplot(3, 1, 3); plot(y(3, :), 'b'); hold on; plot(x_hat_ekf(5, :), 'r--'); plot(x_hat_ukf(5, :), 'g--'); legend('真实状态', 'EKF估计', 'UKF估计'); title('状态3'); end ``` 该代码将生成一个包含三个子图的图形,每个子图显示观测数据、EKF估计结果和UKF估计结果的比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值