主要内容

基于雷达和摄像头的公路车辆扩展目标跟踪

这个示例向您展示了如何围绕自我车辆跟踪高速公路车辆。车辆是扩展对象,其尺寸跨越多个传感器分辨率单元。因此,传感器在一次扫描中报告对这些物体的多个检测。在本例中,您将使用不同的扩展对象跟踪技术来跟踪公路车辆并评估其跟踪性能的结果。

介绍

在传统的跟踪方法中,如全局最近邻(multiObjectTracker,trackerGNN)、联合概率数据关联(trackerJPDA)和多假设跟踪(追踪者),被跟踪的物体被假定每次传感器扫描返回一次探测。随着传感器分辨率的提高,比如高分辨率雷达的发展,传感器通常会返回对一个物体的不止一次探测。例如,下图描述了对一辆车辆的多个检测,该检测跨越多个雷达分辨率单元。在这种情况下,用于跟踪对象的技术称为扩展对象跟踪[1]。

使用高分辨率传感器的主要好处是获取更多有关对象的信息,例如对象的尺寸和方向。这些附加信息可以提高检测概率并降低误报率。

扩展对象对传统跟踪器提出了新的挑战,因为这些跟踪器假定每个对象每个传感器都有一个单一的检测。在某些情况下,可以将传感器数据聚类,为传统跟踪器提供对每个对象的单一检测。然而,这样做可能会失去使用高分辨率传感器的好处。

相比之下,扩展对象跟踪器可以对每个对象处理多个检测。此外,这些跟踪器不仅可以估计目标的位置和速度等运动状态,还可以估计目标的尺寸和方向。在本例中,您使用以下跟踪器围绕ego车辆跟踪车辆:

  • 传统的点目标模型多目标跟踪器,multiObjectTracker

  • GGIW-PHD (Gamma Gaussian Inverse Wishart PHD)跟踪器,trackerPHDggiwphd过滤器

  • GM-PHD(高斯混合PHD)跟踪器,trackerPHDgmphd基于矩形目标模型的滤波器

您将使用评估所有跟踪器的跟踪结果跟踪误差度量trackAssignmentMetrics,它提供了跟踪器有效性的多种度量。您还将使用最优子模式分配度量(OSPA)评估结果,trackOSPAMetric,目的是使用综合评分来评估跟踪器的性能。

设置

场景

在此示例中,有一辆ego车辆和四辆其他车辆:中心车道中ego车辆前方的车辆、中心车道中ego车辆后方的车辆、右车道中ego车辆前方的卡车和左车道中的超车。

在本例中,您模拟一个ego车辆,它有6个雷达传感器和2个视觉传感器,覆盖360度视野。传感器存在一定的重叠和覆盖间隙。ego车辆在前部和后部都配备了远程雷达传感器和视觉传感器。车辆的每一侧都有两个近程雷达传感器,每个覆盖90度。两侧各有一个传感器,覆盖车辆的中部到尾部。两侧的另一个传感器从车辆的中间向前覆盖。

%创建场景exPath=fullfile(matlabroot,“例子”,“driving_fusion”,“主要的”);addpath(exPath) [scenario, egoVehicle, sensors] = helperCreateScenario;%创建显示对象显示= helperExtendedTargetTrackingDisplay;%创建动画编写器以记录图形的每一帧%动画写作。设置'RecordGIF'为真,启用GIF写入。gifWriter = helperGIFWriter (“图”、显示。数字...“RecordGIF”、假);

韵律学

在本例中,您使用一些关键指标来评估每个跟踪器的跟踪性能。特别是,您可以根据跟踪器在估计对象的位置、速度、尺寸(长度和宽度)和方向方面的准确性来评估跟踪器。这些指标可以使用跟踪误差度量类。为了定义跟踪目标的错误,这个例子使用了一个'custom' error函数,帮助扩展目标恐怖,列在本例末尾。

您还将基于诸如假轨道或冗余轨道的数量等指标来评估性能。这些指标可以使用trackAssignmentMetrics要定义跟踪目标和真实对象之间的距离,此示例使用“自定义”错误函数,helperExtendedTargetDistance,列在本例末尾。该函数将距离度量定义为位置、速度、尺寸和偏航的距离之和。

