不装摄像头,让 Wi-Fi 自己“看见“房间:ESP32 CSI 无线感知零基础实战指南
2026/8/28 10:49:09 网站建设 项目流程

不装摄像头,让 Wi-Fi 自己"看见"房间:ESP32 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

深夜十一点,客厅空无一人。我盯着桌上的路由器发呆:如果家里进了人,除了摄像头,还能靠什么"看见"?答案就藏在一个开源项目里——ESP32 CSI 工具包:它让 Wi-Fi 信号获得"无线感知"能力,用空气里的电磁波探测房间有没有人、人往哪走、甚至在做什么动作。

这篇文章不是说明书式的罗列,而是我"从零做一次 CSI 实验"的完整手记:先讲清楚原理,再一步步搭环境、烧固件、看数据、画波形,最后介绍更省力的工具和进阶玩法。你不需要懂射频,只要有一块 ESP32 和一点好奇心,就能跟上。

动手之前,先回答一个问题:CSI 凭什么"看"得见

Wi-Fi 信号从发送端飞向接收端时,并不会走直线——它会撞上墙壁、家具、人,被一次次反射、绕射,最终到达接收端的是无数条路径叠加后的"大杂烩"。信道状态信息(Channel State Information,CSI)记录的,正是这条信道"长什么样":每个子载波的幅度、相位和延迟。

这为什么能感知人体?道理很朴素:当一个人从信号路径上走过,反射路径就变了,接收端看到的"大杂烩"也随之改变。CSI 对这类变化极其敏感,大到走路、跑步,小到静坐时的呼吸起伏,它都能捕捉到——这就是"Wi-Fi 无线感知"的底层逻辑。

RSSI 是音量旋钮,CSI 是整张乐谱

过去我们最熟悉的是 RSSI(信号强度),但它其实很"粗心":它只给一个总强度数字,人从旁边走过,这个数字常常纹丝不动。而 CSI 则像一张完整的乐谱,几十上百个子载波各自的幅度、相位都清清楚楚,任何一声"杂音"都逃不掉。

对比项RSSICSI
信息量一个总强度数值每个子载波的幅度、相位、延迟
环境敏感度低,人走动常常看不出变化高,能感知呼吸等细微动作
空间分辨率细,支持厘米级室内定位
典型用途信号覆盖、粗略测距人体检测、活动识别、室内定位

上图是 Wi-Fi 物理层的完整流程:发射端完成符号映射、IDFT 变换后送入信道,接收端通过"信道估计"(Channel Estimation)把信道特性还原出来。ESP32 输出的 CSI,正是这一步得到的"信道快照"——这也是为什么它能感知环境,而不是只知道信号强不强。

人一动,电磁波就"迷路"了

墙壁、家具、人体都会反射电磁波,人站立时和走两步时,反射路径完全不同。CSI 记录的是每条路径叠加后的结果,所以只要环境中有一点变化,数据就会"发颤"。理解了这一点,后面看到波形随人走动而起伏,就不会觉得神奇了——那只是电磁波在告诉你:"有人改变了我走过的路。"

认识主角:一块会"读信道"的 ESP32 📡

要做 CSI 实验,接收端需要能直接输出原始 CSI 数据的硬件。乐鑫的 ESP32 系列正是这样的主角,而且门槛很低:ESP32、ESP32-S2、ESP32-S3、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61 全系列都支持 CSI,手里有哪块用哪块。

除了"读信道",ESP32 还有三个隐藏技能,让它特别适合做无线感知:

  • BLE 辅助:可以扫描周围的蓝牙设备,和 CSI 数据互补,提高检测准确率;
  • OTA 升级:已部署的设备通过软件升级就能获得 CSI 能力,不用换硬件;
  • 本地 AI:双核 240MHz 主频、支持 AI 指令集,能在设备本地跑机器学习和神经网络,不必把数据全部传到云端。

另外,ESP32 输出的信息很丰富:除了 CSI 本身,还附带 RSSI、射频噪声底、接收时间、天线 rx_ctrl 字段等,这些在调试时都是宝贵线索。

三步搭好 ESP32 CSI 开发环境

第一步:备齐硬件

