主要内容

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

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

简介

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

使用高分辨率传感器的主要好处是获得更多关于物体的信息,比如它的尺寸和方向。这些附加信息可以提高检测概率,降低误报率。

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

相比之下,扩展对象跟踪器可以处理每个对象的多个检测。此外,这些跟踪器不仅可以估计物体的位置和速度等运动状态,还可以估计物体的尺寸和方向。在这个例子中,你可以使用以下追踪器跟踪自我战车周围的车辆:

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

  • 一个GGIW-PHD(伽马高斯逆Wishart PHD)跟踪器,trackerPHDggiwphd过滤器

  • 一个GM-PHD(高斯混合PHD)跟踪器,trackerPHDgmphd滤波器采用矩形目标模型

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

设置

场景

在这个例子中,有一辆自我车和其他四辆车:一辆在中心车道自我车前面的车,一辆在中心车道自我车后面的车,一辆在右车道自我车前面的卡车,一辆在左车道超车。

在本例中,您将模拟一个自我车辆,它拥有6个雷达传感器和2个视觉传感器,覆盖360度视野。传感器有一定的重叠和覆盖缺口。“自我”车辆在车辆的前后都装有远程雷达传感器和视觉传感器。车辆的每一侧都有两个近程雷达传感器,每个覆盖90度。两边各有一个传感器,从车辆中间覆盖到后部。两侧的另一个传感器从车辆中间向前覆盖。

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

指标

在本例中,您将使用一些关键指标来评估每个跟踪器的跟踪性能。特别是,您可以根据跟踪器在估计位置、速度、尺寸(长度和宽度)和对象的方向方面的准确性来评估跟踪器。可以对这些指标进行评估trackErrorMetrics类。为了从地面真值定义被跟踪目标的误差,这个例子使用了一个“自定义”误差函数,helperExtendedTargetError,列在本例的末尾。

您还将基于诸如假轨道或冗余轨道数量等指标来评估性能。方法可以计算这些指标trackAssignmentMetrics类。为了定义跟踪目标和真值对象之间的距离,这个例子使用了一个'custom' error函数,helperExtendedTargetDistance,列在本例的末尾。该函数将距离度量定义为位置、速度、尺寸和偏航距离的总和。

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

函数返回给定轨迹和真值的错误。。helperExtendedTargetError(track,truth);函数返回轨迹与真理之间的距离。。distFcn = @(track,truth)helperExtendedTargetDistance(track,truth);函数返回来自ground truth的id。默认的%标识符假定真相是用PlatformID标识的。在% driingscenario中,真理用ActorID标识。truthIdFcn = @(x)[x. actorid];%创建度量对象。tem = trackErrorMetrics(...“ErrorFunctionFormat”“自定义”...“EstimationErrorLabels”, {的位置误差“VelocityError”“DimensionsError”“YawError”},...“EstimationErrorFcn”errorFcn,...“TruthIdentifierFcn”, truthIdFcn);tam = trackAssignmentMetrics(...“DistanceFunctionFormat”“自定义”...“AssignmentDistanceFcn”distFcn,...“DivergenceDistanceFcn”distFcn,...“TruthIdentifierFcn”truthIdFcn,...“AssignmentThreshold”30岁的...“DivergenceThreshold”35);创建ospa度量对象。tom = trackOSPAMetric(...“距离”“自定义”...“DistanceFcn”distFcn,...“TruthIdentifierFcn”, truthIdFcn);

点对象跟踪器

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

trackerRunTimes = 0 (0,3);ospaMetric = 0 (0,3);创建一个多对象跟踪器跟踪器= multiObjectTracker...“FilterInitializationFcn”@helperInitPointFilter,...“AssignmentThreshold”30岁的...“ConfirmationThreshold”, [4 5],...“DeletionThreshold”3);重置随机数生成器以获得可重复的结果种子= 2018;S = rng(种子);timeStep = 1;对于多对象跟踪器,雷达报告在自我笛卡尔框架和做%未报告速度。这允许我们对多个检测进行聚类%的传感器。I = 1:6传感器{I}。HasRangeRate = false;传感器{我}。DetectionCoordinates =“身体”结束

运行该场景。

