主要内容

雷达与激光雷达数据的航迹级融合

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

合成数据生成的设置场景

本例中使用的场景是使用drivingScenario(自动驾驶工具箱).利用雷达和激光雷达传感器的数据进行模拟drivingRadarDataGenerator(自动驾驶工具箱)而且lidarPointCloudGenerator(自动驾驶工具箱),分别。场景和传感器模型的创建封装在辅助函数中helperCreateRadarLidarScenario.有关场景和合成数据生成的更多信息,请参阅以编程方式创建驾驶场景(自动驾驶工具箱)

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

ego车辆安装有4个2-D雷达传感器。前后雷达传感器的视场为45度。左右雷达传感器的视野为150度。每个雷达具有6度的方位角分辨率和2.5米的距离。“自我”还安装了一个三维激光雷达传感器,可以360度的方位角和40度的仰角。激光雷达具有0.2度的方位角和1.25度的仰角分辨率(32个仰角通道)。在下面的动画中可视化传感器的配置和模拟传感器数据。请注意,雷达具有比物体更高的分辨率,因此每个物体返回多个测量值。还要注意,激光雷达与演员的低聚网格以及路面相互作用,从这些物体返回多个点。

雷达跟踪算法

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

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

使用雷达测量来跟踪对象的算法被包装在helper类中,helperRadarTrackingAlgorithm,实现为System对象™。的数组objectTrack对象,并根据以下约定定义它们的状态:

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

radarTrackingAlgorithm = helperRadarTrackingAlgorithm(雷达);

激光雷达跟踪算法

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

在本例中,激光雷达数据使用传统的联合概率数据关联(JPDA)跟踪器进行处理,并配置了一个交互多模型(IMM)滤波器。采用基于ransac的平面拟合算法对激光雷达数据进行预处理以去除点云,采用基于欧几里得的距离聚类算法形成包围盒。有关该算法的更多信息,请参阅使用激光雷达跟踪车辆:从点云到跟踪列表的例子。与链接的示例相比,跟踪是在场景框架中执行的,跟踪器进行了不同的调整,以跟踪不同大小的对象。此外,变量的状态被以不同的方式定义,以约束轨道在其估计航向角方向上的运动。

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

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

雷达算法的通用状态定义类似。此外,作为一个三维传感器,激光雷达跟踪器还输出三种额外的状态,z美元${\点{z}} $而且H美元,分别表示被跟踪物体的z坐标(m)、z速度(m/s)和高度(m)。

lidarTrackingAlgorithm = helperLidarTrackingAlgorithm(激光雷达);

设置Fuser,度量和可视化

熔化炉

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

定义雷达源的配置。的helperRadarTrackingAlgorithm输出跟踪SourceIndex设置为1。的SourceIndex作为每个跟踪器上的属性提供,以惟一地标识它,并允许融合算法区分来自不同源的跟踪。因此,您可以设置SourceIndex雷达配置的属性与雷达轨迹相同。你设置IsInitializingCentralTracks真正的让未分配的雷达轨迹启动新的中心轨迹。接下来,定义中央状态空间中的轨迹到雷达状态空间的转换,反之亦然。辅助函数central2radar而且radar2central执行这两个转换,它们包含在本示例的末尾。

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

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

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

下一步是定义状态融合算法。状态融合算法以中心状态空间中的多个状态和状态协方差为输入,返回状态和协方差的融合估计。在这个例子中,你使用了辅助函数提供的协方差交叉算法,helperRadarLidarFusionFcn.两个具有均值的高斯估计的协方差交算法x_i美元和协方差P_i美元可根据以下公式定义:

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

F F $间{}= P_ {} (w_ {1} {P_{1}} ^{1}间的{1}+ w_ {2} {P_{2}} ^{1}间的{2})美元

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

接下来,使用trackFuser对象。

%中心航迹的状态空间与激光雷达的航迹状态空间相同,%因此您使用相同的状态转换函数。函数是在helperLidarTrackingAlgorithm类中定义。f = lidarTrackingAlgorithm.StateTransitionFcn;创建一个trackFuser对象fuser = trackFuser(“SourceConfigurations”{radarConfig; lidarConfig},...“StateTransitionFcn”f...“ProcessNoise”,diag([1 3 1]),...“HasAdditiveProcessNoise”假的,...“AssignmentThreshold”, 250年正无穷,...“ConfirmationThreshold”[3 - 5],...“DeletionThreshold”, 5 [5],...“StateFusion”“自定义”...“CustomStateFusionFcn”, @helperRadarLidarFusionFcn);

指标

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

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

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

可视化

