这个例子展示了如何模拟由于多径反射而产生的幽灵目标探测和跟踪,其中信号能量在返回到雷达之前被另一个目标反射。在本例中,您将使用统计雷达模型和生成IQ信号的收发器模型来模拟幽灵。
许多高速公路场景不仅涉及其他车辆,还涉及障碍物和护栏。方法创建的简单高速公路驾驶场景设计师有关如何建模障碍的更多信息,请参阅基于合成雷达和视觉数据的传感器融合的例子。使用helperSimpleHighwayScenarioDSD
从Driving Scenario Designer中导出的函数,以获得高速公路场景和自我车辆的手柄。
设置随机种子以获得可重复的结果rndState = rng()“默认”);%使用helper创建场景[scenario, egoVehicle] = helperSimpleHighwayScenarioDSD();
要对前视汽车雷达产生的探测进行建模,请使用radardataggenerator系统对象™
.使用77 GHz中心频率,这是典型的汽车雷达。产生探测范围达100米,径向速度高达100米/秒。
%汽车雷达系统参数频率= 77e9;%赫兹rgMax = 150;% mspMax = 100;% m / sRCS = 10;% dBsmazRes = 4;%度rgRes = 2.5;% mrrRes = 0.5;% m / s创建前瞻性汽车雷达rdg = radarDataGenerator(1,“没有扫描”,…“UpdateRate”10…“MountingLocation”, [3.4 0 0.2],…“CenterFrequency”频率,…“HasRangeRate”,真的,…“FieldOfView”, [705];…“RangeLimits”, [0 rgMax],…“RangeRateLimits”, [-spMax spMax],…“HasRangeAmbiguities”,真的,…“MaxUnambiguousRange”rgMax,…“HasRangeRateAmbiguities”,真的,…“MaxUnambiguousRadialSpeed”spMax,…“ReferenceRange”rgMax,…“ReferenceRCS”rcs,…“AzimuthResolution”azRes,…“RangeResolution”rgRes,…“RangeRateResolution”存款准备金率,…“TargetReportFormat”,“检测”,…“配置文件”actorProfiles(场景));创建鸟眼图和检测绘图仪功能[~,detPlotterFcn] = helperSetupBEP(egoVehicle,rdg);标题(“空闲空间(无多路径)”);%生成原始检测time = scenario.SimulationTime;tpose = targetpose (egoVehicle);[dets,~,config] = rdg(tpose,time);%地块检测detPlotterFcn(引爆器,配置);
该图显示了沿目标车辆以及沿障碍物一侧的检测位置。然而,探测并不总是表现得那么好。有一种现象会给雷达工程师带来相当大的挑战,那就是多路径。多路径是指信号不仅直接传播到预定目标并返回雷达,而且还包括环境中物体的额外反射。
当雷达信号传播到感兴趣的目标时,它可以通过各种路径到达。除了从雷达到目标再返回雷达的直接路径外,还有其他可能的传播路径。路径的数量是无界的,但每反射一次,信号能量就会减少。通常,考虑三反弹路径的传播模型被用来模拟这种现象。
为了理解三次反弹模型,首先考虑简单的一次反弹和两次反弹路径,如下图所示。
单弹路径从雷达(1)传播到目标(2),然后从目标(2)反射回雷达。这通常被称为直接路径或视线路径。
在这种情况下,有两个唯一的传播路径,由两个反弹组成。
前两次反弹路径从雷达(1)传播到反射面(3),然后传播到目标(2),然后返回到雷达(1)。由于雷达接收到的信号来自真实目标的最后一次反弹,因此它产生了与真实目标相同方向的鬼探测。由于这种传播的路径长度较长,因此它出现在比真实目标检测更远的距离上。
第二个双反弹路径从雷达(1)传播到目标(2),然后传播到反射面(3),然后返回到雷达(1)。在这种情况下,当雷达接收到该方向的反射信号时,幽灵探测出现在反射面的另一侧。
注意,两个反弹路径的路径长度是相同的。因此,这些路径的测量距离和距离速率也将相同。
三次反弹路径从障碍物上反射两次。这条路径永远不会直接传播到目标或直接传回雷达。当雷达接收到该方向的反射信号时,三反弹幽灵探测出现在反射面的另一侧。此外,它具有三个反弹路径中最长的传播路径,因此具有三个路径中最长的测量范围。这条路径对应于屏障另一侧真实目标的镜像反射。
设置HasGhosts
物业radarDataGenerator
对这三种反弹路径产生的检测进行建模。
启用幽灵目标模型释放(读数);读数。HasGhosts = true;%生成原始检测time = scenario.SimulationTime;tpose = targetpose (egoVehicle);[dets,~,config] = rdg(tpose,time);%地块检测detPlotterFcn(引爆器,配置);标题(“简单多路径环境”);
该图再现了对三种传播路径的分析。前两次反弹幽灵位于目标方向,距离比直接路径探测略长。第二个两次反弹和三次反弹幽灵位于由屏障反射产生的目标镜像的方向。
因为检测到的幽灵目标的距离和速度与真实目标的距离和速度相似,所以它们的运动学与配置跟踪真实目标检测的跟踪器是一致的。真实目标和幽灵目标运动的一致性导致在障碍物另一边的幽灵目标产生轨迹。
设置TargetReportFormat
属性radarDataGenerator
来跟踪
对雷达在多径环境下产生的轨迹进行建模。
%输出跟踪而不是检测释放(读数);读数。TargetReportFormat =“跟踪”;读数。ConfirmationThreshold = [2 3];读数。DeletionThreshold = [5 5];FilterInitializationFcn =“initcvekf”;%等速EKF创建一个新的鸟瞰图来绘制轨道[bep,trkPlotterFcn] = helperSetupBEP(egoVehicle,rdg);标题(“简单多路径环境”);%运行模拟重启(场景);场景。StopTime = 7.5;而advance(scenario) time = scenario. simulationtime;tpose = targetpose (egoVehicle);%生成音轨[trks,~,config] = rdg(tpose,time);%过滤掉与静态对象(例如barrier)相对应的轨迹dyntrks = helperKeepDynamicObjects(trks, egoVehicle);%可视化动态轨迹egoVehicle helperPlotScenario (cep);trkPlotterFcn (dyntrks配置);结束
此图使用正方形标记显示确认的轨道位置。与静态对象(例如障碍物)相对应的轨迹不被绘制。注意,有多条轨道与领头的汽车相关联。覆盖在领头车上的轨迹对应于真正的探测和前两次反弹的幽灵。在护栏另一边的道路上的轨迹对应于第二个两次反弹和三次反弹的幽灵。
轨道速度由指向远离轨道位置的矢量的长度和方向表示(这些矢量很小,因为它们相对于自我车辆)。幽灵探测可能会欺骗跟踪器,因为它们的运动学与真正目标的运动学相似。这些鬼影轨迹可能是有问题的,因为它们给跟踪器增加了额外的处理负载,并可能混淆使用目标轨迹的控制决策。
在本例中前面的自由空间和多路径模拟中,您使用了测量级雷达模型来生成探测和跟踪。现在,使用radarTransceiver
系统对象生成时域IQ信号。创建一个等价物radarTransceiver
直接从radarDataGenerator
.
统计雷达具有以下距离和距离速率(多普勒)参数,这些参数决定了雷达使用的波形的约束radarTransceiver
.
rgMax = rdg.RangeLimits(2)% m
rgMax = 150
spMax = rdg.RangeRateLimits(2)% m / s
spMax = 100
计算满足雷达距离速率的脉冲重复频率(PRF)。
lambda = freq2waven (rdg.CenterFrequency);prf = 2*speed2dop(2*spMax,lambda);
计算满足距离速率分辨率要求所需的脉冲数。
rrRes = rdg。RangeRateResolution
rrRes = 0.5000
dopRes = 2*speed2dop(rrRes,lambda);num脉冲= 2^nextpow2(prf/dopRes)
num脉冲= 512
prf = dopRes* num脉冲
PRF = 1.3150e+05
确认与此PRF对应的无二义范围超出最大范围限制。
rgUmb = time2range(1/prf)
rgUmb = 1.1399e+03
构造等价物radarTransceiver
直接从radarDataGenerator
.
释放(读数);根据所需的PRF和设置距离和距离率模糊度脉冲数%读数。MaxUnambiguousRange = rgUmb;读数。MaxUnambiguousRadialSpeed = spMax;%设置统计雷达,以报告集群检测以进行比较来自雷达收发器的IQ视频。读数。TargetReportFormat =“集群检测”;读数。DetectionCoordinates =“身体”;
azRes = ridge . azimuthresolution;读数。AzimuthResolution = ridge . fieldofview (1);从雷达数据发生器构造雷达收发器rtxrx =雷达收发器(rdg)
rtxrx = radarTransceiver与属性:波形:[1×1相位。发射机:[1×1相控。传输天线:[1×1相控。接收天线:[1×1相控。接收者:[1×1 phase .]ReceiverPreamp] MechanicalScanMode: 'None' ElectronicScanMode: 'None' MountingLocation: [3.4000 0 0.2000] MountingAngles: [0 00] NumRepetitionsSource: 'Property' NumRepetitions: 512
读数。AzimuthResolution = azRes;
的radarTransceiver
只有一个发射和接收单元,但统计雷达使用均匀线性阵列(ULA)来形成多个波束。将ULA阵列附加到接收天线上radarTransceiver
.ULA中的数量或元素由雷达的方位角分辨率和波长决定。
numRxElmt = ceil(beamwidth2ap(ridge . azimuthresolution,lambda,0.8859)/(lambda/2)))
numRxElmt = 26
elmt = rtxrx.ReceiveAntenna.Sensor;Rxarray = phase。齿龈(numRxElmtλ/ 2,“元素”, elmt);rtxrx.ReceiveAntenna.Sensor = rxarray;
使用helper3BounceGhostPaths函数
从多路径场景中计算目标位置和传感器位置的三反弹路径。
重启(场景);tpose = targetpose (egoVehicle);%为场景中的目标生成3次反弹传播路径路径= helper3BounceGhostPaths(tpose,rdg);
使用radarTransceiver
生成雷达接收到的基带采样IQ数据。
time = scenario.SimulationTime;%电流模拟时间Xcube = rtxrx(路径,时间);从3反弹路径模型生成收发器的IQ数据
接收数据立方体具有三个维度:快时样本、接收天线单元和慢时样本。
大小(Xcube)
ans =1×3456 26 512
使用分阶段。RangeDopplerResponse
沿着数据立方体的第一和第三维执行距离和多普勒处理的系统对象。
Rngdopproc = phase。RangeDopplerResponse (…“RangeMethod”,匹配滤波器的,…“DopplerOutput”,“速度”,…“PropagationSpeed”rtxrx.ReceiveAntenna.PropagationSpeed,…“OperatingFrequency”rtxrx.ReceiveAntenna.OperatingFrequency,…“SampleRate”, rtxrx.Receiver.SampleRate);mfcoeff = getMatchedFilter(rtxrx.波形);[xrgdop, rgrid, rgrid] = rngdopproc(Xcube, mfcoff);
使用分阶段。PhaseShiftBeamformer
系统对象沿数据立方体的第二维从接收天线阵列单元形成波束。
azFov = rdg.FieldOfView(1);anggrid = -azFov/2;bmfwin = @(N)normmax(taylorwin(N,5,-60));波束形成器=相控。PhaseShiftBeamformer(…“方向”(anggrid; 0 * anggrid),…“SensorArray”rtxrx.ReceiveAntenna.Sensor,…“OperatingFrequency”, rtxrx.ReceiveAntenna.OperatingFrequency);Xbfmrngdop = Xrngdop;[Nr,Ne,Nd] = size(Xbfmrngdop);Xbfmrngdop = permute(Xbfmrngdop,[1 3 2]);% Nr x Nd x NeXbfmrngdop =重塑(Xbfmrngdop,[],Ne);Xbfmrngdop = beamformer(Xbfmrngdop.*bmfwin(Ne)');Xbfmrngdop =重塑(Xbfmrngdop,Nr,Nd,[]);% Nr x Nd x NbXbfmrngdop = permute(Xbfmrngdop,[1 3 2]);% Nr x Nb x Nd
使用helperPlotBeamformedRangeDoppler
函数从波束形成、距离和多普勒处理的数据立方体绘制距离角图。
helperPlotBeamformedRangeDoppler (Xbfmrngdop rggrid、anggrid rtxrx);
接收信号的局部极大值对应目标车辆、护栏的位置,以及护栏另一侧目标车辆的鬼影。显示由生成的测量级检测radarDataGenerator
是否与等价物生成的距离角图中的峰一致radarTransceiver
.
使用helperPlayStatAndIQMovie
函数,用于在此场景期间比较测量级检测和IQ处理视频。
helperPlayStatAndIQMovie(场景、egoVehicle rtxrx读数,rngdopproc, beamformer, bmfwin);
多路径幽灵检测有时可以用来看到道路上的物体,否则由于遮挡而无法被雷达检测到。一个例子是检测由于多路径偏离路面而遮挡的车辆。使用helperGroundBounceScenarioDSD
功能创建一个场景,在同一车道上,与自我车辆行驶较慢的车辆被另一辆车辆遮挡在雷达正前方。
[scenario, egoVehicle] = helperGroundBounceScenarioDSD;ax3d = helperRadarChasePlot(egoVehicle);
黄色的汽车被红色的汽车挡住了。在蓝色小轿车的前视雷达和黄色轿车之间不存在视线。
viewLoc = [scenario.Actors(2).Position(1)-10 -10];chasePlot (egoVehicle“ViewLocation”viewLoc,“ViewHeight”0,“ViewYaw”现年40岁的“父”, ax3d);
多路径可以穿过汽车底部和路面之间的空间。
重用radarDataGenerator
利用车辆与路面之间的多路径产生鬼目标检测。使用helperRoadProfiles
和helperRoadPoses
在场景中建模的目标列表中包含路面的函数,以启用路面和车辆之间的多路径。
释放(读数);读数。rangeraterresolution = 0.5;ridge . fieldofview (2) = 10;读数。TargetReportFormat =“检测”;tprofiles = actorProfiles(场景);rdprofiles = helperRoadProfiles(场景);读数。profile = [tprofiles;rdprofiles];创建鸟眼图和检测绘图仪功能[bep,detPlotterFcn] = helperSetupBEP(egoVehicle,rdg);[ax3d,detChasePlotterFcn] = helperRadarChasePlot(egoVehicle,rdg);Camup (ax3d,[0 0 1]);pos = egoVehicle。位置+[-5 - 50];坎波斯(ax3d pos);Camtarget (ax3d,[15 0 0]);%生成集群检测time = scenario.SimulationTime;tpose = targetpose (egoVehicle);rdpose = helperroadpose (egoVehicle);姿态=[姿态];[dets,~,config] = rdg(姿势,时间);%地块检测dyndets = helperKeepDynamicObjects(dets,egoVehicle);detPlotterFcn (dyndets配置);
由于路面和红色汽车的底面之间存在三反弹路径,因此可以从被遮挡的汽车进行检测。
从被遮挡的汽车中找到3个弹跳检测i3 = find(cellfun(@(d) . objectattributes {1}.BouncePathIndex,dyndets)==3);Det3 = dyndets{i3};绘制雷达和被遮挡汽车之间的3次反弹路径iBncTgt = find([poses.ActorID]==det3.ObjectAttributes{1}.BounceTargetIndex);iTgt = find([poses.ActorID]==det3.ObjectAttributes{1}.TargetIndex);pos = [ridge . mountinglocation; positions (iBncTgt).Position; positions (iTgt).Position]+egoVehicle.Position;持有(ax3d“上”);plot3 (ax3d pos (: 1), pos (:, 2), pos (:, 3),的r - *,“线宽”2);Campos ([-6 -15 2]);Camtarget ([17 0 0]);
该图以红线显示了三次反弹路径。观察雷达和被遮挡的黄色汽车之间存在一条反弹路径,通过红色汽车的底部下方。
显示弹跳路径到达被遮挡的黄色汽车Campos ([55 - 103]);Camtarget ([35 0 0]);
该图显示了从路面反弹后到达被遮挡黄色汽车的三反弹路径。
在本例中,您了解了如何从雷达和目标之间可能发生的多次反射中产生幽灵目标检测。一个汽车雷达场景被用来突出一个常见的情况,即雷达视野中的护栏产生了幽灵目标。因此,有四种独特的反弹路径可以产生这些幽灵检测。鬼目标检测的运动学与真目标检测相似,因此,这些鬼目标会产生鬼轨迹,这会给跟踪器增加额外的处理负荷,并可能混淆使用这些轨迹的控制算法。的radarTransceiver
可用于生成高保真度的IQ数据,这些数据适合作为检测和跟踪算法的输入。
%恢复随机状态rng (rndState);
金宝app支持功能
helperKeepDynamicObjects
函数dynrpts = helperKeepDynamicObjects(rpts,egoVehicle)%过滤掉静态对象(如护栏)对应的目标报告%这是一个辅助函数,将来可能会被删除或修改%释放。Dynrpts = rpts;如果~ isempty (rpt)如果iscell(rpts) level = cell2mat(cellfun(@(d)d. measurement (4:end),rpts(:)',“UniformOutput”、假));其他的韦尔= cell2mat (arrayfun (@ (t) t.State(2:2:结束),rpt (:),“UniformOutput”、假));结束韦尔=符号(韦尔(:1))。* sqrt(总和(abs(韦尔(1:2,:))^ 2,1));egoVel = sign(egoVehicle.Velocity(1))*norm(egoVehicle.Velocity(1:2));gndvel = vel+egoVel;%相对于地面的探测速度isStatic = gndvel > -4 &…离场速度大于4米/秒,Gndvel < 8;%小于8m /s的闭合速度dynrpts = rpts(~isStatic);结束结束
normmax
函数Y = normmax(x)如果All (abs(x(:))==0) y = ones(size(x),“喜欢”, x);其他的Y = x(:)/max(abs(x(:)));结束结束