RuView (WiFi DensePose) 是一个基于 ESP32-S3 的 WiFi CSI 感知 开源项目,主打无摄像头、非接触式的人体姿态估计、生命体征监测与穿墙检测。
前面文章介绍的《RuView开源项目Docker+ESP32完整部署手册》只能显示基础的CSI感知数据,高级功能模型文件、姿态估计(骨架)都无法使用,需要源码编译版本才能使用。
Rust版本针对完整的信号处理链路,是一个高性能的移植版本,相比 Python 流水线实现了约 810 倍的速度提升。
一、 开发环境
1、Rust编译环境
x86主机一台,Deepin V25版本(或基他主流Linux最新稳定版)

2、安装编译工具
-
Rust 1.70及以上版本(通过rustup安装)
-
cargo(随 Rust 一同安装)
-
OpenBLAS 的系统依赖项(由 ndarray-linalg 使用):
Ubuntu/Debian
sudo apt-get install build-essential gfortran libopenblas-dev pkg-config
sudo apt-get install rustup
rustup default stable

3、安装其他依赖
在deepin25系统编译rust项目编译时会提示少相关依赖包,安装如下软件包:
sudo apt install -y libglib2.0-dev libgtk-3-dev libsoup-3.0-dev
/libjavascriptcoregtk-4.1-dev libwebkit2gtk-4.1-dev
/libgirepository1.0-dev libcairo2-dev libssl-dev pkg-config
二、源码与修订
1、下载源码
git clone https://github.com/ruvnet/RuView.git
git submodule update --init --recursive
git pull

2、修订源码
git clone https://github.com/ruvnet/RuView.git下载的源码编译中存在以下问题,需要修订源码解决。
主要下述3类问题:
ruvector_mincut 依赖缺失 ✅ 已修复
adaptive_classifier::CLASSES 未找到 ✅ 已修复
N 处 E0499 可变借用冲突 ✅ 全部修复
上述问题都来自wifi-densepose-sensing-server/src/main.rs源文件。
vim crates/wifi-densepose-sensing-server/src/main.rs
1)ruvector-mincut库缺失问题
首先检查系统中是否下载库,执行命令:
ls ~/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ruvector-mincut-*
返回了 Cargo.toml、README.md 等文件,这说明:
依赖已经从 crates.io 下载完成,源码已经解压到本地缓存目录,Cargo 现在可以正常读取并使用它了。
全局下载了 ruvector-mincut,但是 wifi-densepose-sensing-server 这个 crate 自己的 Cargo.toml 里根本没声明依赖!
Rust 工作空间里:每个子 crate 必须自己在 Cargo.toml 里写依赖,不会自动继承根目录的!
运行这条命令(自动加依赖)进入项目根目录,执行:
cargo add ruvector-mincut --package wifi-densepose-sensing-server
这条命令会自动给 sensing-server 加上依赖。
清理缓存 + 重新编译服务端直接运行这两条命令:
cargo clean
cargo build --release --bin sensing-server
2)adaptive_classifier::CLASSES 未找到
找到文件报错处,修订如下:
"classes": adaptive_classifier::DEFAULT_CLASSES,
3)N 处 E0499 可变借用冲突
文件中有多处可变借用冲突,需要依照下述方法修订:
// 1. 临时移出 pose_tracker (假设它实现了 Clone 或你可以接受暂时替换)
// 如果 pose_tracker 很大,克隆可能有性能开销,但能解决借用问题
let mut temp_tracker = std::mem::take(&mut s.pose_tracker);
// 2. 在临时变量上执行操作
let tracked = tracker_bridge::tracker_update(
&mut temp_tracker,
&mut s.last_tracker_instant, // 现在只借用了 s 的一个字段,合法
);
// 3. 将处理后的 tracker 放回结构体
s.pose_tracker = temp_tracker;
use std::mem;
// 1. 临时取出 field_model,留下一个默认值(如 None)
let mut fm_opt = mem::take(&mut s.field_model);
// 2. 现在 s.field_model 是默认值,我们可以自由借用 s 的其他部分
if let Some(ref mut fm) = fm_opt {
if let Some(ns) = s.node_states.get(&node_id) {
field_bridge::maybe_feed_calibration(fm, &ns.frame_history);
}
}
// 3. 将处理后的 field_model 放回去
s.field_model = fm_opt;
三 、编译运行
1、项目构建
cd rust-port/wifi-densepose-rs
cargo build --release
编译完成:

2、ESP32节点接入
3个ESP32节点通电接入同一个局域网,可查看串口信息是否连网与配置成功。

3、PC端运行服务程序
#只能本机127.0.0.1访问
./target/release/sensing-server
#局域网全局可访问
./target/release/sensing-server --bind-addr 0.0.0.0
运行时的启动信息:

4、浏览器应用
直接在浏览器中打开:
http://你的运行服务器IP:8080/ui/index.html

observatory.html可以看到3D渲染效果
