ESP-CSI:自制 WiFi 人体存在检测系统
扫描二维码
随时随地手机看文章
“WiFi 感测技术”是智能家居的未来吗?还是仅仅是一种实验室里的奇思妙想?我花了数周时间利用 ESP32 构建了一个人体感应装置,以探究我们是否终于能够摒弃那些昂贵的传感器了。
简介:“物联网的第六感”兴起之因
在智能家居和物联网领域,我们一直在寻找理想的入侵检测传感器。光电传感器价格低廉,但对静止目标无感知能力。毫米波雷达精度高,但价格昂贵且集成难度大。摄像头功能强大,但会引发严重的隐私问题。
但近来,在开源社区中出现了一种“第四种选择”:WiFi 感知技术。它正逐渐受到广泛关注。
事情始于我注意到 Espressif Systems 公司的工程师们在名为“esp-csi”的一个 GitHub 仓库中频繁活跃的身影。这并非只是一个小的更新;而是对在标准 ESP32 芯片上解锁信道状态信息(CSI)的全面推动。几乎与此同时,社区做出了回应。我看到了诸如“espectre”这样的项目出现,它利用 CSI 进行频谱分析。我还看到了研究人员发布使用深度学习进行二维室内定位的代码。
这些说法简直就像是科幻小说里的情节。埃斯普西菲公司的文件中甚至还包含了一个名为“esp-crab”的演示程序,在该程序中他们声称仅依靠无线网络信号就能实现精确的手指动作追踪。
这引起了我的好奇心。如果这种技术是真实存在的,它可能会使空间感知变得更加普及。我们不再需要价值 30 美元的雷达模块了;只需一个价值 5 美元的微控制器就能完成任务。但它的可靠性如何?是否具有可复制性?还是说它只是一种脆弱的演示,仅在屏蔽的射频室中才能正常工作?
为了回答这个问题,我从工作室里挑选了几块 Seeed Studio XIAO ESP32 板子,并决定从零开始搭建一个房间规模的传感阵列。
理论:究竟什么是“犯罪现场调查”?
在开始构建之前,我们需要先弄清楚我们实际面对的是什么。我们大多数人对 RSSI(接收信号强度指示)都比较熟悉。RSSI 类似于测量声音的“音量”;它能告诉你信号的响度如何,但除此之外就没什么信息了。它波动幅度很大,提供的环境信息也非常有限。
信道状态信息(CSI)则有所不同。如果说接收信号强度指示(RSSI)代表声音的“音量”,那么信道状态信息则代表声音的“质感”。
在现代的 WiFi(正交频分复用)技术中,数据是通过多个子载波(不同的频率)同时传输的。当这些无线电波从发射器(TX)传送到接收器(RX)时,它们会与墙壁、家具以及人体发生反射。这些反射导致波到达接收器的时间略有不同,从而形成了干扰模式。
CSI 能够获取每个子载波的振幅和相位信息。当人体在房间内移动时,会改变这些波的反射和散射方式。通过分析在整个频率范围内这些变化的“形态”,理论上我们能够检测出人体的存在、移动情况,甚至特定的姿势。
第一阶段: “你好,世界”与最初的挫败感
我的探索之旅始于一个极其简单的目标:将犯罪现场调查数据呈现在眼前。
为此任务,我选择了 Seeed Studio 的 XIAO ESP32S3 板子。我喜欢这些板子,因为它们体积极小,运算能力强大,足以处理相关计算,并且易于融入实际应用中。
我将 csi_send 示例程序上传到了一台 XIAO 计算机上,将 csi_recv 程序上传到了另一台计算机上。为了简化设置,我只在两块电路板上安装了标准的 FPC(柔性贴片)天线,并将它们平放在我的桌面上,两者的间距约为 50 厘米。然后,我运行了名为 csi_data_read_parse.py 的 Python 脚本,在我的笔记本电脑上显示数据流。
结果令人沮丧。
我原本期待能看到一个清晰的正弦波,它会随着我的手部动作而变化。然而,我看到的却是一片凌乱的锯齿状线条。这张图表看起来就像杂乱的噪声。我把手在这些板子上挥动——没有任何变化。我跳上跳下——图表依旧是一片混乱的模糊景象。
我花了两天时间,怀疑可能是固件设置有误,或者是 XIAO 硬件不兼容所致。我调整了参数,更换了 WiFi 信道,还重写了 Python 解析器。但这一切都没有效果。我基本上就是面对着杂乱的无线电信号噪声。
第二阶段:一切皆关乎物理学
在重新阅读相关文档并深入研究射频理论之后,我意识到自己的错误并非出在软件方面,而是源于物理原理。
•天线问题:大多数开发板所附带的 FPC 天线是全向型的,但增益较低。将它们平放在桌子上时,会立即在紧挨着天线的桌面附近产生大量反射。我当时是在测量桌面,而不是整个房间。
•菲涅尔区:无线电波并非以极细的直线形式传播;它们是在两个天线之间形成的一个类似足球形状的区域中传播的,这个区域被称为菲涅尔区。由于我把设备放在了桌子上,所以该区域的下半部分被桌子挡住了。
解决办法:
我搭建了一个合适的测试装置。我把 XIAO 板安装在三脚架上,将它们抬高至离地面 1.4 米的位置。至关重要的是,我断开了 FPC 天线,并安装了外部偶极子(杆状)天线。
我重新启动了这个程序。结果简直是天壤之别。
图表呈现出了一种稳定的节奏。当我静止不动时,线条是平缓的。而当我迈出一步时,波形便呈现出了一种美妙而独特的形态。我终于能在数据中看到“我自己”了。这就是转折点——这项技术真的奏效了。
第三阶段:从数据到检测(“警报线”)
既然我已经有了干净的数据,我就想用它来做些有用的事情。于是我切换到了 esp-radar/console_test 这个示例程序。这个固件包含了 Espressif 公司专有的算法,用于过滤噪声并做出判断:“有人在这儿”或者“房间是空的”。
我在客厅里把这两根三脚架摆放在相距两米的位置。
这场表演出乎意料地精准。它就像一条无形的触发线。当我直接站在两个支架之间时,串行控制台立刻发出“有移动检测到”的警报声。这感觉太神奇了——一个没有镜头、没有活动部件、只有空气的传感器。
然而,其局限性很快就显现出来了。如果我站在接收器后方两米处,它就会忽略我;如果我坐在地上,它也会错过我。单个设备只能形成一条“检测线”,而非“检测场”。要监测一个真实的房间,我需要更广泛的覆盖范围。
第四阶段:构建“感知阵列”
为了解决盲点问题,我决定加大规模。我制定了一个使用 4 个 Seeed Studio XIAO ESP32 设备的多设备阵列方案。
我使用了一个针对 XIAO 生态系统进行了优化的修改版代码库。该代码允许多个接收器向中央节点进行数据回传。
布局策略:
我将这些设备布置起来,形成了一个感知区域的网格状布局:
•发射器(TX):位于房间的东北角。
•接收器 1(RX1):位于西南角(与之相对的对角位置)。它覆盖了主要的步行通道。
•接收器 2 及 3:置于相邻墙壁的中间位置。
这种布局确保了无论我在房间中的位置如何,我都会干扰到至少一对设备的菲涅尔波带区域。
用户界面:
该项目包含一个托管在主 ESP32 上的简易网络服务器。我在手机上打开了其 IP 地址。该界面很简单:有一个显示“存在”、“清除”或“移动”的状态指示器,还有一个显示信号变化情况的滚动图表。
我走进房间。状态随即切换到了“运动”模式。
我走到那个拐角处,那里通常是视线盲区。状态显示仍为“存在”。
我坐在沙发上,保持了相对静止的姿势。系统停顿了一秒钟,但状态仍显示为“在线”。
成功了。我成功地把整个客厅都改造成了一个传感器系统。
结论:这是否已准备好投入实际应用?
在与这款“WiFi 信号阵列”共处一周之后,我对它的优缺点有了清晰的认识。虽然其“酷炫程度”令人惊叹,但实际情况却并非如此简单明了。
1. 电力消耗问题
这是最大的难题。与 Zigbee 或 LoRa 传感器不同,这些传感器通常 99%的时间都处于休眠状态,而 CSI 传感器则需要 WiFi 无线电设备始终保持全功率工作状态,每秒要发送数百次数据包。
小 ESP32 设备运行时会发热。这些设备不能用电池供电,因为几分钟内电池就会耗尽。你需要将 USB-C 数据线铺设到房间的每个角落,这样一来就破坏了“隐形”的美感,除非你把插座布置得恰到好处。
2. “校准的困境”
这个系统对环境非常敏感。如果我把咖啡桌挪动一下,反射的图案就会发生变化。如果我打开窗户,图案也会随之改变。
要使系统正常运行,需要经历一个“校准”阶段,在此期间房间必须完全空无一物。如果添加了一件新家具,通常就需要重新校准基准值。与仅能正常工作的 PIR 传感器相比,这种关系需要进行频繁的维护。
3. 复杂性与准确性
我的四设备组合系统在检测精度方面达到了约 80% 的水平,而我的商用 24GHz 微波雷达的精度则略低一些。
讽刺的是,为了获得更高的精度,你需要更多的设备(更多的接收端节点)。但增加更多的设备会加剧网络拥堵,并使校准过程变得更加繁琐。这就是所谓的“边际效益递减定律”。
4. 未被发掘的潜力:深度学习
我所搭建的这套系统运用的是基本的统计逻辑(如果差异值大于阈值,则为人类)。而真正的未来则在于深度学习。
理想情况下,我们会将这些 CSI 数据输入到运行神经网络的树莓派或英伟达 Jetson 上。有了足够的训练数据,人工智能就能学会“波形 A”代表“行走”,而“波形 B”代表“坐在沙发上”。然而,这会大幅增加成本和所需的技术技能,使其超出了简单的家庭自动化DIY范畴。
本文编译自hackster.io





