TOA/TDOA
TOA (Time of Arrival)和TDOA (Time Difference of Arrival)是通过传播时间来确定位置的方法。
换算成的单程信号传输时间
τ
\tau
τ加上噪声
n
o
i
s
e
noise
noise后,再乘上光速
c
c
c,即可得到距离
r
a
n
g
e
range
range,如下:
r
a
n
g
e
=
(
τ
+
n
o
i
s
e
)
∗
c
range = (\tau+noise)*c
range=(τ+noise)∗c
当已知点的坐标确定,已知点与待测点之间的距离也测得以后,可以根据最小二乘法计算出来待测点的位置坐标。
之前发布的相关程序有:
- 固定点下的二维坐标求解:https://blog.csdn.net/callmeup/article/details/136648868
- 高度上带有气压校准的三维坐标求解:https://blog.csdn.net/callmeup/article/details/136841197
- 带权重的求解方法:https://blog.csdn.net/callmeup/article/details/136839547
本文所述的程序通过设置已知点坐标、测距精度等参数,提供一个可以随意调节已知点(锚点)数量的最小二乘法。
可用于多点定位、自适应TOA、自适应TDOA算法的编程。
设置过程与运行结果
如下,设置待求点坐标、锚节点数量、测距误差:
point1 = [0.5,0.5]; %待求点坐标真值
n = 8; %定义锚节点数量
range_err = 0.1; %测距误差
绘制锚点、待测点真值、求出来的值的二维图像:
图中,共8个红色小圆圈,它们是已知的锚点,也就是定位使用的基站,数量符合前面设置的“num = 8;”。同理,蓝色圆圈是待测点的真值,是前面输入的值,红色“*”号是实际解算出来的值,和蓝点比较接近,它们俩离得越近说明定位效果越好。
程序结构
结构如下,由主程序注释、绘图、输出、定位函数组成:
命令行窗口也能显示出来准确的坐标:
程序源码
测试代码部分
% TOA/TDOA测距定位,二维任意(>3)个锚节点
% author:Evand
% 2024-7-22/Ver1
clear;clc;close all;
rng(0);
%% 主程序
point1 = [0.5,0.5]; %待求点坐标真值
n = 8; %定义锚节点数量
range_err = 0.1; %测距误差
baseP = [sin(1:n);cos(1:n)]';
R_calcu = sqrt(diag((point1-baseP)*(point1'-baseP')))+range_err*randn; %含噪声的距离
[p_out] = position(R_calcu,baseP);
%% 绘图
figure;
plot(point1(1),point1(2),'o');
hold on
plot(p_out(1),p_out(2),'*');
scatter(baseP(:,1),baseP(:,2),'or');
legend('待定位点(真实值)','待定位点位置解算(输出值)','锚点(已知点)');
%% output
fprintf('输入的坐标为(%f,%f)\n',point1(1),point1(2));
fprintf('输出的坐标为(%f,%f)\n',p_out(1),p_out(2));
函数代码部分
上面测试代码里面,positon是我写的函数:
function [p_out] = position(R_calcu,baseP)
[baseX_,baseY_] = deal(baseP(:,1),baseP(:,2));
len = size(baseP,1);
% 完整代码下载链接:https://gf.bilibili.com/item/detail/1105868012
end