主要内容

多目标跟踪器

使用GNN分配跟踪对象

描述

多目标跟踪器系统对象™ 初始化、确认、预测、纠正和删除移动对象的轨迹。多对象跟踪器的输入是由objectDetection对象,drivingRadarDataGenerator对象,或visionDetectionGenerator对象。多目标跟踪器接受来自多个传感器的检测,并使用全局最近邻(GNN)准则将其分配到跟踪对象。每个检测被分配到一个单独的轨道。如果检测不能分配到任何轨道,基于分配阈值属性时,跟踪器将创建一个新轨迹。轨迹将以结构数组的形式返回。

一条新轨道从A开始试探性的状态。如果给一个试探性轨道分配足够的探测,它的状态就会变为确认.如果检测是已知的分类(ObjectClassID返回轨迹的字段非零),该轨迹可以立即被确认。有关用于确认轨迹的多目标跟踪器属性的详细信息,请参见算法

当轨迹被确定时,多目标跟踪器认为该轨迹代表一个物理对象。如果在指定数量的更新中未将检测添加到轨道中,则轨道将被删除。

跟踪器还利用卡尔曼滤波估计每个轨迹的状态向量和状态向量协方差矩阵。这些状态向量用于预测轨道在每一帧中的位置,并确定分配给每个轨道的每个检测的可能性。

使用多目标跟踪器跟踪对象:

  1. 创建多目标跟踪器对象,并设置其属性。

  2. 使用参数调用对象,就像调用函数一样。

要了解更多关于System对象如何工作的信息,请参见什么是系统对象?

创造

描述

跟踪器= multiObjectTracker创建一个多目标跟踪器具有默认属性值的系统对象。

例子

