【UWB/室内定位】坑和结论

少女dtysky

世界Skill

时刻2016.01.30

年轻人,初入职场,没事不要给自己找坑。


继续深入研究,身心俱疲,这里是一些坑和结论。


1 坑和结论

这里所用UWB芯片皆为Decawave家的DW1000,分别使用TREK1000套件和某公司的产品进行了测试。
这里首先声明,DWM1000这个小模块基本只能拿来玩玩,想要做正事的可以直接跳过。

1.0 算法

TREK1000套件的定位算法基本是直接解算,产品则对原始的测距信息有限幅,定位输出有卡尔曼滤波。
以下Python随便写的用最小二乘法通过同一个平面的若干个基站和tag的距离求xy坐标的函数,比较糙,有兴趣自己看看吧:
函数输入是每个anchor的位置构成的数组,以及每个anchor和tag的距离序列构成的数组.

from scipy.optimize import leastsq, curve_fit
from numpy import sqrt, square, array, subtract, add, multiply
def get_xyz_by_ls(anchors, distances):
    def fun(ps, ds):
        res_x, res_y = ps
        anchors_x, anchors_y = ds
        res = add(
            add(multiply(2, multiply(anchors_x[0], res_x)), anchors_x[1]),
            add(multiply(2, multiply(anchors_y[0], res_y)), anchors_y[1]))
        return res

    def error(ps, ds, dis):
        return dis - fun(ps, ds)

    length = len(distances)
    ps = [
        [a[0] for a in anchors],
        [a[1] for a in anchors]
    ]
    # ps[0]: xi+1 - xi, xi+1 ^ 2 - xi ^ 2
    # ps[1]: yi+1 - yi, yi+1 ^ 2 - y1 ^ 2
    ps[0] = [
                 [ps[0][i] - ps[0][i+1] for i in xrange(length - 1)],
                 [square(ps[0][i+1]) - square(ps[0][i]) for i in xrange(length - 1)]
    ]
    ps[1] = [
                 [ps[1][i] - ps[1][i+1] for i in xrange(length - 1)],
                 [square(ps[1][i+1]) - square(ps[1][i]) for i in xrange(length - 1)]
    ]
    ps = array(ps)
    # ds: di+1 ^ 2 - di ^ 2
    ds = [square(distances[i+1]) - square(distances[i]) for i in xrange(length - 1)]
    x0 = [1, 1]
    x, y = leastsq(error, x0, args=(ps, ds))[0]
    return x, y

1.1 适用范围

UWB一般应用场合是室内定位,低空定位,动态性能要求不太高的定位。
定位原理在上一篇说过了,都是测距后用三边法或者多基站下的线性拟合。而测距使用的原理一般是TOF(飞行时间),这个和微波雷达、激光测距等基本是一个原理,所以也面临相同的问题。
定位对基站的布局是有需求的,基本要求tag不能越过anchor所框的区域内,同时基站的布置和定位要求密切相关,有几个维度的需求,基站就应该有几个维度的变化,如果要三维定位,一般要求至少一个基站在空中。

1.2 精度

精度方面,由于我们用于空中的水平定位,所以关心的是水平、也就是xy轴的精度,我分别进行了地面的静态测试和无人机上的动态测试,结论如下:

  1. 单对精度可以认为始终在15cm之内,但要求天线位置最佳,天线的坑会在下面说道。与此同时,两米之内的测距误差可能较大,这个是原理所决定的,暂时无解。
  2. 定位精度和基站围成的范围与tag到基站的距离都有着很大关系,一般要求需要定位的距离和基站围成的距离越接近越好。在13m x 6m的布局下,tag随着和基站绝对距离的增加,其定位精度会有所下降: 5-15m时,精度在20cm左右;15-25m时,精度在30cm左右;25-35m时,精度在40cm左右。

1.3 静态性能

静态性能指测距和定位可以达到的帧率,实测最高大概在三十多帧(产品),开发套件只有10帧左右(算法决定),不过对于一般应用也足够了。
在静态测试中,测距的定位均有一定的失效率,失效率大概在3%左右。失效率和tag到基站的距离密切相关,同时微波传播的路径也有不小关系,和电源、机械振动、电磁环境都有一定的关系。以上3%的失效率只是去除了机械振动与环境干扰后的结论。

1.4 动态性能

动态性能指的是在运动时的定位的失效率以及跟随性。
和无人机上的差分GPS进行对比,跟随性方面基本可以认为是实时跟随,这个和算法有很大的关系(这里采用限幅和卡尔曼滤波)。失效率方面,距离越远失效率越高,基本可以认为每十米会增加20%左右的失效率。

1.5 失效分析

综上,影响UWB测距(这个是定位的基本)性能的元素如下:

  1. 距离:距离越远,测距性能受环境的影响越明显,这是一个被动技能,可以理解为基础能力下降,受到异常状态的概率上升。
  2. 传播路径:空中明显比地面性能差,室外明显比楼道性能差,这应该是由于墙面对微博的反射导致的信号增强造成的,虽然反射同时也会出现多径效应,但在实验中体现并不明显,所以基本可以认为有墙面对测距性能是有利的。
  3. 电源:电源功率不足时,可能会导致信号发射接收时基站/TAG宕机,笔记本的USB口供电时出现过这个问题。
  4. 机械振动:这个不同于一定范围内运动时的失效,而是电机等造成的小幅度高频机械振动,这种振动会对二十米以上的测距性能造成毁灭性影响。
  5. 电磁干扰:这个比较玄学了,我这没什么好的解释。

影响定位,却无关于测距的元素就是算法方面了,由于算法的问题,所以基站的布局必须和tag和基站之间的最大距离同步,比如tag可能在空中100m,那么最好有一个100m x 100m的基站布局,如果要测三维,应该至少有两个基站将tag夹在中间。

完。

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