主要内容

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

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

简介

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

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

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

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

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

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

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

您将评估使用的所有跟踪器的跟踪结果trackErrorMetrics而且trackAssignmentMetrics,提供多种衡量追踪器有效性的方法。您还将使用最优子模式分配度量(OSPA)来评估结果,trackOSPAMetric,其目的是使用综合得分来评估跟踪器的性能。

设置

场景

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

在这个例子中,你模拟一辆自我车辆,它有6个雷达传感器和2个覆盖360度视野的视觉传感器。传感器有一些重叠和覆盖差距。ego车辆在车辆的前面和后面都配备了一个远程雷达传感器和一个视觉传感器。车辆的每一侧有两个近程雷达传感器,每个覆盖90度。两侧各有一个传感器,从车辆中间覆盖到后部。两侧的另一个传感器从车辆中间向前覆盖。

%创建场景path = 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定义的“自定义”距离函数与赋值指标相同。

函数返回给定轨道和真值的错误。errorFcn = @(track,truth)helperExtendedTargetError(track,truth);函数返回轨道与真实值之间的距离。distFcn = @(track,truth)helperExtendedTargetDistance(track,truth);函数返回来自ground truth的id。默认的% identifier假设真理是用PlatformID标识的。在% driveingscenario, true用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跟踪器= multiObjectTracker(...“FilterInitializationFcn”@helperInitPointFilter,...“AssignmentThreshold”30岁的...“ConfirmationThreshold”, [4 5],...“DeletionThreshold”3);重置随机数生成器以获得可重复的结果种子= 2018;S = rng(种子);timeStep = 1;对于multiObjectTracker,雷达在自我笛卡尔框架中报告%不报告速度。这允许我们从多个中进行群集检测%的传感器。I = 1:6传感器{I}。HasRangeRate = false;传感器{我}。DetectionCoordinates =“身体”结束

运行该场景。

advance(场景)&& ishhandle(显示。图)获取场景时间时间= scenario.SimulationTime;从自我车辆传感器收集检测[detection,isValidTime] = helperDetect(sensors, egoVehicle, time);如果有新的检测,更新跟踪器。%如果任何(isValidTime)对于点跟踪器,必须首先对检测进行聚类detectionClusters = helperClusterRadarDetections(detections);更新跟踪器抽搐% confirmedTracks位于场景坐标中confirmedTracks = updateTracks(跟踪器,detectionClusters, time);T = toc;%更新指标a.获得基本真理groundTruth =场景。演员(2:结束);%除了自我更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);d.更新ospa metricospaMetric(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”);

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

您还可以看到集群并不完美。当通过的车辆超过后面的车辆(紫色)时,由于不完全聚类,两个轨道都轻微向左移动。最初在轨道上创建冗余轨道,这是由于当部分侧边缘丢失时创建的多个集群。此外,由于检测之间的距离增加,在结束时通过的车辆上出现冗余轨道。

扩展对象跟踪器

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

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

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

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

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

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

设置传感器配置sensorConfigurations = helperCreateSensorConfigurations(传感器,egoVehicle);转换函数和过滤器初始化函数是state和%依赖于过滤器。因此,它们不在helper函数中设置。i = 1:数值(sensorConfigurations)您可以使用不同的技术来初始化每个过滤器%传感器,为每个配置使用不同的功能。sensorConfigurations{}。FilterInitializationFcn= @helperInitGGIWFilter;在该场景中,轨道定义在恒定的回合率状态空间中%的坐标。恒定转换率模型的MeasurementFcn可以%用作变换函数。sensorConfigurations{}。SensorTransformFcn= @ctmeas;结束

定义跟踪器。

点对象跟踪器通常只考虑检测的一个分区(集群),而trackerPHD则为一组检测创建多个可能的分区,并根据PHD过滤器中的当前组件对其进行评估。下面函数中的3和5定义了检测之间的上下马氏距离。这相当于定义每个检测集群之间的距离必须最小为3个分辨率,最大为5个分辨率。万博 尤文图斯helper函数环绕partitionDetections并且不使用距离率测量来从侧面雷达进行分区检测。

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

运行模拟。