跟踪器= multiObjectTracker (名称,值属性对于使用一个或多个名称-值对的多对象跟踪器。例如,multiObjectTracker (FilterInitializationFcn, @initcvukf MaxNumTracks, 100)创建一个多对象跟踪器,该跟踪器使用恒定速度、无轨迹卡尔曼滤波器,最多可保持100个轨迹。将每个属性名称括在引号中。

性质

全部展开

除非另有说明,否则属性为不能,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

唯一跟踪器标识符,指定为非负整数。此属性用作SourceIndex,并在多跟踪器系统中区分来自不同跟踪器的跟踪。必须将此属性指定为正整数,才能将轨道输出用作轨道fuser的输入。

例子:1

卡尔曼滤波器初始化函数,指定为函数句柄或有效卡尔曼滤波器初始化函数名称的字符向量或字符串标量。

自动驾驶工具箱™提供了几个初始化函数,您可以使用它们来指定FilterInitializationFcn

初始化函数 函数定义
initcvekf 初始化等速扩展卡尔曼滤波器。
initcvkf 初始化等速线性卡尔曼滤波器。
initcvukf 初始化恒速无迹卡尔曼滤波。
initcaekf 初始化恒加速度扩展卡尔曼滤波器。
initcakf 初始化常量加速度线性卡尔曼滤波器。
initcaukf 初始化恒加速度无迹卡尔曼滤波器。
initctekf 初始化恒定转速扩展卡尔曼滤波器。
initctukf 初始化常数转率无迹卡尔曼滤波器。

您还可以编写自己的初始化函数。该函数的输入必须是由objectDetection.此函数的输出必须是卡尔曼滤波对象:trackingKFtrackingEKF,或trackingUKF。为了指导您编写此函数,您可以从MATLAB中查看所提供函数的详细信息®.例如:

类型initcvkf

数据类型:function_handle|字符|一串

检测分配阈值(或门限阈值),指定为正标量或1 × 2向量[C1C2),C1C2.如果指定为标量,则指定值,瓦尔,将扩展至[瓦尔].

最初,跟踪器执行a估计所有轨道和检测之间的归一化距离。跟踪器只计算粗归一化距离小于的组合的精确归一化距离C2.此外,跟踪器只能分配一个检测轨道,如果他们准确的归一化距离小于C1.看到距离用于跟踪滤波器的函数(例如,trackingEKF),以说明计算距离的方法。

提示:

  • 增值C2如果有跟踪和检测的组合,应该计算分配,但没有。如果成本计算时间太长,则降低成本。

  • 增值C1如果存在应分配给轨迹但未分配的检测。如果存在不应分配给轨迹的检测(太远),则减小该值。

跟踪器可维护的最大轨迹数,指定为正整数。

数据类型:双重的

可连接到跟踪器的最大传感器数,指定为正整数。当你将检测作为多目标跟踪器的输入时,MaxNumSensors必须大于或等于最大值吗SensorIndex的价值探测单元阵列的objectDetection用于更新多目标跟踪器的对象。这个属性决定有多少组ObjectAttributes每个输出轨道可以拥有的字段。

数据类型:双重的

跟踪器可以作为输入的最大检测数,指定为正整数。

数据类型:|双重的

处理无序测量(OOSM),指定为“终止”“疏忽”.每个检测都有一个相关的时间戳,td,追踪器有自己的时间戳,tt,它会在每次调用中更新。跟踪器认为测量是一个OOSM如果td<tt

当属性指定为

  • “终止”—当跟踪器遇到任何乱序测量时,跟踪器停止运行。

  • “疏忽”-跟踪器忽略任何无序测量,并继续运行。

可调:

轨迹确认的阈值,指定为非递减正整数的二元向量,(mn)哪里是小于还是等于N.如果轨道至少接收到,则确认轨道最后的检测N更新。

  • 当设置,考虑传感器的目标检测概率。检测概率取决于遮挡或杂波等因素。您可以减少当轨道未确认或增加时当太多错误检测被分配到轨迹时。

  • 当设置N,在它做出确认决定之前,考虑您希望跟踪器更新的次数。例如,如果跟踪器每0.05秒更新一次,而您允许0.5秒做出确认决定,则设置N = 10

例子:[3 - 5]

数据类型:双重的

轨迹删除的阈值,指定为正的非递减整数的二元向量[P Q]哪里P是小于还是等于.如果一个确认的轨道没有分配给任何检测P最后的时间跟踪器更新,然后删除跟踪。

  • 减少(或增加P)是否应提前删除曲目。

  • 增加(或减少P),是否需要保留较长时间才能删除。

例子:[3 - 5]

数据类型:|双重的

使成本矩阵作为输入多目标跟踪器系统对象或更新追踪函数,指定为真正的

数据类型:逻辑

在每个对象更新时启用可检测轨道id的输入,指定为真正的.将此属性设置为真正的如果您想提供可检测的轨道id列表。这个列表告诉跟踪器所有轨道的传感器预计检测,并可选地,每个轨道的检测概率。

数据类型:逻辑

轨道状态参考帧的参数,指定为结构或结构数组。追踪者通过它StateParameters属性值的StateParameters属性生成的轨迹。您可以使用这些参数来定义报告轨道的参考框架或生成的轨道的其他理想属性。

例如,可以使用以下结构定义原点位置位于的矩形参照系(10 10 0)米,它的起始速度是[2 -2 0]米每秒相对于场景。

字段名 价值
框架 “矩形”
位置 (10 10 0)
速度 (2 2 0)

可调:

数据类型:结构体

此属性是只读的。

多对象跟踪器维护的轨迹数,指定为非负整数。

数据类型:双重的

此属性是只读的。

确认轨迹的数量,指定为非负整数。的IsConfirmed输出轨道结构的字段表明哪些轨道是确定的。

数据类型:双重的

使用

要更新轨迹,使用参数调用已创建的多对象跟踪器,就好像它是一个函数(这里描述)。或者,通过使用更新追踪函数,指定多对象跟踪器作为输入参数。

描述

confirmedTracks=跟踪器(探测时间在多对象跟踪器中创建、更新和删除轨迹,并返回有关已确认轨迹的详细信息。更新基于指定的轨迹列表探测,所有轨道均按规定更新时间.返回的每个元素confirmedTracks对应于一个单轨。

例子

confirmedTrackstentativeTracks) =跟踪器(探测时间还返回tentativeTracks包含关于暂定轨道的详细信息。

例子

confirmedTrackstentativeTracksallTracks) =跟踪器(探测时间还返回allTracks包含所有已确认和试探性轨道的细节。跟踪程序按照跟踪程序内部维护它们的顺序返回。您可以使用此输出来帮助您计算成本矩阵,这是一个可选的输入参数。

___) =跟踪器(探测时间costMatrix指定成本矩阵,返回前面语法的任何输出。

要指定代价矩阵,请设置HasCostMatrixInput财产的多目标跟踪器系统对象真正的

___) =跟踪器(___detectableTrackIDs还指定由以下公式给出的预期可检测轨迹的列表:detectableTrackIDs.此参数可用于前面的任何输入语法。

要启用此语法,请设置HasDetectableTrackIDsInput财产真正的

输入参数

全部展开

检测列表,指定为单元格数组objectDetection对象时间每个的属性值objectDetection对象必须小于或等于当前更新时间,时间,且大于之前用于更新多目标跟踪器的时间值。

更新时间,指定为实标量。追踪器会将所有的轨迹更新到此时。单位是秒。

时间必须大于或等于最大的时间属性值objectDetection输入中的对象探测列表。时间必须随着多目标跟踪器的每次更新而增加。

数据类型:双重的

成本矩阵,指定为实值NT——- - - - - -ND矩阵,NT是现有轨道的数量,还是ND是当前检测的次数。代价矩阵的行对应于现有轨道。列对应于检测。的轨道列表中显示的轨道被排序allTracks多目标跟踪器上一个更新的输出参数。

在对多目标跟踪器的第一次更新中,或当跟踪器之前没有跟踪时,将代价矩阵的大小赋给[0,ND].必须计算成本,以便较低的成本表明跟踪器将检测分配给轨迹的可能性较高。为了防止某些检测被分配到某些轨道,使用

依赖关系

当更新轨道时,要使成本矩阵的规格得以实现,请设置HasCostMatrixInput跟踪器的属性真正的

数据类型:双重的

可检测的轨道id,指定为实值1的向量或2矩阵。可探测的轨迹是传感器希望探测到的轨迹。矩阵的第一列包含传感器报告为可检测的轨道id列表。可选的第二列包含轨道的检测概率。检测概率可以由传感器报告,或者,如果没有报告,从DetectionProbability财产。

没有包含标识符的轨迹detectableTrackIDs被视为不可检测。轨道删除逻辑不将未检测视为轨道删除目的的“未检测”。

依赖关系

要启用此输入参数,请设置detectableTrackIDs财产真正的

数据类型:|双重的

输出参数

全部展开

已确认的轨迹,以数组的形式返回objectTrack对象,并在代码生成中作为结构数组返回。在代码生成中,返回结构的字段名与属性名相同objectTrack

如果轨迹满足中指定的确认阈值,则确认轨迹ConfirmationThreshold财产。在这种情况下IsConfirmed对象或结构域的属性为真正的

数据类型:结构体|对象

试探性的轨迹,以数组的形式返回objectTrack对象,并在代码生成中作为结构数组返回。在代码生成中,返回结构的字段名与属性名相同objectTrack

属性中指定的确认阈值不满足的轨迹是暂定的ConfirmationThreshold财产。在这种情况下IsConfirmed对象或结构域的属性为

数据类型:结构体|对象

所有的轨道,作为数组返回objectTrack对象,并在代码生成中作为结构数组返回。在代码生成中,返回结构的字段名与属性名相同objectTrack.所有轨道由确认轨道和试运行轨道组成。

数据类型:结构体|对象

对象的功能

要使用对象函数,请指定System对象作为第一个输入参数。例如,释放名为system的对象的系统资源obj,使用下面的语法:

发行版(obj)

全部展开

更新追踪 用新的检测更新多目标跟踪器
初始化追踪 初始化新轨道
删除轨道 删除现有轨道
getTrackFilterProperties 从多目标跟踪器中获取跟踪的滤波特性
setTrackFilterProperties 设置多目标跟踪器跟踪的过滤属性
预测跟踪时间 预测跟踪状态
运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
克隆 创建重复的系统对象
isLocked 确定是否系统对象在使用
重置 使内部状态复位系统对象

例子

全部折叠

创建一个多目标跟踪器系统对象™使用默认的过滤器初始化函数为一个二维恒定速度模型。对于该运动模型,状态向量为[xvxy威利].

追踪= multiObjectTracker (“ConfirmationThreshold”[4 - 5],...“DeletionThreshold”,10);

通过指定objectDetection对象。若要将此检测与多对象跟踪器一起使用,请将检测包含在单元阵列中。

dettime = 1.0;侦破= {...objectDetection (dettime [10;1),...“传感器索引”1....“ObjectAttributes”, {“ExampleObject”1})...};

使用此检测更新多目标跟踪器更新追踪函数。更新多目标跟踪器的时间必须大于或等于检测到目标的时间。

updatetime = 1.25;[confirmedTracks, tentativeTracks allTracks] = updateTracks(记录、侦破、updatetime);

创建相同对象的另一个检测并更新多对象跟踪器,这一次通过调用跟踪器本身而不是使用更新追踪.跟踪器只维持一条跟踪。

dettime=1.5;数据={...对象检测(dettime,[10.1;-1.1],...“传感器索引”1....“ObjectAttributes”, {“ExampleObject”1})...};updatetime = 1.75;[confirmedTracks, tentativeTracks allTracks] =追踪(侦破,updatetime);

通过检查已确认轨道的数量来确定轨道是否已被验证。

numConfirmed =追踪。NumConfirmedTracks
numConfirmed = 0

检查被跟踪物体的位置和速度。由于航迹未被确认,从航迹中获取位置和速度tentativeTracks结构。

positionSelector = [1 0 0 0;0 0 1 0];velocitySelector = [0 1 0 0;0 0 0 1];位置= getTrackPositions (tentativeTracks positionSelector)
位置=1×210.1426 -1.1426
速度=GetTrack速度(TentiveTracks、velocitySelector)
速度=1×20.1852 - -0.1852

创建一个移动对象的检测序列。跟踪检测使用多目标跟踪器系统对象™. 观察曲目如何从暂定切换到确认,然后再切换到删除。

创建一个多对象跟踪器使用initcakf过滤器的初始化函数。跟踪器建模二维恒加速度运动。对于该运动模型,状态向量为[xvx斧头y威利].

追踪= multiObjectTracker (“FilterInitializationFcn”@initcakf,...“ConfirmationThreshold”(3 - 4),“DeletionThreshold”6 [6]);

使用。创建一个移动目标的探测序列objectDetection.使用这些检测多目标跟踪器,将检测结果括在单元格数组中。

dt = 0.1;pos = [10;1);韦尔= [10;5);deno = 1:2 time = (deno -1)*dt;侦破= {...objectDetection(时间、pos、...“传感器索引”1....“ObjectAttributes”, {“ExampleObject”1})...};[confirmedTracks, tentativeTracks allTracks] =追踪(依据、时间);Pos = Pos + vel*dt;量= pos;结束

通过检查已确认轨道的数量来确认轨道尚未被确认。

numConfirmed =追踪。NumConfirmedTracks
numConfirmed = 0

由于航迹未被确认,从航迹中获取位置和速度tentativeTracks结构。

positionSelector = [1 0 0 0 0;0 0 0 1 0 0];velocitySelector = [0 1 0 0 0;0 0 0 1 0];位置= getTrackPositions (tentativeTracks positionSelector)
位置=1×210.6669 -0.6665
速度=GetTrack速度(TentiveTracks、velocitySelector)
速度=1×23.3473 - 1.6737

添加更多的检测来确认轨道。

deno = 3:5 time = (deno -1)*dt;侦破= {...objectDetection(时间、pos、...“传感器索引”1....“ObjectAttributes”, {“ExampleObject”1})...};[confirmedTracks, tentativeTracks allTracks] =追踪(依据、时间);Pos = Pos + vel*dt;量= pos;结束

确认轨迹已被确认,并显示该轨迹的位置和速度矢量。

numConfirmed =追踪。NumConfirmedTracks
numConfirmed = 1
位置=getTrackPositions(确认的跟踪、位置选择器)
位置=1×213.8417 - 0.9208
速度= getTrackVelocities (confirmedTracks velocitySelector)
速度=1×29.4670 - 4.7335

让跟踪器运行,但不要添加新的检测。删除原有轨道。

detno=6:20时间=(detno-1)*dt;det={};[confirmedTracks,tentivetracks,allTracks]=跟踪器(det,time);pos=pos+vel*dt;meas=pos;结束

确认跟踪器没有试探性或确认的轨迹。

isempty (allTracks)
ans =逻辑1

算法

当你将检测传递给一个多对象跟踪器时,System对象:

  • 尝试将输入检测分配到现有轨道,基于分配阈值多目标跟踪器的特性。

  • 从未分配的检测创建新的轨道。

  • 更新已经分配的轨道,并可能确认它们,基于ConfirmationThreshold跟踪器的属性。

  • 属性删除没有指定检测的轨道DeletionThreshold跟踪器的属性。

兼容性的考虑

全部展开

行为在R2020a中改变

扩展能力

介绍了R2017a