主要内容

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

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

介绍

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

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

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

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

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

  • GGIW-PHD(伽马高斯逆Wishart PHD)跟踪器,追踪器具有ggiwphd过滤器

  • 一种GM-PHD(高斯混合PHD)跟踪器,追踪器具有gmphd使用矩形目标模型进行滤波

您将评估使用的所有跟踪器的跟踪结果trackErrorMetricstrackAssignmentMetrics,提供了跟踪器有效性的多种测量方法。您还将使用最佳子模式分配指标(OSPA)评估结果,trackOSPAMetric,其目的是使用综合分数评估跟踪器的性能。

安装程序

脚本

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

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

%创建场景exPath = fullfile (matlabroot,“例子”,“driving_fusion”,“主要”);addpath(exPath)[场景、egoVehicle、传感器]=帮助创建场景;%创建显示对象显示=帮助扩展目标跟踪显示;%创建动画编写器以记录图形的每一帧%动画创作。将“RecordGIF”设置为true以启用GIF写入。gifWriter = helperGIFWriter (“数字”,display.Figure,...“RecordGIF”,假);

韵律学

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

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

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

%函数返回给定轨迹和真相的错误。errorFcn=@(跟踪,真相)帮助扩展目标恐怖(跟踪,真相);%函数返回轨迹和真实值之间的距离。distFcn=@(跟踪,真相)帮助扩展目标立场(跟踪,真相);函数从ground truth返回id。默认的%标识符假定真理是用PlatformID.In标识的%在驱动场景中,真理被一个ActorID识别。truthIdFcn=@(x)[x.ActorID];%创建度量对象。tem=跟踪误差度量(...“ErrorFunctionFormat”,“习俗”,...“EstimationErrorLabels”,{“位置错误”,“VelocityError”,“DimensionsError”,“亚沃罗”},...“EstimationErrorFcn”,errorFcn,...“TruthiIdentifierFCN”,truthIdFcn);tam=轨迹分配度量(...“距离函数格式”,“习俗”,...“AssignmentDistanceFcn”,distFcn,...“DivergenceDistanceFcn”,distFcn,...“TruthiIdentifierFCN”,truthIdFcn,...“AssignmentThreshold”,30,...“发散阈值”,35);%创建度量对象。tom=轨道光度计(...“距离”,“习俗”,...“距离FCN”,distFcn,...“TruthiIdentifierFCN”,truthIdFcn);

点目标跟踪器

这个多目标跟踪器系统对象™ 假设每个传感器每个对象检测一次,并使用全局最近邻方法将检测与轨迹关联。它假设每个对象在一次扫描中最多可由传感器检测一次。在这种情况下,模拟雷达传感器具有足够高的分辨率,以生成每个对象的多个检测。如果这些检测不是c群集化后,跟踪器会为每个对象生成多个轨迹。群集化会为每个群集返回一个检测,但代价是具有更大的不确定性协方差,并丢失有关真实对象维度的信息。群集化还使两个对象彼此靠近时难以区分,例如,当一辆车停在一起时另一辆车。

trackerRunTimes=零(0,3);Osparametric=零(0,3);创建一个multiObjectTracker追踪= multiObjectTracker (...“FilterInitializationFcn”,@helperInitPointFilter,...“AssignmentThreshold”, 30,...“确认阈值”, [4 5],...“DeletionThreshold”, 3);%重置随机数生成器以获得可重复的结果seed=2018;S=rng(seed);时间步长=1;%对于多目标跟踪器,雷达在Ego笛卡尔框架中报告,并且%不报告速度。这允许我们对来自多个站点的检测进行聚类%传感器。对于i=1:6传感器{i}.HasRangeRate=false;传感器{i}.DetectionCoordinates=“身体”;终止

运行场景。

推进(场景)& & ishghandle (display.Figure)%获得场景时间时间=scenario.SimulationTime;%从自我车辆传感器收集检测结果[检测,isValidTime]=帮助检测(传感器,电子车辆,时间);%如果有新的检测,更新跟踪器如果任何(isValidTime)%必须首先对点跟踪器的检测进行聚类detectionClusters=helperClusterRadarDetections(检测);%更新跟踪器抽搐% confirmedTracks在方案坐标中确认跟踪=更新跟踪(跟踪程序、检测群集、时间);t=toc;%更新指标%a。获取地面真相背景真相=场景。参与者(2:结束);%除了自我%b.更新分配指标tam (confirmedTracks groundTruth);[trackIDs, truthIDs] = currentAssignment (tam);%c。更新错误度量tem(确认跟踪、轨道ID、地面真相、真相);% d.更新ospa度量OsParametric(时间步,1)=tom(确认跟踪,地面真相);%更新鸟瞰图%将轨迹转换为ego坐标以便显示confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle, sensor, detectionClusters);drawnow;记录跟踪器运行时间trackerRunTimes(timeStep,1)=t;timeStep=timeStep+1;%捕捉动画帧gifWriter ();终止终止%捕获累积轨迹度量。错误度量显示平均值%模拟过程中的误差值。assignmentMetricsMOT=tam.trackMetricsTable;errorMetricsMOT=tem.cumulativeTruthMetrics;%如果需要,请写入GIFwriteAnimation(作者,“多目标跟踪”);

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

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

