车外下着大雨,雨刮器开到最快档,前车尾灯在水雾里只剩一片模糊的红晕。这时候你车上的摄像头接近“失明”,激光雷达的回波也被雨滴搅得一团糟——但自适应巡航依然稳稳跟住前车,车道里突然窜出一辆电瓶车,系统照样在第一时间点了一脚刹车。这背后默默干活的,就是那个不起眼、很少被拿出来讲、但几乎每台具备辅助驾驶能力的车上都有的部件:毫米波雷达。
我见过太多想入门智能驾驶的朋友,一上来就追着摄像头和激光雷达跑,对毫米波雷达要么一笔带过,要么干脆觉得“它就是个测距的”。说实话,这个判断不太对。这篇我准备把它讲透:它凭什么在传感器组合里不可替代、它内部是怎么处理信号的、工程上用起来有哪些门道,以及为什么4D雷达、摄像头与雷达融合这些词会突然火起来。想真正理解智能驾驶,这块拼图不能少。
1. 为什么摄像头和激光雷达都替代不了它
1.1 自动驾驶的“传感器三角”
现在主流的智能驾驶感知方案,本质上是一个“三角结构”:摄像头负责看颜色和语义,激光雷达负责画高精度轮廓,毫米波雷达负责测距测速和应对恶劣天气。三者各管一摊,谁也没法完全替代谁。
摄像头最大的优势是便宜、信息量大,能识别交通标志、红绿灯、车道线,但这玩意儿怕黑、怕逆光、怕大雾、怕暴雨。大白天一切正常,一进隧道口瞬间强光它先“瞎”两秒;对向远光灯一照,画面直接过曝。更不用提雨雪天气里镜头沾上水珠,整个画面就像打了马赛克。
激光雷达呢?它能精确到厘米级,直接出三维点云,建图、定位、静态障碍物检测都很强,但两个痛点非常要命:一是贵,哪怕现在价格被打下来不少,一颗前向主雷达的成本也够买好几颗车载摄像头;二是对环境敏感,大雨天雨滴会反射激光产生大量噪点,扬尘环境下更是直接“雾化”。
这时候毫米波雷达的优势就体现出来了:它发射的是波长毫米级的电磁波,雨、雾、雪、灰尘、光照变化对它影响很小。你把它装在车头最脏的位置,蹭满泥浆它照样工作。摄像头需要“看得清”,激光雷达需要“环境透”,毫米波雷达基本不需要这些前提条件——它在物理层面就免疫了大多数让光学传感器头疼的问题。
1.2 测速:雷达的独门绝技
还有一个容易被忽略的点:毫米波雷达天生就能直接测出目标的径向速度,而且测得很准。这个能力来自物理学里的多普勒效应——目标朝向雷达移动时,反射回来的电磁波频率会变高;远离时频率会变低。频率的变化量和相对速度直接挂钩,所以雷达输出目标时,每条目标记录里天然就带速度字段。
不要小看这个能力。知道前车在减速,和“看到前车变近了”是两个层次的信息。摄像头和激光雷达要做测速,只能靠前后两帧位置差分,帧率不够或者目标抖动一下就完了。雷达直接在电磁波层面测出多普勒频移,速度精度能到零点几米每秒,而且不受目标距离远近的影响。AEB(自动紧急刹车)为什么敢在最后关头果断刹停?很大程度上就是因为雷达给的速度信息足够可靠。
1.3 “隐形守护者”不是营销话术
把毫米波雷达叫“隐形守护者”,还真不是厂商宣传片里硬造的词。它装在车标后面、保险杠内侧、后视镜附近,外观上你基本看不见,但它在整个驾驶辅助系统里承担的是最“保底”的那部分工作。光学传感器都可能被环境欺骗,但雷达不容易被骗。它是整个感知系统里最后一道不容易崩的防线。
一个比较有代表性的场景是:夜晚无路灯的高速公路,前方一辆车因为没有尾灯完全隐没在黑暗里。摄像头看不见,激光雷达因为距离远点云太稀疏也未必认得出,但毫米波雷达不受光照影响,照常返回一个“前方150米有金属反射目标,速度约20km/h”的目标。ACC自动减速,你甚至不知道发生了什么。这就是它“隐形”的另一个含义——干最关键的活,但不让你感知到它的存在。
2. 毫米波雷达是怎么“看见”世界的
2.1 从调频连续波说起
要说清楚雷达的原理,得先提一个词:FMCW,也就是调频连续波。市面上主流的车载雷达,绝大多数都是这种工作体制。
它和脉冲雷达不一样。脉冲雷达是发射一个短促的脉冲,等它碰到目标弹回来,通过时间差算距离,就像对着山谷喊一嗓子听回声。FMCW不这么做——它连续发射一个频率随时间线性变化的信号,就像一个正弦波在不停地“滑音”,从77GHz滑到77.5GHz,再跳回77GHz开始下一轮。发射信号和接收到的回波会有一个频率差,这个频率差里同时包含了距离信息和速度信息,再通过数学变换把它们拆开。
这个设计的好处很直接:连续波意味着发射功率不需要太高,器件做起来容易集成、体积小;调频又让距离测量变成了“频率测量”,而频率测量在工程上是非常成熟、精度极高的活儿。所以车载毫米波雷达才能做到巴掌大小、几十克重、功耗也不高,直接塞进保险杠后面。
2.2 距离、速度、角度是怎么算出来的
很多刚接触雷达的人以为雷达输出的就是“前方多少米有个东西”,这是把结果当成了原理。实际上一颗雷达内部要做相当多的计算,才能从一堆电磁波里抽出三个核心参数:距离、速度、角度。
先说距离。FMCW雷达发射一个频率线性上升的信号,碰到目标反射回来后,接收信号和发射信号之间会产生一个频率差。距离越远,这个差值越大,两者是严格的线性关系。所以测距的本质是测频差——用一个混频器把发射信号和接收信号乘在一起,得到它们之间那个“差值频率”的信号,这个信号叫中频信号。对中频信号做傅里叶变换,就能把不同的频率分量分出来,每个峰值就对应一个目标。
再说速度。这个就用到前面说的多普勒效应了。目标在动,回波频率就会有额外的偏移。为了把速度信息从距离信息里解出来,雷达会连续发射很多个chirp(调频斜坡),然后对同一个距离单元上的所有chirp再做一次FFT,看相位随时间的变化速率。这个速率就是目标的速度。所以距离维FFT之后往往还要跟一个速度维FFT,业界管这个过程叫“2D FFT”,这是每一个做雷达信号处理的工程师都绕不开的基本功。
最后是角度。单根天线只能测距离和速度,分不清目标到底在左边还是右边。为了测角度,雷达会用多根接收天线排成阵列,目标在不同天线上产生的相位差不一样——就像一排人同时听到同一个声音,离声源近的那只耳朵先听到,相位差由目标和阵列的夹角决定。通过比较不同天线接收信号的相位差,就能算出目标的到达角。
2.3 一条完整的信号处理链路
把上面三个步骤串起来,一条典型的车载雷达信号处理链路长这样:
- ADC采样:射频前端把中频信号变成数字信号
- 距离维FFT:把时域信号变成频域,分离不同距离的目标
- 速度维FFT:对多帧数据做二次FFT,分离不同速度的目标
- CFAR检测:在“距离-速度”二维图谱里找出超过噪声底限的峰值
- 角度估计:对检测到的峰值,利用多天线的相位差算出角度
- 聚类与跟踪:把一堆点迹聚成目标,再用滤波算法持续跟踪
这里面CFAR(恒虚警检测)值得一提。雷达接收到的信号里有大量噪声和地面杂波,如果用一个简单的固定阈值来判断“有没有目标”,阈值设太高会把小目标漏掉,设太低又全是误报。CFAR的聪明之处在于:它是一个自适应的阈值——每个检测单元周围有一个参考窗口,阈值是根据周围噪声水平动态算出来的,而不是拍脑袋定一个固定值。这样在噪底比较高的环境(比如城市里建筑反射杂波密集)也能保持稳定的检测性能。
2.4 工程里写FFT的几个实际经验
既然热词里有“毫米波雷达C++ FFT程序”,这里就多说几句工程层面的东西。我在实际项目里写雷达信号处理,FFT这块踩过的坑不算少,挑几个最典型的说。
第一个是FFT长度和频谱分辨率的关系。距离维FFT的长度直接决定距离分辨率——分辨率等于光速除以两倍的扫频带宽。比如带宽500MHz,距离分辨率就是大约0.3米,这是物理极限,不是FFT点数堆得高就能突破的。FFT点数再多,也只是让频谱采样更密,看起来更平滑,但真正把两个相近的目标分开,靠的还是带宽。
第二个是加窗。FFT默认假设信号是周期延拓的,但实际采样的信号首尾往往不连续,直接做FFT会引入频谱泄漏——一个强目标的能量会“泄漏”到旁边一堆频率单元上,把附近小目标淹没。解决办法是加窗函数,比如汉宁窗、布莱克曼窗。但代价是主瓣会变宽,也就是距离维的峰值会胖一圈,两个距离很近的目标反而更难分开了。加不加窗、加什么窗,本质是在旁瓣抑制和主瓣宽度之间找平衡,这个得根据实际场景调。
第三点是实信号和复数信号的坑。如果ADC采的是单通道实信号,频谱会是对称的,正负频率各有一份,处理不对会丢信息。工程上更常见的是I/Q双通道复数采样,直接得到完整的相位信息。写代码时一定要搞清楚手里的数据是实信号还是复数信号,别搞了半天以为有了目标,其实是镜像频率。
顺手给一个非常简化的C++风格的FFT处理骨架,让大家对整体流程有个直观感受:
// 假设adcData是单个chirp的采样点,长度为N std::vector<std::complex<float>> rangeBuf(N); for (int i = 0; i < N; ++i) { // 加窗,减少频谱泄漏 float window = 0.5f * (1.0f - cosf(2.0f * M_PI * i / (N - 1))); rangeBuf[i] = adcData[i] * window; } fft(rangeBuf, N); // 距离维FFT // 对M个chirp做速度维FFT,取出同一距离单元bin std::vector<std::complex<float>> speedBuf(M); for (int m = 0; m < M; ++m) { speedBuf[m] = rangeSpectrum[m][rangeBin]; } fft(speedBuf, M); // 速度维FFT // 在speedBuf里找峰值,乘上对应尺度系数,得到目标速度真正商用代码比这复杂得多,但核心骨架就是这两级FFT。不少培训机构拿着这段代码当“核心算法”卖,其实这只算入门的第一步。后面还有CFAR、角度估计、目标跟踪,每一步的工程坑都不比FFT少。
3. 一辆智能汽车上,雷达到底在忙什么
3.1 从ACC到AEB:雷达承担的关键任务
打开一辆带L2级辅助驾驶的车,毫米波雷达负责的工作比大多数人想象中多。ACC自适应巡航是最典型的应用:雷达持续输出前车的距离和相对速度,控制单元据此决定是加速、滑行还是制动。这里雷达输出的速度信息质量直接决定巡航全程的平顺度——速度数据抖动一下,车里的人就能感觉到一顿一顿的。
AEB自动紧急刹车同样高度依赖雷达。现在行业里普遍的方案是雷达和摄像头融合判断:摄像头先识别出“那是一个行人/一辆车”,雷达再确认“它的距离在急剧缩短”,两个条件同时满足才触发制动。这样做的原因是防误触发——只靠摄像头判断会被广告牌上的人像骗到,只靠雷达判断又分不清前方是行车还是路边的金属护栏。两者互为校验,安全性和可靠性都上了一个台阶。
还有BSD盲区监测,用的往往是安装在车辆后保险杠角落的角雷达。并线时,后方来车出现在后视镜死角里,摄像头看不到,这时候角雷达能在几百毫秒内探测到盲区里的移动目标,点亮后视镜上的警示灯。如果这时候你打了转向灯想变道,系统还会发出声音警告。这个场景里雷达的价值是“速度快、不受天气影响、能覆盖摄像头看不全的区域”。
3.2 毫米波雷达的三个“不擅长”
讲完优点也得讲讲边界,这样才能客观理解为什么需要多传感器融合。毫米波雷达有几个短板是工程上绕不开的。
第一是角度分辨率不高。受限于天线孔径的物理尺寸,传统毫米波雷达的角度分辨率通常在几度到十几度之间。什么意思呢?前方100米处两辆车并排行驶,如果它们靠得比较近,雷达可能把它们当成一个目标。如果旁边正好有金属隔离带,反射信号强,目标的位置还有可能被“拉”到隔离带附近。
第二是难以分类识别。雷达看到的目标本质上是“一团反射点”,它能告诉你这个目标有多远、多快、反射面积多大,但很难直接告诉你是人、是车、还是路边的金属垃圾桶。你非要让它做分类,只能靠反射点的形状、雷达截面积、微多普勒特征这些间接线索去猜。这也是为什么语义理解和雷达始终要配合使用——雷达提供可靠的“存在性”信息,摄像头提供“到底是什么”的语义信息。
第三是静止目标检测容易出问题。很多雷达算法为了减少地面杂波和路侧静止物体的误报,会做所谓的“静止目标过滤”:速度接近零的目标默认不报或者降权处理。这就带来一个经典问题——前方车道里停着一辆故障车,或者高速上堵车时最后一辆车是静止的,如果雷达把它过滤掉了,光靠摄像头又没及时识别出来,那AEB就很危险。所以业界现在越来越强调“静止目标检测能力”,包括多普勒盲区补偿、多帧跟踪确认这些手段,本质上都是在跟这个物理短板较劲。
3.3 目标检测的本质:“语义”和“存在”是两回事
这里想展开讲一个很多人理解上的误区。雷达做目标检测,输出的不是“车”“人”这种语义标签,而是一个个“反射点”或“目标列表”。每条目标记录一般长这样:距离、速度、角度、反射强度、可能还有微多普勒特征。
这个列表里没有“这是一辆白色轿车”这种信息。所以在融合算法里,雷达负责的始终是“目标存在性”和“运动状态”这两个任务,语义理解交给摄像头去补。听到摄像头死机就以为整个系统瘫痪,那是外行人的想法;真正做得好的系统,当摄像头失效时,会降级到“仅雷达模式”,ACC和AEB还能继续工作,只是没法识别红绿灯和车道线了。这种降级能力本身就是雷达可靠性的一种体现。
4. 4D雷达和传感器融合,工程上最硬的两块骨头
4.1 4D雷达到底“4D”在哪
这几年4D毫米波雷达被炒得很热。所谓4D,就是在距离、速度、角度这三个维度之外,多了一个高度维度。传统雷达的天线阵列是水平排列的,能分清左右,但分不清高低。4D雷达通过增加垂直方向的天线阵列,让雷达也能感知目标的俯仰角,输出类似激光雷达的稀疏点云。
多这一个维度,在实际使用中带来的变化非常明显。最典型的场景是立交桥和隧道口——一辆车开上高架桥,传统雷达会把它和目标车道上地面的车混在一起,两团反射点叠在一起,很容易误判。4D雷达因为有了高度信息,能直接分辨“那个目标在高处”还是“在路面”,立体交通场景下的目标分离能力大幅提升。
另外,4D雷达的点云密度比传统3D雷达高了不少。一些高分辨率4D雷达在近距离上甚至能勾画出车辆的轮廓。这让它在一定程度上能替代低线束激光雷达的一部分功能,比如可通行空间检测、静态障碍物识别、地面分割。虽然点云质量和激光雷达还有差距,但考虑到4D雷达的成本只有激光雷达的几分之一,不受天气影响,这个方向对量产车吸引力极大。不少车企已经在前向雷达方案里从传统毫米波雷达切到了4D成像雷达。
4.2 摄像头和雷达是怎么“对表”和“对坐标”的
既然热词里出现了“百度摄像头与毫米波雷达目标时空同步”,传感器融合的时空同步问题确实值得单独讲一讲。摄像头和雷达各自独立工作,一个输出的是图像坐标系下的像素位置,一个输出的是以雷达为原点的极坐标或笛卡尔坐标目标。要让它们的数据对齐到同一个“时间断面”和“空间坐标系”里,必须解决两个问题:时间同步和空间同步。
时间同步经常被忽略,但真的会出大事。摄像头是帧式传感器,30帧每秒,每帧图像对应一个曝光时刻;雷达是目标式传感器,每几十毫秒刷新一次目标列表,两者不是一个节奏。如果直接把最新的一帧图像和最新的雷达目标拿来融合,两者之间可能存在几十毫秒的时间差。在高速公路上,车以120km/h行驶,50毫秒就意味着车辆移动了1.7米。一个1.7米的误差放到AEB场景里,足够让整个制动判断“差一口气”。
工程上通常的做法是把所有传感器的时间戳统一到一个共同的时钟域里,然后做插值或外推,把所有数据对齐到同一个参考时刻——比如统一对齐到图像帧的时刻,把那一点的雷达目标位置按目标速度外推过去。这一步看着简单,但时间源统一这块就有很多细节:雷达和摄像头的内部时钟漂移率不一样,必须定期校准;外推依赖目标的瞬时速度,雷达输出速度抖动稍大,外推出来的位置就会晃。可以说,时空同步是传感器融合里最不性感但最容易出问题的一环。
空间同步就是标定。雷达坐标系和摄像头坐标系之间存在一个刚体变换关系:平移量和旋转量。这个变换矩阵需要通过标定实验来求,常见做法是用角反射器放在摄像头也看得见的位置,分别记录两边的观测结果,再用优化算法求解。标定做得好不好,直接决定融合效果——一个几厘米的标定误差,投射到50米外就是好几米的横向偏差,目标附近的点云和图像框就对不上。
4.3 为什么说融合的第一关是时空同步
我见过不少项目,融合算法本身写得挺漂亮,但就是效果不对。排查到最后,十有八九出在时空同步上——要么是时间戳没对齐,要么是标定参数有误差。很多时候不是算法不够先进,而是底下那层数据没对齐,再好的算法也白搭。这方面没有捷径,唯一的笨办法就是把时间戳打准、把标定流程做扎实、把每一步的误差来源都记录下来。
空间上还要注意一点:雷达波束的主瓣和旁瓣都可能被强反射物体触发,导致目标位置偏离真实位置。小区门口一排金属栏杆、路边的集装箱、施工围挡的铁皮,都会让雷达目标“看起来”出现在路中间。这时候指望融合算法去纠偏是治标不治本,真正的解法是在前端把反射点质量打分做细,把疑似多径反射、旁瓣响应的点迹降权或剔除。这个“点迹质量管理”环节,在一线工程里花的精力比很多人想象中多得多。
5. 法规、选型、测试:一线工程踩过的坑
5.1 法规怎么把雷达推向“标配”
聊法规不是要谈具体政策,而是说一个行业趋势:全球范围内,AEB这类主动安全功能正在从“高配选项”变成“准入门槛”。碰撞安全评测体系里,主动安全的权重逐年加重,AEB要覆盖的场景从城市低速扩展到夜间、恶劣天气、行人横穿等复杂工况。
这件事直接推高了毫米波雷达的需求。因为AEB要在多种光照和天气下可靠工作,单靠摄像头很难拿到高分——夜间逆光场景、雨雾天气场景,摄像头的得分天然吃亏。加上雷达融合视觉去做AEB,天生就能覆盖更多恶劣条件。所以现在很多车型即使入门版,也会至少配一颗前向雷达和几颗角雷达,法律法规和技术评分标准在其中起了很强的推动作用。
对从业者来说,这意味着一个比较确定的信号:未来相当长一段时间里,毫米波雷达的需求是稳的,不会因为激光雷达成本下降就被替代。它和摄像头、激光雷达更多是互补关系,而不是替代关系。
5.2 24GHz还是77GHz:先搞清楚你做什么场景
热词里出现了“24GHz毫米波雷达模块40m”这个说法,说明入门级24GHz模块在开发者群体里还有不少关注度。我结合选型经验说说两者的区别。
24GHz和77GHz是两个主流频段。早期车载雷达大量用24GHz,主要因为器件成熟、成本低、供应链完善。但24GHz频段的可用带宽有限,距离分辨率做不高,体积也相对大,加上车载雷达的国际趋势是往77GHz靠拢,现在新车的前向主雷达清一色是77GHz甚至79GHz。77GHz的好处是带宽大(最宽可达4GHz),距离分辨率能做到厘米级,而且因为波长短,天线尺寸可以做得很小,同样是6发8收的天线阵列,77GHz比24GHz能做得更小。
但24GHz并没有“死掉”。它成本确实低,在一些近距离场景里(比如盲区监测、开门预警、车内感知、部分商用车后装方案)仍然有应用空间。40米探测距离对这类近距离应用来说其实够用了。如果你做的是入门级开发板、教学演示、或者对体积不太敏感的工业场景,24GHz仍然可以选;如果你做的是车载前向主雷达或者追求高分辨率的项目,直接上77GHz不会错。
5.3 三个典型测试场景:井盖、隧道、静止车
实战里有很多雷达误报漏报的经典场景,我这里挑三个,每一个都是我在测试场上亲眼见过的坑。
第一个是雨天路面金属井盖。井盖反射强,雨后地面上还有一层水膜,电磁波在水膜上发生镜面反射,一个井盖可能被雷达当成一个很大的静态目标,位置还被“镜像”到路面底下或者偏向旁边。如果算法没有做好地面杂波滤除,车辆经过井盖时可能触发莫名其妙的警告甚至刹车。那套自适应阈值和地面点云分割算法,就是在这个场景里一点点磨出来的。
第二个是隧道环境。隧道里金属电缆架、墙面、其他车辆的雷达信号串扰,会造成大量的多径反射。明明只有一个目标,雷达可能报出好几个“影子目标”,距离和速度还都对不上。处理不好,ACC在隧道里会来回抽动,速度控制一冲一冲的。这种场景没有银弹,只能在信号层面做多径检测,在跟踪层面做目标生命周期管理,把位置跳变过大的“幽灵目标”及时杀死。
第三个是静止车辆目标。前面提过静止目标过滤的问题,这里展开说它的实际后果。高速快车道上一辆故障车停在路中间,没有任何运动特征,雷达速度维上是零多普勒,很容易被目标检测环节当作地面杂波滤掉。等车靠近,目标终于突破检测门限,留给系统的反应时间已经非常有限。针对这个问题,目前行业里的做法包括:保留低速目标的低置信度输出、用多帧跟踪判断目标是否持续存在、结合高分辨率点云做目标轮廓检测。每一招都不是万能的,但合在一起能覆盖绝大多数场景。
这些场景的核心经验是:雷达好不好,不要只在干净场地里测。把车开到雨夜的城市道路、隧道、工地旁边转一圈,你才能真正知道这颗雷达的算法功底到底怎么样。
5.4 车内感知:毫米波雷达的另一条增长曲线
最后聊一个热词里也提到的方向:毫米波雷达生命体征检测。它的原理还是那一套——雷达能捕捉微小的多普勒信号。人呼吸的时候胸腔会有几毫米的起伏,心跳时体表也有微弱振动,这些都是非常微弱的微多普勒特征。毫米波雷达可以隔着衣服甚至座椅检测到这些细微运动,进而判断车内是否有生命体。
这件事最有价值的落地场景是车内儿童存在检测(CPD)。每年夏天都有把孩子遗忘在车里酿成的悲剧,摄像头在黑暗环境下看不清,还可能冒犯隐私,而毫米波雷达正好适合这个场景:不依赖光照、不采集面部图像、隔着衣物也能探测呼吸。相关法规已经在推动新车标配CPD功能,这对毫米波雷达来说是一个全新的增量市场。
除了车载,这个技术方向还可以延伸到睡眠监测、老人跌倒检测、养老院看护等场景。我在前面的系列文章里也提过,一个好的传感器技术的价值,往往不在于它在一个点上的表现,而在于它的底层能力能在多少个看似不相关的场景里复用。毫米波雷达就是典型的例子——从车外到车内,从测距到生命体征,底层都是同一套电磁波感知原理。
最后想说的话
做了这么久传感器相关的工作,我越来越有一个体会:在一套智能驾驶系统里,最值得信赖的往往是那个最不起眼的部件。摄像头像人的眼睛,提供丰富的色彩和语义,但太容易受环境欺骗;激光雷达像精密的触觉,每个点都准确,但脆弱且昂贵;毫米波雷达则像人的直觉——它不告诉你这个目标是什么颜色、什么形状,但它总能在一片混沌中告诉你:“那边有个东西在靠近,注意一下。”
这大概就是它被称为“隐形守护者”的真正原因。它在绝大部分时间里不引发任何关注,但在那些光照奇差、天气恶劣、传感器纷纷失效的瞬间,它靠着一整套电磁波物理逻辑,把最基础、最可靠的安全信息送到系统手里。如果你正准备入行智能驾驶,我的建议是:别只盯着最亮眼的那个传感器,花点时间把毫米波雷达的信号处理链路吃透,把点迹跟踪的每个细节磨清楚。这些东西不性感,但恰恰是量产车上真正决定体验和安全的那部分底层功夫。