advance(场景)&& ishhandle(显示。图)获取场景时间time = scenario.SimulationTime;收集自我车辆传感器的检测[detections,isValidTime] = helperDetect(sensors, egoVehicle, time);如果有新的检测到,更新跟踪器。如果任何(isValidTime)对于点跟踪器,必须首先群集检测detectionClusters = helperClusterRadarDetections(detections);%更新跟踪器抽搐% confirmedTracks位于场景坐标中confirmedTracks = updateTracks(tracker, detectionClusters, time);T = toc;%更新指标获取基本事实groundTruth = scenario.Actors(2:end);%除了自我b.更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);% d.更新ospa度量值ospaMetric(timeStep,1) = tom(confirmedTracks, groundTruth);更新鸟瞰图转换轨道到自我坐标显示。confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,confirmedTracksEgo, detectionClusters);drawnow;记录跟踪器运行时间trackerRunTimes(timeStep,1) = t;timeStep = timeStep + 1;为动画捕获帧gifWriter ();结束结束捕获累积的跟踪指标。误差指标显示平均值模拟误差的%值。assignmentMetricsMOT = tam.trackMetricsTable;errorMetricsMOT = tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“multiObjectTracking”);

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

您还可以看到集群并不完美。当经过的车辆超过自我车辆(紫色)后面的车辆时,由于不完美的聚类,两个轨道都轻微向左移动。由于错过部分边边时创建了多个集群,最初在轨道上创建了冗余轨道。此外,由于探测到的距离增加,在经过的车辆上出现了多余的轨迹。

扩展对象跟踪器

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

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

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

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

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

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

设置传感器配置sensorConfigurations = helperCreateSensorConfigurations(sensors,egoVehicle);转换函数和过滤器初始化函数是状态和%过滤器相关。因此,它们不会在helper函数中设置。i = 1:numel(sensorConfigurations)您可以使用不同的技术来初始化每个过滤器。%传感器,为每种配置使用不同的函数。sensorConfigurations{}。FilterInitializationFcn= @helperInitGGIWFilter;在该场景中,履带定义在恒定的周转速率状态空间中%的坐标。恒定周转率模型的MeasurementFcn可以为%用作变换函数。sensorConfigurations{}。SensorTransformFcn= @ctmeas;结束

定义跟踪器。

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

partFcn = @(x)helperPartitioningFcn(x,3,5);跟踪器=跟踪器phd (“SensorConfigurations”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 450,...%添加出生成分的检测细胞(每个细胞多次检测)的最小负对数可能性。“ExtractionThreshold”, 0.75,...%要声明为轨迹的过滤器组件的权重阈值“ConfirmationThreshold”, 0.85,...%要声明为确认轨迹的过滤器组件的权重阈值“MergingThreshold”, 50岁,...合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景帧中执行,因此传感器配置随时间变化);

运行模拟。

释放并重新启动所有对象。重启(场景);释放(tem);释放(tam);没有惩罚追踪博士tam。AssignmentThreshold = tam。AssignmentThreshold - 2;释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};I = 1:numel(传感器)释放(传感器{I});如果I <= 6个传感器{I}。HasRangeRate = true;传感器{我}。DetectionCoordinates =“球形传感器”结束结束恢复随机种子。rng(种子)%第一次步timeStep = 1;%运行场景advance(场景)&& ishhandle(显示。图)获取场景时间time = scenario.SimulationTime;在自我车辆坐标中获取其他车辆的姿态。ta = targetpose (egoVehicle);收集自我车辆传感器的检测[detections, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations);用所有检测更新跟踪器。。注意没有%需要在将检测传递给跟踪器之前将它们聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks位于场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标获取基本事实groundTruth = scenario.Actors(2:end);%除了自我b.更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);% d.更新ospa度量值ospaMetric(timeStep,2) = tom(confirmedTracks, groundTruth);更新鸟瞰图转换轨道到自我坐标显示。confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,confirmedTracksEgo);drawnow;记录跟踪器运行时间trackerRunTimes(timeStep,2) = t;timeStep = timeStep + 1;%为GIF捕获帧gifWriter ();结束捕获事实并跟踪指标表。assignmentMetricsGGIWPHD = tam.trackMetricsTable;errorMetricsGGIWPHD = tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“ggiwphdTracking”);

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

