主要内容

雷达和激光雷达数据的轨迹级融合

此示例向您展示了如何从雷达和激光雷达传感器的测量生成对象级轨道列表,并使用轨道级融合方案进一步熔断它们。您使用联合概率数据关联(JPDA)跟踪器使用扩展对象跟踪器和LIDAR测量来处理雷达测量。您可以使用轨道级融合方案进一步熔化这些曲目。工作流程的示意图如下所示。

合成数据生成的设置场景

本示例中使用的场景是使用驾驶场景(自动驾驶工具箱).使用雷达和激光雷达传感器的数据使用drivingRadarDataGenerator(自动驾驶工具箱)lidarPointCloudGenerator(自动驾驶工具箱),分别。场景和传感器模型的创建包含在helper函数中helperCreateRadarLidarScenario.有关场景和合成数据生成的更多信息,请参见以编程方式创建驾驶场景(自动驾驶工具箱)

%用于可重复性结果rng(2020年);创建场景,自我车辆,并获得雷达和激光雷达传感器[scenario, egoVehicle, radar, lidar] = helperCreateRadarLidarScenario;

ego车辆安装有四个二维雷达传感器。前后雷达传感器有45度的视野。左右雷达传感器的视野范围为150度。每个雷达的方位角分辨率为6度,射程为2.5米。ego还安装了一个三维激光雷达传感器,具有360度方位和40度仰角的视野。激光雷达的方位角分辨率为0.2度,仰角分辨率为1.25度(32个仰角通道)。在下面的动画中可视化传感器的配置和模拟传感器数据。注意,雷达的分辨率比物体高,因此对每个物体返回多个测量值。还请注意,激光雷达与actor的低聚网格以及道路表面相互作用,从这些对象返回多个点。

雷达跟踪算法

如前所述,雷达具有比目标更高的分辨率,并对每个目标返回多个探测。传统的跟踪器,如全球最近邻(GNN)和联合概率数据关联(JPDA),假设传感器每次扫描每个对象最多返回一次检测。因此,高分辨率传感器的检测必须在使用传统跟踪器处理之前进行聚类,或者使用扩展目标跟踪器进行处理。扩展目标跟踪器不需要预聚类检测,通常估计运动状态(例如,位置和速度)和目标的范围。有关传统跟踪器和扩展对象跟踪器的更详细比较,请参阅基于雷达和摄像机的公路车辆扩展目标跟踪的例子。

一般来说,扩展的目标跟踪器提供更好的目标估计,因为它们使用跟踪的时间历史同时处理聚类和数据关联。在本例中,雷达探测使用高斯混合概率假设密度(GM-PHD)跟踪器(trackerPHDgmphd)使用矩形目标模型。有关配置跟踪器的更多详细信息,请参阅基于雷达和摄像机的公路车辆扩展目标跟踪的例子。

使用雷达测量跟踪对象的算法封装在helper类中,helperRadarTrackingAlgorithm,实现为System对象™。这个类输出一个数组objectTrack对象并根据以下约定定义其状态:

$[x\ y\ s\ {\theta}\ {\omega}\ L\ W]$

radarTrackingAlgorithm = helperRadarTrackingAlgorithm(雷达);

LIDAR跟踪算法

与雷达类似,激光雷达传感器也会对每个物体返回多个测量值。此外,传感器从道路返回大量的点,这些点在用作目标跟踪算法的输入之前必须被删除。虽然扩展目标跟踪算法可以直接处理来自障碍物的激光雷达数据,但在激光雷达数据跟踪中,传统的跟踪算法仍较为普遍。出现这种趋势的第一个原因主要是针对大数据集的扩展目标跟踪器计算复杂度较高。第二个原因是对PointPillars[1]、VoxelNet[2]和PIXOR[3]等先进的基于深度学习的探测器的投资,这些探测器可以分割点云并返回车辆的包围盒检测。这些检测器有助于克服由于不适当的聚类而导致的传统跟踪器性能下降的问题。

