
本文所述的MATLAB 代码实现了基于到达角(AOA)定位的三维定位算法,使用自适应基站数量进行动态轨迹优化。通过无迹卡尔曼滤波(UKF)技术,代码能够提高定位精度,处理动态目标的轨迹
文章目录
程序讲解
功能模块
-
初始化:
- 清空工作环境,设置随机种子。
- 生成目标点坐标和运动轨迹,定义固定基站的位置。
-
AOA 定位:
- 计算目标到各基站的距离。
- 模拟接收到的 AOAs(包括噪声)。
- 使用最小二乘法进行三维定位估计。
-
UKF 部分:
- 初始化滤波模型,包括过程噪声和观测噪声协方差矩阵。
- 进行状态预测和更新,通过迭代优化目标位置的估计。
-
绘图:
- 绘制目标的真实轨迹、预测轨迹和观测值的三维图。
- 生成每个轴的误差图,展示观测值与真实值的差异。
-
位置与误差输出:
- 打印终点的真实坐标、估计坐标及其误差。
- 计算并输出每时刻的均方根误差(RMSE),并绘制 RMSE 比较图。
关键技术
- AOA 定位:通过测量目标相对于多个基站的角度来进行位置估计。
- 最小二乘法:用于求解定位估计的线性方程。
- 无迹卡尔曼滤波(UKF):一种非线性滤波技术,用于提高动态系统状态估计的精度。
结果示例
- 轨迹对比图
- UKF估计值(蓝色点)紧密贴合真实轨迹(蓝色线),显著优于未滤波的观测值(散点)。
- 锚点(红色星号)随机分布,验证算法的自适应能力。
- 误差分析
- X/Y轴误差受运动模型影响较大,UKF有效抑制累计误差;Z轴误差因静态假设接近零。
- RMSE曲线显示UKF全程误差波动最小,稳定性优于纯观测
具体如下:
-
定位示意图:
-
RMSE对比曲线图:
-
三轴误差图:
-
命令行窗口截图:
MATLAB源代码
源代码的结构如下:

部分代码如下:
matlab
% AOA定位,三维、N个锚点(自适应基站数量),动态轨迹UKF优化
% 作者:matlabfilter
% 2025-03-17/Ver1
%% 初始化
clc;clear;close all;
rng(0);
% 生成目标点坐标
position = [-1,-1,1];
% 生成目标的运动
positions = repmat(position,21,1)+[0:0.2:4;0:-0.2:-4;zeros(1,21)]';
% 固定基站位置
num_station =10; %基站数量
stations_position=2*randn(num_station,3); %定义基站的坐标,这里是随机坐标
for i1 = 1:size(positions,1)
position = positions(i1,:);
%% AOA定位
% 计算目标到各基站的距离
true_distances = vecnorm(stations_position - position, 2, 2);
% 模拟接收到的AOA(此时是角度理想值,后面要加噪声)
azimuth_angles = atan2(position(2) - stations_position(:, 2), position(1) - stations_position(:, 1));
elevation_angles = atan2(position(3) - stations_position(:, 3), ...
sqrt((position(1) - stations_position(:, 1)).^2 + (position(2) - stations_position(:, 2)).^2));
% 假设测量的AOA角度和距离上加一些噪声
AOA_noise = 1e-2; % AOA 角度噪声
azimuth_angles = azimuth_angles + AOA_noise * randn(num_station, 1);
elevation_angles = elevation_angles + AOA_noise * randn(num_station, 1);
% 使用最小二乘法进行定位估计 三维直接求解(无需距离)
H = zeros(2*20,3);
Y = zeros(2*20,1);
for i2 = 1:num_station
H(2*i2-1:2*i2,:) = [
sin(azimuth_angles(i2)),-cos(azimuth_angles(i2)),0;
cos(azimuth_angles(i2))*sin(elevation_angles(i2)),sin(azimuth_angles(i2))*sin(
完整代码:https://download.csdn.net/download/callmeup/90538619
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者