
简介本资源面向本科及硕士阶段雷达信号处理方向的教研与学习者提供基于TI IWR6843ISK毫米波雷达硬件平台的室内人员检测完整MATLAB实现方案涵盖点云生成、DOA估计含MUSIC算法、CFAR检测、DBSCAN三维聚类、运动目标跟踪等核心环节。压缩包共23个文件包含17个MATLAB源码.m——如range-doppler处理、angle FFT波束成形、cluster tracker状态机更新等关键模块4个实测ADC原始数据bin文件含静止/行走/多目标场景1个数据说明文本与1个备份asv文件整体大小287.17MB结构清晰、模块解耦度高便于分步调试与算法替换。已有3084人学习下载配套代码基于MATLAB 2019a开发注释详尽支持直接运行与参数调优特别适合毫米波雷达入门实践、课程设计及毕业课题参考。 有次接到一个办公室人员检测的小项目客户第一句话就是不能装摄像头。工位后面有人午休、打盹、吃零食领导不想搞实时监控画面觉得心理压力太大。我最初试过红外热释电传感器结果一个同事靠在椅背上刷手机十分钟系统就判定“人已离开”体验非常糟糕。后来方案落到TI毫米波雷达IWR6843ISK上配合Matlab做数据后处理才算是把这个室内人员检测需求真正跑通。这套东西能做的事很多不只是办公室养老院房间里的存在检测、卫生间跌倒预警的前置判断、仓库重点区域入侵防范、智能家居的室内人员定位都可以用同一套逻辑迁移。本文我按自己从零开始的完整过程来写从为什么选这颗雷达、硬件环境准备到FMCW信号处理的每一步再到Matlab代码怎么解析数据并给出“有人/没人”的判断最后是实测踩过的坑和调参经验。适合刚接触毫米波雷达、手里有一块IWR6843ISK开发板却不知从何下手的工程师以及准备做室内人员检测方案选型的产品和技术人员参考。1. 室内人员检测的需求矛盾为什么最终选了IWR6843ISK1.1 常见检测方案的短板室内人员检测和门外周界安防不一样它有一个核心矛盾既要一直知道房间里有没有人、人在哪、在不在动又不能用侵犯感太强的手段长期采集。摄像头是最直接的方案但一到办公、居住场景就面临隐私合规问题而且弱光、逆光、遮挡都会显著影响识别率。被动红外(PIR)便宜但只能感知“红外辐射变化”人静坐、熟睡时红外辐射几乎不变传感器会直接当成没人——这是体验上最大的硬伤。超声波雷达可以用但大房间多径反射非常严重墙角、家具、人的姿态稍一变回波就乱了。WiFi感知方案虽然这两年研究很热但精度、稳定性受到环境影响太大工程落地离成熟还差一截。1.2 毫米波雷达的差异化能力毫米波雷达的不可替代性在于三点一是多普勒效应极其灵敏不仅能检测运动的人还能通过胸腔起伏、呼吸带来的微多普勒分量感知静止的人二是不成像输出的是点云坐标不涉及人脸、身形等个人敏感信息天然契合隐私要求三是对光照、尘埃、轻质遮挡物不敏感安装位置灵活。我选IWR6843ISK说到底是因为它把天线、射频前端、DSP和MCU集成在了一颗芯片上从原始ADC数据到点云输出都可以在板上完成上位机只负责接收和决策开发门槛比纯射频方案低很多。1.3 IWR6843ISK的核心规格和适用边界IWR6843ISK工作在60-64GHz工业频段属于低功耗版本板载集成天线不需要手动设计射频天线开箱就能用。3发4收的天线布局通过时分复用可以形成一定规模的虚拟阵列具备角度测量能力。常规配置下距离分辨率约3.75cm对室内人员检测来说绰绰有余。项目参数说明工作频段60-64 GHzISK为工业级低功耗版本天线3 TX / 4 RX集成天线支持角度估计单片集成RFDSPMCU板内完成距离FFT、多普勒FFT、CFAR和点云输出典型距离分辨率约3.75cm依赖4 GHz扫频带宽最大不模糊距离可配置通常几十米室内场景常用10-20m即可数据接口UART / LVDS上位机常用UART接收TLV帧数据在这篇文章对应的项目里IWR6843ISK负责输出人员点云和速度信息Matlab负责把点云变成“房间内是否有人存在”的判定结果并显示轨迹整条链路分工清晰。下面我从拿到开发板开始把每个环节都过一遍。2. 拿到开发板后的第一课环境搭建与快速跑通Demo2.1 硬件认识与电源注意点BOOSTXL-IWR6843ISK这块板子上面集成了IWR6843芯片、天线阵列、电源管理以及XDS110调试器。通过USB口连接电脑后系统会识别出两个虚拟串口和XDS110调试接口其中一个串口用于输出检测数据另一个用于配置命令。很多初学者在这里会卡住插上USB后设备管理器里看不到串口。不用急先检查是否安装了XDS110驱动TI的开发环境安装目录里一般都有驱动包手动指定路径安装一次即可。电源方面需要单独强调一下纯USB供电在某些配置下容易导致雷达发射功率不足、数据异常特别是当板子连着调试器同时工作时。我实际测试下来用独立5V/2A以上的适配器给板子供电会更稳定。接线很简单但这一条能帮你省掉很多“信号时有时无”的排查时间。2.2 软件工具链怎么搭跑通这套项目需要装的东西有:Code Composer Studio(CCS)、mmWave SDK、UniFlash以及用于快速验证的mmWave Demo Visualizer。我用的是较新版本的mmWave SDK里面已经包含了IWR6843ISK的驱动、demo和配置工具。建议安装顺序是先装CCS再装SDK最后装UniFlash。Demo Visualizer是一个网页版工具不需要单独安装它可以连接串口实时显示距离-多普勒热图、点云和CFAR检测结果。如果你不想自己写任何代码只想先看看雷达能输出什么最快的方式是用UniFlash烧录一个现成的bin文件然后浏览器打开Demo Visualizer选择IWR6843ISK选择对应串口加载一个cfg配置文件然后就能在网页上看到雷达“看到”的区域。这里最容易踩的坑是固件版本和Demo Visualizer版本不匹配导致连接成功但不出数据。我的经验是一定要在同一个SDK版本目录下找配套的bin和cfg不要混用不同版本的固件。2.3 烧录、连接与验证的完整流程第一遍建议按这个顺序走每一步都确认成功再做下一步1. 用USB线连接IWR6843ISK和电脑确认设备管理器出现两个串口和XDS110设备。 2. 打开UniFlash选择IWR6843ISK型号加载SDK中对应的demo bin文件点击烧录。 3. 烧录完成后按一下板子上的复位键。 4. 打开Demo Visualizer选择IWR6843ISK选择串口点击连接。 5. 在Demo Visualizer中加载同一版本的cfg配置文件。 6. 人站在雷达前左右移动观察距离-多普勒热图和点云窗口是否出现响应。其中第5步的cfg文件是雷达的“心跳配置”它决定发射波形、帧结构、检测门限等一系列参数。Demo Visualizer里内置了默认cfg但不同工况建议自己微调。我建议第一次跑通不要改任何参数先用默认值确认链路没问题。实际项目里我在默认参数上改动的部分包括降低CFAR阈值以减少漏检、调整速度门限滤除风扇等环境干扰这些后面会详细展开。2.4 跑通Demo后建议马上做的一件事确认Demo能出点云之后不要急着写Matlab先花10分钟熟悉数据格式。TI的雷达数据通过UART以TLV(Type-Length-Value)格式打包输出也就是说一帧数据里先有一个Header后面跟着若干个TLV块每个TLV块有自己的类型和长度。人员的距离、速度、坐标、强度等信息就放在不同类型的TLV块中。这一步看起来枯燥但直接影响后面Matlab解析代码的可靠性。TI的mmWave SDK文档里有专门的packet结构说明建议把“TLV Header结构”和“Detected Points数据结构”两页打印出来放在手边后面写Matlab解析时会反复对照。3. FMCW信号处理链路拆解从chirp参数到人员点云输出3.1 中频信号与距离测量的直觉理解IWR6843ISK发射的是FMCW线性调频信号也就是频率随时间线性上升的chirp。信号碰到人体后反射回来与当前发射信号混频得到的中频信号频率对应了目标距离。这个过程用生活化类比来想你在山谷里大喊一声“你好”听到回声是低频的“你——好”因为声音频率本身没变但如果你一边喊一边让音调慢慢升高回声回来时你是用更高的音调继续喊的两者叠加会产生一个拍频拍频越高说明反射物越远。FMCW雷达就是这个原理只不过把声音换成了60GHz的电磁波。中频频率f_IF与目标距离R的关系是f_IF S * 2R / c其中S是chirp的调频斜率c是光速。所以只要做一个FFT把中频频率找出来距离就出来了。这一维处理叫Range FFT也就是距离维FFT。3.2 距离分辨率和速度分辨率的计算方法距离分辨率由扫频带宽B决定ΔR c / (2B)IWR6843ISK的典型扫频带宽可以做到4GHz左右对应的距离分辨率约3.75cm。这个数值意味着两个相距不到4cm的目标在距离维上可以被区分开对人员检测来说完全够用了甚至能把同一张办公桌前的两个人分出来。速度维的核心是多普勒效应。同一个距离门上的目标如果存在径向速度v那么相邻两个chirp回波之间会产生一个相位差通过第二次FFT就能提取这个相位差对应的多普勒速度。速度分辨率的计算公式是Δv λ / (2 * T_c)其中λ是波长T_c是chirp周期。60GHz频段的波长约5mm假如chirp周期是100微秒速度分辨率就是0.025m/s也就是25mm/s。这个分辨率非常关键因为人体呼吸带来的胸腔表面运动速度大约在几毫米到几厘米每秒量级只要速度分辨率足够高静止的人也能在速度维显形。这也是毫米波雷达和大雷达相比在室内人员检测上的杀手锏。3.3 二维FFT与CFAR检测做完Range FFT再做Doppler FFT得到的是距离-多普勒二维热图。图上的每个峰值点对应“在某个距离上、以某个速度运动的反射体”。但热图里不仅有人体回波还有墙、地板、桌椅的静态杂波以及噪声所以不能简单把超过某个固定幅度阈值的点都当目标。这就需要用CFAR(恒虚警率)检测。CFAR的核心思想是对每个待检测单元用周围邻域的统计量计算一个动态阈值目标信号只要超过这个动态阈值就判为检测点。这样做的好处是阈值能自适应环境噪声在大房间角落噪声高阈值会自动抬升在安静区域阈值会降低避免漏检。IWR6843内部有CFAR检测模块配置时最关键的两个参数是参考窗长度和保护窗长度。保护窗大小用来挡住目标本身向周围泄露的能量太大会把邻近的真实目标一起滤掉太小又会让目标旁瓣引发大量虚警。3.4 点云是如何生成的经过二维FFT和CFAR之后每个检测点其实已经有距离和速度信息了。由于IWR6843ISK有多个接收天线不同天线的同一目标回波存在到达相位差通过相位比较可以估计出目标的到达角从而解算出x、y、z三维坐标。TI在板上把这一整套做完最终通过UART输出的是已经包含距离、速度、角度、坐标和强度的点云数据。所以上位机并不需要做复杂雷达信号处理Matlab要解决的是另一件事如何把点云帧流转成一个稳定的“是否有人”的决策并尽可能消除误报。3.5 一个典型cfg配置里的关键字段如果你想自己改配置建议先理解下面这些字段而不是盲目照抄网上零散的参数。下面是一个示意性的cfg片段具体版本可能有字段差异我这里是帮你看懂结构channelCfg 15 3 0 // RX通道使能、TX通道使能 profileCfg 0 60 100 7 57 66 0 40 1 256 5000 0 0 30 chirpCfg 0 0 0 0 0 0 0 1 frameCfg 0 2 32 0 50 1 0profileCfg里的核心参数包括起始频率、调频斜率、发射功率、ADC采样率和每chirp采样点数。每chirp采样点数256比较常见它直接决定Range FFT点数frameCfg里的每帧chirp数影响多普勒维分辨率chirp数越多速度分辨率越高但帧率会下降。人呼吸产生的多普勒频率通常在0.1-0.5Hz范围如果你发现速度分辨率不够第一个要调的就是帧内chirp数或chirp周期。4. Matlab端的数据解析与人员检测逻辑实现4.1 整体架构串口接收加逐帧决策IWR6843ISK通过UART把点云数据帧发出来Matlab这边的任务是用一个串口对象接收数据每收到一帧完整数据就解析一次提取出这一帧中的检测点集合然后根据这些点做存在性判断。整体架构不复杂但稳定性和实时性需要注意串口数据是字节流帧与帧之间没有间隙标识所以必须依靠数据帧头部的同步字来切帧。TI数据的帧头固定以4个魔数字节开头通常是0x0102、0x0304、0x0506、0x0708。Matlab解析时先循环读字节直到匹配到完整的魔数序列再读取Header里包含的total packet length字段根据这个长度从流中完整读取整帧数据。很多人解析出错就是因为在读取长度字段后没有做字节顺序处理雷达是小端字节序而Matlab默认按大端读取部分类型时需要显式指定。4.2 TLV帧结构解析整帧数据由Header和若干个TLV块组成我整理了一个常用TLV类型对照注意不同SDK版本编号可能略有差异具体以你实际得到的数据为准TLV类型编号常见含义说明1Detected Points点云数据包含距离、速度、坐标、强度2Range Profile距离谱通常用于调试3Doppler Profile多普勒谱通常用于调试5Range-Doppler Heatmap距离多普勒热图6Statistics统计信息如CPU负载在这个项目中最关键的是Detected Points。每个检测点通常由一个结构体描述包含水平角、垂直角、距离、速度、强度和信噪比等字段。解析时要注意点云坐标系的定义雷达默认坐标系中x轴指向雷达正前方y轴指向左z轴向上所以拿到点云后画散点图时我习惯把x-y平面绘制成俯视图能直观看到人员位置。4.3 人员存在性判别的核心逻辑点云本身不等于“有人”因为墙角反射、闪烁的金属面、小动物、风吹动的窗帘都会产生点云。我最后实现的判定逻辑分四层从单帧到多帧逐步收紧判断第一层是物理范围过滤。室内人员检测通常只关心某个区域比如雷达前方0.5m到8m、横向±4m、高度0到2.5m超出这个范围的点直接丢弃。这一步能滤掉大量窗外、墙外杂波。第二层是速度过滤。风扇叶片、空调出风口等环境干扰的多普勒速度往往偏高且离散而人体正常活动的速度通常在0到1.5m/s之间。将速度绝对值大于某个门限的点滤除后虚假点大幅减少。这里要注意人员刚坐下来时速度接近0不能把低速点全滤掉否则刚坐下的人会被判定为消失。第三层是聚类。保留下来且满足条件的点云按三维欧氏距离聚成簇。这里用最简单的近邻聚类就能跑得很好遍历所有点当新点与已有簇中心距离小于0.8m时并入该簇否则新建簇。每个簇可以看作一个候选目标聚类点数太少的小簇多半是噪点直接丢弃。第四层是多帧平滑。单帧有簇不代表人在因为CFAR偶尔会跳出一个孤立的强反射点。我采用滑动窗口统计连续30帧中某个候选目标出现的帧数超过21帧才确认“人员存在”。这个方法会让响应延迟大约0.6秒但能显著降低误报。4.4 核心Matlab代码实现串口接收部分我用serialport接口实现因为serialport在较新版本Matlab中更稳定不像老的serial对象经常出现串口释放问题% 创建串口对象波特率与雷达配置一致我使用的是921600 s serialport(COM3, 921600, ByteOrder, little-endian); s.Timeout 1; % 持续读取并解析 for frameIdx 1:300 rawData read(s, s.BytesAvailableFcnCount, uint8); % 这里需要调用你自己写的TLV解析函数 [points, isHuman] parseTlvFrameAndDecide(rawData); % 可视化与记录 if ~isempty(points) scatter(points.x, points.y, 8, points.velocity, filled); xlim([-4 4]); ylim([0 8]); title(sprintf(Frame %d, 检测到人, frameIdx)); end end实际项目中parseTlvFrameAndDecide函数内部会依次做魔数匹配、Header解析、TLV遍历、点云提取和聚类决策。核心的聚类决策缩略如下function [clusters, isHuman] clusterAndDecide(points) if isempty(points) clusters {}; isHuman false; return; end clusters {}; for i 1:size(points, 1) p points(i, :); assigned false; for c 1:length(clusters) center clusters{c}.center; if norm(p(1:3) - center) 0.8 % 距离门限0.8m clusters{c}.points [clusters{c}.points; p]; clusters{c}.center mean(clusters{c}.points(:, 1:3), 1); assigned true; break; end end if ~assigned clusters{end1} struct(points, p, center, p(1:3)); %#ok end end % 保留点数达到10个以上的簇视为有效人员候选 validClusters clusters(cellfun((c) size(c.points, 1) 10, clusters)); isHuman ~isempty(validClusters); end这段代码是演示性的实际工程里还需要加入速度过滤和时间平滑。我调试时的经验是聚类门限和有效点数量不能拍脑袋定最好先用雷达采集一段“人正常走进入口、坐下、离开”的样本数据把点云数据存成.mat文件在Matlab中离线调参调到误检漏检都满意后再接实时串口调试效率高很多。4.5 可视化与结果输出的实用技巧实时调试时除了画点云散点图我建议同时画出两个辅助面板一个是速度直方图可以直观看出环境干扰和人体回波在速度分布上的差异另一个是簇点数随时间变化的曲线判断平滑窗口和阈值是否合理。视觉效果上用颜色映射点云速度蓝色代表低速红色代表高速人员进入检测区域时颜色变化和位置变化一目了然。5. 实测踩坑与调优建议从能跑到可靠部署5.1 误报的五个典型来源第一空调风口和风扇叶片。它们会产生稳定且有规律的多普勒信号如果不做速度过滤系统会误判为有运动物体。风扇叶片的线速度比较快设置速度门限为1.5m/s基本能滤除。第二金属柜门和墙面。雷达信号被金属表面反射后形成虚像点有时反射路径经过墙面再到雷达会产生一个“额外的距离”在点云图上表现为一条固定弧线。遇到这种情况先观察虚像点的位置是否稳定如果稳定且处于检测区域的边缘直接用感兴趣区域(ROI)把它切掉。第三窗帘摆动。窗帘面积大、反射强一阵风吹过就会产生大片低速点云甚至会聚类成一个大簇。处理办法是给簇设定最大点数上限正常人体的有效点数量通常在一定区间窗帘的簇点数往往远超人体。但这个阈值要基于实际采集数据来定不同cfg配置点云密度可能相差数倍。第四小动物。猫狗和人体体积差异大体现在聚类的点数、空间尺寸和运动模式上。简单做法是按簇的空间高度过滤普通猫狗的身高明显低于站立的人。如果项目场景允许动物存在建议在聚类后加入目标尺寸判断而不是只看点数。第五雷达自身抖动。板子固定不稳或者被碰到会导致整个房间的背景产生“晃动”所有静态目标的多普勒都会变成非零。实测中我把雷达支架换成固定臂并加橡胶垫后这类误报基本消失了。5.2 关键参数调优对照我把这个项目里最常调的参数和调整方向整理成一张表方便你快速定位问题问题现象先调参数调整方向漏检明显人站着却不出点CFAR阈值调低阈值虚警太多无人时也出簇CFAR阈值 / 保护窗调高阈值或保护窗静止人员无输出每帧chirp数 / chirp周期增加chirp数、提高速度分辨率风扇窗帘误报速度门限 / 簇最大点数收窄速度门限、限制簇面积数据帧频繁解析失败波特率 / 串口缓冲检查串口配置、增大读缓冲响应慢人走了系统还判定在平滑窗口帧数缩短滑动窗口或减小确认比例5.3 静态人体检测的进阶思路项目做到后期我发现一个现实问题很多室内场景需要检测“静坐或熟睡的人”而不是只检测走动的人。这时候常规点云判定方案不够用因为当人完全静止时距离维几乎不变多普勒维也没有有效速度分量。但人的呼吸会带动胸腔周期性起伏这个起伏产生微弱的多普勒调制频率集中在0.2到0.5Hz。IWR6843ISK的vital signs demo正是利用这一点提取呼吸和心跳我在人员检测项目里借鉴了这个思路当速度滤波后没有明显运动点时额外检查距离-多普勒热图的低频段能量如果存在周期性的低速能量峰判定为“静止人员存在”。这个方案有兼容性代价热图数据量比点云大很多UART传输压力成倍增加帧率会下降。实际项目中我把传输模式改为只传热图中的低速子区减少数据量后又跑通了。5.4 安装位置与覆盖范围实测心得安装高度和角度直接影响检测效果。我在办公室实测发现雷达安装在2米左右高度、天线平面与水平面成25到30度俯角时覆盖效果最好。这个角度下人体反射截面较大地面杂波离雷达较远距离维上更容易分离。安装在1米高时桌椅遮挡会造成严重的漏检装到3米以上时人体点云数量会明显减少静止呼吸检测更是基本失效。5.5 下一步可以怎么扩展这套系统再往前走有两个方向一是把Matlab的实时决策逻辑移植到C语言或Python部署到边缘设备上二是接入多台雷达做房间级覆盖通过坐标变换把多个雷达的点云统一到同一坐标系下实现全屋人员轨迹跟踪。TI的Radar Toolbox中有people tracking的参考实现但真正用起来需要针对室内布局重新标定和调参不是开箱即用的。我最后的个人体会是整个项目跑通不算难难的是从“实验室能检测”到“实际房间不误报不漏检”。中间需要一遍遍采集真实环境数据、离线调参、上线验证。建议你从一开始就养成保存配置和记录数据集的习惯每次改动cfg后标注日期和现象我项目后期能迅速定位问题靠的就是这样一份参数日志。如果你也打算做室内人员检测希望这套从选型到Matlab实现再到调优的经验能帮你少走一段弯路。本文还有配套的精品资源点击获取