跟踪误差度量trackAssignmentMetrics提供跟踪算法有效性的多个度量。您还将基于最优子模式分配度量(OSPA)评估性能,该度量在每个时间步骤为跟踪算法提供一个评分值。这个度量可以用trackOSPAMetric类。为OSPA定义的“自定义”距离函数与分配度量相同。

%函数返回给定轨迹和真相的错误。errorFcn = @(跟踪、真理)helperExtendedTargetError(跟踪、真理);函数返回轨迹与真值之间的距离distFcn = @(跟踪、真理)helperExtendedTargetDistance(跟踪、真理);%函数从地面返回ID。默认值%标识符假定真理是用PlatformID.In标识的% drivingScenario, truth is identified with a ActorID。truthIdFcn=@(x)[x.ActorID];%创建度量对象。tem = trackErrorMetrics (...“ErrorFunctionFormat”,“自定义”,...“EstimationErrorLabels”,{“位置错误”,“VelocityError”,“DimensionsError”,“亚沃罗”},...“EstimationErrorFcn”errorFcn,...“TruthIdentifierFcn”, truthIdFcn);tam = trackAssignmentMetrics (...“DistanceFunctionFormat”,“自定义”,...“AssignmentDistanceFcn”distFcn,...“DivergenceDistanceFcn”distFcn,...“TruthIdentifierFcn”truthIdFcn,...“AssignmentThreshold”,30,...“DivergenceThreshold”,35);%创建度量对象tom=轨道光度计(...“距离”,“自定义”,...“DistanceFcn”distFcn,...“TruthIdentifierFcn”, truthIdFcn);

点目标跟踪器

这个multiObjectTracker系统对象™假设每个传感器每个对象都有一个检测,并使用全局最近邻方法将检测与跟踪相关联。它假定每个物体在一次扫描中最多可以被一个传感器检测一次。在这种情况下,模拟的雷达传感器具有足够高的分辨率,可以对每个对象产生多个探测。如果这些检测没有聚集,跟踪器会为每个对象生成多个跟踪。集群为每个集群返回一个检测,代价是具有更大的不确定性协方差,并丢失关于真实对象维度的信息。当两个对象彼此接近时(例如,当一辆车经过另一辆车时),集群也使它们难以区分。

trackerRunTimes = 0 (0, 3);ospaMetric = 0 (0, 3);创建一个multiObjectTracker追踪= multiObjectTracker (...“FilterInitializationFcn”@helperInitPointFilter,...“AssignmentThreshold”30岁的...“确认阈值”[4 - 5],...“DeletionThreshold”3);为可重复的结果重置随机数生成器种子= 2018;S = rng(种子);步伐= 1;%对于multiObjectTracker,雷达报告在Ego笛卡尔坐标系中%未报告速度。这使我们能够从多个地方聚集检测%的传感器。I = 1:6传感器{I}。HasRangeRate = false;传感器{我}。DetectionCoordinates =“身体”;结束

运行场景

虽然advance(场景)和ishghandle(display.Figure)%获得场景时间时间= scenario.SimulationTime;%从自我车辆传感器收集检测结果[detections,isValidTime] = helperDetect(sensor, egoVehicle, time);%更新跟踪器,如果有新的检测如果任何(isValidTime)对于点跟踪器,检测必须首先被聚类detectionClusters=helperClusterRadarDetections(检测);%更新跟踪器抽搐% confirmedTracks在方案坐标中确认跟踪=更新跟踪(跟踪程序、检测群集、时间);t=toc;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);%c。更新错误度量tem(确认跟踪、轨道ID、地面真相、真相);% d.更新ospa度量ospaMetric(timeStep,1) = tom(confirmedTracks, groundTruth);%更新鸟瞰图将轨道转换为ego坐标以供显示confirmedTracksEgo=helperConvertToego坐标(电子车辆,confirmedTracks);显示(电子车辆,传感器,检测,confirmedTracksEgo,检测群集);drawnow;%记录跟踪器运行时间trackerRunTimes(步伐,1)= t;timeStep = timeStep + 1;%捕捉动画帧giftwriter();结束结束%捕获累积轨迹度量。错误度量显示平均值%模拟过程中的误差值。assignmentMetricsMOT=tam.trackMetricsTable;errorMetricsMOT=tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“multiObjectTracking”);

