主要内容

优化多目标跟踪器

这个例子展示了如何优化和运行跟踪器跟踪多个场景中的对象。示例解释和演示的重要性关键属性追踪器的传感器融合和跟踪工具。

默认的跟踪器配置

为了测试跟踪器跟踪多个对象的能力,你建立了一个基本的场景。在该方案中,您定义三个对象与每个沿着一条直线在一个恒定的速度。最初,设置对象48 m / s的速度,60 m / s,分别和72 m / s。

stopTime = 10;v = 60;场景= trackingScenario;场景。StopTime = StopTime;场景。UpdateRate = 0;p1 =平台(场景);p1。轨迹= waypointTrajectory ([20 10 0; 20 .8*v*stopTime-10 0], [0 stopTime]); p2 = platform(scenario); p2.Trajectory = waypointTrajectory([0 0 0; 0 v*stopTime 0], [0 stopTime]); p3 = platform(scenario); p3.Trajectory = waypointTrajectory([-20 -10 0; -20 1.2*v*stopTime+10 0], [0 stopTime]);

此外,您定义一个雷达,盯着现场和更新每秒5次。你安装它在平台位于一侧的移动对象。

pRadar =平台(场景);pRadar。轨迹= kinematicTrajectory (“位置”,(v - v * stopTime 0.5 * * stopTime 0]);雷达= fusionRadarSensor (1,“没有扫描”,“UpdateRate”5,“MountingAngles”(0 0 0),“AzimuthResolution”, 1“FieldOfView”,100年[1],“之内”,真的,“DetectionCoordinates”,“场景”);pRadar。传感器=雷达;

您创建一个戏剧情节显示现场。

