主要内容

利用激光雷达数据检测和跟踪车辆

这个例子向您展示了如何使用安装在自我车辆顶部的激光雷达传感器的测量来跟踪车辆。激光雷达传感器将测量结果报告为点云。该实例说明了在MATLAB®中处理点云和跟踪目标的工作流程。有关Simu万博1manbetxlink®版本的示例,请参阅在Simulink中使用激光雷达数据跟踪车辆万博1manbetx(传感器融合和跟踪工具箱).本例中使用的激光雷达数据来自高速公路驾驶场景。在本例中,您使用记录的数据使用联合概率数据关联(JPDA)跟踪器和交互多模型(IMM)方法跟踪车辆。

三维包围盒探测器模型

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

$[x\ y\ z\ l\ w\ h]$

x美元y美元而且z美元参考边界框和的x、y和z位置l美元w美元而且h美元分别参考它的长度、宽度和高度。

通过使用每个维度中点坐标的最小值和最大值,将边界框贴合到每个簇上。检测器是由一个支持类实现的万博1manbetxHelperBoundingBoxDetector,它包含了点云分割和聚类功能。该类的对象接受pointCloud的列表并返回objectDetection具有边界框度量值的对象。

该图显示了边界盒检测器模型中涉及的过程,以及用于实现每个过程的计算机视觉工具箱™功能。它还显示了控制每个进程的支持类的属性。万博1manbetx

激光雷达的资料可在以下连结下载:https://ssd.mathworks.com/万博1manbetxsupportfiles/lidar/data/TrackVehiclesUsingLidarExampleData.zip

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

%如果不可用,加载数据。激光雷达数据以单元阵列的形式存储% pointCloud对象。如果~ (“lidarData”“var”) dataURL =“https://ssd.mathworks.com/万博1manbetxsupportfiles/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.6,...%最小欧几里得距离“MinDetectionsPerCluster”, 1...每个集群的最小点数%“MeasurementNoise”,眼(6),...%检测报告中的测量噪声“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滤波器使用恒定速度和恒定转速模型,并使用支持函数初始化,万博1manbetxhelperInitIMMFilter,包括在这个示例中。IMM方法帮助轨迹在运动模型之间切换,从而在机动或变道等事件中获得良好的估计精度。下面的动画展示了在IMM滤波器的预测阶段混合恒定速度和恒定转速模型的效果。

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

设置HasDetectableTrackIDsInput属性为真正的,这使您能够指定与状态相关的检测概率。轨迹的探测概率由helperCalcDetectability函数,在本例的末尾列出。

assignmentGate = [50 100];%赋值阈值;confThreshold = [7 10];%历史逻辑的确认阈值delThreshold = [8 10];%历史逻辑的删除阈值Kc = 1 e-5;单位体积误报率%IMM过滤器初始化函数filterInitFcn = @helperInitIMMFilter;一个联合概率数据关联跟踪器与IMM滤波器追踪= trackerJPDA (“FilterInitializationFcn”filterInitFcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”confThreshold,...“DeletionThreshold”delThreshold,...“HasDetectableTrackIDsInput”,真的,...“InitializationThreshold”, 0);

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

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

  2. 自我车辆显示器——该显示器显示场景的二维鸟瞰视图。它显示了障碍点云、包围盒检测和跟踪器生成的轨迹。作为参考,它还显示了从安装在自我交通工具上的摄像头记录的图像和它的视野。

  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)%更新时间时间=时间+ dT;获取当前激光雷达扫描currentLidar = lidarData {};%来自激光雷达扫描的发电机检测。(检测、obstacleIndices groundIndices croppedIndices] = detectorModel (currentLidar、时间);计算每个轨道的可探测性。detectableTracksInput = helperCalcDetectability(allTracks,[1 3 6]);%通过要跟踪的检测。[confirmedTracks, tentativeTracks allTracks] =追踪(检测、时间detectableTracksInput);numTracks(1) =元素个数(confirmedTracks);从每个轨道的IMM过滤器中获取模型概率跟踪器的getTrackFilterProperties函数。modelProbs = 0(2,元素个数(confirmedTracks));k = 1: numl (confirmedTracks) c1 = getTrackFilterProperties(tracker,confirmedTracks(k)。TrackID,“ModelProbabilities”);modelProbs c1 (:, k) = {1};结束%更新显示如果isvalid (displayObject.PointCloudProcessingDisplay.ObstaclePlotter)获取当前图像扫描参考图像currentImage = imageData {};%更新显示对象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, 150180,“imm”“细节”);结束

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

生成C代码

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

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

