ESPectre 在 ESP32-S2 上的固件性能基准实测:Native、ESPHome 与 Micro-ESPectre 的 CSI 感知资源画像
2026/9/16 14:34:03 网站建设 项目流程

ESPectre 在 ESP32-S2 上的固件性能基准实测:Native、ESPHome 与 Micro-ESPectre 的 CSI 感知资源画像

【免费下载链接】espectreWi-Fi CSI motion sensing for ESP32. C++ SDK, ESPHome, Native, and Matter frontends, browser tools, and a CLI for the full device lifecycle. GPLv3 and commercial licensing.项目地址: https://gitcode.com/GitHub_Trending/es/espectre

本篇技术指南解读 ESPectre 项目为 ESP32-S2 芯片生成的固件性能基准报告(docs/performance/ESP32-S2.md)。该报告由仓库内的固件基准工具tools/benchmark_firmware.py在真实硬件上自动构建、烧录、监控并生成,覆盖 Native、ESPHome、Micro-ESPectre 三种前端与 Lightweight、High Accuracy 两种检测配置的五种代表性组合。读完本文,你将理解报告中的每一项指标含义(CSI 占用率、包速率、堆稳定性、运行时负载、检测耗时等)、这些指标对应的通过标准,以及如何在同一块 ESP32-S2 板卡上复现这套基准并正确解读结果。

报告快照:一次可溯源的硬件基准运行

ESP32-S2 性能报告是一个自动生成文件,其头部完整记录了生成本次报告的环境与溯源信息:

字段
生成命令tools/benchmark_firmware.py --chip s2 --port <serial-port>
Git 修订号ed014256dbf6
运行开始时间2026-09-05T14:50:24+02:00
监视时长60 秒(每个打分窗口)
总体结果PASS
工作区状态dirtydirty(运行前后均未变)
源码指纹起止一致,Source consistency:stable

从源码看,这份头部由 tools/lib/firmware_benchmark/report.py 中的repository_state()render_report()生成:报告记录 Git 修订号、工作区是否含未提交改动,以及对espectresrc/cppsrc/python/espectre_clisrc/python/micro_espectretools/benchmark_firmware.pytools/lib/firmware_benchmark六类关键源码路径计算出的 SHA-256 源码指纹(见BENCHMARK_SOURCE_PATHS)。这套溯源机制的意义在于:报告只对生成时点的源码负责。运行中途若 Git 修订号发生变化,全部已执行 case 将被判定无效;若同一修订号下源码指纹变化,则只给出警告而不撤销结果。

报告中的“Snapshot scope”段落特别说明:使用--update--resume保留的历史 case 可能来自更早的运行,精确的 case 来源需查阅data/untracked/firmware_benchmarks/<run-id>/下按运行时间戳、芯片与修订号命名的逐次运行产物(manifest.json、各 phase 的.log/.jsonlanalysis.json)。

五种基准组合的总体矩阵

ESP32-S2 上 Matter 前端因依赖蓝牙配网流程而被自动省略(这一点在 tools/README.md 中有明确说明:“Matter is omitted automatically for ESP32-S2 because the supported commissioning flow requires Bluetooth”)。因此本次报告覆盖以下五种组合,总体全部PASS

FrontendDetection profileResultOccupancyBinary sizePartition freeCPU loadMin free heap
NativeLightweightPASS83.47%1.16 MiB734.3 KiB (38.2%)8.47%29.8 KiB
NativeHigh AccuracyPASS82.70%1.16 MiB734.3 KiB (38.2%)11.92%29.8 KiB
ESPHomeLightweightPASS85.77%991.0 KiB801.1 KiB (44.7%)10.81%25.3 KiB
ESPHomeHigh AccuracyPASS85.68%991.0 KiB801.1 KiB (44.7%)15.37%25.3 KiB
Micro-ESPectreLightweightPASS87.00%1.24 MiB774.0 KiB (39.0%)94.53%96.8 KiB

