主要内容

履带逻辑概论

这个例子展示了如何定义和使用基于历史记录或分数的确认和删除逻辑。它介绍了trackHistoryLogic而且trackScoreLogic对象,并展示如何将它们作为独立对象使用,以及如何将它们作为trackerGNN

简介

跟踪器维护一个轨道列表,或者在感兴趣的区域中对目标状态的估计。如果检测不能分配给跟踪器已经维护的任何跟踪,跟踪器将启动一个新的跟踪。在大多数情况下,尚不清楚新轨道代表的是一个真实的目标还是一个虚假的目标。首先,使用试探性的的地位。如果获得足够的证据,轨迹就会变成确认.类似地,如果没有将检测分配给轨道,则轨道为摸样(没有修正的预测),但在几次错过的更新后,跟踪器删除轨道。

文献中主要有两种确认和删除音轨的方法:

  1. 基于历史记录:跟踪器在最近几次更新中计算分配给跟踪的检测数量。如果分配了足够多的探测,轨道就被确认了。如果轨道没有分配给任何检测进行足够的更新,它将被删除。这种类型的逻辑通常被称为M-out-of-NLast-N,意思是out ofN更新时,轨道必须被检测至少_M _次才能被确认。

  2. 计分:跟踪器计算可能性一个轨道是真正的目标。而不是可能性,我们用分数,定义为可能性的对数。一个高的正赛道分数意味着赛道很可能是一个真正的目标。非常负的音轨分数意味着音轨很可能是假的。因此,如果分数足够高,我们可以设置一个确认音轨的阈值。如果分数很低,或者从最大分数下降到足够低,则删除轨道。

在下面的小节中,您可以看到如何定义和使用两种类型的对象,它们实现基于历史记录和基于分数的跟踪逻辑。

使用基于历史的轨道逻辑确认和删除轨道

最简单的轨迹逻辑是基于历史的。这种类型的逻辑计算最近检测到(或错过)轨道的次数N更新。您希望在5次更新中3次检测到一个轨道(5次更新中3次)后确认它,并在连续6次遗漏后删除它。首先,创建trackHistoryLogic对象,该对象通过定义确认和删除阈值来维护跟踪历史。

historyLogic = trackHistoryLogic(“ConfirmationThreshold”, [3 5],“DeletionThreshold”6)
historyLogic = trackHistoryLogic with properties: ConfirmationThreshold: [3 5] DeletionThreshold: [6 6] History: [0 0 0 0 0 0 0]

为了说明这一点,在前5个更新中,每隔一次更新就检测一次轨道。下面显示了在5次命中3次之后,轨道逻辑是如何得到确认的。使用初始化方法用第一次命中初始化对象。然后使用打击小姐方法,分别指示轨道逻辑是由命中更新还是未命中更新。

checkConfirmation方法用于检查是否可以根据其历史记录确认航迹。使用输出方法获取航迹历史记录,这是一个长度的逻辑数组Nmax = max(Nconf, Ndel).在这个例子中,Nmax是6。