%输入列表inputExample = {lidarData{1}。位置,0};为MEX生成创建配置cfg = coder.config (墨西哥人的);将cfg替换为以下命令生成静态库并执行% software-in-the-loop模拟。这需要嵌入式编码器许可证。% CFG = code .config('lib');%静态库% cfg。VerificationMode =“银”;% 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: numl (lidarData) time = time + dT;currentLidar = lidarData {};[detectionsMex, obstacleIndicesMex groundIndicesMex croppedIndicesMex,...confirmedTracksMex, modelProbsMex] = mexLidarTracker_mex(currentLidar.Location,time);记录数据,以与MATLAB执行比较。numTracks(我,2)=元素个数(confirmedTracksMex);结束

比较MATLAB和MEX Execution的结果

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

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

结果

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

跟踪维护

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

捕捉动作

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

联合概率数据关联

此动画显示使用联合概率数据关联跟踪器有助于在模棱两可的情况下保持跟踪。在这里,T24和T62跟踪的车辆由于距离传感器很远,被发现的概率很低。注意,跟踪器能够在没有检测到车辆的事件期间保持跟踪。在事件中,轨道首先合并,这是JPDA已知的现象,然后在再次检测到车辆时分离。

总结

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

万博1manbetx支持文件

helperLidarModel

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