建议准备两块开发板,一块当发送端、一块当接收端(推荐 ESP32-C5 或 ESP32-C6),并尽量使用外置 IPEX 天线——PCB 板载天线方向性差,容易被主板干扰。两块板之间的距离最好大于 1 米,太近数据会比较"糊"。

第二步:安装 ESP-IDF 并拉取代码

开发框架推荐 ESP-IDF v5.0.0 及以上版本(更高版本支持目的地址过滤,CSI 效果更好)。装好后拉取项目:

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 monitor # 接收端(另开一个终端) cd examples/get-started/csi_recv idf.py set-target esp32c3 idf.py flash -b 921600 -p /dev/ttyUSB1

烧录完成后,两块板通过 Wi-Fi 建立连接,接收端的串口就会开始输出 CSI 数据。

第 1 次实验:让路由器当"发报员" 🧪

最快见到 CSI 的方法,其实连发送端开发板都不用准备——用现成的路由器就行。

原理很简单:ESP32 向路由器发送 Ping 包,路由器回应的 Ping Reply 里就携带着 CSI 信息,接收端顺水推舟把它取出来。这个方案对应examples/get-started/csi_recv_router示例,只需一块 ESP32 加一台路由器即可跑通。

它适合"环境里只有一块 ESP32、且检测范围内有路由器"的场景,是成本最低、上手最快的入门路线。当然,代价是结果受路由器位置、支持的 Wi-Fi 协议等因素影响,精度属于"够用"级别。

看懂串口日志:那串"天书"里藏着什么

跑通之后,串口会刷出一行行形如CSI_DATA,...的日志。第一次看可能会懵,其实拆开看很有规律。

一行 CSI 数据的结构大致是:

CSI_DATA,0,94:d9:b3:80:8c:81,-30,11,1,6,...,"67,48,4,0,..."
  • 前面的字段是元数据:type(数据类型)、id(设备编号)、mac(发送端 MAC)、rssi(信号强度)、rate(速率)、noise_floor(射频噪声底)、channel(信道)等;
  • 最后一对引号里的 data 数组才是主角:它按子载波排列,每个子载波先存虚部、再存实部(即 [1号子载波虚部, 1号子载波实部, 2号子载波虚部, 2号子载波实部, ...])。

把这对"虚部+实部"拼起来,就得到每个子载波的复数信道信息,幅度和相位都能算出来——后续所有的检测算法,都是拿这些数字做文章。

把 CSI 数据画成图:信号如何"感应"到人

光看数字还是不够直观,好在项目自带一个可视化脚本。先关掉idf.py monitor,然后运行:

cd examples/get-started/tools pip install -r requirements.txt python csi_data_read_parse.py -p /dev/ttyUSB1

屏幕上会实时画出各子载波的幅度波形。这时候你走到两块板之间,会看到波形明显扰动;坐下不动、呼吸变慢,波形又会呈现另一种细微变化——第一次亲眼看到"信号在感知我",那种感觉非常奇妙。

上图是一次真实的测试部署:发送端与接收端分置两侧,笔记本实时解析数据。两个设备距离 1 米以上,人从中间走过,波形就会给出"反应"。

第 2、3 次实验:另外两种获取 CSI 的方式

入门方案解决了"有没有",下面两种方案解决"够不够准、够不够多"。

方式二:设备间直传

两块 ESP32 都连上路由器,A 板接收 B 板发出的 Ping 包里携带的 CSI。它的好处是不依赖路由器位置,也不受路由器下其他联网设备的干扰,适合需要多块 ESP32 协同工作的场景。

方式三:专用设备广播

一台专用发送设备持续切换信道广播数据包,多块 ESP32 同时接收其中的 CSI。这种方式精度和可靠性最高,不受路由器制约,多设备环境里也只有一台发送设备,对网络干扰很小;代价是需要额外一台专用发送设备,适合对精度要求高、需要多设备集群定位的场景。

三种方式放到一起对比,选择思路就很清楚了:

获取 CSI 的方式所需设备精度主要依赖适用场景
路由器回包1×ESP32 + 路由器路由器位置、协议单设备快速入门
设备间直传2×ESP32 + 路由器中高路由器协议多设备协同感知
专用设备广播N×ESP32 + 专用发送端最高高精度集群定位