wasInitialized = false;对象已经初始化了吗?i = 1:5 detectedFlag = logical(mod(i,2));%只有奇数更新是真的如果detectedFlag && ~wasInitialized init(historyLogic) wasInitialized = true;elseifdetectedFlag && wasInitialized hit(historyLogic)其他的小姐(historyLogic)结束history = output(historyLogic);confFlag = checkConfirmation(historyLogic);disp ([轨迹记录为:num2str(历史)”。确认标志为:'num2str (confFlag)])结束
轨迹记录为:1 0 0 0 0 0。确认标志为:0轨迹历史为:0 1 0 0 0 0确认标志为:0轨迹历史为:1 0 1 0 0 0确认标志为:0轨迹历史为:0 1 0 1 0 0。确认标志为:0轨迹历史为:1 0 1 0 10 0确认标志为:1

现在,假设在几次更新中没有检测到轨道。在第六次更新后,应该删除它。使用checkDeletion方法检查轨道是否已删除。

i = 1:6 miss(historyLogic);%未检测到每次更新轨道history = output(historyLogic);deleteFlag = checkdelete (historyLogic);disp ([轨迹记录为:num2str(历史)”。删除标志为:'num2str (deleteFlag)])结束
轨迹记录为:0 1 0 1 0 1。删除标志为:0跟踪历史为:0 0 1 0 1 0。删除标志为:0跟踪历史为:0 0 0 1 0 1。删除标志为:0跟踪历史为:0 0 0 0 1 0。删除标志为:0跟踪历史为:0 0 0 0 0 1。删除标志为:0跟踪历史为:0 0 0 0 0 0。删除标志为:1

使用基于分数的轨迹逻辑确认和删除轨迹

在许多情况下,仅仅知道一个轨道是否被分配检测是不够的。你可能需要考虑分配是正确的可能性。此外,还需要知道探测到真正目标的可能性有多大探测概率,或者它是错误的可能性有多大,基于它误报率.此外,如果轨道是新的,你需要考虑到费率,β,此时单位体积内可能会检测到新的目标。

使用trackScoreLogic对象创建基于分数的跟踪确认和删除逻辑。定义ConfirmationThreshold而且DeletionThreshold作为两个标量值。

当一个轨道被分配一个检测,你更新轨道逻辑与一个命中,在大多数情况下,轨道分数增加。的ConfirmationThreshold定义确认音轨所需的最小分数。

当一个轨道没有被分配检测时,轨道分数会降低。的DeletionThreshold用于定义在删除音轨之前允许分数从最大分数下降多少。

scoreLogic = trackScoreLogic(“ConfirmationThreshold”25岁的“DeletionThreshold”5)
scoreLogic = trackScoreLogic with properties: ConfirmationThreshold: 25 DeletionThreshold: -5 Score: 0 MaxScore: 0
Pd = 0.9;%检测概率Pfa = 1e-6;误报概率%体积= 1;%传感器检测仓的体积Beta = 0.1;单位体积的新目标速率wasInitialized = false;对象已经初始化了吗?

使用基于分数的逻辑确认赛道与使用基于历史的逻辑确认赛道非常相似。主要的区别是,现在考虑了额外的参数,包括传感器的统计性能以及轨道相对于检测的剩余距离。

你可以使用初始化打击,小姐方法初始化就先命中,更新trackScoreLogic分别使用后续命中或未命中的更新。

你可以使用checkConfirmation方法检查轨道是否应确认。你可以使用输出方法获取当前分数和最大分数[currentScore, maxScore]数组中。

R = rng(2018);为可重复的结果设置随机种子numSteps1 = 6;scores = 0 (numSteps1,2);i = 1:numSteps1 l = 0.05 + 0.05 * rand;%测量的可能性detectedFlag = logical(mod(i,2));在本例中,只有偶数更新为真如果detectedFlag && ~wasInitialized init(scoreLogic, volume, beta);wasInitialized = true;elseifdetectedFlag && wasInitialized hit(scoreLogic, volume, l);其他的小姐(scoreLogic);结束scores(i,:) = output(scoreLogic);confFlag = checkConfirmation(scoreLogic);disp (['Score and MaxScore: 'num2str(分数(我,:)),”。确认标志为:'num2str (confFlag)])结束
Score和MaxScore: 11.4076 11.4076。确认标志为:0 Score和MaxScore: 9.10498 11.4076。确认标志为:0 Score和MaxScore: 20.4649 20.4649。确认标志为:0 Score和MaxScore: 18.1624 20.4649。确认标志为:0 Score和MaxScore: 29.2459 29.2459。确认标志为:1 Score和MaxScore: 26.9433 29.2459。确认标志为:1
rng (r);将随机种子返回到之前的设置

注意轨道分数如何随着每次成功更新而增加,而随着每次漏检而降低。一旦音轨分数高于ConfirmationThreshold, checkConfirmation函数将返回true,这意味着音轨现在已被确认。

与基于历史的轨道逻辑一样,如果轨道没有分配给任何检测,那么它最终应该被删除。的DeletionThreshold属性用于确定音轨分数何时下降到应该删除音轨的程度。请注意,分数不一定低于DeletionThreshold,只有区别在当前分数和轨道获得的最大分数之间应该低于阈值。原因是,如果一个曲目在多次成功更新后获得了高分,并且如果我们使用绝对分数,那么将需要太多错过的更新才能删除该曲目。下面显示了在三次失误后删除的音轨。

numSteps2 = 3;scores(end+1:end+numSteps2,:) = 0 (numSteps2,2);i = 1:numSteps2 miss(scoreLogic);deleteFlag = checkdelete (scoreLogic);scores(numSteps1+i,:) = output(scoreLogic);disp (['Score and MaxScore: 'num2str(分数(numSteps1 +我,:)),”。删除标志为:'num2str (deleteFlag)])结束
分数和MaxScore: 24.6407 29.2459。删除标志为:0 Score和MaxScore: 22.3381 29.2459。删除标志为:1 Score和MaxScore: 20.0355 29.2459。删除标志为:1
deletionScore = scores(:,2) + scoreLogic.DeletionThreshold;楼梯(分数)情节([1,numSteps1 + numSteps2], [scoreLogic。ConfirmationThreshold scoreLogic。ConfirmationThreshold),“——”)楼梯(deletionScore“——”)标题(“径赛成绩和最高成绩”)传说(“分数”“MaxScore”“ConfirmationThrehsold”“DeletionThreshold”“位置”“最佳”

图中包含一个轴对象。带有Track Score和Maximum Score标题的坐标轴对象包含楼梯、直线类型的4个对象。这些对象表示Score, MaxScore, ConfirmationThrehsold, DeletionThreshold。

如果您希望延迟轨道删除,直到发生更多遗漏,只需更改DeletionThreshold变成一个更负的值。

在跟踪器中使用跟踪逻辑

通常,跟踪逻辑用于跟踪器内部。配置trackerGNN使用基于历史的跟踪逻辑,5次更新中3次成功后确认,6次更新中5次失败后删除。

跟踪器= trackerGNN(“作业”“拍卖”“ConfirmationThreshold”, [3 5],“DeletionThreshold”, [5 6],“TrackLogic”“历史”
tracker = trackerGNN with properties: TrackerIndex: 0 FilterInitializationFcn: 'initcvekf' MaxNumTracks: 100 MaxNumDetections: Inf MaxNumSensors: 20 Assignment: 'Auction' AssignmentThreshold: [30 Inf] AssignmentClustering: 'off' OOSMHandling: 'Terminate' TrackLogic: 'History' ConfirmationThreshold: [3 5] DeletionThreshold: [5 6] HasCostMatrixInput: false HasDetectableTrackIDsInput: false statparameters: [1x1 struct] NumTracks: 0 NumConfirmedTracks: 0 ClassFusionMethod:EnableMemoryManagement: false

下面的循环更新跟踪器,在每次奇数更新时进行检测。5次更新后,跟踪器确认跟踪。控件后,可以查看航迹历史记录和航迹确认标志TrackLogicState而且IsConfirmed轨道输出的字段。

i = 1:5 detectedFlag = logical(mod(i,2));%只有奇数更新是真的如果detectedFlag检测= {objectDetection(i,[1;2;3])};其他的检测= {};结束[~,~,allTracks] =跟踪器(检测,i)结束
allTracks = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 1 Age: 1 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [1 0 0 0 0 0 0] IsConfirmed: 0 IsCoasted: 0 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
allTracks = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 2 Age: 2 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [0 1 0 0 0 0 0] IsConfirmed: 0 IsCoasted: 1 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
allTracks = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 3 Age: 3 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [1 0 1 0 0 0] IsConfirmed: 0 IsCoasted: 0 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
allTracks = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 4 Age: 4 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [0 1 0 1 0 0] IsConfirmed: 0 IsCoasted: 1 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
allTracks = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 5 Age: 5 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [1 0 1 0 1 0] IsConfirmed: 1 IsCoasted: 0 IsSelfReported: 1 ObjectAttributes: [1x1 struct]

下面的循环将跟踪器更新5次,其中5次未命中。该曲目在4次额外更新(总体上是第9次更新)后被删除,因为它在第4次、第6次、第7次、第8次和第9次更新(最近6次更新中的5次)中错过了检测。

I = 1:5 detection = {};confirmedTrack =跟踪器(检测,i+5)结束
confirmedTrack = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 6 Age: 6 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [0 1 0 1 0 1] IsConfirmed: 1 IsCoasted: 1 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
confirmedTrack = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 7 Age: 7 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [0 0 1 0 1 0] IsConfirmed: 1 IsCoasted: 1 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
confirmedTrack = objectTrack with properties: TrackID: 1 BranchID: 0 SourceIndex: 0 UpdateTime: 8 Age: 8 State: [6x1 double] StateCovariance: [6x6 double] statparameters: [1x1 struct] ObjectClassID: 0 objectclass: 1 TrackLogic: 'History' TrackLogicState: [0 0 0 1 0 1] IsConfirmed: 1 IsCoasted: 1 IsSelfReported: 1 ObjectAttributes: [1x1 struct]
TrackID BranchID SourceIndex UpdateTime Age State StateCovariance statparameters ObjectClassID objectclasstracklogic TrackLogicState IsConfirmed IsCoasted IsSelfReported ObjectAttributes confirmedTrack = 0x1 objectTrack数组带属性:TrackID BranchID SourceIndex UpdateTime Age State StateCovariance statparameters ObjectClassID objectclassprobability TrackLogic TrackLogicState IsConfirmed IsCoasted IsSelfReported ObjectAttributes

总结

跟踪器需要一种方法来确认被认为是真正目标的轨道,并在一段时间后删除没有分配任何探测的轨道。提出了两种类型的航迹确认和删除逻辑:基于历史的航迹逻辑和基于分数的航迹逻辑。基于历史的轨道逻辑只考虑在最近的过去更新中是否分配了轨道检测。基于分数的轨迹逻辑提供了一种统计度量,用于衡量一个轨迹代表真实目标的可能性。这两种类型的跟踪逻辑对象都可以作为独立对象使用,但通常在跟踪器对象中使用。