【UWB/室内定位】DW1000大坑-基础系统搭建1

少女dtysky

世界Skill

时刻2015.11.22

如果自嘲只不过是将真诚化为伪装的工具。
那么。
就让我将之坚持到底吧。


由于公司项目需求所以研究了一下UWB定位,UWB即超宽频定位,一般用于室内离线定位,在众多离线定位方法中它算是精度最高的之一,其定位原理一般为TOA活着TDOA。DW1000则是公司研发的一款UWB定位芯片,它同时也可以用于通信。此芯片据说可以达到300M、6.8mbps的传输速度,定位精度可以到达10cm,并且除了官方的开发套件外也有现成的开源方案。本章将会说明如何搭建一个基础的UWB硬件系统,着重于说明期间遇到的一些大坑,比如电源...


1 UWB

UWB定位,超宽频定位,本质上和GPS卫星定位的原理是一样的,它不过是将卫星放在了地面上,也就是自己搭建作为卫星的基站,然后去根据和GPS定位相同的算法计算出每个Anchor(基站)到Tag(移动站)的距离,从而解算出移动站的空间坐标,对于三维空间定位而言一般至少需要四个Anchor,Anchor的数量增加不但可以构建超定方程组使用一些算法提高精度,同时也可以作为通信质量不佳下的冗余设计,所以在可以接受的条件下,基站的数量一般越多越好。

UWB

1.1 DW1000

DW1000DecaWave公司推出的一款UWB定位芯片,按照其DATASHEET说明,其有效距离可以达到300m,同时据代理商提供的信息,其定位精度可以到到10cm的程度,这在业内算是一个非常不错的参数。不过介于每个厂商总会吹一些牛的这个业界常识,我们还是要自己测试一下才知道具体的事实。
对于有钱的开发者,建议直接购买EVK1000或者TREK1000进行开发,这两者都是官方自己生产的开发板,无论是电路走线还是电源方面都有着很可靠的保证,操作上更是做到了去除对PC的依赖,开机即可在LCD屏上看到测距效果。对于一般的开发者,则建议购买DWM1000这个官方封装好的模块进行开发,相对于裸片,它集成了时钟和天线等,比较便于测试。

下面是我购买到的DWM1000模块,260一块~:

DWM1000

DW1000的控制比较简单,其指令和数据的传输全部是基于SPI总线的,这是最简单的一种总线,通过有SPI支持的单片机几乎可以进行无痛操作,而具体的寄存器介绍和配置请见DW1000 UserManual

1.2 TOA/TDOA

UWB定位的原理是TOA或者TODA,当然也有还有AOA等,不常见。

1.2.1 TOA

TOA即“到达时间”,这种方式定位是通过Anchor和Tag之间的多次通信实现的,如下图:
TOA

  1. Anchor首先发给Tag一个包,同时记录下Anchor当前的时间信息,记为T1。
  2. Tag收到基站的信息,返回一个ACK。
  3. Anchor收到Tag的ACK,记录当前的时间信息,记为T2。
  4. Anchor计算时间差Tr = T2 - T1,并且根据此计算出距离:

d = c * Tr / 2

其中c为光速。

当然,实际应用中为了更加靠谱,往往不仅仅是利用两次通信来测距,还会有更加复杂的多次通信来提高精度,详细的同样可以看DW1000的UserManual最后一节。
对于空间定位,只需要利用SX(球面相交法)便可以得出最后的坐标。
可见,为了一次定位,每个Anchor和Tag之间要进行两次通信,故DecaWave又将这种定位方式称为“Two-way-ranging”。这种定位的优势在于其实现的便捷性和对硬件的宽容,只需要有几个摆放在不同位置的Anchor和一个Tag便可进行定位,而缺点嘛...首先自然是定位速度了,其次,由于每次通信的质量无法保证,而一对Anchor/Tag又无法做自我的校准,精度自然也会受到相当的影响。

1.2.2 TDOA

TODA即“到达时间差”,这种方式的一次测距是由两个Anchor和一个Tag实现的。在这种模式下,多个时钟完全同步的Anchor同时接受来自一个Tag的包,对于不同位置的Anchor,同一个Tag的同一次广播包到达的时间是不同的,所以便有有以下算法:

  1. Tag发出一个广播包。
  2. 两个Anchor接收到同一个包,Anchor1接收到的时间为T1,Anchor2接收到的时间为T1。
  3. 计算时间差Td = T2 - T1。
  4. 对于至少四个Anchor,可以得到三组这样的两两之间的信息。
  5. 通过数学方法(multi-lateration)可以解算出Tag的空间坐标。

由于算法比较复杂,这里不再赘述。

