主要内容

使用激光雷达跟踪车辆:从点云到跟踪列表

这个例子向您展示了如何使用安装在车辆顶部的激光雷达传感器的测量来跟踪车辆。激光雷达传感器以点云的形式报告测量结果。该实例说明了在MATLAB®中处理点云和跟踪对象的工作流程。有关该示例的金宝appSimulink®版本,请参阅在Simulink中使用激光雷达数据跟踪车辆金宝app本例中使用的激光雷达数据是从高速公路驾驶场景中记录的。在本例中,您使用联合概率数据关联(JPDA)跟踪器和交互多模型(IMM)方法跟踪记录的数据。

三维包围盒探测器模型

由于激光雷达传感器的高分辨率能力,传感器的每次扫描都包含大量的点,通常称为点云。必须对这些原始数据进行预处理,以提取感兴趣的对象,如汽车、骑自行车的人和行人。在本例中,您将使用基于距离的聚类算法的经典分割算法。有关将激光雷达数据分割为地面和障碍物等对象的详细信息,请参阅地面平面和障碍物检测使用激光雷达(自动驾驶工具箱)的例子。有关深度学习分割工作流,请参阅使用激光雷达检测、分类和跟踪车辆(激光雷达工具箱)的例子。在本例中,将属于障碍物的点云进一步划分为簇pcsegdist函数,每个聚类被转换为一个边界框检测,格式如下:

$[x\ y\ z\ {\theta}\ l\ w\ h]$

x美元y美元而且z美元参考边界框的x、y和z位置,${\θ}$为其偏航角和l美元w美元而且h美元分别参考它的长、宽和高。的pcfitcuboid(激光雷达工具箱)函数采用l型拟合算法确定包围框的偏航角。

检测器是由一个支持类实现的金宝appHelperBoundingBoxDetector,它包含点云分割和聚类功能。类的对象接受pointCloud的列表输入并返回objectDetection具有边界框测量值的对象。

该图显示了边界盒检测器模型中涉及的流程,以及用于实现每个流程的Lidar Toolbox™功能。它还显示了控制每个进程的支持类的属性。金宝app

激光雷达数据可在以下位置获得:https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/TrackVehiclesUsingLidarExampleData.zip

将数据文件下载到临时目录中,该目录的位置由MATLAB的tempdir函数。如果要将文件放在不同的文件夹中,请在后续说明中更改目录名称。

如果数据不可用,则加载数据。激光雷达数据以单元阵列的形式存储% pointCloud对象。如果~ (“lidarData”“var”) dataURL =“https://ssd.mathworks.com/金宝appsupportfiles/lidar/data/TrackVehiclesUsingLidarExampleData.zip”;datasetFolder = fullfile(tempdir,“LidarExampleDataset”);如果~存在(datasetFolder“dir”)解压缩(dataURL datasetFolder);结束指定模拟的初始和最终时间。initTime = 0;finalTime = 35;[lidarData, imageData] = loadLidarAndImageData(datasetFolder,initTime,finalTime);结束设置随机种子以产生可重复的结果。S = rng(2018);一个包围盒检测器模型。detectorModel = helpboundingboxdetector (...“XLimits”(-50 75),...% min-max“YLimits”, 5 [5],...% min-max“ZLimits”(2 - 5),...% min-max“SegmentationMinDistance”, 1.8,...%最小欧氏距离“MinDetectionsPerCluster”, 1...每个集群的最小点数%“MeasurementNoise”眼睛,blkdiag(0.25 *(3), 25岁,眼(3)),...检测报告中测量噪声的%“GroundMaxDistance”, 0.3);接地点到地平面的最大距离%

目标状态与传感器测量模型

跟踪对象的第一步是定义它的状态,以及定义状态转换和相应测量的模型。这两组方程统称为目标的状态空间模型。为了使用激光雷达对车辆的状态进行建模,本例使用了具有以下约定的长方体模型:

$x = [x_{kin}\ {\theta}\ l\ w\ h]$

美元间{亲属}$指控制运动中心运动学的状态部分,和\θ美元是偏航角。长方体的长度、宽度和高度被建模为常数,其估计值在滤波器的校正阶段随时间变化。

