主要内容

用激光雷达追踪车辆:从点云到轨迹表

此示例向您展示了如何使用安装在自助式车辆顶部的LIDAR传感器的测量来跟踪车辆。LIDAR传感器将测量报告为点云。该示例说明了MATLAB®的工作流程,用于处理点云并跟踪对象。对于示例的S金宝appimulink®版本,请参阅在Simulink中使用激光雷达数据跟踪车辆金宝app(传感器融合与跟踪工具箱).本例中使用的激光雷达数据来自高速公路驾驶场景。在本例中,使用联合概率数据关联(JPDA)跟踪器和交互多模型(IMM)方法,使用记录的数据跟踪车辆。

三维包围盒探测器模型

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

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

x美元y美元z美元请参阅边界框的X-,Y和Z位置,${\θ}$指其偏航角和l美元w美元h美元分别指其长度、宽度和高度。的pcfitcuboid(LIDAR工具箱)函数使用l形拟合算法确定包围框的偏航角。

检测器由一个支持类实现金宝appHelperBoundingBoxDetector,它包含点云分割和集群功能。该类的对象接受apointcloud.输入并返回的列表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] = loadlidaranddimagedata (datasetFolder,initTime,finalTime); / /读取数据结束%设置随机种子以产生可重复的结果。S = RNG(2018);一个边界盒检测器模型。detectorModel = HelperBoundingBoxDetector (...“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]美元

有关它们的状态转换的信息,请参阅helperConstvelCuboidHelperconstturncuboid.本例中使用的函数。

helperCvmeasCuboidhelperCtmeasCuboid测量模型分别描述了传感器如何感知恒定速度和恒定转速状态,并返回边界盒测量值。由于状态包含关于目标大小的信息,测量模型包括由传感器感知到的中心点偏移和边界盒收缩的影响,这是由于自遮挡[1]等影响造成的。这种效应是通过收缩系数来模拟的,收缩系数与被跟踪车辆到传感器的距离成正比。

下图展示了在不同状态空间样本下运行的测量模型。注意当物体围绕ego车辆移动时,包围盒收缩和中心点偏移的模型效果。

设置跟踪器和可视化

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

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

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

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

设置HasDetectableTrackIDsInput跟踪器的属性为真正的,它允许您指定与状态相关的检测概率。跟踪的检测概率由helperCalcDetectability函数,在此示例结束时列出。

assignmentGate = [75 1000];%赋值阈值;confThreshold = [7 10];历史逻辑的确认阈值delThreshold = [8 10];%历史逻辑删除阈值Kc = 1 e-9;单位体积误报率%% IMM过滤器初始化功能filterInitFcn = @helperInitIMMFilter;带有IMM滤波器的联合概率数据关联跟踪器追踪= trackerJPDA (“FilterInitializationFcn”,filterinitfcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”,施法,...'deletionthreshold'delThreshold,...'hasdetableTrackidsInpul',真的,...“InitializationThreshold”,0,...“HitMissThreshold”, 0.1);

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

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

  2. EGO车辆显示器 - 此显示屏显示了场景的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 =结构([]);%初始变量比较MATLAB和MEX仿真。numTracks = 0(元素个数(lidarData), 2);%遍历数据i = 1:元素个数(lidarData)%更新时间time = time + dT;获得当前激光雷达扫描currentlidar = lidardata {i};激光雷达探测到的生成器。(检测、obstacleIndices groundIndices croppedIndices] = detectorModel (currentLidar、时间);%计算每个道的可检测性。detectableTracksInput = helperCalcDetectability(allTracks,[1 3 6]);%通过检测跟踪。[确认有限公司,追求等待,AllTracks,Info] =跟踪器(检测,时间,检测到);numtracks(i,1)= numel(确认托架);%从IMM滤波器的每个航迹得到模型概率Tracker的%getTrackFilterProperties函数。ModelProbs =零(2,numel(确认托架));c = getTrackFilterProperties(tracker,confirmedTracks(k). log . log . log . log . log . log . log . log . log . log . log。TrackID,“ModelProbabilities”);modelProbs c1 (:, k) = {1};结束%更新显示如果isvalid (displayObject.PointCloudProcessingDisplay.ObstaclePlotter)获取当前图像扫描的参考图像currentimage = imagedata {i};%更新显示对象displayObject(检测、confirmedTracks currentLidar obstacleIndices,...groundIndices、croppedIndices currentImage modelProbs);结束%在时间= 18时捕捉一个数字如果abs(time-18)
