本 MATLAB 程序实现了基于 Angle of Arrival (AOA) 与 Time Difference of Arrival (TDOA) 的二维定位方法,通过自适应融合与最小二乘优化,实现对未知目标的高精度估计。本例中固定使用了 3 个基站(锚点),算法框架支持扩展到更多基站。
直接运行后可得到二维、3个锚点的TDOA(到达时间差)与AOA(到达角度)的混合定位方法的定位结果展示与对比
文章目录
- 程序简介
- 系统模型与参数
- TDOA建模
- AOA建模
- AOA/TDOA混合定位方法
- 运行结果
- MATLAB源代码
程序简介
系统模型与参数
-
目标位置:未知点 p=[x,y]⊤\mathbf{p} = [x, y]^\topp=[x,y]⊤
-
锚点位置:第 iii 个基站坐标为 si=[xi,yi]⊤\mathbf{s}_i = [x_i, y_i]^\topsi=[xi,yi]⊤,i=1,2,3i = 1, 2, 3i=1,2,3
-
噪声模型:
- AOA噪声:高斯白噪声 N(0,σθ2)\mathcal{N}(0, \sigma_\theta^2)N(0,σθ2),默认 σθ=10−2\sigma_\theta = 10^{-2}σθ=10−2
- TDOA噪声:高斯白噪声 N(0,σt2)\mathcal{N}(0, \sigma_t^2)N(0,σt2),默认 σt=10−10\sigma_t = 10^{-10}σt=10−10
TDOA建模
TDOA测量基于不同基站之间接收到信号的时间差。对于目标到第 iii 个基站的理想距离为:
ri=∥p−si∥2r_i = \| \mathbf{p} - \mathbf{s}_i \|_2 ri=∥p−si∥2
TDOA观测值定义为:
Δri=ri−r1+ni,i=2,3\Delta r_i = r_i - r_1 + n_i, \quad i=2,3 Δri=ri−r1+ni,i=2,3
对应时间差:
Δti=Δric,c为光速\Delta t_i = \frac{\Delta r_i}{c}, \quad c \text{ 为光速} Δti=cΔri,c 为光速
最终形成的观测方程:
Ri=ri−r1,i=2,3R_i = r_i - r_1, \quad i=2,3 Ri=ri−r1,i=2,3
用于构建非线性约束方程,后续由最小二乘方法迭代解算。
AOA建模
AOA 使用信号到达方向(角度)进行定位。第 iii 个基站测得的理想角度为:
θi=arctan2(y−yi,x−xi)\theta_i = \arctan2(y - y_i, x - x_i) θi=arctan2(y−yi,x−xi)
加入角度噪声 nθ,i∼N(0,σθ2)n_{\theta,i} \sim \mathcal{N}(0, \sigma_\theta^2)nθ,i∼N(0,σθ2) 后,构造以下线性测量模型:
sin(θi)(x−xi)−cos(θi)(y−yi)=0\sin(\theta_i)(x - x_i) - \cos(\theta_i)(y - y_i) = 0 sin(θi)(x−xi)−cos(θi)(y−yi)=0
整理成最小二乘形式 Hp=Y\mathbf{H}\mathbf{p} = \mathbf{Y}Hp=Y:
Hi=[sin(θi)−cos(θi)],Yi=xisin(θi)−yicos(θi)\mathbf{H}_i = \begin{bmatrix} \sin(\theta_i) & -\cos(\theta_i) \end{bmatrix}, \quad \mathbf{Y}_i = x_i \sin(\theta_i) - y_i \cos(\theta_i) Hi=[sin(θi)−cos(θi)],Yi=xisin(θi)−yicos(θi)
所有基站数据合并后估计目标位置:
p^AOA=(H⊤H)−1H⊤Y\hat{\mathbf{p}}_{AOA} = (\mathbf{H}^\top \mathbf{H})^{-1} \mathbf{H}^\top \mathbf{Y} p^AOA=(H⊤H)−1H⊤Y
AOA/TDOA混合定位方法
详见代码中的注释。
运行结果
运行结果如下:
命令行输出的定位结果与误差:
MATLAB源代码
程序结构如下:
部分代码如下:
% AOA与TDOA混合定位例程,适用于二维环境、3个锚点的定位
% 作者:matlabfilter
% 2025-07-05/Ver1%% 初始化
clc;clear;close all;
rng(0);
% 定义参数和待测点位置
num_stations = 3; % 基站数量(锚点数量)
TDOA_noise = 1e-10; %TDOA误差
AOA_noise = 1e-2; % AOA 角度噪声
% 固定基站位置
stations_position = 100*randn(3,2);
c = 3e8;
% 待定位点
position = 0*ones(1,2)+5*randn(1,2);
% TDOA 建模
delta = ones(3,1)*position - stations_position; %未知点与各基站之间的相对位置(矢量)
r_ideal = (sum(delta.^2,2)).^(1/2); %计算移动台到各个基站的实际距离(标量)
delta_t = r_ideal/c+TDOA_noise*randn(size(r_ideal));
r = delta_t*c;
Ri = r(2:end,:);
R1 = ones(2,1)*r(1,:);
R = Ri-R1; %表示从[2,i]开始MS与基站i和基站1的距离差%% AOA定位
% 计算目标到各基站的距离
num_station = size(stations_position, 1);
% true_distances = vecnorm(stations_position - position, 2, 2);% 模拟接收到的AOA(此时是角度理想值,后面要加噪声)
azimuth_angles = atan2(position(2) - stations_position(:, 2), position(1) - stations_position(:, 1));% 假设测量的AOA角度和距离上加一些噪声
azimuth_angles = azimuth_angles + AOA_noise * randn(num_station, 1);
% 使用最小二乘法进行定位估计 直接求解(无需距离)
H = zeros(1*num_station,2);
Y = zeros(1*num_station,1);
完整代码的下载链接:https://download.csdn.net/download/callmeup/91274669
如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者