ESP32 CSI 实战指南:两块开发板完成 Wi-Fi 室内定位与人体检测
【免费下载链接】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 项目把 ESP32 CSI(信道状态信息)直接开放出来使用:通过 Wi-Fi 信号随人体动作产生的变化,实现室内定位、人体检测这类非接触式感知。项目基于 ESP-IDF 开发框架,ESP32、S2、C3、S3、C5、C6、C61 全系列芯片均支持。
CSI 与 RSSI 的区别:为什么人能改变 Wi-Fi 信号
RSSI 只有一个数值,告诉你信号强弱;CSI 则把接收信号按子载波拆解成幅度与相位的复数,能看出信号被障碍物、人体反射后具体变成了什么样。原理很直接:人走动时,身体会反射、吸收并散射电磁波,各子载波对应的 CSI 数值随之改变;静态环境下的呼吸、咀嚼等细微动作也会引起缓慢、有规律的波动。因此感知逻辑是:先记录空房间的基线,再拿后续数据与基线对比,偏差超过阈值即判定有人活动。整个过程不需要摄像头。
📡 三种获取 CSI 数据的方式:按现场条件选型
三种方式对应不同的部署密度,前提条件和成本各不相同:
| 方式 | 工作原理 | 前提条件 | 成本 | 精度与干扰 | 适合谁 |
|---|---|---|---|---|---|
| 路由器当发送端 | ESP32 向路由器发 Ping,读取回复中携带的 CSI | 检测环境内有路由器 | 最低,仅需 1 块 ESP32 | 受路由器位置和支持的 Wi-Fi 协议限制 | 只有单台设备、想最快上手的场景 |
| 设备间直连 | 两块 ESP32 都向路由器发 Ping,A 读取 B 发来的包中 CSI | 至少 2 块 ESP32 | 中等 | 不受路由器位置和其他连接设备影响 | 多设备协同、收发位置可自由摆放 |
| 专用设备广播 | 专门的发包设备持续切换信道发广播包,多台 ESP32 同时接收 | 普通 ESP32 之外需 1 台专用发包设备 | 最高 | 精度和可靠性最高,对多设备网络干扰小 | 高精度、多设备集群定位 |
路由方案对应的示例工程在 examples/get-started/csi_recv_router 目录下。
三种方式的通用建议:优先外置 IPEX 天线,PCB 天线方向性较强且易受主板干扰;设备间直连时两块设备间距大于 1 米;避开拥挤的 Wi-Fi 信道,发送端报ESP_ERR_ESPNOW_NO_MEM时通常就是信道拥塞导致,换个信道即可。
🔌 两台 ESP32 的烧录步骤:从克隆仓库到看到数据
硬件先备齐:两块 ESP32 开发板(推荐 ESP32-C5 或 C5/C6 射频性能较好的型号),一块烧csi_send当发送端,另一块烧csi_recv当接收端,接外置天线,两者间距大于 1 米。软件环境安装 ESP-IDF,版本 v5.0.0 及以上(v5.0.0 起支持目的地址过滤,效果更佳)。
第一步,克隆仓库:
git clone https://gitcode.com/GitHub_Trending/es/esp-csi cd esp-csi第二步,分别烧录收发固件(端口名按实际串口调整):
# 发送端 cd examples/get-started/csi_send idf.py set-target esp32c3 idf.py flash -b 921600 -p /dev/ttyUSB0 # 接收端 cd examples/get-started/csi_recv idf.py set-target esp32c3 idf.py flash -b 921600 -p /dev/ttyUSB1第三步,在电脑上运行解析脚本。运行前先关闭idf.py monitor,否则串口会被占用:
cd examples/get-started/tools pip install -r requirements.txt python csi_data_read_parse.py -p /dev/ttyUSB1跑通后,接收端串口持续输出CSI_DATA开头的原始数据,脚本把子载波幅度、相位画成实时曲线。若出现串行口数据错乱(提示element number is not equal之类),一般是上位机绘图占满 CPU、没及时读串口缓冲,把波特率调高即可。
读到的 CSI 数据怎么解析:从原始数据到人体检测
每条数据以CSI_DATA开头,前半段是逗号分隔的元数据:type、id、mac、rssi、rate、noise_floor、channel 等;最后的data字段是一个数组,存放每个子载波的信道值,按先虚部后实部的顺序排列(即第 1 子载波虚部、第 1 子载波实部、第 2 子载波虚部……)。ESP32-C5 和 C6 的字段顺序单独列出:type、seq、mac、rssi、rate、noise_floor、fft_gain、agc_gain、channel 等。
拿到原始数据后,工具分两层。csi_data_read_parse.py做实时曲线展示,适合验证链路是否打通。功能完整的图形化工具是examples/esp-radar/console_test下的esp_csi_tool.py:实时显示 CSI、RSSI 和射频噪声底,支持把采集的数据存盘、对不同运动行为打标注(供后续机器学习训练),并内置人体移动检测和房间是否有人两类分析。做进一步应用时,同一目录下的wifi_sensing_demo基于esp_wifi_sensing组件实现运动与在员检测,带 LED 反馈和浏览器 Web Serial 监控界面;connect_rainmaker则把 CSI 数据上报到 RainMaker 云平台。数据采集前建议在无人、稳定的环境里做基线校准,减少环境噪声影响。
深入学习的入口:文档与示例目录
理论部分见中文基础文档 docs/zh_CN/,涵盖信号处理、OFDM 原理、无线信道、定位基础以及 CSI 与 RSSI 的对比。可运行的代码从基础收发示例 examples/get-started/ 到检测类应用 examples/esp-radar/ 均有,按目标芯片idf.py set-target后即可编译烧录。
【免费下载链接】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),仅供参考