【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接

到达角(AOA, Angle-of-Arrival)定位扩展卡尔曼滤波(EKF) 相结合的二维目标追踪方案。通过多个基站的角度测量信息,对移动目标进行高精度定位,并利用动态运动模型进行轨迹平滑化处理。基站数量可调节,AOA定位模块自适应数量的调整,无需调节矩阵形式

文章目录

程序简介

基本思想

每个基站根据接收到的信号方位角,可以推断目标位于从该基站出发的某条射线上。当多个基站同时进行测量时,不同射线的交点就是目标的真实位置。

扩展卡尔曼滤波 (EKF) 动态轨迹优化

两阶段工作原理

预测阶段

  • 基于目标上一时刻的位置和已知的运动模型(如匀速直线运动),预测当前时刻的位置
  • 同时预测位置估计的不确定性程度(协方差)

更新阶段

  • 获取当前时刻来自AOA定位的观测值(位置测量)
  • 计算"卡尔曼增益"来决定相信预测值还是观测值的程度
  • 根据两者的可信度加权融合,得到当前时刻的最优位置估计
特性 优势描述
自适应基站数量 支持任意数量的基站,基站越多定位精度越高
两阶段融合策略 先通过AOA最小二乘获取观测值,再用EKF进行动态平滑,充分利用位置约束与运动约束
抗噪声能力强 通过最优加权融合观测值和预测值,显著降低高频抖动和异常脉冲
计算量小 二维线性模型,实时性好,适合嵌入式系统和移动平台部署
可视化完整 同时展示轨迹对比、误差时间序列、误差概率分布等多维度性能指标
灵活扩展 易于升级为处理非线性问题的无迹卡尔曼滤波,或扩展至三维应用

性能评估指标

系统通过以下指标进行定量评估:

  • 单轴误差: 分别统计X方向和Y方向的定位偏差
  • 距离误差: 计算估计位置与真实位置的欧几里得距离偏差
  • 误差分布函数: 使用累积分布函数(CDF)展示误差的概率特性,例如"有90%的概率误差不超过1米"

后续优化与扩展方向

非线性运动建模

升级至加速度变化的运动模型,适应目标的复杂机动行为。

自适应参数学习

在线估计噪声统计特性,自动调整滤波器参数以适应环境变化。

多目标联合追踪

扩展至同时处理多个移动目标的并行估计。

三维应用扩展

加入俯仰角维度,实现从二维到三维的立体定位。

多传感器融合

结合AOA、TDOA、RSSI等多种测量方式,提升定位鲁棒性。

运行结果

定位示意图:

XY轴误差绝对值曲线

距离误差曲线:

MATLAB源代码

程序结构:

部分代码如下:

matlab 复制代码
% AOA定位,二维、N个锚点(自适应基站数量),动态轨迹EKF优化
% 作者联系方式:微信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

完整代码见专栏文章:
https://blog.csdn.net/callmeup/article/details/153521003?spm=1011.2415.3001.5331

或通过下方链接单独下载:
https://download.csdn.net/download/callmeup/92162288

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

相关推荐
细节控菜鸡4 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis
Pluto_CSND4 小时前
Java实现gRPC双向流通信
java·开发语言·单元测试
原来是猿5 小时前
谈谈环境变量
java·开发语言
应用市场5 小时前
本地局域网邮件管理系统:从原理到实现的完整指南
开发语言
Tony Bai6 小时前
【Go 网络编程全解】12 本地高速公路:Unix 域套接字与网络设备信息
开发语言·网络·后端·golang·unix
oioihoii6 小时前
深入理解 C++ 现代类型推导:从 auto 到 decltype 与完美转发
java·开发语言·c++
报错小能手6 小时前
项目——基于C/S架构的预约系统平台 (1)
开发语言·c++·笔记·学习·架构
MYX_3096 小时前
第四章 多层感知机
开发语言·python
彬彬醤7 小时前
如何正确选择住宅IP?解析适配跨境、流媒体的网络工具
服务器·开发语言·网络·网络协议·tcp/ip