本例的可视化是使用一个助手类实现的helperLidarRadarTrackFusionDisplay.显示器分为4个面板。显示器显示来自每个传感器的测量和轨迹以及融合的轨迹估计。显示的图例如下所示。此外,这些音轨由它们的唯一标识进行注释(TrackID)以及前缀。前缀“R”、“L”和“F”分别代表雷达、激光雷达和融合估计。

创建一个显示。% FollowActorID控制特写中显示的参与者%显示display = helperLidarRadarTrackFusionDisplay(“FollowActorID”3);%显示持久图例showLegend(显示、场景);

运行场景和跟踪器

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

用于所有跟踪算法的Initialzie GOSPA度量及其组件。Gospa = 0 (3,0);missTarget = 0 (3,0);falseTracks = 0 (3,0);初始化fusedTracksfusedTracks = objectTrack.empty(0,1);用于存储gospa指标的时间步数的计数器。Idx = 1;度量的基本真理。这个变量会在每个时间步更新%自动成为参与者的句柄。groundTruth =场景。演员(2:结束);推进(场景)%当前时间时间= scenario.SimulationTime;收集雷达和激光雷达的测量数据并自我定位。%场景帧。参见下面的helperCollectSensorData。[radarDetections, ptCloud, egoPose] = helperCollectSensorData(egoVehicle,雷达,激光雷达,时间);%生成雷达轨迹radarTracks = radarTrackingAlgorithm(egoPose, radarDetections, time);生成激光雷达航迹和分析信息,如包围框%检测和点云分割信息[lidarTracks, lidarDetections, segmentationInfo] =...lidarTrackingAlgorithm(egoPose, ptCloud, time);连接雷达和激光雷达轨道localTracks =[雷达轨迹;激光轨迹];更新fuser。第一次呼叫必须包含一个本地轨道如果~(isempty(localTracks) && ~isLocked(fuser)) fusedTracks = fuser(localTracks,time);结束捕获所有跟踪器的GOSPA及其组件。[gospa(1,idx),~,~,~,missTarget(1,idx),falseTracks(1,idx)] = gospaRadar(radarTracks, groundTruth);[gospa(2,idx),~,~,~,missTarget(2,idx),falseTracks(2,idx)] = gospaLidar(lidarTracks, groundTruth);[gospa(3,idx),~,~,~,missTarget(3,idx),falseTracks(3,idx)] = gospaCentral(fusedTracks, groundTruth);更新显示显示(场景,雷达,雷达探测,雷达跟踪,...激光雷达,ptCloud, lidarDetections, segmentationInfo, lidarTracks,...fusedTracks);更新用于存储GOSPA指标的索引Idx = Idx + 1;结束更新示例动画updateExampleAnimations(显示);

评估性能

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

跟踪维护

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

您还可以使用GOSPA度量的“错过目标”和“错误跟踪”组件定量地度量性能的这一方面。请注意,在下面的图中,由于建立延迟,错过的目标组件从一个较高的值开始,并在每个跟踪系统的大约5-10步内下降到零。另外,请注意,对于所有系统,虚假跟踪组件为零,这表明没有确认虚假跟踪。

绘制遗漏的目标组件图;情节(missTarget ',“线宽”2);传奇(“雷达”激光雷达的“融合”);标题(“未达到的目标指标”);包含(“时间步”);ylabel (“指标”);网格绘制假航迹组件图;情节(falseTracks ',“线宽”2);传奇(“雷达”激光雷达的“融合”);标题(“虚假跟踪指标”);包含(“时间步”);ylabel (“指标”);网格

Track-level准确性

每个跟踪器的跟踪级或定位精度也可以通过GOSPA度量在每个时间步定量评估。数值越小,跟踪精度越高。由于没有错过目标或错误的轨道,度量捕获由每辆车的状态估计造成的定位误差。

请注意,融合估计的GOSPA度量低于单个传感器的度量,这表明在融合每个传感器的跟踪估计后,跟踪精度提高了。

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

间隔太近的目标

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

这种效果也在GOSPA度量中被捕获。在上面的GOSPA度量图中,您可以注意到激光雷达度量在第65个时间步左右显示了一个峰值。

雷达轨迹在此期间没有受到影响,主要有两个原因。首先,雷达传感器在每次探测中输出距离-速率信息,这些信息是不同的,超过了过往车辆与慢速行驶车辆的噪声水平。这就增加了侦测到个别车辆之间的统计距离。其次,扩展目标跟踪器根据预测轨迹评估多个可能的聚类假设,从而导致拒绝不正确的聚类和接受正确的聚类。请注意,对于扩展对象跟踪器,要正确地选择最佳集群,跟踪的过滤器必须健壮到可以捕获两个集群之间的差异的程度。例如,具有高过程噪声和高度不确定维度的轨道可能无法正确地声明一个集群,因为它的年龄过早,并且在考虑不确定事件时具有更高的灵活性。