GGIW-PHD扩展目标跟踪器

在本节中,您将使用GGIW-PHD跟踪器(追踪器具有ggiwphd)跟踪对象。与多目标跟踪器GGIW-PHD是一种描述场景的概率假设密度(PHD)的多目标滤波器。为了对扩展目标建模,GGIW-PHD使用以下分发版:

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

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

逆威斯哈特:描述椭圆范围的正定矩阵。

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

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

%设置传感器配置%传感器配置=帮助创建传感器配置(传感器、车辆);%转换函数和过滤器初始化函数为状态和%依赖于筛选器。因此,它们不在helper函数中设置。对于i=1:numel(传感器配置)%您可以使用不同的技术为每个过滤器初始化过滤器%通过为每个配置使用不同的功能,可以使用传感器。传感器配置{i}.FilterInitializationFcn=@helperInitGGIWFilter;%轨迹在场景中的恒定转弯率状态空间中定义%坐标。恒定转动率模型的MeasurementFcn可以是%用作转换函数。sensorConfigurations{}。传感器变压器= @ctmeas;终止

定义跟踪器。

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

partFcn=@(x)helperPartingfcn(x,3,5);tracker=trackerPHD(“传感器配置”sensorConfigurations,...“PartitioningFcn”partFcn,...“AssignmentThreshold”,450,...%添加出生成分的检测单元(每个单元多次检测)的最小负对数似然。“提取阈值”,0.75,...%要声明轨迹的筛选器组件的权重阈值“确认阈值”,0.85,...%要声明为已确认轨迹的过滤器组件的重量阈值“MergingThreshold”, 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;%运行场景推进(场景)& & ishghandle (display.Figure)%获得场景时间时间=scenario.SimulationTime;%在ego车辆坐标中获取其他车辆的姿势ta = targetPoses (egoVehicle);%从自我车辆传感器收集检测结果[detections, isValidTime, configurations] = helperDetect(sensor, egoVehicle, time, sensorConfigurations);%用所有检测更新跟踪器。注意,没有%需要群集检测,然后将它们传递给跟踪器。%此外,传感器配置作为输入传递给%追踪。抽搐% confirmedTracks在方案坐标中确认跟踪=跟踪器(检测、配置、时间);t=总有机碳;%更新指标%a。获取地面真相背景真相=场景。参与者(2:结束);%除了自我%b.更新分配指标tam (confirmedTracks groundTruth);[trackIDs, truthIDs] = currentAssignment (tam);%c。更新错误度量tem(确认跟踪、轨道ID、地面真相、真相);% d.更新ospa度量OsParametric(timeStep,2)=tom(确认跟踪,地面真相);%更新鸟瞰图%将轨迹转换为ego坐标以便显示confirmedTracksEgo = helperConvertToEgoCoordinates(egoVehicle, confirmedTracks);显示(egoVehicle,传感器,检测,确认tracksego);drawnow;记录跟踪器运行时间trackerRunTimes(timeStep,2)=t;timeStep=timeStep+1;%为GIF捕获帧gifWriter ();终止捕获事实并跟踪指标表assignmentMetricsGGIWPHD=tam.trackMetricsTable;errorMetricsGGIWPHD=tem.cumulativeTruthMetrics;%如果需要,请写入GIFwriteAnimation(作者,“ggiwphdTracking”);

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

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

GM-PHD矩形对象跟踪器

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

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

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

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

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

评估跟踪性能

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

任务指标

helperPlotAssignmentMetrics (assignmentMetricsMOT assignmentMetricsGGIWPHD assignmentMetricsGMPHD);

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

误差指标

helperPlotErrorMetrics(errorMetricsMOT、ErrorMetricsGGIWPH、errorMetricsGMPHD);

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

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

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

OSPA度量

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

ospaFig=图形;曲线图(OsParametric,“线宽”,2); 传奇(“点目标跟踪器”,“GGIW-PHD追踪”,“矩形GM-PHD追踪”); xlabel(“时间步(k)”);伊莱贝尔(“OSPA”);

比较时间性能

之前,您了解了不同的技术、它们对目标模型的假设以及由此产生的跟踪性能。现在比较跟踪器的运行时间。请注意,GGIW-PHD过滤器与GM-PHD相比具有显著的计算优势,但跟踪性能降低。

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

总结

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

工具书类

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

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

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

万博1manbetx辅助功能

帮助扩展目标恐怖

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

函数[posError、velError、dimeror、yawError]=helperExtendedTargetError(跟踪、真相)%误差是目标轨迹和相关真理的函数。从事实中获得真实的信息。真位=真位(1:2)';%对于所有车辆,该位置位于后桥上。我们想计算%来自车辆中心的误差rot=[cosd(truth.Yaw)-sind(truth.Yaw);sind(truth.Yaw)cosd(truth.Yaw)];truePos=truePos+rot*[truth.Wheelbase/2;0];trueVel=truth.Velocity(1:2);trueYaw=truth.Yaw(:);trueDims=[truth.Length;truth.Width];从跟踪中获得估计值。%GGIW-PHD跟踪器输出结构字段“区段”和“源索引”% GM-PHD跟踪器输出带有但不带有“Extent”的结构体%multiObjectTracker输出objectTrack如果isa(轨道,“objectTrack”)estPos=轨道状态([13]);estVel=轨道状态([24]);%在multiObjectTracker中没有偏航或尺寸信息。estYaw =南;estDims =(南,南);埃尔塞夫伊斯菲尔德(田径,“范围”)% trackerPHD与GGIWPHDestPos =。状态(3 [1]);estVel =。状态([2 - 4]);estYaw = atan2d (estVel (2), estVel (1));d = eig (track.Extent);dim = 2 *倍根号(d);estDims =[最大(dim);最小(dim)];其他的% 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(:));终止

HelperExtendedTargetInstance

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

函数dist=帮助扩展目标立场(跟踪、真相)%这个函数计算轨道和一个真值之间的距离。%版权2019-2020 MathWorks公司。%各方面的错误[posError、velError、dimeror、yawError]=帮助扩展目标恐怖(跟踪、真相);%对于multiObjectTracker,添加一个不估计偏航的常量惩罚%和尺寸如果isnan(dimError) dimError = 1;终止如果isnan(yawError)yawError=1;终止%距离是误差的总和dist=posError+velError+dimeror+yawError;终止

helperInitGGIWFilter

函数从检测单元创建GGIWPH过滤器。

函数博士= helperInitGGIWFilter(变长度输入宗量)%helperInitGGIWFilter一个函数,用于初始化%扩展对象跟踪示例%创建一个ggiwphd过滤器使用5个状态和恒定的轮转率模型。博士= ggiwphd(0(5、1)、眼睛(5),...“StateTransitionFcn”,@constturn,...“状态转换JacobianFCN”,@constturnjac,...“MeasurementFcn”,@ctmeas,...“测量JacobianFCN”,@ctmeasjac,...“HasAdditiveMeasurementNoise”符合事实的...“HasAdditiveProcessNoise”假的,...“加工噪音”,diag([13]),...“MaxNumComponents”,1000,...“ExtentRotationFcn”,@extentRotFcn,...“位置索引”,[1 3]);%如果在没有输入的情况下调用函数,即%根据出生密度,不向混合物中添加任何成分。如果输入参数个数= = 0%Nullify返回0个组件。废除(博士学位);其他的%使用detections输入调用时,将两个组件添加到过滤器中,% 1用于汽车,% 1用于卡车,在此基础上可增加更多的部件%事先了解场景,例如行人或摩托车。%这是一种“多模型”类型的方法。另一种方法是添加%仅1个维度中协方差较高的组件。这个%后者的计算要求较低,但有跟踪的趋势%物体的可观察尺寸。例如,如果只有背面是%可见,测量噪声可能会导致对象的长度缩短%萎缩。%检测检测=varargin{1};%启用高程测量以使用创建三维过滤器% initctggiwphd如果检测{1}.SensorIndex<7对于i=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=初始CTGGIWPH(检测);%使用三维过滤器设置二维过滤器的状态博士学位状态=博士学位状态(1:5);博士学位状态协方差=博士学位状态协方差(1:5,1:5);博士学位自由度=1000;博士学位尺度矩阵=(1000-4)*诊断([4.7/2 1.8/2]。^2);%添加卡车尺寸作为第二个零部件附加(博士、博士);标度学博士(:,:,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)];终止

HelperInTerlectangularFilter

函数从检测单元创建gmphd矩形目标滤波器。

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