MATLAB下的四个模型的IMM例程(CV、CT左转、CT右转、CA四个模型),附下载链接
基于IMM算法的目标跟踪。利用卡尔曼滤波和多模型融合技术,能够在含噪声的环境中提高估计精度,带图像输出
文章目录
- 概述
- 源代码
- 运行结果
- 代码结构与功能
- 1. 初始化
- 2. 仿真参数设置
- 3. 模型参数设置
- 4. 生成量测数据
- 5. IMM算法初始化
- 6. IMM迭代
- 7. 绘图
- 8. 辅助函数
- 总结
概述
该MATLAB代码实现了基于交互式多模型(IMM)算法的目标跟踪,旨在估计目标在不同运动模式下的状态。代
码使用四种运动模型:匀速直线运动(CV)、左转运动(CT1)、右转运动(CT2)和匀加速运动(CA)。通过生成模拟数据并应用IMM算法,代码能够有效地跟踪目标。
源代码
完整源代码如下,复制粘贴到MATLAB空脚本后可以直接运行:
% 基于IMM算法的目标跟踪,四模型IMM
% 4个模型分别是:CV、左转CT、右转CT、CA
% 2024-09-21/Ver1
clc; clear; close all; % 清除命令窗口、工作空间和关闭所有图形窗口
rng('default'); rng(0); % 设置随机数生成器的默认状态,以确保可重复性
%% 仿真参数设置
time = 150; % 仿真迭代次数
T = 1; % 采样间隔(时间步长)
w2 = 3 * 2 * pi / 360; % 模型2的转弯率(3度)
w3 = -3 * 2 * pi / 360; % 模型3的转弯率(-3度)
a4 = 0.1; %匀加速模型的加速度(0.1m*s^-2)
H = [1, 0, 0, 0; % 模型量测矩阵
0, 0, 1, 0];
G = [T^2 / 2, 0; % 模型过程噪声加权矩阵
T, 0;
0, T^2 / 2;
0, T];
R = 10 * diag([1, 1]); % 模型量测噪声协方差矩阵
Q = 0.1 * diag([1, 1]); % 模型过程噪声协方差矩阵
%% IMM迭代
% 初始化
X_IMM = zeros(4, time); % IMM算法模型综合状态估计值
P_IMM = zeros(4, 4, time); % IMM算法模型综合状态协方差矩阵
r_CV = zeros(2, 1); % 模型1残差
r_CT1 = zeros(2, 1); % 模型2残差
r_CT2 = zeros(2, 1); % 模型3残差
r_CA = zeros(2, 1); % 模型3残差
S_CV = zeros(2, 2); % 模型1残差协方差矩阵
X_CV(:, 1) = x0; X_CT1(:, 1) = x0; X_CT2(:, 1) = x0; X_CA(:, 1) = x0; X_IMM(:, 1) = x0; % 初始化各模型状态
pij = [0.9, 0.05, 0.03 0.02; % 3个模型的转移概率矩阵
0.1, 0.6, 0.1, 0.2;
0.05, 0.13, 0.8, 0.02'
0.02, 0.02, 0.06, 0.9];
u_IMM = zeros(4, time); % 初始化模型概率
u_IMM(:, 1) = [0.3, 0.3, 0.3, 0.1]'; % IMM算法模型初始概率
x_CV = x0; x_CT1 = x0; x_CT2 = x0; x_CA = x0; % 各模型初始状态
P0 = diag([1000, 500, 1000, 500]); % 初始状态协方差矩阵
P_CV = P0; P_CT1 = P0; P_CT2 = P0; P_CA = P0; % 各模型初始协方差
P_IMM(:, :, 1) = P0; % 初始化综合状态协方差
% 迭代
for t = 1:time - 1
% 第一部分 Interacting(只针对IMM算法)
c_j = pij' * u_IMM(:, t); % 计算混合概率的归一化因子
ui1 = (1 / c_j(1)) * pij(:, 1) .* u_IMM(:, t); % 模型1的混合概率
ui2 = (1 / c_j(2)) * pij(:, 2) .* u_IMM(:, t); % 模型2的混合概率
ui3 = (1 / c_j(3)) * pij(:, 3) .* u_IMM(:, t); % 模型3的混合概率
ui4 = (1 / c_j(4)) * pij(:, 4) .* u_IMM(:, t); % 模型3的混合概率
% 计算各模型滤波初始化条件
x01 = x_CV * ui1(1) + x_CT1 * ui1(2) + x_CT2 * ui1(3) + x_CA * ui1(4); % 模型1滤波初始状态
x02 = x_CV * ui2(1) + x_CT1 * ui2(2) + x_CT2 * ui2(3) + x_CA * ui2(4); % 模型2滤波初始状态
x03 = x_CV * ui3(1) + x_CT1 * ui3(2) + x_CT2 * ui3(3) + x_CA * ui3(4); % 模型3滤波初始状态
x04 = x_CV * ui4(1) + x_CT1 * ui4(2) + x_CT2 * ui4(3) + x_CA * ui4(4); % 模型3滤波初始状态
% 第二步 -- 卡尔曼滤波
% 对模型1进行卡尔曼滤波
[x_CV, P_CV, r_CV, S_CV] = Kalman(x01, P01, z(:, t + 1), F1, G, Q, H, R);
% 对模型2进行卡尔曼滤波
[x_CT1, P_CT1, r_CT1, S_CT1] = Kalman(x02, P02, z(:, t + 1), F2, G, Q, H, R);
% 对模型3进行卡尔曼滤波
[x_CT2, P_CT2, r_CT2, S_CT2] = Kalman(x03, P03, z(:, t + 1), F3, G, Q, H, R);
% 对模型3进行卡尔曼滤波
[x_CA, P_CA, r_CA, S_CA] = Kalman(x04, P04, z(:, t + 1), F4, G, Q, H, R);
% 第三步 -- 模型概率更新
[u_IMM(:, t + 1)] = Model_P_up(r_CV, r_CT1, r_CT2, r_CA, S_CV, S_CT2, S_CT2, S_CA, c_j);
% 第四步 -- 模型综合
[X_IMM(:, t + 1), P_IMM(:, :, t + 1)] = Model_mix(x_CV, x_CT1, x_CT2, x_CA, P_CV, P_CT1, P_CT2, P_CA, u_IMM(:, t));
% 保存各模型状态
X_CV(:, t + 1) = x_CV; X_CT1(:, t + 1) = x_CT1; X_CT2(:, t + 1) = x_CT2; X_CA(:, t + 1) = x_CA;
end
完整代码(包括所有函数)下载链接:https://gf.bilibili.com/item/detail/1106559012
运行结果
各方法估计的轨迹图:
IMM估计的速度误差和位置误差:
各模型的概率曲线:
代码结构与功能
1. 初始化
clc; clear; close all;
rng('default'); rng(0);
- 清理环境:清除命令窗口、工作空间和关闭所有图形窗口。
- 设置随机数生成器:确保生成的随机数可重复。
2. 仿真参数设置
time = 150; % 仿真迭代次数
T = 1; % 采样间隔(时间步长)
- 时间设置:设定仿真迭代次数和采样间隔。
3. 模型参数设置
定义四种运动模型的状态转移矩阵、量测矩阵和噪声协方差矩阵:
- 匀速直线运动(CV)
- 左转运动(CT1)
- 右转运动(CT2)
- 匀加速运动(CA)
每种模型的状态转移矩阵和过程噪声矩阵被明确设置,以便在后续计算中使用。
4. 生成量测数据
x = zeros(4, time); % 状态数据矩阵
z = zeros(2, time); % 含噪声量测数据
- 初始化状态和量测矩阵:生成的状态数据和含噪声的量测数据矩阵。
通过循环,根据设定的时间段选择不同的运动模型并生成状态和量测数据。
5. IMM算法初始化
X_IMM = zeros(4, time); % IMM算法模型综合状态估计值
P_IMM = zeros(4, 4, time); % 模型综合状态协方差矩阵
- 综合状态估计和协方差矩阵初始化:为每个时间步初始化状态和协方差矩阵。
6. IMM迭代
代码的核心部分,涉及以下步骤:
-
模型交互:
- 计算混合概率的归一化因子。
- 计算每个模型的混合概率和滤波初始状态。
-
卡尔曼滤波:
- 对每个模型进行预测和更新,使用
Kalman
函数进行状态估计。
- 对每个模型进行预测和更新,使用
-
模型概率更新:
- 根据观测更新每个模型的概率,使用
Model_P_up
函数。
- 根据观测更新每个模型的概率,使用
-
模型综合:
- 综合各模型的状态和协方差,更新
X_IMM
和P_IMM
。
- 综合各模型的状态和协方差,更新
7. 绘图
figure;
plot(z_true(1, :), z_true(2, :), 'DisplayName', '真实值');
- 目标轨迹绘制:显示真实轨迹、估计轨迹和观测值。
- 位置和速度误差:绘制跟踪误差的子图,帮助分析模型的性能。
8. 辅助函数
- 卡尔曼滤波函数 (
Kalman
):实现状态预测、更新和协方差更新。 - 模型综合函数 (
Model_mix
):结合各模型状态和协方差。 - 模型概率更新函数 (
Model_P_up
):计算每个模型的概率。
总结
这段代码通过IMM算法有效地跟踪目标在不同运动模式下的状态,利用卡尔曼滤波和多模型融合技术,能够在含噪声的环境中提高估计精度。通过可视化,用户可以直观地观察到目标的真实轨迹与估计轨迹之间的关系,以及模型的性能表现。