RuView R12 线程复盘:用被动 WiFi 做建筑结构漂移检测(SVD 特征值方法的负面结果与修订路径)
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
导读:本文复盘 RuView 开源仓库中 R12「RF weather mapping」研究线程的首次实验——尝试用被动环境 WiFi 的 CSI(信道状态信息)SVD 特征值谱漂移来检测建筑结构变化(新家具、墙体渗水、地基沉降等)。实验得到的是一个诚实的负面结果(信号/自然漂移比仅 0.69×),但文档同时给出了三条具体可执行的修订路径,且仓库中后续的 PABS 实现已将该线程从 NEGATIVE 翻转为 POSITIVE。读者读完后将掌握该实验的完整设计、代码实现、失败机理,以及「负面结果 → 修订 → 翻正」的研究循环范式。
一次「负向但有明确出路」的实验:tick 5 的背景与交付物
docs/research/sota-2026-05-22/ticks/tick-5.md记录的是 2026-05-22 03:45 UTC 的一次研究 tick,归属于 R12 线程(RF weather mapping — structural drift from passive ambient WiFi)。该 tick 的判定是Negative-ish result with a clearly-actionable revision path,即「负向结果,但附带清晰可执行的修订路径」,属于研究循环中的诚实进展(honest progress)。
本次 tick 交付了三项产物:
examples/research-sota/06-structure-detection/r12_rf_weather_eigenshift.py—— 纯 NumPy 演示脚本,用于回答「SVD 特征值漂移能否检测合成结构扰动」这一问题;examples/research-sota/06-structure-detection/r12_rf_weather_results.json—— 完整数值结果;docs/research/sota-2026-05-22/R12-rf-weather-mapping.md—— 研究笔记,涵盖 10 年愿景、首次实验方法、负面结果、失败原因、三次具体修订(PABS / 逐子载波残差 / 多日基线)、仍然成立的部分以及纵向应用。
此外,该 tick 刻意没有写入PROGRESS.md,以避免与正在编辑同一文件的地平线追踪 agent(位于feat/ruview-mcp-m*分支)发生写竞争。ticks/tick-N.md命名约定保证了每次 cron 驱动的 tick 完全自包含,最终由 08:00 ET 的汇总脚本统一归并——这也是仓库研究循环工程化的一个细节。
10 年愿景:把每一台 WiFi AP 变成建筑结构监测仪
R12 的出发点是一个物理直觉:建筑内每一台 WiFi 接入点,本质上都是一台持续向结构注入能量的相干射频源。墙壁、地板、家具乃至人体都会以特有的多径签名(multipath signature)反射这些能量。
仓库中wifi-densepose-signal/src/ruvsense/field_model.rs的持久房间场模型(persistent-room field model)已经对空房间 CSI 做 SVD 以提取「这个房间无人时的 RF 反射长相」的特征结构,用于从占用检测中扣除房间基线。R12 的愿景是把这一思路推广到时间维度:
- 一件新家具会以特定方式改变多径剖面(在特定位置新增一个反射体);
- 墙体渗水会改变墙体介电常数,使反射相位与衰减发生偏移;
- 结构沉降会以亚厘米级改变反射体的几何位置,可通过 OFDM 相位相干性检测;
- 一块缺失的天花板会改变房间间的菲涅尔区耦合;
- HVAC 故障改变空气湿度 → 改变波传播常数 → 在长距离上改变相位。
2026 年以前的 SOTA 大多只用 CSI 做活动识别,把被动环境 RF 用于结构完整性监测属于未开垦地带。这正是 R12 的假设空间:连续跟踪建筑 RF 特征结构在天、周、月、年尺度上的漂移。
首次实验设计:SVD 特征值谱 + 余弦距离
本次实验(examples/research-sota/06-structure-detection/r12_rf_weather_eigenshift.py)测试的是最简单可行的算法:对逐帧 CSI 矩阵做 SVD,取 top-K 奇异值,然后计算谱之间的余弦距离。
实验设置(源码第 19-36 行 docstring 与主流程):
- 从已有配对数据中取1,077 个 CSI 窗口;
- 前半(10,760 帧)记为「之前」(before),后半(10,780 帧)记为「之后」(after);
- 向「之后」一半注入合成结构扰动:将 3 个子载波(
[30, 41, 52],取自 R5 的 top-saliency 列表)乘以 0.85,模拟一块新的反射面使这些频率衰减约 1.4 dB; - 每半各自计算 top-10 奇异值,比较谱之间的余弦距离;
- 再跑一组不加扰动的对照组——同样的前后切分应当产生相近的谱(只有操作员移动带来的时间漂移,而非结构变化)。
源码实现要点
核心数据流如下:
load_windows()(源码 L49-L63):逐行读取 JSONL 配对数据,校验csi_shape == [56, 20],将 CSI 重塑为 56 子载波 × 20 帧的窗口堆叠;perturb_subcarriers()(源码 L66-L71):对指定子载波乘以增益gain,模拟结构变化(新反射体衰减特定频率);per_frame_matrix()(源码 L74-L78):把所有窗口的帧堆叠成[N_total_frames, 56]矩阵,每行是一个时间步的 56 子载波信道状态多变量观测;top_k_singular_values()(源码 L81-L86):先对矩阵做均值中心化(等价于未归一化的 PCA),再np.linalg.svd(compute_uv=False)取 top-k 奇异值;spectrum_distance()(源码 L89-L94):对两条谱归一化后计算1 - dot(s1n, s2n),0 表示方向相同、2 表示完全相反,对称且尺度不变。
命令行运行方式
python examples/research-sota/06-structure-detection/r12_rf_weather_eigenshift.py \ --paired /path/to/paired_csi.jsonl \ --out examples/research-sota/06-structure-detection/r12_rf_weather_results.json \ --perturb-indices 30,41,52 \ --perturb-gain 0.85参数说明(源码 L98-L104):
| 参数 | 默认值 | 含义 |
|---|---|---|
--paired | 必填 | 配对 CSI 数据路径(JSONL,每行含csi与csi_shape字段) |
--out | examples/research-sota/r12_rf_weather_results.json | 结果输出路径 |
--perturb-indices | 30,41,52 | 要扰动的子载波索引(来自 R5 的 top-saliency 列表),逗号分隔 |
--perturb-gain | 0.85 | 子载波增益,模拟新反射体对频率的衰减 |
脚本会输出三条 top-10 奇异值谱、两个余弦距离以及信号/自然漂移比,并根据阈值给出判定(源码 L147-L153):
d_pert > d_raw * 3→STRONG:扰动与自然时间漂移易于区分;d_pert > d_raw * 1.5→MODERATE:可检测但有裕度;- 否则 →WEAK:结构扰动淹没在时间漂移中。
结果 JSON 中会记录扰动配置、前后窗口数、三条谱、两个距离、信号/自然漂移比与判定结论。
结果:扰动信号反而比自然漂移更小
实验运行得到的结果数据(r12_rf_weather_results.json,distances字段)如下:
| 对比项 | 相对 BEFORE 的余弦距离 |
|---|---|
| AFTER(无扰动,对照组) | 0.00035 |
| AFTER(3 子载波受扰动) | 0.00024 |
| 信号 / 自然漂移比 | 0.69× |
关键结论:合成结构扰动产生的谱距离反而小于同一段录音中操作员移动造成的自然时间漂移。top-10 SVD 奇异值谱对「56 个子载波中 3 个衰减约 15%」的结构变化不够敏感,尤其是房间里还有人活动时。
判定为WEAK: structural perturbation gets lost in temporal drift。从真实谱数据看:before 谱最大奇异值约 2220.7,after-raw 为 2182.6,after-perturbed 为 2172.7,三者差异都在同一量级,肉眼几乎不可分——这印证了余弦距离微小的原因。
失败机理:为什么 top-K 奇异值谱不够用
研究笔记给出了清晰的量级分析:top-K 奇异值谱只捕获信道状态中的主导能量。56 个子载波中 3 个受 15% 扰动,对矩阵总能量的影响约为(3/56) × 15% ≈ 0.8%,远低于操作员移动带来的自然时间方差。也就是说,能量层面的信号完全被噪声淹没。
更深层的结构性原因:余弦距离作用在奇异值(尺度)上,是「scale-aware but direction-blind」——它对能量分布敏感,但对特征空间的旋转方向完全不敏感。如果结构变化主要改变的是特征向量方向而非能量分布,这个度量就会视而不见。
三条修订路径:从错误原语走向正确原语
研究笔记明确否定了「SVD 谱余弦距离」这一原语,并提出三条具体修订方案,这也是 tick 判定「clearly-actionable」的依据:
- 使用完整特征向量基,而非仅谱(PABS / 主子空间角):用 top-K 特征向量(奇异向量)之间的子空间夹角(principal angles between subspaces,PABS)来比较,即使能量分布相似,也能捕捉子空间旋转造成的结构偏移;
- 逐子载波残差分析:不再比较整体谱,而是把每个窗口投影到空房间子空间,寻找一致的逐子载波残差——受扰动的 3 个子载波会呈现持续衰减偏差,而自然漂移不会复现这种模式,从而把扰动定位到具体子载波;
- 多日基线:本次实验只用了一段 30 分钟的录音,「自然时间漂移」由操作员移动主导而非结构变化。真实 RF-weather 问题的噪声结构恰恰相反——结构变化发生在小时到天尺度,占用噪声在分钟到小时尺度平均掉。对 24 小时窗口内的特征值谱取平均,应能把操作员噪声底降低 50-100 倍。
脚本 docstring 中特别强调:「结构变化」的定义是新家具、开窗、墙体渗水、地基沉降、天花板缺失——正是这些长期慢变因素,才让多日基线成为必要条件。
仍然成立的部分:被证伪的是算法,不是物理
负面结果不应被误读为愿景破产。研究笔记逐条核对了哪些论断依然成立:
- 物理是真实的:墙体介电常数变化会引起可测的 CSI 偏移(2020 年代 CSI 建筑监测文献中已有充分记载);
- 硬件是足够的:ESP32-S3 的 CSI 带宽与相位分辨率足以在 5 GHz 下检测 1° 相位偏移 ≈ 0.5 mm 位移;
- 部署故事成立:建筑内任何 WiFi AP 都可被动采样,无物理安装成本;
- 本次实验的失败点是算法 + 单日数据的噪声结构,而非底层信号不存在。
这个负面结果证明了什么(对后来者的直接价值)
研究笔记明确列出两点「DOES prove」:
- 简单的「SVD 谱余弦距离」方法在单日数据上行不通。任何想从零实现结构检测的人,应当直接以子空间角 + 多日平均为起点,而不是重走这条路——这就是负面结果节省他人时间的方式;
- 操作员占用数据中的自然时间漂移在特征值层面不可忽略。任何变化检测算法都必须显式建模这种漂移,而不是把它当作零均值噪声。
跨线程交叉验证:R5 / R7 / R8 的相互印证
tick 5 的「Why this is still useful」与 R12 研究笔记的「Connection back」部分,把本次负面结果与仓库其他研究线程做了交叉印证:
- R5(子载波显著性):扰动特意选择了 R5 的 top-saliency 子载波(41、52、30 位列 R5 计数模型显著性前 3),但依然未被检测到——说明 R5 的显著性具有任务特定性:计数任务的显著性 ≠ 结构检测任务的显著性。同一模型、同一数据、不同任务关心不同特征,这是一个可发表的区别(publishable distinction);
- R7(多链路一致性):同一 SVD 谱距离原语在 R7 的对抗节点检测中确实有效,因为那里的扰动幅度大得多(整条 56 子载波的重放/平移)。这印证了算法灵敏度随扰动幅度缩放,而非随扰动的细微程度;
- R8(仅 RSSI):RSSI 是 CSI 协方差矩阵的迹。既然连完整 top-10 谱都无法检测该扰动,RSSI 单独肯定更不可能——这给 R8 的商业化故事(仅限计数)划定了硬边界,确认 R12 属于CSI-only领域。
纵向应用:愿景保留,等待正确算法
研究笔记在负面结果下仍保留了 10 年纵向应用清单,前提是 PABS + 多日数据就位:
- 建筑结构监测(保险公司):从 RF 特征偏移早期检测渗水损伤;
- 地震带地基漂移:借助 OFDM 相位相干性,长基线跟踪亚毫米级几何偏移;
- HVAC 能效审计:湿度改变空气波传播常数,长距离可测的持续湿度偏差;
- 博物馆/档案馆气候稳定性:同样的物理,更低的允许漂移;
- 酒窖陈酿监测:听起来夸张的 20 年纵向,但物理完全相同,且高端酒窖的量级支撑得起硬件成本。
后续进展:修订路径如何把 NEGATIVE 翻成 POSITIVE
仓库中实际保留了这条线程的完整后续,正好验证了 tick-5 修订路径的可行性(这也是研究循环的完整闭环证据):
R12 PABS(tick 19,docs/research/sota-2026-05-22/R12-pabs-implementation.md):R6.1 多散射体菲涅尔前向算子落地后,PABS 变为可实现的具体实验:
PABS = ||y_observed − y_predicted||² / ||y_observed||²其中y_predicted由 R6.1 多散射体模型根据「场景应有样子」的先验(已知位置的受试者 + 已知位置的墙壁反射体)计算。在 5 m 链路、2.4 GHz 的六个场景基准中:
| 场景 | PABS | SVD(R12 基线) | PABS/漂移 | SVD/漂移 |
|---|---|---|---|---|
| A:无人占用 | 4.17 | 0.60 | 7,362× | 65× |
| B:受试者在预期位置 | 0.00 | 0.00 | 0× | 0× |
| C:+1 件新结构元素 | 0.047 | 0.10 | 84× | 11× |
| D:+1 名意外人员 | 0.658 | 0.099 | 1,161× | 11× |
| E:5% 墙体反射率漂移(自然漂移底) | 0.0006 | 0.009 | 1× | 1× |
| F:受试者移动 10 cm | 12.44 | 0.84 | 21,966× | 90× |
PABS 对意外人员的检测达到自然漂移底的 1,161×,而 R12 的朴素 SVD 只有 11×——约 100 倍提升,来源纯粹是用物理接地的前向预测替代统计特征漂移。原 R12 负面结果(0.69× 不可检测)变成了 1,161× 的易检测。
R12.1 Pose-PABS 闭环(docs/research/sota-2026-05-22/R12_1-pose-pabs-closed-loop.md):PABS 在静态场景干净,但受试者移动 10 cm 会产生 22,000× 的伪警报。闭环方案用pose_tracker.rs(ADR-079 / ADR-101)的实时位姿估计更新预期场景模型,把受试者运动吸收进预测,仅保留「无法解释的残差」作为结构检测信号。合成验证中:位姿更新把受试者运动贡献抑制了20×(6.02 → 0.30),入侵者检测提升到9.36×(朴素管道仅 1.29×),伪警报问题得到解决。
examples/research-sota/06-structure-detection/README.md把这条弧线总结为「R12 NEGATIVE → R12 PABS POSITIVE → R12.1 CLOSED LOOP」三 tick 三状态:失败 → 有保留的成功 → 无保留的成功,验证了研究循环模式——显式登记负面结果,待更好工具出现后回头重审。
研究循环的工程启示
从本次 tick 到后续翻正,仓库展示了几条可复用的工程实践:
- 负面结果也要完整归档:tick-5 把失败实验的代码、数据、判定、失败机理、修订路径全部落盘,让后来者不必重走
SVD 谱余弦距离这条路; - 负面结果标注「缺失工具」而非「死路」:06 目录 README 将 R12 状态标为
NEGATIVE (missing-tool),指明失败源于缺少 R6.1 前向算子这一工具,而非物理信号不存在——这决定了后续是否值得 revisit; - 修订路径要具体到可执行:三条修订(PABS / 逐子载波残差 / 多日基线)都明确到算法原语与数据要求,为后续 tick 提供了直接行动清单;
- 并行写竞争治理:tick 记录约定不与地平线追踪 agent 同时写
PROGRESS.md,以ticks/tick-N.md自包含文件替代,由汇总脚本归并——这是多 agent 协作仓库的写入协调范例。
需要复现实验的读者,可直接运行上文给出的命令行,或阅读docs/research/sota-2026-05-22/R12-rf-weather-mapping.md与examples/research-sota/06-structure-detection/README.md获取线程全貌;若想了解 PABS 翻正与闭环细节,可继续阅读docs/research/sota-2026-05-22/R12-pabs-implementation.md与docs/research/sota-2026-05-22/R12_1-pose-pabs-closed-loop.md。
【免费下载链接】RuViewπ RuView turns commodity WiFi signals into real-time spatial intelligence, vital sign monitoring, and presence detection — all without a single pixel of video.项目地址: https://gitcode.com/GitHub_Trending/wi/RuView
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考