结果表明,通过聚类,跟踪器可以对场景中的目标进行跟踪。然而,它也显示了与超车车辆相关的轨迹(黄色)从场景开始时车辆的前方移动到场景结束时车辆的后方。在场景的开始,超车在自我车(蓝色)的后面,所以雷达和视觉检测从它的前面进行。当超车超过自我车时,雷达先从超车侧面探测,然后从其后部探测,轨道移到车辆后部。

您还可以看到集群并不完美。当经过的车辆超过自我车辆(紫色)后面的车辆时,由于聚类不完美,两个轨迹都轻微向左偏移。由于缺少部分侧边而产生多个集群,因此在初始阶段会在轨道上创建一个冗余轨道。此外,由于探测距离的增加,在末端通过的车辆上会出现一个多余的轨道。

扩展对象跟踪器

在本节中,您将使用GGIW-PHD跟踪器(trackerPHDggiwphd)来跟踪物体。不像multiObjectTrackerGGIW-PHD是一种多目标滤波器,用于描述场景的概率假设密度(PHD)。为了对扩展目标建模,GGIW-PHD使用以下分布:

γ:描述预期检测次数的正值。

高斯:状态向量,描述目标的运动状态

Inverse-Wishart:描述椭圆范围的正定矩阵。

该模型假设每个分布是相互独立的。因此,GGIW-PHD滤波器中的概率假设密度(PHD)由多个GGIW分量的概率密度函数的加权和来描述。

PHD跟踪器需要计算密度中每个成分的可检测性。可检测性的计算需要与跟踪器一起使用的每个传感器的配置。您可以为其定义这些配置trackerPHD使用跟踪传感器配置类。检查helperCreateSensorConfigurations函数查看如何利用传感器属性定义跟踪器的传感器配置。

%设置传感器配置%传感器配置=帮助创建传感器配置(传感器、车辆);%转换函数和过滤器初始化函数为状态和%滤波器相关的。因此,它们没有在helper函数中设置。i=1:numel(传感器配置)您可以使用不同的技术来初始化每个过滤器%传感器通过使用不同的功能,为每个配置。传感器配置{i}.FilterInitializationFcn=@helperInitGGIWFilter;在该场景中,轨迹是在恒定的回合率状态空间中定义的%的坐标。对恒定转速模型的测量fcn可以%用作转换函数。sensorConfigurations{}。传感器变压器= @ctmeas;结束

定义跟踪器。

点目标跟踪器通常考虑检测的一个分区(集群),而trackerPHD则为一组检测创建多个可能的分区,并根据PHD过滤器中的当前组件对其进行评估。函数中的3和5定义了探测之间的上马氏距离和下马氏距离。这相当于定义每个检测聚类之间必须至少有3个分辨率,最多有5个分辨率。金宝搏官方网站helper函数封装了partitionDetections,不使用距离率测量来从侧面雷达进行分区检测。

partFcn = @ (x) helperPartitioningFcn (x, 3、5);追踪= trackerPHD (“传感器配置”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 450,...%添加出生成分的检测细胞(每个细胞多个检测)的最小负对数似然。“提取阈值”,0.75,...%要声明轨迹的筛选器组件的权重阈值“确认阈值”,0.85,...%要声明为已确认轨迹的过滤器组件的重量阈值“Merging阈值”,50,...%合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景帧中执行,因此传感器配置随时间而变化);

运行仿真。