在本例中,您使用了两个状态空间模型:恒定速度(cv)长方体模型和恒定转弯速率(ct)长方体模型。这些模型的不同之处在于它们定义状态的运动学部分的方式,如下所述:

美元间{简历}= [x y \{\点{x}} \ \{\点{y}} \ z \{\点{z}} \{\θ}\ h l \ w \]美元

美元间{ct} = [x y \{\点{x}} \ \{\点{y}} \{\点{\θ}}\ z \{\点{z}} \{\θ}\ l \ w \ h]美元

有关其状态转换的信息,请参阅helperConstvelCuboid而且helperConstturnCuboid本例中使用的函数。

helperCvmeasCuboid而且helperCtmeasCuboid测量模型分别描述了传感器如何感知恒定速度和恒定转速状态,并返回边界盒测量值。由于状态包含关于目标大小的信息,测量模型包括传感器感知到的中心点偏移和包围盒收缩的影响,这是由于自遮挡[1]等影响。这种效应是由收缩因子模拟的,收缩因子与履带式车辆到传感器的距离成正比。

下图展示了在不同状态空间样本下运行的测量模型。当物体在自我载体周围移动时,注意边界框收缩和中心点偏移的建模效果。

设置跟踪器和可视化

下图显示了从pointCloud输入获取曲目列表的完整工作流。

现在,设置示例中使用的跟踪器和可视化。

联合概率数据关联追踪器(trackerJPDA)加上IMM滤波器(trackingIMM)用于跟踪本例中的对象。IMM滤波器使用恒定速度和恒定转弯速率模型,并使用支持函数初始化,金宝apphelperInitIMMFilter,包含在本示例中。IMM方法有助于轨道在运动模型之间切换,从而在机动或变道等事件中获得良好的估计精度。下面的动画展示了在IMM滤波器的预测阶段混合恒定速度和恒定转率模型的效果。

IMM过滤器更新每个模型的概率,当它被校正从对象的检测。下面的动画显示了车辆在变道事件中的估计轨迹以及每个模型的相应估计概率。

设置HasDetectableTrackIDsInput属性的跟踪器为真正的,它使您能够指定与状态相关的检测概率。计算航迹的探测概率helperCalcDetectability函数,在本例的末尾列出。

assignmentGate = [75 1000];%分配阈值;confThreshold = [7 10];历史逻辑的确认阈值delThreshold = [8 10];%历史逻辑删除阈值Kc = 1e-9;单位卷误报率%IMM过滤器初始化函数filterInitFcn = @ helperinitmfilter;带有IMM滤波器的联合概率数据关联跟踪器追踪器=追踪器“FilterInitializationFcn”filterInitFcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”confThreshold,...“DeletionThreshold”delThreshold,...“HasDetectableTrackIDsInput”,真的,...“InitializationThreshold”0,...“HitMissThreshold”, 0.1);

可视化分为以下主要类别:

  1. 激光雷达预处理和跟踪-此显示显示原始点云,分割的地面和障碍物。它还显示了探测器模型的结果检测和跟踪器生成的车辆轨迹。

  2. 自我车辆显示-这个显示显示了场景的2-D鸟瞰图。它显示了障碍物点云,包围盒检测,以及跟踪器生成的轨迹。作为参考,它还显示了从安装在自我车辆上的摄像头记录的图像及其视野。

  3. 跟踪细节-这个显示显示了自我车辆周围的场景。它还显示了更精细的跟踪细节,如每个轨道估计位置的误差协方差及其运动模型概率,用cv和ct表示。

%创建显示displayObject = HelperLidarExampleDisplay(imageData{1},...“PositionIndex”,[1 3 6],...“VelocityIndex”,[2 4 7],...“DimensionIndex”,[9 10 11],...“YawIndex”8...“MovieName”''...指定电影名来录制电影。“RecordGIF”、假);指定true记录新的gif

循环数据

循环通过记录的激光雷达数据,使用检测器模型从当前点云生成检测,然后使用跟踪器处理检测。