在该示例中,使用传统的联合概率数据关联(JPDA)跟踪器处理LIDAR数据,该跟踪器配置有交互多模型(IMM)滤波器。通过使用基于Ransac的平面拟合算法和边界框来执行通过使用基于欧几里德的距离聚类算法而形成的LIDAR数据的预处理。有关算法的更多信息,请参阅用激光雷达追踪车辆:从点云到轨迹表的例子。对比链接的示例,跟踪在场景框架中执行,跟踪器进行不同的调整以跟踪不同大小的对象。此外,对变量的状态进行了不同的定义,以约束轨道在其估计航向角方向上的运动。

使用激光雷达数据跟踪对象的算法被包装在helper类中,helperLidarTrackingAlgorithm实现为系统对象。这个类输出一个数组objectTrack对象,并根据以下约定定义它们的状态:

美元[x \ \ s \{\θ}\{ω\}\ z \{\点{z}} \ H L \ W \]美元

相似地定义了雷达算法的常见状态。此外,作为一个三维传感器,激光雷达跟踪器输出另外三种状态,z美元${\点{z}} $H美元,这是指分别的z坐标(m),z速度(m / s)和跟踪对象的高度(m)。

lidarTrackingAlgorithm = helperLidarTrackingAlgorithm(激光雷达);

设置Fuser、Metrics和Visualization

定影器

接下来,您将建立一个融合算法,用于融合雷达和LIDAR跟踪器的轨道列表。与其他跟踪算法类似,朝向轨道级融合算法的第一步是定义融合或中心轨道的状态矢量(或状态空间)的选择。在这种情况下,选择融合轨道的状态空间以与LIDAR相同。选择中央轨道状态空间后,您将中央轨道状态的转换定义为本地轨道状态。在这种情况下,局部轨道状态空间是指雷达和激光轨道的状态。要做到这一点,你用afuserSourceConfiguration对象。

定义雷达源的配置。的helperRadarTrackingAlgorithm输出跟踪与SourceIndex设置为1.SourceIndex是作为每个跟踪器的属性提供的,以唯一地识别它,并允许融合算法区分来自不同来源的跟踪。因此,设置SourceIndex雷达配置的特性与雷达轨迹的特性相同。你设置Isinitializing Centraltracks.真的让那些未分配的雷达轨迹启动新的中央轨迹。接下来,定义中心状态空间中的轨迹到雷达状态空间的转换,反之亦然。辅助功能central2radarradar2central执行两个转换并包含在本示例的末尾。

radarConfig = fuserSourceConfiguration (“SourceIndex”, 1...“IsInitializingCentralTracks”,真的,...“CentralToLocalTransformFcn”@central2radar,...“LocalToCentralTransformFcn”,@ radar2central);

定义激光雷达源的配置。由于激光雷达轨迹的状态空间与中心轨迹相同,因此不需要定义任何转换。

lidarConfig = fuserSourceConfiguration (“SourceIndex”2,...“IsInitializingCentralTracks”,真正的);

下一步是定义状态融合算法。状态 - 融合算法在中央状态空间中将多个状态和状态CovariRce视为输入,并返回状态和协方差的融合估计。在此示例中,您使用由辅助功能提供的协方差交叉算法,helperRadarLidarFusionFcn.一个具有均值的高斯估计的一般协方差交算法x_i美元和协方差P_i美元可根据以下方程式定义:

美元P_ {F} ^ {1} = w_ {1} {P_ {1}} ^ {1} + w_ {2} {P_ {2}} ^ {1} $

