UWB定位系统

1 背景:

这是之前研一的时候一直在做的项目。老师好像从Decawave海南那边的研究所得到了一套不知道是要淘汰还是没有上市的定位测试系统。已经有了针对DW1000的外围硬件PCB设计,我们基于这些进行后续的开发。最终目标是完成一套能够在监狱使用,定位监狱服刑人员的系统。

2 系统组成:

硬件分为基站(Anchor)和信标(Tag),软件分为下位机的硬件在跑得嵌入式软件和上位机PC在跑得解算和GUI软件。
基站关键部分是ATSAM4E8+DW1000,信标关键部分是STM32+DW1000
软件下位机C语言编程,上位机QT编程。

系统框图:
UWB定位系统_第1张图片
其中,基站Anchor需要提前固定好位置,通过网线与交换机(hub)连接,最后连接到上位机的PC。信标Tag不断的发射UWB信号,被周围的基站接收到后,通过定位算法得到Tag的位置。

3 学习到的技术:

  • UWB原理

UWB的全称是ultra wide band,翻译过来是超宽带。从频域来看,超宽带有别于传统的窄带和宽带,它的频带更宽。窄带是指相对带宽(信号带宽与中心频率之比)小于1%,相对带宽在1%-25%之间的被称为宽带,相对带宽大于25%、或者中心频率大于500MHz的被称为超宽带。

不同于目前主流窄带通系统的载波调制方案,UWB发射脉冲信号来传输信息,我们称之为脉冲调制。通俗的理解是这样的,我们通常通过调节正弦波的频率、相位、幅度等参数来传输信息,并通过傅里叶变换等频域分析方式来接收、解调这些信息,这里的「正弦波」我们称为「载波」。而传统UWB通信系统中,我们不需要「正弦载波」作为载体,而是直接发射电磁脉冲,通过调节脉冲的幅度(PAM,脉冲振幅调制)和脉冲的位置(PPM,脉冲位置调制)等方式来传递信息。

从频域和时域的角度,也可以理解为传统UWB是单纯的时域信号处理,不需要射频电路中的本振,差分等射频模块。如果产业成熟度相同,那么UWB通信模块成本应当低于传统的窄带通信模块。(这里请特别注意前置条件)。

我们都知道,UWB所采用的是500MHz以上的大带宽。而频域扩展等于时域收缩,因此现在的传统UWB系统中,脉冲的宽度一般在数纳秒到数十纳秒之间,这意味着信号本身的占空比很低。

占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。占空比(Duty
Ratio)在电信领域中有如下含义:例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。

如果大家有了解过雷达基础就会知道,对于脉冲信号来说,信号的占空比很低意味着脉冲宽度很小,一个定位系统里,距离分辨率与脉冲宽度成正相关:脉冲宽度越小,距离分辨率越小,可以分辨的两点就越近,精度就越高。具体公式很简单:
公式
这就意味着传统UWB所采用的窄脉冲和高频带天然会带来更高的距离分辨率。比如如果Wi-Fi的定位精度是3.0m-6.0m这样的米级,那UWB可能就是厘米级。

优势: UWB定位同时具有实时定位和精确定位的双重优点,定位的延迟时间远远小于蓝牙定位、WIFI定位等其他的室内定位技术。精度可以达到10cm左右,是室内高精度定位的首选。
UWB定位需要建设专用的定位网络,因此系统自身有着很好的可靠性。另外,由于UWB定位采用非常规的频谱,所以抗干扰能力比较强。

缺陷: 通信距离短,波束指向性强(需要波束明确指向接收源),现阶段成本高(核心芯片就两三家,几乎被Decawave垄断,说明市场也有限),遮挡问题、多径问题、多Tag问题没能很好的解决(NLOS,multi path,>1000 nodes)。

  • 硬件

