WiFi信号穿墙而过,除了承载数据,还能做什么?这个问题我在三年前第一次接触CSI(信道状态信息)采集时就想过。当时用一块开发板抓了几组原始CSI数据,看着那些随人体移动而剧烈波动的子载波幅值曲线,脑子里冒出的第一个念头是:这东西能不能用来做人体姿态估计?后来看到WiFi-DensePose这篇工作的思路,把WiFi信号反射的多径效应映射到人体密集姿态,确实让人眼前一亮。而OpenHarmony这两年在设备互联和分布式软总线上的推进速度很快,把这两件事捏在一起做智慧家居场景的融合,就成了一件很自然的事。这篇内容适合对无线感知、端侧AI部署、OpenHarmony设备开发有一定了解,想动手把CSI感知能力落到实际家居场景里的朋友。我会从原理拆解讲到实操链路,把踩过的坑和验证过的方案都摊开说。
1. 为什么WiFi能"看见"人体姿态
1.1 从RSSI到CSI:信息粒度的质变
大多数人接触WiFi感知是从RSSI(接收信号强度指示)开始的。RSSI就是一个标量,表示接收到的信号总功率,用它做人体检测,本质上只能判断"有没有东西挡住了信号",精度非常粗糙。你在路由器旁边走动,RSSI会波动,但你无法从这一个数字里区分出你是站着还是蹲着,更别说手臂的位置。
CSI则完全不同。在OFDM(正交频分复用)系统里,一个WiFi信道被划分成几十甚至上百个子载波,每个子载波都有自己的幅值和相位。CSI就是这一组复数矩阵,维度通常是天线对数 × 子载波数 × 时间采样点。以常见的Intel 5300网卡为例,可以拿到30个子载波的CSI;用一些支持802.11ac的开发板,子载波数量能到56甚至更多。这意味着同一时刻,你拿到的是几十条并行的"信号切片",每一条都携带了信号在传播路径上经历的反射、衍射、散射信息。
人体主要由水构成,对2.4GHz和5GHz的电磁波有很强的反射能力。当人站在发射端和接收端之间,人体的不同部位(躯干、四肢、头部)会对不同子载波产生不同的多径调制。胸腔的起伏、手臂的摆动,都会在CSI的幅值和相位上留下独特的"指纹"。WiFi-DensePose的核心洞察就在这里:如果能把这种高维CSI时序信号和人体密集姿态建立映射,理论上就能从WiFi信号反推出人体姿态。
1.2 DensePose与CSI的映射逻辑
DensePose本身是计算机视觉领域的一个任务,目标是把人体二维图像上的每个像素映射到人体三维表面的对应点,输出的是一个人体表面的密集对应图(IUV图:Index、U、V三个通道)。相比传统的关键点检测(只输出十几个关节坐标),DensePose提供的是全身表面的稠密信息,对姿态的刻画精细得多。
WiFi-DensePose要做的,是建立一个从CSI时序到DensePose输出的跨模态映射。这个映射的难点在于:CSI是射频域的物理量,DensePose是视觉域的人体表面表示,两者之间没有直接的几何对应关系。目前主流做法是构造一个编码器-解码器结构,编码器把CSI序列压缩成隐向量,解码器再把隐向量展开成DensePose的IUV图。训练时需要用同步采集的CSI数据和视觉DensePose标注作为监督信号。
这里有个关键点很多人会忽略:CSI对环境的依赖极强。同一个动作,在客厅和卧室采集到的CSI模式可能完全不同,因为多径环境变了。所以WiFi-DensePose在实际部署时,要么做环境自适应,要么在目标环境里重新采集一批标定数据。我在实测中发现,哪怕只是把沙发挪动半米,之前训练的模型精度就会掉一截。这个特性决定了它不可能像摄像头那样"即插即用",必须针对具体空间做适配。
1.3 智慧家居场景下CSI感知的独特价值
摄像头做姿态估计已经很成熟了,为什么还要用WiFi?答案在隐私和覆盖。卧室、卫生间这些私密空间,用户对摄像头的接受度很低。WiFi信号不采集图像,只采集射频反射信息,天然具备隐私友好性。而且WiFi信号能穿墙,一个路由器加几个接收节点,就能覆盖整套房子的多个房间,不需要每个房间都装摄像头。
在智慧家居里,CSI感知能落地的场景包括:老人跌倒检测(通过姿态突变判断)、睡眠姿势监测(通过呼吸引起的微弱CSI波动)、手势控制家电(通过手部动作的CSI模式识别)、以及 occupancy 检测(判断房间里有没有人、有几个人)。这些场景的共同点是:不需要高精度的人脸或身份识别,只需要姿态和动作层面的信息,正好落在CSI感知的能力区间内。
2. OpenHarmony在感知链路里扮演什么角色
2.1 分布式软总线解决多节点CSI汇聚
WiFi-DensePose的CSI采集通常需要多个接收节点,因为单节点的视角有限,多节点才能覆盖不同方向的人体反射。传统做法是用一台PC通过有线网络汇聚所有节点的数据,部署起来很笨重。OpenHarmony的分布式软总线提供了一种更轻量的方案:把每个CSI采集节点做成一个OpenHarmony设备,通过软总线自动发现和组网,数据可以在设备间直接流转。
具体来说,每个采集节点跑一个轻量级的CSI采集服务,把原始CSI数据做初步的滤波和降采样,然后通过分布式数据对象(Distributed Data Object)同步到一个主控节点。主控节点负责把多路CSI做时间对齐和空间融合,再送入姿态估计模型。软总线的优势在于它屏蔽了底层传输细节,节点之间可以用类似本地调用的方式交换数据,省去了自己写socket通信和心跳维护的功夫。
不过这里有个坑:分布式软总线默认的传输优先级是面向控制指令的,大数据量的CSI流如果直接走默认通道,延迟会比较高。我的做法是把CSI数据做分片,每片控制在几KB,然后用可靠传输模式,实测下来端到端延迟能压到50ms以内,对于姿态估计这种准实时场景够用了。
2.2 LiteOS-M在采集端的低功耗优势
CSI采集节点如果是电池供电的,功耗就是硬约束。OpenHarmony生态里的LiteOS-M内核面向轻量级设备,内存占用可以做到几KB级别,非常适合做CSI采集这种"采集-预处理-发送"的简单任务。我在一块基于LiteOS-M的开发板上做过测试,采集端只做CSI原始数据读取和简单的滑动平均滤波,CPU占用率不到15%,配合低功耗WiFi模组,用两节AA电池能撑好几天。
这里要注意的是,LiteOS-M上跑不了复杂的神经网络推理,所以姿态估计的重活必须放在主控节点或者边缘服务器上。采集端的定位就是"哑终端":只负责把干净的CSI数据传出去,不做任何智能判断。这种分工在工程上更稳妥,也更容易做故障隔离——某个采集节点挂了,换一个就行,不影响整个系统。
2.3 设备兼容性测评带来的选型约束
OpenHarmony的设备兼容性测评(XTS测试)对能接入生态的设备有明确要求。如果你打算用现成的OpenHarmony开发板做CSI采集,选型时一定要先确认它是否通过了兼容性测评,以及它的WiFi模组是否开放了CSI获取接口。很多开发板的WiFi驱动是闭源的,根本不给你CSI数据,这种板子买回来就是废的。
我踩过的坑是:某款宣称支持OpenHarmony的开发板,WiFi模组用的是某厂商的闭源固件,虽然能正常联网,但CSI接口被锁死了,只能拿到RSSI。后来换了一款基于开源WiFi驱动的板子,才顺利拿到CSI。所以选型时的第一件事不是看CPU多强、内存多大,而是确认CSI接口是否可用。这个信息在开发板的规格书里通常不会写,得去社区或者直接问厂商FAE。
3. 从CSI原始数据到姿态输出的完整链路
3.1 CSI数据采集与预处理
拿到CSI原始数据后,第一步是预处理。原始CSI里混杂了大量噪声:发射端的功率波动、接收端的AGC(自动增益控制)调整、以及环境里的其他WiFi设备干扰。如果不做处理直接送进模型,精度会很差。
预处理的标准流程是:先用Hampel滤波器去除脉冲噪声(那些突然跳变的异常值),然后做相位解缠(因为CSI相位是卷绕在[-π, π]之间的,直接使用会引入跳变),接着用滑动窗口做时间维度的平滑。相位这块特别关键,很多初学者直接拿原始相位去训练,结果模型完全学不到东西,就是因为相位卷绕把有效信息破坏了。
采样率的选择也有讲究。人体动作的主要频率成分在0.5Hz到10Hz之间,根据奈奎斯特采样定理,采样率至少要20Hz。但实际中为了捕捉快速动作(比如挥手),我一般会把采样率设到50Hz到100Hz。代价是数据量变大,对传输和存储的压力增加。折中方案是采集端做50Hz采样,但在发送前做一次降采样到25Hz,这样既保留了动作细节,又控制了数据量。
3.2 多节点CSI的时间对齐与空间融合
多节点采集最大的问题是时间不同步。每个节点的本地时钟有漂移,如果不做对齐,融合出来的CSI会错位,姿态估计就会抖动。我的做法是在每个采集节点上跑一个轻量的NTP客户端,定期和主控节点对时,把时钟偏差控制在1ms以内。然后在主控节点上,用一个参考信号(比如所有节点都能收到的某个AP的beacon帧)做粗对齐,再用互相关做精对齐。
空间融合的思路是把多个节点的CSI拼成一个更大的特征矩阵。假设有3个接收节点,每个节点有30个子载波,融合后的特征维度就是90。但直接拼接效果不好,因为不同节点的信道特性不同。更好的做法是先对每个节点的CSI做独立的特征提取,然后在特征层面做融合。我试过用注意力机制让模型自己学习不同节点的权重,效果比简单拼接好不少,尤其是在某个节点被遮挡的情况下,模型能自动降低该节点的权重。
3.3 姿态估计模型的端侧部署
模型训练通常在PC或服务器上完成,但推理要放到OpenHarmony主控节点上。这就涉及模型压缩和端侧部署。WiFi-DensePose的原始模型参数量不小,直接搬到端侧不现实。我的做法是先用知识蒸馏把大模型的能力迁移到一个小模型上,然后对小模型做INT8量化,最后用OpenHarmony的AI推理框架加载。
量化这一步要小心:CSI特征的动态范围比较大,如果量化参数选得不好,精度会掉得很厉害。我的经验是先用一批标定数据统计CSI特征的分布,然后根据分布来确定量化的scale和zero_point,而不是用默认参数。实测下来,经过精细量化的模型,精度损失能控制在3%以内,而模型体积缩小到原来的四分之一,推理速度提升了两倍多。
4. 实测中那些文档不会告诉你的坑
4.1 环境变化导致的模型失效
前面提过CSI对环境极度敏感,但实际影响比想象中更大。我在一个客厅场景里训练好的模型,白天用着好好的,晚上开了灯之后精度就掉了。一开始以为是巧合,后来排查发现是灯光的变化影响了WiFi信号的反射特性——虽然灯光本身不发射2.4GHz信号,但灯具的金属外壳和位置改变了多径环境。
解决办法有两个方向:一是做在线自适应,让模型在运行过程中根据CSI的统计特性变化动态调整;二是做数据增强,在训练时人为加入各种环境扰动的模拟数据。我目前用的是混合方案:模型里加一个轻量的环境编码器,把当前CSI的统计特征(均值、方差、峰度)编码成一个环境向量,姿态解码器根据这个向量做条件生成。这样模型对环境的鲁棒性好了很多,但代价是训练复杂度上升。
4.2 多人场景下的信号混叠
单人姿态估计相对好做,多人场景就麻烦了。多个人体的反射信号在CSI里混叠在一起,模型很难区分哪个反射来自哪个人。目前学术界有一些尝试,比如用盲源分离先把不同人的信号分开,但效果都不太理想,尤其是在人挨得比较近的时候。
我的务实做法是:在智慧家居场景里,先做人数检测,如果检测到多人,就退化成"区域占用+粗略动作"的输出,不强行做每个人的精细姿态。等人数降到一人时,再切换到精细姿态估计模式。这种降级策略在实际产品里比追求"多人精细姿态"更靠谱,因为用户真正需要的往往不是每个人的精确姿态,而是"房间里有没有人、在做什么"这种粗粒度信息。
4.3 采集节点的布放位置
CSI采集节点的位置对精度影响巨大。理想情况下,接收节点应该分布在人体的不同方向,这样才能捕捉到不同角度的反射。但实际家居环境里,插座位置、家具遮挡都会限制布放。我试过几种典型布局:把接收节点放在房间的四个角,精度最好;放在同一面墙上,精度明显下降,因为所有节点看到的人体反射角度太接近。
一个实用的技巧是:至少保证有一个接收节点和发射节点之间没有直射路径(NLOS),因为NLOS路径上的CSI对人体反射更敏感。如果所有节点都是直射路径,人体反射会被直射信号淹没。我在一个L形客厅里,把发射节点放在一端,两个接收节点分别放在直射路径和拐角后的NLOS路径上,融合后的精度比全直射布局提升了将近20%。
5. 把感知能力接入OpenHarmony应用层
5.1 用分布式数据对象做姿态结果分发
姿态估计的结果最终要送到应用层去消费,比如触发灯光调节、空调风向调整、或者跌倒报警。OpenHarmony的分布式数据对象很适合做这件事:主控节点把姿态结果写成一个分布式数据对象,订阅了这个对象的应用就能自动收到更新,不需要自己维护通信连接。
具体实现上,我把姿态结果封装成一个结构体,包含时间戳、人数、每个人的关键点坐标和置信度。这个结构体序列化后写入分布式数据对象,应用层通过监听数据变更事件来获取最新姿态。实测下来,从姿态估计完成到应用层收到更新,延迟在20ms左右,对于家居控制场景完全够用。
5.2 原子化服务封装感知能力
OpenHarmony的原子化服务(Atomic Service)是一种轻量级的服务形态,不需要安装就能使用。我把CSI感知能力封装成一个原子化服务,其他应用通过服务卡片就能调用姿态估计功能,不需要关心底层的CSI采集和模型推理细节。这样做的好处是解耦:感知能力的升级不影响上层应用,上层应用的迭代也不需要重新适配感知接口。
封装时要注意接口的粒度。太细的接口(比如暴露原始CSI数据)会让上层应用负担很重,太粗的接口(比如只给一个"有人/没人"的布尔值)又限制了应用场景。我目前提供的接口包括:人数检测、人体包围盒、关键点坐标、动作分类结果。这几个接口覆盖了大部分家居场景的需求,同时保持了足够的抽象层次。
5.3 隐私保护的设计考量
虽然CSI不采集图像,但它仍然是一种感知数据,涉及隐私。我在设计时遵循几个原则:第一,原始CSI数据只在采集节点和主控节点之间传输,不上云;第二,姿态结果在本地消费,不存储原始数据;第三,提供物理开关,用户可以通过一个硬件按钮彻底切断CSI采集。
另外,CSI数据本身虽然不包含图像,但理论上可以通过分析CSI的变化反推出一些敏感信息,比如用户的作息规律。所以我在数据留存策略上做了限制:姿态结果只保留最近5分钟,用于实时控制;历史数据只保留聚合后的统计信息(比如"今天下午3点到4点客厅有人"),不保留逐帧的姿态数据。
6. 性能调优与稳定性保障
6.1 推理延迟的优化路径
端侧推理延迟直接影响用户体验。我实测下来,一个未经优化的模型在OpenHarmony主控节点上推理一帧要80ms左右,加上CSI采集和传输的延迟,端到端超过150ms,做实时手势控制就有点卡。优化路径有几条:模型量化(前面提过,能提速两倍多)、算子融合(把连续的卷积和激活函数合并成一个算子)、以及多线程流水线(采集、预处理、推理分到不同线程,重叠执行)。
我最终把端到端延迟压到了60ms左右,具体做法是:采集端50Hz采样,每20ms发一批数据;主控节点收到后立即做预处理和推理,推理和下一批数据的接收并行进行。这样流水线跑起来之后,吞吐量上去了,单帧延迟也降下来了。
6.2 长时间运行的稳定性问题
CSI感知系统需要7×24小时运行,稳定性比峰值性能更重要。我遇到过几个稳定性问题:一是内存泄漏,跑几天之后主控节点内存耗尽;二是WiFi模组过热导致CSI采集中断;三是分布式软总线的连接在路由器重启后没有自动恢复。
内存泄漏的排查花了不少时间,最后定位到是CSI数据缓冲区没有及时释放。修复方法是在每次推理完成后显式释放缓冲区,并加一个内存监控线程,超过阈值就触发垃圾回收。WiFi模组过热的问题通过加散热片和降低采样率缓解。软总线重连的问题需要在应用层加一个心跳检测,发现连接断了就主动重新组网。
6.3 精度与功耗的平衡
采集节点的功耗和精度是一对矛盾。采样率越高、发送越频繁,精度越好,但功耗也越大。我在电池供电的节点上做了一个自适应策略:当检测到房间没人时,采样率降到10Hz,发送间隔拉长到1秒;当检测到有人时,自动升到50Hz。这样在保证有人时精度的同时,没人时把功耗降到最低。实测下来,电池寿命从原来的2天延长到了7天左右。
这个自适应策略的关键是"有人/没人"的检测要足够轻量,不能依赖复杂的模型。我用的是一个基于CSI方差阈值的简单检测器,计算量极小,在LiteOS-M上跑毫无压力。虽然偶尔会有误判(比如窗帘飘动引起的CSI波动),但配合一个短时间的确认窗口,误判率可以控制在可接受范围内。
7. 这套方案还能往哪些方向延伸
7.1 从姿态到行为理解的跃迁
姿态估计只是第一步,更有价值的是行为理解。比如从"手臂抬起"的姿态序列,推断出"在喝水"或"在打电话"这样的高层行为。这需要在姿态估计之上再加一层时序模型,把姿态序列映射到行为标签。我目前在做的一个尝试是用一个轻量的时序卷积网络,输入是最近2秒的姿态关键点序列,输出是行为分类结果。初步测试下来,对"喝水""看手机""起身"这几个常见行为的识别准确率能到85%以上。
行为理解的价值在于它能驱动更智能的家居控制。比如识别到"在看手机",自动把灯光调暗;识别到"在吃饭",自动打开餐厅的换气扇。这些场景比单纯的姿态显示有用得多,也更接近用户真正愿意买单的功能。
7.2 多模态融合的可能性
CSI感知有它的局限:空间分辨率不如摄像头,对细微动作的捕捉能力有限。如果能和摄像头、毫米波雷达等其他传感器融合,就能互补短板。比如用摄像头做高精度的姿态估计,用CSI做隐私敏感区域的覆盖,用毫米波雷达做穿墙检测。OpenHarmony的分布式能力正好适合做这种多模态融合,不同传感器作为不同的设备接入,数据在软总线上汇聚。
融合的难点在于时间对齐和置信度加权。不同传感器的采样率和延迟不同,需要做精细的时间同步。置信度加权则需要根据场景动态调整,比如在光线好的时候多用摄像头,光线差的时候多用CSI。这块我还在探索阶段,目前只做了CSI和毫米波雷达的简单融合,效果比单模态有提升,但离产品化还有距离。
7.3 端侧模型持续学习的工程挑战
环境会变,模型也需要跟着变。理想情况下,系统能在运行过程中持续学习,自动适应环境变化。但端侧持续学习有几个工程挑战:一是计算资源有限,不能做大规模的反向传播;二是需要解决灾难性遗忘,学了新环境不能忘了旧环境;三是需要设计合理的触发机制,什么时候该学、什么时候不该学。
我目前的方案是做一个轻量的在线微调:只更新模型的最后一层,用最近采集的数据做小批量梯度下降。触发条件是检测到CSI统计特性发生显著变化(比如均值偏移超过阈值)。这个方案能在一定程度上适应环境变化,但效果有限,更彻底的方案还需要进一步研究。
这套WiFi-DensePose和OpenHarmony的融合方案,我从最初的概念验证做到现在能稳定跑起来,前后花了大概半年时间。最大的体会是:射频感知和视觉感知的差距比想象中大,不能简单地把视觉领域的方案搬过来用。CSI有它自己的物理特性,必须尊重这些特性来设计算法和系统。另外,OpenHarmony的分布式能力确实能简化多节点系统的开发,但前提是你要把设备选型和接口设计做扎实,否则后面会踩很多不必要的坑。如果你也在做类似的方向,建议先从单节点、单场景做起,把CSI采集和预处理的链路跑通,再逐步扩展到多节点和多场景。