这张矩阵能立刻读出 ESP32-S2 上的几条关键结论:

  • Native 与 ESPHome 的 High Accuracy 配置通过运行时切换获得,无需重新构建:报告头部说明“All three C++ frontends support persisted runtime switching”,基准策略是复用一次烧录的 Lightweight 镜像,再通过 Direct 接口在运行时把检测器切换到 High Accuracy(见 tools/README.md 的“Verify production runtime defaults before applying case-specific mutations”条款)。这也解释了为何 Native 与 ESPHome 两种配置的二进制大小、分区余量完全相同。
  • ESPHome 固件最小(991.0 KiB),Native 次之(1.16 MiB),Micro-ESPectre 最大(1.24 MiB,其中包含 165.1 KiB 的 MicroPython 源码),但 Micro-ESPectre 反而拥有最高的空闲堆(最小 96.8 KiB),因为它运行在 MicroPython 的垃圾回收堆模型之上,与应用分区占用并不直接相关。
  • Micro-ESPectre 的运行时负载高达 94.53%,是 C++ 前端的近 6~11 倍,反映了解释型 MicroPython 运行时在 ESP32-S2 单核上的 CPU 成本,但其 CSI 占用率(87.00%)反而是五种组合中最高的。

五种组合的逐项实测详情

以下五节完整保留报告正文的逐项指标,并给出关键指标的解读。

Native Lightweight

Result:PASS

MetricValue
Benchmark moderuntime
Build duration36.3s
Flash duration27.3s
Monitor duration2m 37.3s
Firmware binary1,214,112 bytes (1185.7 KiB)
Application partition used1,214,112 bytes (1185.7 KiB)
Application partition free751,968 bytes (734.3 KiB)
Verified detectorlightweight
Frontend setup final BSSID requested / applied / already associated / reassociation exercised / association verifiedyes / yes / yes / yes / yes
Direct control attempts120/120 succeeded
Direct censored failures0
Direct diagnostics samples60/60 expected
Status cadence1.00 s mean, 1.01 s max gap
Status gaps over tolerance0
Device uptime restarts0
Packet-rate samples60
Packet rate83.32 pps mean, 72 min, 92 max, 5.34 standard deviation
CSI occupancy83.47% mean, 73% min, 93% max
Motion samples233/5 expected
Last free heap57,792 bytes (56.4 KiB)
Heap stability previous-window median57,834 bytes (56.5 KiB)
Heap stability final-window median57,792 bytes (56.4 KiB)
Heap stability change-42 bytes, -0.07%
Minimum free heap30,483 bytes (29.8 KiB)
Last largest heap block47,104 bytes (46.0 KiB)
Runtime load8.47% mean
Loop average976.86 us
Loop maximum6796 us
Detection samples247
Detection average881.71 us
Detection minimum27 us
Detection maximum1758 us

Native 前端在 Lightweight 检测器下展现出最轻量的运行时特征:8.47% 的平均运行时负载、约 977 µs 的平均主循环耗时,以及平均 882 µs 的检测耗时(均值约 1 ms 量级,与报告设定的每包 100 pps、每秒 4 次推理的负载模型相匹配)。堆稳定性变化仅 -0.07%,几乎没有泄漏迹象。BSSID 五个字段全部为yes,说明基准在设置阶段通过 Direct 强制应用了目标 AP 并真实演练了一次重关联(ESPHome 的already associated字段为no,说明 ESPHome 场景确实经历了从其他 AP 到目标 AP 的重关联过程,而 Native 场景则验证了“已关联时强制切换”的分支)。

Native High Accuracy

Result:PASS

MetricValue
Benchmark moderuntime
Build duration36.3s
Flash duration27.3s
Monitor duration2m 37.3s
Firmware binary1,214,112 bytes (1185.7 KiB)
Application partition used1,214,112 bytes (1185.7 KiB)
Application partition free751,968 bytes (734.3 KiB)
Verified detectorhigh_accuracy
Frontend setup final BSSID requested / applied / reassociation exercised / association verifiedyes / yes / yes / yes
Direct control attempts120/120 succeeded
Direct censored failures0
Direct diagnostics samples60/60 expected
Status cadence1.00 s mean, 1.02 s max gap
Status gaps over tolerance0
Device uptime restarts0
Packet-rate samples60
Packet rate82.58 pps mean, 70 min, 90 max, 4.80 standard deviation
CSI occupancy82.70% mean, 71% min, 91% max
Motion samples233/5 expected
Last free heap54,396 bytes (53.1 KiB)
Heap stability previous-window median54,308 bytes (53.0 KiB)
Heap stability final-window median54,310 bytes (53.0 KiB)
Heap stability change+2 bytes, +0.00%
Minimum free heap30,483 bytes (29.8 KiB)
Last largest heap block43,008 bytes (42.0 KiB)
Runtime load11.92% mean
Loop average1487.29 us
Loop maximum9356 us
Detection samples274
Detection average3883.71 us
Detection minimum26 us
Detection maximum6432 us