GGIW-PHD滤波器假设探测分布在目标的椭圆中心周围。因此,轨迹倾向于跟随车辆的可观察部分。这些可观察的部分包括自我车辆正前方车辆的后脸,或自我车辆正后方车辆的前脸,例如,自我车辆正前方和后方车辆的前后脸。相比之下,在模拟过程中充分观察了经过车辆的长度和宽度。因此,其估计的椭圆与实际形状有较好的重叠。

GM-PHD矩形目标跟踪器

在本节中,您将使用GM-PHD跟踪器(trackerPHDgmphd)和一个矩形目标模型(initctrectgmphd)来追踪物体。不像ggiwphd,它使用椭圆形状来跟踪范围,gmphd允许您使用高斯分布来定义您选择的形状。矩形目标模型由运动模型定义,ctrect而且ctrectjac测量模型,ctrectmeas而且ctrectmeasjac

的定义之外,之前为trackerPHD定义的传感器配置保持不变SensorTransformFcn而且FilterInitializationFcn

i = 1:numel(sensorConfigurations) sensorConfigurations{i}。FilterInitializationFcn = @ helperinit矩形过滤器;初始化一个矩形目标gmphdsensorConfigurations{}。SensorTransformFcn= @ctrectcorners;%用拐角计算检测概率结束%使用新的传感器配置定义跟踪器跟踪器=跟踪器phd (“SensorConfigurations”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 600,...%添加出生成分的检测细胞的最小负对数可能性“ExtractionThreshold”, 0.85,...%要声明为轨迹的过滤器组件的权重阈值“ConfirmationThreshold”, 0.95,...%要声明为确认轨迹的过滤器组件的权重阈值“MergingThreshold”, 50岁,...合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景帧中执行,因此传感器配置随时间变化);释放并重新启动所有对象。重启(场景);I = 1:numel(传感器)释放(传感器{I});结束释放(tem);释放(tam);释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};恢复随机种子。rng(种子)%第一次步timeStep = 1;%运行场景advance(场景)&& ishhandle(显示。图)获取场景时间time = scenario.SimulationTime;在自我车辆坐标中获取其他车辆的姿态。ta = targetpose (egoVehicle);收集自我车辆传感器的检测[detections, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations);用所有检测更新跟踪器。。注意没有%需要在将检测传递给跟踪器之前将它们聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks位于场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标获取基本事实groundTruth = scenario.Actors(2:end);%除了自我b.更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);% d.更新ospa度量值ospaMetric(timeStep,3) = tom(confirmedTracks, groundTruth);更新鸟瞰图转换轨道到自我坐标显示。confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,confirmedTracksEgo);drawnow;记录跟踪器运行时间trackerRunTimes(timeStep,3) = t;timeStep = timeStep + 1;%为GIF捕获帧gifWriter ();结束捕获事实并跟踪指标表。assignmentMetricsGMPHD = tam.trackMetricsTable;errorMetricsGMPHD = tem.cumulativeTruthMetrics;%如果请求写GIFwriteAnimation (gifWriter“gmphdTracking”);将随机数生成器返回到其以前的状态。rng (S) rmpath (exPath)

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

您可以注意到,被建模为矩形的估计轨迹与由纯色斑块描述的模拟地面真实对象非常吻合。特别是,轨道能够正确地跟踪车辆的形状和运动中心。

评估跟踪性能

利用位置、速度、尺寸和方向的估计误差等量化指标评估每个跟踪器的跟踪性能。还要使用冗余和假音轨等指标来评估音轨分配。

任务指标

helpplotassignmentmetrics (assignmentMetricsMOT, assignmentMetricsGGIWPHD, assignmentMetricsGMPHD);

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

误差指标

helpperploterrormetrics (errorMetricsMOT, errorMetricsGGIWPHD, errorMetricsGMPHD);

该图显示了本例中使用的三种类型跟踪器的平均估计误差。因为点对象跟踪器不估计对象的偏航和尺寸,它们现在显示在图中。点目标跟踪器能够以合理的精度估计目标的运动学。自我车辆后面的车辆位置误差较大,因为它是被前面的车辆拖到左边的。当对象彼此接近时,这也是不完美集群的产物。

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

