第四章:毫米波雷达模型(Radar)

各位同学,今天我们来聊聊毫米波雷达。说实话,在自动驾驶的感知家族里,雷达就像那个沉默寡言但干活最靠谱的老大哥。激光雷达再炫酷,遇到雨雾天也得歇菜;摄像头再智能,晚上光线一差就抓瞎。但雷达不一样,它几乎不受天气影响,能直接测速度,这是它最硬核的本事。

我在做传感器融合的时候,经常遇到有人问:「雷达点云这么稀疏,到底有什么用?」我的回答是——你想想看,如果一辆车从侧面高速切入你的车道,摄像头可能要到它完全进入视野才能识别,但雷达在几十米外就能捕捉到它的径向速度变化。这就是雷达不可替代的价值。

4.1 毫米波雷达工作原理

毫米波雷达,说白了就是发射电磁波,然后接收回波。它工作在毫米波段(通常是24GHz、77GHz或79GHz),波长比微波短,比红外长。这个波段的好处是:既能穿透雨雾,又能保持较高的分辨率。

核心原理其实就三个字:测距、测速、测角。

  • 测距:通过发射信号与回波的时间差来计算距离。FMCW(调频连续波)雷达会发射频率随时间线性变化的信号,回波与发射信号混频后得到差频信号,差频正比于距离。
  • 测速:利用多普勒效应。目标运动会导致回波频率发生偏移,这个偏移量直接对应径向速度。
  • 测角:通过天线阵列的相位差来估计目标方位角。天线越多,角度分辨率越高。

我记得刚接触雷达时,总觉得FMCW的数学推导很绕。后来我换了个角度理解:你扔一个石子到水里,波纹扩散出去。如果有个小船在漂,波纹碰到船会反射回来。你测量发射和接收的时间差,就知道船有多远;如果船在动,反射波的频率会变,你就能算出它的速度。就这么简单。

关键参数速查表

参数典型值说明
工作频率77 GHz主流车载雷达频段
最大探测距离200-300 m取决于发射功率和目标RCS
距离分辨率0.1-0.5 m与带宽成反比
速度分辨率0.1-0.5 m/s与帧周期有关
水平视场角±60° ~ ±90°角雷达通常更宽

4.2 Apollo中的雷达模型配置

Apollo的雷达模型设计得很灵活。它把雷达抽象成几个核心模块:发射器、接收器、信号处理器、目标跟踪器。你可以在配置文件里调整几乎所有的物理参数。

配置文件通常放在 modules/calibration/data/ 目录下,以 radar_params.pb.txt 命名。我给大家看一个典型的配置片段:

# 雷达参数配置示例
radar_config {
  radar_type: CONTINENTAL_ARS408
  frequency: 77.0e9          # 77 GHz
  bandwidth: 600e6           # 600 MHz 带宽
  max_range: 200.0           # 最大探测距离 200m
  range_resolution: 0.39     # 距离分辨率 0.39m
  max_velocity: 50.0         # 最大可测速度 50 m/s
  velocity_resolution: 0.12  # 速度分辨率 0.12 m/s
  azimuth_fov: 60.0          # 水平视场角 ±30°
  elevation_fov: 14.0        # 俯仰视场角 ±7°
  num_tx_antennas: 2         # 发射天线数
  num_rx_antennas: 4         # 接收天线数
  update_rate: 13.0          # 更新频率 13 Hz
}

这里有个坑,我必须要提醒大家。我曾经在调试时发现雷达检测到的目标位置总是有固定偏差,查了半天才发现是 mounting_position 参数没配对。雷达安装位置和朝向的偏差,会直接影响融合后的目标坐标。所以,标定参数一定要和实际安装位置严格对应。

注意:Apollo 中雷达的坐标系是 前-左-上(FLU),与激光雷达的坐标系一致。但不同雷达厂商的坐标系定义可能不同,做融合前一定要确认坐标转换关系。

4.3 多普勒效应模拟

多普勒效应是雷达的灵魂。没有它,雷达就只能测距,没法测速。在Apollo的仿真模型中,多普勒效应的模拟是通过对回波信号进行频率调制来实现的。

