主要内容

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

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

介绍

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

使用高分辨率传感器的主要优点是越来越关于对象的详细信息,如它的尺寸和方位。这些额外的信息可以提高检测的概率,降低误报率。

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

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

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

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

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

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

设置

场景

在这个例子中,有一个自车辆和其他四辆车:自车辆在中间车道前方车辆,在中间车道自身车辆后面的车辆,在右车道和前方自身车辆的车在左侧车道超车。

在本例中,您模拟一个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函数,helperExtendedTargetError,列在本例的最后。

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

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

函数返回给定轨迹和真值的错误。errorFcn = @(跟踪、真理)helperExtendedTargetError(跟踪、真理);%函数返回轨道和真理之间的距离。distFcn = @(跟踪、真理)helperExtendedTargetDistance(跟踪、真理);%函数从地面返回ID。默认值%标识符假定事实是用PlatformID标识的。在% drivingScenario, truth is identified with a 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度量对象。汤姆= 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(种子);步伐= 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在方案坐标中confirmedTracks = updateTracks(tracker, detectionClusters, time);T = TOC;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);% C。Update错误指标TEM(confirmedTracks,trackIDs,地面实况,truthIDs);% 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使用trackingSensorConfiguration类。检查helperCreateSensorConfigurations函数查看如何利用传感器属性定义跟踪器的传感器配置。

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

定义跟踪。

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

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

运行仿真。

释放并重启所有对象。重启(场景);释放(tem);释放(tam);%没有刑罚为trackerPHDtam。AssignmentThreshold = tam。AssignmentThreshold - 2;释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};i=1:numel(传感器)释放(传感器{i});如果我<= 6个传感器{I}。HasRangeRate = true;传感器{我}。DetectionCoordinates =“球形传感器”;结束结束%还原随机种子。rng(种子)第一次步长步伐= 1;%运行该场景虽然advance(场景)和ishghandle(display.Figure)%获得场景时间时间= scenario.SimulationTime;%获取其他车辆的姿态在自车辆坐标ta = targetPoses (egoVehicle);%从自我车辆传感器收集检测结果[检测,isValidTime,配置]=帮助检测(传感器,电子车辆,时间,传感器配置);%使用所有检测更新跟踪器。请注意,没有%在将检测结果传递给跟踪器之前,需要对其进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在方案坐标中confirmedTracks =跟踪器(检测,配置,时间);T = TOC;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);% C。Update错误指标TEM(confirmedTracks,trackIDs,地面实况,truthIDs);% d.更新ospa度量ospaMetric(时间步长,2)=汤姆(confirmedTracks,地面实况);%更新鸟瞰图将轨道转换为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能够处理每传感器对象的多个检测,而不需要第一簇这些检测。此外,通过使用多个检测,跟踪器估计的位置,速度,尺寸和每个对象的定向。该图中的虚线的椭圆形状表明了目标的预期程度。该过滤器初始化函数指定使用多个组件的多个可能的尺寸和它们的相对权重。该列表可以扩展到增加更多尺寸的增加计算复杂度。相反,你也可以初始化每一个探测的一个组件的尺寸在较高的不确定性。这将使跟踪器自动估计对象的尺寸。这就是说,估计的准确性将取决于目标尺寸的可观性,容易受到收缩和轨道尺寸的扩大为目标,围绕移动自车辆。

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

GM-PHD矩形目标跟踪器

在本节中,您将使用GM-PHD跟踪器(trackerPHDgmphd)及矩形目标模型(initctrectgmphd(传感器融合与跟踪工具箱))来跟踪物体。不像ggiwphd,它使用椭圆形状来跟踪范围,gmphd允许您使用高斯分布定义所选形状。矩形目标模型由运动模型定义,ctrect(传感器融合与跟踪工具箱)ctrectjac(传感器融合与跟踪工具箱)和计量模型,ctrectmeas(传感器融合与跟踪工具箱)ctrectmeasjac(传感器融合与跟踪工具箱)

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

