搞毫米波雷达的朋友应该都有体会:板子买回来不是拿来就能直接出点云的,尤其是想拿原始ADC数据跑自己的算法,第一步就得把IWR6843AOPEVM-G这种60GHz雷达板卡和DCA1000EVM采集板搭好,打通一条从雷达芯片到电脑网口的数据通路。这套组合在TI生态里是标配中的标配,但我见过不少人在这一步卡了好几天——要么SOP跳线没理解对,要么UDP数据抓下来不知道怎么解。这篇就按我自己实操的顺序,从硬件连到数据流解析这条链路完整过一遍,给准备入手或者已经卡壳的朋友一个参考,看完至少能把原始数据从网口抓下来并且解析成你能用的格式。
1. 先搞清楚这套硬件要解决什么问题
1.1 IWR6843AOPEVM-G到底是一块什么板子
IWR6843AOPEVM-G是TI基于IWR6843芯片做的60GHz毫米波雷达评估板。IWR6843这颗芯片工作在60到64GHz频段,具备3路发射、4路接收,内部集成了一个C674x DSP和一个ARM Cortex-R4F核,所以它算得上是一颗带完整处理链的雷达SoC。板子型号里的AOP值得单独说一下,全称是Antenna on Package,意思是天线直接封装在芯片内部,不需要外接天线板。这个设计的好处是天线馈线损耗小、整体体积小,缺点是天线方向图固定,不能像ISK系列那样随意换天线板。所以如果你做的是手势识别、存在检测、生命体征这类近距场景,AOP版本其实非常合适。
板子本身是LaunchPad外形,两侧有两排BoosterPack兼容的60pin排针,这对后面接DCA1000很关键。板上还集成了XDS110调试器,插一根micro-USB线到电脑就能枚举出串口和调试口,不需要额外买仿真器。这也意味着你只要一块板加一根USB线,就能先把官方的开箱Demo跑起来,门槛其实不高。
1.2 DCA1000EVM在整套系统中扮演什么角色
DCA1000EVM是TI官方的数据采集卡,全称Data Capture Adapter。它的作用非常纯粹:把雷达芯片通过LVDS接口输出的原始ADC数据接收下来,打包成以太网UDP报文,通过千兆网口发送到电脑。为什么需要这么一块中间板子?因为IWR6843上的UART口只能用来传输配置命令和低速率结果,根本无法承载原始ADC数据。想做点云后处理、做自己的目标检测算法,就必须拿到每个chirp每个RX通道每个采样点的I/Q数据;这部分数据速率动辄几十上百Mbps,只有LVDS这种高速差分管脚能搬出来,而电脑又不直接吃LVDS信号,所以DCA1000就是那个把雷达差分信号翻译成电脑能收的UDP数据的翻译官。
还要区分一下概念:DCA1000只是采集原始数据,不做任何信号处理。FFT、CFAR、聚类这些统统在后端用MATLAB、Python或者DSP去算。这也是它和板载DSP处理模式最大的区别——用DCA1000抓数据,相当于把雷达当成一个“传感器前端”,算法完全自己掌控。
1.3 为什么非要抓raw data,直接用Demo不香吗
如果是想快速验证毫米波雷达能干什么,官方SDK里的点云Demo确实够用,开箱就能在mmWave Demo Visualizer里看到目标点。但Demo能告诉你的只有结果,看不到过程。当你需要调整发射波形、改变chirp参数、优化检测门限,或者做Demo里没有的功能时,没有原始数据就只能瞎猜。举个我自己的例子:做呼吸检测时,胸壁微动的多普勒频率只有0.2到0.6Hz,这种细微信号必须从原始ADC数据的相位里提取,点云Demo根本给不了这个信息。所以抓raw data不是炫技,是真正做雷达算法的必经之路,也是IWR6843AOPEVM-G加上DCA1000EVM这套组合最大的价值所在。下面正式开始讲怎么搭起来。
2. 硬件连接与上电:容易踩坑的前十分钟
2.1 物料清单和板卡接口
动手之前先把东西准备齐,别等到接了一半才发现少根线。我这套配置的完整清单如下:
- IWR6843AOPEVM-G雷达评估板一块
- DCA1000EVM采集板一块
- 5V/2.5A及以上直流电源一个,接口是圆头DC插头
- 千兆网线一根
- micro-USB线至少两根
- 一台带千兆网口的电脑,Windows系统(mmWaveStudio目前只有Windows版本)
接口方面,重点认识几个位置。IWR6843AOPEVM-G的USB口有两个用途,一个是XDS110的调试和数据口,枚举出来是两个串口,另一个是电源指示灯附近的结构。DCA1000EVM上面有一个网口、一个DC电源接口、一个控制用的micro-USB口,还有一组用来和雷达板互联的60pin连接器。实际操作时,雷达板是叠在DCA1000上面的,两边的60pin排针对准插稳。
2.2 连接顺序与SOP跳线设置
我建议的连接顺序是:先把DCA1000平放,再把IWR6843AOPEVM-G对准插槽轻轻压下去,确保两侧排针全部到位,然后接DCA1000的电源、网线、控制USB,最后接雷达板的USB线。这个顺序能避免带电插拔连接器导致信号引脚损坏。
接着就是全场最关键的一步——设置SOP跳线。IWR6843AOPEVM-G板上有SOP0、SOP1、SOP2三个跳线帽,它们组合决定雷达芯片的启动模式。常见两种模式:烧写模式(Flashing)和功能模式(Functional)。配合DCA1000用mmWaveStudio抓数时,板子必须处于功能模式。按我这块板子的用户指南,功能模式对应SOP0短接、SOP1和SOP2断开,即SOP[2:0]=001;烧写模式则是SOP2和SOP0短接、SOP1断开,即101。不同批次板子可能有差异,动手前第一件事是翻配套的用户指南确认这张表,新手最容易在这里栽跟头。
注意:如果之前用烧写模式往板子里写过程序,切回功能模式前记得把跳线全部重新核对一遍。SOP设置错误最典型的症状是mmWaveStudio加载固件后没有CLI回显,或者雷达根本没有启动。遇到这种问题先别怀疑软件,先回来检查跳线。
2.3 供电与网络配置
供电上,DCA1000板载一个5V圆孔电源接口,官方推荐的做法是给DCA1000接5V/2.5A以上电源,由它通过底部的60pin高速连接器给雷达板供电。雷达板的micro-USB只接数据线用来做串口调试,不要指望USB口给整套系统供电。我之前试过只用USB供电跑数据,小帧率还能凑合,一旦把chirp数和帧率拉高,系统就莫名其妙复位,后来换成独立电源再没出现过。
网络配置是另一个高频翻车点。DCA1000的默认IP是192.168.33.180,电脑网口要设置成同一网段的静态IP。我这边习惯配置成192.168.33.30,子网掩码255.255.255.0,默认网关可以不填。具体操作是Windows的网络适配器设置里,找到连DCA1000的千兆网卡,手动指定IP。配置完成后,用ping 192.168.33.180验证连通性,能通再继续。同时建议把Windows防火墙对专用网络的拦截暂时关掉,或者放行UDP端口,否则后面mmWaveStudio会连不上DCA1000或者收不到数据。
2.4 上电自检:如何判断硬件已经Ready
硬件接好、网络配好后,先别急着开软件,做一次快速自检。给DCA1000上电,雷达板上的电源指示LED应该点亮,DCA1000上的FPGA相关LED也会亮起。在电脑的设备管理器里,应该能看到两个XDS110枚举的COM口(一个应用串口、一个调试串口),以及DCA1000的控制串口。如果只看到一个COM口或者看不到任何新设备,大概率是USB线质量问题——毫米波雷达板对USB线材比较挑剔,带屏蔽的优质线能省掉很多玄学问题。
网口层面,ping DCA1000能通说明FPGA已经跑起来。这时把雷达板和DCA1000的USB线都插好,打开mmWaveStudio前做好记录:哪几个COM口分别是谁。区分方法很简单,拔掉DCA1000的USB看哪个口消失,剩下的就是雷达板的两个XDS110口。这一步花两分钟,后面配置RS232端口时能少很多头大的事。
3. 软件环境与固件准备
3.1 mmWaveStudio安装与MATLAB Runtime
数据采集的主控软件是mmWaveStudio,到TI官网下载最新版本即可,建议用2.x以上的版本,界面和稳定性都更好。安装前有个前置依赖——MATLAB Runtime。mmWaveStudio很多底层绘图和数据处理功能跑在MATLAB Runtime上,版本匹配非常严格,装错版本会导致软件闪退或者DCA1000连接失败。我的做法是先看mmWaveStudio安装说明里要求的Runtime版本号,再单独去MathWorks官网下载对应版本,安装完成后重启电脑再装mmWaveStudio本体。装完后在开始菜单能看到mmWaveStudio快捷方式,第一次启动会比较慢,因为要初始化MATLAB Runtime环境。
3.2 串口识别与驱动
正常情况下,插上IWR6843AOPEVM-G的USB线后,设备管理器里会出现两个以“XDS110 Class”开头的COM口,分别对应Application/User UART和Auxiliary Data Port。DCA1000的控制口则是以“FTDI”或“Communications”开头的COM口,具体名称和驱动版本有关。如果设备管理器里出现黄色感叹号,需要手动装TI提供的XDS110驱动,一般位于mmWaveStudio安装目录的common子文件夹下。DCA1000的FTDI驱动如果没识别到,可以从其用户指南附录找驱动路径。
有个实用技巧:把所有相关USB设备都插好后,在设备管理器里记下每个COM号,然后逐个拔插确认对应关系,把这个对照表写在记事本里。mmWaveStudio配置RS232时只需要填两个串口号,填错一个都会导致固件加载失败,提前记清楚能省大量排查时间。
3.3 DCA1000固件/FPGA版本检查
DCA1000上有一块FPGA负责把LVDS数据打包成UDP,FPGA的固件版本必须和mmWaveStudio兼容。版本不匹配时,mmWaveStudio虽然能连接DCA1000,但会在配置数据模式时报错,或者采集时收不到任何数据。官方提供了一款命令行工具DCA1000EVM_CLI_Control,在mmWaveStudio安装目录的Scripts子文件夹下能找到,配套有使用说明文档。通过这个工具可以查询FPGA版本,也可以升级固件。
我的建议是拿到板子后先查询一次版本,然后对照mmWaveStudio文档需要的版本。如果版本过旧就升级,升级过程是通过DCA1000的控制串口把FPGA镜像写入板载Flash,操作时确保电源稳定,不要中断。升级完成后重新上电,再用查询命令确认版本号已经更新。
4. 用mmWaveStudio完成一次实际数据采集
4.1 启动与连接流程
mmWaveStudio打开后,界面左侧是雷达设备相关设置,下方有DCA1000的选项卡。第一步先在顶部的“Radar Device”区域选择芯片型号,我这里是xwr68xx,并在Board类型里选择对应的IWR6843AOP型号,然后点击“Set & Save”保存配置。这里要特别留意,型号选错会导致后续固件加载失败,而且报错信息并不直观。
接着配置RS232通信端口。在RS232 Setup区域,把之前记录好的两个XDS110串口号分别填入Port1和Port2,点击“Set & Save”。实际使用中,哪个口填Port1、哪个填Port2需要试一次——如果加载固件后CLI窗口没有回显,把两个口对调再试。之后点击“Load”按钮选择固件文件。IWR6843固件分为两个镜像:radarss(雷达子系统)和mss(主控子系统),选择后mmWaveStudio会通过UART把固件烧到雷达芯片的RAM里。
DCA1000的连接在“DCA1000”选项卡里,点击“Connect”按钮,软件会通过网口连接DCA1000的192.168.33.180地址。连接成功后,界面上的FPGA版本号会显示出来。如果点击后长时间没反应,先ping一下DCA1000,ping不通就检查网线和电脑防火墙;通了还连不上,多半是mmWaveStudio的以太网配置里默认IP和当前电脑IP不一致,需要手动核对。
4.2 传感器参数配置(Profile/Chirp/Frame)
这是整个采集流程里最需要动脑子的部分,因为参数直接决定你抓到的数据长什么样。毫米波雷达的波形参数分三层:Profile配置定义一组chirp的公共参数,Chirp配置在Profile基础上做递增或微调,Frame配置定义一帧里有多少个chirp循环、多少帧连续采集。
以我常用的一组近距参数为例:起始频率60.25GHz(也可以到62.5GHz附近),扫频斜率30MHz/us,ADC采样点数128,采样率2000ksps,帧周期50ms,每帧16个chirp循环,3个发射天线做TDM-MIMO。这样一帧数据就是16×3=48个chirp,每chirp有4个接收通道、128个采样点。mmWaveStudio的SensorConfig选项卡里,把这些参数填进Profile Config、Chirp Config和Frame Config对应位置。这里有个新手容易忽略的地方:Chirp Config里的TX使能位要按你的天线策略勾选,想用3发4收做MIMO就把三个TX都选上;只用单通道测呼吸心跳的话,只开一个TX还能降低数据量。
参数填好后,点击“Frame Start”或“Trigger Frame”按钮,雷达就开始按照刚才配置的波形发射和接收。在mmWaveStudio的“DataConfig”里可以设置抓多少帧数据,我一般设128帧,配合50ms帧周期大约抓6.4秒,够后面离线处理用了。抓数时观察界面上的数据曲线如果能看到明显的时域波形变化,说明雷达已经在输出数据。
4.3 触发采集与数据保存
数据采集结束后,mmWaveStudio会在你指定的输出目录下生成原始数据文件。默认是一个二进制文件,里面就是所有帧拼接起来的原始ADC数据,同时还有一份JSON或文本格式的参数文件,记录了当前使用的全部传感器配置参数。这份参数文件相当重要,后面解析数据时必须用它来对齐格式,比如每chirp的采样点数、RX通道数、发射天线数等。千万别把参数丢一边只拷走bin文件,否则过几天你就得靠猜去解析自己的数据了。
另外,mmWaveStudio也支持把数据通过网络实时传给电脑上的其他程序。DCA1000默认把UDP数据发往电脑的某个端口,常见是4098端口。你可以先用Wireshark抓包看看IP和端口的实际情况,确认你能在电脑上裸收一套UDP流。这为后面自己写数据接收程序提供了基础,也是理解整个数据流链路的最直观方式。
5. 数据流解析:从网口到numpy
5.1 UDP包结构
DCA1000通过千兆网口把LVDS收到的原始数据封装成UDP报文发送。每个UDP包的载荷不是纯数据,前面固定有8字节的头部信息,以下是我常用的字段理解:
| 字节偏移 | 内容 | 说明 |
|---|---|---|
| 0-3 | Magic Word | 固定值0x02 0x01 0x04 0x03,用于识别有效包 |
| 4 | Version | 固件版本信息 |
| 5 | Total Length | 通常为8,表示头部长度 |
| 6-7 | Byte Count | FPGA发送的数据量计数,以KB为单位,用于连续性检查 |
头部之后就是真正的ADC数据载荷,每个UDP包最多携带1448字节的有效数据。整包UDP载荷长度约为1456字节,这个设计刚好让整包不超过以太网MTU,避免分片。你解析时第一件事就是检查Magic Word,如果不是这个固定值,说明抓包位置不对或者数据被防火墙改过。
5.2 原始数据排列规则
搞清楚UDP包头之后,更大的坑在于数据内部的排列顺序。IWR6843用复数采样(complex1x模式)时,ADC数据是I/Q交织存放的。按时间顺序,每个采样点在一个chirp内的排列是:RX0的I分量、RX0的Q分量、RX1的I分量、RX1的Q分量、RX2的I分量、RX2的Q分量、RX3的I分量、RX3的Q分量。也就是说,每8个int16数据对应一个采样时刻的4个通道复数数据。
chirp之间是串行的,一个chirp的所有采样点排列完,紧接着排下一个chirp的数据。如果有多发天线做TDM-MIMO,一帧里的chirp按发射天线轮换,比如3发就是TX0、TX1、TX2不断循环,直到达到配置的chirp循环数。因此,一帧数据的字节数可以精确计算:4个RX通道×128个采样点×(I和Q各2字节)=4096字节/单chirp,再乘以每帧48个chirp,就是196608字节/帧。
提示:这里说到的“每chirp为4个RX通道”是通用情况。当你关闭某些RX通道时,实际通道数会变,解析时务必以参数文件里的接收通道数为准。拿错通道数解析,出来的复数数据在频域上会是一团乱麻。
5.3 Python解析示例
知道排列规则后,解析代码就很简单了。下面是我常用的一段Python脚本,直接从UDP网络流中接收数据并解析成numpy的复数数组:
import socket import numpy as np UDP_IP = "192.168.33.30" UDP_PORT = 4098 PACKET_SIZE = 1456 HEADER_SIZE = 8 # 与mmWaveStudio配置保持一致 num_rx = 4 num_adc_samples = 128 num_chirps_per_loop = 3 num_loops = 16 chirps_per_frame = num_chirps_per_loop * num_loops # 48 bytes_per_chirp = num_rx * num_adc_samples * 4 # 每通道I/Q各2字节 # 建立UDP socket并绑定 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((UDP_IP, UDP_PORT)) # 先收齐一帧数据的字节数 frame_bytes = bytes() target_len = chirps_per_frame * bytes_per_chirp while len(frame_bytes) < target_len: packet, addr = sock.recvfrom(PACKET_SIZE) if len(packet) < HEADER_SIZE + 8: continue # 检查Magic Word:02 01 04 03 if packet[0] != 0x02 or packet[1] != 0x01 \ or packet[2] != 0x04 or packet[3] != 0x03: continue # 去掉8字节头部 frame_bytes += packet[HEADER_SIZE:] # 转成int16 data = np.frombuffer(frame_bytes, dtype=np.int16) # 重排:每个时刻8个值 -> [RX0_I, RX0_Q, RX1_I, RX1_Q, RX2_I, RX2_Q, RX3_I, RX3_Q] # 先reshape成 [总采样点数, 8] samples_per_chirp = num_adc_samples * num_rx data = data.reshape(-1, 8) # 拆I/Q,得到复数 data_complex = data[:, 0::2] + 1j * data[:, 1::2] # shape: [n, 4] # 再按chirp拆开 data_complex = data_complex.reshape(chirps_per_frame, num_adc_samples, num_rx) data_complex = np.transpose(data_complex, (0, 2, 1)) # [chirp, rx, sample] print("解析完成,shape:", data_complex.shape)这一段如果跑通并且shape符合预期,说明你从网口到numpy的链路已经完全打通。得到的data_complex数组就能直接送去做距离FFT、多普勒FFT、CFAR这些后续处理了。如果你的数据是从mmWaveStudio保存的bin文件读的,逻辑完全一样,只是少了UDP头部,直接用np.fromfile读入后从第5.2节的reshape步骤开始即可。
5.4 如何验证解析结果是对的
解析完别急着往下做算法,先花几分钟验证数据合理性,这一步能省下后面大量排查时间。我有三个百试百灵的验证方法。
第一,观察时域幅度。在一个chirp的128个采样点里,如果目标存在,幅度通常会呈现明显的起伏,不会是一根平直线。全零或者恒定常数说明要么雷达没真的发波,要么解析的通道数不对。
第二,做一次距离FFT。对每个chirp每个RX通道的128点做FFT,观察频谱峰值位置。如果前面用60.25GHz起始频率、30MHz/us斜率、128采样点、2000ksps采样率,那么距离分辨率和最大不模糊距离都是可以算出来的,峰值位置对应的距离应该和目标实际摆放位置吻合。能对上是硬道理。
第三,检查多帧之间的连续性。连续采集多帧后,同一静止目标的距离维FFT峰值应该在相同距离门附近波动,不会到处乱跳。如果峰值位置在帧间随机跳变,多半是UDP丢包导致chirp对齐错误,这种问题后面章节细说。
6. 常见问题与排查技巧实录
6.1 连接与硬件问题速查表
我把实操中遇到的典型问题整理成一张速查表,方便你对着症状找原因:
| 现象 | 常见原因 | 解决方法 |
|---|---|---|
| mmWaveStudio连不上DCA1000 | 电脑IP不在192.168.33.x网段 | 将网卡改为静态IP 192.168.33.30 |
| 连上了但FPGA版本为空 | 防火墙阻止了UDP通信 | 放行专用网络的UDP或临时关闭防火墙 |
| 加载固件后无CLI回显 | SOP跳线不在功能模式 | 核对SOP0/1/2跳线,切到功能模式 |
| 点击Load但进度条卡住 | RS232的Port1/Port2填错 | 交换两个COM口号重试 |
| 设备管理器找不到XDS110口 | USB线质量问题 | 换屏蔽良好的短USB线,直插主板USB口 |
| 采集到一半雷达复位 | 供电不足 | DCA1000改接5V/2.5A独立电源 |
这里面有几个是我反复踩过的。最典型的就是“加载固件后无CLI回显”,当时我查了一下午软件配置,最后发现是SOP跳线没改,教训相当深刻。所以硬件问题永远排在软件前面排查,顺序别搞反。
6.2 采集数量不对、丢包的几个原因
用DCA1000抓数最常见的数据问题有两类:一帧数据的字节数少于理论值,或者多帧数据长度不一致。理论上每个UDP包带一个8字节头,数据载荷是连续且按顺序到达的,如果收到的数据量对不上,优先怀疑丢包。
丢包原因通常是下面几个。第一,电脑网卡不是千兆或者网线是百兆线,DCA1000的实时数据率超过百兆网口承载能力,表现就是大量丢包。第二,mmWaveStudio所在电脑同时跑着其他大流量应用,比如网盘同步或者视频会议,抢占了带宽,采集时把这些都关掉。第三,帧配置里ADC采样率和chirp数量过高,导致瞬时数据率超过DCA1000到电脑这条链路的稳定吞吐。针对最后一点,我一般会把采样率先降到2000ksps、采样点数128,等全链路验证通了再逐步往上加。
字节计数(Byte Count)字段是排查丢包的利器。解析时可以记录每个UDP包的Byte Count,如果相邻两个包的计数值出现跳变——比如从100跳到103而中间丢失的包没有被收到——那就说明中间丢了包。丢包严重的帧建议直接丢弃重新采集,因为缺了数据的帧再做FFT会引入频谱泄漏和鬼影。
6.3 一些容易被忽略的细节
最后分享几个容易被忽略但实际很影响体验的细节。第一,DCA1000和雷达板叠放时,两者之间的60pin连接器要压到位。有些朋友怕压坏板子不敢用力,结果接触不良,数据时序不对,现象千奇百怪。插好后可以轻微晃晃看有没有松动。
第二,每次重新上电后,建议先连DCA1000再连雷达设备,顺序反了偶发连不上。这跟两侧设备的上电初始化时序有关,养成固定习惯能少很多随机故障。
第三,保存数据时给每个数据集单独建文件夹,把mmWaveStudio生成的参数文件和bin文件放一起,文件名带上日期和参数关键信息。雷达算法的调试经常需要来回对比不同参数下的数据,没有规范的文件管理,一个星期后你自己都分不清哪份数据是哪个版本配的。
我个人在整套流程跑通后最大的体会是:硬件连接这东西没有太多玄学,问题大多出在IP、供电、跳线和USB线这些基础环节。把基础打牢后,后面无论是做呼吸监测、手势识别,还是接入自定义点云算法,都能把精力集中在真正的信号处理上。如果你也刚拿到这套板子,按这个顺序一步步来,原始数据到手只是时间问题。