释放并重启所有对象。重启(场景);释放(tem);释放(tam);%追踪者不受惩罚tam.AssignmentThreshold=tam.AssignmentThreshold-2;释放(显示);display.PlotClusteredDetection=false;gifWriter.pFrames={};I = 1:numel(sensors)释放(sensors{I});如果我<= 6个传感器{I}。HasRangeRate = true;传感器{我}。DetectionCoordinates =“球形传感器”;结束结束%恢复随机种子。rng(种子)%第一时间步步伐= 1;%运行该场景虽然advance(场景)和ishghandle(display.Figure)%获得场景时间时间= scenario.SimulationTime;%在ego车辆坐标中获取其他车辆的姿势ta = targetPoses (egoVehicle);%从自我车辆传感器收集检测结果[检测,isValidTime,配置]=帮助检测(传感器,电子车辆,时间,传感器配置);%使用所有检测更新跟踪器。请注意,没有%在将检测结果传递给跟踪器之前,需要对其进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在方案坐标中确认跟踪=跟踪器(检测、配置、时间);t=总有机碳;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);%c。更新错误度量tem(确认跟踪、轨道ID、地面真相、真相);% d.更新ospa度量OsParametric(timeStep,2)=tom(确认跟踪,地面真相);%更新鸟瞰图将轨道转换为ego坐标以供显示confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,确认tracksego);drawnow;%记录跟踪器运行时间trackerRunTimes(步伐,2)= t;timeStep = timeStep + 1;%捕获GIF的帧giftwriter();结束捕获事实并跟踪指标表assignmentMetricsGGIWPHD = tam.trackMetricsTable;errorMetricsGGIWPHD = tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“ggiwphdTracking”);

这些结果表明,GGIW-PHD可以处理每个传感器的每个对象的多个检测,而无需首先对这些检测进行聚类。此外,通过使用多个检测,跟踪器可以估计每个对象的位置、速度、尺寸和方向。图中的虚线椭圆形状显示了预期的扩展目标的t。过滤器初始化函数使用多个组件指定多个可能的大小及其相对权重。该列表可以扩展以添加更多大小,从而增加计算复杂性。相比之下,您还可以为每个检测初始化一个具有更高维度不确定性的组件。这将启用tracker自动估计物体的尺寸。也就是说,估计的准确性将取决于目标尺寸的可观测性,并且随着目标在车辆周围移动,轨道尺寸容易缩小和扩大。

GGIW-PHD滤波器假设检测结果分布在目标的椭圆中心。因此,轨迹往往跟随车辆的可观察部分。这些可观察的部分包括直接在自我车辆前面的车辆的后脸,或直接在自我车辆后面的车辆的前脸,例如,分别在自我车辆前面和后面的车辆的后脸和前脸。相比之下,在模拟过程中,通过车辆的长度和宽度得到了充分的观察。因此,其估计的椭圆与实际形状有更好的重叠。

GM-PHD矩形目标跟踪器

在本节中,您将使用GM-PHD跟踪器(trackerPHDgmphd)及矩形目标模型(initctrectgmphd)来跟踪物体。不像ggiwphd,它使用椭圆形状来跟踪范围,gmphd允许您使用高斯分布定义所选形状。矩形目标模型由运动模型定义,ctrectctrectjac和测量模型,ctrectmeasctrectmeasjac.

先前为trackerPHD定义的传感器配置保持不变,除了传感器变压器过滤器初始化FCN.

i=1:numel(传感器配置)传感器配置{i}.FilterInitializationFcn=@HelperInTectAngularFilter;%初始化矩形目标gmphdsensorConfigurations{}。传感器变压器= @ctrectcorners;%使用角来计算检测概率结束%使用新的传感器配置定义跟踪器追踪= trackerPHD (“传感器配置”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 600,...%检测细胞添加出生成分的最小负对数似然“提取阈值”,0.85,...%要声明轨迹的筛选器组件的权重阈值“确认阈值”, 0.95,...%要声明为已确认轨迹的过滤器组件的重量阈值“Merging阈值”,50,...%合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景帧中执行,因此传感器配置随时间而变化);释放并重启所有对象。重启(场景);I = 1:numel(sensors)释放(sensors{I});结束释放(tem);释放(tam);释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};%恢复随机种子。rng(种子)%第一时间步步伐= 1;%运行该场景虽然advance(场景)和ishghandle(display.Figure)%获得场景时间时间= scenario.SimulationTime;%在ego车辆坐标中获取其他车辆的姿势ta = targetPoses (egoVehicle);%从自我车辆传感器收集检测结果[检测,isValidTime,配置]=帮助检测(传感器,电子车辆,时间,传感器配置);%使用所有检测更新跟踪器。请注意,没有%在将检测结果传递给跟踪器之前,需要对其进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在方案坐标中确认跟踪=跟踪器(检测、配置、时间);t=总有机碳;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);%c。更新错误度量tem(确认跟踪、轨道ID、地面真相、真相);% d.更新ospa度量OsParametric(时间步,3)=tom(确认跟踪,地面真相);%更新鸟瞰图将轨道转换为ego坐标以供显示confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,确认tracksego);drawnow;%记录跟踪器运行时间trackerRunTimes(步伐,3)= t;timeStep = timeStep + 1;%捕获GIF的帧giftwriter();结束捕获事实并跟踪指标表assignmentMetricsGMPHD=tam.trackMetricsTable;errorMetricsGMPHD=tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“gmphdTracking”);%将随机数生成器返回到其以前的状态rng(S)rmpath(外派)

