ESP-CSI:自制 WiFi 人體存在檢測(cè)系統(tǒng)
“WiFi 感測(cè)技術(shù)”是智能家居的未來嗎?還是僅僅是一種實(shí)驗(yàn)室里的奇思妙想?我花了數(shù)周時(shí)間利用 ESP32 構(gòu)建了一個(gè)人體感應(yīng)裝置,以探究我們是否終于能夠摒棄那些昂貴的傳感器了。
簡(jiǎn)介:“物聯(lián)網(wǎng)的第六感”興起之因
在智能家居和物聯(lián)網(wǎng)領(lǐng)域,我們一直在尋找理想的入侵檢測(cè)傳感器。光電傳感器價(jià)格低廉,但對(duì)靜止目標(biāo)無(wú)感知能力。毫米波雷達(dá)精度高,但價(jià)格昂貴且集成難度大。攝像頭功能強(qiáng)大,但會(huì)引發(fā)嚴(yán)重的隱私問題。
但近來,在開源社區(qū)中出現(xiàn)了一種“第四種選擇”:WiFi 感知技術(shù)。它正逐漸受到廣泛關(guān)注。
事情始于我注意到 Espressif Systems 公司的工程師們?cè)诿麨椤癳sp-csi”的一個(gè) GitHub 倉(cāng)庫(kù)中頻繁活躍的身影。這并非只是一個(gè)小的更新;而是對(duì)在標(biāo)準(zhǔn) ESP32 芯片上解鎖信道狀態(tài)信息(CSI)的全面推動(dòng)。幾乎與此同時(shí),社區(qū)做出了回應(yīng)。我看到了諸如“espectre”這樣的項(xiàng)目出現(xiàn),它利用 CSI 進(jìn)行頻譜分析。我還看到了研究人員發(fā)布使用深度學(xué)習(xí)進(jìn)行二維室內(nèi)定位的代碼。
這些說法簡(jiǎn)直就像是科幻小說里的情節(jié)。埃斯普西菲公司的文件中甚至還包含了一個(gè)名為“esp-crab”的演示程序,在該程序中他們聲稱僅依靠無(wú)線網(wǎng)絡(luò)信號(hào)就能實(shí)現(xiàn)精確的手指動(dòng)作追蹤。
這引起了我的好奇心。如果這種技術(shù)是真實(shí)存在的,它可能會(huì)使空間感知變得更加普及。我們不再需要價(jià)值 30 美元的雷達(dá)模塊了;只需一個(gè)價(jià)值 5 美元的微控制器就能完成任務(wù)。但它的可靠性如何?是否具有可復(fù)制性?還是說它只是一種脆弱的演示,僅在屏蔽的射頻室中才能正常工作?
為了回答這個(gè)問題,我從工作室里挑選了幾塊 Seeed Studio XIAO ESP32 板子,并決定從零開始搭建一個(gè)房間規(guī)模的傳感陣列。
理論:究竟什么是“犯罪現(xiàn)場(chǎng)調(diào)查”?
在開始構(gòu)建之前,我們需要先弄清楚我們實(shí)際面對(duì)的是什么。我們大多數(shù)人對(duì) RSSI(接收信號(hào)強(qiáng)度指示)都比較熟悉。RSSI 類似于測(cè)量聲音的“音量”;它能告訴你信號(hào)的響度如何,但除此之外就沒什么信息了。它波動(dòng)幅度很大,提供的環(huán)境信息也非常有限。
信道狀態(tài)信息(CSI)則有所不同。如果說接收信號(hào)強(qiáng)度指示(RSSI)代表聲音的“音量”,那么信道狀態(tài)信息則代表聲音的“質(zhì)感”。
在現(xiàn)代的 WiFi(正交頻分復(fù)用)技術(shù)中,數(shù)據(jù)是通過多個(gè)子載波(不同的頻率)同時(shí)傳輸?shù)?。?dāng)這些無(wú)線電波從發(fā)射器(TX)傳送到接收器(RX)時(shí),它們會(huì)與墻壁、家具以及人體發(fā)生反射。這些反射導(dǎo)致波到達(dá)接收器的時(shí)間略有不同,從而形成了干擾模式。
CSI 能夠獲取每個(gè)子載波的振幅和相位信息。當(dāng)人體在房間內(nèi)移動(dòng)時(shí),會(huì)改變這些波的反射和散射方式。通過分析在整個(gè)頻率范圍內(nèi)這些變化的“形態(tài)”,理論上我們能夠檢測(cè)出人體的存在、移動(dòng)情況,甚至特定的姿勢(shì)。
第一階段: “你好,世界”與最初的挫敗感
我的探索之旅始于一個(gè)極其簡(jiǎn)單的目標(biāo):將犯罪現(xiàn)場(chǎng)調(diào)查數(shù)據(jù)呈現(xiàn)在眼前。
為此任務(wù),我選擇了 Seeed Studio 的 XIAO ESP32S3 板子。我喜歡這些板子,因?yàn)樗鼈凅w積極小,運(yùn)算能力強(qiáng)大,足以處理相關(guān)計(jì)算,并且易于融入實(shí)際應(yīng)用中。
我將 csi_send 示例程序上傳到了一臺(tái) XIAO 計(jì)算機(jī)上,將 csi_recv 程序上傳到了另一臺(tái)計(jì)算機(jī)上。為了簡(jiǎn)化設(shè)置,我只在兩塊電路板上安裝了標(biāo)準(zhǔn)的 FPC(柔性貼片)天線,并將它們平放在我的桌面上,兩者的間距約為 50 厘米。然后,我運(yùn)行了名為 csi_data_read_parse.py 的 Python 腳本,在我的筆記本電腦上顯示數(shù)據(jù)流。
結(jié)果令人沮喪。
我原本期待能看到一個(gè)清晰的正弦波,它會(huì)隨著我的手部動(dòng)作而變化。然而,我看到的卻是一片凌亂的鋸齒狀線條。這張圖表看起來就像雜亂的噪聲。我把手在這些板子上揮動(dòng)——沒有任何變化。我跳上跳下——圖表依舊是一片混亂的模糊景象。
我花了兩天時(shí)間,懷疑可能是固件設(shè)置有誤,或者是 XIAO 硬件不兼容所致。我調(diào)整了參數(shù),更換了 WiFi 信道,還重寫了 Python 解析器。但這一切都沒有效果。我基本上就是面對(duì)著雜亂的無(wú)線電信號(hào)噪聲。
第二階段:一切皆關(guān)乎物理學(xué)
在重新閱讀相關(guān)文檔并深入研究射頻理論之后,我意識(shí)到自己的錯(cuò)誤并非出在軟件方面,而是源于物理原理。
?天線問題:大多數(shù)開發(fā)板所附帶的 FPC 天線是全向型的,但增益較低。將它們平放在桌子上時(shí),會(huì)立即在緊挨著天線的桌面附近產(chǎn)生大量反射。我當(dāng)時(shí)是在測(cè)量桌面,而不是整個(gè)房間。
?菲涅爾區(qū):無(wú)線電波并非以極細(xì)的直線形式傳播;它們是在兩個(gè)天線之間形成的一個(gè)類似足球形狀的區(qū)域中傳播的,這個(gè)區(qū)域被稱為菲涅爾區(qū)。由于我把設(shè)備放在了桌子上,所以該區(qū)域的下半部分被桌子擋住了。
解決辦法:
我搭建了一個(gè)合適的測(cè)試裝置。我把 XIAO 板安裝在三腳架上,將它們抬高至離地面 1.4 米的位置。至關(guān)重要的是,我斷開了 FPC 天線,并安裝了外部偶極子(桿狀)天線。
我重新啟動(dòng)了這個(gè)程序。結(jié)果簡(jiǎn)直是天壤之別。
圖表呈現(xiàn)出了一種穩(wěn)定的節(jié)奏。當(dāng)我靜止不動(dòng)時(shí),線條是平緩的。而當(dāng)我邁出一步時(shí),波形便呈現(xiàn)出了一種美妙而獨(dú)特的形態(tài)。我終于能在數(shù)據(jù)中看到“我自己”了。這就是轉(zhuǎn)折點(diǎn)——這項(xiàng)技術(shù)真的奏效了。
第三階段:從數(shù)據(jù)到檢測(cè)(“警報(bào)線”)
既然我已經(jīng)有了干凈的數(shù)據(jù),我就想用它來做些有用的事情。于是我切換到了 esp-radar/console_test 這個(gè)示例程序。這個(gè)固件包含了 Espressif 公司專有的算法,用于過濾噪聲并做出判斷:“有人在這兒”或者“房間是空的”。
我在客廳里把這兩根三腳架擺放在相距兩米的位置。
這場(chǎng)表演出乎意料地精準(zhǔn)。它就像一條無(wú)形的觸發(fā)線。當(dāng)我直接站在兩個(gè)支架之間時(shí),串行控制臺(tái)立刻發(fā)出“有移動(dòng)檢測(cè)到”的警報(bào)聲。這感覺太神奇了——一個(gè)沒有鏡頭、沒有活動(dòng)部件、只有空氣的傳感器。
然而,其局限性很快就顯現(xiàn)出來了。如果我站在接收器后方兩米處,它就會(huì)忽略我;如果我坐在地上,它也會(huì)錯(cuò)過我。單個(gè)設(shè)備只能形成一條“檢測(cè)線”,而非“檢測(cè)場(chǎng)”。要監(jiān)測(cè)一個(gè)真實(shí)的房間,我需要更廣泛的覆蓋范圍。
第四階段:構(gòu)建“感知陣列”
為了解決盲點(diǎn)問題,我決定加大規(guī)模。我制定了一個(gè)使用 4 個(gè) Seeed Studio XIAO ESP32 設(shè)備的多設(shè)備陣列方案。
我使用了一個(gè)針對(duì) XIAO 生態(tài)系統(tǒng)進(jìn)行了優(yōu)化的修改版代碼庫(kù)。該代碼允許多個(gè)接收器向中央節(jié)點(diǎn)進(jìn)行數(shù)據(jù)回傳。
布局策略:
我將這些設(shè)備布置起來,形成了一個(gè)感知區(qū)域的網(wǎng)格狀布局:
?發(fā)射器(TX):位于房間的東北角。
?接收器 1(RX1):位于西南角(與之相對(duì)的對(duì)角位置)。它覆蓋了主要的步行通道。
?接收器 2 及 3:置于相鄰墻壁的中間位置。
這種布局確保了無(wú)論我在房間中的位置如何,我都會(huì)干擾到至少一對(duì)設(shè)備的菲涅爾波帶區(qū)域。
用戶界面:
該項(xiàng)目包含一個(gè)托管在主 ESP32 上的簡(jiǎn)易網(wǎng)絡(luò)服務(wù)器。我在手機(jī)上打開了其 IP 地址。該界面很簡(jiǎn)單:有一個(gè)顯示“存在”、“清除”或“移動(dòng)”的狀態(tài)指示器,還有一個(gè)顯示信號(hào)變化情況的滾動(dòng)圖表。
我走進(jìn)房間。狀態(tài)隨即切換到了“運(yùn)動(dòng)”模式。
我走到那個(gè)拐角處,那里通常是視線盲區(qū)。狀態(tài)顯示仍為“存在”。
我坐在沙發(fā)上,保持了相對(duì)靜止的姿勢(shì)。系統(tǒng)停頓了一秒鐘,但狀態(tài)仍顯示為“在線”。
成功了。我成功地把整個(gè)客廳都改造成了一個(gè)傳感器系統(tǒng)。
結(jié)論:這是否已準(zhǔn)備好投入實(shí)際應(yīng)用?
在與這款“WiFi 信號(hào)陣列”共處一周之后,我對(duì)它的優(yōu)缺點(diǎn)有了清晰的認(rèn)識(shí)。雖然其“酷炫程度”令人驚嘆,但實(shí)際情況卻并非如此簡(jiǎn)單明了。
1. 電力消耗問題
這是最大的難題。與 Zigbee 或 LoRa 傳感器不同,這些傳感器通常 99%的時(shí)間都處于休眠狀態(tài),而 CSI 傳感器則需要 WiFi 無(wú)線電設(shè)備始終保持全功率工作狀態(tài),每秒要發(fā)送數(shù)百次數(shù)據(jù)包。
小 ESP32 設(shè)備運(yùn)行時(shí)會(huì)發(fā)熱。這些設(shè)備不能用電池供電,因?yàn)閹追昼妰?nèi)電池就會(huì)耗盡。你需要將 USB-C 數(shù)據(jù)線鋪設(shè)到房間的每個(gè)角落,這樣一來就破壞了“隱形”的美感,除非你把插座布置得恰到好處。
2. “校準(zhǔn)的困境”
這個(gè)系統(tǒng)對(duì)環(huán)境非常敏感。如果我把咖啡桌挪動(dòng)一下,反射的圖案就會(huì)發(fā)生變化。如果我打開窗戶,圖案也會(huì)隨之改變。
要使系統(tǒng)正常運(yùn)行,需要經(jīng)歷一個(gè)“校準(zhǔn)”階段,在此期間房間必須完全空無(wú)一物。如果添加了一件新家具,通常就需要重新校準(zhǔn)基準(zhǔn)值。與僅能正常工作的 PIR 傳感器相比,這種關(guān)系需要進(jìn)行頻繁的維護(hù)。
3. 復(fù)雜性與準(zhǔn)確性
我的四設(shè)備組合系統(tǒng)在檢測(cè)精度方面達(dá)到了約 80% 的水平,而我的商用 24GHz 微波雷達(dá)的精度則略低一些。
諷刺的是,為了獲得更高的精度,你需要更多的設(shè)備(更多的接收端節(jié)點(diǎn))。但增加更多的設(shè)備會(huì)加劇網(wǎng)絡(luò)擁堵,并使校準(zhǔn)過程變得更加繁瑣。這就是所謂的“邊際效益遞減定律”。
4. 未被發(fā)掘的潛力:深度學(xué)習(xí)
我所搭建的這套系統(tǒng)運(yùn)用的是基本的統(tǒng)計(jì)邏輯(如果差異值大于閾值,則為人類)。而真正的未來則在于深度學(xué)習(xí)。
理想情況下,我們會(huì)將這些 CSI 數(shù)據(jù)輸入到運(yùn)行神經(jīng)網(wǎng)絡(luò)的樹莓派或英偉達(dá) Jetson 上。有了足夠的訓(xùn)練數(shù)據(jù),人工智能就能學(xué)會(huì)“波形 A”代表“行走”,而“波形 B”代表“坐在沙發(fā)上”。然而,這會(huì)大幅增加成本和所需的技術(shù)技能,使其超出了簡(jiǎn)單的家庭自動(dòng)化DIY范疇。
本文編譯自hackster.io





