- Details
- Written by: zhang
- Category: UWB 下行 TDOA 定位方案
“UWB 下行 TDOA 定位方案”是目前我们最新的 UWB 定位方案。它集成了我们最新的各种技术,实现了精确的 UWB 定位。
1. 下行 TDOA 的原理
下行 TDOA 定位的原理与 GPS/北斗定位的原理很相似。在需要定位的地方部署一些基站(Anchor),这些基站定期发送定位信息,接收终端(tag)收到基站发出的定位信号后,根据收到这些定位信号的时间差,计算自己的坐标。
1.1. 重要技术
1.1.1. 时间同步
因为是基于时间差进行定位,所以定位基站需要有统一的时间。只有各个基站都有统一的时间基准,才有可能对其进行比较。
为了让各个基站有统一的时间基准,需要在基站间进行时钟同步。
特别是,如果定位区域比较大,超过了单个基站的信号覆盖范围,这时需要进行多级时钟同步。
1.1.2. 坐标计算
本质上,tag 的坐标计算就是解方程。但是因为误差的存在,必然没有数学意义上的精确解,只能逐步求精,得到一个近似解。坐标的计算算法有很多,常用的有 LSR (Least Squares Range) 算法、Chan 算法、Taylor 算法、Chan-Taylor 混合算法、Gauss-Newton 算法等等。
2. 涉及的硬件
系统涉及的硬件有两种:Anchor(定位基站) 和 Tag(定位标签、定位终端)。
这两种硬件均使用 ESP32S3 作为主控 MCU。
2.1. Anchor 的功能和硬件介绍
与 GPS 系统相似,Anchor 扮演卫星的角色,它定期广播发送时钟同步数据包,这个同步数据包一方面供下级 Anchor 做时钟同步用,另一方面供 Tag 计算坐标用。
Anchor 的主控 MCU 是 ESP32S3,UWB 芯片是 DW3000。
样机使用 USB Type C 供电,使用 SLM6600 作为 DC-DC 锂电池充电管理,TPS631000 DC-DC 降压(3.7~5V 转 3.3V)。使用 CW2015 作为电池电量计。
集成了 WS2812 作为设备指示灯,可以通过管理程序控制。
为了适应不同的需求,Anchor 有各种硬件配置方案,最简版本的 Anchor 硬件使用:
- ESP32S3 作为主控 MCU
- DW3000 作为 UWB 收发器
- USB TypeC 供电,AMS1117 作为电压转换
- 高亮 2835 LED 作为设备指示
这个版本的 Anchor 目标是尽量降低 Anchor 的成本。
Anchor 使用 WiFi 联网,可以使用“AnchorConfig”程序对其进行配置和管理。
WiFi 配网使用 AnchorConfig 通过 USB HID 配置 WiFi SSID 和密码,以及管理员和密码。
支持 DHCP 客户端自动申请 IP 地址,也可以通过配置程序指定 IP 地址和网站等。
可以通过配置程序配置 UWB 芯片的相关参数,如使用频道、前导码等。
2.2. Tag 的功能和硬件介绍
与 GPS 系统相似,Tag 扮演接收终端的角色,它接收 Anchor 发送的时钟同步数据包,利用这个时钟同步包计算 Tag 自己的坐标。
Tag 的主控 MCU 是 ESP32S3,UWB 芯片是 DW3000。
样机使用 USB Type C 供电,使用 SLM6600 作为 DC-DC 锂电池充电管理,TPS631000 DC-DC 降压(3.7~5V 转 3.3V)。使用 CW2015 作为电池电量计。
集成了 WS2812 作为设备指示灯,可以通过管理程序控制。
Tag 集成了 OLED 显示屏,可以显示 Tag 的坐标,以及 SMS。
Tag 使用 WiFi 联网,可以使用配置程序对其进行配置和管理。
WiFi 配网使用配置程序通过 USB HID 配置 WiFi SSID 和密码,以及管理员和密码。
支持 DHCP 客户端自动申请 IP 地址,也可以通过配置程序指定 IP 地址和网站等。
可以通过配置程序配置 UWB 芯片的相关参数,如使用频道、前导码等。
Tag 内置了 LSR (Least Squares Range) 算法、Chan 算法、Taylor 算法、Chan-Taylor 混合算法、Gauss-Newton 算法等坐标计算算法。
Tag 可以通过 WiFi 把坐标发送到服务器端,由服务器转发到应用系统中进行后续的应用,如显示在地图上、控制有关的设备等。
3. 时钟同步
对于 UWB 系统的时钟同步,我们有丰富的经验。我们老的上行 TDOA 定位产品已经成功在很多用户的系统中应用。上行 TDOA 定位产品也使用了 UWB 无线时钟同步技术。
在天迹下行 TDOA 定位系统中,我们更进一步,采用了新的时钟同步算法,新算法带来更高的精度。时钟同步算法的要点:
- 基站分级,逐级向下发送时钟同步数据包。下级基站尽量保持自己的时钟与上级基站一致
- 第三方基站作为观察者报告时钟同步误差,供基站在时钟同步时纠偏
- 使用多阶卡尔曼滤波,过滤无效干扰,平滑有效数据
上图是时钟同步效果的可视化,系统由 4 个 Anchor 组成:A0/A1/A2/A3。其中 A0 是根时钟,它的下级是 A1,A1 的下级是 A2,A2 的下级是 A3。形成 A0→A1→A2→A3 这样一个时钟同步的路径。图中显示的是 A1/A2/A3 这 3 个 Anchor 收到的时间误差反馈报告。
大部分情况下,每次时钟同步时的误差在正负 40 tick 之间。这里的 tick 是 DW3000 的内部计时单位,大约 15.65ps。如果换算成标准时间单位,约 ±0.6ns;如果换算成距离单位,约 ±20cm。
这个图中还存在大量的无效干扰数据,虽然我们在后续的处理中可以过滤个,但是就时钟同步这个步骤来说,还有进一步提升的空间。
4. 坐标算法
Tag 集成了 LSR (Least Squares Range) 算法、Chan 算法、Taylor 算法、Chan-Taylor 混合算法、Gauss-Newton 算法等坐标算法。
对计算出来的坐标,还使用多阶卡尔曼滤波器进行滤波。
下图是使用 Chan-Taylor 混合算法计算出来的坐标。图中的蓝色圆圈是 Anchor 的位置,红色 Tag 是 Chan-Taylor 混合算法计算出的坐标,绿色 Tag 是经过卡尔曼滤波后的坐标。Tag 文字中方括号内的数字是坐标质量(应用系统可以通过坐标质量评估坐标的准确度)。
5. 软件
5.1. 设备配置程序
设备配置程序用于配置 Anchor 和 Tag。因为目前还在开发阶段,并未将 Anchor 和 Tag 的配置分开。未来会为 Anchor 和 Tag 创建不同的分支,以针对不同类型的设备有针对性的开发各种功能。
程序使用 C++和 QT 开发,作为 Windows 桌面程序运行。
程序与设备的通讯方式有两种:网络和 USB HID。
USB HID 通讯主要用于设备的初始配置。因为设备使用 WiFi 联网,在未联上网之前,无法通过网络配置设备,所以使用 USB HID 设置设备的 WiFi SSID 和密码,以及管理员和密码,使设备可以连接到指定的 WiFi AP,并且在设备联网后可以配置。
日常对设备的配置使用网络。设备作为 TCP Server,配置程序作为 TCP Client。在建立起 TCP 连接之前,设备与配置程序之前会使用 UDP 广播包进行交互,让配置程序可以发现局域网中的设备(IP 地址),然后配置程序会主动向设备发起 TCP 连接。
配置程序的界面如下:
上图是主界面,设备列表中的列可以让用户自定义。
上图是设备基本信息
上图是网络设置
上图是 UWB 设置
上图是时钟同步设置
5.2. 数据聚合程序 Aggregation
这是一个简单的服务器程序,主要起用于聚合设备消息。程序使用 C++编写。
程序作为 TCP Server 和 Websocket Server,把来自 TCP Client 的 json 消息转发给 websocket client。
设备上运行有一个 TCP Client,会主要建立与 Aggregation 的 TCP 连接,并把时钟同步消息(针对 Anchor)和定位结果(针对 Tag)发送给 Aggregation,Aggregation 再把这些消息转发给 websocket client(通常是运行在浏览器中)。
5.3. 简易前端地图
这是一个使用 js 写的简易前端,使用 openlayers 作为地图组件。在 node.js 环境下运行。
运行在浏览器中的 javascript websocket 会与 Aggregation 建立起 websocket 连接,接收来自 Aggregation 的消息,并显示在地图上。
这个地图主要用来看定位效果。我加了历史轨迹,让 tag 拖一个小尾巴,可以直观的看到定位精度。
红色是计算出来的坐标,绿色是经过卡尔曼滤波后的坐标。
从上图来看,大部分情况下精度在 20cm 以内。
5.4. 数据可视化
这是一个简单的 html 文件(包括配套的 js 文件),可以直接打开,不需要部署在 web 服务器上。加载到浏览器后,后建立与 Aggregation 建立 websocket 连接,接收来自 Aggregation 的消息,以曲线图的方式把数据展示在页面上。 数据可视化主要用于开发阶段对时钟同步效果、定位效果进行观察。例如:
6. 后续的工作
6.1. Anchor 固件
- 在线升级。把固件加密后编译在配置程序中,发送给 Anchor 在线升级
- 时间同步优化。现在的精度大约在 ±40 Tick,努力缩小到 30 tick 以下
- 省电。根据 UWB 收发计划,在空闲时休眠。
- 电池报警。在低电量时向后台发出更换 Anchor 或充电的报警信息
- 固件加密,保证固件不被读出。这块需要对 ESP32 的安全体系对梳理再进行。
6.2. Tag 固件
- 在线升级。把固件加密后编译在配置程序中,发送给 Tag 在线升级
- Anchor 跟踪优化。在计算坐标前需要对附近的 Anchor 进行跟踪锁定,本质上类似 Anchor 间的时间同步,优化后可以提高定位精度
- 省电。根据 UWB 收发计划,在空闲时休眠。
- 电池报警。在低电量时向后台发出电量不跑报警信息
- 固件加密,保证固件不被读出。这块需要对 ESP32 的安全体系对梳理再进行。 根据应用场景的需要,可能会增加磁力计、加速度计、陀螺仪等辅助定位、优化省电。 可以加上 SMS 消息接收,振动马达/蜂鸣器等
6.3. 配置程序
- 根据 Anchor 和 Tag 的不同,分成 2 个分支
- 实现固件升级
- 配合 Anchor 和 Tag 固件的变化,更改有关参数的配置
6.4. 服务器管理平台
可能会需要使用 nodejs 弄一个管理平台,配置参数、地图显示等等。目的是把定位系统的职责范围向应用端靠近。让用户可以有一个开箱即用的东西。
6.5. Tag 硬件
目前是使用 Anchor 的硬件刷 Tag 的固件当作 Tag 使用,以后为 Tag 设计专门的 PCB,找一个合适的外壳。