这些结果表明,GM-PHD也可以处理多个检测对象,每个传感器。与GGIW-PHD类似,它还可以估计对象的大小和方向。过滤器初始化函数使用类似于GGIW-PHD跟踪器的方法,对不同大小的多个组件进行初始化。

你可以注意到,估计的轨迹,建模为矩形,与模拟的地面真实对象有很好的拟合,由实色块描述。特别是,履带能够正确跟踪车辆的形状和运动中心。

评估跟踪性能

使用定量指标评估每个跟踪器的跟踪性能,如位置、速度、尺寸和方向的估计误差。还可以使用冗余和虚假轨道等指标评估轨道分配。

任务指标

helperPlotAssignmentMetrics(assignmentMetricsMOT、AssignmentMetricsGGIWPPH、assignmentMetricsGMPHD);

分配指标表明,冗余和虚假航迹由点目标跟踪器初始化和确认。这些轨迹是由于不完全聚类导致的,属于同一目标的检测被聚为多个聚类检测。相比之下,GGIW-PHD跟踪器和GM-PHD跟踪器在所有四个目标上保持跟踪,并且不创建任何虚假或冗余的跟踪。这些指标表明,扩展的对象跟踪器都正确地划分了检测,并将它们与正确的轨迹关联起来。

误差度量

helperPlotErrorMetrics (errorMetricsMOT errorMetricsGGIWPHD errorMetricsGMPHD);

该图显示了本例中使用的三种跟踪器的平均估计误差。由于点对象跟踪器不估计对象的偏航和尺寸,因此它们现在显示在绘图中。点目标跟踪器能够以合理的精度估计目标的运动学。ego车辆后面车辆的位置误差更大,因为当过往车辆超过该车辆时,该车辆被拖向左侧。当对象彼此接近时,这也是不完美聚类的产物。

如前所述,GGIW-PHD跟踪器假设测量是围绕物体的范围分布的,结果是在车辆可观察部分的轨迹中心。这也可以在TruthID 2和4的位置误差度量中看到。跟踪器能够估计物体的尺寸,精度约为0.3米的车辆前后自我车辆。因为车辆的尺寸定义有更高的确定性helperInitGGIWFilter功能,即使最佳拟合椭圆的长度非常低,跟踪器也不会折叠这些车辆的长度。由于在所有尺寸上都观察到过往车辆(TruthID 3),因此其尺寸测量比其他车辆更准确。然而,当过往车辆相对于ego车辆进行机动时,偏航估计的误差更大。

本例中的GM-PHD使用矩形目标模型,并使用接收到的测量值来评估目标边界上的预期测量值。该模型有助于跟踪器更准确地估计形状和方向。但是,评估矩形目标边缘上预期测量值的过程是可计算的价格要贵得多。

OSPA度量

如前所述,OSPA指标旨在描述使用单个分数的跟踪算法的性能。请注意,OSPA充分捕获了跟踪算法的性能,该算法从GM-PHD到GGIW-PHD再到点目标跟踪器,如使用错误和分配度量所述。

ospaFig =图;情节(ospaMetric“线宽”2);传奇(点目标跟踪的,“GGIW-PHD追踪”,“矩形GM-PHD追踪”); xlabel(“时间步(k)”);ylabel (“OSPA”);

比较时间性能

在前面,您了解了不同的技术、它们对目标模型的假设以及最终的跟踪性能。现在比较跟踪器的运行时间。请注意,与GM-PHD相比,GGIW-PHD过滤器提供了显著的计算优势,但代价是跟踪性能下降。