这次虽然主要是做软件,但也顺带着把硬件的流程也都走了一遍,不过好在不用设计PCB图。只是有个元件国内几乎找不到,改了个PCB上的元件封装。趁此机会也记一下整个硬件制作流程。
首先是,根据需求设计原理图,画出对应元件的封装,生成PCB,布线。检测冲突后完成。
把PCB文件发给板厂做板,开始是想继续选择嘉立创的,可是这次的板是通讯板,涉及到了阻抗匹配,嘉立创做不了带阻抗匹配的板,便另找了别家。
通过PCB生成对应的BOM表,发给元件商采购元件。虽然淘宝上有专门做UWB硬件的供应商,可这块国外人设计的板上还有几个冷门的元件很难找。一个是POE网口,简直搜遍全网都没能找到,后来还是贴片厂的人好心帮忙找到的,刚好他们的物料采购是富士康刚跳出来的,人脉很广,联系到了厂家要了一些样品来做。还有就是六角晶振,开始怎么也找不到,后来仔细研究了一下原理图和PCB才发现中间两个角原来是废角,不用接也行,就用了别的晶振替代。
这里贴片找的厂商是深圳兴广正,一定要特别表扬一下。上面说到帮忙找到物料的也是这家公司,贴片贴的很完美,遇到些小问题也有专门的技术给及时解决。结束时还邀请我们参观他们的工厂,设备都很完备。原来他们也可以负责采购元件,包括后续刷程序,包装出货一条龙都能做。类似于代工厂那种,只要我们出设计,他们就能帮忙做出成品。这次的工作真的满意,期待下次的合作。

  • 网络连接

上位机和下位机通过网线连接,涉及到了一些网络通信的知识。

DHCP: DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。
工作原理图:
UWB定位系统_第2张图片

由于DHCP是C/S模式运行的,所以使用DHCP的设备为客户端,而提供DHCP服务的为服务端。DHCP客户端可以让设备自动地从DHCP服务器获得IP地址以及其他配置参数。使用DHCP客户端可以带来如下好处:(1)降低了配置和部署设备时间;(2)降低了发生配置错误的可能性;(3)可以集中化管理设备的I地址分配。
这里下位机设备为DHCP的客户端,而上位机PC作为DHCP的服务端。

起初,上位机PC使用dhcpwiz这个软件配置成DHCP服务端,但后来发现一个弊端,无法保存和指定IP,导致一段时间后重连或者换了台电脑后,整个得到的下位机IP清单又会被重新配置,每次都不一定一样。所以便又在网上找,最终找到了另一个非常好用的软件BOOTP-DHCP Server 2.3.2 Standalone。界面更加友好,也能指定IP和保存之前配置过的设备信息。但无论哪个软件,都要记得在配置DHCP之前将PC自身连接的网络断掉,并将电脑IP地址那里设置成与即将设置的DHCP同一网段。

BOOTP-DHCP Server 2.3.2 软件如下:
UWB定位系统_第3张图片
可见已发现下位机设备,双击即可分配IP地址。

mDNS: mdns 即多播dns(Multicast DNS),mDNS主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、名语法和资源记录类型。并且没有指定新的操作代码或响应代码。在局域网中,设备和设备之前相互通信需要知道对方的ip地址的,大多数情况,设备的ip不是静态ip地址,而是通过dhcp协议动态分配的ip 地址。但在初次连接或者偶尔的掉线重连之后没准ip就变了,而且你也不知道要连接的设备的ip是多少。基于此,mDNS登场了,它主要实现了设备间的互相发现。

mDNS工作原理
首先,在 IP 协议里规定了一些保留地址,其中有一个是 224.0.0.251,对应的 IPv6 地址是 [FF02::FB]。
mDNS 协议规定了一个端口,5353。mDNS 基于 UDP 协议。
每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息,我是谁,和我的IP地址是多少。然后其他也有该服务的主机就会响应,也会告诉你,它是谁,它的IP地址是多少。当然,具体实现要比这个复杂点。
比如,A主机进入局域网,开启了 mDNS 服务,并向 mDNS 服务注册以下信息:我提供 FTP 服务,我的IP是 192.168.1.101,端口是 21。当B主机进入局域网,并向 B 主机的 mDNS 服务请求,我要找局域网内 FTP 服务器,B主机的 mDNS 就会去局域网内向其他的 mDNS 询问,并且最终告诉你,有一个IP地址为 192.168.1.101,端口号是 21 的主机,也就是 A 主机提供 FTP 服务,所以 B 主机就知道了 A 主机的 IP 地址和端口号了。

