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)为圆,可以得到下式:
同理,以待测点为圆心,与基站2(x2,y2)的距离为半径(R2)画圆,可以得到下式:
两式联立,得到:
如果一共有4个基站,则上式有四个,组成一个矩阵表示方法:
其中:
图片里的d就是我用的R
对H求伪逆,
X即为待求点的坐标,在程序里面以p_out表示
结果输出与绘图
结果直接输出p_out即可
绘图方面,绘制散列图:
用到的函数:
fig(p,p_out);