
单雷达、极坐标量测(距离 + 方位角)的二维目标跟踪器
原创代码,非AI生成,请勿翻卖
文章目录
程序详解
本程序构建了一个基于单站雷达的二维移动目标跟踪系统。雷达能够同时测得目标的距离和方位角,目标本身按给定加速度在平面中运动。由于雷达量测属于典型的非线性极坐标观测,本程序采用**无迹卡尔曼滤波(UKF)**作为主滤波器,对目标的位置与速度进行实时估计。
主要功能与流程
-
目标真实运动模拟
目标在平面中具有位置、速度和加速度,程序根据给定的时间步长对目标进行逐步更新,得到真实轨迹。
-
雷达量测生成
程序根据目标与雷达的相对位置计算真实距离和方位角,并加入随机噪声模拟实际雷达观测。
量测被转换成 XY 坐标仅用于绘图展示。
-
惯性推演(对比项)
同时生成一个基于"匀速积分"的惯性预测轨迹,用于和 UKF 的估计结果做对比,展示单纯推演的误差积累情况。
-
UKF 预测与更新
- 使用当前的状态协方差生成多个 sigma 点;
- 通过状态模型预测未来状态;
- 通过雷达测量模型预测量测;
- 计算预测值与实际量测之间的差异;
- 更新目标位置与速度。
由于方位角具有周期性,程序特别处理了角度的归一化问题,确保滤波过程稳定。
-
误差计算与性能分析
程序对以下三条轨迹进行误差评估:
- 雷达量测(经转换为 XY 后)
- 纯惯导推演
- UKF 估计
计算平均误差、RMSE,并给出柱状图和误差曲线,直观比较三者的性能差异。
整体特点
- 适用于单站雷达对机动目标的二维定位与跟踪;
- 使用 UKF 应对非线性极坐标量测;
- 加入角度归一化处理,提高滤波稳定性;
- 提供真实轨迹、雷达观测、惯导推演、UKF 结果的可视化;
- 自动输出各方法的定位精度对比,便于性能评估。
运行结果
轨迹对比:

误差曲线:

误差柱状图对比:

命令行输出的结果:

MATLAB源代码
部分代码如下:
matlab
% 雷达测角测距定位-二维-单一雷达,轨迹用UKF,观测为距离和角度
% 作者:matlabfilter
% 2025-12-07/Ver1
clear; close all; clc;
rng(0);
%% 参数设置
dt = 0.01;
N = 400;
target_position = [100; 200];
target_velocity = [2; 5];
target_acceleration = [0.5; -0.1];
radar_position = [120; 223];
range_noise_std = 0.2; %雷达测距误差
angle_noise_std = 0.1; %雷达测角误差
%% 滤波状态模型
F = [1 0 dt 0;
0 1 0 dt;
0 0 1 0;
0 0 0 1];
q = 0.1;
Q = q * [dt^4/4 0 dt^3/2 0;
0 dt^4/4 0 dt^3/2;
dt^3/2 0 dt^2 0;
0 dt^3/2 0 dt^2];
% 测量噪声(r, theta)
R = diag([range_noise_std^2, angle_noise_std^2]);
% 初始状态估计
x_est = [target_position; target_velocity];
P = diag([3 3 0.5 0.5]);
%% UKF 参数设置
n = 4; % 状态维度
alpha = 1e-3; % 控制sigma点分布
beta = 2; % 用于高斯分布 (beta=2为最优)
kappa = 0; % 次要参数
lambda = alpha^2 * (n + kappa) - n;
% 权重计算
Wm = zeros(2*n+1, 1);
Wc = zeros(2*n+1, 1);
Wm(1) = lambda / (n + lambda);
Wc(1) = lambda / (n + lambda) + (1 - alpha^2 + beta);
for i = 2:2*n+1
Wm(i) = 1 / (2*(n + lambda));
Wc(i) = 1 / (2*(n + lambda));
end
%% 纯惯导
inertial_position = target_position;
inertial_velocity = target_velocity;
%% 数据存储
true_positions = zeros(N, 2);
true_velocities = zeros(N, 2);
measurements_xy = zeros(N, 2); % 仅用于绘图
estimated_positions = zeros(N, 2);
estimated_velocities = zeros(N, 2);
inertial_positions = zeros(N, 2);
inertial_velocities = zeros(N, 2);
fprintf('开始 UKF 雷达跟踪仿真...\n');
完整代码如下:
https://download.csdn.net/download/callmeup/92441419
或:
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者