具体来说,假设目标以径向速度 v_r 运动,发射信号频率为 f0,则回波频率偏移为:

f_d = 2 * v_r / λ

其中 λ 是波长。对于77GHz雷达,λ ≈ 3.9mm。这意味着一个很小的速度变化,就能产生可测量的频率偏移。

在Apollo的仿真代码中,多普勒模拟的核心逻辑是这样的:

// 伪代码:多普勒频移计算
double ComputeDopplerShift(double radial_velocity, double wavelength) {
  return 2.0 * radial_velocity / wavelength;
}

// 在生成回波信号时,将频移叠加到载波上
Signal GenerateEcho(const Signal& tx_signal, double doppler_shift) {
  Signal echo = tx_signal;
  echo.frequency += doppler_shift;  // 频率偏移
  echo.phase += 2 * M_PI * doppler_shift * time_delay; // 相位累积
  return echo;
}

嗯,这里要注意一点:多普勒频移只能测量径向速度。如果目标横向运动,雷达是测不出来的。这就是为什么雷达在检测「横穿马路」的行人时,速度信息会突然丢失或跳变。我在做行人保护功能时,就因为这个特性吃过亏——行人横穿时,雷达测到的径向速度接近零,系统误判为静止物体,差点没触发制动。

避坑指南:我曾经在高速场景下,雷达突然丢失了前方静止车辆的目标。排查后发现,是因为自车速度很高,静止车辆的相对速度很大,超出了雷达的速度测量范围。解决办法是:在融合层对雷达的「静止目标」做特殊处理,结合自车运动进行补偿。

4.4 目标检测与点云生成

雷达的目标检测流程,和激光雷达有相似之处,但也有本质区别。激光雷达直接输出三维点云,而雷达输出的是「检测列表」——每个目标包含距离、速度、角度、RCS(雷达散射截面积)等信息。

Apollo中雷达点云的生成流程大致如下:

  1. CFAR检测:恒虚警率检测,从噪声中提取有效目标。这一步会生成距离-多普勒图上的峰值点。
  2. 角度估计:通过天线阵列的相位差,计算每个检测点的方位角和俯仰角。
  3. 聚类与跟踪:将相邻的检测点聚合成目标,并建立时间上的关联。
  4. 点云生成:将每个检测点映射到三维空间,形成稀疏的雷达点云。

我画了一张流程图,帮大家理清这个逻辑:

Apollo 雷达点云生成流程 ① 原始回波信号 ② CFAR 恒虚警检测 ③ 角度估计(MUSIC/FFT) ④ 聚类与目标跟踪 输出:雷达点云 + 目标列表 距离-多普勒图 提取有效峰值点 计算方位角/俯仰角 DBSCAN + Kalman滤波 稀疏但含速度信息

雷达点云和激光雷达点云最大的区别是什么?雷达点云自带速度标签。每个点除了 x、y、z 坐标,还包含径向速度 v_r。这个信息在做动态目标检测时非常有用。

我举个例子。在Apollo的感知模块中,雷达点云会先经过一个「速度一致性检查」:如果某个点云的速度与周围点云差异过大,它很可能是多径反射或噪声,会被过滤掉。这个技巧我在实际项目中屡试不爽,能有效降低虚警率。

实战经验:雷达点云的稀疏性决定了它不适合做精细的障碍物轮廓识别,但非常适合做目标检测和跟踪。我的建议是:用雷达做「检测」,用激光雷达做「分割」。两者互补,效果远好于单一传感器。

最后说一句,雷达模型调试时,我最常遇到的问题是「目标跳变」——同一个目标在连续帧中位置突然变化很大。这通常是因为雷达的角度分辨率不够,或者目标RCS不稳定。解决办法是:在跟踪层增加运动模型约束,比如用恒定速度模型或恒定加速度模型来平滑轨迹。

好了,这一章的内容就到这里。雷达模型虽然看起来不如激光雷达「炫酷」,但它在实际工程中的重要性,怎么强调都不过分。希望大家能动手在Apollo里跑一跑雷达仿真,感受一下不同参数对检测效果的影响。

可可精品资料库