构建自己的雷达模拟器

B站影视 港台电影 2025-06-11 17:22 1

摘要:当人们想到自动驾驶系统中的传感器时,比如自动驾驶汽车、无人机或机器人,他们通常会想象出炫酷的LiDAR单元或智能摄像头。但在幕后,雷达是实现一些关键感知功能的强大后盾。

当人们想到自动驾驶系统中的传感器时,比如自动驾驶汽车、无人机或机器人,他们通常会想象出炫酷的LiDAR单元或智能摄像头。但在幕后,雷达是实现一些关键感知功能的强大后盾。

在近十年作为工程师从事人工智能和机器人领域的工作中,我看到雷达在长距离(200米以上)检测和挑战性条件下的表现优于其他传感器:黑暗、雾天、大雨或GPS受限环境。这就是为什么雷达在从自动驾驶汽车到天气预报的各种系统中发挥着至关重要的作用。

在这篇文章中,我们将探讨雷达的基本原理——它为何重要、在哪些方面表现出色,以及它在像博世汽车雷达这样的现实系统中的应用。然后,我们将在MATLAB中构建一个简单的雷达模拟器,以理解雷达如何通过多普勒频移检测运动,并使用二维CFAR检测识别目标。

无论你是学生、工程师还是爱好者,这个实践指南将一步一步地引导你掌握基础知识。你也可以在我的Github上找到代码。

首先,让我们看看雷达相对于其他传感器的一些关键优势:

直接速度测量:与通过计算位置的时间导数来估算速度的摄像头和LiDAR不同,雷达通过多普勒频移直接测量速度变化。这对于区分静态物体(如墙壁)和移动物体(如行人或车辆)至关重要,提高了安全性和决策能力。全天候且昼夜可用:雷达不在乎是否下雨、下雪、雾气弥漫或者漆黑一片。雷达使用的电磁波可以穿透大气干扰甚至灰尘,使其比视觉系统(如摄像头甚至LiDAR)在恶劣条件下更加可靠,尤其是在远距离(200米以上)检测物体方面。适用于安全关键系统:雷达驱动了自适应巡航控制(ACC)等关键功能。在现代汽车中,它可以自主调整速度以保持安全的跟车距离,甚至可以在必要时自动刹车以防止碰撞。

和其他传感器一样,雷达也有其局限性。它可能难以检测精细的物体形状,并且在复杂环境中对近距离或重叠物体的分类效果不佳。这就是传感器融合变得必不可少的地方。

传感器融合结合了多种传感器的数据——例如摄像头、雷达、LiDAR和惯性单元——以构建更丰富、更可靠的环境理解。每种传感器都有其优点:

摄像头擅长分类和车道检测。LiDAR提供准确的三维定位。雷达则提供稳健的速度和距离测量。它们共同构成了一个多模态感知堆栈,比任何单一传感器都更加精确、有弹性且可靠。

典型的雷达系统包括波形发生器、用于传输和接收信号的天线,以及具有处理逻辑的接收器,以提取对象属性。从这,雷达可以计算出径向距离、径向速度角度

博世雷达及其组件(来源:IEEE.org)

先进的传感器如博世的汽车雷达走得更远。这些传感器被安装在一个防水罩内,包含印刷电路板上的天线和射频电路,以及用于实时分析的数字信号处理单元。现代雷达分为短程(通常视野宽,范围较低——适合停车或城市驾驶)和远程(通常视野窄,可达250米——用于高速公路和自适应巡航控制)两种。

在更高的自动化水平(L4/L5)下,雷达不仅能够检测物体,还能对其进行分类,产生对实时决策至关重要的高分辨率输出。

不同自动化级别(L1-L5)的雷达数量趋势和数量。

范围-多普勒估计是指一种雷达处理技术,用于确定检测到的目标的距离(范围)和相对速度(多普勒速度)。它创建了一个二维表示——称为范围-多普勒图——显示

范围(x轴):物体离雷达有多远,多普勒(y轴):它朝向或远离雷达移动的速度(相对速度)

类似于LiDAR,雷达基于信号往返时间来测量距离。但不同于定时光脉冲,雷达使用频率偏移的线性扫频(FMCW波形)。通过测量发射和接收频率之间的差异,雷达计算出范围:

range = (c * Δf) / (2 * sweep_slope)

雷达利用多普勒效应来估计目标速度。多普勒频移是指由于雷达与物体之间的相对运动而导致波的频率发生变化。如果物体朝向雷达移动,反射波的频率增加;如果它远离雷达,则频率降低。

velocity = (λ * Doppler_shift) / 2

现在我们已经掌握了雷达的基础知识,接下来让我们在Matlab中编写一些代码!

4、仿真管道

