采用ESP32的實(shí)時(shí)超寬帶室內(nèi)定位系統(tǒng)
如果你試過追蹤大樓里的東西,你就會(huì)知道GPS很難用。這就是超寬帶(UWB)的用武之地;它可以精確定位到大約10厘米的位置。是的,厘米。漂亮的野生。
我一直在擺弄Qorvo DWM3000 UWB模塊與ESP32板配對(duì),老實(shí)說,它比我預(yù)期的要好。在這個(gè)ESP32項(xiàng)目中,我們將建立一個(gè)室內(nèi)定位系統(tǒng),它可以實(shí)時(shí)跟蹤運(yùn)動(dòng)。
為什么超寬頻?
與依賴數(shù)英里外衛(wèi)星的GPS不同,超寬帶只是測(cè)量無線電脈沖在設(shè)備之間傳播所需的時(shí)間。DWM3000可以測(cè)量精確到納秒的時(shí)間,換算成厘米級(jí)的精度。這就是知道某人在房間里和確切知道他們?cè)谀膹堊雷忧暗膮^(qū)別。
快速室內(nèi)跟蹤對(duì)比:
?超寬帶:~10cm,可達(dá)200m
?藍(lán)牙:1 - 3米,可以用于“附近”,但不精確
?Wi-Fi: 5 - 15米,基本是房間級(jí)別
?室內(nèi)GPS: 5 - 10米,如果能工作的話
硬件設(shè)置
以下是你需要的:
?4個(gè)DWM3000模塊(1個(gè)吊牌+ 3個(gè)錨)
?4× ESP32-WROOM板
?Micro-USB電纜用于電源/編程
?面包板或自定義pcb安裝一切
DWM3000超級(jí)棒,因?yàn)樗且粋€(gè)完整的模塊——天線、射頻組件、晶體、電源管理——集于一體。不需要成為射頻專家。只要通過SPI連接到ESP32,你就完成了大部分工作。
引腳連接:
?DWM3000 → ESP32
?VCC → 3.3V (not 5V!)
?GND → GND
?SCK → GPIO18
?MOSI → GPIO23
?MISO → GPIO19
?CS → GPIO4
?RST → GPIO27
?IRQ → GPIO34(可選但方便)
它是如何工作的
從概念上講,它比聽起來簡(jiǎn)單。在已知位置放置三個(gè)錨點(diǎn),然后標(biāo)簽使用雙面雙向測(cè)距(DS-TWR)與每個(gè)錨點(diǎn)通信:
?標(biāo)記ping錨1
?Anchor 1 responds
?標(biāo)簽發(fā)送另一條消息
?Anchor replies with timing
?重復(fù)錨2和錨3
每個(gè)交換以納秒的精度測(cè)量往返時(shí)間。有了三個(gè)點(diǎn)之間的距離,你可以用三邊測(cè)量法來計(jì)算位置,基本上就是圓相交。
DS-TWR還補(bǔ)償了設(shè)備之間的時(shí)鐘差異,這就是為什么它比簡(jiǎn)單的方法更準(zhǔn)確。
錨
我把三個(gè)錨定在一個(gè)三角形上:
?錨1:左下(15.5)厘米
?錨2:右下(290,5)厘米
?錨3:頂部中心(165,625)厘米
這些坐標(biāo)很重要,它們需要與Python可視化使用的坐標(biāo)相匹配。每個(gè)錨運(yùn)行相同的固件,但獲得唯一的ID(1,2,3)。代碼基本上是一個(gè)狀態(tài)機(jī):等待請(qǐng)求,以精確的時(shí)間響應(yīng)。簡(jiǎn)單、堅(jiān)固、可靠。
標(biāo)簽的固件
標(biāo)簽完成了有趣的部分。它連續(xù)地在三個(gè)錨點(diǎn)之間循環(huán):
我使用中值濾波,因?yàn)樵糢WB數(shù)據(jù)可能有噪聲。最后50個(gè)測(cè)量值的滾動(dòng)緩沖,中值消除了異常值,但保持了響應(yīng)。一旦標(biāo)簽有了所有錨點(diǎn)的新距離,它就會(huì)將所有內(nèi)容打包成JSON并通過WiFi發(fā)送。距離,信號(hào)強(qiáng)度,定時(shí),時(shí)鐘偏移,都在里面調(diào)試。
可視化
在PC端,Python處理它:
?TCP服務(wù)器接收標(biāo)簽數(shù)據(jù)
?通過scipy的三邊數(shù)學(xué)
?在平面圖上實(shí)時(shí)標(biāo)記地塊
平面圖是背景,錨是三角形,標(biāo)簽是一個(gè)移動(dòng)的紅點(diǎn),信號(hào)強(qiáng)度漂浮在每個(gè)錨的上方。看著它移動(dòng)和實(shí)時(shí)更新是非常令人滿意的。
使其運(yùn)行
1. Flash ESP32s:
?三個(gè)錨(id 1-3)
?一個(gè)標(biāo)簽,更新WiFi證書
2. 定位硬件:
?在選定坐標(biāo)安裝錨
?一切通電,標(biāo)簽開始自動(dòng)定位
3. 啟動(dòng)Python腳本:
?安裝依賴項(xiàng):matplotlib, scipy, numpy
?更新IP,將平面圖放入文件夾,運(yùn)行腳本
4. 移動(dòng)標(biāo)簽:
?更新~每100毫秒
?藍(lán)色的痕跡顯示歷史
?RSSI表示信號(hào)質(zhì)量
真實(shí)的表現(xiàn)
精度:在良好條件下始終保持10-15cm。
好設(shè)置:
?視線清晰
?穩(wěn)定的錨
適當(dāng)?shù)奶炀€延遲校準(zhǔn)(16350適用于我)
壞的設(shè)置:
?吊牌和錨之間的金屬物體
?移動(dòng)的錨
?電源噪聲
?天線失調(diào)
超寬帶處理多徑比大多數(shù)要好,但大型金屬表面偶爾仍會(huì)干擾讀數(shù)。
改進(jìn)空間
?為可靠性/ 3D增加第4個(gè)錨
?為多個(gè)標(biāo)簽實(shí)現(xiàn)TDoA
?Web界面而不是matplotlib
?使用RSSI檢測(cè)NLOS
?優(yōu)化電池使用功率
DWM3000可以處理所有這些,它主要是固件工作。
麻煩嗎?
?天線延遲校準(zhǔn):耗時(shí)太長(zhǎng)。16350適合我;測(cè)試你的。
?WiFi干擾:流量過大會(huì)減慢更新速度。把測(cè)距和網(wǎng)絡(luò)分開。
?電源:使用干凈的3.3V與去耦帽。
?坐標(biāo)系統(tǒng):Python腳本和錨點(diǎn)位置必須匹配。我花了一個(gè)小時(shí)翻轉(zhuǎn)Y坐標(biāo)。
為什么超寬帶很酷?
?低功耗:電池休眠模式
?安全:內(nèi)置防欺騙
?Fast:以毫秒為單位
?可伸縮:如果是mac管理,則有許多標(biāo)簽
?不完美:需要視線,校準(zhǔn),比藍(lán)牙更貴。但在精確的室內(nèi)定位方面,無人能敵。
最終的想法
說實(shí)話,這比我想象的要簡(jiǎn)單。DWM3000是一個(gè)完整的模塊是一個(gè)救星。最難的部分是計(jì)算時(shí)間和奇怪的WiFi問題。
如果你嘗試,建議:
?從基本的測(cè)距示例開始
?先用一個(gè)錨釘定位
?調(diào)試時(shí)記錄所有內(nèi)容
?在移動(dòng)到真實(shí)空間之前,在一個(gè)開放的區(qū)域進(jìn)行測(cè)試
本文編譯自hackster.io





