现已开源 github:RTLS-UWB
最近做了课程设计,是 基于UWB的室内三维定位
,现在大概过程整理如下:
UWB Mini 3s Plus
开发版,板载 dw1000芯片
(用于UWB通讯),STM32F103T8U6
芯片用于主控。keil v5
用于修改单片机代码blend vs2019
用于开发上位机客户端(采用 c#/.net4.8
)采用STM32F103和UWB通信模块DWM1000组成一个设备,通过软件编写分别设置成标签或基站。在房间的四个角落布置四个基站,标签通过TWR(双边测距)方式依次完成(TDMA)与各基站之间的测距,将标签与基站的距离消息发送至PC端,利用三边定位原理求解标签的位置坐标并显示。
大体分为四部分:设计方案、keil源代码修改与调试、定位算法的研究与实现、上位机的客户端的开发;我主要负责keil源码和上位机的开发部分。
芯片选取:我们采取了研创物联的 Mini 3s Plus
一体化模块,主芯片是一个中等容量的 stm32f103t8u8
芯片,通讯芯片是 dw1000
芯片,中间通过 spi
总线进行连接,如下图:
双向飞行时间法(TW-TOF, two way-time of flight)每个模块从启动开始即会生成一条独立的时间戳。模块A 的发射机在其时间戳上的Ta1发射请求性质的脉冲信号,模块B 在Tb2时刻发射一个响应性质的信号,被模块A 在自己的时间戳Ta2时刻接收。有次可以计算出脉冲信号在两个模块之间的飞行时间,从而确定飞行距离S。 S=Cx[(Ta2-Ta1)-(Tb2-Tb1)]/2 (C 为光速)
我们采用4个不共面的、已经标定好的基站和一个标签来实现3维室内测距,首先标签会每隔一定时间闪烁发送数据包,各个基站收到数据包后会通过双向飞行时间法来测出4个基站分别和标签的距离,并把距离数据传回A0基站,由A0基站通过usb模拟串口传输给上位机的客户端界面,上位机的客户端界面收到信息后,根据最小二乘法来计算出可能的标签坐标,在计算过程中,我们会添加一些修正参数来修正系统的天线时延,在空旷的室内环境,它是线性的。为了防止冲突和碰撞,具体的原理大概如下图:
Keil源码我们在熟读官方例程的基础上进行了一些修改
整个算法我们基于最小二乘法,这是我们了解到的,比较容易实现的精度符合要求的算法,大体分为三步。 建立信标节点与未知节点距离方程组其中:(xi,yi,zi)为基站坐标;(x,y,z)为标签坐标;
方程组为非线性方程组,用方程组中前n-1个方程减去第n个方程后,得到线性化的方程:
AX=b
用最小二乘法求解方程:
由于客户端采用C#/.NET开发,所以我们集成到里面,如下图:
这是主窗体的设计图,里面包含了一个串口调试助手,包含了一些调试功能,自定义功能,和纠错功能,完美支持原厂的帧格式(只需要点一下原厂兼容就可以了)。
最后我们选择在长9.6m,宽6m的大厅进行测试,xy轴误差在20cm左右,在28m的通信距离下依旧能保持良好的准确率,符合了最初的目的。 并且制作了展示视频,如下:
本文作者:mereith
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!