与 Lightweight 相比,Native High Accuracy 的二进制与分区占用完全一致(因为只是运行时切换了检测器),但检测器成本显著上升:检测平均耗时从 882 µs 升至 3884 µs,最大单次检测 6432 µs,主循环均值从 977 µs 升至 1487 µs,运行时负载从 8.47% 升至 11.92%。这与 docs/performance/README.md 中的主机资源基准趋势一致——High Accuracy 是 ML 神经网络实现,单次推理成本高于特征融合的 Lightweight。即便如此,最小空闲堆仍保持 29.8 KiB,且堆稳定性变化为 +0.00%,说明运行时切换检测器没有引入额外泄漏。

ESPHome Lightweight

Result:PASS

MetricValue
Benchmark moderuntime
Build duration54.4s
Flash duration25.5s
Monitor duration2m 34.4s
Firmware binary1,014,768 bytes (991.0 KiB)
Application partition used1,014,658 bytes (990.9 KiB)
Application partition free820,350 bytes (801.1 KiB)
Build RAM used133,500 bytes (130.4 KiB)
Verified detectorlightweight
Frontend setup final BSSID requested / applied / already associated / reassociation exercised / association verifiedyes / yes /no/ yes / yes
Direct control attempts120/120 succeeded
Direct censored failures0
Direct diagnostics samples60/60 expected
Status cadence1.00 s mean, 1.02 s max gap
Status gaps over tolerance0
Device uptime restarts0
Packet-rate samples60
Packet rate85.60 pps mean, 72 min, 95 max, 6.59 standard deviation
CSI occupancy85.77% mean, 72% min, 96% max
Motion samples234/5 expected
Last free heap50,560 bytes (49.4 KiB)
Heap stability previous-window median50,468 bytes (49.3 KiB)
Heap stability final-window median50,474 bytes (49.3 KiB)
Heap stability change+6 bytes, +0.01%
Minimum free heap25,908 bytes (25.3 KiB)
Last largest heap block34,816 bytes (34.0 KiB)
Runtime load10.81% mean
Loop average2174.86 us
Loop maximum136409 us
Detection samples254
Detection average1883.57 us
Detection minimum26 us
Detection maximum9065 us

ESPHome 固件比 Native 小约 200 KiB,且应用分区余量最高(44.7%)。ESPHome 场景的already associatedno,说明基准确实经历了从初始 AP 到目标 BSSID 的真实重关联切换。需要留意Loop maximum高达 136409 µs(约 136 ms),这是 ESPHome 组件模型下偶发的长尾主循环延迟,但它没有造成状态上报节拍超差(最大间隔仅 1.02 s,容差为 0 个超限间隙),也未引发重启。CSI 占用率 85.77% 是 C++ 前端中最高的,包速率均值 85.60 pps 也略高于 Native。

ESPHome High Accuracy

Result:PASS