I = 1:numel(sensorConfigurations)sensorConfigurations {I} .FilterInitializationFcn = @helperInitRectangularFilter;%初始化一个矩形目标gmphdsensorConfigurations{}。SensorTransformFcn= @ctrectcorners;%使用角来计算检测概率结束使用新的传感器配置定义跟踪器追踪= trackerPHD ('SensorConfigurations'sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”, 600,...%检测细胞添加出生成分的最小负对数似然'ExtractionThreshold',0.85,...%要声明轨迹的筛选器组件的权重阈值'ConfirmationThreshold', 0.95,...一个过滤器组件的重量%阈值被宣布为确认轨道“Merging阈值”,50,...%合并组件的阈值“HasSensorConfigurationsInput”,真正的...%跟踪在场景帧中执行,因此传感器配置随时间而变化);释放并重启所有对象。重启(场景);i=1:numel(传感器)释放(传感器{i});结束释放(tem);释放(tam);释放(显示);显示。PlotClusteredDetection = false;gifWriter。pFrames = {};%还原随机种子。rng(种子)第一次步长步伐= 1;%运行该场景虽然advance(场景)和ishghandle(display.Figure)%获得场景时间时间= scenario.SimulationTime;%获取其他车辆的姿态在自车辆坐标ta = targetPoses (egoVehicle);%从自我车辆传感器收集检测结果[检测,isValidTime,配置]=帮助检测(传感器,电子车辆,时间,传感器配置);%使用所有检测更新跟踪器。请注意,没有%在将检测结果传递给跟踪器之前,需要对其进行聚类。此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在方案坐标中confirmedTracks =跟踪器(检测,配置,时间);T = TOC;%更新度量% a.获得地面真理groundTruth = scenario.Actors(2:结束);%除了自我% b.更新分配指标tam(确认跟踪,地面真相);[trackid,truthIDs]=当前分配(tam);% C。Update错误指标TEM(confirmedTracks,trackIDs,地面实况,truthIDs);% 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(exPath)

这些结果表明,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]Granström,卡尔,基督教隆基斯特,和了Umut Orguner。“跟踪使用激光测量矩形和椭圆形扩展目标”。第14届国际会议上的信息融合。IEEE,2011。

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

金宝app支持功能

helperExtendedTargetError

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

作用[posError,velError,dimError,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 =跟踪。状态(3 [1]);estVel =。状态([2 - 4]);%在multiObjectTracker中没有偏航或尺寸信息。Estaw=nan;estDims=[nan;nan];elseifisfield(轨道,'程度'%带有GGIWPHD的trackerPHDestPos=轨道状态([13]);estVel=轨道状态([2 4]);estYaw=atan2d(estVel(2),estVel(1));d=eig(轨道范围);尺寸=2*sqrt(d);estDims=[最大(dims);最小(dims)];其他的% trackerPHD与GMPHDestPos = track.State(1:2);estYaw = track.State(4);estVel = [track.State(3)* COSD(estYaw); track.State(3)*信德(estYaw)];estDims = track.State(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,dimError,yawError] = helperExtendedTargetError(轨道,真理);%对于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,...'StateTransitionJacobianFcn'@constturnjac,...“MeasurementFcn”@ctmeas,...'MeasurementJacobianFcn'@ctmeasjac,...“HasAdditiveMeasurementNoise”,真的,...“HasAdditiveProcessNoise”错误的...“ProcessNoise”诊断接头([1 1 3]),...“MaxNumComponents”, 1000,...“ExtentRotationFcn”@extentRotFcn,...“PositionIndex”[1 3]);%如果在没有输入的情况下调用函数,即%的生密度,没有成分添加到混合物中。如果纳金==0%抵消返回0组件。取消(博士);其他的%当使用检测输入调用时,向过滤器添加两个组件,% 1用于汽车,% 1用于卡车,在此基础上可增加更多的部件%事先了解场景,例如行人或摩托车。%这是一种“多模型”类型的方法。另一种方法是添加%只有一个分量在维度中具有较高的协方差。这%更高计算要求不高,但必须跟踪的倾向%物体的可观察尺寸。例如,如果只有背面是%可见时,测量噪声可能会引起物体的长度不一致%萎缩。%探测检测=变长度输入宗量{1};%使仰角测量创建一个三维过滤器使用% initctggiwphd如果检测{1} .SensorIndex <7I = 1:numel(检测)检测{I} .Measurement = [检测{I} .Measurement(1); 0;检测{I} .Measurement(2:结束)];检测{I} .MeasurementNoise = blkdiag(检测{I} .MeasurementNoise(1,1),0.4%,检测{I} .MeasurementNoise(2:端,2:结束));检测{I} .MeasurementParameters(1).HasElevation = TRUE;结束结束phd3d = initctggiwphd(检测);使用3- d滤波器2-d滤波器%设定状态博士学位。州= 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过滤器用于扩展对象跟踪示例版权所有2019 The MathWorks, Inc.如果纳金==0%当没有输入的调用,只需使用initctrectgmphd功能%创建一个没有组件的PHD过滤器。滤波器= initctrectgmphd;设定过程噪声过滤器。ProcessNoise = diag([1 3]);其他的%当使用检测输入调用时,向过滤器添加两个组件,% 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];%添加一个额外的组件通过附加过滤器自身。追加(过滤器,过滤器);%将长度和宽度设置为卡车尺寸filter.States(6:7,2)= [8.1; 2.45];%各组分的相对权重过滤器。权重= [0.7 0.3];结束结束

也可以看看

||(传感器融合与跟踪工具箱)|(传感器融合与跟踪工具箱)|(传感器融合与跟踪工具箱)

相关的话题