无花果=图;ax =轴(图);tp = theaterPlot (“父”ax,“XLimits”(-11 * 100 (v),“YLimits”(15 * -50 v),“ZLimits”100年[-100]);rp = platformPlotter (tp,“DisplayName的”,“雷达”,“标记”,' d ');页= platformPlotter (tp,“DisplayName的”,“平台”);dp = detectionPlotter (tp,“DisplayName的”,“检测”);trp = trackPlotter (tp,“DisplayName的”,“跟踪”,“ConnectHistory”,“上”,“ColorizeHistory”,“上”);covp = coveragePlotter (tp,“DisplayName的”,“雷达覆盖”,“α”,0.1 [0]);

最后,您将创建一个默认值trackerGNN对象,运行情况,并观察结果。你使用trackGOSPAMetric对跟踪器的性能进行评估。

追踪= trackerGNN;电报= trackGOSPAMetric (“距离”,“posabserr”);gospa = 0 (51);%的步伐是51我= 0;%定义的随机数生成器的种子可重复的结果s = rng (2019);推进(场景)%得到检测依据=检测(场景);%更新追踪如果isLocked(跟踪)| | ~ isempty(检波器)[痕迹,~,~,信息]=追踪(侦破,scenario.SimulationTime);结束%评估GOSPA我=我+ 1;真理= platformPoses(场景);gospa (i) =电报(跟踪、真理);%更新显示updateDisplay (rp、pp、dp, trp covp,场景,侦破,追踪);结束

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

rng (s)图绘制(gospa)标题(“广义OSPA与步伐”)

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

你观察追踪无法跟踪三个对象。在某种程度上,额外的跟踪确认,除了三个预期轨迹显示三个移动物体。因此,GOSPA度量的价值增加。注意,低的GOSPA度量值表明更好的跟踪性能。

赋值阈值

你看一下信息结构体的跟踪输出和观察CostMatrix作业没有显示跟踪和对象的分配对你期望发生。这意味着AssignmentThreshold太小,应该增加。赋值阈值增加到50岁。

释放(跟踪);跟踪器。AssignmentThreshold = 50;rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

赋值阈值属性也有一个最大距离检测,您可以设置,这是最后一个元素AssignmentThreshold价值。您可以使用这个值来追踪的速度处理大量的检测和跟踪。指的是如何有效地跟踪大量的对象更多细节的例子。在这里,您将值设置为2000年而不是,这将减少的数量组合的跟踪和检测用于计算作业成本。

释放(跟踪);跟踪器。AssignmentThreshold = (2000);rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

过滤器的初始化函数

上面的结果表明,该跟踪器可以保持三个追踪三个移动物体不创建错误的轨道。但是,如果对象将跟踪器的性能将会更快的速度吗?检查,修改场景,增加对象的速度是160,200,和240 m / s,分别。

v = 200;p1。轨迹= waypointTrajectory ([-10 0;20 v 0.8 * * stopTime-10 0], [0 stopTime]);p2。轨迹= waypointTrajectory ([0 0 0;0 v * stopTime 0], [0 stopTime]);p3。轨迹= waypointTrajectory ([-20 10 0;-20 * 1.2 v * stopTime + 10 0], [0 stopTime]); pRadar.Trajectory = kinematicTrajectory(“位置”,(v - v * stopTime 0.5 * * stopTime 0]);tp。XLimits = (100 - 300 v * stopTime);tp。YLimits = (100 + -100 v * 1.2 * stopTime);释放(雷达);radar.RangeLimits (2) = 3000;rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

正如你可能预期,追踪不能建立稳定跟踪的三个对象。一种可能的解决方案是增加的AssignmentThreshold进一步允许跟踪更新。然而,此选项可能会增加随机错误的轨道的机会被分配到多个检测和确认。所以,你选择要修改一个过滤器是如何被初始化。

你设置FilterInitializationFcn属性的函数initFastCVEKF。功能是一样的违约initcvekf除了增加速度的不确定性状态的组件。它允许初始状态占更大的未知速度值,但是一旦建立,减少不确定性。

发布追踪(追踪)。FilterInitializationFcn= @initFastCVEKF; rerunScenario(scenario, tracker, tgm, tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

你观察到追踪再次能够保持跟踪,还有3三个移动物体追踪,即使他们现在移动得更快。GOSPA值也减少了几步之后。

确认和删除阈值

你想确保你的追踪是健壮的误警率更高。要做到这一点,你配置雷达的误警率比之前高出250倍。

你缩小视图的一个更大的部分场景,是否创建错误的轨道。

释放(雷达);雷达。FalseAlarmRate = 2.5的军医;tp。XLimits = (-2100 - 300);tp。YLimits = (-100 - 3100);tp。ZLimits = (-1000 - 1000);rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

有一些错误的轨道被创建(不是全部显示)和他们增加GOSPA价值。

你想删除错误的跟踪速度更快,你使用DeletionThreshold财产。删除阈值的默认值5[5],它要求5连续错过之前确认跟踪被删除。你可以删除过程更快通过降低这个值3[3],或3-out-of-3失误。另外,由于雷达DetectionProbability高,你甚至可以删除一个跟踪2/3的错过后,通过设置:

发布追踪(追踪)。DeletionThreshold= [2 3]; rerunScenario(scenario, tracker, tgm, tp);

图包含一个坐标轴对象。坐标轴对象包含10线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

正如所料,减少步骤的数量需要删除跟踪减少GOSPA价值因为这些错误的跟踪是短暂的。然而,这些错误的跟踪仍证实和恶化整个跟踪质量。

所以,你想要确认新跟踪更严格的试图减少错误的轨道。考虑到跟踪器ConfirmationThreshold财产。

disp (tracker.ConfirmationThreshold);
2 3

值显示追踪确认每个跟踪如果指定两个检测前三的更新。你决定很难确认跟踪和重置价值3-out-of-4作业。

发布追踪(追踪)。ConfirmationThreshold= [3 4]; rerunScenario(scenario, tracker, tgm, tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

通过更严格的跟踪确认你能够消除错误的轨道上。结果,GOSPA值下降了约20再一次,除了前几步骤。

最大数量的跟踪

使确认更严格的让你消除错误的轨道。然而,仍然跟踪初始化每个错误的跟踪检测,你可以观察到通过观察追踪追踪目前维护的数量。

跟踪的数量通过追踪的生命周期波动。然而,你不想让它超过了最大数量的跟踪器可以保持跟踪,所定义的MaxNumTracks默认情况下,它是100年。如果追踪超过这个数,它发出一个警告,一个新的跟踪无法添加,但可以继续执行。

增加跟踪允许的最大数量跟踪器跟踪甚至更高的误警率没有发出警告。你还想要跟踪确认更严格的减少错误的追踪和减少GOSPA度量。

发布追踪(追踪)。MaxNumTracks = 200;跟踪器。ConfirmationThreshold = [5 - 6];释放(雷达)雷达。FalseAlarmRate = 1 e - 3;rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

注意,使跟踪确认更严格的确认跟踪需要更多的步骤。因此,走了几步,没有确认跟踪和GOSPA价值仍然很高。可以比较的GOSPA图一开始这个例子。

尝试另一个跟踪器

你想尝试使用另一个跟踪器,在这种情况下,联合概率数据关联跟踪,trackerJPDA。为前面定义的许多属性JPDA跟踪器跟踪仍然有效。您使用helperGNN2JPDA构建JPDA追踪。

jpda = helperGNN2JPDA(跟踪);jpda。ClutterDensity = 1 e - 3;rerunScenario(场景中,追踪,电报,tp);

图包含一个坐标轴对象。坐标轴对象包含9线类型的对象,补丁,文本。这些对象代表雷达、平台、检测、跟踪,(历史),雷达覆盖。

图包含一个坐标轴对象。坐标轴对象与标题广义OSPA与步伐包含一个类型的对象。

总结

在这个例子中,您学习了建立多目标追踪者为了保持轨道的实际场景中的对象,避免错误的跟踪,保持正确的追踪号码,切换不同的追踪器。

优化多目标跟踪时,考虑改变以下属性:

FilterInitializationFcn -定义了滤波器用来初始化一个新的跟踪未赋值的检测。

  • 函数定义了运动和测量模型。

  • 检查状态不确定性所代表的正确StateCovariance的过滤器。例如,协方差大的初始速度允许跟踪快速移动的物体。

AssignmentThreshold -最大归一化距离用于检测的任务跟踪。

  • 降低这个值,加快任务,特别是在大场景与许多跟踪,避免错误的轨道,冗余追踪和跟踪互换。如果使用trackerJPDA,降低这个值降低了检测的数量是分配给一个单线。如果使用trackerTOMHT的数量,减少了作业阈值降低跟踪创建的分支。

  • 增加这个值,以避免分叉和断裂甚至在新检测的存在。

MaxNumTracks -最大数量的跟踪维护的追踪。

  • 降低这个值以减少内存使用,加快跟踪初始化。

  • 增加这个值,以避免新线路不被初始化,因为限制了。

ConfirmationThreshold -控制确认新的曲目。

  • 降低这个值更快地确认更多的跟踪和确认追踪。

  • 增加这个值降低的数量错误的轨道。

DeletionThreshold -控制滑行和删除的痕迹。

  • 降低这个值更快地删除跟踪(例如当检测的概率是高)。

  • 增加这个值来弥补低检测概率(例如海岸遮挡期间跟踪)。

你可以更多的细节请参考下面的例子:如何生成C代码跟踪,跟踪逻辑概论,跟踪密集目标模棱两可,使用GM-PHD跟踪器跟踪点目标密集杂乱

效用函数

updateDisplay

这个函数更新的显示每一步模拟。

函数updateDisplay (rp、pp、dp, trp covp,场景中,引爆器,跟踪)%绘制平台位置提出了= platformPoses(场景);pos =重塑([姿势(1:3)。位置]3 [])';%的平台plotPlatform (pp、pos);radarPos = (4) .Position构成;%的雷达radarPos plotPlatform (rp)%画出检测位置如果~ isempty(检波器)ds =[侦破{}):;dPos =重塑([ds。测量]3 [])';其他的dPos = 0 (0, 3);结束dPos plotDetection (dp);%画出痕迹传真照片= getTrackPositions(跟踪,(1 0 0 0 0 0;0 0 1 0 0 0;0 0 0 0 1 0]);tid =字符串([tracks.TrackID]);plotTrack (trp,传真照片,tid);%画出覆盖covcon = coverageConfig(场景);plotCoverage (covp covcon);结束

rerunScenario

这个函数运行场景与给定的追踪和跟踪GOSPA度量对象。它使用戏剧情节对象来显示结果。

函数信息= rerunScenario(场景、追踪电报,tp)%重置后的对象之前运行重启(场景);重置(跟踪);重置(电报);rp = findPlotter (tp,“DisplayName的”,“雷达”);页= findPlotter (tp,“DisplayName的”,“平台”);trp = findPlotter (tp,“DisplayName的”,“跟踪”);dp = findPlotter (tp,“DisplayName的”,“检测”);covp = findPlotter (tp,“DisplayName的”,“雷达覆盖”);clearPlotterData (tp);gospa = 0 (51);%的步伐是51我= 0;s = rng (2019);推进(场景)%得到检测依据=检测(场景);%更新追踪如果isLocked(跟踪)| | ~ isempty(检波器)[痕迹,~,~,信息]=追踪(侦破,scenario.SimulationTime);结束%评估GOSPA我=我+ 1;真理= platformPoses(场景);gospa (i) =电报(跟踪、真理);%更新显示updateDisplay (rp、pp、dp, trp covp,场景,侦破,追踪);结束rng (s)图绘制(gospa (gospa > 0))标题(“广义OSPA与步伐”)结束

initFastCVEKF

这个函数修改默认initcvekf过滤器的初始化函数以允许更多的不确定性对象的速度。

函数卡尔曼滤波器= initFastCVEKF(检测)ekf = initcvekf(检测);initialCovariance =诊断接头(ekf.StateCovariance);initialCovariance ((2、4、6)) = 300 ^ 2;协方差%增加速度卡尔曼滤波器。StateCovariance =诊断接头(initialCovariance);结束

helperGNN2JPDA

这个函数提供了JPDA追踪相当于GNN跟踪作为输入。

函数jpda = helperGNN2JPDA (gnn) jpda = trackerJPDA (“MaxNumTracks”gnn.MaxNumTracks,“AssignmentThreshold”gnn.AssignmentThreshold,“FilterInitializationFcn”gnn.FilterInitializationFcn,“MaxNumSensors”gnn.MaxNumSensors,“ConfirmationThreshold”gnn.ConfirmationThreshold,“DeletionThreshold”gnn.DeletionThreshold,“HasCostMatrixInput”gnn.HasCostMatrixInput,“HasDetectableTrackIDsInput”,gnn.HasDetectableTrackIDsInput);如果strcmpi (gnn.TrackLogic“历史”jpda。TrackLogic =“历史”;其他的jpda。TrackLogic =“集成”;jpda。DetectionProbability = gnn.DetectionProbability;jpda。ClutterDensity = gnn。FalseAlarmRate / gnn.Volume;结束结束