【AOA定位与UKF例程】到达角度(AOA)定位后,使用无迹卡尔曼滤波(UKF)对轨迹滤波,MATLAB例程可下载

AOA定位,动态轨迹,无迹卡尔曼滤波UKF优化轨迹,对动态目标定位。锚点的数量是自适应的,无需针对不同的锚点数修改定位的矩阵等参数。函数已集成到一个m文件中
文章目录
- 程序介绍
- 运行结果
- MATLAB源代码
程序介绍
本MATLAB程序提供了一个基于 AOA(到达角)定位和 UKF(无迹卡尔曼滤波) 的完整演示和优化框架,完美适用于需要实时、高精度追踪移动目标的场景。
核心价值:
在实际的 AOA 定位系统中,测量的角度总是伴随着噪声和误差。纯粹依赖这些原始观测值得到的轨迹通常是抖动、不稳定的。本例程:
代码首先模拟了基站的 AOA 测量,并通过经典的最小二乘法计算出目标位置。可以清晰地看到,这些“纯观测”定位点是如何围绕真实路径跳动的,这是误差的直接体现。
无迹卡尔曼滤波 (UKF) 是本方案的核心。它不仅仅是简单地平均数据,而是:
- 智能预测: 根据目标的运动趋势(比如它正在加速或匀速移动),预测它下一时刻最可能出现的位置。
- 数据融合: 将这个预测结果,与带有误差的 AOA 观测值进行加权融合,自动判断哪个信息更值得信任。
UKF 的最终输出是一条平滑、稳定的估计轨迹。与原始观测值相比,它极大地减少了定位误差的最大值、平均值和均方根误差 (RMSE),让您对目标的运动状态有更清晰、更准确的掌握。
代码亮点:
- 全景对比: 通过详尽的图表(轨迹图、误差图、CDF 累积分布图),直观对比“真实值”、“原始观测值”和“UKF 优化值”三者之间的性能差异。
- 核心算法实现: 提供了从 AOA 最小二乘解算到完整的 UKF 预测-更新循环的清晰、模块化代码。
- 误差量化分析: 最终输出包含全程的最大误差、平均误差和 RMSE 的精确数值,用数据证明 UKF 对定位精度的显著提升。
运行结果
轨迹图像:

各轴定位误差对比曲线:

位置误差对比曲线:

命令行输出的误差统计特性:

程序结构:

MATLAB源代码
完整代码如下:
% AOA定位,二维、N个锚点(自适应基站数量),动态轨迹UKF优化
% 作者:matlabfilter
% 2025-10-18/Ver1%% 初始化
clc;clear;close all;
rng(0);
% 生成目标点坐标 (二维)
position = [0,-2];
% 生成目标的运动 (二维)
positions = repmat(position,41,1)+[0:0.1:4;0:-0.1:-4]';
% 固定基站位置 (二维)
num_station =3; %基站数量
stations_position=3*randn(num_station,2); %定义基站的坐标,(N, 2)
estimated_position_AOA = zeros(2, size(positions, 1)); % 预分配AOA估计值空间 (2, N)for i1 = 1:size(positions,1)position = positions(i1,:);
%% AOA定位 (二维)% 计算目标到各基站的距离 (此步骤在AOA LS中非必需,但保留供参考)true_distances = vecnorm(stations_position - position, 2, 2);% 模拟接收到的AOA(此时是角度理想值,后面要加噪声)% 二维只需要方位角azimuth_angles = atan2(position(2) - stations_position(:, 2), position(1) - stations_position(:, 1));% 假设测量的AOA角度上加一些噪声AOA_noise = 0.03; % AOA 角度噪声azimuth_angles = azimuth_angles + AOA_noise * randn(num_station, 1);% 移除了 elevation_angles (俯仰角)% 使用最小二乘法进行定位估计 二维直接求解% 每个基站提供一个方程: (x - xi)*sin(a) - (y - yi)*cos(a) = 0% -> x*sin(a) - y*cos(a) = xi*sin(a) - yi*cos(a)% H * [x;y] = YH = zeros(num_station, 2); % H 矩阵 (N, 2)Y = zeros(num_station, 1); % Y 向量 (N, 1)for i2 = 1:num_stationH(i2,:) = [sin(azimuth_angles(i2)), -cos(azimuth_angles(i2))];Y(i2) = stations_position(i2,1)*sin(azimuth_angles(i2)) - stations_position(i2,2)*cos(azimuth_angles(i2));end% 使用伪逆求解estimated_position_AOA(:,i1) = pinv(H)*Y;
end
%% UKF部分
完整代码可从专栏文章中获取:
https://blog.csdn.net/callmeup/article/details/153527570?spm=1011.2415.3001.5331
或单独下载:
https://download.csdn.net/download/callmeup/92163305
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者
