文档

multiObjectTracker系统对象

使用GNN分配跟踪对象

描述

multiObjectTracker系统对象™创建和管理移动对象的轨迹。对象初始化、确认、预测、纠正和删除音轨。跟踪器的输入是由objectDetectionradarDetectionGenerator,visionDetectionGenerator对象。跟踪器接受来自多个传感器的检测。使用全局最近邻(GNN)准则将检测分配给轨道。一个检测只分配给一个音轨,当不可能分配时,跟踪器创建一个新的音轨。

新曲目通常以“试探性”状态开始。如果足够多的检测分配到轨道,它的状态转移到“确认”。当一个轨迹被确认,你就有信心它代表一个真实的物体。如果在可指定的更新次数内没有将检测添加到曲目中,则可以删除曲目。该跟踪器还使用卡尔曼滤波器对每个航迹的状态向量和状态向量协方差矩阵进行最优估计。

您可以将多对象跟踪器与drivingScenario对象来实现完整的驾驶场景模型。

创建并运行多对象跟踪器:

  1. 方法定义和设置多对象跟踪器建设过程。您可以在构造过程中设置System对象属性,也可以保留它们的默认值。

  2. 调用multiObjectTracker.step方法的属性来更新履带multiObjectTracker系统对象。类调用之前或之后都可以更改可调属性一步方法。的一步方法与updateTracks方法。

请注意

而不是使用一步方法来执行System对象定义的操作,您可以调用带有参数的对象,就像调用函数一样。例如,y =步骤(obj, x)而且y = obj (x)执行相同操作。

建设