偷懒神器:ESP-CSI Tool 帮你采集、标注、分析 🛠️

自己写解析代码能学到东西,但如果你想快速进入"应用层",项目里的 ESP-CSI Tool 能省掉一大半功夫。这是一个图形化工具,把采集、显示、标注、分析打包成了开箱即用的功能:

  • 实时展示:CSI 子载波波形、RSSI 波形、射频底噪、Wi-Fi 信道数据一览无余;
  • 数据采集:把收到的 CSI 保存到文件,为后续机器学习攒数据集;
  • 行为标注:按不同动作(如 move)采集数据并打标签,方便训练分类模型;
  • 智能分析:内置房间状态判断(有人/无人、运动/静止)和运动次数统计。

界面上半部分是原始 CSI 数据(Raw data),下半部分是算法处理后的结果(Radar model)。它特别适合用来快速理解:不同天线、不同人体动作、不同设备摆放,到底会怎样影响 Wi-Fi 信号。启动它也很简单,注意使用 UART 口而不是 USB Serial/JTAG 口:

cd examples/esp-radar/console_test/tools pip install -r requirements.txt python esp_csi_tool.py -p /dev/ttyUSB1

ESP32 人体检测实战:ESP-RADAR 与 ESP-Crab 的进阶玩法 🎯

工具准备好了,接下来看真实应用。examples/esp-radar是官方给出的一组实战示例:

  • console_test:交互式控制台,支持动态配置与采集 CSI 数据,附带人体活动检测算法,可判断房间有人/无人、人是否在运动;
  • connect_rainmaker:把采集到的 CSI 数据上报到乐鑫 RainMaker 云平台,方便远程查看;
  • wifi_sensing_demo:基于esp_wifi_sensing组件做运动与人体存在检测,支持现场训练、LED 反馈,还能用浏览器里的 Web Serial 监控实时诊断。

上面这张图就是检测运行时的界面:原始 CSI 波形随人体动作起伏,右侧的检测模型标出"有人/无人"的状态,下方的柱状图记录运动次数。用它做 ESP32 人体检测实验,比纯看日志直观得多。

再进一步,examples/esp-crab展示了一套更硬核的方案:通过双 ESP32-C5 共晶振实现射频相位同步,支持"自发自收"和"单发双收"两种模式,能从 CSI 相位信息中感知毫米级的信号路径扰动,为大范围、复杂环境下的无线感知与 CSI 室内定位提供支撑——如果你对前沿算法和定位精度感兴趣,这是很好的研究起点。

避坑清单:五条用"踩坑"换来的经验

实验顺利时很快,但翻车往往就在几个细节上。这五条经验值得先抄下来:

  1. 天线选外置 IPEX:PCB 板载天线有方向性、易受主板干扰,外置天线明显更稳;
  2. 在无人环境测试:测试时让房间保持无人,避免别人的走动污染你的数据;
  3. 设备间距大于 1 米:两块板离得太近,数据区分度会大打折扣;
  4. 避开拥挤的信道:Wi-Fi 信道太挤会导致丢包、数据混乱,换到空闲信道试试;
  5. 做基线校准:使用 ESP-CSI Tool 时,先在无人房间完成阈值校准(可设置延迟和校准时长),校准时间越长,误判概率越低。

尾声:当 Wi-Fi 开始"认识"你的家 🔭

回到文章开头那个深夜的问题。曾经我以为"不装摄像头还想看见房间"是异想天开,而这一路实验下来,答案已经很清楚:Wi-Fi 信号每天都在穿越你的家,ESP32 CSI 工具包只是教会它"把看到的讲出来"。

这套能力未来会通向很多地方:智能家居里无感的人员检测、健康场景下非接触的生命体征监测、安防领域的入侵识别、工业现场的设备状态感知与 CSI 室内定位……而这一切的起点,不过是一块几十块钱的 ESP32 和一段从csi_send开始烧录的固件。

如果你的好奇心已经被勾起来了,那就按这篇笔记的节奏,从第一次实验开始吧——下次再看到那台路由器,你可能会忍不住想:它又在"看"什么?

【免费下载链接】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),仅供参考

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

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

立即咨询