我们通过TCP&UDP测试工具调试mDNS:
UWB定位系统_第4张图片
将下位机Anchor通过网线接入PC,PC端进行UDP组播,组播IP为224.0.0.251,端口为5353(mDNS)。
组播后下位机收到会同样以UDP广播的方式发送消息,如下:
在这里插入图片描述
UWB定位系统_第5张图片
此时,我们便可得到设备当前的IP,以及组播信息中包含的当前设备的MAC号信息。
下面我们便可通过IP地址与其建立TCP连接。通过TCP测试工具和抓包工具测试的效果如下:
UWB定位系统_第6张图片
在这里插入图片描述
成功建立TCP连接后,便可发送控制指令和接受反馈信息。
整个网络连接过程如下框图所示:
UWB定位系统_第7张图片
其实总结起来就是用DHCP分配给接入设备IP地址,用mDNS发现设备,建立TCP连接完成通讯过程。

通讯指令
均采用16进制报文的形式,具体指令信息不再展开讲。
只举一小段例子来解析,比如首次连接时,下位机会传一段十六进制信息如下:
UWB定位系统_第8张图片
其中为了方便解释,用数组buf[n]来表示上表序号n对应的二进制数。
buf[1]=0x02:是下位机所发信息的起始标志。所有下位机所发信息都是以02起始。
buf[2]-buf[3]:是下位机此次所传信息的长度。其中buf[2]是长度的低位,buf[3]是长度信息的高位。如本条信息中,buf[3]=00,buf[2]=40,则对应十进制的数据长度是64,说明从此开始到之后的64个字节都是此次所发的信息内容,即buf[4]-buf[67]都是本次的信息内容。
buf[4]-buf[67]:本次的信息内容。首先第一字节,即buf[4]=42,这是本次所发内容的标志信息,42对应的是下位机当前的配置信息的标志位。之后便是具体的内容,buf[5]-buf[12]是下位机的ID号,每台机都是独有的,同样前面表示低位,后面表示高位,由表可以看出下位机的ID为:10205f1c100001f4。之后buf[13]-buf[67]里面的内容都是ascii码,根据ascii码表可以查出对应内容为:VERION:3.6. 150921 COMPILED: Sep 21 2015 16:0 2:50…。即对应的版本,日期,时间等内容。
buf[68]-buf[69]:16CRC校验位。
buf[70]=0x03:是下位机所发信息的结束标志。所有下位机所发信息都是以03结束。

  • 下位机嵌入式编程

基站Anchor
下位机基站的程序是整个系统中最复杂的部分。主要实现的功能:与上位机网络通讯、对DW1000的读写、一些简单的计算(双边测距时用到)。使用了ecos作为操作系统调度任务,而且ecos库里也已包含了LWIP库可用于网络通讯。
UWB定位系统_第9张图片
ecos介绍
eCos(embedded Configurable operating system),即嵌入式可配置操作系统。是一款轻量级嵌入式操作系统。一个最小配置的Linux内核大概有 500KB,需要占用1.5MB的内存空间,这还不包括应用程序和其它所需的服务;eCos可以提供实时嵌入式应用所需的基本运行基件,而只占用几十KB 或几百KB的内存空间。eCOS是一个源码开放的可配置、可移植、无版税、面向深嵌入式应用的实时操作系统。从eCOS的名称可以看出,它最大的特点在于 它是一个配置灵活的系统。ECOS的核心部分是由不同的组件组成的,包括内核、C语言库和底层运行包等。支持完整的TCP/IP协议栈和流行网络接口驱动,具有RAM和ROM等特色文件系统及相当灵活简便新文件系统加入机制,并且支持流行的线程同步机制(信号量,计数器,油箱,互斥,条件量,事件标志,及用于SMP的自旋锁等等),改进的中断处理机制让临界区代码尽量少,关中断时间缩短。将中断处理分为三层(参考eCos相关手册)(类似linux处理方法,这个ucos应该要汲取这种机制)等等。每个组件以能提供大量的可配置选项,利用eCOS 提供的配置工具可以很方便地进行配置。通过不同的配置使得eCOS能够满足不同的嵌入式应用。
之前使用ucos,调度以任务为单位,而ecos调度则以线程为单位。使用cyg_thread类表示线程。