跟踪器= multiObjectTracker (名称,值创建具有指定为一个或多个属性的多对象跟踪器名称,值对参数。任何未指定的属性都有默认值。

属性

全部展开

卡尔曼滤波器初始化函数,指定为函数句柄。该函数的输入是由创建的检测报告objectDetection.输出必须是属于其中一个卡尔曼过滤器类的对象:trackingKFtrackingEKF,或trackingUKF

工具箱提供了几个初始化函数。有关初始化函数的示例,请参见initcvekf

例子:@initcvekf

数据类型:function_handle

检测分配阈值,指定为正标量。要将检测分配给一个轨迹,检测到轨迹的归一化距离必须小于分配阈值。如果一些检测仍然没有分配到它们应该分配到的轨道上,那么增加阈值。如果一些检测被分配给不正确的轨道,降低阈值。

例子:34

数据类型:

轨道创建的确认参数,指定为正整数的双元素向量,(M, N).当至少在第一次探测期间,检测被分配到轨道上N履带初始化后更新。必须小于或等于N

作为设置的指导N,考虑在必须做出确认决定之前您希望跟踪器更新的次数。例如,如果跟踪器更新每0。秒,你允许.5做出确认决定的秒数,设定N = 10.设置,考虑到传感器探测到物体的概率。被发现的概率取决于遮挡或杂波等因素。的值可以减少当航迹无法确认或增加时当太多的错误检测形成轨迹时。

例子:(3、5)

数据类型:

用于轨迹删除的滑行阈值,指定为正整数。一个跟踪沿海地区当一个或多个音轨之后没有被分配检测时预测步骤。如果滑行步数超过此阈值,则删除该轨迹。

例子:19

数据类型:

最大音轨数,指定为正整数。这个数字是跟踪器可以维护的最大跟踪数。

数据类型:

传感器的最大数量,指定为正整数。这个值应该大于或等于最大值SensorIndex控件的检测输入中使用的值updateTracks方法。这个属性决定了有多少个ObjectAttributes每个轨道都可以有。

数据类型:

的代价矩阵输入updateTracks一步方法,指定为真正的

数据类型:逻辑

此属性是只读的。

由跟踪器维护的跟踪数,指定为非负整数。

数据类型:

此属性是只读的。

已确认的轨道数,指定为非负整数。的IsConfirmed场的跟踪Struct表示已确认某个跟踪(参见输出参数).

数据类型:

方法

getTrackFilterProperties 获取跟踪过滤器属性
重置 重置multiObjectTracker对象到初始状态
setTrackFilterProperties 设置跟踪过滤器属性值
一步 用新的检测更新跟踪器
updateTracks 用新的检测更新跟踪器
通用于所有系统对象
释放

允许系统对象属性值更改

例子

全部展开

创建一个multiObjectTracker对象,使用默认的滤波器初始化函数用于二维恒定速度模型。对于这个运动模型,状态向量为[x, vx; y; v].因为只有一次检测,所以只创建了一条轨迹。

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

创建一个单一检测的轨迹。

dettime = 1;侦破= objectDetection (dettime (10; 1),“SensorIndex”, 1...“ObjectAttributes”, {“ExampleObject”1});updatetime = 1.25;[confirmedTracks, tentativeTracks allTracks] = updateTracks(追踪,{侦破},updatetime);

添加第二次探测并检查目标位置和速度。

dettime = 1.5;侦破= objectDetection (dettime [10.1, -1.1],“SensorIndex”, 1...“ObjectAttributes”, {“ExampleObject”1});updatetime = 1.75;[confirmedTracks, tentativeTracks allTracks] = updateTracks(追踪,{侦破},updatetime);

因为这条轨迹还没有确认,所以从tentativeTracks结构。

positionSelector = [1 0 0 0;0 0 1 0];velocitySelector = [0 1 0 0;0 0 0 1];position = getTrackPositions(tentativeTracks,positionSelector) velocity = gettrackvelocity (tentativeTracks,velocitySelector)
位置= 10.1426 -1.1426速度= 0.1852 -0.1852

构造一个multiObjectTracker对象使用筛选器初始化函数,initcakf.跟踪器模拟二维恒加速度运动。对于这个运动模型,状态向量为[x, vx;斧子;y v,唉).创建一个对移动对象的探测序列,并显示轨迹如何从暂定切换到确认,然后切换到删除。

追踪= multiObjectTracker (“FilterInitializationFcn”@initcakf,...“ConfirmationParameters”(3 - 4),“NumCoastingUpdates”6);

创建对移动目标的探测序列objectDetection.检测器的输出是objectDetection对象,并可与multiObjectTracker只有当您将检测包含在单元格数组中时。

dt = 0.1;pos = (10; 1);韦尔= (10;5);Detno = 1:2时间= (Detno -1)*dt;依据= objectDetection(时间、pos、“SensorIndex”, 1...“ObjectAttributes”, {“ExampleObject”1});[confirmedTracks, tentativeTracks allTracks] = updateTracks(跟踪、{侦破}、时间);Pos = Pos + vel*dt;量= pos;结束

应该没有确认过的痕迹。

disp (tracker.NumConfirmedTracks)
0

因为这条轨迹还没有确认,所以从tentativeTracks结构。

positionSelector = [1 0 0 0 0 0 0;0 0 0 1 0 0];velocitySelector = [0 1 0 0 0 0 0;0 0 0 0 1 0];position = getTrackPositions(tentativeTracks, positionSelector) velocity = gettrackvelocity (tentativeTracks, velocitySelector)
位置= 10.6669 -0.6665速度= 3.3473 1.6737

增加更多的探测以确认轨迹。

Detno = 3:5时间= (Detno -1)*dt;依据= objectDetection(时间、pos、“SensorIndex”, 1...“ObjectAttributes”, {“ExampleObject”1});[confirmedTracks, tentativeTracks allTracks] = updateTracks(跟踪、{侦破}、时间);Pos = Pos + vel*dt;量= pos;结束

应该有一条确定的轨迹。

disp(tracker.NumConfirmedTracks) position = getTrackPositions(confirmedTracks,positionSelector) velocity = gettrackvelocity (confirmedTracks,velocitySelector)
1位置= 13.8417 0.9208速度= 9.4670 4.7335

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

Detno = 6:20 time = (Detno -1)*dt;侦破= {};[confirmedTracks, tentativeTracks allTracks] = updateTracks(跟踪、侦破、时间);Pos = Pos + vel*dt;量= pos;结束

应该没有确认过的痕迹。因为没有试探性轨迹,所以跟踪器中没有当前轨迹。

disp (tracker.NumConfirmedTracks)
0

使用安装在自我车辆上的前向汽车雷达生成探测。假设有三个目标:

  • 载体1在自我载体的正前方,以相同的速度移动。

  • 车辆2在左车道上比自我车辆快12公里每小时。

  • 车辆3在右车道上比自我车辆慢5公里每小时。

所有的位置,速度和测量都是相对于自我载体而言的。运行模拟10步。

dt = 0.1;Pos1 = [150 0 0];Pos2 = [160 10 0];Pos3 = [130 -10 0];Vel1 = [0 0 0];Vel2 = [12*1000/3600 00];Vel3 = [-5*1000/3600 00];car1 =结构(“ActorID”, 1“位置”pos1,“速度”, vel1);car2 =结构(“ActorID”2,“位置”pos2,“速度”, vel2);car3 =结构(“ActorID”3,“位置”pos3,“速度”, vel3);

创建一个汽车雷达传感器的位置与自我车辆的偏移。默认情况下,传感器位置在距车辆中心(3.4,0)米,距地面0.2米处。关闭距离率计算,使雷达传感器只测量位置。

雷达= radarDetectionGenerator (“DetectionCoordinates”传感器笛卡儿的...“MaxRange”, 200,“RangeResolution”10“AzimuthResolution”10...“FieldOfView”, 40 [15],“UpdateInterval”, dt,“HasRangeRate”、假);追踪= multiObjectTracker (“FilterInitializationFcn”@initcvkf,...“ConfirmationParameters”(3 - 4),“NumCoastingUpdates”6);

用雷达从非自我行为者那里生成探测。输出检测形成单元格数组,可以直接传入multiObjectTracker

simTime = 0;nsteps = 10;k = 1: nsteps
dets =雷达([car1 car2 car3],simTime);[confirmedTracks, tentativeTracks allTracks] = updateTracks(记录、侦破、simTime);

移动汽车一次步,更新追踪器。

simTime = simTime + dt;car1。位置= car1。位置+ dt * car1.Velocity;car2。位置= car2。位置+ dt * car2.Velocity;car3。位置= car3。位置+ dt * car3.Velocity;
结束

使用birdsEyePlot来创建检测的俯瞰视图。创建鸟瞰图视图。绘制传感器覆盖区域。提取x而且y目标位置的转换测量将单元格数组中的字段转换成MATLAB数组。然后,用鸟眼图方法显示检测结果。

BEplot = birdsEyePlot (“XLim”220年[0],“YLim”75年[-75]);caPlotter = coverageAreaPlotter (BEplot,“DisplayName的”“雷达覆盖区”);plotCoverageArea (caPlotter radar.SensorLocation radar.MaxRange,...雷达.偏航,雷达. fieldofview (1)) detPlotter = detectionPlotter(BEplot,“DisplayName的”雷达信号检测的);detPos = cellfun (@ (d) d.Measurement(1:2),精细,“UniformOutput”、假);detPos = cell2mat (detPos ') ';如果~ isempty (detPos) plotDetection (detPlotter detPos)结束

算法

全部展开

扩展功能

介绍了R2017a

这个话题有帮助吗?