构建一个雷达仿真管道允许我们在没有硬件的情况下原型化雷达算法(如恒虚警率CFAR),可视化雷达实际上如何“看到”移动目标(通过范围-多普勒图),在不同的条件下测试和调整检测方法(例如杂波、信噪比、目标接近度),并更具体地理解信号链从波形生成→反射→检测——所有这些都在一个循环中完成。

它非常适合学习、实验,甚至在部署到真实系统之前验证算法。该管道按以下步骤进行:

首先根据系统要求配置FMCW波形。定义目标的范围和速度,并模拟其位移。在同一仿真循环中,处理发射和接收信号以确定拍频信号对接收到的信号进行范围FFT以确定范围最后,在第二次FFT输出上执行CFAR处理以显示目标。

仿真管道/项目布局

5、系统需求

系统需求定义了雷达的设计。不同驾驶场景的传感器融合设计需要不同配置的雷达。在这个项目中,我们遵循以下系统需求来设计我们的雷达。

扫频带宽可以根据范围分辨率确定,扫频斜率是根据扫频带宽和扫频时间计算的。

bandwidth(B_sweep) = speed_of_light / (2 * range_resolution)

扫频时间可以根据信号往返最大无模糊范围所需的时间来计算。一般来说,对于FMCW雷达系统,扫频时间至少应为往返时间的5到6倍。本例使用的是5.5倍。

T_chirp = 5.5 * 2 * R_max / c slope = bandwidth / T_chirp % chirp信号的斜率

对于初始选定的目标范围和速度:范围不能超过200米的最大值,速度可以在-70到+70 m/s范围内任意值。

完整实现可以在radar-target-generation-and-detection.m*.*中找到。

雷达规格max_range = 200; % 单位:米 c = 3e8; % 光速,单位:米/秒 range_resolution = 1; % 单位:米 fc = 77e9; % 工作频率,单位:GHz

2. 目标规格——在这里我们定义了自己的目标的初始位置和速度。假设速度保持不变。

target_pos = 110; % 单位:米 target_speed = -20; % 单位:米/秒

3. FMCW波形生成——在此雷达设计应基于上述系统需求。我们考虑最大范围和范围分辨率规格来计算带宽(B)、扫频时间(Tchirp)和斜率(slope)。

B_sweep = c / (2 * range_resolution); % 计算带宽(B) T_chirp = 5.5 * 2 * max_range / c; slope = B_sweep / T_chirp;

然后我们模拟信号传播和移动目标场景。

%% 信号生成和移动目标模拟 % 运行雷达场景随时间变化。 for i=1:length(t) % 对于每个时间戳更新目标的范围以保持恒定速度。 r_t(i) = target_pos + (target_speed * t(i)); td(i) = 2 * r_t(i) / c; % 时间延迟 % 对于每个时间样本,我们需要更新发送和 % 接收信号。 Tx(i) = cos(2 * pi * (fc * t(i) + slope * (t(i)^2)/2)); Rx(i) = cos(2 * pi * (fc * (t(i) - td(i)) + slope * ((t(i)-td(i))^2)/2)); % 现在通过混合发送和接收信号生成拍频信号 % 这是通过元素级矩阵乘法发送和 % 接收信号完成的 Mix(i) = Tx(i) .* Rx(i);

4. 范围测量——要测量位于100米处的目标的第一FFT输出:

将向量重塑为Nr*Nd数组。Nr和Nd也定义了范围和多普勒FFT的大小。Mix = reshape(Mix,[Nr,Nd]);对拍频信号沿范围bins维度(Nr)运行FFT并归一化sig_fft1 = fft(Mix,Nr); sig_fft1 = sig_fft1./Nr; % 归一化取FFT输出的绝对值sig_fft1 = abs(sig_fft1);FFT输出是双侧信号,但我们只对一侧光谱感兴趣,因此丢弃一半的样本。single_side_sig_fft1 = sig_fft1(1:Nr/2);绘制FFT输出得到以下仿真结果。figure ('Name','Range from First FFT') plot(single_side_sig_fft1); axis ([0 200 0 1]);

第一次FFT范围的仿真结果

5. 范围和多普勒测量——第二次FFT将生成一个范围多普勒图(RDM),如下图所示。

% 范围多普勒图生成。 % 2D FFT输出的图像在范围和多普勒FFT bins中有响应。因此,将轴从bin大小转换为范围和多普勒基于其最大值很重要。 Mix=reshape(Mix,[Nr,Nd]); % 使用FFT尺寸在两个维度上进行2D FFT。 sig_fft2 = fft2(Mix,Nr,Nd); % 仅取范围维度的一侧信号。 sig_fft2 = sig_fft2(1:Nr/2,1:Nd); sig_fft2 = fftshift (sig_fft2); RDM = abs(sig_fft2); RDM = 10*log10(RDM) ; % 使用surf函数绘制2DFFT输出并显示两个维度的轴 doppler_axis = linspace(-100,100,Nd); range_axis = linspace(-200,200,Nr/2)*((Nr/2)/400); figure,surf(doppler_axis,range_axis,RDM);

