【滤波跟踪】延迟卡尔曼滤波器无人机的状态估计【含Matlab源码 3278期】

在这里插入图片描述

⛄一、获取代码方式

获取代码方式1:
完整代码已上传我的资源:【滤波跟踪】基于matlab延迟卡尔曼滤波器无人机的状态估计【含Matlab源码 3278期】
点击上面蓝色字体,直接付费下载,即可。

获取代码方式2:
付费专栏Matlab信号处理(初级版)

备注:
点击上面蓝色字体付费专栏Matlab信号处理(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab信号处理(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码

⛄二、延迟卡尔曼滤波器无人机的状态估计简介

延迟卡尔曼滤波器是一种对传统卡尔曼滤波器的改进和扩展,它可以提供更准确的状态估计,尤其是在高速运动和复杂环境中。延迟卡尔曼滤波器通过引入延迟状态和测量数据,来减小滤波器的延迟。具体而言,延迟卡尔曼滤波器使用滑动窗口的方式来存储最近的状态和测量数据,然后通过对窗口内的数据进行加权平均,来估计当前的系统状态。延迟卡尔曼滤波器可以提高无人机的自主导航和控制性能,使其更适应各种任务需求。此外,延迟卡尔曼滤波器还可以与其他滤波算法和传感器融合,进一步提高状态估计的精度和鲁棒性。

⛄三、部分源代码

close all;
clear;

addpath(‘common_functions/’); % includes hat, vee, etc
%% Define variables
tf = 20; % final time
freq = 100; % frequency of the system (Hz)
freq_gps = 5; % frequency of the GPS update (Hz)

% Parameters
R_bi = eye(3);

gps_delay = 0.2; % GPS measurement delay (this code is hard coded
% such that this delay must be a multiplication of freq_gps)

% Variances of w_k
V_a = 1e-1diag([0.1 0.1 0.1]).^2; % acceleration
V_W = 1e-1
diag([0.5 0.5 0.5]).^2; % angular velocity
V_b_a = 0.01^2; % acclerometer z bias

Q = blkdiag(V_a, V_W, V_b_a);

% Covariances of measurement error
V_R_imu = diag([0.01 0.01 0.01]).^2;
V_x_gps = diag([0.01 0.01 0.01]).^2;
V_v_gps = diag([0.01 0.01 0.01]).^2;

V_x_lidar = 0.01^2;

% Initial covariances of x
P_x = diag([1^2, 1^2, 1^2]); % position
P_v = diag([1^2, 1^2, 1^2]); % velocity
P_eta = diag([0.1^2, 0.1^2, 0.1^2]); % attitude
P_b_a = 1^2; % accelerometer z bias

P = blkdiag(P_x, P_v, P_eta, P_b_a);
[m, ~] = size§;

%% Calculate time related parameters
N = tf*freq + 1;
t = linspace(0,tf,N);
h = t(2) - t(1);

%% Create empty arrays to save data
% tru: simulated true data
% imu: simulated IMU measurement with noise
% vcn: simulated Vicon data with noise
% est: estimated data
% gps: simulated GPS data with noise
% ldr: simulated Lidar data with noise
[tru, imu, vcn, est, gps, ~] = create_arrays_to_save_data(N, m);

%% Initial estimates
est.x(:,1) = [0, 0, 0]‘;
est.v(:,1) = [0, 0, 0]’;
est.R(:,:,1) = eye(3);
est.b_a(1) = 0;
est.P(:,:,1) = P;

DKF = DelayedKalmanFilter();
DKF.update_parameters(R_bi);
DKF.update_init_values(P, Q);
%% Run estimator
[tru.x(:,1), tru.v(:,1), tru.a(:,1), tru.R(:,:,1), …
tru.W(:,1), tru.b_a(:,1)] = true_data(t(1));
[imu.a(:,1), imu.R(:,:,1), imu.W(:,1)] = measurement_imu(t(1), …
R_bi, V_R_imu, V_W, V_a);

% Based on the IMU and GPS requencies, we should expect new GPS readings
% at every following loop.
k_gps = round(freq / freq_gps);
N_gps = k_gps/freq_gps;

norm_error = 0;

for k = 2:N-1-k_gps
% Update simulated true data and measurements
[tru.x(:,k), tru.v(:,k), tru.a(:,k), tru.R(:,:,k), …
tru.W(:,k), tru.b_a(:,1)] = true_data(t(k));
[imu.a(:,k), imu.R(:,:,k), imu.W(:,k)] = measurement_imu(t(k), …
R_bi, V_R_imu, V_W, V_a);

gps_new_data = gps_measurement_check(k, k_gps);

if gps_new_data
    % No delay
    % [gps.x(:,k), gps.v(:,k)] = measurement_gps(t(k), ...
    %     V_x_gps, V_v_gps);
    
    % GPS measurements are delayed by k_gps steps.
    [gps.x(:,k), gps.v(:,k)] = measurement_gps(t(k - k_gps), ...
        V_x_gps, V_v_gps);
else
    gps.x(:,k) = gps.x(:,k-1);
    gps.v(:,k) = gps.v(:,k-1);
end

% Run prediction
DKF.prediction(h, imu.a(:,k), imu.W(:,k));

% GPS correction
if gps_new_data
    % No delay
    % DKF.correction_gps(gps.x(:,k), gps.v(:,k), V_x_gps, V_v_gps);
    
    % Delayed GPS data
    k_list = linspace(k-k_gps, k, k_gps/N_gps);
    % k_list = k-k_gps:k; % re-calculate
    
    DKF.start_delayed_gps_correction(est.x(:,k-k_gps), ...
        est.v(:,k-k_gps), est.a(:,k-k_gps), est.b_a(k-k_gps), ...
        est.R(:,:,k-k_gps), est.W(:,k-k_gps), ...
        est.P(:,:,k-k_gps), ...
        imu.a(:,k-k_gps), imu.W(:,k-k_gps));
    DKF.correction_delayed_gps(gps.x(:,k), gps.v(:,k), ...
        V_x_gps, V_v_gps);
    
    for i = 1:length(k_list)-1
        k1 = k_list(i);
        k2 = k_list(i+1);
        h_s = t(k2) - t(k1);
        DKF.forward_prediction(h_s, imu.a(:,k2), imu.W(:,k2));
    end
    DKF.end_delayed_gps_correction();
end

% IMU correction
DKF.correction_imu(imu.R(:,:,k), V_R_imu);

[est.x(:,k), est.v(:,k), est.a(:,k), est.b_a(k), ...
    est.R(:,:,k), est.W(:,k),  est.P(:,:,k)] ...
    = DKF.output_states();

norm_error = norm_error + norm(est.x(:,k) - tru.x(:,k));

end

%% Plots

plot_3x1_3e(t, tru.x, gps.x, est.x, “ x x x (m)”);
plot_3x1_3e(t, tru.v, gps.v, est.v, “ v v v (m/s)”);

%% Create empty arrays to save data, reduce clutter int the front
function [true, imu, vicon, est, gps, lidar] = …
create_arrays_to_save_data(N, m)

% Simulated true data
true.x = zeros(3, N);
true.v = zeros(3, N);
true.a = zeros(3, N);
true.R = zeros(3, 3, N);
true.W = zeros(3, N);

% Estimated data
est.x = zeros(3, N);
est.v = zeros(3, N);
% est.a = zeros(3, N);
est.R = zeros(3, 3, N);
est.W = zeros(3, N);
est.b_a = zeros(1, N);
est.P = zeros(m, m, N);

% IMU measurements
imu.R = zeros(3, 3, N);
imu.a = zeros(3, N);
imu.W = zeros(3, N);

% Vicon measurements
vicon.R = zeros(3, 3, N);
vicon.x = zeros(3, N);

% GPS measurements
gps.x = zeros(3, N);
gps.v = zeros(3, N);

% Lidar measurements
lidar.d = zeros(1, N);

end

⛄四、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]王艳东,范跃祖.捷联惯导系统多位置对准研究[J].中国惯性技术学报. 2000,(03)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab领域

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

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

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

打赏作者

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

抵扣说明:

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

余额充值