MetricValue
Benchmark moderuntime
Build duration54.4s
Flash duration25.5s
Monitor duration2m 34.4s
Firmware binary1,014,768 bytes (991.0 KiB)
Application partition used1,014,658 bytes (990.9 KiB)
Application partition free820,350 bytes (801.1 KiB)
Build RAM used133,500 bytes (130.4 KiB)
Verified detectorhigh_accuracy
Frontend setup final BSSID requested / applied / already associated / reassociation exercised / association verifiedyes / yes / no / yes / yes
Direct control attempts120/120 succeeded
Direct censored failures0
Direct diagnostics samples60/60 expected
Status cadence1.00 s mean, 1.02 s max gap
Status gaps over tolerance0
Device uptime restarts0
Packet-rate samples60
Packet rate85.64 pps mean, 70 min, 94 max, 6.50 standard deviation
CSI occupancy85.68% mean, 71% min, 94% max
Motion samples234/5 expected
Last free heap46,979 bytes (45.9 KiB)
Heap stability previous-window median47,028 bytes (45.9 KiB)
Heap stability final-window median46,964 bytes (45.9 KiB)
Heap stability change-64 bytes, -0.14%
Minimum free heap25,908 bytes (25.3 KiB)
Last largest heap block34,816 bytes (34.0 KiB)
Runtime load15.37% mean
Loop average3260.17 us
Loop maximum18273 us
Detection samples233
Detection average3789.67 us
Detection minimum25 us
Detection maximum12776 us

ESPHome High Accuracy 与 Lightweight 相比:检测平均耗时从 1884 µs 升至 3790 µs,运行时负载从 10.81% 升至 15.37%(五种组合中 C++ 前端最高),主循环均值从 2175 µs 升至 3260 µs。堆稳定性变化 -0.14%(-64 字节)仍在 5% 的下降阈值之内。二进制的 991.0 KiB 说明 ESPHome 的 High Accuracy 支持同样通过运行时切换实现,无需额外固件体积。

Micro-ESPectre Lightweight

Result:PASS

MetricValue
Benchmark moderuntime
Deploy duration21.7s
Flash duration1m 8.0s
Monitor duration1m 36.2s
Firmware binary1,300,512 bytes (1270.0 KiB)
Deployed Python source169,086 bytes (165.1 KiB)
Application partition used1,239,072 bytes (1210.0 KiB)
Application partition free792,544 bytes (774.0 KiB)
Verified detectorlightweight
Direct control attempts28/28 succeeded
Direct censored failures0
Status samples13/14 expected
Status cadence4.50 s mean, 5.01 s max gap
Status gaps over tolerance0
Device uptime restarts0
Packet-rate samples13
Packet rate86.64 pps mean, 78 min, 95 max, 6.69 standard deviation
CSI occupancy87.00% mean, 79% min, 97% max
Motion samples235/5 expected
Last free heap99,119 bytes (96.8 KiB)
Heap stability previous-window median99,119 bytes (96.8 KiB)
Heap stability final-window median99,119 bytes (96.8 KiB)
Heap stability change+0 bytes, +0.00%
Minimum free heap99,087 bytes (96.8 KiB)
Runtime load94.53% mean
Loop average3158.33 us
Loop maximum124893 us
Detection samples245
Detection average2180.67 us
Detection minimum661 us
Detection maximum6878 us

Micro-ESPectre 是五种组合中最特殊的一个:它是 MicroPython 运行时,通过deploy阶段部署 165.1 KiB 的 Python 源码,状态采样节拍为 4.50 秒(而非 C++ 前端的 1 秒),这是因为基准刻意避开了 Micro 每 1 秒刷新缓存诊断快照的量化步长——tools/lib/firmware_benchmark/settings.py 中MICRO_DIRECT_DIAGNOSTICS_INTERVAL_SECONDS = 4.5的注释明确说明“A half-second phase offset prevents adjacent 4 s/6 s snapshot deltas”,同时MICRO_RUNTIME_STATUS_GAP_TOLERANCE_MS = 1000放宽了间隙容差。94.53% 的运行时负载表明 ESP32-S2 上 MicroPython 解释器已接近满载,但检测平均耗时 2181 µs、最小空闲堆 96.8 KiB(得益于 MicroPython 的 GC 堆模型)、堆稳定性 0% 变化,证明它仍能稳定完成感知任务。Motion samples 235/5 意味着接收到的运动事件远超 5 次的通过底线。

关键指标的含义与基准打分逻辑

