RuView 学习教程
RuView 学习教程
一、环境准备
1.1 前置知识
学习 RuView 需要以下基础知识:
| 知识领域 | 重要程度 | 说明 |
|---|---|---|
| WiFi 基础 | ⭐⭐⭐⭐ | 理解 WiFi 信号、信道概念 |
| 信号处理 | ⭐⭐⭐ | 傅里叶变换、滤波器基础 |
| Python/Rust | ⭐⭐⭐ | 能够阅读和修改代码 |
| 深度学习 | ⭐⭐ | 理解神经网络基本概念 |
| 嵌入式开发 | ⭐⭐ | ESP32 固件烧录(可选) |
1.2 硬件准备
必需硬件:
| 组件 | 型号建议 | 数量 | 预估成本 |
|---|---|---|---|
| ESP32 开发板 | ESP32-S3 | 2-6 个 | $8-9/个 |
| USB 数据线 | Type-C | 按需 | $2-3/条 |
| WiFi 路由器 | 任意 2.4GHz | 1 个 | 现有 |
推荐 ESP32-S3 型号: - ESP32-S3-DevKitC-1 - ESP32-S3-WROOM-1 - ESP32-S3-USB-OTG
1.3 软件环境
主机环境 (macOS/Linux/Windows):
# 1. 安装 Rust (用于运行 v2 版本)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# 2. 安装 Python 3.9+ (用于运行 v1 版本)
# macOS
brew install python@3.11
# Ubuntu/Debian
sudo apt install python3.11 python3-pip
# 3. 安装 Node.js (用于 Web UI)
# macOS
brew install node
# Ubuntu/Debian
sudo apt install nodejs npm
ESP32 开发环境:
# 安装 ESP-IDF (ESP32 官方开发框架)
# macOS/Linux
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh esp32s3
# 添加到环境变量
source ~/esp/esp-idf/export.sh
# 验证安装
idf.py --version
1.4 项目克隆
# 克隆 RuView 仓库
git clone https://github.com/ruvnet/RuView.git
cd RuView
# 查看项目结构
tree -L 2
二、快速开始
2.1 Hello World: CSI 数据采集
目标: 使用 ESP32 采集 WiFi CSI 数据
Step 1: 烧录 ESP32 固件
# 进入固件目录
cd RuView/firmware/esp32-csi-node
# 配置项目
idf.py menuconfig
# 在菜单中设置:
# - WiFi SSID
# - WiFi Password
# - CSI 采样率
# 编译固件
idf.py build
# 连接 ESP32,烧录固件
# macOS
idf.py -p /dev/cu.usbserial-* flash
# Linux
idf.py -p /dev/ttyUSB0 flash
# 监控输出
idf.py -p /dev/cu.usbserial-* monitor
Step 2: 查看 CSI 数据
烧录成功后,ESP32 会开始输出 CSI 数据:
CSI_DATA, timestamp=1234567890, rssi=-45, rate=5, sig_mode=0, mcs=0, csi=[1,2,3,...]
CSI 数据字段说明:
| 字段 | 说明 |
|---|---|
timestamp |
时间戳 |
rssi |
接收信号强度指示 |
rate |
数据速率 |
sig_mode |
信号模式 |
mcs |
调制编码方案 |
csi |
CSI 数据数组(幅度+相位) |
2.2 第一个实用示例: 运动检测
目标: 检测房间内是否有人移动
Step 1: 启动 CSI 数据接收
# 进入 Rust 实现目录
cd RuView/rust-port/wifi-densepose-rs
# 编译项目
cargo build --release
# 启动 CSI 接收服务
# 通过串口接收
./target/release/csi-receiver --serial /dev/cu.usbserial-* --baud 921600
# 或通过网络接收
./target/release/csi-receiver --tcp 0.0.0.0:9000
Step 2: 运行运动检测
# 在另一个终端运行运动检测
./target/release/motion-detector \
--csi-source tcp://localhost:9000 \
--threshold 0.5 \
--output motion_events.json
Step 3: 查看检测结果
# 实时查看
tail -f motion_events.json
# 输出示例:
# {"timestamp": 1234567890, "motion": true, "confidence": 0.87}
# {"timestamp": 1234567891, "motion": false, "confidence": 0.92}
2.3 使用 Python 版本 (v1)
# 进入 v1 目录
cd RuView/v1
# 安装依赖
pip install -r requirements.txt
# 运行示例
python examples/motion_detection.py \
--csi-source serial:///dev/cu.usbserial-* \
--display
三、核心概念
3.1 概念图谱
┌─────────────────────────────────────────────────────────────────┐
│ RuView 核心概念 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ │
│ │ WiFi CSI │ │
│ │ (信道状态信息)│ │
│ └─────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 幅度 │ │ 相位 │ │ 时频特征 │ │
│ │ (Amplitude) │ │ (Phase) │ │ (Features) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └───────────────┼───────────────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ RuVector │ │
│ │ (AI 模型) │ │
│ └─────────────┘ │
│ │ │
│ ┌───────────────┼───────────────┐ │
│ ▼ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 姿态估计 │ │ 生命体征 │ │ 运动检测 │ │
│ │ (DensePose) │ │ (Vitals) │ │ (Motion) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
3.2 核心概念详解
CSI (Channel State Information)
定义: CSI 是 WiFi 信号在每个子载波上的幅度和相位信息。
为什么 CSI 能感知人体?
WiFi 发射器 ──────→ 空间传播 ──────→ WiFi 接收器
│
│ 人体反射/衍射
▼
CSI 发生变化
│
▼
分析变化模式
│
▼
推断人体状态
CSI vs RSSI:
RSSI (接收信号强度指示):
┌───────────────────────────────┐
│ 单一数值: -65 dBm │
│ 信息量: 低 │
│ 应用: 简单定位 │
└───────────────────────────────┘
CSI (信道状态信息):
┌───────────────────────────────┐
│ 子载波 1: [幅度, 相位] │
│ 子载波 2: [幅度, 相位] │
│ 子载波 3: [幅度, 相位] │
│ ... │
│ 子载波 N: [幅度, 相位] │
│ 信息量: 高 │
│ 应用: 精细感知 │
└───────────────────────────────┘
WiFi DensePose
定义: 利用 WiFi CSI 重建人体 2D/3D 姿态的技术。
原理:
┌─────────────────────────────────────────────────────────────────┐
│ WiFi DensePose 原理 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. CSI 采集: ESP32 捕获多子载波 CSI 数据 │
│ │
│ 2. 预处理: │
│ - 幅度归一化 │
│ - 相位解卷绕 │
│ - 异常值过滤 │
│ │
│ 3. 特征提取: │
│ - 时域特征 (均值、方差、过零率) │
│ - 频域特征 (FFT 频谱、功率谱密度) │
│ - 空间特征 (多节点融合) │
│ │
│ 4. 模型推理: │
│ - 深度学习模型 │
│ - 输出人体关键点 │
│ │
│ 5. 姿态重建: │
│ - 17 个 COCO 关键点 │
│ - 3D 姿态估计 │
│ │
└─────────────────────────────────────────────────────────────────┘
多节点感知 (Multistatic Mesh)
定义: 使用多个 ESP32 节点从不同角度捕获 CSI,融合提高感知精度。
布局示例:
节点 1 (发射器)
│
│ WiFi 信号
▼
┌───────────────────┐
│ │
│ [目标人体] │◄──── 节点 2 (接收器)
│ │
└───────────────────┘
▲
│
节点 3 │ 节点 4
(接收器) │ (接收器)
融合优势: - 多视角覆盖 - 消除盲区 - 提高鲁棒性 - 3D 定位精度
3.3 术语表
| 术语 | 英文 | 解释 |
|---|---|---|
| CSI | Channel State Information | 信道状态信息,WiFi 信号的多子载波幅度和相位 |
| RSSI | Received Signal Strength Indicator | 接收信号强度指示 |
| DensePose | Dense Pose Estimation | 密集姿态估计,人体每个像素的姿态 |
| ESP32-S3 | - | Espressif 的 AI 增强型 MCU |
| 子载波 | Subcarrier | OFDM 调制中的单个载波 |
| 相位 | Phase | 信号的相位角 |
| 幅度 | Amplitude | 信号的强度 |
| FFT | Fast Fourier Transform | 快速傅里叶变换 |
| RuVector | - | RuView 的 AI 推理框架 |
| WASM | WebAssembly | 边缘智能模块运行时 |
四、功能详解
4.1 CSI 数据采集
功能概述
ESP32-S3 固件负责从 WiFi 硬件提取 CSI 数据并通过串口/网络输出。
原理说明
WiFi 硬件 ──→ CSI 寄存器 ──→ 固件读取 ──→ 数据打包 ──→ 输出
(每个数据包)
基础用法
配置 ESP32 CSI 采集:
// firmware/esp32-csi-node/main/csi.c
#include "esp_wifi.h"
// 启用 CSI 采集
esp_wifi_set_csi(true);
// 配置 CSI 参数
wifi_csi_config_t csi_config = {
.lltf_en = true, // 启用 L-LTF
.htltf_en = true, // 启用 HT-LTF
.stbc_htltf2_en = false, // STBC
.lsi_en = true, // 启用 LSI
.chip_config = {
.chip_mode = 1, // 芯片模式
.csi_filter = 0, // 不过滤
},
.dump_csien = true, // 输出 CSI
};
esp_wifi_set_csi_config(&csi_config);
// 注册回调函数
esp_wifi_set_csi_rx_cb(csi_rx_cb, NULL);
CSI 回调函数:
void csi_rx_cb(void *ctx, wifi_csi_info_t *info) {
// 获取 CSI 数据
int8_t *csi_buf = info->buf;
int csi_len = info->len;
// 输出格式
printf("CSI_DATA,");
printf("timestamp=%lld,", esp_timer_get_time());
printf("rssi=%d,", info->rx_ctrl.rssi);
printf("len=%d,", csi_len);
printf("data=[");
for (int i = 0; i < csi_len; i++) {
printf("%d", csi_buf[i]);
if (i < csi_len - 1) printf(",");
}
printf("]\n");
}
进阶用法
多节点同步:
# 使用 NTP 同步多节点时间
# 节点 1 (主节点)
./csi-node --mode master --ntp-server pool.ntp.org
# 节点 2-N (从节点)
./csi-node --mode slave --ntp-server 192.168.1.100
采样率配置:
# 高采样率 (1000 Hz) - 精细运动检测
./csi-node --sample-rate 1000
# 中采样率 (100 Hz) - 生命体征检测
./csi-node --sample-rate 100
# 低采样率 (10 Hz) - 存在检测
./csi-node --sample-rate 10
4.2 CSI 数据预处理
功能概述
原始 CSI 数据包含噪声和异常值,需要预处理才能用于模型推理。
原理说明
原始 CSI ──→ 幅度归一化 ──→ 相位清理 ──→ 滤波 ──→ 干净 CSI
基础用法 (Rust)
// rust-port/wifi-densepose-rs/src/csi/preprocess.rs
use wifi_densepose::csi::{CSIPacket, Preprocessor};
// 创建预处理器
let preprocessor = Preprocessor::new()
.normalize_amplitude(true)
.unwrap_phase(true)
.filter_type(FilterType::Butterworth)
.filter_cutoff(50.0);
// 处理 CSI 数据
let raw_csi = CSIPacket::from_bytes(&raw_bytes)?;
let clean_csi = preprocessor.process(&raw_csi)?;
println!("处理前: {} 个子载波", raw_csi.subcarriers());
println!("处理后: {} 个子载波", clean_csi.subcarriers());
进阶用法
自定义滤波器:
// 创建带通滤波器 (0.1-10 Hz 用于呼吸检测)
let bandpass = BandpassFilter::new()
.low_cutoff(0.1) // 6 BPM
.high_cutoff(10.0) // 600 BPM
.sample_rate(100.0);
let filtered = bandpass.apply(&csi_data)?;
相位解卷绕:
// 相位清理算法
pub fn unwrap_phase(phase: &[f64]) -> Vec<f64> {
let mut unwrapped = Vec::with_capacity(phase.len());
unwrapped.push(phase[0]);
for i in 1..phase.len() {
let diff = phase[i] - phase[i-1];
let adjusted = if diff > std::f64::consts::PI {
phase[i] - 2.0 * std::f64::consts::PI
} else if diff < -std::f64::consts::PI {
phase[i] + 2.0 * std::f64::consts::PI
} else {
phase[i]
};
unwrapped.push(adjusted);
}
unwrapped
}
4.3 运动检测
功能概述
检测监测区域内是否有人移动。
原理说明
CSI 时间序列 ──→ 计算方差 ──→ 与阈值比较 ──→ 运动/静止
基础用法
use wifi_densepose::motion::MotionDetector;
// 创建检测器
let detector = MotionDetector::new()
.window_size(100) // 100 个采样点
.threshold(0.5) // 方差阈值
.min_duration_ms(500); // 最小运动时长
// 检测运动
loop {
let csi = receive_csi().await?;
let result = detector.detect(&csi)?;
if result.motion_detected {
println!("检测到运动! 置信度: {:.2}", result.confidence);
}
}
实战案例: 智能照明
// 检测到人进入 → 开灯
// 检测到人离开 5 分钟 → 关灯
use wifi_densepose::motion::MotionDetector;
struct SmartLighting {
detector: MotionDetector,
last_motion_time: Instant,
light_on: bool,
}
impl SmartLighting {
async fn run(&mut self) {
loop {
let csi = receive_csi().await?;
let result = self.detector.detect(&csi)?;
if result.motion_detected {
self.last_motion_time = Instant::now();
if !self.light_on {
self.turn_on_light().await;
self.light_on = true;
}
} else if self.light_on {
// 5 分钟无运动,关灯
if self.last_motion_time.elapsed() > Duration::from_secs(300) {
self.turn_off_light().await;
self.light_on = false;
}
}
}
}
async fn turn_on_light(&self) {
reqwest::get("http://home-assistant:8123/api/light/on").await.ok();
}
async fn turn_off_light(&self) {
reqwest::get("http://home-assistant:8123/api/light/off").await.ok();
}
}
4.4 生命体征检测
功能概述
通过 CSI 信号检测呼吸频率和心率。
原理说明
CSI 相位 ──→ 带通滤波 ──→ FFT 频谱 ──→ 峰值检测 ──→ 呼吸/心率
│
├── 呼吸: 0.1-0.5 Hz (6-30 BPM)
└── 心率: 0.67-2.0 Hz (40-120 BPM)
基础用法
use wifi_densepose::vitals::VitalSignsDetector;
// 创建检测器
let vitals_detector = VitalSignsDetector::new()
.sample_rate(100.0)
.breathing_range((6.0, 30.0)) // BPM
.heart_rate_range((40.0, 120.0)); // BPM
// 检测生命体征
let vitals = vitals_detector.detect(&csi_buffer)?;
println!("呼吸频率: {:.1} BPM", vitals.breathing_rate);
println!("心率: {:.1} BPM", vitals.heart_rate);
println!("呼吸置信度: {:.2}", vitals.breathing_confidence);
println!("心率置信度: {:.2}", vitals.heart_rate_confidence);
实战案例: 老人睡眠监测
use wifi_densepose::vitals::VitalSignsDetector;
struct SleepMonitor {
vitals_detector: VitalSignsDetector,
alert_threshold: (f64, f64), // (最低呼吸, 最高呼吸)
}
impl SleepMonitor {
async fn monitor(&mut self) {
loop {
let csi = receive_csi().await?;
let vitals = self.vitals_detector.detect(&csi)?;
// 记录数据
self.log_vitals(&vitals).await;
// 异常报警
if vitals.breathing_rate < self.alert_threshold.0 {
self.send_alert("呼吸过慢!").await;
} else if vitals.breathing_rate > self.alert_threshold.1 {
self.send_alert("呼吸过快!").await;
}
sleep(Duration::from_secs(1)).await;
}
}
async fn log_vitals(&self, vitals: &VitalSigns) {
let log = format!(
"{{\"time\": \"{}\", \"breathing\": {:.1}, \"heart_rate\": {:.1}}}",
chrono::Utc::now().to_rfc3339(),
vitals.breathing_rate,
vitals.heart_rate
);
// 写入日志或数据库
}
async fn send_alert(&self, message: &str) {
// 发送通知
println!("ALERT: {}", message);
}
}
4.5 姿态估计 (DensePose)
功能概述
从 WiFi CSI 重建人体 2D/3D 姿态。
原理说明
CSI 特征 ──→ RuVector 模型 ──→ 关键点坐标 ──→ 姿态可视化
│
└── 17 个 COCO 关键点
COCO 关键点:
0: 鼻子 5: 左肩 10: 右手腕
1: 左眼 6: 右肩 11: 左髋部
2: 右眼 7: 左肘 12: 右髋部
3: 左耳 8: 右肘 13: 左膝盖
4: 右耳 9: 左手腕 14: 右膝盖
15: 左脚踝
16: 右脚踝
基础用法
use wifi_densepose::pose::{PoseEstimator, Pose};
// 加载模型
let estimator = PoseEstimator::from_file("models/densepose.rvf")?;
// 估计姿态
let csi_features = extract_features(&csi_data)?;
let pose = estimator.estimate(&csi_features)?;
// 输出关键点
for (i, keypoint) in pose.keypoints.iter().enumerate() {
println!("关键点 {}: ({:.2}, {:.2}, {:.2}), 置信度: {:.2}",
i, keypoint.x, keypoint.y, keypoint.z, keypoint.confidence);
}
// 检测特定姿态
if pose.is_standing() {
println!("人站着");
} else if pose.is_sitting() {
println!("人坐着");
} else if pose.is_lying_down() {
println!("人躺着");
}
实战案例: 跌倒检测
use wifi_densepose::pose::{PoseEstimator, FallDetector};
struct FallDetectionSystem {
pose_estimator: PoseEstimator,
fall_detector: FallDetector,
}
impl FallDetectionSystem {
async fn monitor(&mut self) {
loop {
let csi = receive_csi().await?;
let features = extract_features(&csi)?;
let pose = self.pose_estimator.estimate(&features)?;
// 检测跌倒
if let Some(fall_event) = self.fall_detector.detect(&pose) {
if fall_event.is_fall {
self.trigger_emergency(&fall_event).await;
}
}
sleep(Duration::from_millis(100)).await;
}
}
async fn trigger_emergency(&self, event: &FallEvent) {
println!("检测到跌倒!");
println!("位置: ({:.2}, {:.2}, {:.2})", event.x, event.y, event.z);
println!("方向: {}", event.direction);
// 发送警报
}
}
4.6 3D 可视化
功能概述
使用 Three.js 实时可视化人体姿态。
基础用法
# 启动 Web UI
cd RuView/ui
npm install
npm start
# 访问 http://localhost:3000
前端集成
// 连接 WebSocket 获取姿态数据
const ws = new WebSocket('ws://localhost:8080/pose');
ws.onmessage = (event) => {
const pose = JSON.parse(event.data);
// 更新 Three.js 模型
updateSkeleton(pose.keypoints);
};
function updateSkeleton(keypoints) {
// COCO 骨架连接
const connections = [
[5, 6], // 肩膀
[5, 7], // 左臂
[7, 9], // 左前臂
[6, 8], // 右臂
[8, 10], // 右前臂
[5, 11], // 左躯干
[6, 12], // 右躯干
[11, 12], // 臀部
[11, 13], // 左大腿
[13, 15], // 左小腿
[12, 14], // 右大腿
[14, 16], // 右小腿
];
// 绘制骨架
connections.forEach(([i, j]) => {
const p1 = keypoints[i];
const p2 = keypoints[j];
drawLine(p1, p2);
});
}
五、进阶主题
5.1 性能优化
Rust 性能技巧
// 1. 使用 SIMD 加速
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;
fn simd_fft(data: &[f64]) -> Vec<f64> {
// SIMD 优化的 FFT 实现
// ...
}
// 2. 零拷贝处理
fn process_csi_zero_copy(data: &[u8]) -> &[i8] {
// 直接转换为 i8 切片,无需复制
unsafe {
std::slice::from_raw_parts(
data.as_ptr() as *const i8,
data.len()
)
}
}
// 3. 并行处理
use rayon::prelude::*;
fn parallel_feature_extraction(csi_batch: &[CSIPacket]) -> Vec<Features> {
csi_batch.par_iter()
.map(|csi| extract_features(csi))
.collect()
}
5.2 模型训练
自定义模型训练
# 训练自定义 DensePose 模型
import torch
from ruview.models import RuVectorNet
# 加载预训练模型
model = RuVectorNet.load_pretrained("models/pretrained.rvf")
# 准备数据集
train_dataset = CSIDataset(
csi_dir="data/csi/",
labels_dir="data/labels/",
augment=True
)
# 微调模型
trainer = Trainer(
model=model,
train_dataset=train_dataset,
epochs=50,
learning_rate=1e-4
)
trainer.train()
# 导出模型
model.export("models/custom.rvf")
5.3 边缘部署
WASM 模块部署
# 构建 WASM 模块
cd rust-port/wifi-densepose-rs
cargo build --target wasm32-wasi --release
# 部署到边缘设备
scp target/wasm32-wasi/release/*.wasm edge-device:/opt/ruview/modules/
边缘推理
use wasmer::{Store, Module, Instance};
async fn run_edge_inference(csi: &[f64]) -> Result<Pose> {
// 加载 WASM 模块
let mut store = Store::default();
let module = Module::from_file(&store, "modules/pose_estimation.wasm")?;
let instance = Instance::new(&mut store, &module, &imports)?;
// 调用推理函数
let infer = instance.exports.get_function("infer")?;
let result = infer.call(&mut store, &[csi.into()])?;
Ok(Pose::from_wasm_result(result))
}
5.4 多房间部署
# docker-compose.yml
version: '3.8'
services:
ruview-room1:
image: ruvnet/ruview:latest
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
- /dev/ttyUSB1:/dev/ttyUSB1
environment:
- ROOM_ID=room1
- NODE_COUNT=4
ruview-room2:
image: ruvnet/ruview:latest
devices:
- /dev/ttyUSB2:/dev/ttyUSB0
- /dev/ttyUSB3:/dev/ttyUSB1
environment:
- ROOM_ID=room2
- NODE_COUNT=4
ruview-central:
image: ruvnet/ruview-central:latest
ports:
- "8080:8080"
depends_on:
- ruview-room1
- ruview-room2
六、常见问题
Q1: CSI 数据全是零或异常值
原因: ESP32 固件配置问题或硬件连接问题
解决方案:
# 1. 检查固件配置
idf.py menuconfig
# 确保启用了 CSI 功能
# 2. 检查天线连接
# 确保 ESP32 天线连接正常
# 3. 降低采样率
# 过高的采样率可能导致数据丢失
Q2: 运动检测误报率高
原因: 阈值设置不当或环境干扰
解决方案:
// 1. 调整阈值
let detector = MotionDetector::new()
.threshold(0.8) // 提高阈值
.min_duration_ms(1000); // 增加最小持续时间
// 2. 添加环境校准
let baseline = calibrate_environment(300)?; // 5 分钟校准
detector.set_baseline(baseline);
// 3. 使用滤波器消除高频噪声
let filtered = lowpass_filter(&csi, 10.0)?; // 10 Hz 低通
Q3: 呼吸检测不准确
原因: 信号处理参数不匹配
解决方案:
// 调整带通滤波器范围
let vitals_detector = VitalSignsDetector::new()
.breathing_range((8.0, 25.0)) // 缩小范围
.sample_rate(50.0) // 50 Hz 采样
.window_seconds(30.0); // 30 秒窗口
// 增加校准
let calibration = vitals_detector.calibrate(&empty_room_csi)?;
vitals_detector.apply_calibration(calibration);
Q4: 多节点数据不同步
原因: 时钟漂移或网络延迟
解决方案:
# 使用 NTP 同步
./csi-node --ntp-server pool.ntp.org --sync-interval 60
# 或使用硬件同步 (GPIO 触发)
./csi-node --sync-mode gpio --sync-pin 4
Q5: Rust 编译错误
原因: 依赖版本不匹配
解决方案:
# 更新 Rust 版本
rustup update stable
# 清理并重新构建
cargo clean
cargo build --release
七、参考资料
官方资源
学术论文
- WiFi-DensePose: arXiv:2201.00250
- Through-Wall Human Pose Estimation: CMU Research
- WiFi Sensing: A Comprehensive Survey
相关项目
社区
学习路线图
┌─────────────────────────────────────────────────────────────────┐
│ RuView 学习路线 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 第 1 周: 基础入门 │
│ ├── Day 1-2: 了解 WiFi CSI 基本概念 │
│ ├── Day 3-4: 搭建开发环境,烧录 ESP32 固件 │
│ └── Day 5-7: 运行 Hello World,采集第一笔 CSI 数据 │
│ │
│ 第 2 周: 核心功能 │
│ ├── Day 1-3: 学习 CSI 预处理 (Rust/Python) │
│ ├── Day 4-5: 实现运动检测 │
│ └── Day 6-7: 实现生命体征检测 │
│ │
│ 第 3 周: 进阶应用 │
│ ├── Day 1-3: 姿态估计 (DensePose) │
│ ├── Day 4-5: 多节点感知网络 │
│ └── Day 6-7: 3D 可视化 │
│ │
│ 第 4 周: 实战项目 │
│ ├── Day 1-3: 完整项目: 跌倒检测系统 │
│ ├── Day 4-5: 完整项目: 智能家居控制 │
│ └── Day 6-7: 性能优化与部署 │
│ │
│ 进阶方向: │
│ ├── 自定义模型训练 │
│ ├── 边缘智能 (WASM) │
│ ├── 多房间大规模部署 │
│ └── 与其他智能家居系统集成 │
│ │
└─────────────────────────────────────────────────────────────────┘
总结
RuView 是一个创新性的 WiFi 感知项目,通过 CSI 信号实现了无摄像头的穿墙人体感知。本教程从环境搭建到实战应用,覆盖了 RuView 的核心功能:
- CSI 数据采集: ESP32 固件烧录与配置
- 信号处理: 预处理、特征提取
- 运动检测: 实时运动状态监测
- 生命体征: 呼吸、心率非接触检测
- 姿态估计: WiFi DensePose 人体姿态重建
- 可视化: Three.js 3D 实时渲染
希望本教程能帮助你快速上手 RuView,构建创新的 WiFi 感知应用!