这个例子展示了如何为驾驶场景建模雷达的硬件、信号处理和传播环境。首先,使用相控阵系统工具箱开发雷达发射和接收硬件、信号处理、检测和估计的模型™. 然后使用自动驾驶工具箱对车辆运动进行建模并跟踪合成车辆检测™. 在本例中,使用此雷达模型跟踪高速公路驾驶场景中的检测。
这个例子需要自动驾驶工具箱。
介绍
您可以使用自动驾驶工具箱中的drivingScenario对象对车辆运动进行建模。然后可以使用车辆-地面真相生成合成传感器检测,您可以使用multiObjectTracker对象跟踪这些检测。有关此工作流的示例,请参见Simulink(自动驾驶工具箱)中使用合成雷达和视觉数据的传感器融合。本例中使用的汽车雷达使用根据高级雷达规范参数化的统计模型。本例中建模的通用雷达结构不包括特定的天线配置、波形或独特的信道传播特性。在设计汽车雷达时,或者在已知雷达的具体结构时,建议使用包含此附加信息的雷达模型。
相控阵系统工具箱使您能够评估不同的雷达架构。您可以探索不同的发送和接收阵列配置、波形和信号处理链。您还可以根据不同的通道模型评估您的设计,以评估它们对不同环境条件的鲁棒性。此建模可帮助您确定最适合您的应用程序需求的特定设计。
在本例中,您将学习如何从远程雷达的一组系统需求中定义雷达模型。然后模拟驾驶场景,从雷达模型生成检测结果。跟踪器用于处理这些检测,以生成由汽车雷达检测到的车辆的位置和速度的精确估计。
根据远程雷达要求计算雷达参数
雷达参数定义为调频连续波(FMCW)波形,如使用FMCW技术的汽车自适应巡航控制示例所述。该雷达的中心频率为77千兆赫。这种频率通常由汽车雷达使用。对于远程操作,雷达必须在车辆前方100米的最大范围内探测车辆。雷达需要分辨距离至少1米的物体。由于这是一种前向雷达应用,因此雷达还需要处理接近速度高达230公里/小时的目标。
该雷达设计为使用FMCW波形。这些波形在汽车应用中很常见,因为它们通过计算高效的FFT运算实现距离和多普勒估计。
% Set random number generator for repeatable results
rng(2017);
% Compute hardware parameters from specified long-range requirements
fc = 77e9; % Center frequency (Hz)
c = physconst('LightSpeed'); % Speed of light in air (m/s)
lambda = c/fc; % Wavelength (m)
% Set the chirp duration to be 5 times the max range requirement
rangeMax = 100; % Maximum range (m)
tm = 5*range2time(rangeMax,c); % Chirp duration (s)
% Determine the waveform bandwidth from the required range resolution
rangeRes = 1; % Desired range resolution (m)
bw = range2bw(rangeRes,c); % Corresponding bandwidth (Hz)
% Set the sampling rate to satisfy both the range and velocity requirements
% for the radar
sweepSlope = bw/tm; % FMCW sweep slope (Hz/s)
fbeatMax = range2beat(rangeMax,sweepSlope,c); % Maximum beat frequency (Hz)
vMax = 230*1000/3600; % Maximum Velocity of cars (m/s)
fdopMax = speed2dop(2*vMax,lambda); % Maximum Doppler shift (Hz)
fifMax = fbeatMax+fdopMax; % Maximum received IF (Hz)
fs = max(2*fifMax,bw); % Sampling rate (Hz)
% Configure the FMCW waveform using the waveform parameters derived from
% the long-range requirements
waveform = phased.FMCWWaveform('SweepTime',tm,'SweepBandwidth',bw,...
'SampleRate',fs,'SweepDirection','Up');
if strcmp(waveform.SweepDirection,'Down')
sweepSlope = -sweepSlope;
end
Nsweep = 192;
型号汽车雷达硬件
雷达采用均匀线阵(ULA)发射和接收雷达波形。使用线性阵列可以使雷达估计从目标车辆接收到的反射能量的方位方向。远程雷达需要在车辆前方15度范围内探测目标。6单元接收阵列通过提供16度半功率波束宽度来满足这一要求。在发射时,雷达只使用一个阵列元素,使其能够覆盖比接收时更大的区域。
% Model the antenna element
antElmnt = phased.IsotropicAntennaElement('BackBaffled',true);
% Construct the receive array
Ne = 6;
rxArray = phased.ULA('Element',antElmnt,'NumElements',Ne,...
'ElementSpacing',lambda/2);
% Form forward-facing beam to detect objects in front of the ego vehicle
beamformer = phased.PhaseShiftBeamformer('SensorArray',rxArray,...
'PropagationSpeed',c,'OperatingFrequency',fc,'Direction',[0;0]);
% Half-power beamwidth of the receive array
hpbw = helperAutoDrivingRadarSigProc('Array Beamwidth',rxArray,c,fc)
hpbw =
16.3636
使用根MUSIC估计器估计接收信号的到达方向。波束扫描也用于说明目的,以帮助在空间上可视化接收信号能量的分布。
% Direction-of-arrival estimator for linear phased array signals
doaest = phased.RootMUSICEstimator(...
'SensorArray',rxArray,...
'PropagationSpeed',c,'OperatingFrequency',fc,...
'NumSignalsSource','Property','NumSignals',1);
% Scan beams in front of ego vehicle for range-angle image display
angscan = -80:80;
beamscan = phased.PhaseShiftBeamformer('Direction',[angscan;0*angscan],...
'SensorArray',rxArray,'OperatingFrequency',fc);
使用FMCW技术的汽车自适应巡航控制示例中定义的参数,为单个发射通道的雷达发射机建模,并为每个接收通道的接收机前置放大器建模。
antAperture = 6.06e-4; % Antenna aperture (m^2)
antGain = aperture2gain(antAperture,lambda); % Antenna gain (dB)
txPkPower = db2pow(5)*1e-3; % Tx peak power (W)
txGain = antGain; % Tx antenna gain (dB)
rxGain = antGain; % Rx antenna gain (dB)
rxNF = 4.5; % Receiver noise figure (dB)
% Waveform transmitter
transmitter = phased.Transmitter('PeakPower',txPkPower,'Gain',txGain);
% Radiator for single transmit element
radiator = phased.Radiator('Sensor',antElmnt,'OperatingFrequency',fc);
% Collector for receive array
collector = phased.Collector('Sensor',rxArray,'OperatingFrequency',fc);
% Receiver preamplifier
receiver = phased.ReceiverPreamp('Gain',rxGain,'NoiseFigure',rxNF,...
'SampleRate',fs);
定义雷达信号处理链
雷达在每个线性相控阵天线单元上收集波形的多次扫描。这些收集到的扫描形成一个数据立方体,在雷达数据立方体中定义。这些扫描是沿着数据立方体的快时间和慢时间维度进行相干处理,以估计车辆的距离和多普勒。
使用相位范围请响应目的对雷达数据立方体进行距离和多普勒处理。使用汉宁窗口来抑制车辆靠近雷达时产生的大旁瓣。
Nft = waveform.SweepTime*waveform.SampleRate; % Number of fast-time samples
Nst = Nsweep; % Number of slow-time samples
Nr = 2^nextpow2(Nft); % Number of range samples
Nd = 2^nextpow2(Nst); % Number of Doppler samples
rngdopresp = phased.RangeDopplerResponse('RangeMethod','FFT',...
'DopplerOutput','Speed','SweepSlope',sweepSlope,...
'RangeFFTLengthSource','Property','RangeFFTLength',Nr,...
'RangeWindow','Hann',...
'DopplerFFTLengthSource','Property','DopplerFFTLength',Nd,...
'DopplerWindow','Hann',...
'PropagationSpeed',c,'OperatingFrequency',fc,'SampleRate',fs);
使用恒虚警率(CFAR)检测器识别处理后的距离和多普勒数据中的探测。恒虚警检测器估计接收到的雷达数据的背景噪声水平。在信号功率超过估计噪声下限一定阈值的位置可以发现检测。由于环境噪声的存在,低阈值会导致更高数量的错误检测报告。增加阈值会减少错误检测,但也会降低场景中检测到实际目标的概率。有关CFAR检测的更多信息,请参阅恒虚警率(CFAR)检测示例。
% Guard cell and training regions for range dimension
nGuardRng = 4;
nTrainRng = 4;
nCUTRng = 1+nGuardRng+nTrainRng;
% Guard cell and training regions for Doppler dimension
dopOver = round(Nd/Nsweep);
nGuardDop = 4*dopOver;
nTrainDop = 4*dopOver;
nCUTDop = 1+nGuardDop+nTrainDop;
cfar = phased.CFARDetector2D('GuardBandSize',[nGuardRng nGuardDop],...
'TrainingBandSize',[nTrainRng nTrainDop],...
'ThresholdFactor','Custom','CustomThresholdFactor',db2pow(13),...
'NoisePowerOutputPort',true,'OutputFormat','Detection index');
% Perform CFAR processing over all of the range and Doppler cells
freqs = ((0:Nr-1)'/Nr-0.5)*fs;
rnggrid = beat2range(freqs,sweepSlope);
iRngCUT = find(rnggrid>0);
iRngCUT = iRngCUT((iRngCUT>=nCUTRng)&(iRngCUT<=Nr-nCUTRng+1));
iDopCUT = nCUTDop:(Nd-nCUTDop+1);
[iRng,iDop] = meshgrid(iRngCUT,iDopCUT);
idxCFAR = [iRng(:) iDop(:)]';
这个phased.RangeEstimator和phased.DopplerEstimator目标将距离多普勒数据中发现的探测位置转换为测量值及其相应的测量方差。这些估计器将二次曲线拟合到距离多普勒数据上,以估计每次检测的峰值位置。由此产生的测量分辨率是距离和多普勒采样数据的一小部分。
传输波形的均方根(RMS)距离分辨率需要用来计算距离测量值的方差。远程雷达的瑞利距离分辨率以前定义为1米。瑞利分辨率是两个唯一目标可以分辨的最小距离。该值定义雷达的距离分辨率单元之间的距离。但是,目标在分辨率单元内的方差由波形的RMS分辨率决定。对于线性调频啁啾波形,瑞利分辨率和均方根分辨率之间的关系由[1]给出。
σ
R
M
S
=
12
Δ
R
a
y
l
e
i
g
h
\sigma_{RMS}=\sqrt{12}\Delta_{Rayleigh}
σRMS=12ΔRayleigh
式中
σ
R
M
S
\sigma_{RMS}
σRMS是RMS距离分辨率,
Δ
R
a
y
l
e
i
g
h
\Delta_{Rayleigh}
ΔRayleigh是瑞利距离分辨率。
多普勒测量的方差取决于处理的扫描次数。
现在,使用前面定义的参数创建距离和多普勒估计对象。
rmsRng = sqrt(12)*rangeRes;
rngestimator = phased.RangeEstimator('ClusterInputPort',true,...
'VarianceOutputPort',true,'NoisePowerSource','Input port',...
'RMSResolution',rmsRng);
dopestimator = phased.DopplerEstimator('ClusterInputPort',true,...
'VarianceOutputPort',true,'NoisePowerSource','Input port',...
'NumPulses',Nsweep);
为了进一步提高估计车辆位置的精度,将雷达的探测结果传递给跟踪器。配置轨迹以使用扩展卡尔曼滤波器(EKF),该滤波器将球形雷达测量值转换为ego飞行器的笛卡尔坐标系。同时配置跟踪器,以便对检测到的车辆使用等速动力学。通过比较多个测量时间间隔内的车辆检测,跟踪器进一步提高了车辆位置的准确性,并提供了车辆速度估计。
tracker = multiObjectTracker('FilterInitializationFcn',@initcvekf,...
'AssignmentThreshold',50);
自由空间传播信道模型
利用自由空间信道对发射和接收的雷达信号的传播进行建模。
channel = phased.FreeSpace('PropagationSpeed',c,'OperatingFrequency',fc,...
'SampleRate',fs,'TwoWayPropagation',true);
在自由空间模型中,雷达能量沿雷达和目标车辆之间的直接视线传播,如下图所示。
模拟驾驶场景
创建一个高速公路驾驶场景,三辆车在车辆附近行驶。车辆被建模为点目标,在驾驶场景中定义了不同的速度和位置。ego车辆以80公里/小时的速度行驶,其他三辆车分别以110公里/小时、100公里/小时和130公里/小时的速度行驶。有关驾驶场景建模的详细信息,请参见示例以编程方式创建参与者和车辆轨迹(自动驾驶工具箱)。雷达传感器安装在车辆前部。
要创建驾驶场景,请使用helperAutoDrivingRadarSigProc函数。要检查此函数的内容,请使用edit(‘helperAutoDrivingRadarSigProc’)命令。
% Create driving scenario
[scenario,egoCar,radarParams,pointTgts] = ...
helperAutoDrivingRadarSigProc('Setup Scenario',c,fc);
下面的循环使用drivingScenario对象来推进场景中的车辆。在每个仿真时间步,通过采集192次雷达波形扫描,形成雷达数据立方体。然后对组合的数据立方体进行距离和多普勒处理。然后对距离和多普勒处理后的数据进行波束形成,并对波束形成后的数据进行恒虚警检测。距离,径向速度和到达方向的测量估计为恒虚警检测。然后将这些检测组合成objectDetection对象,然后由multiObjectTracker对象进行处理。
% Initialize display for driving scenario example
helperAutoDrivingRadarSigProc('Initialize Display',egoCar,radarParams,...
rxArray,fc,vMax,rangeMax);
tgtProfiles = actorProfiles(scenario);
tgtProfiles = tgtProfiles(2:end);
tgtHeight = [tgtProfiles.Height];
% Run the simulation loop
sweepTime = waveform.SweepTime;
while advance(scenario)
% Get the current scenario time
time = scenario.SimulationTime;
% Get current target poses in ego vehicle's reference frame
tgtPoses = targetPoses(egoCar);
tgtPos = reshape([tgtPoses.Position],3,[]);
% Position point targets at half of each target's height
tgtPos(3,:) = tgtPos(3,:)+0.5*tgtHeight;
tgtVel = reshape([tgtPoses.Velocity],3,[]);
% Assemble data cube at current scenario time
Xcube = zeros(Nft,Ne,Nsweep);
for m = 1:Nsweep
% Calculate angles of the targets viewed by the radar
tgtAngs = NaN(2,numel(tgtPoses));
for iTgt = 1:numel(tgtPoses)
tgtAxes = rotz(tgtPoses(iTgt).Yaw)*...
roty(tgtPoses(iTgt).Pitch)*rotx(tgtPoses(iTgt).Roll);
[~,tgtAngs(:,iTgt)] = rangeangle(radarParams.OriginPosition,...
tgtPos(:,iTgt),tgtAxes);
end
% Transmit FMCW waveform
sig = waveform();
[~,txang] = rangeangle(tgtPos,radarParams.OriginPosition,...
radarParams.Orientation);
txsig = transmitter(sig);
txsig = radiator(txsig,txang);
txsig = channel(txsig,radarParams.OriginPosition,tgtPos,...
radarParams.OriginVelocity,tgtVel);
% Propagate the signal and reflect off the target
tgtsig = pointTgts(txsig,tgtAngs);
% Collect received target echos
rxsig = collector(tgtsig,txang);
rxsig = receiver(rxsig);
% Dechirp the received signal
rxsig = dechirp(rxsig,sig);
% Save sweep to data cube
Xcube(:,:,m) = rxsig;
% Move targets forward in time for next sweep
tgtPos = tgtPos+tgtVel*sweepTime;
end
% Calculate the range-Doppler response
[Xrngdop,rnggrid,dopgrid] = rngdopresp(Xcube);
% Beamform received data
Xbf = permute(Xrngdop,[1 3 2]);
Xbf = reshape(Xbf,Nr*Nd,Ne);
Xbf = beamformer(Xbf);
Xbf = reshape(Xbf,Nr,Nd);
% Detect targets
Xpow = abs(Xbf).^2;
[detidx,noisepwr] = cfar(Xpow,idxCFAR);
% Cluster detections
clusterIDs = helperAutoDrivingRadarSigProc('Cluster Detections',detidx);
% Estimate azimuth, range, and radial speed measurements
[azest,azvar,snrdB] = ...
helperAutoDrivingRadarSigProc('Estimate Angle',doaest,...
conj(Xrngdop),Xbf,detidx,noisepwr,clusterIDs);
azvar = azvar+radarParams.RMSBias(1)^2;
[rngest,rngvar] = rngestimator(Xbf,rnggrid,detidx,noisepwr,clusterIDs);
rngvar = rngvar+radarParams.RMSBias(2)^2;
[rsest,rsvar] = dopestimator(Xbf,dopgrid,detidx,noisepwr,clusterIDs);
% Convert radial speed to range rate for use by the tracker
rrest = -rsest;
rrvar = rsvar;
rrvar = rrvar+radarParams.RMSBias(3)^2;
% Assemble object detections for use by tracker
numDets = numel(rngest);
dets = cell(numDets,1);
for iDet = 1:numDets
dets{iDet} = objectDetection(time,...
[azest(iDet) rngest(iDet) rrest(iDet)]',...
'MeasurementNoise',diag([azvar(iDet) rngvar(iDet) rrvar(iDet)]),...
'MeasurementParameters',{radarParams},...
'ObjectAttributes',{struct('SNR',snrdB(iDet))});
end
% Track detections
tracks = tracker(dets,time);
% Update displays
helperAutoDrivingRadarSigProc('Update Display',egoCar,dets,tracks,...
dopgrid,rnggrid,Xbf,beamscan,Xrngdop);
% Publish snapshot
helperAutoDrivingRadarSigProc('Publish Snapshot',time>=1.1);
% Collect free space channel metrics
metricsFS = helperAutoDrivingRadarSigProc('Collect Metrics',...
radarParams,tgtPos,tgtVel,dets);
end
上图显示了模拟时间为1.1秒时3辆目标车辆的雷达探测和跟踪。左上角的图显示了从ego车辆的角度(以蓝色显示)驾驶场景的chase camera视图。作为参考,ego车辆的行驶速度为80公里/小时,其他三辆车的行驶速度分别为110公里/小时(橙色车)、100公里/小时(黄色车)和130公里/小时(紫色车)。
图的右侧显示了鸟瞰图,它呈现了场景的“自上而下”透视图。所有的车辆、检测和轨迹都显示在ego车辆的坐标参考系中。每个雷达测量的估计信噪比(SNR)打印在每个检测的旁边。由跟踪器估计的车辆位置在绘图中使用黑色正方形显示,旁边的文本指示每个轨迹的ID。跟踪器估计的每辆车的速度显示为指向车辆速度方向的黑线。线条的长度与估计的速度相对应,较长的线条表示速度相对较高的车辆。紫色赛车的赛道(ID2)最长,而黄色赛车的赛道(ID1)最短。跟踪速度与前面列出的模型车辆速度一致。
左下方的两个图显示了信号处理生成的雷达图像。上图显示了从目标车辆接收到的雷达回波在距离和径向速度上的分布。在这里,三辆车都被观察到了。测得的径向速度与跟踪器估计的速度相对应,如鸟瞰图所示。下图显示了接收到的目标回波在距离和角度上的空间分布。同样,这三个目标都存在,它们的位置与鸟瞰图中显示的位置相匹配。
由于它离雷达很近,橙色汽车仍然可以被探测到,尽管它的位置远远超出了波束的3分贝波束宽度,造成了较大的波束形成损失。这些检测结果为橙色汽车生成了一条轨迹(ID3)。
建立多径信道模型
先前的驾驶场景模拟使用自由空间传播。这是一个简单的模型,只模拟雷达和每个目标之间的直接视线传播。在现实中,雷达信号的传播要复杂得多,在到达每个目标并返回雷达之前,会受到来自多个障碍物的反射。这种现象称为多径传播。下图显示了一种多径传播的情况,其中撞击目标的信号来自两个方向:视线和来自路面的单个反弹。
多径传播的总体影响是接收到的雷达回波会产生建设性干扰和破坏性干扰。这种构造性干扰和相消性干扰是由各种信号传播路径之间的路径长度差异引起的。随着雷达和车辆之间距离的变化,这些路径长度差异也会发生变化。当这些路径之间的差异导致雷达接收到的回波几乎是180度的异相时,这些回波会破坏性地结合在一起,雷达对该距离没有探测到。
将自由空间通道模型替换为双光线通道模型,以演示上图中所示的传播环境。重用驾驶场景和雷达模型中的剩余参数,并再次运行模拟。
% Reset the driving scenario
[scenario,egoCar,radarParams,pointTgts] = ...
helperAutoDrivingRadarSigProc('Setup Scenario',c,fc);
% Create two-ray propagation channels. One channel is used for the transmit
% path and a different channel is used for the receive path.
txchannel = phased.TwoRayChannel('PropagationSpeed',c,...
'OperatingFrequency',fc,'SampleRate',fs);
rxchannel = phased.TwoRayChannel('PropagationSpeed',c,...
'OperatingFrequency',fc,'SampleRate',fs);
% Run the simulation again, now using the two-ray channel model
metrics2Ray = helperAutoDrivingRadarSigProc('Run Simulation',...
c,fc,rangeMax,vMax,waveform,Nsweep,... % Waveform parameters
transmitter,radiator,collector,receiver,... % Hardware models
rngdopresp,beamformer,cfar,idxCFAR,... % Signal processing
rngestimator,dopestimator,doaest,beamscan,tracker,... % Estimation
txchannel,rxchannel); % Propagation channel models
上图显示了1.1秒模拟时间下的追逐图、鸟瞰图和雷达图像,正如自由空间信道传播场景所示。比较这两个图,观察到对于两个光线通道,此时紫色车没有检测到。这种检测损失是因为这辆车的路径长度差异在这个范围内具有破坏性干扰,导致完全检测损失。
将CFAR处理产生的SNR估计与自由空间和双光线通道模拟得到的紫色车的距离估计进行比较。
helperAutoDrivingRadarSigProc('Plot Channels',metricsFS,metrics2Ray);
当汽车接近距离雷达72米的距离时,双射线信道的估计信噪比相对于自由空间信道有很大的损失。正是在这个范围附近,多径干扰破坏性地结合在一起,导致信号检测的损失。然而,观察到跟踪器能够在这些信号丢失的时候使轨道滑行,并为紫色车提供一个预测的位置和速度。
总结
该实例演示了如何使用相控阵系统工具箱对汽车雷达的硬件和信号处理进行建模。您还学习了如何将此雷达模型与自动驾驶工具箱驾驶场景模拟集成。首先你生成了合成雷达探测。然后你用跟踪器进一步处理这些探测,在ego飞行器的坐标系中生成精确的位置和速度估计。最后,您学习了如何使用phased.twaraychannel相控阵系统工具箱中提供的模型。
所提供的工作流程使您能够了解雷达体系结构设计决策如何影响更高级别的系统需求。使用此工作流,您可以选择满足独特应用要求的雷达设计。
参考
[1] Richards, Mark. Fundamentals of Radar Signal Processing. New York: McGraw Hill, 2005.
[2] Reference