$ x_ {f} = p_ {f}(w_ {1} {p_ {1}} ^ { -  1} x_ {1} + w_ {2} {p_ {2} {p_ {2}} ^ { -  1} x_ {2})$

在哪里美元间{F} $$ p_ {f} $融合状态和协方差和美元w_ {1} $美元w_ {2} $是每个估计的混合系数。通常,这些混合系数是通过最小化行列式或融合协方差的轨迹来估计的。在这个例子中,混合权重是通过最小化每个估计的位置协方差的行列式来估计的。此外,由于雷达不估计三维状态,三维状态只与激光雷达融合。有关详情,请参阅helperRadarLidarFusionFcn函数显示在这个脚本的末尾。

接下来,使用TrackFuser.对象。

%中央轨道的状态空间与LIDAR的轨道相同,因此你使用相同的状态转移函数。函数是%在helperLidarTrackingAlgorithm类中定义。f = lidarTrackingAlgorithm.StateTransitionFcn;%创建trackFuser对象定影器(“SourceConfigurations”{radarConfig; lidarConfig},...“StateTransitionFcn”,F,...“加工噪音”诊断接头([1 3]),...“HasAdditiveProcessNoise”假的,...“AssignmentThreshold”, 250年正无穷,...“ConfirmationThreshold”,[3 5],...“DeletionThreshold”, 5 [5],...“StateFusion”'风俗'...“CustomStateFusionFcn”, @helperRadarLidarFusionFcn);

指标

在本例中,您使用广义最优子模式分配度量(GOSPA)度量来评估每个算法的性能trackGOSPAMetric每个追踪器。GOSPA指标旨在通过提供标量成本来评估跟踪系统的性能。度量值越低,跟踪算法的性能越好。

要使用自定义运动模型(如本例中使用的模型)使用GOSPA度量,可以设置距离属性为“自定义”,并定义轨道与其相关地面真值之间的距离函数。这些距离函数,在这个例子的最后显示helperRadarDistance, 和helperLidarDistance

%雷达GOSPAgospaRadar = trackGOSPAMetric (“距离”“自定义”...“DistanceFcn”@helperRadarDistance,...“CutoffDistance”25);%激光雷达GOSPAgospaLidar = trackGOSPAMetric (“距离”“自定义”...“DistanceFcn”@helperLidarDistance,...“CutoffDistance”25);中央/融合GOSPA %gospaCentral = trackGOSPAMetric (“距离”“自定义”...“DistanceFcn”@helperLidarDistance,...状态空间与激光雷达相同“CutoffDistance”25);

可视化

本示例的可视化是使用helper类实现的helperLidarRadarTrackFusionDisplay.显示屏分为4个面板。显示器绘制从每个传感器的测量和轨迹以及融合轨迹估计。显示的图例如下所示。此外,轨道是通过它们的独特身份进行注释的(TrackID)以及前缀。前缀“R”、“L”和“F”分别代表雷达、激光雷达和融合估计。

%创建一个显示。% FollowActorID控制特写中显示的角色%显示显示= helperLidarRadarTrackFusionDisplay ('乳粉花',3);显示持久化图例showLegend(显示、场景);

运行场景和跟踪程序

接下来,您将推进该场景,从所有传感器生成合成数据,并对其进行处理,以从每个系统生成轨迹。您还可以使用场景中提供的地面真实值为每个跟踪器计算度量。

%Initialzie GOSPA度量及其所有跟踪算法的组件。gospa = 0 (0);missTarget = 0 (0);falseTracks = 0 (0);%初始化fusedTracksfusedTracks = objectTrack.empty (0,1);%用于存储gospa度量所用时间步长的计数器。idx = 1;%度量标准的基本事实。这个变量在每个时间步更新%自动成为角色的句柄。groundTruth = scenario.Actors(2:结束);尽管前进(方案)%当前时间时间= scenario.SimulationTime;收集雷达和激光雷达测量和自我姿势以跟踪%的场景。请参阅下面的helperCollectSensorData。[radarDetections,ptCloud,egoPose]=帮助收集传感器数据(egoVehicle,雷达,激光雷达,时间);%产生雷达航迹Radartracks = RadartrackingAlgorithm(Efopose,radardetections,时间);%生成激光雷达轨迹和分析信息,如边界框%检测和点云分割信息[Lidartracks,Lidardetections,semmentationInfo] =...lidarTrackingAlgorithm (egoPose、ptCloud、时间);连接雷达和激光雷达跟踪localTracks = [radarTracks; lidarTracks];%更新fuser。第一次呼叫必须包含一个本地轨道如果~(isempty(localTracks) && ~isLocked(fuser)) fusedTracks = fuser(localTracks,time);终止%Capture GoSPA及其组件适用于所有跟踪器[gospa(1,idx),~,~,~,missTarget(1,idx),falseTracks(1,idx)] = gospaRadar(radarTracks, groundTruth);[gospa(2,idx),~,~,~,missTarget(2,idx),假轨道(2,idx)] = gospaLidar(lidarTracks, groundTruth);[gospa(3,idx),~,~,~,missTarget(3,idx),falseTracks(3,idx)] = gospaCentral(fusedTracks, groundTruth);%更新显示显示(场景,雷达,雷达探测,雷达跟踪,...激光雷达、ptCloud、激光雷达检测、分段信息、激光雷达支架、,...fusedTracks);%更新用于存储GOSPA指标的索引Idx = Idx + 1;终止%更新示例动画updateExampleAnimations(显示);

评估性能

使用可视化和定量度量来评估每个跟踪器的性能。分析场景中的不同事件,理解轨迹级融合方案如何帮助更好地估计车辆状态。

跟踪维护

下面的动画显示了每三个时间步长的整个运行。请注意,三个跟踪系统中的每一个 - 雷达,激光雷达和轨道级融合 - 都能够跟踪场景中的所有四个车辆,并且没有确认虚假轨迹。

您还可以使用“未达到目标”和“错误跟踪”来定量衡量这方面的性能GOSPA度量的组件。请注意,下图中,由于建立延迟,未命中目标组件从一个较高的值开始,并在每个跟踪系统的大约5-10个步骤中降至零。此外,请注意,所有系统的假航迹组件均为零,这表示未确认假航迹。

%绘制错过的目标成分图;情节(missTarget ',“线宽”,2); 传奇(“雷达”激光雷达的“融合”);标题(“错过了目标度量”);包含(“时间步”);ylabel ('公制');网格%绘制错误跟踪组件图形情节(假轨),“线宽”,2); 传奇(“雷达”激光雷达的“融合”);标题(“错误跟踪指标”);包含(“时间步”);ylabel ('公制');网格

Track-level准确性

每个跟踪器的轨迹级别或定位精度也可以通过GOSPA度量在每个时间步骤进行定量评估。数值越小,跟踪精度越好。由于没有错过目标或错误轨迹,该度量捕获了由每辆车的状态估计导致的定位错误。

注意,用于融合估计的GOSPA度量比用于单个传感器的度量要低,这表明从每个传感器的航迹估计融合后航迹精度提高了。

%绘制GOSPA图;情节(gospa ',“线宽”,2); 传奇(“雷达”激光雷达的“融合”);标题(“GOSPA指标”);包含(“时间步”);ylabel ('公制');网格

紧密的目标

如前所述,该示例使用基于欧几里德距离的聚类和边界框拟合将激光雷达数据提供给传统跟踪算法。当对象间隔很近时,聚类算法通常会受到影响。使用本例中使用的检测器配置,当过往车辆接近ego车辆前方的车辆时,检测器将来自每辆车辆的点云聚集到一个更大的边界框中。您可以在下面的动画中注意到,轨迹偏离车辆中心。由于轨道在几个步骤的估计中具有更高的确定性,因此融合后的估计最初也会受到影响。然而,随着不确定性的增加,其与融合估计的关联性变弱。这是因为协方差求交算法根据每个估计的确定性为每个指定的轨迹选择混合权重。

GOSPA指标也捕捉到了这种效果。你可以注意到,在上面的GOSPA公制图中,激光雷达公制显示了大约在第65个时间步长的峰值。

由于两个主要原因,雷达航迹在此事件期间不受影响。首先,雷达传感器在每次检测中输出距离率信息,与行驶较慢的车辆相比,超车车辆的噪声级不同。这导致单个车辆检测之间的统计距离增加。Seco其次,扩展对象跟踪器根据预测的轨迹评估多个可能的聚类假设,这导致拒绝不正确的聚类并接受正确的聚类。请注意,为了让扩展对象跟踪器正确选择最佳聚类,轨迹的过滤器必须在一定程度上能够捕获差异在两个簇之间。例如,具有高过程噪声和高度不确定尺寸的轨道可能无法正确声明簇,因为其过早老化和更高的灵活性来解释不确定事件。

远距离目标

当目标远离雷达传感器时,由于探测器的信噪比降低和传感器的分辨率有限,测量的精度会降低。这导致了测量的高不确定性,反过来又降低了跟踪精度。注意在下面的特写显示中,雷达估计的轨迹距离雷达传感器的地面真实值更远,并且报告具有更高的不确定性。然而,激光雷达传感器报告的点云测量数据足以产生一个“缩小”的边界框。激光雷达跟踪算法测量模型中的收缩效应使跟踪器能够保持正确尺寸的轨迹。在这种情况下,激光雷达混合权重高于雷达,使得融合估计比雷达估计更准确。

总结

在此示例中,您学习了如何设置用于雷达和激光雷达传感器的熔断轨道的轨道级融合算法。您还学习了如何使用广义最佳子模式度量及其关联组件评估跟踪算法。

效用函数

collectSensorData

用于生成当前时间步长的雷达和激光雷达测量值的函数。

功能[radarDetections, ptCloud, egoPose] = helperCollectSensorData(egoVehicle,雷达,激光雷达,时间)目标相对于自我载体的当前姿态tgtPoses = targetPoses (egoVehicle);radarDetections =细胞(0,1);对于i = 1:numel(雷达)thisRadarDetections = step(雷达{i}, tgtpose,时间);radarDetections = [radarDetections; thisRadarDetections];%#OK 终止%从激光雷达生成点云rdMesh = roadMesh (egoVehicle);ptCloud = step(lidar, tgtpose, rdMesh, time);%计算场景画面中自我车辆的姿态跟踪。通常%通过INS系统获得。如果不可用,可以设置为%“来源”在自我车辆框架中跟踪。egoPose=姿势(egoVehicle);终止

雷达中心

将雷达状态空间中的轨迹转换为中心状态空间中的轨迹的函数。

功能centralTrack = radar2central (radarTrack)初始化状态大小正确的轨道centralTrack = objectTrack (“状态”,零(10,1),...“StateCovariance”、眼睛(10));%radarTrack的同步属性,状态和状态协方差除外% radarTrack见下面定义的syncTrack。centralTrack = syncTrack (centralTrack radarTrack);xRadar = radarTrack.State;PRadar = radarTrack.StateCovariance;H = 0(10、7);雷达到中心线性变换矩阵h(1,1)= 1;h(2,2)= 1;h(3,3)= 1;h(4,4)= 1;h(5,5)= 1;h(8,6)= 1;h(9,7)= 1;Xcentral = H * Xradar;线性状态变换PCentral=H*PRadar*H';%线性协方差变换PCentral([6710],[6710])=眼(3);%未观察到的国家%中心轨迹的集合状态和协方差centralTrack。状态= xCentral;centralTrack。StateCovariance = PCentral;终止

central2radar

将中央状态空间中的轨迹转换为雷达状态空间中的轨迹的函数。

功能radarTrack = central2radar (centralTrack)初始化状态大小正确的轨道radarTrack = objectTrack (“状态”,零(7,1),...“StateCovariance”、眼睛(7));%同步除State和StateCovariance的centralTrack属性% radarTrack见下面定义的syncTrack。Radartrack = Synctrack(Radartrack,CentralTrack);Xcentral = CentralTrack.state;Pcentral = CentralTrack.statecovariance;h =零(7,10);中心到雷达的线性变换矩阵h(1,1)= 1;h(2,2)= 1;h(3,3)= 1;h(4,4)= 1;h(5,5)= 1;h(6,8)= 1;h(7,9)= 1;Xradar = H * Xcental;线性状态变换PRadar = H * PCentral * H ';%线性协方差变换雷达轨道的百分比状态和协方差radartrack.state = xradar;radartrack.statecovariance = pradar;终止

syncTrack

将一个轨迹的属性与另一个轨迹的属性同步的函数,但“状态”和“状态协方差”属性除外

功能tr1=syncTrack(tr1,tr2)props=properties(tr1);notState=~strcmpi(props,“状态”);notCov = ~ strcmpi(道具、“StateCovariance”);props =道具(notState & notCov);对于i = 1:元素个数(道具)tr1。(道具{我})= tr2。(道具{我});终止终止

构成

作为结构的自我载体的返回姿态的函数。

功能我的意思是:位置= egoVehicle.Position;egoPose。速度= egoVehicle.Velocity;egoPose。偏航= egoVehicle.Yaw;egoPose。距= egoVehicle.Pitch;egoPose。滚= egoVehicle.Roll;终止

helperLidarDistance

函数,用于计算雷达状态空间中轨道的估计与指定的地面真值之间的归一化距离。

功能dist = helperLidarDistance(track, truth)%计算跟踪器估计的状态的实际值% Center与origin不同,跟踪器估计中心rorigintocenter = -truth.originoffset(:) + [0; 0;真相.Height / 2];rot =四元数([truth.yaw truth.pitch thare.roll],“eulerd”“ZYX”“框架”);actPos = true . position (:) + rotatepoint(rot,rOriginToCenter')';%实际速度和z速率actVel =[规范(truth.Velocity (1:2)); truth.Velocity (3)];%实际偏航actYaw = truth.Yaw;%的实际尺寸。Actdim = [真实.Length; truth.width; thalluth.height];实际偏航率actYawRate = truth.AngularVelocity (3);%计算每一个估计的误差加权的“要求”% 系统。在每个方面使用mahalanobis距离指定的距离%的估计,其中协方差是由“需求”定义的。这当轨道过低/过低报告时,有助于避免偏离距离%不确定度,因为状态/测量模型不准确。%位置误差。estPos =。状态([1 2 6]);眼睛reqPosCov = 0.1 * (3);e = estPos - actPos;d1 =√e”/ reqPosCov * e);%速度误差estVel =。状态(7 [3]);reqVelCov = 5 *眼(2);e = estVel - actVel;d2 =√e”/ reqVelCov * e);%偏航误差estYaw = track.State (4);reqYawCov = 5;e = estYaw - actYaw;d3 =√e”/ reqYawCov * e);%偏航率误差estYawRate=track.State(5);reqYawRateCov=1;e=estYawRate-actYawRate;d4=sqrt(e'/reqYawRateCov*e);%维度错误estdim = track.state([8 9 10]);reqdimcov =眼睛(3);e = estDim - actDim;d5 = sqrt(e'/ reqdimcov * e);%总距离Dist = d1 + d2 + d3 + d4 + d5;终止

helperRadarDistance

函数,用于计算雷达状态空间中轨道的估计与指定的地面真值之间的归一化距离。

功能DIST = HERPERRADASTARTANCE(轨道,真理)%计算跟踪器估计的状态的实际值% Center与origin不同,跟踪器估计中心rorigintocenter = -truth.originoffset(:) + [0; 0;真相.Height / 2];rot =四元数([truth.yaw truth.pitch thare.roll],“eulerd”“ZYX”“框架”);actPos = true . position (:) + rotatepoint(rot,rOriginToCenter')';actPos = actPos (1:2);%只有二维%的实际速度actVel =规范(truth.Velocity (1:2));%实际偏航actYaw = truth.Yaw;%的实际尺寸。雷达只有二维actDim = [truth.Length; truth.Width];实际偏航率actYawRate = truth.AngularVelocity (3);%计算每一个估计的误差加权的“要求”% 系统。在每个方面使用mahalanobis距离指定的距离%的估计,其中协方差是由“需求”定义的。这当轨道过低/过低报告时,有助于避免偏离距离%不确定度,因为状态/测量模型不准确。%位置错误estPos =。状态([1 - 2]);reqPosCov = 0.1 *眼(2);e = estPos - actPos;d1 =√e”/ reqPosCov * e);%的速度误差estVel = track.State (3);reqVelCov = 5;e = estVel - actVel;d2 =√e”/ reqVelCov * e);%偏航误差estYaw = track.State (4);reqYawCov = 5;e = estYaw - actYaw;d3 =√e”/ reqYawCov * e);%偏航率误差estYawRate=track.State(5);reqYawRateCov=1;e=estYawRate-actYawRate;d4=sqrt(e'/reqYawRateCov*e);%维度错误estDim =。状态(7 [6]);reqDimCov =眼(2);e = estDim - actDim;d5 = sqrt(e'/ reqdimcov * e);%总距离Dist = d1 + d2 + d3 + d4 + d5;如果没有测量三维状态,就会经常受到惩罚Dist = Dist + 3;终止

