尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OpenRadar开源雷达:FMCW毫米波信号链与点云生成实战

OpenRadar开源雷达:FMCW毫米波信号链与点云生成实战 雷达这东西十年前还是实验室和工业设备里才见得到的黑箱子一套下来动辄几万块接口封闭拿到手的只有一串目标距离和速度中间怎么算出来的完全不知道。现在一块77GHz的毫米波开发板几百块就能买到配合开源工具链你能一路看到最底层的ADC采样点。OpenRadar这类项目干的事情就是把原来锁在厂商SDK里的那条信号链摊开给你看——从调频连续波的发射波形到距离维、速度维、角度维的三次变换再到点云怎么被检测出来。这篇内容适合三类人刚接触雷达感知、想知道数据到底怎么来的工程师做机器人或自动驾驶感知、需要自己标数据和调算法的开发者以及单纯对开源雷达这个词好奇、想搞清楚它究竟开源了什么的爱好者。下面我从一块板子的实际使用体验讲起把这条链路上的关键技术点、硬件选型的坑、以及能跑起来的最小代码路径讲清楚。1. 从一块毫米波开发板说起OpenRadar要解决的真问题我记得第一次把一块FMCW开发板接上电脑跑通官方Demo的时候挺兴奋屏幕上跳出几百个点能看出前面那堵墙和站着的同事。但兴奋劲儿过去得很快因为接下来想问的问题一个都答不上来这些点云是怎么从原始数据里冒出来的把CFAR的门限调高一点会怎样换个天线布局角度分辨率能提升多少官方工具给你的是一个封闭的流水线输入原始数据输出点云中间是个黑盒。想改一个参数就得去翻几百页的技术手册还未必找得到对应的寄存器。这正是开源雷达工具链存在的意义。它不是要重造一套硬件而是把数据怎么流、参数怎么算、结果怎么来这件事彻底透明化。理解这一点你才不会对OpenRadar有不切实际的期待。1.1 闭源雷达模组的黑盒困境大多数商用雷达模组卖给你的是结果不是过程。它内部固化了波形配置、检测门限、跟踪逻辑对外只暴露一个串口或者CAN接口吐出一组目标列表目标ID、距离、速度、角度。这种设计对做产品集成的人很友好插上就能用。但对做研究、做算法、做定制化场景的人来说几乎等于束手无策。我遇到过一个很典型的场景需要在狭小的金属机柜内部做接近感知量程只要两米但要求分辨出5厘米的间隙。用通用模组点云糊成一团因为它的波形配置和检测门限都是为室外中远距离优化的近距离强反射下饱和得一塌糊涂。想调厂商告诉你参数不可改。这种时候你除了换方案没有别的路。黑盒的第二层困境是数据不可迁移。你在A模组上标了一批数据训练了一个小模型换成B模组数据分布全变了模型得重来。开源路线最大的价值之一就是让原始I/Q数据、中间的距离多普勒图、最终的点云都能被你完整留存形成自己的数据集资产。1.2 开源雷达栈的三层结构我把开源雷达的生态粗略分成三层来看这样你在找资料的时候不容易迷路。最底层是开放硬件层包括公开原理图、天线阵列设计、射频前端选型的开发板。这一层门槛最高涉及射频布线和阻抗匹配个人玩家通常直接买现成的开发板。中间是采集与固件层负责把射频前端的模拟信号转成数字采样流并通过高速接口USB、以太网传给主机。这一层是很多开源项目的重点因为原始数据能不能拿得到决定了上层能做多少事。最上层是算法与工具层也就是常说的OpenRadar这一摊东西数据解析、距离FFT、多普勒FFT、CFAR检测、角度估计、聚类跟踪以及配套的可视化和数据集格式。这一层用Python和C写的居多也是绝大多数人真正会去用的部分。顺便提醒一句OpenRadar这个名字在社区里其实有点一名多指。一部分项目指的是天气雷达数据的开源解析库处理的是气象雷达的体扫数据格式另一部分指的是FMCW毫米波感知的工具链。你搜资料的时候如果发现内容对不上大概率是踩到了同名的另一支。先确认你要解决的是气象数据解析还是近距离感知再去挑仓库能省掉很多时间。1.3 谁适合上手谁劝退说点实在的。想玩开源雷达你至少需要这么几样东西能看懂基本的复数运算和FFT含义会写一点Python能接受对着实验数据反复试错。射频理论不需要很深但带宽决定距离分辨率波长决定速度模糊这类基本关系得心里有数。反过来如果你只想拿一个现成的距离读数做个简单的防撞开关那真没必要折腾开源路线一个几十块的超声波或者红外模块就解决问题了成本低还省心。开源雷达的价值在于你能控制整条链路代价是你得为这条链路负责。还有一个容易被低估的门槛数据量。原始I/Q数据是实打实的大文件一块四接收天线的板子一秒钟能轻松产生几百兆的原始采样。你的硬盘、内存、处理速度都得跟上。我一开始用笔记本跑光读文件就卡住了后来乖乖换成固态盘加多进程读取才顺畅。2. 拆开雷达的信号链从发射调频波到一帧点云雷达感知的核心其实就三件事这个东西离我多远、它动得多快、它在哪个方向。听起来简单实现起来是三次不同维度的傅里叶变换在配合。很多人卡住不是因为数学有多难而是没人把这三个维度串起来讲过。我按数据实际流动的顺序捋一遍你对照着自己的代码看会清晰很多。2.1 距离维FFT为什么一个chirp就能测距FMCW雷达发射的是一个频率随时间线性上升的信号叫chirp。信号打到目标上反射回来因为来回有飞行时间回来的信号在频率上就比当前发射信号落后了一截。这两个信号在混频器里一相乘差频就是一个固定的中频信号。目标越远飞行时间越长差频越高。所以只要对单个chirp的采样点做一次FFT频率轴上的峰值位置就直接对应距离。这就是距离维FFT的全部直觉。距离分辨率由扫频带宽决定公式是ΔR c / (2B)光速除以二倍带宽。带宽4GHz的话理论分辨率大概3.75厘米。注意这是理论值加窗之后实际会劣化汉宁窗大概要乘以1.3左右所以别拿理论值去卡你的精度指标。最大探测距离则受采样率限制R_max Fs × c / (2S)其中Fs是采样率S是调频斜率。这里有个经典取舍想看得远就得降低调频斜率或者提高采样率但降低斜率会同时降低带宽利用率影响分辨率。调波形参数的时候这两个指标是绑在一起动的不可能同时最优。2.2 多普勒维FFT动目标如何在慢时间维现形一个chirp只能给你距离给不了速度。要测速就得连续发一串chirp把同一距离单元上的相位变化沿时间轴再做一次FFT。这就是所谓的慢时间维处理。原理不难理解目标相对雷达运动每个chirp回波的相位会有一个固定的增量这个增量正比于径向速度。一串chirp排下来相位就在复平面上匀速转圈转速对应速度对时间做FFT峰值位置就是速度。这就是距离-多普勒图Range-Doppler Map的来源横轴距离纵轴速度每个像素的亮度代表该距离该速度上的回波强度。速度分辨率由一帧内的chirp总时长决定Δv λ / (2 × T_frame)。想分辨慢速目标之间的细微差异就得拉长观测时间代价是帧率下降动态场景下会拖影。实测中如果发现相邻两帧速度跳动很大先别怀疑算法多半是你的帧周期太长目标在一帧内已经加速了。2.3 角度维估计几根接收天线怎么撑起方位信息到这一步你有了距离和速度但还不知道目标在左边还是右边。角度信息靠的是多个接收天线之间的相位差。同一个目标到不同天线的距离略有不同回波相位因此有差异这个差异和入射角相关。对天线阵列维做第三次FFT就能把角度分离出来。角度分辨率取决于天线孔径虚拟孔径做得越大分辨率越高。这就是MIMO雷达的玩法用多个发射天线分时或编码发射配合多个接收天线合成出一个远大于物理尺寸的虚拟阵列。二发四收能虚拟出八个通道角度分辨率肉眼可见地改善。角度估计的坑在于模糊。天线间距超过半波长就会出现栅瓣同一个相位差对应多个可能角度角度谱上冒出好几个峰你分不清哪个是真的。实测中如果发现目标在左右对称位置反复横跳基本就是这个问题需要靠天线设计或者解模糊算法来压。2.4 CFAR检测与点云生成有了距离-多普勒-角度三维数据块还得决定哪些格子算有目标。最简单的办法是设一个固定阈值但噪声水平随距离和增益变化固定阈值要么在近处疯狂误报要么在远处漏掉弱目标。工程上普遍用恒虚警率检测CFAR核心思路是让阈值跟着局部噪声水平浮动在待检测单元周围取一圈参考单元估计噪声再乘一个系数作为门限。常用的有单元平均CFARCA-CFAR、有序统计CFAROS-CFAR和最大选择CFAR。CA-CFAR在均匀噪声里表现好但遇到多目标场景邻近目标的能量会污染参考窗导致门限虚高、真目标被吃掉。OS-CFAR对这种情况鲁棒得多代价是排序运算更慢。我一般先用CA-CFAR快速看结果确认数据没问题再换OS-CFAR做精调。检测出来的单元再经过峰值聚合、角度估计、坐标转换一帧点云就成型了。整个过程听起来是条直路实际调试时参数之间互相牵扯一个门限调了后面聚类和跟踪的逻辑全得跟着动这也是为什么我一直建议把中间结果全存下来别只存最终点云。3. 硬件选型的现实考量别被参数表骗了挑开发板这件事参数表能告诉你一半另一半得靠实际用起来才知道。我前后换过三块板子每次都是因为一个当初没注意的细节。下面把几个真正影响你后续开发体验的点拎出来。3.1 频段选择24GHz、60GHz、77GHz的取舍频段决定了你的带宽上限也决定了衰减特性和适用场景。很多新手一上来就盯着频段越高越好其实完全不是这么回事。频段可用带宽理论距离分辨率大气衰减更适合的场景24GHz约250MHz通用频段限制约0.6米小液位测量、中远距低速测距、成本敏感方案60GHz可达数GHz厘米级较大有吸收峰短距高精度、手势识别、呼吸心跳检测77GHz可达4GHz约4厘米中等车载、机器人避障、需要高精度点云的场景选频段的逻辑很直接你要看的距离远就选衰减小的低频段你要的分辨率细就选带宽大的高频段。两个需求同时存在的时候只能做折中。60GHz的氧气吸收峰是个双刃剑它让信号衰减快好处是天然限制了干扰半径室内多雷达共存的场景反而更省心。3.2 天线布局与MIMO虚拟孔径天线数量和排布方式对角度性能的影响比很多人想象的大。同样四收天线直线等距排布和稀疏非等距排布角度谱的表现完全不同。等距排布简单、栅瓣规律清楚稀疏排布能扩展有效孔径但会抬高旁瓣。厂家的评估板通常已经做了权衡你自己改板的话天线间距的容差控制在百分之一波长以内否则通道间相位不一致角度估计直接崩。MIMO的虚拟阵列数量是发射数乘接收数但前提是各发射通道之间要能分离。分时发射TDM最省事代价是每个发射天线的有效观测时间变短速度模糊范围缩小。做中高速目标检测时TDM带来的速度模糊得额外处理。这一点在产品资料里通常写得很轻描淡写。3.3 原始ADC数据能不能拿到这是我踩过最深的坑。有些开发板宣传得天花乱坠但只给你处理后的点云输出原始采样数据要么不开放要么需要额外买一块采集卡。你买之前一定要确认三件事能不能拿到原始I/Q数据、拿到数据的最高速率是多少、配套的采集工具在Linux下能不能跑。采集速率直接决定你能配出多宽的带宽和多高的帧率。如果采集链路的带宽不够你配了4GHz的波形实际只传回来一半数据距离分辨率就是一个假的指标。还有一点高速数据流的稳定传输非常吃主机性能USB3.0的持续写入、网卡的缓冲区设置、甚至操作系统调度都会影响丢帧率。我建议先用一台配置扎实的机器把链路跑稳再考虑往边缘设备上搬。4. 用OpenRadar跑通第一条数据流水线前面讲了半天原理现在动手。这部分我按最小可运行路径来写你可以对照着自己的数据格式改。假设你已经拿到了一块能输出原始采样数据的开发板并且用官方采集工具录了一段bin文件。4.1 环境搭建里最容易被忽略的两件事Python环境本身没什么好说的numpy、scipy、matplotlib是老四样。真正要留意的是两件事。第一别用系统自带的Python。雷达数据处理经常涉及特定版本的数值库系统Python被各种包管理器改得乱七八糟冲突起来很难查。用conda或者venv建独立环境省心。第二内存和IO要提前规划。一个几GB的bin文件如果你用np.fromfile一次性全读进来对内存是个考验。更好的做法是分帧读取或者用memmap做内存映射让操作系统去管加载。# 独立环境别偷懒 conda create -n radar python3.10 conda activate radar pip install numpy scipy matplotlib # 可视化工具按需plotly看三维点云舒服一些 pip install plotly4.2 原始数据是怎么排布的这是最容易出错的一步。原始bin文件不是简单地按采样点、接收通道、chirp顺序排的不同厂商的排布方式不一样有的按chirp优先有的按天线优先还有的把复数拆成实部虚部分开存。你必须先找到采录工具对应的文档或者社区里的解析脚本把维度对上。一个典型的排布是一帧内先遍历所有chirp每个chirp内遍历所有收发通道每个通道内是连续的采样点。按这个顺序reshape就能得到数据立方体。import numpy as np NUM_ADC_SAMPLES 256 # 每个chirp的采样点数 NUM_CHIRPS 128 # 每帧chirp数 NUM_RX 4 NUM_TX 2 ADC_BITS 16 SAMPLES_PER_FRAME NUM_ADC_SAMPLES * NUM_CHIRPS * NUM_RX * NUM_TX BYTES_PER_SAMPLE ADC_BITS // 8 def read_frame(path, frame_idx): 按帧读取避免一次性吃进整个文件 offset frame_idx * SAMPLES_PER_FRAME * BYTES_PER_SAMPLE raw np.fromfile( path, dtypenp.int16, countSAMPLES_PER_FRAME, offsetoffset ) if raw.size SAMPLES_PER_FRAME: raise ValueError(帧索引越界或文件被截断) # 维度顺序要和你采集工具的说明对齐这里是一种常见排布 cube raw.reshape(NUM_CHIRPS, NUM_RX * NUM_TX, NUM_ADC_SAMPLES) return cube.astype(np.float32)注意reshape的维度顺序必须和采集工具的实际写入顺序一致对不上不会报错只会给你一片看起来像噪声但又不是噪声的数据。验证方法是拿一个已知距离的角反射器做实验看距离谱峰值是否落在理论位置。4.3 从距离多普勒图到点云拿到数据立方体之后处理流程是三次变换加一次检测。先对采样点维做距离FFT再对chirp维做多普勒FFT然后做CFAR最后对天线维做角度FFT。def range_fft(cube): cube: [chirps, channels, samples] - 距离谱 win np.hanning(NUM_ADC_SAMPLES) spec np.fft.fft(cube * win, axis-1, n512) return spec[..., :256] # 实数信号只取正频率半轴 def doppler_fft(rd): rd: [chirps, channels, range] - 距离多普勒图 win np.hanning(NUM_CHIRPS)[:, None, None] spec np.fft.fftshift( np.fft.fft(rd * win, axis0, nNUM_CHIRPS), axes0 ) return spec def ca_cfar(power, guard(2, 2), ref(6, 6), pfa1e-4): 二维单元平均CFAR返回布尔检测图 from scipy.ndimage import uniform_filter ng, nr guard cg, cr ref k (2 * (cg ng) 1) * (2 * (cr nr) 1) \ - (2 * ng 1) * (2 * nr 1) kernel np.ones((2 * (cg ng) 1, 2 * (cr nr) 1)) kernel[ng:ng 2 * ng 1, nr:nr 2 * nr 1] 0 kernel / k noise uniform_filter(power, sizekernel.shape, modeconstant) # 简化写法严格实现需要考虑边缘和参考单元剔除 alpha k * (pfa ** (-1.0 / k) - 1) return power alpha * noise角度估计部分把同一个距离多普勒单元上的各通道复数取出来对通道维做FFT峰值位置换算成角度。虚拟阵列的通道顺序要和天线几何对应这一步错了角度会整体偏。def angle_fft(rd_map, range_idx, doppler_idx): vec rd_map[doppler_idx, :, range_idx] # 取所有虚拟通道 n 256 spec np.fft.fftshift(np.abs(np.fft.fft(vec, n))) peak np.argmax(spec) - n // 2 # 均匀线阵间距半波长时的换算 sin_theta 2.0 * peak / n return np.degrees(np.arcsin(np.clip(sin_theta, -1, 1))), spec跑通这套东西的标志是你拿着一个金属角反射器在雷达前面慢慢走动屏幕上能看到一个点云团跟着动距离读数和卷尺量出来的值差在几厘米以内。5. 实测中那些文档不会告诉你的坑代码能跑和系统能用中间隔着一条很宽的沟。下面几个问题我几乎每次搭新系统都会遇到写出来供你对照。5.1 静态杂波和直流分量雷达数据里最烦人的一股能量来自静止物体和收发机内部的泄漏。它们在多普勒维上全部堆在零速位置形成一条特别亮的横线。如果你的目标恰好是静止的这条线会把它完全淹没。常规做法是在多普勒FFT之前做一次均值相消对每个距离单元沿chirp维减去平均值。这一招对付静止杂波非常有效代价是你会同时把真正的零速目标也减掉。做生命体征检测的时候呼吸引起的胸壁起伏就在零速附近均值相消会直接毁掉信号。这时候得换成自适应杂波抑制比如对消器级联或者基于子空间的方法把静止目标里变化的那一小部分保住。5.2 相位噪声在远处会放大近距离测试的时候一切正常量程一拉远角度估计就开始飘。原因往往不是算法而是相位噪声。距离越远回波越弱信噪比下降角度维FFT对相位误差又特别敏感几个通道之间的相位一致性一旦被噪声破坏角度谱的主瓣就会展宽甚至裂开。缓解办法有三条一是提高单帧的相干积累时间用更多chirp换信噪比二是做通道间的相位校准用角反射器在正前方采集数据把各通道的固有相位偏差标定出来并在后续数据里补偿掉三是降低对远处目标的期望把有效量程定在信噪比还够用的范围内别硬撑。5.3 金属和多径会让点云凭空长东西雷达在室内环境里特别容易出鬼影。一次反射之外还有二次、三次反射信号绕墙壁和金属柜子回来落点看起来像是凭空多出来的目标。金属物体更是夸张强反射直接让接收链路饱和一个点会糊成一大片旁边的弱目标全被盖住。判断鬼影有个简单办法让目标动起来真实目标会跟着动多径产生的鬼影运动轨迹和真实目标不一致往往镜像对称或者在奇怪的位置。处理上可以靠聚类后做形状一致性筛选或者利用多帧跟踪把不稳定点滤掉。根本的解决还是靠场景布置尽量避开大面积金属反射面或者适当降低发射功率。5.4 帧率漂移和时间戳不可信如果你要和其他传感器做时间对齐这一点必须重视。开发板标称的帧周期是理论值实际受采集链路和主机调度影响帧与帧之间的间隔并不均匀。我实测过同一块板子连续采集十分钟帧周期的抖动能到标称值的百分之几做运动补偿或者多传感器融合的时候这个误差会直接变成位置误差。解决办法是尽量用硬件触发或者外部同步信号打时间戳别依赖软件侧的读取时刻。如果没有硬件同步退而求其次在数据流里插入周期性的标记信号通过标记反推每帧的真实时刻。这件事在论文里很少提但在工程上非常关键。6. 把雷达用起来几个已经被验证的方向聊完了原理和坑说几个我实际接触过、也确实能落地的方向。每个方向的难点不一样我按上手难度排。6.1 机器人避障和车载近距感知这是最成熟的应用。雷达的优势是不受光照和天气影响能直接给出径向速度对测速场景比视觉省事得多。难点在于点云稀疏一帧也就几百个点做语义分割这类任务数据量不够。工程上的常见做法是雷达加视觉或者雷达加IMU做前融合用雷达补距离和速度用视觉补纹理和类别。调这类系统时我建议先把雷达单独调到一个稳定的状态能稳定跟踪一个移动的人再接入融合框架。一上来就多传感器联合调试出了问题你根本不知道是哪一路的锅。6.2 非接触生命体征监测呼吸和心跳引起的胸壁位移在毫米级60GHz雷达的波长在5毫米左右这个位移量足以引起可测量的相位变化。做法是把回波在距离维做变换锁定人体所在的距离单元然后提取该单元上相位随时间的演化滤波分离出呼吸频段和心跳频段。听上去优雅实际很难。人体会不自觉地小幅移动这个运动幅度远大于呼吸引起的位移一不小心就把信号淹了。而且不同人的体型、姿态、穿着对回波强度影响巨大。目前做得比较稳的是呼吸率估计心跳率还是容易受干扰。6.3 天气雷达数据的开源解析回到前面提到的同名分支。气象领域有一批开源工具专门处理天气雷达的体扫数据能读取不同格式的雷达基数据做坐标转换、格点化、降水反演。这批工具的价值在于把原来绑定在特定厂商软件上的数据格式解放出来让研究者可以用通用编程语言做批量处理和算法验证。如果你做的是气象方向那你要找的是这批库和毫米波感知那套完全是两回事。数据规模是另一个量级一次天气过程的体扫数据动辄几十GB处理流程也偏向批处理而不是实时流。别指望用毫米波那套思路去处理气象数据范式不一样。6.4 室内感知和手势识别这个方向对分辨率要求高通常用60GHz。手势识别的难点在于动作的时空变化多样同一个人做同一个手势两次的轨迹都不完全一样。主流做法是把距离多普勒图序列送进时序网络让模型自己学特征而不是手工设计特征。数据采集是这个方向最耗时间的部分。我做过一个小实验采集了七八个人、十几种手势的数据光标注和清洗就花了两周。想认真做数据集的规模和多样性比模型结构重要得多。7. 性能调优与数据集让系统真正跑得动算法原理搞懂了、Demo跑通了接下来决定成败的是工程细节。这一部分讲三个容易被忽略但影响巨大的环节。7.1 点云稀疏性问题怎么处理雷达点云稀疏是先天限制天线数量、带宽、积累时间都限制着你能拿到的点数。硬要增加密度无非是加天线、加带宽、加积累时间每一条都有成本。工程上有几个实用的缓解手段。一是多帧累积把连续几帧的点云在考虑自车运动的前提下叠加等效提升密度代价是引入运动补偿误差动态目标上会有拖影。二是做多普勒维的细化处理用零填充或者超分辨算法提高速度维的采样密度代价是计算量上升。三是接受稀疏这个事实在算法层面用稀疏卷积或者点云补全网络来处理而不是硬凑密度。我个人的经验是先判断你的应用到底需要多密的点云。很多做避障的场景其实只要稳定检测出前方有没有障碍物、距离多少几百个点完全够用没必要追求视觉那种稠密程度。7.2 标注工作比模型训练更费时间雷达数据的标注是件苦差事。点云里没有颜色没有纹理只有一堆空间坐标和速度肉眼判断一个点簇是行人还是柱子得反复对照同步录制的视频。而且不同标注员对同一片点云的理解可能不一致。我的做法是建立一套半自动流程先用聚类算法把点云分成簇让标注员只判断簇的类别而不是逐点标注再利用多帧跟踪给同一目标分配持久ID跨帧继承标注最后人工复核可疑片段。这套流程能把标注效率提升好几倍。数据集格式尽量用社区通用的规范方便后续和别人交换数据或者用现成的处理工具。7.3 边缘部署的算力账要提前算如果最终要把算法搬到嵌入式平台一定要在项目早期就算清楚算力账别等到最后才发现跑不动。距离FFT和多普勒FFT的计算量相对固定CFAR是二维滑窗在分辨率高的时候会成为瓶颈角度FFT反而是最轻的。优化顺序我一般是这样先把算法用numpy写清楚保证正确性然后用profiler找出真正的热点别凭感觉猜再针对热点做定点化或者查表优化。有个反直觉的发现是很多时候瓶颈不在数学运算而在数据搬运。内存访问模式没设计好算力再强也白搭。适当的数据重排和分块处理比换更强的芯片更管用。# 用 cProfile 快速找热点别瞎猜 import cProfile, pstats def pipeline(path): cube read_frame(path, 0) rd doppler_fft(range_fft(cube)) power np.sum(np.abs(rd) ** 2, axis1) return ca_cfar(power) pr cProfile.Profile() pr.enable() pipeline(data/frame_0000.bin) pr.disable() pstats.Stats(pr).sort_stats(cumulative).print_stats(15)我在实际项目里的体会是开源雷达这条路最大的收益不是省了钱而是把整条链路的每一步都变成了你可以质疑和修改的对象。以前遇到问题只能找厂商现在你可以自己打开中间数据看一眼确认到底是波形配置的问题还是检测算法的问题。这种掌控感一旦习惯了就再也回不去了。如果你现在正准备选型我的建议是先用一块便宜的中频段板子把整条链路走一遍把数据格式、处理流程、可视化工具都摸熟再根据实际指标需求去换更高端的硬件。上来就买最贵的板子多半会因为不知道钱该花在哪个指标上而白花。
返回列表