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

在这里插入图片描述

AOA定位,动态轨迹,无迹卡尔曼滤波UKF优化轨迹,对动态目标定位。锚点的数量是自适应的,无需针对不同的锚点数修改定位的矩阵等参数。函数已集成到一个m文件中

程序介绍

本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] = Y
    H = zeros(num_station, 2); % H 矩阵 (N, 2)
    Y = zeros(num_station, 1); % Y 向量 (N, 1)
    
    for i2 = 1:num_station
        H(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.youkuaiyun.com/callmeup/article/details/153527570?spm=1011.2415.3001.5331

或单独下载:
https://download.youkuaiyun.com/download/callmeup/92163305

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MATLAB卡尔曼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值