主要内容

多路径雷达反射公路车辆跟踪

这个例子展示了在多路径雷达反射的情况下在高速公路上跟踪车辆所面临的挑战。它还展示了一种与扩展对象跟踪器一起使用的虚影过滤方法,以同时过滤虚影检测和跟踪对象。

简介

汽车雷达传感器对驾驶过程中遇到的不利环境条件(如雾、雪、雨和强烈的阳光)具有很强的抵抗力。汽车雷达传感器具有这一优势,因为与激光雷达和相机等可见光波长传感器相比,它们的工作波长大得多。作为使用大波长的副作用,雷达传感器周围的表面就像镜子一样,由于多径传播而产生不期望的探测。这些检测通常被称为鬼检测因为它们似乎来自不存在目标的地区。本例向您展示了这些多路径反射对使用雷达探测设计和配置目标跟踪策略的影响。有关多径现象和鬼影探测模拟的详细信息,请参见多路径返回引起的雷达虚影模拟的例子。

在本例中,您将模拟城市高速公路驾驶场景中雷达传感器的多路径检测。这条高速公路在道路两侧设置了障碍物。该场景包括一辆自我车辆和其他四辆车辆在高速公路上行驶。ego车辆配备了四个雷达传感器,提供360度覆盖。该图像显示了雷达传感器的配置和传感器扫描的检测结果。红色区域代表雷达传感器的视场,黑点代表探测结果。

雷达传感器报告了公路两侧车辆和障碍物的探测结果。雷达还报告了一些似乎不是来自场景中任何真实物体的探测。这些是由于雷达信号的多径传播而产生的鬼影探测。目标跟踪器假设所有的检测都来自真实的物体或均匀分布的随机杂波。与此假设相反,幽灵检测通常比杂波更持久,并且表现得像来自真实目标的检测。由于这个原因,目标跟踪算法很可能从这些检测中产生错误的轨迹。在使用跟踪器处理雷达扫描之前,过滤掉这些检测是很重要的。

生成传感器数据

本例中使用的场景是使用drivingScenario类。你可以使用radarDataGenerator系统对象™用于模拟雷达从直接路径和反射场景返回。的HasGhosts传感器的属性指定为真正的模拟多径反射。场景和传感器模型的创建封装在辅助函数中helperCreateMultipathDrivingScenario,随此示例附上。通过传感器仿真获得的数据集记录在一个MAT文件中,该文件包含来自雷达的返回值和相应的传感器配置。要记录不同场景或传感器配置的数据,可以使用以下命令:

helperRecordData(场景,egoVehicle,传感器,fName);
%创建场景[scenario, egoVehicle, sensors] = helperCreateMultipathDrivingScenario;载入记录的数据负载(“MultiPathRadarScenarioRecording.mat”“detectionLog”“configurationLog”);

雷达处理链:雷达探测到跟踪列表

在本节中,您将设置一个集成算法,以同时过滤雷达探测和跟踪扩展对象。方框图说明了本例中使用的雷达处理链。

接下来,您将了解这些步骤中的每个步骤以及相应的辅助函数。

多普勒分析

雷达传感器报告测量到的反射信号的相对径向速度。在这一步中,您将利用测量到的探测径向速度来确定目标是静态的还是动态的[1]。在之前的雷达扫描中,很大比例的雷达探测来自自我车辆周围的静态环境。因此,将每个检测分类为静态或动态极大地有助于提高对场景的理解。使用helper函数helperClassifyStaticDynamic将每个检测分类为静态或动态。

静态的反射镜

静态环境通常也是雷达传感器报告的鬼影反射的主要原因。在分割数据集并找到静态检测后,处理它们以在自我车辆的坐标框架中找到2-D线段。首先,使用DBSCAN算法将静态检测聚类到自我车辆周围的不同聚类中。其次,在每个簇上拟合一个2-D线段。这些拟合线段定义了信号传回雷达的可能反射面。使用helper函数helperFindStaticReflectors从静态检测中找到这些二维线段。

闭塞的分析