函数量= 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 =暗(1:);W =暗(2:);H =暗(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 - H收缩;%测量是由最小-最大探测器给出的,因此长度和宽度必须%沿x和y方向的投影。Lmeas = Ls.*cosd(偏航)+ Ws.*sind(偏航);Wmeas = Ls.*sind(偏航)+ Ws.*cosd(偏航);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;%测量格式量= [x, y, z, Lmeas; Wmeas; Hs);结束

helperInverseLidarModel

这个函数定义了反向激光雷达模型,以使用激光雷达包围盒测量启动跟踪滤波器。该函数用于helperInitIMMFilter函数从边界框测量值获取状态估计。

函数[pos、posCov昏暗,dimCov,偏航,yawCov] = helperInverseLidarModel(量、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 + sign(y).*shiftY/2;z = z +符号(z).*shiftZ/2;pos = [x, y, z]; posCov = measCov(1:3,1:3,:); yaw = zeros(1,numel(x),“喜欢”, x);yawCov = 1(1, 1,元素个数(x)“喜欢”, x);初始化了一辆标准乘用车的尺寸% uncertainity。昏暗的= (4.7;1.8;1.4);眼睛dimCov = 0.01 * (3);结束

HelperBoundingBoxDetector

这是辅助班万博1manbetxHelperBoundingBoxDetector来接受点云输入并返回的列表objectDetection

classdefHelperBoundingBoxDetector < matlab。系统用于分割点云的助手类%转换为边界框检测。对对象的步骤调用做以下事情:% 1。移除限制之外的点云。% 2。从幸存的点云中,可以看到地面% 3。从障碍点云,形成集群并放置边界%框。%裁剪属性属性场景的XLimitsXLimits = [-70 70];场景的ylimitYLimits = [-6 6];场景的限制ZLimits = [-2 10];结束%地面分割特性属性% GroundMaxDistance点到接地面的最大距离GroundMaxDistance = 0.3;% GroundReferenceVector接地平面参考向量GroundReferenceVector = [0 0 1];点到参考向量的最大角距离GroundMaxAngularDistance = 5;结束包围框分割属性属性分割距离阈值分割的距离SegmentationMinDistance = 1.6;MinDetectionsPerCluster每个集群的最小检测数MinDetectionsPerCluster = 2;% MaxZDistanceCluster集群最大z坐标MaxZDistanceCluster = 3;% MinZDistanceCluster集群最小z坐标MinZDistanceCluster = 3;结束%自我车辆半径移除自我车辆点云。属性% EgoVehicleRadius自我车辆的半径EgoVehicleRadius = 3;结束属性% MeasurementNoise包围盒检测的测量噪声MeasurementNoise = blkdiag(眼睛(3)、眼睛(3));结束属性(不可调)MeasurementParameters = struct.empty(0,1);结束方法函数obj = HelperBoundingBoxDetector(varargin) setProperties(obj,nargin,varargin{:})结束结束方法(访问=保护)函数[bboxDets, obstacleIndices groundIndices croppedIndices] = stepImpl (obj, currentPointCloud,时间)%作物点云[pcSurvived, survivedIndices croppedIndices] = cropPointCloud (currentPointCloud、obj.XLimits obj.YLimits, obj.ZLimits, obj.EgoVehicleRadius);%移除接地面[pcObstacles, obstacleIndices groundIndices] = removeGroundPlane (pcSurvived、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 = assembleDetections (detBBoxes, obj.MeasurementNoise、measParams、时间);结束结束结束函数检测= assembleDetections (bboxes measNoise measParams,时间)此方法以objectDetection格式组装检测。numBoxes =大小(bboxes, 2);检测=细胞(numBoxes, 1);i = 1:numBoxes检测{i} = objectDetection(time,cast(bboxes(:,i),“双”),...“MeasurementNoise”、双(measNoise),“ObjectAttributes”、结构、...“MeasurementParameters”, measParams);结束结束函数bboxes = getBoundingBoxes (ptCloud minDistance、minDetsPerCluster maxZDistance, minZDistance)此方法在每个集群上使用一些基本的%的规则。% Cluster必须至少有minDetsPerCluster点。它的平均z必须在maxZDistance和minZDistance之间。长、宽、高分别用最小值和最大值计算%的维度。[标签,numClusters] = pcsegdist (ptCloud minDistance);pointData = ptCloud.Location;numClusters bboxes =南(6日,“喜欢”, pointData);isValidCluster = false(1、numClusters);i = 1:numClusters thisPointData = pointData(labels == i,:);meanPoint =意味着(thisPointData, 1);如果size(thisPointData,1) > minDetsPerCluster...meanPoint(3) < maxZDistance && meanPoint(3) > minZDistance xMin = min(thisPointData(:,1));xMax = max (thisPointData (: 1));yMin = min (thisPointData (:, 2));yMax = max (thisPointData (:, 2));zMin = min (thisPointData (:, 3));zMax = max (thisPointData (:, 3));l = (xMax - xMin);w = (yMax - yMin);h = (zMax - zMin);x = (xMin + xMax)/2; y = (yMin + yMax)/2; z = (zMin + zMax)/2; bboxes(:,i) = [x y z l w h]'; isValidCluster(i) = l < 20;最大长度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 = 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;validindexes = inside & nonegoindexes;指数=找到(validIndices);croppedIndices =找到(~ validIndices);ptCloudOut =选择(ptCloudIn、指标);结束

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 = HelperBoundingBoxDetector (...“XLimits”(-50 75),...% min-max“YLimits”, 5 [5],...% min-max“ZLimits”(2 - 5),...% min-max“SegmentationMinDistance”, 1.6,...%最小欧几里得距离“MinDetectionsPerCluster”, 1...每个集群的最小点数%“MeasurementNoise”,眼(6),...%检测报告中的测量噪声。“GroundMaxDistance”, 0.3);接地点到接地面的最大距离assignmentGate = [50 100];%赋值阈值;confThreshold = [7 10];%历史逻辑的确认阈值delThreshold = [8 10];%历史逻辑的删除阈值Kc = 1 e-5;单位体积误报率%filterInitFcn = @helperInitIMMFilter;追踪= trackerJPDA (“FilterInitializationFcn”filterInitFcn,...“TrackLogic”“历史”...“AssignmentThreshold”assignmentGate,...“ClutterDensity”Kc,...“ConfirmationThreshold”confThreshold,...“DeletionThreshold”delThreshold,...“HasDetectableTrackIDsInput”,真的,...“InitializationThreshold”,0,...“MaxNumTracks”, 30);detectableTracksInput = 0 (tracker.MaxNumTracks, 2);currentNumTracks = 0;结束ptCloud = pointCloud (ptCloudLocations);%探测器模型(检测、obstacleIndices groundIndices croppedIndices] = detectorModel (ptCloud、时间);%的电话跟踪[confirmedTracks ~, allTracks] =追踪(检测、时间detectableTracksInput (1: currentNumTracks,:));更新可检测性输入currentNumTracks =元素个数(allTracks);detectableTracksInput(1:currentNumTracks,:) = helperCalcDetectability(allTracks,[1 3 6]);获取模型概率modelProbs = 0(2,元素个数(confirmedTracks));如果isLocked(跟踪)k = 1: numl (confirmedTracks) c1 = getTrackFilterProperties(tracker,confirmedTracks(k)。TrackID,“ModelProbabilities”);聚合氯化铝c1 = {1};modelProbs (k) =聚合氯化铝(1);modelProbs (2 k) =聚合氯化铝(2);结束结束结束

helperCalcDetectability

函数计算每条航迹的探测概率。函数用于生成“DetectableTracksIDs”输入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的) trackIDs = [tracks.TrackID];其他的trackIDs = 0(1,元素个数(跟踪)“uint32”);i = 1:numel(tracks) trackIDs(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);frameindexes = [1:70:numFrames numFrames + 1];counter = 1;i = initFileIndex:lastFileIndex startFrame = frameindexes(计数器);endFrame = frameindexes (counter + 1) - 1;负载(fullfile (datasetFolder, (“lidarData_”num2str(我)]),“currentLidarData”);lidarData(startFrame:endFrame) = currentLidarData(1:(endFrame + 1 - startFrame));Counter = Counter + 1;结束结束

参考文献

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