释放并重新启动所有对象。重启(场景);释放(tem);释放(tam);追踪者phd没有惩罚tam。AssignmentThreshold = tam。分配阈值- 2;释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};I = 1:数字(传感器)释放(传感器{I});如果I <= 6个传感器{I}。HasRangeRate = true;传感器{我}。DetectionCoordinates =“球形传感器”结束结束%恢复随机种子。rng(种子)%第一次步骤timeStep = 1;%运行场景advance(场景)&& ishhandle(显示。图)获取场景时间时间= scenario.SimulationTime;在本车辆坐标中获取其他车辆的姿态。ta = targetpose (egoVehicle);从自我车辆传感器收集检测[detected, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations);用所有检测更新跟踪器。%注意,没有%需要在将检测传递给跟踪器之前对检测进行聚类。此外,传感器配置将作为输入传递给%追踪。抽搐% confirmedTracks位于场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标a.获得基本真理groundTruth =场景。演员(2:结束);%除了自我更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);d.更新ospa metricospaMetric(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: number (sensorConfigurations) sensorConfigurations{i}.使用实例FilterInitializationFcn = @ helperinitrectangle;初始化一个矩形目标gmphdsensorConfigurations{}。SensorTransformFcn= @ctrectcorners;%利用拐角计算检测概率结束使用新的传感器配置定义跟踪器追踪器=追踪器“SensorConfigurations”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 600,...检测细胞添加出生成分的最小负对数可能性“ExtractionThreshold”, 0.85,...%要声明为轨迹的过滤器组件的权重阈值“ConfirmationThreshold”, 0.95,...%要声明为确认航迹的过滤器组件的权重阈值“MergingThreshold”, 50岁,...合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景框架中执行,因此传感器配置随时间变化);释放并重新启动所有对象。重启(场景);I = 1:数字(传感器)释放(传感器{I});结束释放(tem);释放(tam);释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};%恢复随机种子。rng(种子)%第一次步骤timeStep = 1;%运行场景advance(场景)&& ishhandle(显示。图)获取场景时间时间= scenario.SimulationTime;在本车辆坐标中获取其他车辆的姿态。ta = targetpose (egoVehicle);从自我车辆传感器收集检测[detected, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time, sensorConfigurations);用所有检测更新跟踪器。%注意,没有%需要在将检测传递给跟踪器之前对检测进行聚类。此外,传感器配置将作为输入传递给%追踪。抽搐% confirmedTracks位于场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标a.获得基本真理groundTruth =场景。演员(2:结束);%除了自我更新分配指标tam (confirmedTracks groundTruth);[trackIDs,truthIDs] = currentAssignment(tam);c.更新错误度量tem (confirmedTracks trackIDs、groundTruth truthIDs);d.更新ospa metricospaMetric(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也可以处理每个传感器对每个物体的多次检测。与GGIW-PHD类似,它还可以估计物体的大小和方向。过滤器初始化函数使用与GGIW-PHD跟踪器类似的方法,并初始化不同大小的多个组件。

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

评估跟踪性能

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

任务指标

helperPlotAssignmentMetrics(assignmentMetricsMOT, assignmentMetricsGGIWPHD, assignmentMetricsGMPHD);

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

误差指标

helperPlotErrorMetrics(errorMetricsMOT, errorMetricsGGIWPHD, errorMetricsGMPHD);

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

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

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

OSPA规

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

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

比较时间表现

在前面,您了解了不同的技术、它们对目标模型的假设以及由此产生的跟踪性能。现在比较一下跟踪器的运行时间。请注意,GGIW-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

万博1manbetx支持功能

helperExtendedTargetError

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

函数[posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth)%误差作为目标轨道和相关真值的函数。从事实中获得真实的信息。truePos = truth.Position(1:2)';%位置为所有车辆的后轴。我们想要计算%距离车辆中心的误差腐= [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 = [truth.Length;truth.Width];%从轨道得到估计值。% GGIW-PHD跟踪器输出一个结构字段'Extent'和'SourceIndex'% GM-PHD跟踪器输出没有“Extent”的结构% multiObjectTracker输出objectTrack如果isa(轨道,“objectTrack”) estPos =轨道。状态(3 [1]);estVel =轨道。状态([2 - 4]);multiObjectTracker中没有偏航或尺寸信息。estYaw = nan;estDims = [nan;nan];elseifisfield(轨道,“程度”% trackerPHD与GGIWPHDestPos = track。状态(3 [1]);estVel =轨道。状态([2 - 4]);estYaw = atan2d(estVel(2),estVel(1));d = eig(track.Extent);暗= 2*根号(d);estDims = [max(dims);min(dims)];其他的% trackerPHD与GMPHDestPos = 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(:));dimError = norm(trueDims(:) - estDims(:));yawError = norm(trueYaw(:) - estYaw(:));结束

helperExtendedTargetDistance

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

函数dist = helperExtendedTargetDistance(跟踪,true)这个函数计算轨迹和真值之间的距离。版权所有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过滤器的函数扩展对象跟踪示例使用5个状态和常数回合率模型创建一个ggiwphd过滤器。PhD = ggiwphd(0(5,1),眼睛(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};启用高程测量创建3-D过滤器使用% initctggiwphd如果检测{1}。SensorIndex < 7I = 1:numel(detections) detections{I}。测量= [detections{i}.Measurement(1);0;detections{i}.Measurement(2:end)];检测我{}。measuentnoise = blkdiag(detections{i}. measuentnoise (1,1),0.4,detections{i}. measuentnoise (2:end,2:end));检测{我}.MeasurementParameters(1)。HasElevation = true;结束结束Phd3d = initctggiwphd(检测);使用3-D过滤器设置2-D过滤器的状态博士学位。States = phd3d.States(1:5);博士学位。StateCovariances = phd3d.StateCovariances(1:5,1:5);博士学位。自由度= 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];各组件的相对权重。可以作为概率的道路上存在一辆小汽车和一辆卡车。博士学位。权重= [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)初始化矩形的函数%目标PHD过滤器用于扩展对象跟踪示例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 =根号(lCov*wCov)*lwCorr;filter.StateCovariances(6:7,6:7,1) = [lCov lwCov;lwCov wCov];通过附加过滤器本身,再添加一个组件。追加(过滤器,过滤器);将长度和宽度设置为卡车尺寸filter.States(6:7,2) = [8.1;2.45];%各组分的相对权重过滤器。权重= [0.7 0.3];结束结束