runTimeFig =图;h =情节(trackerRunTimes(3:,:)。/ trackerRunTimes(3:最终,1),“线宽”2);传奇(点目标跟踪的,“GGIW-PHD追踪”,“矩形GM-PHD追踪”); xlabel(“时间步(k)”);ylabel (' $ $ \压裂{t_{追踪}识别}{t_ {multiObjectTracker}识别}$ $”,“口译员”,“乳胶”,“字体大小”,14); ylim([0最大值([h.YData])+1]);

总结

这个例子展示了如何使用不同的方法在一个传感器扫描中跟踪返回多个检测的对象。这些方法可用于用高分辨率传感器(如雷达或激光传感器)跟踪目标。

工具书类

[1] Granström, Karl, Marcus Baum, Stephan Reuter。扩展对象跟踪:介绍,概述和应用信息融合进展杂志2017年12月第12卷第2期。

[2] 格兰斯特伦、卡尔、克里斯蒂安·伦德奎斯特和乌穆特·奥古纳。“使用激光测量跟踪矩形和椭圆形扩展目标”,第14届信息融合国际会议。IEEE,2011年。

[3] 格兰斯特伦,卡尔。“使用PHD滤波器的扩展目标跟踪”,2012年

金宝app支持功能

帮助扩展目标恐怖

函数定义被跟踪目标与相关地面真值之间的误差。

作用[posError、velError、dimeror、yawError]=helperExtendedTargetError(跟踪、真相)%错误作为目标轨迹和相关真理的函数。%从地面真相中获取真实信息。truePos = truth.Position(1:2)”;%所有车辆的位置都在后轴上。我们想要计算%从车辆中心的误差rot = [cosd(truth.Yaw) -sind(truth.Yaw);sind(truth.Yaw) cosd(truth.Yaw)];true = true + rot*[true .轴距/2;0];trueVel = truth.Velocity (1:2);trueYaw = truth.Yaw (:);trueDims = [truth.Length; truth.Width];%从轨迹中获取估计值。% GGIW-PHD跟踪器输出一个结构字段'Extent'和'SourceIndex'% GM-PHD跟踪器输出带有但不带有“Extent”的结构体%multiObjectTracker输出objectTrack如果isa(轨道,“objectTrack”)estPos=轨道状态([13]);estVel=轨道状态([24]);%在multiObjectTracker中没有偏航或尺寸信息。Estaw=nan;estDims=[nan;nan];elseif伊斯菲尔德(田径,“范围”)%带有GGIWPHD的trackerPHDestPos=轨道状态([13]);estVel=轨道状态([2 4]);estYaw=atan2d(estVel(2),estVel(1));d=eig(轨道范围);尺寸=2*sqrt(d);estDims=[最大(dims);最小(dims)];其他的% trackerPHD与GMPHDestPos=轨道状态(1:2);Estaw=轨道状态(4);EstLevel=[轨道状态(3)*cosd(estYaw);轨道状态(3)*sind(estYaw)];estDims=轨道状态(6:7);结束%计算每个属性的2-误差范数。posError = norm(truePos(:) - estPos(:)));velError = norm(true level (:) - estVel(:)));dimError = norm(trueDims(:) - estDims(:)));yaerror = norm(trueYaw(:) - estYaw(:));结束

helperExtendedTargetDistance

函数定义轨道和地面真值之间的距离。

作用dist = helperExtendedTargetDistance(跟踪、真理)%这个函数计算轨道和一个真值之间的距离。2019-2020 The MathWorks, Inc.版权所有%各方面的错误[posError、velError、dimeror、yawError]=帮助扩展目标恐怖(跟踪、真相);%对于multiObjectTracker,添加一个不估计偏航的常量惩罚%和维度如果isnan(二聚体)二聚体=1;结束如果isnan(yaerror) yaerror = 1;结束距离是误差之和dist = posError + velError + dimError + yaerror;结束

helperInitGGIWFilter

函数从检测单元格创建ggiwphd筛选器。

