UWB

此处说的UWB是超宽带,代码是matlab的一个简单的函数,函数输入若干个待定位点的横纵坐标,输出经UWB定位后的位置信息(坐标)。默认2维、任意数量的待定位点,4个基站,基站数量和误差在程序内可调,程序链接:
https://github.com/evandworld/UWB/blob/main/UWBlocation.m 代码里面只有少量英文注释,编写时参考了论文:《基于 UKF 的 UWB 和 GPS 融合定位算法》,但是并没有参考别人的定位程序,所以可能有部分惯用变量的定义与大家的共识有出入,建议配合本文中文解释一起食用。

程序解释

关于UWB的介绍不再过多介绍,需要的网上面一搜一大堆,上面的论文也说到了一点,自行下载。

初始化

先初始化程序,包括函数形式的初始化(定义函数的行数和列数)、基站的坐标(用baseP表示)。

计算距离真实值

这里的距离没有用d表示,而是用R,因为后面计算坐标时,距离是作为圆的半径来算的。
距离真实值有勾股定理迭代计算:

for i=1:length(X_)
    R(i,:) = ((X_(i)-baseX_).^2+(Y_(i)-baseY_).^2).^0.5;
end

这里迭代i次对应的是有i个待求的点,而不是i个基站。因为选择的基站数量有4个,所以每次迭代时,产生一个4维的列向量,迭代完成后,产生一个i行4列的矩阵R。

计算时间真实值

这个就很简单了,时间是距离除以光速:

time = R/(3e8);

如果要模拟TDOA啥的,在前面乘2

加噪声形成时间真实值

为了应对不同的情况,同时增加仿真的真实性,噪声如下:

time_actually = time + err*randn(length(X_),length(baseX_)).*time;

这里的err是大函数的输入,留了这个接口是为了调试的时候需要调节噪声的情况可能较多,放在函数输入值里面方便调。
顺便说明一下,个人理解,UWB的误差大多在这个时间计算上,或者说可以等效到时间计算上,所以这里时间误差的大小是本仿真程序的唯一噪声加入点。

计算真实的距离

根据时间计算真实的待定位点与基站的距离。也很简单,直接吧前面的time_actually乘上3e8

计算位置

这里就是参考上面论文的地方了,以待测点为圆心(x,y),与基站1(x1,x2)的距离半径(R1)为圆,可以得到下式:

UWB 定位算法java实现 uwb定位代码_室内定位

同理,以待测点为圆心,与基站2(x2,y2)的距离为半径(R2)画圆,可以得到下式:

UWB 定位算法java实现 uwb定位代码_github_02

两式联立,得到:

UWB 定位算法java实现 uwb定位代码_github_03

如果一共有4个基站,则上式有四个,组成一个矩阵表示方法:

UWB 定位算法java实现 uwb定位代码_UWB 定位算法java实现_04

其中:

UWB 定位算法java实现 uwb定位代码_matlab仿真_05


图片里的d就是我用的R

对H求伪逆UWB 定位算法java实现 uwb定位代码_室内定位_06,UWB 定位算法java实现 uwb定位代码_UWB_07

X即为待求点的坐标,在程序里面以p_out表示

结果输出与绘图

结果直接输出p_out即可
绘图方面,绘制散列图:
用到的函数:

fig(p,p_out);