Wi-Fi 信号不仅能传输数据,还能感知环境。ESPectre 项目利用 ESP32 的 CSI(Channel State Information,信道状态信息)功能,将普通的 Wi-Fi 路由器与廉价的微控制器转化为一套无需摄像头、无需麦克风的被动式运动检测系统。这种方案在保护隐私的同时,实现了穿墙检测、多人区域覆盖等能力,非常适合智能家居场景下的存在感应与安防监控。
技术原理:从 RSSI 到 CSI
传统的 Wi-Fi 感知依赖 RSSI(接收信号强度指示),但它只能反映整体信号强度,分辨率极低。CSI 则提供了每个 OFDM 子载波的幅度与相位信息,在 HT20 模式下可获取 64 个子载波的详细信道响应。当人体在空间中移动时,会改变多径反射路径,导致 CSI 的幅度和相位发生可测量的变化。ESPectre 正是通过监测这些变化来检测运动。
与 RSSI 相比,CSI 的优势在于时间分辨率高(可达 100Hz 采样)、空间敏感度高(可检测微小动作)、且不受设备发射功率波动影响。这使得它能够在没有视觉线索的情况下,可靠地检测房间内是否有人活动。
硬件选型与部署要点
ESPectre 支持多种 ESP32 芯片,包括 ESP32-S3、ESP32-C6、ESP32-C3 以及经典 ESP32。其中 ESP32-S3 和 ESP32-C6 是推荐平台,因为它们支持增益锁定(Gain Lock)功能,可获得更稳定的 CSI 数据。
硬件成本极低:一块 ESP32 开发板约 €10,配合现有的 2.4GHz Wi-Fi 路由器即可工作。部署时需注意以下关键参数:
距离与位置:传感器与路由器的最佳距离为 3-8 米。此范围内信号强度适中(RSSI -40 至 -70 dBm),AGC(自动增益控制)值在 30-60 之间,可获得最佳检测灵敏度。距离小于 2 米时,信号过强可能导致 AGC 饱和,甚至触发系统冻结。
安装高度:建议将传感器放置在离地面 1-1.5 米的高度,如桌面或书架。避免金属障碍物(如冰箱、金属柜)阻挡信号路径,同时避免将传感器置于角落或封闭空间,以减少多径多样性损失。
天线选择:使用外置 IPEX 天线可显著改善接收质量,特别是在需要穿墙检测的场景。
Home Assistant 集成
ESPectre 以 ESPHome 组件形式提供,配置完全通过 YAML 完成,无需编程。设备启动后会自动通过 ESPHome Native API 接入 Home Assistant,并自动发现以下实体:
- binary_sensor.espectre_motion_detected:运动状态(IDLE/MOTION),状态变化时立即上报
- sensor.espectre_movement_score:运动强度评分(0-10),按 publish_interval 周期更新
- number.espectre_threshold:可调检测阈值,支持运行时修改
这种原生集成意味着你可以直接基于运动状态触发自动化规则,如 "检测到运动时开启灯光"、"无人时关闭空调" 等。多个传感器可同时部署,实现全屋覆盖。
信号处理流水线
ESPectre 的处理流程经过精心设计,从原始 CSI 数据到最终的运动检测结果,包含多个关键阶段:
CSI 原始数据 (64 子载波)
↓
增益锁定 (AGC/FFT 稳定化, ~3秒)
↓
子载波选择 (NBVI 算法, ~10秒)
↓
空间湍流计算 (12 选定子载波的标准差)
↓
Hampel 滤波器 (异常值剔除)
↓
低通滤波器 (可选, 11Hz Butterworth)
↓
移动方差计算 (滑动窗口)
↓
阈值判定 (自适应或固定)
↓
状态机 (IDLE ↔ MOTION)
增益锁定是确保数据质量的关键步骤。ESP32 的 Wi-Fi 硬件包含自动增益控制,会动态调整信号放大倍数。ESPectre 在前 300 个数据包期间采集 AGC 和 FFT 增益样本,计算中位数后锁定这些值,消除硬件引起的幅度波动。对于不支持增益锁定的芯片(如经典 ESP32),系统会自动启用 CV 归一化(Coefficient of Variation,变异系数),通过计算标准差与均值的比值来获得增益不变的湍流度量。
NBVI 子载波选择算法
并非所有 64 个子载波都同样适合运动检测。某些子载波可能信噪比过低、过于嘈杂,或处于保护频段。ESPectre 采用 NBVI(Normalized Baseline Variability Index)算法自动选择最优的 12 个子载波。
NBVI 算法在设备启动时运行,采集约 10 秒(1000 个数据包)的基线数据,计算每个子载波的多个指标:经典 NBVI 分数(能量加权)、熵奖励分数(惩罚平坦分布)、MAD 稳健分数(使用中位数绝对偏差)。算法会生成四种候选子载波组合,通过内部验证选择假阳性率低于 5% 的最优组合。
选择非连续子载波的策略提供了频谱多样性,使系统对不同环境的适应能力更强。实测表明,NBVI 算法可在零手动配置的情况下实现 F1 分数超过 96% 的检测精度。
双检测模式:MVS 与 ML
ESPectre 提供两种检测算法,适应不同场景需求:
**MVS(Moving Variance Segmentation,移动方差分割)** 是默认算法。它计算湍流值的滑动窗口方差,当方差超过自适应阈值时判定为运动状态。MVS 使用自适应阈值(默认 P95 × 1.1),在最小化假阳性的同时保持高召回率。但该模式需要约 13 秒的启动校准时间(3 秒增益锁定 + 10 秒子载波选择)。
**ML(神经网络检测器)** 是实验性功能,使用轻量级 MLP 网络(9 输入 → 32 → 16 → 1)。它从 100 个湍流值的滑动窗口中提取 9 个统计特征(均值、标准差、最大值、最小值、IQR、偏度、自相关、MAD、波形长度),输出运动概率。ML 模式使用固定的 12 个子载波,无需子载波校准,启动时间仅约 3 秒。其优势在于跨环境泛化能力强,无需针对每个房间重新校准。
选择哪种模式取决于具体需求:MVS 适合长期部署且环境稳定的场景,ML 适合需要快速启动或频繁移动设备的场景。
调参与优化实践
采样率与窗口大小:默认配置使用 100 pps(每秒数据包)的采样率和 100 个数据包的滑动窗口(对应 1 秒)。根据奈奎斯特采样定理,100Hz 采样足以检测 50Hz 以下的运动频率,覆盖人类行走、手势等常见活动。如需检测更快动作(如体育动作),可将采样率提升至 600-1000 pps。
阈值调整:自适应阈值在大多数情况下表现良好。如遇到过多假阳性,可尝试将 segmentation_threshold 从 auto 调整为固定值(如 2.0-5.0);如漏检较多,可尝试 min 模式或降低至 0.5-0.8。
滤波器配置:Hampel 滤波器默认启用(窗口 7,阈值 5.0 MAD),可有效剔除 RF 干扰引起的异常尖峰。低通滤波器默认关闭,在噪声较大的环境中可启用 11Hz Butterworth 滤波,在保持 92% 召回率的同时将假阳性控制在 3% 以下。
运行时校准:MVS 模式下,可通过 Home Assistant 中的 Calibrate 开关触发重新校准,无需重新刷写固件。校准时需确保房间安静无人,持续约 13 秒。
局限与注意事项
ESPectre 目前仅支持二元状态检测(有人 / 无人),无法区别人与宠物,也无法识别具体人数或活动类型。这些高级功能需要训练专门的机器学习模型,目前处于研究阶段。
隐私方面,CSI 数据仅包含信道物理特性(幅度、相位),不包含身份信息、通信内容、图像或音频。但系统仍可能用于非自愿监控,部署时应确保获得被监测人员的明确同意,并遵守当地隐私法规。
总结
ESPectre 将学术级的 Wi-Fi 感知技术转化为实用的智能家居组件。通过 NBVI 自动子载波选择和自适应阈值,它实现了开箱即用的运动检测能力;通过 ESPHome 原生集成,它无缝融入现有的智能家居生态。对于追求隐私保护、需要穿墙检测或希望降低硬件成本的用户,这是一个值得尝试的方案。
参考来源
- ESPectre GitHub 仓库: https://github.com/francescopace/espectre
- ALGORITHMS.md 技术文档: https://github.com/francescopace/espectre/blob/main/micro-espectre/ALGORITHMS.md
- TUNING.md 调优指南: https://github.com/francescopace/espectre/blob/main/TUNING.md
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。