用 Wi-Fi CSI 让 ESP32 感知人体运动:ESP-CSI 上手实战
【免费下载链接】esp-csiApplications based on Wi-Fi CSI (Channel state information), such as indoor positioning, human detection项目地址: https://gitcode.com/GitHub_Trending/es/esp-csi
esp-csi是乐鑫开源的 Wi-Fi CSI(Channel State Information,信道状态信息)示例库,基于 ESP32 系列芯片实时获取无线信道数据,可实现人体运动、房间占用、定位等非接触式感知。本文带你走完"两块开发板跑通 CSI 数据流 → 图形化波形 → 房间有人/无人判断"的完整流程,并整理常见问题。
CSI 和 RSSI 的区别:为什么它够灵敏
先给结论:CSI 携带的信息量远高于 RSSI,这是它能感知呼吸、咀嚼等细微动作的原因。
Wi-Fi(OFDM 体制)把信号拆到几十上百个子载波上传输。RSSI 只给出一个标量信号强度;而 CSI 记录信道中每个子载波的幅度和相位。人在室内移动时,信号的多径反射路径随之改变,子载波数据随之波动——动作越大波动越明显,静止时的呼吸也能引起可测变化。
| 对比项 | CSI | RSSI |
|---|---|---|
| 信息内容 | 逐子载波的幅度 + 相位 | 单一信号强度值 |
| 精度 | 高,可区分不同动作、支持定位 | 低,易受多径和噪声影响 |
| 计算开销 | 较高 | 低 |
| 典型用途 | 人体检测、室内定位、手势识别 | 信号质量评估 |
想先补原理再动手,仓库内置了中文文档:信号处理基础、OFDM介绍、无线信道基础、无线测距与定位技术介绍、CSI与RSSI对比、CSI应用案例。
📡 三种 CSI 获取拓扑:先决定买几块设备
CSI 取自"对方发出的数据包",所以核心问题是:谁发送、谁接收。仓库给出三种拓扑,硬件成本和精度各不相同:
| 拓扑 | 发送方 | 接收方 | 硬件成本 | 特点 |
|---|---|---|---|---|
| 路由器模式 | 路由器 | 1 块 ESP32 | 最低 | 依赖路由器位置和协议支持 |
| 设备间模式 | 另一块 ESP32 | 1 块 ESP32 | 两块开发板 | 不受路由器位置影响,推荐入门 |
| 专用广播模式 | 专用发送设备 | 多台 ESP32 | 最高 | 不依赖路由器,精度与可靠性最高 |
- 路由器模式:ESP32 向路由器发 Ping,从 Ping 应答中提取 CSI。适合只有一块 ESP32 的学习场景。
- 设备间模式:发送端用 ESP-NOW 持续发包,接收端抓取 CSI。两块板即可搭起来,
[examples/get-started/](https://link.gitcode.com/i/e2bc4509941bc687b09db1076ed48ad3)下的csi_send与csi_recv分别对应两端,csi_recv_router则是路由器模式。 - 专用广播模式:发送设备不断切换信道广播,多台接收端同时获得 CSI,适合多设备集群定位等高精度需求,
[examples/esp-crab/](https://link.gitcode.com/i/0f3cd5138fa0fa1adb4d3c1889f6cc36)是它的硬件实现。
🛠️ ESP-CSI 首次运行:两块开发板输出 CSI 数据
环境准备
- ESP-IDF:建议 v5.0.0 以上(支持目的地址过滤,效果更好),
console_test示例基于 v5.0.2 验证 - 开发板 ×2:官方推荐 ESP32-C5 / ESP32-C6(射频表现最好);ESP32 / S2 / C3 / S3 / C61 全系列也支持
- 外置 IPEX 天线:PCB 天线方向性强、易受主板干扰,感知效果差
- 两块设备间距大于 1 米
克隆仓库并烧录固件
git clone https://gitcode.com/GitHub_Trending/es/esp-csi cd esp-csi/examples/get-started/csi_send idf.py set-target esp32c3 idf.py flash -b 921600 -p /dev/ttyUSB0 monitor接收端烧到另一块板(换实际串口):
cd esp-csi/examples/get-started/csi_recv idf.py set-target esp32c3 idf.py flash -b 921600 -p /dev/ttyUSB1两端默认使用 11 信道、经广播 MAC 通信,csi_send以 100 包/秒 的频率发送 ESP-NOW 数据包,csi_recv按固定 MAC 过滤并打印 CSI。烧录成功后,接收端串口会持续刷出CSI_DATA,...数据:
看懂串口数据:一行就是一个完整信道快照
每行输出分两部分:
- 元数据:
mac、rssi、rate、noise_floor、channel、local_timestamp等;ESP32-C5 / C6 格式还带fft_gain与agc_gain增益字段,接收端会记录前 100 包作为增益基线做补偿 data数组:CSI 本体,按"虚部在前、实部在后"逐子载波存储,即[子载波1虚部, 子载波1实部, 子载波2虚部, ...];LTF 顺序为 LLTF → HT-LTF → STBC-HT-LTF,是否三个都出现取决于信道与分组
拿到原始数据后如何看效果?仓库提供两种可视化方式:
csi_data_read_parse.py:读取接收端串口,实时绘制子载波波形(PyQt5,运行前关闭idf.py monitor避免占用串口)csi_viewer.html:Chromium 浏览器直接打开,经 Web Serial 连接串口,免 Python 环境
cd esp-csi/examples/get-started/tools pip install -r requirements.txt python csi_data_read_parse.py -p /dev/ttyUSB1波形静止时几乎是一条水平线;有人从两块设备之间走过,波形会明显跳变——这就是最直观的感知验证。
进阶示例:从波形到"房间里有人"的判断
数据通了,下一步做什么?esp-radar与esp-crab目录提供四层应用,按需取用:
| 示例 | 做什么 | 适合场景 |
|---|---|---|
| console_test | 交互控制台:CSI/RSSI 波形、有人/无人 + 运动/静止检测、动作数据采集 | 本地调参、算法验证、攒训练集 |
| wifi_sensing_demo | 基于esp_wifi_sensing组件的存在/运动检测,LED 状态 + 浏览器 Web Serial 调参 | 把感知能力集成进自己的产品 |
| connect_rainmaker | 运动状态与阈值上报 RainMaker 云,手机 App 查看 | 远程监控 |
| esp-crab | 共晶振相位同步专用硬件,自发自收 / 单发双收 | 毫米级扰动感知、高精度研究 |
console_test:最完整的本地测试平台
操作流程是:连接 → 校准 → 观测 → (可选)采集。
连接:接收板烧
console_test,发送端烧csi_send(或直接用路由器发送,此时路由器不要再挂其他智能设备,避免网络拥塞),PC 端启动工具(用 UART 口,不是 USB Serial/JTAG 口):cd esp-csi/examples/esp-radar/console_test/tools pip install -r requirements.txt python esp_csi_tool.py -p /dev/ttyUSB1校准阈值:目的是在空房间里记录 CSI 基线,自动生成"有人/无人"与"运动/静止"两个阈值。设置
delay(如 10 秒,留给人员离开的缓冲时间)和duration(校准时长),点start并确认,期间确保无人。校准时间越长,误触概率越低。观测状态:状态窗口区分无人、有人静止、有人运动三种状态;
filter outliers可设置连续多少次超阈值才判定,过滤偶发异常值。运动统计窗口按分钟/小时/天维度记录每次运动的起止时间和时长。采集动作数据:动作采集窗口可指定动作类型、延迟、单动作时长、采集次数,数据存到
tools/data路径——这就是训练机器学习/神经网络的现成数据集。
wifi_sensing_demo:浏览器里调参
这个示例把esp_wifi_sensing组件走通完整闭环:创建 FSM → 添加通道(AP + 两个 peer MAC)→ 注册 ACTIVE/INACTIVE 回调 → 启动。
- LED 反馈:闪烁 = 未连接;常亮 = AP 通道 ACTIVE(检测到运动);渐灭 = INACTIVE
- 浏览器监控:用 Chromium 打开
tools/web_serial_monitor.html(若file://被拦截,先cd tools && python3 -m http.server再访问http://127.0.0.1:8000/web_serial_monitor.html),实时查看jitter_value、smooth_scaled、enter_level_scaled等曲线,并直接下发指令调参,如HMSCMD SET_CFG AP motion_sensitivity=1.2
esp-crab:面向精度的共晶振方案
前面几种方案有一个共同短板:发送端和接收端各自走时钟,绝对相位会漂移。esp-crab是双 ESP32-C5 共晶振的专用硬件,提供两种工作模式:
- 自发自收:一片 C5 发送、另一片接收,可毫米级感知射频路径扰动,配合铜片引导信号路径还能调节感知范围
- 单发双收:额外一块 ESP32-C5 开发板负责发送,
esp-crab上两片 C5 同时接收,覆盖更大空间,串口输出与其他示例相同格式的CSI_DATA
上电直接显示 CIR 幅度与相位曲线。注意设备上电后会先采集前 100 个 Wi-Fi 包来确定射频接收增益,这段时间数据仅作参考。
ESP-CSI 常见问题与解决
| 现象 | 原因 | 解决方式 |
|---|---|---|
csi_send打印ESP_ERR_ESPNOW_NO_MEM | 信道拥堵,ESP-NOW 发送缓冲区被占满 | 更换 Wi-Fi 信道,或换到网络环境更干净的位置 |
csi_data_read_parse.py报element number is not equal/data is not incomplete | PyQt 绘图占用 CPU,PC 没及时读走串口缓冲队列,数据错位 | 提高串口波特率(如从 921600 提到 1000000) |
| 波形对运动不敏感 | 用 PCB 天线、环境有其他人活动、两设备距离过近 | 换外置 IPEX 天线;无人环境测试;两设备间距大于 1 米 |
RainMaker 上报Out of MQTT Budget | 上报数据量超出云端配额 | 降低上报频率或数据量 |
两条贯穿所有示例的经验:
- 天线:外置 IPEX 天线效果优于 PCB 天线;PCB 天线有方向性,部署时按信号路径摆板位
- 环境:校准和基线测试应在无人环境完成,避免他人活动污染基线——
connect_rainmaker的自校准同样要求校准期间室内无人或人不动
下一步:按目标选学习路径
- 只想验证效果:按上面首跑章节走完
csi_send+csi_recv,看波形随人员走动跳变 - 想做人体检测应用:跑通 console_test,完成校准、观测三态判断,再采集几十组动作数据供自己的算法训练
- 想集成到产品:读 wifi_sensing_demo 的
main/app_main.c,重点是esp_wifi_sensing组件的建 FSM、加通道、注册回调四步 - 想搞懂原理:从 无线信道基础 读到 OFDM介绍,再回头对照
examples/get-started/csi_recv/main/app_main.c里esp_wifi_set_csi_config的各配置项含义 - 想做定位或高精度感知:看 esp-crab 的共晶振方案与单发双收模式
需要说明的是,仓库中的人体检测算法官方标注为"仍在优化中"——基于原始 CSI 数据用机器学习、神经网络训练自己的模型,正是这个库推荐的主线玩法。
【免费下载链接】esp-csiApplications based on Wi-Fi CSI (Channel state information), such as indoor positioning, human detection项目地址: https://gitcode.com/GitHub_Trending/es/esp-csi
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考