结束结束如果有要求,写电影如果~ isempty (displayObject.MovieName) writeMovie (displayObject);结束%写入新的gif如果请求。如果displayObject.Recordgif.%第二输入是启动帧,第三个输入是结束帧和最后输入%是指定要记录的面板的字符向量。WriteAnimatedGIF(DisplayObject,10,170,'trackmainten'“自我”);writeAnimatedGIF (displayObject, 310330,jpda的“处理”);writeAnimatedGIF (displayObject, 120140,“imm”“细节”);结束

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

生成C代码

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

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

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

用MEX代码重新运行模拟

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

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

比较MATLAB与MEX执行的结果

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

注意,在MATLAB和MEX代码执行中,确认的轨迹的数量是相同的。这确保激光雷达预处理和跟踪算法返回生成的C代码与MATLAB代码相同的结果。

结果

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

跟踪维护

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

捕捉动作

动画显示,使用IMM滤波器有助于跟踪器在机动车辆上保持轨迹。注意,T4跟踪的车辆在ego车辆后面改变了车道。跟踪器能够在这个机动事件期间在车辆上保持一个轨迹。在显示中还可以注意到,在变道机动过程中,其遵循恒定转弯模型(以ct表示)的概率增加。

联合概率数据关联

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

总结

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

金宝app支持文件

helperLidarModel

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

函数量= helperLidarModel (pos、昏暗的偏航)%此功能返回给定的预期边界框测量物体的位置、尺寸和偏航角。版权所有2019 The MathWorks, Inc.得到x,y和z。x = pos (1:);: y = pos (2);Z = pos(3,:) - 2;%激光器安装在高度= 2米处。%得到球面测量。(阿兹,~,r) = cart2sph (x, y, z);%收缩速度s = 3/50;% 3米径向长度在50米。深圳= 2/50;% 2米高度在50米。%得到长度,宽度和高度。l = dim(1,:);w =昏暗(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,深圳* r);Hs = H - Hshrink;%类似的偏移是x和y方向。shift = Lshrink.*cosd(偏航)+ Wshrink.*sind(偏航);= Lshrink.*sind(偏航)+ Wshrink.*cosd(偏航);shiftZ = Hshrink;%建模盒原点偏移的影响x = x  - 符号(x)。* shiftx / 2;y = y  -  sign(y)。* shifty / 2;z = z + shiftz / 2 + 2;%测量格式量= [x, y, z,偏航;Ls; Ws; Hs);结束

helperInverseLidarModel

此功能定义了使用LIDAR边界框测量启动跟踪滤波器的逆LIDAR模型。函数中使用helperInitIMMFilter从边界框测量获得状态估计的功能。

函数[POS,Poscov,Dim,Dimcov,Xaw,Yawcov] = Helperinverselidarmodel(Meas,Meascov)这个函数使用边界返回位置,尺寸,偏航%箱测量。版权所有2019 The MathWorks, Inc.%收缩率。s = 3/50;深圳= 2/50;% x,y和z的测量x =量(1);: y =量(2);z =量(3);(阿兹,~,r) = cart2sph (x, y, z);%移动x和y位置。Lshrink = abs (s * r。* (cos (az)));Wshrink = abs (s * r。* (sin (az)));Hshrink =深圳* r;shiftX = Lshrink;机智的= 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,:);对于低的标准乘用车初始化%尺寸% uncertainity。昏暗的= (4.7;1.8;1.4);眼睛dimCov = 0.01 * (3);结束

HelperBoundingBoxDetector

这是支持类金宝appHelperBoundingBoxDetector接受点云输入并返回列表objectDetection