第二次FFT范围和多普勒的仿真结果

6. CFAR实现——二维CFAR与一维CFAR类似,但在范围多普勒块的两个维度上实现。二维CA-CFAR实现涉及训练单元占据围绕单元测试(CUT)周围单元格,中间有一个保护网格以防止目标信号对噪声估计的影响。

% 取FFT输出的绝对值 sig_fft1 = abs(sig_fft1);

步骤包括在两个维度上选择训练单元的数量和保护单元的数量,并设置阈值偏移量,

% 在两个维度上选择训练单元的数量。 Tr = 10; Td = 8; % 在单元测试(CUT)周围的两个维度上选择保护单元的数量,以准确估计 Gr = 4; Gd = 4; % 将阈值偏移SNR值(dB) off_set = 1.4;

最后但同样重要的是,滑动窗口遍历整个范围多普勒图。我们设计了一个循环,使它在范围多普勒图上滑动单元测试(CUT),并在边缘留出空间用于训练和保护单元。对于每次迭代,我们汇总所有训练单元内的信号电平。为了求和,我们使用db2pow函数将值从对数转换为线性。

然后我们对所有训练单元的总和进行平均。平均后,使用pow2db将其转换回对数,并添加偏移量以确定阈值。接下来,我们将CUT下的信号与这个阈值进行比较。如果CUT水平>阈值,则赋值为1,否则赋值为0。进一步实现如下。

% 使用RDM[x,y]作为2D FFT输出的矩阵来实现CFAR RDM = RDM/max(max(RDM)); % 归一化 % 上述过程将生成一个阈值块,比范围多普勒图小,因为CUT不能位于矩阵的边缘。因此,少数单元格不会被阈值化。为了保持地图大小相同,将那些值设置为0。 % 在完整的矩阵上滑动单元测试,注意:起点为Tr+Gr+1和Td+Gd+1 for i = Tr+Gr+1:(Nr/2)-(Tr+Gr) for j = Td+Gd+1:(Nd)-(Td+Gd) % 创建一个向量来存储每次迭代的噪声级别 noise_level = zeros(1,1); % 步进每个bin及其周围的CUT for p = i-(Tr+Gr) : i+(Tr+Gr) for q = j-(Td+Gd) : j+(Td+Gd) % 排除保护单元和CUT单元 if (abs(i-p) > Gr || abs(j-q) > Gd) % 转换为功率 noise_level = noise_level + db2pow(RDM(p,q)); end end end % 从噪声平均值计算阈值然后添加偏移量 threshold = pow2db(noise_level/(2*(Td+Gd+1)*2*(Tr+Gr+1)-(Gr*Gd)-1)); % 添加SNR到阈值 threshold = threshold + off_set; % 测量CUT下的信号并与之比较 CUT = RDM(i,j); if (CUT

CFAR实现的仿真输出

在这个仿真中,我们从头开始构建了一个雷达信号处理管道。从系统需求开始,我们通过计算带宽、扫频时间和斜率(≈2e13)等关键参数设计了一个FMCW波形。然后我们模拟了一个移动目标并生成了相应的拍频信号。

在拍频信号上应用一次FFT产生了一个范围轮廓,其峰值靠近预期的目标位置(±10米误差)。接下来,我们扩展了管道,增加了二次FFT以生成范围多普勒图,并应用二维CFAR来滤除噪声并隔离移动目标。

这个端到端的过程不仅展示了雷达如何“看到”运动,还反映了真实雷达系统如何提取可操作数据。虽然完全是模拟的,但这个管道加深了对现代雷达关键概念的理解——从波形设计到运动检测——并为更高级的信号处理和传感器融合工作奠定了基础。

8、结束语

通过这个教程,我们构建了一个雷达仿真管道,它反映了真实传感器的操作方式:从波形设计到目标运动、多普勒检测和使用二维CFAR进行噪声抑制以帮助在嘈杂环境中增强清晰度。

这种仿真不仅加深了技术直觉,还让我们更有信心地处理实际雷达系统,无论是机器人、自动驾驶汽车还是其他领域。我希望这篇文章能帮助你将抽象的雷达理论与传感器如何检测运动联系起来。我希望它提醒我们,即使没有硬件,仿真也能教会我们很多关于机器如何感知世界的知识。

来源:小火科技论

相关推荐