从表面反射产生的雷达传感器的探测似乎起源于反射器后面。在从雷达中分割出动态探测后,使用简单的遮挡分析来确定雷达探测是否被可能的反射器遮挡。因为信号可以被静态或动态对象反射,所以可以分两步执行遮挡分析。首先,用代表静态反射器的2-D线段检查遮挡的动态检测。使用helper函数helperClassifyGhostsUsingReflectors对检测是否被静态反射器遮挡进行分类。其次,该算法使用来自扩展跟踪算法的预测轨迹信息来检查对场景中动态对象的遮挡。该算法只使用来自跟踪器的确认轨迹,以防止在出现试探性或虚假轨迹时雷达探测的过滤。使用helper函数helperClassifyGhostsUsingTracks当检测被动态物体遮挡时进行分类。

这个处理雷达探测并对其进行分类的整个算法被包装成一个更大的辅助函数,helperClassifyRadarDetections,将检测列表划分为四个主要类别:

  1. 目标检测——这些检测被分类为起源于场景中的真实动态目标。

  2. 环境检测——这些检测被分类为起源于静态环境。

  3. 幽灵(静态)-这些探测被分类为来自动态目标,但通过静态环境反射。

  4. 鬼影(动态)-这些探测被分类为源自动态目标,但通过其他动态对象反射。

安装GGIW-PHD扩展对象跟踪器

目标检测采用扩展的目标跟踪器进行。在本例中,您使用伽玛高斯逆Wishart概率假设密度(GGIW-PHD)扩展对象跟踪器。GGIW-PHD跟踪器将目标建模为椭圆形状,测量模型假设探测在目标范围内均匀分布。该模型允许目标接受两次反弹的鬼影探测,这有更高的概率被错误归类为真实目标。这些两次反弹的鬼影探测也报告了与目标的实际运动不一致的多普勒测量。当这些来自同一目标的幽灵探测和真实目标探测被估计属于同一探测分区时,不正确的多普勒信息可能会导致航迹估计的偏离。

为了解决这一问题,跟踪器对具有较大测量噪声方差的距离率测量进行了处理,以弥补目标测量模型中的这一缺陷。跟踪器还使用高分配阈值和低合并阈值的组合。高分配阈值允许跟踪器减少鬼目标检测产生的新组件,这些新组件被错误地分类为目标检测。较低的合并阈值使跟踪器能够丢弃经过校正的轨迹组件(假设),这些组件可能由于使用虚影检测进行校正而偏离。

设置跟踪器使用trackerPHD系统对象™。有关扩展对象跟踪器的详细信息,请参阅基于雷达和摄像头的公路车辆扩展目标跟踪(自动驾驶工具箱)的例子。

%从记录中配置传感器以设置跟踪器[~, sensorConfigurations] = helperAssembleData(detectionLog{1},configurationLog{1});配置跟踪器使用GGIW-PHD滤波器,具有恒定的转动速率运动模型i = 1: number (sensorConfigurations) sensorConfigurations{i}.使用实例FilterInitializationFcn = @helperInitGGIWFilter;sensorConfigurations{}。SensorTransformFcn = @ctmeas;结束使用trackerPHD和名称-值对创建跟踪器tracker = trackerPHD(SensorConfigurations = SensorConfigurations,...PartitioningFcn = @(x)helperMultipathExamplePartitionFcn(x,2,5),...AssignmentThreshold = 450,...提取阈值= 0.8,...确认阈值= 0.85,...MergingThreshold = 25,...DeletionThreshold = 1e-3,...出生率= 1e-4,...HasSensorConfigurationsInput = true...);

运行场景并跟踪对象

接下来,您将改进该场景,使用来自传感器的记录测量,并使用前面描述的算法处理它们。通过使用广义最优子模式赋值(GOSPA)度量来分析跟踪算法的性能。您还通过估计雷达探测的真实分类和估计分类之间的混淆矩阵来分析分类过滤算法的性能。方法获得有关检测的真实分类信息helperTrueClassificationInfohelper函数。