远距离目标

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

总结

在本例中,您学习了如何设置航迹级融合算法,用于融合来自雷达和激光雷达传感器的航迹。您还学习了如何使用广义最优子模式度量及其相关组件评估跟踪算法。

效用函数

collectSensorData

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

函数[radarDetections, ptCloud, egoPose] = helperCollectSensorData(egoVehicle,雷达,激光雷达,时间)%目标相对于自我载具的当前姿态tgtpose = targetpose (egoVehicle);radarDetections = cell(0,1);i = 1:数字(雷达)thisRadarDetections =步骤(雷达{i}, tgtpositions,时间);radarDetections = [radarDetections;thisRadarDetections];% #好< AGROW >结束%从激光雷达生成点云rdMesh = roadMesh(egoVehicle);ptCloud =步骤(激光雷达,tgtpose, rdMesh,时间);计算自我车辆在场景框架中跟踪的姿态。。通常%使用INS系统获得。如果不可用,可以设置为%“原点”追踪在自我车辆的框架。egoPose = pose(egoVehicle);结束

radar2cental

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

函数centralTrack = radar2central(radarTrack)初始化一个状态大小正确的轨道centralTrack = objectTrack(“状态”1) 0(10日,...“StateCovariance”、眼睛(10));radarTrack除State和StateCovariance外的%同步属性参见下面定义的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([6 7 10],[6 7 10]) = eye(3);%未观察状态设置中心航迹的状态和协方差centralTrack。State = xCentral;centralTrack。StateCovariance = PCentral;结束

central2radar

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