classdefHelperBoundingBoxDetector < matlab。系统% HelperBoundingBoxDetector分割点云的helper类%进入边界框检测。对对象的step调用做以下事情:%1.删除极限之外的点云。% 2。从幸存的点云,分割出地面% 3。从障碍点云,形成簇并放置边界%框。%裁剪属性属性%xlimits为场景的xlimitsXLimits = [-70 70];场景的YLimitsYLimits = [-6 6];%zlimits zlimits fot现场zlimits = [-2 10];结束%地面分割属性属性% GroundMaxDistance点到地平面的最大距离GroundMaxDistance = 0.3;% ground dreference vector地平面的参考向量grounddreferencevector = [0 0 1];点到参考向量的最大角度距离GroundMaxAngularDistance = 5;结束包围框分割属性属性% SegmentationMinDistance分割的距离阈值SegmentationMinDistance = 1.6;% MinDetectionsPerCluster每个集群的最小检测数MinDetectionsPerCluster = 2;%maxzdistanceCluster最大z坐标群组MaxZDistanceCluster = 3;% MinZDistanceCluster集群的最小z坐标MinZDistanceCluster = 3;结束自我车辆半径移除自我车辆点云。属性自我车辆半径自我车辆的半径EgoVehicleRadius = 3;结束属性% measumentnoise包围盒检测的测量噪声MeasurementNoise = Blkdiag(眼睛(3),10,眼睛(3));结束属性(Nontunable) MeasurementParameters = struct.empty(0,1);结束方法函数obj = HelperBoundingBoxDetector(varargin) setProperties(obj,nargin,varargin{:})结束结束方法(访问=保护)函数[bboxDets, obstacleIndices groundIndices croppedIndices] = stepImpl (obj, currentPointCloud,时间)切点云[PCSurvived,SurvivedIndices,CroppedIndices] = CrocPointCloud(CrentPointCloud,Obj.xlimits,Obj.ylimits,Obj.zlimits,Obj.egovehicleradius);%拆除接地面[pcobstacles,explationInces,groundindices] = devicegredplane(pcsurvived,obj.groundmaxdistance,obj.groundreferencevector,obj.groundmaxangulardistance,survivedIndices);%形成集群并得到包围盒detbboxes = getBoundboxes(pcobstacles,obj.seationmintmistance,obj.mindetectionspercluster,obj.maxzdistanceCluster,obj.minzdistanceCluster);%组装检测如果isempty(obj.MeasurementParameters) measParams = {};其他的measParams = obj.MeasurementParameters;结束bboxDets = assembleDetections (detBBoxes, obj.MeasurementNoise、measParams、时间);结束结束结束函数检测=组装波比特(Bboxes,MoreNoise,Measparams,时间)%此方法以objectDetection格式组装检测。numBoxes =大小(bboxes, 2);检测=细胞(numBoxes, 1);i = 1:numboxes检测{i} = ObjectDetection(时间,演员(Bboxes(:,i),“双”),...“MeasurementNoise”、双(measNoise),“ObjectAttributes”,struct,...“MeasurementParameters”, measParams);结束结束函数bboxes = getBoundingBoxes (ptCloud minDistance、minDetsPerCluster maxZDistance, minZDistance)%这个方法适合每个集群的包围盒与一些基本%的规则。% Cluster必须至少有minDetsPerCluster点。%它的平均值z必须在maxZDistance和minZDistance之间。使用min和max计算%长度,宽度和高度% 尺寸。[标签,numClusters] = pcsegdist (ptCloud minDistance);pointData = ptCloud.Location;numClusters bboxes =南(7日,“喜欢”,Pointdata);IsValidCluster = false(1,Numflusters);i = 1:numClusters thisPointData = pointData(标签== i,:);meanPoint =意味着(thisPointData, 1);如果> minDetsPerCluster &&...meanPoint(3) < maxZDistance && meanPoint(3) > minZDistance cuboid = pcfitcuboid(pointCloud(thisPointData));偏航= cuboid.Orientation (3);L = cuboid.Dimensions (1);W = cuboid.Dimensions (2);H = cuboid.Dimensions (3);如果ABS(偏航)> 45可能=偏航+ [-90; 90];[〜,tochoose] = min(abs(possibles));yaw =可能(Tochoose);temp = l;l = w;w = temp;结束bboxes (:, i) =(长方体。中心偏航;isValidCluster(i) = L < 20 & W < 20;结束结束bboxes = bboxes(:,iSvalidCluster);结束函数[ptCloudOut, obstacleIndices groundIndices] = removeGroundPlane (ptCloudIn、maxGroundDist referenceVector, maxAngularDist, currentIndices)%这个方法从点云中移除地平面%pcfitplane。[~, groundIndices,离群值]= pcfitplane (ptCloudIn、maxGroundDist referenceVector, maxAngularDist);ptCloudOut =选择(ptCloudIn、异常值);obstacleIndices = currentIndices(异常值);groundIndices = currentIndices (groundIndices);结束函数[ptCloudOut,指数,croppedIndices] = cropPointCloud (ptCloudIn、xLim yLim, zLim, egoVehicleRadius)%该方法选择限定范围内的点云,并删除%自我车辆点云使用findNeighborsInRadius位置= ptCloudIn.Location;位置=重塑(地点,[],3);insideX = locations(:,1) < xLim(2) & locations(:,1) > xLim(1);insideY =位置(:,2)< yLim(2)和地点(:,2)> yLim (1);insideZ = locations(: 3) < zLim(2) & locations(: 3) > zLim(1);内部= insideX & insideY & insideZ;%移除自我车辆nearIndices = findNeighborsInRadius(ptCloudIn,[0 0 0],egoVehicleRadius);nonEgoIndices = true (ptCloudIn.Count, 1);nonEgoIndices (nearIndices) = false;validIndices = inside & nonEgoIndices;指数=找到(validIndices);croppedIndices =找到(~ validIndices);ptCloudOut =选择(ptCloudIn、指标);结束

mexLidarTracker

该函数使用函数接口实现了点云预处理显示和跟踪算法的代码生成。

函数(检测、obstacleIndices groundIndices croppedIndices,...确认技术,ModelProbs] = MexLidartracker(PTCloudLocations,时间)持续的detectorModel跟踪器detectableTracksInput currentNumTracks如果isempty(detectorModel) || isempty(tracker) || isempty(detectableTracksInput) || isempty(currentNumTracks)%使用与MATLAB相同的起始种子在SIL中重现结果% 模拟。RNG(2018);一个边界盒检测器模型。detectorModel = HelperBoundingBoxDetector (...“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 = 1 e-9;单位体积误报率%filterInitFcn = @helperInitIMMFilter;追踪= trackerJPDA (“FilterInitializationFcn”,filterinitfcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”,施法,...'deletionthreshold'delThreshold,...'hasdetableTrackidsInpul',真的,...“InitializationThreshold”,0,...“MaxNumTracks”30岁的...“HitMissThreshold”, 0.1);detectableTracksInput = 0 (tracker.MaxNumTracks, 2);currentNumTracks = 0;结束ptCloud = pointCloud (ptCloudLocations);%探测器模型[检测,epthatleindices,-RoundInces,CroppedIndices] =检测器(PTCloud,时间);%的电话跟踪[confirmedTracks ~, allTracks] =追踪(检测、时间detectableTracksInput (1: currentNumTracks,:));%更新检测能力输入currentNumTracks =元素个数(allTracks);detectableTracksInput(1:currentNumTracks,:) = helperCalcDetectability(allTracks,[1 3 6]);得到模型概率ModelProbs =零(2,numel(确认托架));如果isLocked(跟踪)c = getTrackFilterProperties(tracker,confirmedTracks(k). log . log . log . log . log . log . log . log . log . log . log。TrackID,“ModelProbabilities”);聚合氯化铝c1 = {1};modelProbs (k) =聚合氯化铝(1);modelProbs (2 k) =聚合氯化铝(2);结束结束结束

helperCalcDetectability

该函数计算每个轨道的检测概率。该函数用于生成“detectabletracksid”输入trackerJPDA

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

loadLidarAndImageData

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

函数[lidarData,imageData] = loadlidaranddimagedata (datasetFolder,initTime,finalTime) initFrame = max(1,floor(initTime*10));lastFrame = min(350年,装天花板(finalTime * 10));负载(fullfile (datasetFolder“imageData_35seconds.mat”),“allImageData”);imageData = allImageData (initFrame: lastFrame);numFrames = lastFrame - initFrame + 1;lidarData =细胞(numFrames, 1);%每个文件包含70帧。initFileIndex = floor(initFrame/70) + 1;lastFileIndex =装天花板(lastFrame / 70);frameIndices = [1:70:numFrames numFrames + 1];counter = 1;i = initFileIndex:lastFileIndex startFrame = frameIndices(计数器);endFrame = frameIndices(counter + 1) - 1;负载(fullfile (datasetFolder, (“lidarData_”num2str(我)]),'currentlidardata');lidarData(startFrame:endFrame) = currentLidarData(1:(endFrame + 1 - startFrame));Counter = Counter + 1;结束结束

参考文献

艾莉亚·塞纳·阿卜杜勒·拉赫曼,艾莉亚。自动驾驶的三维激光雷达多目标跟踪:城市道路不确定性下的多目标检测与跟踪。(2017).

另请参阅

|(传感器融合与跟踪工具箱)|(传感器融合与跟踪工具箱)

相关的话题