时间= 0;%开始时间dT = 0.1;%时间步长启动所有轨道。allTracks = struct([]);初始化比较MATLAB和MEX仿真的变量。numTracks = 0(数字(lidarData),2);遍历数据i = 1:数字(lidarData)%更新时间时间=时间+ dT;获取当前激光雷达扫描currentLidar = lidarData{i};%激光雷达扫描的发电机检测。[detectorModel(currentLidar,time); [detectorModel(currentLidar,time);计算每条航迹的可探测性。detectableTracksInput = helperCalcDetectability(allTracks,[1 3 6]);%将检测传递给跟踪。[confirmedTracks,tentativeTracks,allTracks,info] = tracker(检测,时间,detectableTracksInput);numTracks(i,1) =数字(confirmedTracks);从每条航迹的IMM滤波器中获取模型概率跟踪器的getTrackFilterProperties函数。modelProbs =零(2,数字(confirmedTracks));k = 1:数字(confirmedTracks) c1 = getTrackFilterProperties(跟踪器,confirmedTracks(k)。TrackID,“ModelProbabilities”);modelProbs(:,k) = c1{1};结束%更新显示如果isvalid (displayObject.PointCloudProcessingDisplay.ObstaclePlotter)获取当前图像扫描为参考图像currentImage = imageData{i};更新显示对象displayObject(检测、confirmedTracks currentLidar obstacleIndices,...groundIndices、croppedIndices currentImage modelProbs);结束在时间= 18时捕捉一个数字如果abs(time - 18) < dT/2 snapnow(displayObject);结束结束如果需要,写电影如果~ isempty (displayObject.MovieName) writeMovie (displayObject);结束如果需要,编写新的动图。如果displayObject。RecordGIF第二次输入是开始帧,第三次输入是结束帧和最后一次输入%是一个字符向量,指定要记录的面板。writeAnimatedGIF (displayObject, 10170,“trackMaintenance”“自我”);writeAnimatedGIF (displayObject, 310330,jpda的“处理”);writeAnimatedGIF (displayObject, 120140,“imm”“细节”);结束

上图显示了time = 18秒时的三个显示。轨迹由绿色包围框表示。边界框检测用橙色的边界框表示。探测内部也有橙色点,代表分割为障碍物的点云。分割的地面用紫色表示。裁剪或丢弃的点云显示为蓝色。

生成C代码

您可以从MATLAB®代码中生成C代码,用于跟踪和使用MATLAB Coder™的预处理算法。C代码生成使您能够加速MATLAB代码的仿真。为了生成C代码,必须将算法重构为MATLAB函数,该函数可以编译为MEX文件或共享库。为此,将点云处理算法和跟踪算法重构为MATLAB函数,mexLidarTracker.有些变量定义为持续的在多次调用函数之间保存它们的状态(请参阅持续的).函数的输入和输出可以在本例末尾的“支持文件”部分提供的函数描述中观察到。金宝app

MATLAB Coder需要指定所有输入参数的属性。方法在命令行上通过示例定义输入属性,这是一种简单的方法arg游戏选择。有关更多信息,请参见在命令行通过示例定义输入属性(MATLAB编码器).类的对象不能是顶级输入参数处理类。因此,函数接受xy而且z点云的位置作为输入。从存储的点云中,可以使用位置的属性pointCloud对象。这些信息也可以作为激光雷达传感器的原始数据直接获得。

%输入列表inputExample = {lidarData{1}. inputExample = {lidarData{1}。位置,0};为生成MEX创建配置CFG = code .config(墨西哥人的);将cfg替换为以下内容,生成静态库并执行%软件在环模拟。这需要一个嵌入式编码器许可证。% CFG = code .config('lib');%静态库% cfg。VerificationMode = 'SIL';% Software-in-the-loop如果文件不存在,生成代码。如果~ (“mexLidarTracker_mex”“文件”) h = msgbox({“生成代码。这可能要花几分钟……”完成后此消息框将关闭},“Codegen消息”);% -config允许指定代码原配置% -o允许指定输出文件的名称codegen配置cfg- omexLidarTracker_mexmexLidarTrackerarg游戏inputExample关闭(h);其他的清晰的mexLidarTracker_mex结束
代码生成成功。

用MEX代码重新运行模拟

使用生成的MEX代码重新运行模拟,mexLidarTracker_mex.重置时间

时间= 0;i = 1:numel(lidarData) time = time + dT;currentLidar = lidarData{i};[detectionsMex, obstacleIndicesMex groundIndicesMex croppedIndicesMex,...confirmedTracksMex, modelProbsMex] = mexLidarTracker_mex(currentLidar.Location,time);记录数据,以便与MATLAB执行进行比较。numTracks(i,2) =数字(confirmedTracksMex);结束

比较MATLAB和MEX执行的结果

disp (isequal (numTracks (: 1), numTracks (:, 2)));
1

请注意,对于MATLAB和MEX代码执行,确认的轨道数量是相同的。这保证了激光雷达预处理和跟踪算法使用生成的C代码返回与MATLAB代码相同的结果。

结果

现在,分析场景中的不同事件,了解激光雷达测量模型、联合概率数据关联和交互多模型滤波器的组合如何帮助实现对车辆轨迹的良好估计。

跟踪维护

上面的动画显示了time = 3秒和time = 16秒之间的模拟。注意,像T10和T6这样的轨迹在时间跨度内保持它们的id和轨迹。但由于传感器长时间没有检测到被跟踪车辆,导致T9轨迹丢失。此外,请注意,通过将探测定位到车辆的可见部分,跟踪对象能够保持其形状和运动中心。例如,当轨道T7向前移动时,包围盒检测开始落在其可见的后部,轨道保持车辆的实际大小。这说明了测量函数中建模的偏移和收缩效应。

捕捉动作

该动画显示,使用IMM过滤器有助于跟踪器在机动车辆上保持轨道。注意被T4跟踪的车辆在自我车辆后面变道。跟踪器能够在机动过程中保持车辆的轨迹。还请注意,在显示中,它遵循恒定转弯模型的概率,由ct表示,在变道机动期间增加。

联合概率数据协会

此动画显示使用联合概率数据关联跟踪器有助于在不明确的情况下保持跟踪。在这里,T43和T73跟踪的车辆由于距离传感器较大,被检测到的概率较低。注意,跟踪器能够在事件期间保持跟踪,当其中一个车辆未被检测到时。在事件中,轨道首先合并,这是JPDA的一个已知现象,然后在再次检测到车辆时分离。

总结

这个例子展示了如何使用带有IMM过滤器的JPDA跟踪器来跟踪使用激光雷达传感器的对象。您了解了如何预处理原始点云以生成传统跟踪器的检测,这些跟踪器假设每次传感器扫描每个对象都有一个检测。您还学习了如何定义长方体模型来描述JPDA跟踪器跟踪的扩展对象的运动学、尺寸和测量。此外,您还根据该算法生成了C代码,并通过MATLAB仿真验证了其执行结果。

金宝app支持文件

helperLidarModel

这个函数定义了激光雷达模型来模拟边界盒的收缩测量和中心点偏移。该函数用于helperCvmeasCuboid而且helperCtmeasCuboid函数从状态中获取边界框测量值。

函数meas = helperLidarModel(pos,dim,偏航)此函数返回给定值的期望边界框测量值对象的位置,尺寸和偏航角。The MathWorks, Inc.版权所有%得到x,y和z。X = pos(1,:);Y = pos(2,:);Z = pos(3,:) - 2;%激光雷达安装高度= 2米。得到球形测量。[az,~,r] = cart2sph(x,y,z);收缩率S = 3/50;% 3米径向长度在50米。Sz = 2/50;50米高度% 2米。获取长度、宽度和高度。L = dim(1,:);W = dim(2,:);H = dim(3,:);Az = Az - deg2rad(偏航);%沿径向收缩长度。Lshrink = min(L,abs(s*r.*(cos(az))));Ls = L - Lshrink;%沿径向收缩宽度。Wshrink = min(W,abs(s*r.*(sin(az))));Ws = W - Wshrink;%收缩高度。Hshrink = min(H,sz*r);Hs = H - Hshrink;x和y方向的位移是相似的。shiftX = Lshrink.*cosd(偏航)+ Wshrink.*sind(偏航);shiftY = Lshrink.*sind(偏航)+ Wshrink.*cosd(偏航);shiftZ = Hshrink;建模盒子原点偏移的影响x = x - sign(x).*shiftX/2;y = y - sign(y).*shiftY/2;z = z + shiftZ/2 + 2;测量格式meas = [x;y;z;偏航;Ls;Ws;Hs];结束

helperInverseLidarModel

该函数定义了逆激光雷达模型,以使用激光雷达边界盒测量来初始化跟踪滤波器。该函数用于helperInitIMMFilter函数从边界框测量中获取状态估计。

函数[pos,posCov,dim,dimCov,yaw,yawCov] = helperInverseLidarModel(meas,measCov)这个函数返回使用边界的位置,维度,偏航包装盒尺寸。The MathWorks, Inc.版权所有%收缩率。S = 3/50;Sz = 2/50;% x,y和z的测量X = meas(1,:);Y = meas(2,:);Z = meas(3,:);[az,~,r] = cart2sph(x,y,z);移动x和y的位置。Lshrink = abs(s*r.*(cos(az)));Wshrink = abs(s*r.*(sin(az)));Hshrink = sz*r;shiftX = Lshrink;shiftY = Wshrink;shiftZ = Hshrink;x = x +符号(x).*shiftX/2;y = y +符号(y).*shiftY/2;z = z - shiftZ/2;Pos = [x;y;z]; posCov = measCov(1:3,1:3,:); yaw = meas(4,:); yawCov = measCov(4,4,:);%尺寸初始化为一个标准乘用车low% uncertainity。Dim = [4.7;1.8;1.4];dimCov = 0.01*眼(3);结束

HelperBoundingBoxDetector

这是辅助类金宝appHelperBoundingBoxDetector接收点云输入并返回的列表objectDetection

classdefHelperBoundingBoxDetector < matlab。系统用于分割点云的辅助类%进入包围框检测。对对象的步骤调用做以下事情:% 1。移除限制之外的点云。% 2。从幸存的点云,分割出地面% 3。从障碍物点云,形成簇并进行边界%框。裁剪特性%属性XLimits场景的XLimitsXLimits = [-70 70];场景的YLimitsYLimits = [-6 6];场景的ZLimitsZLimits = [-2 10];结束%地面分割属性属性% GroundMaxDistance点到接地面的最大距离GroundMaxDistance = 0.3;% GroundReferenceVector地平面参考向量grounddreferencevector = [0 0 1];% GroundMaxAngularDistance点到参考向量的最大角距离GroundMaxAngularDistance = 5;结束边框分割属性属性SegmentationMinDistance分割距离阈值SegmentationMinDistance = 1.6;% MinDetectionsPerCluster每个集群的最小检测数MinDetectionsPerCluster = 2;% MaxZDistanceCluster集群最大z坐标MaxZDistanceCluster = 3;% MinZDistanceCluster集群最小z坐标MinZDistanceCluster = -3;结束%自我战车半径移除自我战车点云。属性% EgoVehicleRadius自我车辆半径EgoVehicleRadius = 3;结束属性% measuentnoise包围盒检测的测量噪声测量噪声= blkdiag(眼睛(3),10,眼睛(3));结束属性(不可调)测量参数= struct.empty(0,1);结束方法函数obj = HelperBoundingBoxDetector(varargin) setProperties(obj,nargin,varargin{:})结束结束方法(访问=受保护)函数[bboxDets,obstacleIndices,groundIndices,croppedIndices] = stepImpl(obj,currentPointCloud,time)%作物点云[pc, vedindices,croppedIndices] = cropPointCloud(currentPointCloud,obj.XLimits,obj.YLimits,obj.ZLimits,obj.EgoVehicleRadius);移除地平面[pcObstacles,obstacleIndices,groundIndices] = removeGroundPlane(pc, obj.GroundMaxDistance,obj.GroundReferenceVector,obj.GroundMaxAngularDistance,survivedIndices);%形成集群并获得边界框detBBoxes = getBoundingBoxes(pcObstacles,obj.SegmentationMinDistance,obj.MinDetectionsPerCluster,obj.MaxZDistanceCluster,obj.MinZDistanceCluster);装配检测如果isempty(obj.MeasurementParameters) measParams = {};其他的measParams = obj.MeasurementParameters;结束bboxDets =组装检测(detBBoxes,obj.MeasurementNoise,measParams,time);结束结束结束函数detections = assembleDetections(bboxes,measNoise,measParams,time)此方法以objectDetection格式组装检测。numBoxes = size(bboxes,2);检测= cell(numBoxes,1);i = 1:numBoxes detection {i} = objectDetection(time,cast(bboxes(:,i),“双”),...“MeasurementNoise”、双(measNoise),“ObjectAttributes”、结构、...“MeasurementParameters”, measParams);结束结束函数bboxes = getBoundingBoxes(ptCloud,minDistance,minDetsPerCluster,maxZDistance,minZDistance)这个方法在每个集群上匹配一些基本的包围框%的规则。集群必须至少有minDetsPerCluster点。它的平均值z必须在maxZDistance和minZDistance之间。%的长度,宽度和高度计算使用最小和最大从每个%的维度。[labels,numClusters] = pcsegdist(ptCloud,minDistance);pointData = ptCloud.Location;bboxes = nan(7,numClusters,“喜欢”, pointData);isValidCluster = false(1,numClusters);i = 1:numClusters thisPointData = pointData(labels == i,:);meanPoint = mean(thisPointData,1);如果size(thisPointData,1) > minDetsPerCluster &&...meanPoint(3) < maxZDistance && meanPoint(3) > minZDistance cuboid = pcfitcuboid(pointCloud(thisPointData));偏航=长方体。方位(3);L =长方体。维数(1);W =长方体。维数(2);H =长方体。维数(3);如果Abs(偏航)> 45个可能性=偏航+ [-90;90];[~,toChoose] = min(abs(可能));偏航=可能性(toChoose);温度= L;L = w;W = temp;结束Bboxes (:,i) =[长方体。中偏航L W H]';isValidCluster(i) = L < 20 & W < 20;结束结束bboxes = bboxes(:,isValidCluster);结束函数[ptCloudOut,obstacleIndices,groundIndices] = removeGroundPlane(ptCloudIn,maxGroundDist,referenceVector,maxAngularDist,currentIndices)此方法从点云中删除地平面使用% pcfitplane。[~,groundIndices,outliers] = pcfitplane(ptCloudIn,maxGroundDist,referenceVector,maxAngularDist);ptCloudOut = select(ptCloudIn,outliers);obstacleIndices = currentIndices(异常值);groundIndices = currentIndices(groundIndices);结束函数[ptCloudOut,indices,croppedIndices] = cropPointCloud(ptCloudIn,xLim,yLim,zLim,egoVehicleRadius)此方法选择限制内的点云并删除车辆点云使用findNeighborsInRadiuslocations = ptCloudIn.Location;位置=重塑(位置,[],3);insideX = locations(:,1) < xLim(2) & locations(:,1) > xLim(1);insideY = locations(:,2) < yLim(2) & locations(:,2) > yLim(1);insideZ = locations(:,3) < zLim(2) & locations(:,3) > zLim(1);inside = insideX & insideY & insideZ;移除自我载具nearIndices = findNeighborsInRadius(ptCloudIn,[0 0 0],egoVehicleRadius);nonEgoIndices = true(ptCloudIn.Count,1);nonEgoIndices(nearIndices) = false;validIndices = inside & nonEgoIndices;indexes = find(validIndices);croppedIndices = find(~validIndices);ptCloudOut = select(ptclouddin, indexes);结束

mexLidarTracker

该功能实现了点云预处理显示和跟踪算法,使用功能接口进行代码生成。

函数(检测、obstacleIndices groundIndices croppedIndices,...confirmedTracks, modelProbs] = mexLidarTracker(ptCloudLocations,time)持续的detectorModel跟踪器detectableTracksInput currentNumTracks如果isempty(detectorModel) || isempty(tracker) || isempty(detectableTracksInput) || isempty(currentNumTracks)%使用与MATLAB相同的起始种子在SIL中重现结果%的模拟。rng (2018);一个包围盒检测器模型。detectorModel = helpboundingboxdetector (...“XLimits”(-50 75),...% min-max“YLimits”, 5 [5],...% min-max“ZLimits”(2 - 5),...% min-max“SegmentationMinDistance”, 1.8,...%最小欧氏距离“MinDetectionsPerCluster”, 1...每个集群的最小点数%“MeasurementNoise”眼睛,blkdiag(0.25 *(3), 25岁,眼(3)),...检测报告中测量噪声的%。“GroundMaxDistance”, 0.3);接地点到地平面的最大距离%assignmentGate = [75 1000];%分配阈值;confThreshold = [7 10];历史逻辑的确认阈值delThreshold = [8 10];%历史逻辑删除阈值Kc = 1e-9;单位卷误报率%filterInitFcn = @ helperinitmfilter;追踪器=追踪器“FilterInitializationFcn”filterInitFcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”confThreshold,...“DeletionThreshold”delThreshold,...“HasDetectableTrackIDsInput”,真的,...“InitializationThreshold”0,...“MaxNumTracks”30岁的...“HitMissThreshold”, 0.1);detectableTracksInput = 0 (trace . maxnumtracks,2);currentNumTracks = 0;结束ptCloud = pointCloud(ptCloudLocations);探测器型号[detectorModel(ptCloud,time);%呼叫跟踪器[confirmedTracks,~,allTracks] = tracker(detection,time,detectableTracksInput(1:currentNumTracks,:));更新可检测性输入currentNumTracks = numel(allTracks);detectableTracksInput(1:currentNumTracks,:) = helperCalcDetectability(allTracks,[1 3 6]);获取模型概率modelProbs =零(2,数字(confirmedTracks));如果isLocked(跟踪)k = 1:数字(confirmedTracks) c1 = getTrackFilterProperties(跟踪器,confirmedTracks(k)。TrackID,“ModelProbabilities”);Probs = c1{1};modelProbs(1,k) = probs(1);modelProbs(2,k) = probs(2);结束结束结束

helperCalcDetectability

该函数计算每个航迹的探测概率。函数的“DetectableTracksIDs”输入trackerJPDA

函数detectableTracksInput = helperCalcDetectability(tracks,posIndices)%这是一个辅助函数,用于计算的检测概率%的轨迹为激光雷达跟踪的例子。将来可能会被移除%释放。The MathWorks, Inc.版权所有边界盒检测器分割点云的概率较低%进入边界框的距离大于40米。这个函数%使用状态相关的检测概率对这种效应进行建模%每个跟踪器。在一个最大范围后,Pd被设置为一个较高的值%允许以更快的速度删除轨道。如果isempty(tracks) detectableTracksInput = 0 (0,2);返回结束rMax = 75;rAmbig = 40;statize = number (tracks(1).State);posSelector = 0 (3,stateSize);posSelector(1,posIndices(1)) = 1;posSelector(2,posIndices(2)) = 1;posSelector(3,posIndices(3)) = 1;pos = getTrackPositions(轨道,posSelector);如果coder.target (MATLAB的) trackid = [tracks.TrackID];其他的trackIDs = 0(1,数字(轨道),“uint32”);我= 1:数字(轨道)trackid (i) =轨道(i).TrackID;结束结束[~,~,r] = cart2sph(pos(:,1),pos(:,2),pos(:,3));probDetection = 0.9*ones(nummel (tracks),1);probDetection(r > rAmbig) = 0.4;probDetection(r > rMax) = 0.99;detectableTracksInput = [double(trackIDs(:)) probDetection(:)];结束

loadLidarAndImageData

缝合激光雷达和相机数据处理使用初始和最终时间指定。

函数[lidarData,imageData] = loadLidarAndImageData(datasetFolder,initTime,finalTime) initFrame = max(1,floor(initTime*10));lastFrame = min(350,ceil(finalTime*10));负载(fullfile (datasetFolder“imageData_35seconds.mat”),“allImageData”);imageData = allImageData(initFrame:lastFrame);numFrames = lastFrame - initFrame + 1;lidarData = cell(numFrames,1);每个文件包含70帧。initFileIndex = floor(initFrame/70) + 1;lastFileIndex = ceil(lastFrame/70);frameindexes = [1:70:numFrames numFrames + 1];计数器= 1;i = initFileIndex:lastFileIndex startFrame = frameindexes(计数器);endFrame = frameindexes (counter + 1) - 1;负载(fullfile (datasetFolder, (“lidarData_”num2str(我)]),“currentLidarData”);lidarData(startFrame:endFrame) = currentLidarData(1:(endFrame + 1 - startFrame));计数器=计数器+ 1;结束结束

参考文献

艾莉亚·塞纳·阿卜杜勒·拉赫曼,艾莉亚。自动驾驶的3D-LIDAR多目标跟踪:城市道路不确定性下的多目标检测与跟踪(2017)。