采用ESP32的实时超宽带室内定位系统
扫描二维码
随时随地手机看文章
如果你试过追踪大楼里的东西,你就会知道GPS很难用。这就是超宽带(UWB)的用武之地;它可以精确定位到大约10厘米的位置。是的,厘米。漂亮的野生。
我一直在摆弄Qorvo DWM3000 UWB模块与ESP32板配对,老实说,它比我预期的要好。在这个ESP32项目中,我们将建立一个室内定位系统,它可以实时跟踪运动。
为什么超宽频?
与依赖数英里外卫星的GPS不同,超宽带只是测量无线电脉冲在设备之间传播所需的时间。DWM3000可以测量精确到纳秒的时间,换算成厘米级的精度。这就是知道某人在房间里和确切知道他们在哪张桌子前的区别。
快速室内跟踪对比:
•超宽带:~10cm,可达200m
•蓝牙:1 - 3米,可以用于“附近”,但不精确
•Wi-Fi: 5 - 15米,基本是房间级别
•室内GPS: 5 - 10米,如果能工作的话
硬件设置
以下是你需要的:
•4个DWM3000模块(1个吊牌+ 3个锚)
•4× ESP32-WROOM板
•Micro-USB电缆用于电源/编程
•面包板或自定义pcb安装一切
DWM3000超级棒,因为它是一个完整的模块——天线、射频组件、晶体、电源管理——集于一体。不需要成为射频专家。只要通过SPI连接到ESP32,你就完成了大部分工作。
引脚连接:
•DWM3000 → ESP32
•VCC → 3.3V (not 5V!)
•GND → GND
•SCK → GPIO18
•MOSI → GPIO23
•MISO → GPIO19
•CS → GPIO4
•RST → GPIO27
•IRQ → GPIO34(可选但方便)
它是如何工作的
从概念上讲,它比听起来简单。在已知位置放置三个锚点,然后标签使用双面双向测距(DS-TWR)与每个锚点通信:
•标记ping锚1
•Anchor 1 responds
•标签发送另一条消息
•Anchor replies with timing
•重复锚2和锚3
每个交换以纳秒的精度测量往返时间。有了三个点之间的距离,你可以用三边测量法来计算位置,基本上就是圆相交。
DS-TWR还补偿了设备之间的时钟差异,这就是为什么它比简单的方法更准确。
锚
我把三个锚定在一个三角形上:
•锚1:左下(15.5)厘米
•锚2:右下(290,5)厘米
•锚3:顶部中心(165,625)厘米
这些坐标很重要,它们需要与Python可视化使用的坐标相匹配。每个锚运行相同的固件,但获得唯一的ID(1,2,3)。代码基本上是一个状态机:等待请求,以精确的时间响应。简单、坚固、可靠。
标签的固件
标签完成了有趣的部分。它连续地在三个锚点之间循环:
我使用中值滤波,因为原始UWB数据可能有噪声。最后50个测量值的滚动缓冲,中值消除了异常值,但保持了响应。一旦标签有了所有锚点的新距离,它就会将所有内容打包成JSON并通过WiFi发送。距离,信号强度,定时,时钟偏移,都在里面调试。
可视化
在PC端,Python处理它:
•TCP服务器接收标签数据
•通过scipy的三边数学
•在平面图上实时标记地块
平面图是背景,锚是三角形,标签是一个移动的红点,信号强度漂浮在每个锚的上方。看着它移动和实时更新是非常令人满意的。
使其运行
1. Flash ESP32s:
•三个锚(id 1-3)
•一个标签,更新WiFi证书
2. 定位硬件:
•在选定坐标安装锚
•一切通电,标签开始自动定位
3. 启动Python脚本:
•安装依赖项:matplotlib, scipy, numpy
•更新IP,将平面图放入文件夹,运行脚本
4. 移动标签:
•更新~每100毫秒
•蓝色的痕迹显示历史
•RSSI表示信号质量
真实的表现
精度:在良好条件下始终保持10-15cm。
好设置:
•视线清晰
•稳定的锚
适当的天线延迟校准(16350适用于我)
坏的设置:
•吊牌和锚之间的金属物体
•移动的锚
•电源噪声
•天线失调
超宽带处理多径比大多数要好,但大型金属表面偶尔仍会干扰读数。
改进空间
•为可靠性/ 3D增加第4个锚
•为多个标签实现TDoA
•Web界面而不是matplotlib
•使用RSSI检测NLOS
•优化电池使用功率
DWM3000可以处理所有这些,它主要是固件工作。
麻烦吗?
•天线延迟校准:耗时太长。16350适合我;测试你的。
•WiFi干扰:流量过大会减慢更新速度。把测距和网络分开。
•电源:使用干净的3.3V与去耦帽。
•坐标系统:Python脚本和锚点位置必须匹配。我花了一个小时翻转Y坐标。
为什么超宽带很酷?
•低功耗:电池休眠模式
•安全:内置防欺骗
•Fast:以毫秒为单位
•可伸缩:如果是mac管理,则有许多标签
•不完美:需要视线,校准,比蓝牙更贵。但在精确的室内定位方面,无人能敌。
最终的想法
说实话,这比我想象的要简单。DWM3000是一个完整的模块是一个救星。最难的部分是计算时间和奇怪的WiFi问题。
如果你尝试,建议:
•从基本的测距示例开始
•先用一个锚钉定位
•调试时记录所有内容
•在移动到真实空间之前,在一个开放的区域进行测试
本文编译自hackster.io





