主要内容

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

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

介绍

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

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

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

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

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

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

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

您将评估使用的所有跟踪器的跟踪结果trackErrorMetricstrackAssignmentMetrics,为跟踪器的有效性提供了多种衡量标准。您还将使用最优子模式分配度量(OSPA)评估结果,trackOSPAMetric,其目的是使用综合得分来评估跟踪器的性能。

设置

场景

在这个例子中,有一辆自我车和另外四辆车:一辆车在自我车前面的中央车道上,一辆车在自我车后面的中央车道上,一辆卡车在自我车前面的右边车道上,一辆超车在左边车道上。

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

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

指标

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

您还将根据诸如错误轨道或冗余轨道的数量等度量来评估性能。这些指标可以使用trackAssignmentMetrics类。为了定义跟踪目标和真值对象之间的距离,本例使用了一个“自定义”误差函数,helperExtendedTargetDistance,在本示例末尾列出。该函数将距离度量定义为位置,速度,尺寸和偏航距离的总和。

trackErrorMetricstrackAssignmentMetrics提供跟踪算法有效性的多种衡量标准。您还将基于最优子模式分配度量(Optimal SubPattern Assignment Metric, OSPA)评估性能,OSPA在每个时间步为跟踪算法提供单个得分值。此度量可以使用trackOSPAMetric类。为OSPA定义的“自定义”距离函数与分配度量相同。

函数返回给定的跟踪和真相的错误。errorFcn = @(track,truth)helperExtendedTargetError(track,truth);函数返回轨迹与真值之间的距离。distFcn = @(track,truth)helperExtendedTargetDistance(track,truth);函数返回来自ground truth的id。默认的% identifier假定truth是用PlatformID标识的。在% drivingScenario, truth用一个actionid标识。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);

点目标跟踪器

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

trackerRunTimes = 0 (0,3);ospaMetric = 0 (0,3);%创建一个多对象跟踪器跟踪器= multiObjectTrackerFilterInitializationFcn = @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;%更新指标% a.获取地面真相groundTruth = scenario.Actors(2:end);%除Ego外全部% b.更新分配指标tam (confirmedTracks groundTruth);[trackid, truthid] = 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. culativetruthmetrics;如果请求,写入GIFwriteAnimation (gifWriter“multiObjectTracking”);

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

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

扩展对象跟踪器

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

γ:正值,用于描述预期的检测数量。

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

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

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

PHD跟踪器需要计算密度中每个成分的可探测性。可探测性的计算需要跟踪器所使用的每个传感器的配置。定义这些配置trackerPHD使用trackingSensorConfiguration类。

释放并重新启动所有对象。重启(场景);释放(tem);释放(tam);% trackerPHD不罚tam。AssignmentThreshold = tam。AssignmentThreshold - 2;释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};I = 1: nummel(传感器)释放(传感器{I});如果1 <= 6个传感器{I}。HasRangeRate = true;传感器{我}。DetectionCoordinates =“球形传感器”结束结束%恢复随机种子。rng(种子)%设置传感器配置%设定自我姿势egoPose。Position = egoVehicle.Position;egoPose。Velocity = egoVehicle.Velocity;egoPose。定向=四元数([egoVehicle.]偏航egoVehicle。egoVehicle。卷),“eulerd”“ZYX股票”“帧”),“帧”);sensorConfigurations = cell(numel(sensors),1);i = 1: nummel (sensors) sensorConfigurations{i} = trackingSensorConfiguration(sensors{i},egoPose,FilterInitializationFcn = @helperInitGGIWFilter,SensorTransformFcn = @ctmeas);结束

定义跟踪器。

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

partFcn = @(x)helperPartitioningFcn(x,3,5);跟踪器= trackerPHD(传感器配置=传感器配置)PartitioningFcn = partFcn,AssignmentThreshold = 450,%一个检测单元(每个单元多次检测)添加出生成分的最小负对数可能性。extracactionthreshold = 0.75,%要声明为轨道的过滤器组件的权重阈值ConfirmationThreshold = 0.85,%要声明为已确认轨道的过滤器组件的权重阈值MergingThreshold = 50,%组件合并阈值HasSensorConfigurationsInput = true跟踪在场景框架中执行,因此传感器配置随时间变化);

