此示例显示如何调谐并运行跟踪器以跟踪场景中的多个对象。该示例说明并展示了传感器融合和跟踪工具箱中跟踪器的关键属性的重要性。
为了测试跟踪器跟踪多个对象的功能,您可以设置基本方案。在场景中,您可以定义三个对象,每个对象沿恒定速度沿直线移动。最初,您将对象速度设置为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.trajectory = KineMaticTrajectory(“位置”, [-v*stopTime 0.5*v*stopTime 0]);雷达= fusionRadarSensor (1,'没有扫描'那'updaterate'5,...“MountingAngles”, [0 0 0],“AzimuthResolution”, 1...“FieldOfView”, 100年[1],'hasins',真的,'检测'那“场景”);pradar.sensors =雷达;
您创建一个剧场情节来显示该场景。
无花果=图;ax =轴(图);tp = theaterPlot ('父母'ax,'xlimits'(-11 * 100 (v),'ylimits',[-50 15 * v],“ZLimits”100年[-100]);rp = platformPlotter (tp,'显示名称'那'雷达'那'标记'那' d ');页= platformPlotter (tp,'显示名称'那“平台”);DP = DetectionPlotter(TP,'显示名称'那'检测');TRP = Trackplotter(TP,'显示名称'那'轨道'那'connecthistory'那'在'那'colorizedhistory'那'在');Covp = CoveragePlotter(TP,'显示名称'那“雷达覆盖”那'Α',[0.1 0]);
最后,您创建了默认值trackerGNN
对象,运行方案,并观察结果。你用trackGOSPAMetric
评估跟踪器的性能。
跟踪器= trackergnn;tgm = trackgospametric(“距离”那“posabserr”);GOSPA =零(1,51);%时间步长为51我= 0;为可重复的结果定义随机数生成器种子S = RNG(2019);尽管前进(方案)%得到检测依据=检测(场景);%更新跟踪器如果isLocked(tracker) || ~isempty(dets) [tracks, ~, ~, info] = tracker(dets, scenariationtime);结尾%评估GOSPAI = I + 1;真理= platformPoses(场景);Gospa (i) = tgm(tracks, truth);%更新显示updateDisplay(rp, pp, dp, trp, covp, scenario, dets, tracks);结尾
Rng (s)图形图(gospa)标题('广泛的OSPA与时间段')
你观察到追踪器无法追踪这三个物体。在某一时刻,除了三个移动物体的三个预期轨道之外,还会确认并显示其他轨道。结果,GOSPA指标的值增加了。请注意,GOSPA度量值越低,表示跟踪器性能越好。
你看信息
跟踪器输出并观察CostMatrix
和分配
不要显示您期望发生的曲目和对象的分配。这意味着AssignmentThreshold
太小了,应该增加。将分配阈值增加到50。
释放(跟踪);跟踪器。AssignmentThreshold = 50;重新运行(方案,跟踪器,TGM,TP);
分配阈值属性还具有可设置的与检测的最大距离。这是最后一个元素AssignmentThreshold
价值。您可以在处理大量检测和轨道时使用此值来加速跟踪器。参考如何高效地跟踪大量对象例如更多的细节。在这里,将值设置为2000年
代替正
,这将减少用于计算分配成本的轨迹和检测组合的数量。
释放(跟踪);tracker.assignmentThreshold = [50 2000];重新运行(方案,跟踪器,TGM,TP);
以上结果表明,跟踪器能够为三个移动物体维持三个轨道而不产生错误的轨道。但是,如果对象以更快的速度移动,则跟踪器的性能是否会保持?要检查此操作,请修改方案,并将对象速度分别提高为160,200和240 m / s。
v = 200;p1.traptory = waypointtrajectory([20 -10 0; 20 0.8 * v * stoptime-10 0],[0停止时间];p2.trajectory = waypointtrajectory([0 0 0; 0 V *停止时间0],[0停止]);p3.traptory = WayPointTrajectory([ - 20 10 0; -20 1.2 * v * stoptime + 10 0],[0停止时间];pradar.trajectory = KineMaticTrajectory(“位置”, [-v*stopTime 0.5*v*stopTime 0]);tp.xlimits = [-100-V *停止时间300];tp.ylimits = [-100 100 + v * 1.2 * stoptime];释放(雷达);Radar.Rangelimits(2)= 3000;重新运行(方案,跟踪器,TGM,TP);
正如您所预期的那样,跟踪器无法建立三个对象的稳定曲目。可能的解决方案是增加AssignmentThreshold
甚至进一步允许更新曲目。但是,此选项可能会增加分配给多个检测并确认的随机错误轨道的可能性。因此,您可以选择修改过滤器的初始化。
你设置了FilterInitializationFCN.
函数的财产initfastcvekf.
.函数与默认值相同initcvekf.
除了它增加了状态的速度分量中的不确定性。它允许初始状态计算更大的未知速度值,但一旦轨道建立,不确定度再次减少。
发布(跟踪器)跟踪器.FilterInitializationFCN = @InitFastCvekf;重新运行(方案,跟踪器,TGM,TP);
你观察到追踪器再次能够保持轨迹,三个移动的物体有三个轨迹,尽管它们现在移动得更快了。GOSPA值在经过几个步骤后也会降低。
您希望确保您的跟踪器对更高的误报率稳健。为此,您将雷达配置为具有比以前高250倍的误报率。
您缩小以查看场景的较大部分,并查看是否已创建虚假曲目。
释放(雷达);雷达。FalseAlarmRate = 2.5的军医;tp。XLimits = [-2100 300];tp。YLimits = [-100 3100];tp。ZLimits = [-1000 1000];重新运行(方案,跟踪器,TGM,TP);
有一些正在创建的虚假轨道(不是全部显示),它们增加了GOSPA值。
您想更快地删除错误的曲目,您使用deletionthreshold.
财产。删除阈值的默认值为[5 5],即连续5次不删除确认的曲目才会被删除。您可以通过将该值减少到[3 3]或3次中有3次失误来加快删除过程。或者,自从雷达DetectionProbability
是高的,你甚至可以在3次失败中有2次失败后删除曲目,通过设置:
释放(跟踪器)跟踪器。触电阈值= [2 3];重新运行(方案,跟踪器,TGM,TP);
正如预期的那样,减少删除轨道所需的步数减少了GOSPA值,因为这些错误轨道是短暂的。但是,这些虚假轨道仍然确认并恶化了整体跟踪质量。
因此,您希望对新轨道的确认更加严格,以减少虚假轨道的数量。考虑到跟踪器ConfirmationThreshold
财产。
disp(tracker.crunmationThreshold);
2 3
该值表明,如果在前三个更新中分配了两个检测,则跟踪器确认每个曲目。您决定更难确认轨道并将值重置为3-OUT-OF-4分配。
释放(跟踪器)跟踪器.confirmationThreshold= [3 4];重新运行(方案,跟踪器,TGM,TP);
通过使轨道确认更严格,您可以消除错误的轨道。因此,除了前几个步骤之外,GOSPA值再次降至20左右。
使确认更严格允许您消除虚假曲目。但是,跟踪器仍然初始化每个错误检测的轨道,您可以通过查看跟踪器当前维护的曲目的数量来观察。
轨迹的数量在跟踪器的整个生命周期中波动。但是,您不希望它超过跟踪器可以维护的最大跟踪数MaxNumTracks
,默认值为100。如果跟踪器超过这个数字,它会发出一个警告,说不能添加新跟踪,但是可以继续执行。
增加最大轨道数,以允许跟踪器跟踪,即使有较高的误报率,而不发出警告。您还希望更加严格地进行跟踪确认,以减少虚假跟踪的数量并减少GOSPA指标。
发布追踪(追踪)。MaxNumTracks = 200;跟踪器。ConfirmationThreshold = [5 6];释放(雷达)雷达。FalseAlarmRate = 1 e - 3;重新运行(方案,跟踪器,TGM,TP);
请注意,使轨道确认更严格需要更多步骤来确认曲目。结果,对于前几个步骤,没有确认的曲目,GOSPA值保持高。您可以在此示例开始时使用GOSPA图表进行比较。
你想尝试使用另一个跟踪器,在这个例子中,联合概率数据关联跟踪器,trackerjpda.
.为先前的跟踪器定义的许多属性仍然在JPDA跟踪器中有效。你用了helperGNN2JPDA
建造JPDA跟踪器。
jpda = helpergnn2jpda(跟踪器);jpda.cluthtdensity = 1e-3;重新运行(方案,跟踪器,TGM,TP);
在这个例子中,您学习了如何设置多目标跟踪器,以保持场景中真实物体的轨迹,避免虚假的轨迹,保持正确的轨迹数量,以及在不同的跟踪器之间切换。
调整多目标跟踪器时,请考虑更改以下属性:
filterinitializationfcn -定义用于初始化具有未分配检测的新曲目的过滤器。
该功能定义了运动和测量模型。
检查状态不确定性是否正确地由StateCovariance.过滤器。例如,大的初始速度协方差允许跟踪快速移动物体。
AssignmentThreshold -用于对跟踪进行探测的最大标准化距离。
减少这个值以加快分配,特别是在有许多轨道的大型场景中,并避免虚假轨道、冗余轨道和轨道互换。如果使用A.trackerjpda.
,减少该值减少了被分配给单个轨道的检测的数量。如果使用A.trackertomht.
,减少分配阈值减少了创建的轨道分支的数量。
即使在存在新检测,也会增加此值以避免轨道发散和破坏。
MaxNumTracks -跟踪器维护的最大轨迹数。
减少此值以最小化内存使用率并加速跟踪器初始化。
增加此值以避免由于达到限制而未初始化新轨道。
确认察觉 -控制新轨道的确认。
减少此值以确认更多曲目并更快地确认曲目。
增加此值以减少虚假轨道的数量。
DeletionThreshold -控制轨道的滑行和删除。
减少此值以更快地删除曲目(例如,当检测概率很高时)。
增加该值以补偿较低的检测概率(例如在闭塞期间的海岸轨道)。
您可以有关其他详细信息,请参阅以下示例:如何为跟踪器生成C代码那曲目逻辑简介那在模糊状态下跟踪近距离目标, 和利用GM-PHD跟踪器跟踪密集杂波中的点目标.
更新
此功能在模拟的每个步骤中更新显示。
功能UpdateDisplay(RP,PP,DP,TRP,COVP,情景,DET,轨道)%绘制平台位置提出了= platformPoses(场景);pos =重塑([姿势(1:3)。位置]3 [])';%只有平台plotplatform(pp,pos);Radarpos = Pose(4).Position;%只有雷达Plotplatform(RP,Radarpos)%绘制检测位置如果~isempty(dets) ds = [dets{:}];dPos =重塑([ds。测量]3 [])';别的dPos = 0 (0, 3);结尾plotdetection(DP,DPO);%绘制轨迹TPOS = GetTrackpositions(曲目,[1 0 0 0 0 0; 0 0 1 0 0 0; 0 0 0 0 1 0]);tids = string([tracks.trackid]);Plottrack(TRP,TPO,TID);%绘制覆盖范围covcon = coverageConfig(场景);plotCoverage (covp covcon);结尾
rerunScenario
该函数使用给定的跟踪器和跟踪GOSPA度量对象运行场景。它使用剧场情节对象来显示结果。
功能信息= RerunScenario(方案,跟踪器,TGM,TP)%重置以前运行后的对象重启(方案);重置(跟踪器);重置(TGM);rp = findplotter(tp,'显示名称'那'雷达');pp = findplotter(tp,'显示名称'那“平台”);trp = findPlotter (tp,'显示名称'那'轨道');dp = findplotter(tp,'显示名称'那'检测');covp = findplotter(tp,'显示名称'那“雷达覆盖”);clearplotterdata(tp);GOSPA =零(1,51);%时间步长为51我= 0;S = RNG(2019);尽管前进(方案)%得到检测依据=检测(场景);%更新跟踪器如果isLocked(tracker) || ~isempty(dets) [tracks, ~, ~, info] = tracker(dets, scenariationtime);结尾%评估GOSPAI = I + 1;真理= platformPoses(场景);Gospa (i) = tgm(tracks, truth);%更新显示updateDisplay(rp, pp, dp, trp, covp, scenario, dets, tracks);结尾RNG(GOSPA(GOSPA> 0))标题('广泛的OSPA与时间段')结尾
initfastcvekf.
此函数修改默认值initcvekf.
过滤初始化功能,以允许更多的不确定性的对象速度。
功能ekf = initcvekf(检测);initialCovariance =诊断接头(ekf.StateCovariance);initialCovariance((2、4、6))= 300 ^ 2;%增加速度协方差ekf.statecovariance = diag(initialcovariance);结尾
helperGNN2JPDA
这个函数提供了与GNN跟踪器等效的JPDA跟踪器作为输入。
功能jpda = helperGNN2JPDA(gnn)...'maxnumtracks', gnn。MaxNumTracks,...'AssignmentThreshold',gnn.assignmentthreshold,...'filterinitializationfcn', gnn。FilterInitializationFcn,...“MaxNumSensors”,gnn.maxnumsensors,...'确认察觉', gnn。ConfirmationThreshold,...“DeletionThreshold”,gnn.CeletionThreshold,...“HasCostMatrixInput”,gnn.hascostmatrixinput,...“HasDetectableTrackIDsInput”, gnn.HasDetectableTrackIDsInput);如果Strcmpi(gnn.tracklogic,'历史'jpda。TrackLogic ='历史';别的jpda.tracklogic =.“集成”;JPDA.DetectionProbability = GNN.DetectionProbability;jpda.clutterdenty = gnn.falsealarmrate / gnn.volume;结尾结尾