创建trackGOSPAMetric对象来计算GOSPA度量(距离=“自定义”...DistanceFcn = @helperGOSPADistance,...CutoffDistance = 35);创建结果可视化显示display = helperMultiPathTrackingDisplay;%鬼影过滤的预测曲目列表predictedTracks = objectTrack.empty(0,1);%混淆矩阵confMat = 0(5,5,数字(detectionLog));% GOSPA公制gospa =零(4,数字(detectionLog));%基本真理groundTruth =场景。演员(2:结束);i = 1:数字(detectionLog)用于地面真相可视化的高级场景推进(场景);%当前时间时间= scenario.SimulationTime;%检测和传感器配置[detectionLog, configurations] = helperAssembleData(detectionLog{i},configurationLog{i});%预测已确认的轨迹到当前时间进行鬼的分类如果isLocked(跟踪器)predictedTracks = predictTracksToTime(跟踪器,“确认”、时间);结束将雷达探测分类为目标、幽灵或静态环境。[targets, ghostStatic, ghostDynamic, static, reflector, classificationInfo] = helperClassifyRadarDetections(detects, egoVehicle, predictedTracks);%从目标和传感器配置传递检测到跟踪器confirmedTracks =跟踪器(目标,配置,时间);%可视化结果显示(egoVehicle,传感器,目标,confirmedTracks, ghostStatic, ghostDynamic,静态,反射器);计算GOSPA度量[gospa(1, i),~,~,gospa(2,i),gospa(3,i),gospa(4,i)] = gospaMetric(confirmedTracks, groundTruth);获得真实分类信息,生成混淆矩阵trueClassificationInfo = helperTrueClassificationInfo(检测);confMat(:,:,i) = helperconfusimatrix (trueClassificationInfo, classificationInfo);结束

结果

动画和快照分析

下面的动画展示了雷达数据处理链的结果。车辆周围的黑色椭圆表示估计轨道。根据算法预测的分类,雷达探测显示出四种不同的颜色。可视化中的黑点表示静态雷达目标探测。请注意,这些检测由黑线重叠,这些黑线表示使用DBSCAN算法发现的静态反射器。栗色标记表示扩展对象跟踪器处理的探测,而绿色和蓝色标记分别表示分类为静态和动态对象反射的雷达探测。注意,跟踪器能够在该场景中保持对所有四辆车的跟踪。

MultipathTrackingExample.gif

接下来,您将使用在模拟期间捕获的不同快照分析算法的性能。下面的快照是在3秒内拍摄的,显示了自我车辆前面的情况。此时,自我车辆正在接近缓慢移动的卡车,左侧雷达传感器通过左侧屏障观察到这些物体的反射。这些检测显示为屏障中这些对象的镜像检测。请注意,估计为二维反射器的黑线位于这些探测的视线内。因此,该算法能够正确地将这些检测分类为静态物体反射的鬼目标。

f = showSnaps(显示,1:2,1);如果~isempty(f) ax = findall(f,“类型”“轴”“标签”“birdsEyePlotAxes”);斧子。XLim = [-10 30];斧子。YLim = [-10 20];结束