作用博士= helperInitGGIWFilter(变长度输入宗量)% helperInitGGIWFilter用于初始化GGIW-PHD过滤器%扩展对象跟踪示例%创建一个ggiwphd过滤器使用5个状态和恒定的轮转率模型。博士= ggiwphd(0(5、1)、眼睛(5),...“StateTransitionFcn”@constturn,...“状态转换JacobianFCN”@constturnjac,...“MeasurementFcn”@ctmeas,...“测量JacobianFCN”@ctmeasjac,...“HasAdditiveMeasurementNoise”,真的,...“HasAdditiveProcessNoise”错误的...“ProcessNoise”诊断接头([1 1 3]),...“MaxNumComponents”, 1000,...“ExtentRotationFcn”@extentRotFcn,...“PositionIndex”,[1 3]);%如果在没有输入的情况下调用函数,即%根据出生密度,不向混合物中添加任何成分。如果纳金==0%Nullify返回0个组件。废除(博士学位);其他的%当使用检测输入调用时,向过滤器添加两个组件,% 1用于汽车,% 1用于卡车,在此基础上可增加更多的部件%事先了解场景,例如行人或摩托车。%这是一种“多模型”类型的方法。另一种方法是添加%只有一个分量在维度中具有较高的协方差。这个%后者的计算要求较低,但有跟踪的趋势%物体的可观察尺寸。例如,如果只有背面是%可见时,测量噪声可能会引起物体的长度不一致%萎缩。%探测检测=变长度输入宗量{1};%使仰角测量创建一个三维过滤器使用% initctggiwphd如果检测{1}.SensorIndex<7i=1:numel(detections)detections{i}.Measurement=[detections{i}.Measurement(1);0;detections{i}.Measurement(2:end)];检测{i}.MeasurementNoise=blkdiag(检测{i}.MeasurementNoise(1,1),0.4,检测{i}.MeasurementNoise(2:end,2:end));检测{i}.MeasurementParameters(1).HasElevation=true;结束结束phd3d = initctggiwphd(检测);%使用三维过滤器设置二维过滤器的状态博士学位。州= phd3d.States (1:5);博士学位。StateCovariances = phd3d.StateCovariances (1:5, 1:5);博士学位。DegreesOfFreedom = 1000;博士学位。scalematrice = (1000-4)*diag([4.7/2 1.8/2].^2);添加卡车尺寸作为第二分量追加(博士,博士学位);phd.ScaleMatrices(:: 2) =(1000 - 4) *诊断接头([8.1 / 2 2.45 / 2]。^ 2);博士学位。GammaForgettingFactors = [1.03 1.03];%各组分的相对权重。可以看作是%道路上存在一辆汽车与一辆卡车。博士学位。权重= [0.7 0.3];结束结束作用R=extentRotFcn(x,dT)%预测期间范围的旋转。w = x (5);θ= w * dT;R = [cosd(theta) -sind(theta);sind(theta) cosd(theta)];结束

helperInitRectangularFilter

函数从检测单元创建一个gmphd矩形目标过滤器

作用filter=helperInitRectangularFilter(varargin)% helperInitRectangularFilter用于初始化矩形的函数% target PHD过滤器用于扩展对象跟踪示例%版权归MathWorks公司所有。如果纳金==0%如果在没有输入的情况下调用,只需使用initctrectgmphd函数%创建一个没有组件的PHD过滤器。过滤器=initctrectgmphd;设定过程噪声filter.ProcessNoise=diag([13]);其他的%当使用检测输入调用时,向过滤器添加两个组件,% 1用于汽车,% 1用于卡车,在此基础上可增加更多的部件%事先了解场景,例如行人或摩托车。%这是一种“多模型”类型的方法。另一种方法是添加%只有一个分量在维度中具有较高的协方差。这个%后者的计算要求较低,但有跟踪的趋势%物体的可观察尺寸。例如,如果只有背面是%可见时,测量噪声可能会引起物体的长度不一致%萎缩。%探测检测=变长度输入宗量{1};%创建一个带有矩形模型的GM-PHD过滤器过滤器= initctrectgmphd(检测);乘用车的长度和宽度filter.States(者,1)= (4.7,1.8);%尺寸精度高lCov=1e-4;wCov=1e-4;lwCorr=0.5;lwCov=sqrt(lCov*wCov)*lwCorr;状态协方差(6:7,6:7,1)=[lCov lwCov;lwCov wCov];%通过附加过滤器本身,再添加一个组件。追加(过滤器,过滤器);%将长度和宽度设置为卡车尺寸状态(6:7,2)=[8.1;2.45];%各组分的相对权重过滤器。权重= [0.7 0.3];结束结束