报告中的每个数字都由 tools/lib/firmware_benchmark/analysis.py 的analyze_direct_evidence()从 Direct 接口采样的诊断字段计算而来。理解以下核心指标的定义,是正确使用这份报告的前提:

  • CSI 占用率(CSI occupancy):已接纳 CSI 时隙占全部时隙的比例,反映感知数据流的连续性。它的下限是 70% 的“detector-ready floor”,由 tools/lib/temporal_csi_sampler.py 中的MINIMUM_COVERAGE_NUMERATOR = 7MINIMUM_COVERAGE_DENOMINATOR = 10(即 7/10)换算而来。五种组合的均值(82.70%~87.00%)全部高于该下限。
  • 包速率(Packet rate):平均约 83~87 pps,而报告设定的标称目标为 100 pps(MINIMUM_BENCHMARK_CSI_TARGET_PPS = 100)。实际均值低于目标是因为 ESP32-S2 的 Wi-Fi 基带实际接纳率存在抖动,基准只要求“在运行时变更前报告 100 pps 目标”并在打分窗口内持续采样。
  • 堆稳定性(Heap stability):从打分窗口开始 10 秒后(STARTUP_GRACE_SECONDS = 10)计算两个完整且连续的 10 秒窗口(HEAP_STABILITY_WINDOW_SECONDS = 10)的自由堆中位数,最终窗口中位数相对前序窗口的下降不得超过 5%(HEAP_STABILITY_MAX_DECLINE_PERCENT = 5.0)。若监视时长不足以形成两个完整窗口,case 直接判 FAIL,不降级回退。五种组合的变化在 -0.14% 到 +0.01% 之间,全部通过。
  • 运行时负载(Runtime load):来自固件性能诊断窗口(performance_window_ready标志),报告取去重后的均值。C++ 前端为 8.47%~15.37%,MicroPython 为 94.53%。
  • 检测耗时(Detection timing)detection_samplesdetection_avg_us等字段仅在检测窗口启用检测计时时上报;require_detection_timing通过标准要求计时数据必须存在。Lightweight 均值约 0.9~1.9 ms,High Accuracy 均值约 3.8~3.9 ms。
  • 运动事件(Motion samples):通过 Direct SSE 事件流统计,通过标准要求至少收到 5 个(MIN_MOTION_SAMPLES = 5)canonical 运动事件,五种组合分别收到 233~235 个。
  • 状态节拍与间隙(Status cadence / gaps):C++ 前端以 1 秒为采样间隔、500 ms 间隙容差(RUNTIME_STATUS_GAP_TOLERANCE_MS = 500);Micro 以 4.5 秒为间隔、1000 ms 容差。所有组合间隙超差数为 0。

通过标准(Pass Criteria)逐条解读

报告的## Pass Criteria一节是基准的可执行契约,由 tools/lib/firmware_benchmark/report.py 的render_report()依据参与 case 动态渲染。ESP32-S2 报告(无 Matter)要求:

  • 所有必需的构建、烧录与部署阶段成功完成;
  • Native、ESPHome、Micro-ESPectre 协商 Direct v1 协议,并在每个打分窗口内持续采样规范诊断字段;
  • Native 与 ESPHome 使用 canonical 固件默认配置、烧录时清除全部设备数据、并通过 Improv Serial 完成配网(Micro-ESPectre 不支持 Improv Serial,只注入连通性配置,见 tools/README.md);
  • Native 与 ESPHome 在运行时变更前上报 Lightweight 检测、配置的内部受管流量与 100 pps 目标;Native 保持未配置 MQTT;
  • 感知前端通过 Direct SSE 至少收到 5 个 canonical 运动事件;
  • 启动宽限后自由堆提供两个完整连续的 10 秒窗口,且最终窗口中位数较前一窗口下降不超过 5%;
  • 打分窗口内设备 uptime 不重启;
  • Direct 诊断节拍保持在运行时间隙容差内,感知前端的生产运动事件保持在线;
  • 五种 runtime case 的 CSI 占用率均值不低于 70% 的 admitted-slot detector-ready 下限;
  • 五种 runtime case 的检测计时数据必须存在;
  • Direct 发送失败与意外拒绝连接计数(当前端暴露这些计数器时)不得增长;
  • Micro-ESPectre 的运行时启动器在 Direct 采集全程保持活跃。

这些标准与 test/python/host/benchmark/ 下的test_benchmark_*.py行为测试共同构成基准契约的可执行约束,生成的性能报告本身只是单次运行的记录,不是契约的权威定义。