{

接下来,使用4.3秒捕获的快照分析算法的性能。此时,自我车辆离卡车更近了,卡车大约在绿色车辆和自我车辆的中间。在这种情况下,卡车的左侧就像一个强反射器,产生鬼影探测。绿色车辆右半部分的检测来自绿色车辆的两次反弹检测,因为信号在卡车反射后返回到传感器。该算法能够将这些检测分类为由动态物体反射产生的鬼检测,因为卡车的估计范围在这些检测的直接视线内。

f = showSnaps(显示,1:2,2);如果~isempty(f) ax = findall(f,“类型”“轴”“标签”“birdsEyePlotAxes”);斧子。XLim = [-10 30];斧子。YLim = [-10 20];结束

{

还请注意通过的车辆由黄色汽车在自我车辆的左边表示。这些探测似乎来自黄色车辆不可见的表面,是障碍物的两次反弹探测,通过过往车辆的正面反射。这些幽灵探测被错误地归类为目标探测,因为它们似乎来自估计范围内的车辆。在同一位置,当信号从屏障反射并返回到传感器时,位于屏障之外的检测也是正面的两次反弹检测。由于这些探测超出了轨道的范围,而轨道在视线的直线上,因此它们被归类为来自动态物体反射的鬼探测。

性能分析

通过使用GOSPA度量及其相关组件对跟踪算法的性能进行定量评估。度量值越低,表示跟踪性能越好。在下面的图中,射失在开始的几步后,度量的分量保持为零,表示跟踪器的建立延迟以及被遮挡的目标。组件的零值表示跟踪器没有漏掉任何目标。的False-tracks度量的分量在第85个时间步长左右增加了1秒。这表示由跟踪器在短时间内确认的由被错误分类为真实目标的鬼影检测产生的虚假跟踪。

图;情节(gospa ',“线宽”2);传奇(“GOSPA”“本地化GOSPA”“射失GOSPA”“False-tracks GOSPA”);

图中包含一个轴对象。axis对象包含4个line类型的对象。这些对象表示GOSPA,本地化GOSPA,丢失目标GOSPA,错误跟踪GOSPA。

与跟踪算法类似,还使用混淆矩阵[2]定量分析雷达探测分类算法的性能。表中行表示雷达探测的真实分类信息,列表示预测的分类信息。例如,第一行的第二个元素定义了预测为来自静态物体反射的虚影的目标检测的百分比。

90%以上的目标检测被正确分类。然而,一小部分目标检测被错误地归类为来自动态反射的鬼影。此外,大约3%来自静态物体反射的虚影和20%来自动态物体反射的虚影被错误地归类为目标并发送到跟踪器进行处理。在本例中发生这种情况的一种常见情况是,来自两次反弹反射的探测位于车辆的估计范围内。此外,本例中使用的分类算法并不是设计来查找场景中的虚假警报或杂波的。因此,混淆矩阵的第五列为零。由于假报警在视场内的空间分布,大多数假报警检测要么被归类为静态物体的反射,要么被归类为动态物体的反射。

在所有步骤上累积混淆矩阵confusimatrix = sum(confMat,3);numElements = sum(confusimatrix,2);numElemsTable = array2table(numElements,“VariableNames”, {“检测数量”},“RowNames”, {“目标”“鬼(S)”“鬼(D)”“环境”“混乱”});disp (的真实信息); disp (numElemsTable);
真实信息探测数量____________________目标1969鬼(S) 3155鬼(D) 849环境27083杂波138
计算百分比percentMatrix = confusimatrix ./numElements*100;% matrixtable = array2table(round(percentMatrix,2),“RowNames”, {“目标”“鬼(S)”“鬼(D)”“环境”“混乱”},...“VariableNames”, {“目标”“鬼(S)”“鬼(D)”“环境”“混乱”});disp (“真实vs预测混淆矩阵(%)”); disp (percentMatrixTable);
真实vs预测混淆矩阵(%)目标鬼(S)鬼(D)环境杂波_______ _________ _________ ___________ _______目标90.76 0.56 8.28 0.41 0鬼(S) 3.17 85.52 10.97 0.35 0鬼(D) 16.96 0.24 82.8 0环境1.02 2.7 4.11 92.17 0杂波21.74 63.04 14.49 0.72 0

总结

在本例中,模拟了城市高速公路驾驶场景中由于多路径传播引起的雷达探测。你配置了一个数据处理算法来同时过滤鬼影检测并跟踪高速公路上的车辆。您还使用GOSPA度量和混淆矩阵分析了跟踪算法和分类算法的性能。

参考文献

[1]先知,罗伯特,等。汽车场景中的瞬时鬼影检测识别2019 IEEE雷达会议.IEEE 2019。

[2]克劳斯,弗洛里安,等。“利用机器学习检测汽车雷达中的鬼影。”2020 IEEE第23届智能交通系统国际会议(ITSC).IEEE 2020。