lwip介绍
lwip(Light Weight IP)是一个小型开源的TCP/IP协议栈,实现的重点是在保持TCP协议主要功能(包括TCP、UDP、ICMP、IP、ARP、DHCP)的基础上减少对RAM 的占用。lwIP协议栈主要关注的是怎么样减少内存的使用和代码的大小,这样就可以让lwIP适用于资源有限的小型平台例如嵌入式系统。为了简化处理过程和内存要求,lwIP对API进行了裁减,可以不需要复制一些数据。

CCP介绍
由于系统使用TDOA定位算法(后文会介绍),所以基站之间必须要保持时间同步。实现方式就是通过设置主从基站,主基站不断的发送CCP(clock calibration packets),从基站接收到CCP,他们都把CCP信息回传到上位机解算得到他们的同步时间。
关系如图所示:
UWB定位系统_第10张图片
具体的实现步骤、公式推导和计算方法可能会另开一篇文章专门讲,这里也不展开写了。

TWR介绍
TWR(Two Way Ranging)双边测距,通过两个基站间收发信号,解算出两个基站之间的距离关系。无需时间同步。具体原理也另开一篇讲吧。
关系如图所示:
UWB定位系统_第11张图片
RTLS介绍
RTLS(real time location system)其实算是整个系统的名称,但也用它来定义了主要功能,即定位信标的位置。整个系统工作时,主基站会不断向周围发送CCP信号,而信标Tag会不断的向周围发出BLINK信号,基站一旦收到就立刻回传给上位机,在上位机端统一分析解算。
关系如图所示:
UWB定位系统_第12张图片
信标Tag
相对来说,信标的程序就要简单的多,基本只有初始化配置和间隔时间发送信号的功能。连操作系统都不需要,只是定时器中断然后发送信号。所以不再展开介绍了。

  • 定位算法

本系统所用的定位算法是TDOA(Time Difference of Arrival)飞行时间差。具体原理是各基站通过时间同步,把接收到信标BLINK的时间转化为统一基准的时间,两两作差,由到两个点差为定值可以画出相应的双曲线,分别画出双曲线后相交的点即为信标所在的位置。
算法示意图:
UWB定位系统_第13张图片
公式不再列出来了,想了解可以去看下参考文献里的。
相关原理的论文也都已经录入知网,这里列几篇:
《无线时钟同步算法在UWB定位技术中的研究与应用》
《联合TDOA改进算法和卡尔曼滤波的UWB室内定位研究》
《基于UWB技术的TDOA定位算法的研究与实现》
《基于UWB的室内定位算法研究与应用》

  • 遇到的问题

开始硬件情况未知的情况下打板买物料做出来,最后下程序测试,没想到真的跑了起来,还是感觉非常幸运和有成就感的。

有个比较大的问题是时间同步的时候,可能由于各基站的晶振或者别的硬件之间的个体差异,虽然有CCP,但计算出的同步时间还是不准。CCP每150ms发送一次,用本次收到CCP去同步完时间后,和150ms后再次收到CCP去同步完后时间比较并不完全一致,虽然差值只在皮秒级别,但对于光速来说还是不可接受的,会导致结果出现几米的误差。分析原因应该是150ms间两个晶振间出现了时钟漂移,虽然很小,但对结果还是有影响。而且观察这个漂移量,发现并没有什么规律,是个非线性的值。
针对这个问题,提出的解决方法是通过卡尔曼滤波来跟踪时钟的漂移。因为也涉及到原理和公式推导还有MATLAB仿真,这里也不张开讲了,也会另外再开一篇。

还有一个问题,罗老师那边提出一个想法,说能不能得知信号的强度,这样就能够根据信号的强度来估算收到的信号间到底有没有墙。我仔细查阅了DW1000的手册,发现还真有信号强度的信息,DW1000会有收到信号的质量信息,保存在一个寄存器里,算diagnosis信息的一部分,读出来然后通过给的公式计算即可得到估算的信号强度值。这个也会另外再开一篇写

另外代码的话,应该系统可能商用,而且没完结,我也没毕业,暂时不能上传,不能支持开源了。

参考文献:
https://www.zhihu.com/question/345471985/answer/836891220
https://www.jianshu.com/p/c20729a29938
相关百度百科

你可能感兴趣的:(嵌入式,项目总结)