一款基于 ESP32 的廉价室内 GPS 替代产品,它利用 BLE 信号强度来实时追踪设备——已在移动无人机上进行了测试
扫描二维码
随时随地手机看文章
这个项目最初只是一个简单的实验,属于那种你只想快速测试一个想法并看看它是否可行的类型,但在某个阶段它逐渐发展成了一个完整的系统,其中包括射频追踪、实时可视化、定制硬件,最终……还有一架无人机。
最初的目标很简单明了:
利用 ESP32 构建一个尽可能经济实惠的室内定位系统。
无需昂贵的模块。无需复杂的设置。只需信号强度……以及好奇心即可。
它奏效了。但结果却并非如我所料。
理念——无需 GPS 的室内定位技术
室内定位是这样一种问题:在你真正着手解决它之前,它看起来似乎很简单,但一旦 GPS 出现故障,你就不得不依靠那些往往存在噪声、不一致且严重依赖环境因素的间接测量方法了。
我没有选择采用像超宽带技术或视觉追踪这样的高端解决方案,而是决定先从一些基础的东西入手:
BLE RSSI(接收信号强度指示)
从总体上看,这个想法很简单:
•强烈的信号 → 更近的
•微弱信号 → 更远距离
但在实际情况中,信号强度会受到以下因素的影响:
•墙壁
•物体
•干扰
•反思
这意味着你并非在精确测量距离……而是在对其进行估算。
系统架构——保持简洁,但内容完备
我并非想要构建一个简单的演示版本,而是希望打造一个真正实用的系统。因此,我将其拆分为三个主要组成部分,它们能够实时进行信息交流,并且各自负责流程中的特定环节。
标签(ESP32)
这就是正在被追踪的设备,其唯一的任务就是持续发射蓝牙低功耗信号,以便其他设备能够探测到它。
锚点(ESP32)
这些是设置在环境周围的固定节点,它们会持续扫描标签,测量接收信号强度指示(RSSI),并将这些数据通过无线网络发送至中央服务器。
•固定位置
•持续扫描
•实时数据传输
服务器 + 网页界面
在后台,一个 Python 服务器会从所有锚点收集 RSSI 值,并对其进行处理以估算位置,而一个网页界面则会实时展示所有信息。
•数据收集
•信号处理
•实时可视化
为何使用三个锚点?
要在二维空间中确定一个位置,至少需要三个参考点。因为每个锚点都能为您提供一个大致的距离估计值,而将这些估计值结合起来就能大致确定标签所处的位置。
•1 个锚点 → 无位置
•2个锚点 → “含义模糊”
•3 个锚点 → 可用的估算值
锚点越多 = 准确度越高。
测试——当感觉开始变得真实时
一旦所有配置完成,所有锚点都连接到同一网络,服务器也已运行,这个系统就会变得具有交互性,这种交互性除非亲眼目睹其运行状态,否则很难理解。
您在地图上放置锚点,确定其位置,然后过几秒钟:
一个绿色的圆点出现了。
然后你移动标签。
•这个点随后出现
•它发抖了
•它会自行修正。
并非完美无缺,但依然活着。
RSSI 现实——处处充斥着噪音
这就引出了有趣的部分,因为接收信号强度指示(RSSI)并非一种精确的测量值,而且你越是依赖它,就越会意识到射频环境其实有多么难以预测。
•突然的移动位置
•静止时会漂移
•不一致的读数
为解决这一问题,我增加了校准环节:
•测量已知距离
•采集多个样本
•建立信号模型
这确实有帮助。但它并不能消除噪音。
转折点
在这个阶段,系统是能够正常运行的,但感觉它更像是一个受控制的演示版本,而非具有动态性的实际产品。就在那时,一个简单的想法彻底改变了整个项目的方向。
要是我正在追踪的东西并非在我手中……而是自行移动的呢?
速度更快。更难以预测。
所以我决定把标签贴在可以移动的东西上。
而就是从那时起,事情开始变得越来越严重了。
硬件——简约设计,实际限制因素
ESP32 — 主控制器
•控制逻辑
•交流;沟通
•传感器处理
MPU6050 — 稳定功能
•陀螺仪数据
•加速度数据
SI2302 金属氧化物半导体场效应晶体管——电机驱动器
•大电流切换
•脉宽调制控制
电力系统
•TP4056 → 电池充电
•LF33 → 电压调节
CP2102 — 通信
•编程
•调试
控制系统——从痛苦到可用性
版本 1 — 串行控制
输入数值以控制电机。它能运行……但并不实用。
版本 2 — 网络控制器
我直接在 ESP32 上搭建了一个网络服务器,这样我就能通过浏览器来控制无人机了。
•手机或笔记本电脑控制
•无需安装任何应用程序
•实时互动
飞行测试——理论的破灭之处
问题
•电池太重了
•电量不足
结果:没有提升。
经验教训
接收信号强度指示(RSSI)是有效的,但它存在误差。
校准至关重要
电力系统规定了硬件的使用限制。
软件部分相对简单一些
一边建造,一边调试,又一边试飞,这简直是一团乱麻。
本文编译自hackster.io





