前阵子,嵌入式社区里出现了一个让人看了标题就想点进去的 GitHub 项目。
项目声称:把几个 ESP32-S3 贴在墙上,接上 WiFi,就能实时检测房间里的人体姿态、呼吸频率和心跳——不需要摄像头,不需要可穿戴设备,不需要联网。穿墙也行。
46200 个 Star。
然后,一些人开始在 Issues 和社区里喊——这是 AI 生成的虚假项目,根本跑不起来。
所以,这个项目到底是真的神器,还是被过度包装的 demo?
先说清楚这件事的底层逻辑
在讨论 RuView 之前,有必要说清楚一件事:WiFi 感知这项技术本身是真实的。
2023 年,卡内基梅隆大学发表了论文 DensePose From WiFi(arXiv:2301.00250),证明可以通过 WiFi 信号重建人体姿态。不是概念验证,是有实验数据支撑的学术成果。
原理是这样的:WiFi 路由器每秒会向空间中发射大量无线电波。当一个人站在信号路径上,波会被散射、反射和吸收,到达接收端时振幅和相位都发生了变化。
这个变化,叫做 CSI(Channel State Information,信道状态信息)。
普通 WiFi 设备只告诉你"信号强度是多少"(RSSI)。而 ESP32-S3 等支持 CSI 的硬件,能拿到每个子载波的振幅和相位数据——56 个子载波,每个都包含一组复数。这相当于一张低分辨率的"射频图像",描述了信号穿越空间时遇到了什么。
RuView 做的事,就是把这个思路工程化:用廉价 ESP32-S3 节点组成传感器网格,实时采集 CSI 数据,经过信号处理和机器学习,推断出人的位置、动作、呼吸和心跳。
RuView 是什么
GitHub:https://github.com/ruvnet/RuView
语言:Rust(主力)/ Python(兼容) License:MIT
Star 数:46.2k(2026年4月,仍在增长)
RuView 是一个开源的边缘 AI 感知系统,核心能力包括:
- 人体存在检测:延迟 < 1ms,基于 RSSI 方差+运动频段功率
- 呼吸频率检测:6-30 次/分钟,带通滤波 + FFT 峰值定位
- 心率检测:40-120 BPM,更高频段的 FFT 分析
- 人体姿态估计:17 个 COCO 关键点,需要 CSI 能力的硬件
- 穿墙检测:Fresnel 区几何模型 + 多径建模,有效深度最远 5m
- 多人追踪:3-5 人同时追踪(取决于子载波数量和节点数)
整个系统完全本地运行,不依赖云,不需要 API Key。
硬件需求:ESP32-S3 是关键
这里有个容易踩的坑,README 里写得很清楚,但很多人没注意:
普通 WiFi 设备只能用 RSSI,做不了 CSI。
RSSI 是信号强度的单一数值。CSI 是每个子载波的复数矩阵。前者能做粗粒度的存在感知,后者才能支撑呼吸、心率、姿态这些细粒度应用。
支持 CSI 能力的硬件选项:
项目推荐部署 3-6 个 ESP32-S3 节点,采用多静态网格(Multistatic Mesh)配置,通过 TDM 协议让节点轮流发射,形成 N×(N-1) 条信号路径,互相配合提升精度。
# ESP32-S3 固件烧录(使用项目提供的预编译固件)
python -m esptool --chip esp32s3 --port COM9 --baud 460800 \
write_flash --flash-mode dio --flash-size 8MB --flash-freq 80m \
0x0 bootloader.bin 0x8000 partition-table.bin \
0xf000 ota_data_initial.bin 0x20000 esp32-csi-node.bin
烧完之后,配置 WiFi 和目标主机 IP:
# 配置节点,将 CSI 数据流发送到上位机
python firmware/esp32-csi-node/provision.py \
--port COM9 \
--ssid "YourWiFi" \
--password "secret" \
--target-ip 192.168.1.20 \
--target-port 5006
信号处理管道:从电波到骨架
这是 RuView 最值得关注的部分——它的信号处理链经过了相当认真的设计。
原始 CSI 数据非常嘈杂,不能直接用。RuView 实现了多个学术级算法:
SpotFi:相位校正算法,消除 CSI 中的硬件时间偏移和频率偏移。不做相位校正,后续的呼吸/心率分析会完全错乱。
Hampel 滤波器:离群点抑制,识别并替换统计上异常的 CSI 样本。
Fresnel 区建模:基于发射端-人体-接收端的几何关系,建立多路径传播模型,将 CSI 变化映射回物理空间坐标。
BVP 提取(呼吸/心率):对处理后的 CSI 幅度施加 0.1-0.5 Hz 带通滤波提取呼吸信号,0.8-2.0 Hz 带通提取心率信号,然后做 FFT 峰值检测。
// 呼吸率提取核心逻辑(简化)
// 真实实现在 wifi-densepose-vitals crate 中
let breathing_band = bandpass_filter(csi_amplitude, 0.1, 0.5, sample_rate);
let spectrum = fft(&breathing_band);
let breathing_rate_hz = find_peak_frequency(&spectrum);
let bpm = breathing_rate_hz * 60.0;
这段代码做了什么:对 CSI 幅度时间序列施加带通滤波,保留 0.1-0.5 Hz 的呼吸频率成分,FFT 后找峰值,转换为 BPM。
完整的信号处理管道是用 Rust 重写的,相比原来的 Python 版本快了大约 810 倍,每秒可以处理 54,000 帧 CSI 数据。
边缘推理:WASM 模块直接跑在 ESP32 上
RuView 的另一个有意思的设计是边缘模块(Edge Module)系统。
传统方案是:ESP32 采集数据,发给上位机,上位机做推理。这意味着需要网络连接,也有延迟。
RuView 的边缘模块是编译成 wasm32-unknown-unknown 的 no_std Rust 代码,通过 WASM3 解释器运行在 ESP32-S3 上。每个模块 5-30 KB,调用 12 个标准 API 函数,推理延迟目标 < 10ms。
目前实现了 65 个边缘模块,按场景分类:
- 医疗健康:睡眠呼吸暂停检测、心律不齐、步态分析
- 安防:入侵检测、周界报警、徘徊检测
- 楼宇管理:区域占用、HVAC 联动、会议室追踪
- 工业安全:叉车接近报警、受限空间监控
- 自适应学习:EWC 持续学习,适应新环境时不遗忘旧知识
// 边缘模块的接口定义(no_std Rust)
// 每个模块实现 process() 函数,输入 CSI 特征,输出结构化事件
#[no_mangle]
pub extern "C" fn process(input_ptr: *constu8, input_len: usize) ->i32 {
// 读取 CSI 特征向量
let input = unsafe { slice::from_raw_parts(input_ptr, input_len) };
let features: CsiFeatures = deserialize(input);
// 检测呼吸停止(sleep apnea 模块逻辑)
if features.breathing_rate < 0.1 || features.breathing_amplitude < threshold {
emit_event(Event::ApneaDetected { duration_sec: features.pause_duration });
return 1;
}
0
}
这段代码的意义:呼吸率低于 0.1 Hz 或振幅过低时,模块直接在 ESP32 上触发告警,不需要数据上传。整个推理在芯片本地完成。
30 秒上手:Docker 快速验证
如果只想先跑起来看看效果,不需要 ESP32,Docker 方式最快:
# 拉取镜像,30 秒内看到模拟数据
docker pull ruvnet/wifi-densepose:latest
docker run -p 3000:3000 ruvnet/wifi-densepose:latest
# 浏览器打开 http://localhost:3000
这会启动一个带模拟 CSI 数据的感知服务器,包含完整的可视化界面——波形图、人体骨架、生命体征面板。没有 CSI 硬件,看的是仿真数据,但可以验证整个处理管道是否工作。
真实 ESP32 节点接入:
# 启动感知服务器,监听 ESP32 UDP 数据流
./target/release/sensing-server \
--source esp32 \
--udp-port 5005 \
--http-port 3000 \
--ws-port 3001
REST API 查询实时数据:
# 查询当前姿态
curl http://localhost:3000/api/v1/pose/current
# 查询生命体征
curl http://localhost:3000/api/v1/vital-signs
# 查询最新感知帧
curl http://localhost:3000/api/v1/sensing/latest
WebSocket 实时订阅:
import asyncio, websockets, json
async def stream():
async with websockets.connect("ws://localhost:3001/ws/sensing") as ws:
async for msg in ws:
data = json.loads(msg)
persons = data.get("persons", [])
for p in persons:
print(f"位置: {p['position']}, 呼吸: {p['breathing_bpm']:.1f} BPM")
asyncio.run(stream())
Cognitum Seed:可选的边缘记忆模块
项目还有一个配套硬件叫 Cognitum Seed(cognitum.one),是个运行在 Pi Zero 2W 上的边缘 AI 小盒子,大约 $15。
它的定位是给 ESP32 节点提供持久化向量存储和加密证明能力:
ESP32-S3 ($9) ──UDP──> 上位机 ──HTTPS──> Cognitum Seed ($15)
28Hz CSI原始帧 批处理+验证 永久向量存储
1Hz 特征向量 NaN 剔除 kNN 相似度搜索
1Hz 生命体征 来源过滤 见证链(加密证明)
每次感知事件,Cognitum Seed 会把特征向量存成可搜索的形式,并附上 Ed25519 签名,确保数据不被篡改。
这个功能适合需要长期追踪的应用场景——比如监测老年人的呼吸规律变化。不过这是可选组件,没有 Cognitum Seed,ESP32 的所有基础功能照常运行。
局限性:别把它神化了
说实话,这个项目的局限性不少,而且有些还挺关键。
首先,那句"骗局"是怎么来的。
一个月前,有人仔细看了早期代码,发现其中存在随机模拟数据,没有真实 CSI 硬件接入的验证。加上当时 YouTube 上找不到任何真实运行的视频,被质疑是 AI 生成的虚假项目。
CNX Software 对此的判断是:底层科学(CMU 论文)是真实的,ESP32 CSI 能力也是真实的(乐鑫官方 2022 年就有演示),但部分性能声明可能是在特定条件下测试的,存在夸大嫌疑。
技术层面的真实局限:
- 姿态精度偏低:不带摄像头标注数据时,PCK@20 只有 2.5%。README 里也承认了:摄像头监督训练可以把精度提到 92.9%,但那就不是"无摄像头"方案了
- 单节点分辨率有限:一个 AP 最多区分 3-5 个人。多人场景需要多节点
- 穿墙能力依赖材质:钢筋混凝土(30cm 以内)、木质墙、石膏板都可以穿透;金属门窗会严重衰减信号
- 子载波数量限制:ESP32-S3 提供 56 个子载波。室内多人场景和学术论文中用的专业研究网卡(Intel 5300,3×3 MIMO)相比,感知分辨率差距明显
- 环境适应性:系统需要在每个部署环境中做短暂的自校准,搬到新房间后性能会下降,直到重新适应
Q&A
Q:我手里只有普通 ESP32(不是 S3),能用吗?
A:基础存在感知可以用(RSSI 模式),但 CSI 功能不支持。呼吸、心率、姿态这些功能需要支持 CSI 的硬件,目前经过验证的是 ESP32-S3 和部分研究级 NIC(Intel 5300、Atheros AR9580)。
Q:需要学 Rust 才能用吗?
A:感知服务器有预编译的 Docker 镜像,ESP32 固件也提供预编译 bin,大部分操作只需要 Python 脚本(provision.py、seed_csi_bridge.py)。想改边缘模块逻辑才需要 Rust。
Q:项目说"用邻居路由器当雷达照射源",这不违法吗?
A:RuView 是被动接收 WiFi 信号(CSI 采集),并非发射额外的 RF 能量或破解加密,和你的手机接收 WiFi 信标帧本质相同。不过在特定地区的法规细节,使用前还是建议自行确认。
Q:和专业雷达传感器(如 60GHz mmWave)比,哪个更好用?
A:各有适用场景。mmWave 雷达(如 LD2410)精度更高、延迟更低,但覆盖角度有限,每个区域需要单独部署,成本也更高。WiFi CSI 的优势是覆盖范围大(利用已有 WiFi 基础设施)、穿墙能力强、多节点融合天然支持多房间覆盖。如果你只需要检测单个房间是否有人,mmWave 可能更省事;如果需要多房间覆盖或穿墙感知,WiFi CSI 方案更经济。
获取方式
GitHub:https://github.com/ruvnet/RuView
Cognitum Seed 硬件平台:https://cognitum.one
国内访问 GitHub 有时不稳定,源码包已备好,后台回复 RuView 或 0050 获取下载链接。
如果只是想先验证信号处理管道,不需要任何硬件:
python v1/data/proof/verify.py
这个脚本会用确定性参考信号跑一遍完整的处理链,输出 SHA-256 哈希,可以对照 README 里的预期值核对。
顺手转一条活动信息:下周深圳有个蓝牙行业的年度聚会——2026 蓝牙亚洲大会暨展览,4 月 23-24 日,深圳会展中心(福田)5 号馆。4000+ 专业观众、50+ 技术领袖、60+ 参展企业,WiFi 感知、低功耗连接这些方向的人应该都会去。邀请时间只到 4 月 22 日,邀请满 3 人还有午餐券。感兴趣的扫海报里的码锁定免费入场资格。
这里每周都在聊单片机那点事,能让你少走弯路的那种。如果今天的内容对你有用,转发给正在研究 WiFi CSI 或者 ESP32 传感器项目的朋友,也许刚好能给他一个新思路。
往期推荐
平时只能看数据手册,这次可以直接问原厂工程师——4月23-24深圳,免费