运行模拟。第一时间步长

timeStep = 1;%运行场景advance(场景)&& ishhandle(显示。图)%获取场景时间time = scenario.SimulationTime;在自我车辆坐标中获得其他车辆的姿态ta = targetpose (egoVehicle);%收集自我车辆传感器的检测结果[detections, isValidTime, configurations] = helperDetect(sensors, egoVehicle, time);用所有检测更新跟踪器。请注意,没有%需要在将检测结果传递给跟踪器之前对它们进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标% a.获取地面真相groundTruth = scenario.Actors(2:end);%除Ego外全部% b.更新分配指标tam (confirmedTracks groundTruth);[trackid, truthid] = 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. culativetruthmetrics;如果请求,写入GIFwriteAnimation (gifWriter“ggiwphdTracking”);

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

GGIW-PHD滤波器假设检测分布在目标的椭圆中心周围。因此,这些痕迹往往跟随车辆的可观察部分。这些可观察的部分包括位于自我车辆正前方的车辆的后脸或位于自我车辆正后方的车辆的前脸,例如,位于自我车辆正前方和后方的车辆的后脸和前脸。与此相反,在模拟过程中,对过往车辆的长度和宽度进行了充分的观察。因此,它的估计椭圆与实际形状有更好的重叠。

GM-PHD矩形目标跟踪器

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

之前为trackerPHD定义的传感器配置保持不变,除了定义SensorTransformFcnFilterInitializationFcn

