☰
用 Wi-Fi CSI 让 ESP32 感知人体运动:ESP-CSI 上手实战
2026/10/23 2:48:12 网站建设 项目流程

用 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 记录信道中每个子载波的幅度和相位。人在室内移动时,信号的多径反射路径随之改变,子载波数据随之波动——动作越大波动越明显,静止时的呼吸也能引起可测变化。

对比项CSIRSSI
信息内容逐子载波的幅度 + 相位单一信号强度值
精度高,可区分不同动作、支持定位低,易受多径和噪声影响
计算开销较高低
典型用途人体检测、室内定位、手势识别信号质量评估

想先补原理再动手,仓库内置了中文文档:信号处理基础、OFDM介绍、无线信道基础、无线测距与定位技术介绍、CSI与RSSI对比、CSI应用案例。

📡 三种 CSI 获取拓扑:先决定买几块设备

CSI 取自"对方发出的数据包",所以核心问题是:谁发送、谁接收。仓库给出三种拓扑,硬件成本和精度各不相同:

拓扑发送方接收方硬件成本特点
路由器模式路由器1 块 ESP32最低依赖路由器位置和协议支持
设备间模式另一块 ESP321 块 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,是否三个都出现取决于信道与分组

拿到原始数据后如何看效果?仓库提供两种可视化方式:

  1. csi_data_read_parse.py:读取接收端串口,实时绘制子载波波形(PyQt5,运行前关闭idf.py monitor避免占用串口)
  2. 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:最完整的本地测试平台

操作流程是:连接 → 校准 → 观测 → (可选)采集。

  1. 连接:接收板烧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
  2. 校准阈值:目的是在空房间里记录 CSI 基线,自动生成"有人/无人"与"运动/静止"两个阈值。设置delay(如 10 秒,留给人员离开的缓冲时间)和duration(校准时长),点start并确认,期间确保无人。校准时间越长,误触概率越低。

  3. 观测状态:状态窗口区分无人、有人静止、有人运动三种状态;filter outliers可设置连续多少次超阈值才判定,过滤偶发异常值。运动统计窗口按分钟/小时/天维度记录每次运动的起止时间和时长。

  4. 采集动作数据:动作采集窗口可指定动作类型、延迟、单动作时长、采集次数,数据存到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 incompletePyQt 绘图占用 CPU,PC 没及时读走串口缓冲队列,数据错位提高串口波特率(如从 921600 提到 1000000)
波形对运动不敏感用 PCB 天线、环境有其他人活动、两设备距离过近换外置 IPEX 天线;无人环境测试;两设备间距大于 1 米
RainMaker 上报Out of MQTT Budget上报数据量超出云端配额降低上报频率或数据量

两条贯穿所有示例的经验:

  1. 天线:外置 IPEX 天线效果优于 PCB 天线;PCB 天线有方向性,部署时按信号路径摆板位
  2. 环境:校准和基线测试应在无人环境完成,避免他人活动污染基线——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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询