如何在 ESP32-S2 上复现这套基准

基准的入口是 tools/benchmark_firmware.py,它要求传入--chip(本芯片为s2)与--port(串口),并将这两个参数原样透传给仓库 CLI 委托的每条命令:

# 前置:复制实验室配置模板并填写 Wi-Fi 信息 # cp tools/benchmark_firmware.local.env.example tools/benchmark_firmware.local.env python tools/benchmark_firmware.py --chip s2 --port /dev/ttyACM0

实验室配置从 tools/benchmark_firmware.local.env.example 复制为tools/benchmark_firmware.local.env,其中ESPECTRE_BENCHMARK_WIFI_SSIDESPECTRE_BENCHMARK_WIFI_PASSWORD为必需项;设置ESPECTRE_BENCHMARK_WIFI_BSSID可演练目标 AP 的强制重关联,而单独设置ESPECTRE_BENCHMARK_WIFI_CHANNEL而不同时给出 BSSID 会在访问硬件前被拒绝(见 tools/lib/firmware_benchmark/settings.py 的require_benchmark_prerequisites())。以ESPECTRE_BENCHMARK_开头的导出环境变量优先于本地 env 文件。

针对 ESP32-S2 有两个必须注意的操作细节:

  1. USB CDC 下载模式:在交互式终端中,基准会在每次 ESP32-S2 C++ 烧录前暂停,等待操作员手动将板卡置于下载模式;Micro-ESPectre 烧录前同样需要手动准备,非交互式运行则要求设备提前就绪(见 tools/README.md)。
  2. Matter 自动省略:ESP32-S2 的 Matter case 不会执行,因为受支持的配网流程需要蓝牙。因此本次报告只含 Native、ESPHome、Micro-ESPectre 五个 case。

常用变体:

# 只跑 Micro 前端,并将每个打分窗口延长到 300 秒(堆浸泡测试),保留既有报告 case python tools/benchmark_firmware.py --chip s2 --port /dev/ttyACM0 --frontend micro --duration 300 --update # 保留已通过的 case,只重跑失败或缺失的 case python tools/benchmark_firmware.py --chip s2 --port /dev/ttyACM0 --resume

运行过程中,报告在 Native、ESPHome 每个检测器完成后都会增量刷新到docs/performance/ESP32-S2.md,并同步写入data/untracked/firmware_benchmarks/<run-id>/下的结构化产物(归一化的 Direct 样本与事件、传输证据、固件哈希、运行清单)。某个 case 失败时基准会写出一份部分报告并立即停止在第一个失败 case;只有报告中所有 case 全部通过才返回成功。原始串口输出、Direct 载荷、凭据、配网数据与本地地址不会写入产物目录。

总结与延伸阅读

这份 ESP32-S2 报告的核心价值在于给出了同一芯片上五种前端/检测器组合的可对比资源画像:C++ 前端(Native/ESPHome)的运行时负载均低于 16%,Lightweight 检测平均耗时约 1 ms 级、High Accuracy 约 4 ms 级;Micro-ESPectre 以接近满载的 94.53% CPU 负载换来最高的 CSI 占用率与最宽松的堆余量,同时通过放宽诊断采样节拍适配其 1 秒缓存快照模型。所有组合都通过了 70% CSI 占用下限、5% 堆下降上限、5 个运动事件底线与零重启等全部通过标准。

如需进一步理解基准背后的检测器设计与性能报告体系,可继续阅读:

  • docs/performance/README.md:聚合检测器重放指标(Recall、FP Rate、F1)与主机资源基准
  • tools/README.md:固件基准契约的规范定义与全部 CLI 用法
  • docs/ALGORITHMS.md:Lightweight 与 High Accuracy 检测器的完整设计
  • tools/lib/firmware_benchmark/analysis.py:报告指标的底层计算逻辑
  • test/python/host/benchmark/:基准契约的可执行行为测试

【免费下载链接】espectreWi-Fi CSI motion sensing for ESP32. C++ SDK, ESPHome, Native, and Matter frontends, browser tools, and a CLI for the full device lifecycle. GPLv3 and commercial licensing.项目地址: https://gitcode.com/GitHub_Trending/es/espectre

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询