1. 为什么共享办公非要折腾一套“人体存在检测”共享办公这两年最闹心的问题不是网速慢也不是咖啡难喝而是工位利用率账根本算不清。系统上明明显示“已预约”走进去一看人根本不在一整天背包占着坑。行政想统计真实使用率排班表、扩租决策全凭猜这就是我说的“幽灵工位”现象。业内折腾过不少方案热释电红外传感器PIR便宜是便宜但人坐着不动超过几分钟它就当你是空气摄像头能看一清二楚可工位上一坐一天谁愿意头顶上挂着个镜头隐私合规跟员工信任分分钟全崩。超声波方案呢对人这种慢速、微幅动作又不够敏感还容易被空调气流干扰出误报。所以当朋友找到我说想用毫米波雷达做一套共享办公工位的人体存在检测方案时我的第一反应是方向对了但这玩意儿从选型到部署坑一点也不少。毫米波雷达厉害在什么地方它发射的是波长在毫米级的电磁波常见24GHz、60GHz、77GHz频段既能探测动态的人体活动也能捕捉人静坐时呼吸带来的胸廓微动——注意这个“微动”正是解决PIR痛点、判断“工位上到底有没有活人”的关键信号。这篇内容就是把我从硬件选型、算法流程到现场部署踩坑的完整过程拆开讲清楚。适不适合你参考如果你是做智能办公、智慧楼宇、物联网设备方案设计的人或者正在纠结怎么选人体存在传感器那这篇可以直接当实操手册用。我先说结论毫米波雷达的方案设计核心不是雷达本身而是你对“存在”这两个字的理解深度以及检测逻辑怎么在误报和漏报之间做取舍。2. 方案设计第一步摸清毫米波雷达到底能感知什么2.1 FMCW雷达的工作本质是一连串“距离-速度”切片先别急着打开数据手册选型号。你得先搞清楚毫米波雷达在工位这种近距离场景下是靠什么原理工作的。目前主流的人体存在检测雷达都是FMCW体制线性调频连续波。它发射一个频率随时间线性增长的chirp信号遇到目标反射后接收端和发射端混频得到一个中频信号。这个中频信号的频率正比于目标到雷达的距离。距离分辨率由chirp的带宽决定公式是距离分辨率 c / (2 × B)c是光速B是扫频带宽。拿60GHz毫米波雷达举例带宽通常在4GHz以上算下来距离分辨率能做到3.75厘米左右。这意味着什么意味着它不仅能告诉你“这个方向有东西”还能告诉你“这个东西大概在哪个距离范围上”。在共享工位这种固定安装场景这个距离信息非常关键——你可以把检测范围精确框定在某个工位的物理边界内隔壁工位的人再活跃只要不在你的距离窗里就不会触发误报。这一点是PIR和摄像头很难做到的。多普勒维的信息同样重要。同一个chirp序列里相邻chirp之间的相位差反映了目标的径向速度。对慢时间维再做一次FFT常用术语叫2D-FFT就能得到“距离-多普勒图”Range-Doppler Map简称RDM。动态人体在RDM上会有一个明显的多普勒速度单元的能量峰值普通走路、起身、拿文件径向速度通常在0.2m/s以上频谱特征非常清晰。这套逻辑我最早是在车载领域接触的但挪到室内人体存在检测场景一样成立只是参数要重新调。2.2 静态人体的“呼吸信号”才是检测核心如果只是检测动态人体那用个便宜的多普勒雷达模块也凑合。工位场景真正的技术门槛是解决“人坐在工位上安安静静看电脑”这种情况。人静坐时身体宏观上不动但呼吸是持续的。胸廓随呼吸起伏幅度大概在1到5毫米速度也慢通常每秒只有几个毫米级别。毫米波雷达要捕捉这个微动靠的是相位信息。雷达对微小位移的感知能力跟波长直接挂钩位移Δd引起的相位变化Δφ 4πΔd / λ。60GHz雷达的波长约为5毫米1毫米的胸廓起伏能引起约2.5弧度的相位变化这个量级对现代雷达信号处理来说非常可观。具体做法是先通过距离FFT定位人体所在的距离单元然后对这个距离单元对应的复信号I/Q两路做慢时间维的相位展开再对相位序列做频谱分析。呼吸的频率范围大约在0.15Hz到0.6Hz对应每分钟9到36次如果在这个频段内检测到稳定的周期性峰值就能判定“工位上存在一个处于静坐状态的人”。这里有个必须强调的点静态人体检测最忌讳的是只抓“有没有多普勒能量”。很多初版方案漏报就是因为只写了个多普勒能量阈值人一不动就判离开。正确思路一定是“动态多普勒检测 静态微动检测”双通道融合判断而且静态通道的优先级不能低因为长时间工位场景里人大部分时间其实是静态的。2.3 频段选型对比60GHz为什么更适合共享工位市面上存在检测雷达主要有24GHz、60GHz和77GHz三个频段。我把自己在实际项目中对比的情况整理成这样一张表频段波长对微动灵敏度天线尺寸与模块体积典型探测距离场景适配度24GHz约12.5mm中等亚厘米级位移才能稳定感知较大天线阵列体积明显8-15米更适合仓库、走廊等大范围区域存在检测60GHz约5mm高毫米级呼吸位移可解调小易嵌入工位隔板、桌面下方3-8米非常适合近距离、单人、隐私敏感场景77GHz约3.9mm更高小10米以上车载为主模块价格偏高室内用属于性能过剩这里要注意波长越短同样的位移引起的相位变化越大检测微动的灵敏度也越高。但波长短也会带来一个副作用对金属物体、粗糙表面的反射更加敏感误报源也会变多。所以选型不是一味追求高频率而是匹配场景。共享办公工位的探测距离一般不超过1.5米到2米需要的不是远距离性能而是近距离的稳定性和小型化。60GHz是目前综合性价比最高的选择硬件价格已经降下来了尺寸能做到一个硬币大小左右而且多数国家在60GHz频段给室内短距离设备分配了较宽的免许可带宽。24GHz虽然便宜但微动检测能力差一截我在实测中明显感觉静坐检测的成功率不如60GHz。3. 系统整体架构设计从雷达节点到云端工位状态3.1 三层架构感知层、边缘决策层、应用层方案不能只停留在雷达本身得站在系统角度设计。我习惯把整条链路拆成三层。感知层就是雷达模组本身负责原始I/Q数据采集和处理。这个层的关键指标是数据输出的形式和频率。有些模组直接输出原始I/Q数据需要你自己做完整信号处理链路有些模组已经在内部做了距离FFT甚至目标检测对外输出“检测到的目标列表”或“存在/不存在”的布尔值。选哪种取决于你的研发深度。如果在产品验证阶段或者团队没有专职做雷达信号处理的同学建议选择后者能减少至少两个月开发周期如果你要把检测逻辑做得精细、可深度调参选前者自主可控空间大。边缘决策层是方案设计里容易被低估的部分。每个工位雷达节点应该具备独立的判定能力连续运行检测算法、维护状态机、输出稳定的“占用/空闲”状态。这样即使网络断开工位端的检测功能依然能工作。我见过不少方案把所有数据都往云端送结果一旦网络抖动工位状态全乱了。边缘决策的另一个好处是减少网络负载毕竟一栋楼几十上百个工位每秒钟都传原始点云数据带宽和成本都扛不住。应用层就是工位管理系统了实时状态展示、历史使用率报表、与预约系统的联动释放、会议室告警等等。这一层用的是标准的物联网技术栈数据通过MQTT协议上报到服务端服务端做状态持久化和策略处理。我在实际项目里用的是轻量级架构边缘MCU通过WiFi把MQTT消息发给本地的NanoMQ代理再由后端服务订阅入库前端走WebSocket推送实时状态。这套链路稳定、好维护也方便后续扩展。3.2 关键权衡雷达输出原始数据还是直接输出状态这个选择在实际项目里直接决定你的研发投入和产品天花板多说两句。我在新项目启动时做过一个对比测试同一颗60GHz雷达模组一个版本让雷达输出I/Q原始数据自己在MCU上跑2D-FFT和目标检测另一个版本用模组自带的感应算法直接输出“有人/无人”。结果是让人印象深刻的——自带算法的版本确实马上能跑起来但在共享工位特定的静止场景下漏报率偏高而自己写信号处理链路的版本虽然开发周期多了两个多月却能做到“人静坐3分钟以上依然稳定判定为占用”。我的建议是如果你的应用只是会议室、卫生间的存在感应对漏报容忍度相对高直接用模组自带算法快速上线如果是共享办公工位这种要和预约系统联动、直接计算费用和资源的场景检测准确率就是生命线一定一定要掌握自研信号处理与判定逻辑的能力。后面我详细拆的这套流程就是照着“自研链路 输出结果”这条路走的。3.3 安装位置与覆盖范围的设计必须前置很多人把雷达买回来后才发现安装位置不对导致检测区域要么覆盖不住工位要么窜到了隔壁工位。这个一定要在设计阶段就定好。共享办公工位通常用隔板分隔每个工位宽度在1.2米到1.6米之间进深在0.7米到0.9米左右。雷达的安装位置有两个主流选择——一个是工位正前方隔板的顶部高度大约在1.4米到1.6米雷达略微向下倾斜另一个是桌面前沿的下方朝人体方向斜向上照射。我实测下来更推荐前者俯视角度下雷达能同时覆盖桌面上半部分和座椅区域且人和雷达之间的遮挡最少。安装在桌面下方时笔记本电脑、键盘、桌面本身容易形成遮挡和多径反射信号会被严重干扰。安装角度有个值得记下的经验雷达的俯仰角下倾15度到30度比较稳妥。下倾角太大会把探测区域过度聚焦在桌面上人体躯干的反射信号变弱下倾角太小又会把探测范围拉远隔壁工位的目标容易进入到检测窗。你在安装时需要根据隔板高度微调但总体来说让雷达主波束的覆盖中心落在“人的胸口附近”是最舒服的状态因为这个位置反射面积大而且呼吸微动信号最强。覆盖范围的判定逻辑也不要凭感觉。雷达的方位向和俯仰向各有视场角比如有的模组是水平100度、垂直60度。你可以用一个简单的几何估算距离D处的覆盖宽度大约等于2 × D × tan(半角)。如果D为1.2米水平视场角100度覆盖宽度大约就是2.86米。如果一个工位宽度只有1.4米这个视场明显偏高你需要通过距离窗、角度滤波还有安装朝向把这些多出来的覆盖区域“切掉”只保留目标工位。4. 核心检测链路与工程实现细节4.1 完整的信号处理流程现在进入重头戏整条检测算法链路。我不假设你手上有现成的雷达SDK但以下这套流程是绝大多数60GHz FMCW雷达都适用的一般性处理框架。第一步是获取ADC原始数据。每个chirp会被离散采样为若干采样点一次完整的帧frame通常包含几十到上百个chirp帧率一般在10帧/秒到20帧/秒。以帧为单位组织数据为一个三维数组距离采样点数 × chirp数 × 接收天线数。第二步对每个chirp内的采样点做距离维FFT一维FFT得到目标的距离分布。这里建议加窗函数比如汉宁窗或海明窗用来抑制距离维的旁瓣。不加窗的情况下强反射体会在旁边距离单元上形成明显的能量泄漏干扰后续的检测判决。第三步对同一个帧内的不同chirp在慢时间维上再做一次FFT二维FFT得到距离-多普勒图RDM。多普勒FFT的频谱分辨率由帧内的chirp数量决定理论上多普勒分辨率 帧率 / chirp数。设帧率17帧/秒chirp数为64那么多普勒分辨率大约0.27Hz。这个量级对人体的动作识别是够用的。第四步静态背景杂波滤除。工位上的桌面、椅子、隔板都是静止目标它们在RDM上对应的是零多普勒速度附近的巨大能量如果不滤除稍为核心人体的反射会被淹没。常用做法是做一个静态杂波抑制先对多帧RDM取平均得到背景估计然后从当前帧RDM中减掉背景。更简洁的方法是使用高通滤波把零多普勒附近的能量压掉。这一步做不好后面的目标检测很容易被桌腿、金属垃圾桶这种固定物体干扰。第五步目标检测。在滤除杂波后的RDM上用恒虚警率算法CFAR做目标检测筛选出超过自适应阈值的距离-多普勒单元。CFAR的窗口参数要按工位场景调保护单元不能太大防止把相邻的强目标抑制掉参考单元又要注意适配人体反射的尺寸。第六步静态人体微动检测。这一步要回到一维FFT之后的数据。对每个距离单元提取其复信号在慢时间维上的相位时间序列。这个相位序列里呼吸信号表现为一个低频率的单频调制。做法是对相位序列做带通滤波保留0.15Hz到0.6Hz再计算该频段的能量或做短时傅里叶变换。如果能稳定检测到呼吸频段能量峰值同时该峰值持续若干秒那么判定为静态存在。4.2 状态机设计怎么融合动态和静态判断单次检测结果并不足以作为最终状态输出因为单帧结果容易受瞬时噪声影响。我用的方法是一个简单的有限状态机支持三个状态IDLE空闲、OCCUPIED_MOVING占用-运动、OCCUPIED_STATIC占用-静止。每次检测帧循环中进过前六步处理先看动态目标是否出现——例如RDM上存在超过动态阈值的非零多普勒目标。如果出现了状态立刻进入OCCUPIED_MOVING同时启动一个“离开候选计时器”。如果动态目标消失不能马上认为人走了要开始等待静态呼吸信号。一旦呼吸检测模块在当前距离窗内捕获到稳定的呼吸峰值状态转成OCCUPIED_STATIC。真正考细节的地方在“离开判定”上。我的经验是双重确认的机制只有连续超过15秒既没有动态目标也没有呼吸信号才允许状态切回IDLE。这个15秒不是随便拍的。我统计过人体极少出现超过15秒完全静止且呼吸信号完全被遮挡的情况比如把胳膊直接压在胸口上所以这个窗口能在漏报和误报之间取得不错的平衡。你可以根据实际工位的环境嘈杂程度微调如果区域空调风强烈、震动物体多适当缩短离开确认时间也能接受。状态机还需要加入一个“保护窗口”逻辑防止两个状态反复横跳。我一般设定状态切换后至少有3秒内不响应反方向的切换请求。比如刚从IDLE切到OCCUPIED_MOVING哪怕下一秒动态信号短暂消失也不会立刻判为空闲必须保持运动或转入静态占用状态。4.3 MCU上的资源与功耗优化工位雷达节点绝大多数是电池或PoE供电。如果是电池供电功耗优化就是一个绕不开的话题。60GHz雷达模组本身工作时的功耗在0.2W到0.5W之间配上MCU和WiFi传输如果始终保持全速运行任何一个18650电池都撑不了多久。我的做法是分档运行模式。默认情况下雷达以低帧率运行例如每秒5帧只做距离维FFT和能量检测用于快速判断“工位区域有没有值得注意的能量变化”。如果发现能量异常升高再切换为全速模式以17帧/秒的帧率执行完整检测链路。如果连续两分钟没有检测到任何有效目标再回落到低功耗模式。这套策略在工位这种“大多数工位其实长时间空闲”的场景下非常有效整机平均功耗可以降到一个全速运行状态的30%到40%。算法实现上MCU性能有限时不要盲目上复杂网络模型。传统信号处理链路在ARM Cortex-M4级别的MCU上完全跑得动2D-FFT和CFAR的计算量并不大关键是要用定点运算替代浮点并且对FFT运算使用优化的库比如CMSIS-DSP。如果选用的雷达模组自带信号处理加速单元那就尽量把FFT之类的操作下沉到硬件上MCU只做状态机和上报逻辑这样你会少掉绝大部分优化烦恼。5. 工位场景部署与参数标定的实操记录5.1 参数标定要做哪些事硬件装好后整条检测链路能不能跑稳全看参数标定。我给自己定的标准流程是六步。第一步设置距离检测窗。每个工位的物理边界测量好在算法里把检测距离限制在0.3米到2.0米。小于0.3米的是雷达近场盲区反射特征不稳定大于2.0米基本就是走廊或者隔壁工位了。这个距离窗是整套系统防串扰的第一道关口。第二步动态目标阈值标定。让一个人以正常速度走过工位区域记录RDM上的多普勒能量峰值分布设定一个比背景噪声高6dB到10dB的阈值。阈值太低空调气流和窗帘摆动容易误报阈值太高缓慢的动作会被漏掉。6dB到10dB是我在多数室内环境下试出来比较稳的经验值你可以用现场数据微调。第三步呼吸频段确认。让测试者坐在工位上正常办公10分钟期间记录相位时间序列的频谱确认呼吸峰的频率范围。大多数人会在0.2Hz到0.33Hz之间每分钟12到20次但有人很慢或者很快比如深呼吸训练的同事能到0.1Hz。所以带通滤波的带宽不能太死0.1Hz到0.7Hz更保险。第四步角度与视场调整。通过调整安装角度和软件角度滤波把检测区域收敛到工位边界内部。有的雷达模组支持天线阵列数字波束成形可以在软件里配置一个“感兴趣区域”的角度范围这个功能在相邻工位间距很窄的场景下特别有用。第五步离开确认时间设置。参考第4.2节的方法一般设15秒。但如果你面对的是一整天都在开电话会、人员很少起身的团队可以适当缩短到10秒以便快速释放工位如果现场空调风巨大可以拉长到20秒代价是工位释放有延迟。第六步整机联动测试。模拟几个典型场景人坐下马上工作、人坐下后长时间不动、人离开去接水后返回、包放在椅子上人不在。每种场景跑50次统计准确率。如果一个场景反复出问题优先回去检查是信号链路的问题还是状态机逻辑的问题不要盲目调阈值。5.2 现场环境对检测的关键影响室内环境的复杂程度比实验室高一个数量级。我在共享办公现场踩过最深的坑有三个。第一个是空调风。中央空调的出风口如果正对工位气流会带动纸张、绿植叶片、桌面上的细碎杂物产生周期性微动这些微动的多普勒特征和人体呼吸在某些频段上重叠很容易诱发误报。解决办法除了物理调整出风口更有效的是在算法里分析信号的“距离一致性”——纸片和绿植的位置相对固定它们引起的信号变化通常会集中在固定的几个距离单元而人体呼吸信号是一个连续的一维区域而且会随着人体小幅晃动缓慢漂移。你可以加一个简单的空间连续性判断如果检测到的呼吸频段能量集中在单一距离单元且长时间位置不变优先将其归为环境噪声降低置信度。第二个是金属物体。共享办公里常见金属垃圾桶、金属笔记本支架、显示器支架这些物体对毫米波的反射特别强甚至会形成二次反射在RDM上生成“假目标”。比如金属垃圾桶正好在雷达视场边缘它的强回波有可能在某个距离单元上产生高于阈值的信号。如果你用的雷达只有一发一收这种假目标很顽固用多天线雷达可以引入到达角估计算法通过角度信息把强反射体排除在外。硬件的钱在这里体现价值了。第三个是相邻工位的雷达互相干扰。两到三颗毫米波雷达在同一个空间里近距离工作如果都工作在相同频段且发射时间没有同步互相之间会接收到对方的chirp信号形成干扰噪声表现可能是RDM上出现随机分布的亮条纹。解决方案通常是时分复用在每个工位节点上配置一个微小的时间偏移让所有雷达错开发射时间。这个时间偏移如果以设备ID做哈希取模部署时就不需要额外配置了。5.3 实测数据记录一组参考数值为了让你有个直观参考我贴一组在约20平方米、布置了6个工位的开放空间里的实测数据。雷达型号是一颗国产60GHz毫米波模组安装高度1.5米俯仰下倾约20度测距范围设为0.3到2.0米帧率17帧/秒。三种典型场景下各跑了100次结果如下测试场景正确判定次数误判情况准确率人坐下后保持静止办公30分钟973次短暂误判为空闲后恢复97%人正常办公、中途起身接水2次991次离开确认时间偏长释放延迟99%无人但有笔记本电脑、背包在桌面964次误判为占用疑似金属笔记本支架反射96%这个结果不是极限值但已经满足共享办公管理系统的业务要求。让我印象最深的是第一个场景人坐着一动不动看代码PIR方案大概在第8分钟就判空闲了而这套毫米波雷达方案靠着呼吸检测撑住了全程。客户看到对比数据后基本就不再纠结硬件成本的事了。6. 常见问题与排查技巧实录6.1 漏报与误报的排查顺序如果你的系统上线后出现漏报或者误报我建议按照下面这个顺序排查而不是凭感觉瞎调参数。先看“信号层”再调“状态层”。信号层的排查项包括雷达安装角度是不是偏了距离窗设置是否合理背景杂波滤除是否正常雷达附近有没有新增的金属物体或大面积玻璃。这些因素如果不排查干净你在算法层怎么调阈值都白搭。我在项目上曾经遇到一个莫名其妙的误报源排查了两天才发现是保洁阿姨在工位旁放了一个不锈钢推车这个推车在雷达的强反射区里制造了一个跟呼吸信号很像的周期性干扰。再检查“状态层”。确认离开确认时间是否设置得过短导致人只是暂停呼吸测试或者把手臂压在胸口上直接被判离开。对这种特定场景可以加一个多距离单元融合的逻辑当单一距离单元的呼吸信号暂时丢失时如果相邻距离单元仍有体动信号就继续保持占用状态不要把状态切太快。最后再看“数据层”。排查网络上报是否出现丢包或者延迟导致边缘节点的状态没有及时同步到云端。这一步看着简单但很常见尤其WiFi覆盖不稳定的共享办公区域。6.2 一张返工成本最高的经验表下面这些是我们在多次部署中总结出来的高频问题、成因和解决办法直接照单抓药就行故障现象可能原因排查要点解决建议人静坐时判定为空闲呼吸通道失效、阈值过高检查相位序列波形是否正常、呼吸峰是否被滤波滤掉放宽带通范围降低呼吸频段能量阈值延长离开确认时间无人时持续误报为占用空调风口、绿植晃动、金属强反射体观察RDM上的干扰能量位置与强度增加空间连续性判断调整安装角度移除或隔离强反射物隔壁工位的人触发本工位检测距离窗太宽、视场角过大查看目标在距离维上的位置是否落在工位边界内缩短最大检测距离启用角度滤波调整雷达朝向相邻雷达互相干扰发射时序重叠、同频干扰RDM上出现大面积随机噪声条纹配置时分复用让每颗雷达错开发送窗口电池供电续航远低于预期MCU和雷达始终全速工作检查是否一直运行完整检测链路按第4.3节实现低功耗模式只有能量变化异常时切入全速模式部署后误报率随日期缓慢上升环境新增物品、家具摆放变化对比历史RDM的背景估计定期重新标定背景杂波加入环境自学习机制6.3 运维视角给现场升级预留“逃生口”最后分享一个项目管理层面的经验。很多研发团队把算法参数写死在代码里现场一有问题就要重新烧固件沟通成本极高。我强烈建议在每一个工位节点上提供远程配置接口至少能动态调整以下内容最大检测距离、动态目标阈值、呼吸频段上下限、离开确认时间、上报周期。现场调试时用MQTT下发一份JSON配置就能完成标定不用跑上跑下戳串口。再进一步好的方案还会留一个“调试模式开关”。开启后雷达节点会上报一些中间特征比如RDM峰值能量、呼吸频段信噪比、当前状态机的迁移日志。这些数据对远程排查问题帮助巨大。我遇到过好几次客户打电话说过来说误报多了远程开调试模式一看发现是工位上新装了一台空气净化器出风方向正对着雷达。如果没有调试模式这种问题光靠猜测不知道要折腾多久。7. 写在最后这个方案下一步还能怎么玩目前这套系统在设计时把“能扩展”当成了一个默认需求。除了人体存在检测60GHz毫米波雷达的数据还能挖掘出不少附加信息比如通过呼吸频率的长时间跟踪可以做疲劳状态和压力水平的粗估这在健康办公产品里相当有卖点比如通过目标在工位内的位置分布统计判断员工是在专注办公还是频繁走动能给管理者提供空间设计的参考维度。手头有资源的话我甚至考虑过把工位雷达和会议室预约系统打通实现“人到自动签到、人走自动释放”的无人化会议管理逻辑上完全说得通。我自己做完这个项目最大的体会是雷达方案的核心难点从来不在雷达本身而在于你愿不愿意花时间把场景的细节摸透。工位的物理尺寸是多少空调往哪个方向吹隔板用什么材料做的这些看起来琐碎的信息最后决定着你整套方案在真实环境中的表现。希望这篇内容能帮你少走一些弯路尤其是别在“静态人体检测”这个坎上栽跟头——那是整个方案价值最集中的地方也是毫米波雷达真正碾压传统红外传感器的地方。