由此可见,TDOA的优势首先在于一次定位的通信次数显著减少,其次由于是用时间差而非绝对时间进行测距,其精度也比TOA高出一些。但优势总是以一些代价换来的,TDOA系统中各个Anchor的时钟必须严格同步,由于这种定位本质上是依赖于光速的,所以1ns的固有时钟误差便可以造成30cm的固有距离误差,这一点显然是不可接受的。而要打造一个间距比较大的精确同步系统成本又是比较高昂的,所以从这个层面来讲,TDOA并非一般人或者公司可以玩得起的。
当然,DecaWave自身研究出了另一种TDOA的方式(详见APS003),也就是在时钟之外另外加了一个同步位用于同步,不过看起来也是比较复杂的,暂时没有深究。


2 基础系统搭建/电源需求

在搭建系统之前首先调研有没有现成的项目可以用于测试,寻找后首先进入视线的是基于arduino的这个项目,此项目使用Arduino作为主控,提供了一系列的API和例子。

2.1 基于Arduino的系统

首先在淘宝上购买了二十多一片的山寨Arduino Nano,用面包板搭建了一个最基础的两片测距系统进行测试,系统如图,测试遇到的一些问题如下:
山寨

  1. 程序无法工作,重复setup或者跑着跑着跑飞了。
  2. 使用示波器检测SPI通信,表明正常;使用逻辑分析仪抓SPI包,分析正常。排除SPI接口问题。
  3. 可连接性测试例子调试,程序跑飞,操蛋过程略,在每次打印设备信息前加100ms的延迟,跑通。
  4. 基础收发例子,跑飞,在打印信息前加延迟,无效,全部注释逐个取消注释,发现代码超过一定量跑飞,初步定为为片子质量有问题。
  5. 基础收发例子,将缓冲数组的长度从1024改为了256,程序跑通,第二天到公司又跑不通。
  6. 经过提醒在电源和地之间加了个大电容,跑的时间长了点,粗略定位为供电问题。
  7. 不再使用山寨Arduino的3.3v输出口给DWM1000供电,而是换上了独立的线性电源,程序基本跑通,定位为电源问题。
  8. 测试基础收发,发现程序虽然可以跑但是收不到数据,于是对源代码进行了改造,不对数据进行判断直接读DW1000的RX_BUFFER之中的数据进行打印,发现一部分数据数对的,但后面都会乱码。
  9. 将“Hello DW1000”改成了“Fuck DW1000”,程序跑通,初步定位为山寨片子质量问题。

以下为测试过程中的一些现场图:







之后购买了Arduino中文网推荐的卖家之一的DFROBOT生产的正版Arduino Nano,搭建了系统进行测试:
正版

测试经历:

  1. 测试基础收发,还是和之前一样的问题,看来山寨片子或许只是供电差了一些,其他也倒还好。
  2. 测试MessagePingPong,发现可以跑通,但通信质量并不好,有时还是会出现乱码。
  3. 测距测试,使用其中一个座位Anchor,一个作为Tag,初步测距成功,并且RX_POWER和开源项目自身的指标比较相近。
  4. 多个Anchor测距测试,通信质量急速下降,再次判定为电源问题。
  5. 改进电源后再次测试,发现测距很不稳定,总是某个Anchor信号很强,其他很弱,或者都很弱。
  6. 对Anchor和Tag之间距离进行了变换,发现当前系统的有效距离和稳定性很差。
  7. 由于电子工程师为了省钱买的线性电源,Arduino全烧了,实验中止。

以下是这一段测试的一些现场图:



2.2 基于MBED的系统

虽然Arduino全烧了,但我们还有山寨的MBED,虽然是山寨的,也比正版的Arduino Nano贵不了多少,但其性能还是要高出不少的,加上无意中发现了这个开源项目,所以就不妨尝试了一下。

MBED

基于MEBD的这套系统比起前面那个开源项目的例子要成熟一些,可以直接指定几个Anchor并且同步串口打印Tag到几个Anchor的距离,测试结果也比较喜人,稳定性和速度皆甩出Arduino一截,并且自身的3.3v输出可以带的动DW1000。注意,在实际使用中,三个MBED加上DW1000在测距时的功率达到了12W左右,可见功耗还是非常可观的,并且远远超出了官方文档标出的3.3v/500ma的极限。

以下是一些测试结果,比较不幸的是三号姬的DW1000在两次炸板事件中光荣牺牲了(后来换到了二号姬的面包板上),所以测试数据少一组:




3 结论

由于补充的片子暂时没有到货,实验暂时如此,以下是这次总结出的DW1000使用注意点:

  1. 供电很重要,DW1000非常吃功率,其瞬间电流可能非常大,对电源的稳定性也有一定要求,这一点务必注意。
  2. 对于复杂一点的应用,低端Arduino还是不要用。
  3. 如果可能,电路问题还是交给专业的玄学工程师去解决,否则容易事倍功半。
  4. 对于某些开源项目,你还是要明白底层原理,要能改源代码,这是没有办法的。

Over,暂时进行距离->坐标的算法实现。

如果不是自己的创作,少女是会标识出来的,所以要告诉别人是少女写的哦。