i = 1: nummel (sensorConfigurations) sensorConfigurations{i}。FilterInitializationFcn = @ helperinitrectangle filter;%初始化矩形目标gmphdsensorConfigurations{}。SensorTransformFcn= @ctrectcorners;%使用角来计算检测概率结束使用新的传感器配置定义跟踪器跟踪器= trackerPHD(传感器配置=传感器配置)PartitioningFcn = partFcn,AssignmentThreshold = 600,%最小负对数-检测细胞添加出生成分的可能性extracactionthreshold = 0.85,%要声明为轨道的过滤器组件的权重阈值ConfirmationThreshold = 0.95,%要声明为已确认轨道的过滤器组件的权重阈值MergingThreshold = 50,%组件合并阈值HasSensorConfigurationsInput = true跟踪在场景框架中执行,因此传感器配置随时间变化);释放并重新启动所有对象。重启(场景);I = 1: nummel(传感器)释放(传感器{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);用所有检测更新跟踪器。请注意,没有%需要在将检测结果传递给跟踪器之前对它们进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在场景坐标中confirmedTracks =跟踪器(检测,配置,时间);T = toc;%更新指标% a.获取地面真相groundTruth = scenario.Actors(2:end);%除Ego外全部% b.更新分配指标tam (confirmedTracks groundTruth);[trackid, truthid] = 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. culativetruthmetrics;如果请求,写入GIFwriteAnimation (gifWriter“gmphdTracking”);将随机数生成器返回到之前的状态rng (S) rmpath (exPath)

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

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

评估跟踪性能

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

任务指标

helperPlotAssignmentMetrics(assignmentMetricsMOT, assignmentMetricsGGIWPHD, assignmentMetricsGMPHD);

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

误差指标

helpploterrormetrics (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 =图;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, Karl, Marcus Baum和Stephan Reuter。扩展对象跟踪:介绍、概述和应用。信息融合进展杂志.12卷第2期,2017年12月。

[2] Granström, Karl, Christian Lundquist和Umut orgner。"用激光测量跟踪矩形和椭圆扩展目标"第十四届信息融合国际会议。IEEE 2011。

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

金宝app支持功能

helperExtendedTargetError

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

函数[posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth)误差作为目标航迹和相关真值的函数。从地面的真相中获得真实的信息。truePos = true . 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 = track。状态(3 [1]);estVel =轨道。状态([2 - 4]);在多对象跟踪器中没有偏航或尺寸信息。estYaw = nan;estDims = [nan;nan];elseifisfield(轨道,“程度”% trackerPHD与GGIWPHDestPos = track。状态(3 [1]);estVel =轨道。状态([2 - 4]);estYaw = atan2d(estVel(2),estVel(1));d = eig(track.Extent);Dims = 2*sqrt(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(track,truth)这个函数计算轨迹和真值之间的距离。版权所有:The MathWorks, Inc。%每个方面的错误[posError,velError,dimError,yawError] = helperExtendedTargetError(track,truth);对于多目标跟踪器,增加一个不估计偏航的恒定惩罚%和尺寸如果isnan(dimError) dimError = 1;结束如果isnan(yawError) yawError = 1;结束距离是所有错误的总和dist = posError + velError + dimError + yawError;结束

helperInitGGIWFilter

函数用于从检测单元创建ggiwphd过滤器。

函数phd = helperInitGGIWFilter(varargin)% helperInitGGIWFilter初始化GGIW-PHD过滤器的函数扩展对象跟踪示例使用5个状态和恒定的转换率模型创建一个ggiwphd过滤器。PhD = ggiwphd(0 (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]);%如果在没有输入的情况下调用函数,即的预测部分%的出生密度,混合物中不添加任何成分。如果边际== 0% null返回0个组件。取消(博士);其他的%当使用检测输入调用时,向过滤器添加两个组件;轿车各一辆,卡车各一辆,可在此基础上增加更多部件%对场景的先验知识,例如,行人或摩托车。这是一种“多模型”类型的方法。另一种方法是添加%在维度中只有一个成分具有较高的协方差。的% later的计算要求较低,但有跟踪的趋势%对象的可观察维度。例如,如果只有背是%可见,测量噪声可能会导致物体的长度%萎缩。%检测检测= varargin{1};启用高程测量来创建一个3-D滤波器% initctggiwphd如果检测{1}。SensorIndex < 7I = 1: nummel (detections)检测{I}。测量= [detection {i}.Measurement(1);0;detection {i}.Measurement(2:end)];检测我{}。MeasurementNoise = blkdiag(detection {i}.MeasurementNoise(1,1),0.4,detections{i}.MeasurementNoise(2:end,2:end));检测{我}.MeasurementParameters(1)。HasElevation = true;结束结束Phd3d = initctggiwphd(检测);%使用三维滤波器设置二维滤波器的状态博士学位。States = phd3d.States(1:5);博士学位。StateCovariances = phd3d.StateCovariances(1:5,1:5);博士学位。degreesofffreedom = 1000;博士学位。scalematriices = (1000-4)*diag([4.7/2 1.8/2].^2);%添加卡车尺寸作为第二个组件追加(博士,博士学位);phd.ScaleMatrices(:: 2) =(1000 - 4) *诊断接头([8.1 / 2 2.45 / 2]。^ 2);博士学位。gammaforgetingfactors = [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初始化矩形的函数扩展对象跟踪示例的%目标PHD过滤器版权所有2019 MathWorks, Inc.如果边际== 0如果在没有输入的情况下调用,只需使用initctrectgmphd函数来%创建一个不包含任何组件的PHD过滤器。Filter = initctrectgmphd;设定过程噪声%过滤器。ProcessNoise = diag([13]);其他的%当使用检测输入调用时,向过滤器添加两个组件;轿车各一辆,卡车各一辆,可在此基础上增加更多部件%对场景的先验知识,例如,行人或摩托车。这是一种“多模型”类型的方法。另一种方法是添加%在维度中只有一个成分具有较高的协方差。的% later的计算要求较低,但有跟踪的趋势%对象的可观察维度。例如,如果只有背是%可见,测量噪声可能会导致物体的长度%萎缩。%检测检测= varargin{1};创建一个矩形模型的GM-PHD过滤器Filter = initctrectgmphd(detections);%乘用车的长度和宽度filter.States(6:7,1) = [4.7;1.8];%尺寸的高确定性lCov = 1e-4;wCov = 1e-4;lwCorr = 0.5;lwCov = sqrt(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];结束结束

相关的话题