• 前言

    这是一个系列文章,将向你介绍如何从零开始实现一个使用TDOA技术的 UWB 精确定位系统。

    重要提示(劝退说明):

    Q:做这个定位系统需要基础么?
    A:文章不是写给小白看的,需要有电子技术和软件编程的基础
    Q:你的这些硬件/软件是开源的吗?
    A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文章中我会介绍怎么实现UWB定位系统,告诉你如何克服难点,但不会直接把PCB的Gerber文件给你去做板子,不会把软件的源代码给你,不会把编译好的固件给你。我不会给你任何直接的结果,我只是告诉你方法。
    Q:我个人对UWB定位很兴趣,可不可以做出一个定位系统?
    A:如果是有很强的硬件/软件背景,并且有大量的时间,当然可以做得出来。文章就是写给你看的!
    Q:我是商业公司,我想把UWB定位系统搞成一个商业产品。
    A:当然可以。这文章也是写给你看的。如果你想自己从头构建整个系统,看了我的文章后,只需要画电路打板;构思软件结构再编码。就这样,所有的难点我都会在文中提到,并介绍了解决方法。你不需要招人来做算法研究。如果你想省事省时间,可以直接购买我们的电路图(AD工程文件),购买我们的软件源代码,然后快速进入生产环节。(网站: https://skytracksoft.com)

    从2016年开始,我们开始了UWB定位项目,到2021年底正式停止这个项目。现在得到老板的许可,解密了。所以我把整个项目的过程写出来。

    如果你对 UWB 定位有兴趣,你看了这一系列的文章之后,应该可以自己实现一个 UWB 定位系统。

    如果你是商业使用,建议购买我们的技术(顺便广告一下,肯定要比自己从头来做要便宜, 主要是省事见效快,所以你可能要掉的坑,我们都趟过了。网站: https://skytracksoft.com)。

    最近这几年,UWB很火。炒了很久,日常生活中似乎也没有见到大规模的应用。但是在一些特定的领域,应用越来越广泛,例如煤矿井下定位/化工生产行业定位等等,这些高危的行业都看到了UWB的好处,所以应用得越来越多。

    阅读全文...

  • 这是一个系列文章《如何从零开始实现TDOA技术的 UWB 精确定位系统》第2部分。

    重要提示(劝退说明):

    Q:做这个定位系统需要基础么?
    A:文章不是写给小白看的,需要有电子技术和软件编程的基础
    Q:你的这些硬件/软件是开源的吗?
    A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。文章中我会介绍怎么实现UWB定位系统,告诉你如何克服难点,但不会直接把PCB的Gerber文件给你去做板子,不会把软件的源代码给你,不会把编译好的固件给你。我不会给你任何直接的结果,我只是告诉你方法。
    Q:我个人对UWB定位很兴趣,可不可以做出一个定位系统?
    A:如果是有很强的硬件/软件背景,并且有大量的时间,当然可以做得出来。文章就是写给你看的!
    Q:我是商业公司,我想把UWB定位系统搞成一个商业产品。
    A:当然可以。这文章也是写给你看的。如果你想自己从头构建整个系统,看了我的文章后,只需要画电路打板;构思软件结构再编码。就这样,所有的难点我都会在文中提到,并介绍了解决方法。你不需要招人来做算法研究。如果你想省事省时间,可以直接购买我们的电路图(AD工程文件),购买我们的软件源代码,然后快速进入生产环节。(网站: https://skytracksoft.com)

    基站固件设计-时钟同步

    时钟同步原理

    我们在前面已经说过,对于TDOA技术来说,各个基站需要有统一的时间,这是一个难点。时钟怎么同步呢?

    假设一个定位区域有A/B/C/D四个基站,我们另外再把拿一个基站CS作为时钟源,定期发送时钟同步包。这个时钟同步包的结构如下:

    typedef struct ieee154_broadcast_clock_sync_frame {
        uint8_t frameCtrl[2];           // 0, 2, frame control bytes 00-01: 0x01 (Frame Type 0x01=date), 0xC8 (0xC0=src extended address 64 bits, 0x08=dest address 16 bits)
        uint8_t seq8;                   // 2, 1, sequence_number 02
        uint8_t panID[2];               // 3, 2, PAN ID 03-04
        uint8_t destAddr[2];            // 5, 2, 0xFFFF
        uint8_t sourceAddr[8];          // 7, 8, 64Bits EUI地址
        uint8_t messageType;            //15, 1, Message Type = RTLS_MSG_TYPE_CLOCK_SYNC
        uint8_t seq64[8];               //16, 8, 发出的测距消息序号, 比 seq8 有更大的最大值
        uint8_t timeStamp[8];           //24, 8, 时间戳
        uint8_t fcs[2];                 //32, 2
    } BROADCAST_CLOCK_SYNC_MESSAGE;

    这是一个DW1000的典型的UWB数据包。这是一个广播类型的包,其中有几个重要字段,timeStamp这是时间戳,也就是A基站发送这个包的时刻。

    阅读全文...