helperRadarLidarFusionFcn

函数在中心轨道状态空间中融合状态和状态协方差

功能[x,p] = helperradarlidarfusionfcn(xall,pall)n =尺寸(xall,2);dets =零(n,1);%初始化x和Px=xAll(:,1);P=PAll(:,:,1);onlyDarStates=false(10,1);onlyDarState([6710])=真;只将这些信息与激光雷达融合xOnlyLidar = xAll (onlyLidarStates:);POnlyLidar =笼罩(onlyLidarStates、onlyLidarStates:);与雷达和潮流雷达交叉口的%州和协方差都xToFuse=xAll(~onlydarstates,:);PToFuse=PAll(~onlydarstates,~onlydarstates,:);%行列式排序的顺序。这有助于按顺序构建具有可比性测定的%协方差。例如,两个大%协方差可能与一个更小的协方差相交,该协方差可与%第三小的协方差。对于i = 1:n dets(i)= det(ptofuse(1:2,1:2,i));终止[~, idx] =排序(侦破,“下”);xToFuse = xToFuse (:, idx);PToFuse = PToFuse (:,:, idx);初始融合估计thisX = xToFuse (: 1);thisP = PToFuse (:: 1);%序贯融合对于i = 2:n [thisX,thisP] = fusecovinusingpos (thisX, thisP, xToFuse(:,i), PToFuse(:,:,i));终止%从所有源分配熔合状态x (~ onlyLidarStates) = thisX;P (~ onlyLidarStates ~ onlyLidarStates,:) = thisP;只使用激光雷达源对某些州进行熔接有效=任何(abs(xOnlyLidar) > 1e-6,1);xMerge = xOnlyLidar(:,有效);PMerge = POnlyLidar(:,:有效);如果sum(valid) > 1 [xL,PL] = fusecovint(xMerge,PMerge);elseifsum(valid) == 1 xL = xMerge;PL = PMerge;其他的xL = 0 (3,1);PL =眼(3);终止x (onlyLidarStates) = xL;P (onlyLidarStates onlyLidarStates) = PL;终止功能(x, P) = fusecovintUsingPos (P1 x1, x2, P2)%协方差交叉口一般采用以下内容%方程式:%P^-1=w1*P1^-1+w2*P2^-1% x = P*(w1*P1^-1*x1 + w2*P2^-1*x2);%其中w1 + w2 = 1通常是协方差矩阵的标量,如det或将P的% "trace"最小化以计算w。这是由函数提供的%“fusecovint”。然而。在这种情况下,通过最小化来选择w只有“位置”协方差的行列式。n =大小(x1, 1);Idx = [1 2];detP1pos =侦破(P1 (idx idx));detP2pos =侦破(P2 (idx idx));w1 = detP2pos/(detP1pos + detP2pos);w2 = (+ (+));我眼睛= (n);P1inv = I / P1;P2inv = I / P2;= w1*P1inv + w2*P2inv; P = I/Pinv; x = P*(w1*P1inv*x1 + w2*P2inv*x2);终止

参考文献

[1] Lang, Alex H.,等。PointPillars:用于点云对象检测的快速编码器。计算机视觉与模式识别。2019。

[2] Zhou,Yin和Oncel Tuzel.“体素网:基于点云的三维物体检测的端到端学习”,《IEEE计算机视觉和模式识别会议论文集》,2018年。

[3] Yang, Bin, Wenjie Luo, Raquel Urtasun。Pixor:从点云进行实时三维物体检测。计算机视觉与模式识别。2018。