函数radarTrack = central2radar(centralTrack)初始化一个状态大小正确的轨道radarTrack = objectTrack(“状态”1) 0(7日,...“StateCovariance”、眼睛(7));centralTrack除State和StateCovariance外的%同步属性参见下面定义的syncTrack。radarTrack = syncTrack(radarTrack,centralTrack);xCentral = centralTrack.State;PCentral = centralTrack.StateCovariance;H = 0 (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*xCentral;线性状态变换prar = H*PCentral*H';%线性协方差变换设置雷达轨迹状态和协方差radarTrack。State = xRadar;radarTrack。StateCovariance = PRadar;结束

syncTrack

一个同步一个音轨与另一个音轨属性的函数,除了“State”和“StateCovariance”属性

函数tr1 = syncTrack(tr1,tr2) props =属性(tr1);notState = ~strcmpi(道具,“状态”);notCov = ~strcmpi(道具,“StateCovariance”);props = props(notState & notCov);i = 1:元素个数(道具)tr1。(道具{我})= tr2。(道具{我});结束结束

构成

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

函数egoPose = pose(egoVehicle)。位置= egoVehicle.Position;egoPose。Velocity = egoVehicle.Velocity;egoPose。偏航= egovehicle .偏航;egoPose。Pitch = egoVehicle.Pitch;egoPose。Roll = egoVehicle.Roll;结束

helperLidarDistance

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

函数dist = helperLidarDistance(跟踪,真相)计算跟踪器估计的状态的实际值%中心与原点不同,跟踪器估计中心rOriginToCenter = -truth.OriginOffset(:) + [0;0;truth.Height/2];腐=四元数偏航真理。球场上的真理。卷),“eulerd”“ZYX股票”“帧”);actPos = true . position (:) + rotatepoint(rot,rOriginToCenter')';%实际速度和z速率actVel = [norm(truth.Velocity(1:2));truth.Velocity(3)];%实际偏航actYaw =真理。偏航;%实际尺寸。actDim = [truth.Length;truth.Width;truth.Height];%实际偏航率actYawRate = truth.AngularVelocity(3);的“需求”加权计算每个估计的误差%的系统。用马氏距离在各个方面指定的距离%的估计,其中协方差由“需求”定义。这%有助于避免倾斜距离时,轨道低于/超过报告他们的%由于状态/测量模型不准确而产生的不确定性。%位置错误。estPos = track。状态([1 2 6]);reqPosCov = 0.1*eye(3);e = estPos - actPos;d1 =√(e'/reqPosCov*e);速度误差estVel =轨道。状态(7 [3]);reqVelCov = 5*eye(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 =√(e'/reqYawRateCov*e);%尺寸错误estDim = track。状态([8 9 10]);reqDimCov = eye(3);e = estDim - actDim;d5 =根号(e'/reqDimCov*e);总距离%Dist = d1 + d2 + d3 + d4 + d5;结束

helperRadarDistance

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

函数dist = helperRadarDistance(跟踪,true)计算跟踪器估计的状态的实际值%中心与原点不同,跟踪器估计中心rOriginToCenter = -truth.OriginOffset(:) + [0;0;truth.Height/2];腐=四元数偏航真理。球场上的真理。卷),“eulerd”“ZYX股票”“帧”);actPos = true . position (:) + rotatepoint(rot,rOriginToCenter')';actPos = actPos(1:2);%仅2-D%实际速度actVel =范数(truth.Velocity(1:2));%实际偏航actYaw =真理。偏航;%实际尺寸。雷达只有二维actDim = [truth.Length;truth.Width];%实际偏航率actYawRate = truth.AngularVelocity(3);的“需求”加权计算每个估计的误差%的系统。用马氏距离在各个方面指定的距离%的估计,其中协方差由“需求”定义。这%有助于避免倾斜距离时,轨道低于/超过报告他们的%由于状态/测量模型不准确而产生的不确定性。%位置错误estPos = track。状态([1 - 2]);reqPosCov = 0.1*eye(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 =√(e'/reqYawRateCov*e);%尺寸错误estDim = track。状态(7 [6]);reqDimCov = eye(2);e = estDim - actDim;d5 =根号(e'/reqDimCov*e);总距离%Dist = d1 + d2 + d3 + d4 + d5;%不测量三维状态的恒定惩罚Dist = Dist + 3;结束

helperRadarLidarFusionFcn

函数用于融合中央航迹状态空间中的状态和状态协方差

函数[x,P] = helperRadarLidarFusionFcn(xAll,PAll) n = size(xAll,2);Dets = 0 (n,1);初始化x和Px = xAll(:,1);P = PAll(:,:,1);onlyLidarStates = false(10,1);onlyLidarStates([6 7 10]) = true;只与激光雷达融合此信息。xOnlyLidar = xAll(onlyLidarStates,:);POnlyLidar = PAll(onlyLidarStates,onlyLidarStates,:);与雷达和激光雷达相交的状态和协方差xToFuse = xAll(~onlyLidarStates,:);PToFuse = PAll(~onlyLidarStates,~onlyLidarStates,:);行列式的排序顺序。这有助于按顺序构建%的协方差与可比的决定。例如,两个大的%的协方差可能相交于一个更小的协方差,这相当于%第三小的协方差。i = 1:n dets(i) = det(PToFuse(1:2,1:2,i));结束[~,idx] = sort(dets,“下”);xToFuse = xToFuse(:,idx);PToFuse = PToFuse(:,:,idx);初始化融合估计thisX = xToFuse(:,1);thisP = PToFuse(:,:,1);%顺序融合i = 2:n [thisX,thisP] = fusecovintUsingPos(thisX, thisP, xToFuse(:,i), PToFuse(:,:,i));结束从所有源分配融合状态x(~onlyLidarStates) = thisX;P(~onlyLidarStates,~onlyLidarStates,:) = thisP;仅用激光雷达源融合某些状态valid = any(abs(xOnlyLidar) > 1e-6,1);xMerge = xOnlyLidar(:,有效);PMerge = POnlyLidar(:,:,有效);如果sum(有效)> 1 [xL,PL] = fusecovint(xMerge,PMerge);elseif== 1 xL = xMerge;PL = PMerge;其他的xL = 0 (3,1);PL =眼睛(3);结束x(onlyLidarStates) = xL;P(onlyLidarStates,onlyLidarStates) = PL;结束函数[x,P] = fusecovintUsingPos(x1,P1,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 = size(x1,1);Idx = [1 2];detP1pos = det(P1(idx,idx));detP2pos = det(P2(idx,idx));w1 = detP2pos/(detP1pos + detP2pos);w2 = detP1pos/(detP1pos + detP2pos);I =眼睛(n);P1inv = I/P1;P2inv = I/P2;Pinv = w1*P1inv + w2*P2inv; P = I/Pinv; x = P*(w1*P1inv*x1 + w2*P2inv*x2);结束

参考文献

[1]朗,亚历克斯H.,等。“PointPillars:用于点云对象检测的快速编码器。”IEEE计算机视觉与模式识别会议论文集,2019。

[2] Zhou, Yin和Oncel Tuzel。Voxelnet:基于点云的3d对象检测的端到端学习。IEEE计算机视觉与模式识别会议论文集,2018。

[3]杨,斌,罗文杰,拉奎尔·乌尔塔森。Pixor:点云实时三维物体检测IEEE计算机视觉与模式识别会议论文集,2018。