本例中的GM-PHD使用一个矩形目标模型,并使用接收到的测量值来评估目标边界上的预期测量值。该模型有助于跟踪器更准确地估计形状和方向。然而,计算矩形目标边缘上的预期测量值的过程在计算上比较昂贵。

OSPA规

如前所述,OSPA指标旨在使用单一评分来描述跟踪算法的性能。注意,正如使用误差和分配指标描述的那样,OSPA充分捕捉了从GM-PHD到ggi - phd再到点目标跟踪器的跟踪算法的性能下降。

ospaFig = figure;情节(ospaMetric“线宽”2);传奇(“点目标跟踪器”“GGIW-PHD追踪”“矩形GM-PHD跟踪器”);包含(“时间步长(k)”);ylabel (“OSPA”);

比较时间和性能

在前面,您了解了不同的技术、它们对目标模型的假设以及由此产生的跟踪性能。现在比较跟踪器的运行时间。注意,ggi - phd滤波器比GM-PHD提供了显著的计算优势,但以降低跟踪性能为代价。

runTimeFig = figure;h = plot(trackerRunTimes(3:end,:)./trackerRunTimes(3:end,1),“线宽”2);传奇(“点目标跟踪器”“GGIW-PHD追踪”“矩形GM-PHD跟踪器”);包含(“时间步长(k)”);ylabel (' $ $ \压裂{t_{追踪}识别}{t_ {multiObjectTracker}识别}$ $”“翻译”“乳胶”“字形大小”14);ylim([0 max([h.YData]) + 1]);

总结

这个例子展示了如何使用不同的方法在单个传感器扫描中跟踪返回多个检测的对象。这些方法可以用于跟踪带有高分辨率传感器的物体,如雷达或激光传感器。

参考文献

[1] Granström,卡尔,马库斯·鲍姆和斯蒂芬·路透。扩展对象跟踪:介绍、概述和应用。信息融合进展杂志.2017年12月第12卷第2期。

[2] Granström,卡尔,克里斯蒂安·伦德奎斯特和乌姆特·奥格纳。“用激光测量跟踪矩形和椭圆扩展目标。”第十四届信息融合国际会议。IEEE 2011。

[3] Granström,卡尔。“使用PHD滤波器扩展目标跟踪。”2012

金宝app支持功能

helperExtendedTargetError

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

函数[posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth)%误差作为目标轨迹和相关真值的函数。从事实真相中获取真实的信息。。truePos = true . position (1:2)';所有车辆的位置都在后桥上。我们要计算一下%从飞行器中心的误差rot = [cosd(truth.Yaw) -sind(truth.Yaw);sind(truth.Yaw) cosd(truth.Yaw)];truePos = truePos + rot*[truth.轴距/2;0];trueVel = truth.Velocity(1:2);trueYaw = true . yaw (:);trueDims = [true . length; true . width];%从轨道得到估计的价值。GGIW-PHD跟踪器输出一个结构字段'Extent'和'SourceIndex'% GM-PHD跟踪器输出包含但不包含“Extent”的结构% multiObjectTracker输出objectTrack如果isa(轨道,“objectTrack”) estPos =轨道。状态(3 [1]);estVel = track。状态([2 - 4]);在multiObjectTracker中没有偏航或尺寸信息。estYaw = nan;estDims = [nan;nan];elseifisfield(轨道,“程度”% trackerPHD with GGIWPHDestPos = track。状态(3 [1]);estVel = track。状态([2 - 4]);estYaw = atan2d(estVel(2),estVel(1));d = eig(track.Extent);Dims = 2*√(d);estDims = [max(dims);min(dims)];其他的带有GMPHD的% trackerPHDestPos = track.State(1:2);estYaw = track.State(4);estVel = [track.State(3)*cosd(estYaw);track.State(3)*sind(estYaw)];estDims = track.State(6:7);结束计算每个属性的2范数误差。posError = norm(truePos(:) - estPos(:)));velError = norm(trueVel(:) - estVel(:));dimirror = norm(trueDims(:) - estDims(:));yawError = norm(trueYaw(:) - estYaw(:));结束

helperExtendedTargetDistance

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

函数dist = helperExtendedTargetDistance(track,truth)这个函数计算轨迹和真值之间的距离。。版权所有The MathWorks, Inc.%每个方面的错误[posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth);对于multiObjectTracker,为没有估计偏航添加一个常量惩罚%和尺寸如果isnan(dimError) dimError = 1;结束如果isnan(yawError) yawError = 1;结束%距离是误差之和dist = posError + velError + dimError + yawError;结束

helperInitGGIWFilter

函数从检测单元创建一个ggiwphd过滤器。

函数phd = helperInitGGIWFilter(varargin)初始化GGIW-PHD过滤器的函数扩展的对象跟踪示例创建一个ggiwphd过滤器使用5个状态和恒定的翻率模型。PhD = ggiwphd(zero (5,1),eye(5),...“StateTransitionFcn”@constturn,...“StateTransitionJacobianFcn”@constturnjac,...“MeasurementFcn”@ctmeas,...“MeasurementJacobianFcn”@ctmeasjac,...“HasAdditiveMeasurementNoise”,真的,...“HasAdditiveProcessNoise”假的,...“ProcessNoise”,diag([1 1 3]),...“MaxNumComponents”, 1000,...“ExtentRotationFcn”@extentRotFcn,...“PositionIndex”3 [1]);%如果在没有输入的情况下调用函数,即的预测部分%出生密度,混合物中不添加任何成分。如果Nargin == 0% Nullify返回0个组件。取消(博士);其他的当使用检测输入调用时,向过滤器中添加两个组件,轿车一辆,卡车一辆,可在此基础上增加更多部件。对场景,例如行人或摩托车的先验知识。。这是一种“多模型”类型的方法。另一种方法是添加只有一个分量在维度上具有较高的协方差。的% later在计算上要求较低,但有跟踪的倾向物体的可观察尺寸。例如,如果只有背面是%可见时,测量噪声可能导致物体的长度变长%萎缩。%检测检测结果= varargin{1};启用仰角测量以使用创建3d滤镜% initctggiwphd如果检测{1}。SensorIndex < 7I = 1:numel(detections) detections{I}。测量= [detections{i}.Measurement(1);0;detections{i}.Measurement(2:end)];检测我{}。MeasurementNoise = blkdiag(detecments {i}.MeasurementNoise(1,1),0.4, detecments {i}.MeasurementNoise(2:end,2:end));检测{我}.MeasurementParameters(1)。HasElevation = true;结束结束Phd3d = initctggiwphd(检测);使用3d滤镜设置2d滤镜的状态博士学位。States = phd3d.States(1:5);博士学位。statecovariance = phd3d. statecovariance (1:5,1:5);博士学位。DegreesOfFreedom = 1000;博士学位。ScaleMatrices = (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];%各部件的相对权重。的概率路上有一辆汽车vs一辆卡车。。博士学位。Weights = [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初始化矩形的函数%目标PHD过滤器用于扩展对象跟踪示例版权所有2019 The MathWorks, Inc.如果Nargin == 0如果在没有输入的情况下调用,只需使用initctrectgmphd函数来创建一个没有组件的PHD过滤器。。Filter = initctrectgmphd;设置过程噪声过滤器。ProcessNoise = diag([1 3]);其他的当使用检测输入调用时,向过滤器中添加两个组件,轿车一辆,卡车一辆,可在此基础上增加更多部件。对场景,例如行人或摩托车的先验知识。。这是一种“多模型”类型的方法。另一种方法是添加只有一个分量在维度上具有较高的协方差。的% later在计算上要求较低,但有跟踪的倾向物体的可观察尺寸。例如,如果只有背面是%可见时,测量噪声可能导致物体的长度变长%萎缩。%检测检测结果= varargin{1};创建一个GM-PHD滤波器的矩形模型Filter = initctrectgmphd(检测);乘用车的长度宽度filter.States(6:7,1) = [4.7;1.8];高度确定的尺寸lCov = 1e-4;wCov = 1e-4;lwCorr = 0.5;lwCov = sqrt(lCov*wCov)*lwCorr;filter. statecovariance (6:7,6:7,1) = [lCov lwCov;lwCov wCov];通过附加过滤器本身来添加另一个组件。。追加(过滤器,过滤器);设置长度和宽度为卡车尺寸filter.States(6:7,2) = [8.1;2.45];%各组成部分的相对权重过滤器。Weights = [0.7 0.3];结束结束