主要内容

基于栅格的多激光雷达城市环境跟踪

这个例子展示了如何使用基于网格的跟踪器用多个激光雷达跟踪移动的物体。基于网格的跟踪器能够早期融合来自雷达和激光雷达等高分辨率传感器的数据,从而创建一个全局目标列表。

介绍

大多数多目标跟踪方法将环境表示为一组离散且未知数量的目标。跟踪器的工作是使用传感器测量值估计目标数量及其相应状态,如位置、速度和尺寸。对于高分辨率传感器,如雷达或激光雷达,跟踪可以使用点对象跟踪器或扩展对象跟踪器配置算法。

点对象跟踪器

点目标跟踪器假设每个目标对每个传感器最多只能产生一次检测。因此,在使用点目标跟踪器跟踪扩展目标时,首先从目标级的传感器测量值中提取边界盒检测等特征。然后,这些目标级特征与跟踪器的目标级假设融合在一起。较差的传感器级目标级提取算法(如不完善的聚类)会极大地影响跟踪器的性能。有关此工作流的示例,请参阅用激光雷达追踪车辆:从点云到轨迹表(自动驾驶工具箱)

扩展对象跟踪器

另一方面,扩展目标跟踪器不需要在传感器级提取目标级假设来处理检测。扩展的目标跟踪器将传感器测量直接与跟踪器维护的目标级假设相关联。要做到这一点,一类算法通常需要特定于每个传感器模态的对象扩展的复杂测量模型。例如,参考用于机场地面监视的扩展激光雷达目标跟踪基于雷达和摄像头的公路车辆扩展目标跟踪(自动驾驶工具箱)学习如何分别为激光雷达和雷达配置多目标PHD跟踪器。

基于网格的跟踪器可以看作是一种扩展的目标跟踪算法,它使用动态占据网格地图作为环境的中间表示。在动态占用网格地图中,使用一组二维网格单元对环境进行离散。动态地图表示网格单元格所代表的空间的占用和运动学。将动态地图估计和进一步的单元分类作为静态和动态的预处理步骤,过滤掉静态对象的测量值,降低计算复杂度。

在此示例中,您使用追踪器System Object™配置基于网格的跟踪器。此跟踪器使用Dempster-Shafer近似[1]的随机有限集(RFS)配方来估计动态地图。此外,它使用最近的邻居单元到轨道关联[2]方案来跟踪场景中的动态对象。要初始化新曲目,跟踪器使用DBSCAN算法来纳入未分配的动态网格单元格。

建立场景和激光雷达传感器模型

此示例中使用的场景是使用驾驶场景设计师(自动驾驶工具箱)并导出到MATLAB®函数中。这个MATLAB函数被包装成一个辅助函数helperCreateMultiLidarDrivingScenario.该场景描述了一个城市十字路口场景,并包含了各种对象,包括行人、自行车手、汽车和卡车。

ego车辆配备6个同质激光雷达,每个具有90度的水平视野和40度的垂直视野。使用lidarPointCloudGenerator(自动驾驶工具箱)系统对象。每个激光雷达有32个仰角通道,方位角分辨率为0.16度。在这种配置下,每个激光雷达传感器每次扫描输出大约18,000个点。这里显示了每个传感器的配置。

%用于可重复性结果rng (2020);%创建场景[scenario, egoVehicle, lidar] = helperCreateMultiLidarDrivingScenario;

场景和来自不同激光雷达的数据可以在下面的动画中显示出来。为简洁起见,并使示例更容易可视化,激光雷达被配置为不从地面返回点云,通过指定HasRoadsInputPort财产作为.使用真实数据或使用来自道路的模拟数据时,必须使用点云预处理删除从地面和其他环境的返回。有关更多信息,请参阅用激光雷达探测地面和障碍物(自动驾驶工具箱)例子。

建立基于网格的跟踪器

使用。定义基于网格的跟踪器追踪器跟踪场景中的动态对象。定义跟踪器的第一步是设置传感器配置为trackingSensorConfiguration对象。传感器配置允许您指定与跟踪坐标系相关的每个传感器的安装。传感器配置还允许您指定每个传感器的检测限制-视野和最大范围。在本例中,您使用模拟激光雷达传感器的属性来定义这些属性。

实用程序功能HelpergetLidarConfig使用模拟的激光雷达传感器模型并返回其各自的配置。在本例中,利用车辆的仿真姿态在全局或世界坐标系中跟踪目标。这种信息通常是通过惯性导航系统获得的。当传感器在场景系统中移动时,它们的配置必须每次通过指定配置作为跟踪器的输入来更新。

%存储所有传感器的配置SensorConfigs = Cell(Numel(Lidars),1);%填写传感器配置i = 1:numel(sensorconfigs)sensorconfigs {i} = helpergetlidarconfig(lidars {i},Egovehicle);结束%创建追踪。您可以在使用跟踪器之前定义属性。追踪= trackerGridRFS (“SensorConfigurations”,sensorconfigs,...'hassensorconfigurationsinput',对);

跟踪器使用二维网格作为环境的中间表示。网格由3个属性定义:它的长度、宽度和分辨率。长度和宽度分别描述了网格在自我车辆局部X和局部Y方向上的跨度。分辨率定义网格每米的单元格数。在本例中,您使用一个120米× 120米的网格,每米有2个单元格。

跟踪器。GridLength = 120;%仪表跟踪器。GridWidth = 120;%仪表tracker.GridResolution=2;% 1 /米

除了定义网格之外,您还可以通过指定网格的原点(左角)相对于ego车辆的原点来定义ego车辆的相对位置。在这个例子中,自我载体位于网格的中心。

跟踪器。GridOriginInLocal =[追踪。GridLength / 2 -tracker.GridWidth / 2];

跟踪器使用基于粒子的方法来估计每个网格单元的状态,并进一步将它们分类为动态或静态。它使用固定数量的持久粒子在网格上定义现有目标的分布。它还使用固定数量的粒子来采样新生目标的分布。根据出生概率,在不同的网格单元中对出生粒子进行采样。此外,速度和其他未知状态,如转速和加速度(适用于MotionModel而追踪者却不是常速)的样本采用先验极限提供的先验信息进行均匀采样。重新采样步骤确保网格上的粒子数量保持不变。

跟踪器。NumParticles = 1 e5;%持续粒子数tracker.numbirthParticles = 2E4;%出生粒子数跟踪器。速度限制= [-15 15;-15 15];出生粒子采样速度(m/s)跟踪器。BirthProbability = 0.025;%在每个网格单元中出生的概率跟踪器。ProcessNoise = 5*eye(2);%作为[ax;ay](m/s^2)方差进行预测的粒子过程噪声

跟踪器使用Dempster-Shafer方法定义每个单元的占用率。动态网格估计占用率和网格自由状态的置信质量。在预测过程中,网格单元的占用率置信质量因预测粒子分布而更新死亡率控制生存概率( P s ),并导致在预测期间占位信念质量的衰减。由于自由信念质量与粒子没有联系,自由信念质量衰变使用预先指定的,常数折扣因子。这个折扣因子指定了自由区域在预测期间保持自由的概率。

跟踪器。死亡率= 1 e - 3;%单位时间。转换为Ps = 0.9999为10赫兹tracker.freespacediscountfactor = 1e-2;%单位时间。对于10hz,折扣率为0.63 (1e-2^dT)

在估计每个网格单元的状态后,跟踪器使用其估计的速度和相关的不确定性将每个网格单元分类为静态或动态。此外,跟踪器使用动态单元使用以下技术提取对象级别的假设:

每个动态网格单元都被认为是使用现有轨道的分配。如果网格单元和轨道之间的负对数似然低于分配阈值,则将动态网格单元分配给其最接近的轨道。在分配阈值之外的动态网格单元被认为是未分配的。跟踪器在每个步骤中使用未分配的网格单元来启动新曲目。由于多个未分配的网格单元可以属于相同的对象轨迹,因此使用DBSCAN聚类算法来帮助在此步骤中。因为在将单元格作为静态或动态分类时存在误报,所以跟踪器以两种方式过滤这些误报。首先,只有未分配的细胞,形成具有超过指定数量的群集(minnumpointspercluster.)可以创建新的轨道。其次,每个轨道首先被初始化为试探性轨道,只有在N次中检测到M次时才被确认。

tracker.assignmentThreshold = 8;细胞与声道之间的最大距离或负对数似然跟踪器。MinNumCellsPerCluster = 6;每个集群创建新曲目的最小网格单元数跟踪器。ClusteringThreshold = 1;%用于聚类的两个单元之间的最小欧氏距离跟踪器。confirationthreshold = [3 4];%确认轨道的阈值跟踪器。DeletionThreshold = [4 4];删除确认曲目的%阈值

您还可以通过指定UseGPU跟踪器的属性。

跟踪器。UseGPU= false;

可视化

本例中使用的可视化是使用帮助器类定义的,helperGridTrackingDisplay的例子。可视化包含三个部分。

  • 地面真相-前视图:这个面板显示了地面真相的前视图,使用了自我车辆的追逐情节。为了强调场景中的动态角色,静态对象以灰色显示。

  • 激光雷达视图:这些面板显示从每个传感器返回的点云。

  • 基于网格的追踪这个面板显示了基于网格的跟踪器输出。轨道以盒子的形式显示,每个盒子都标注了它们的身份。轨道被覆盖在动态网格地图上。根据色轮定义动态网格单元的颜色,色轮代表场景帧中的运动方向。静态网格单元根据占用率使用灰度表示。灰色程度表示网格单元所占空间为自由空间的概率。轨迹的位置在ego车辆坐标系中显示,而速度向量对应于场景框架中轨迹的速度。

显示= helperGridTrackingDisplay;

运行场景和跟踪动态对象

接下来,运行场景,模拟每个激光雷达传感器的激光雷达传感器数据,并使用基于网格的跟踪器处理数据。

%初始化来自每个传感器的pointCloud输出ptClouds=单元(numel(激光雷达),1);sensorConfigs=单元(numel(激光雷达),1);尽管前进(方案)电流模拟时间时间= scenario.SimulationTime;物体相对于自我载体的姿态tgtposs =针织品(例如,Egovehicle);%模拟每个传感器的点云i = 1:numel(lidar) [ptClouds{i}, isValidTime] = step(lidar {i}, tgtpose,time);sensorConfigs{我}= helperGetLidarConfig(激光雷达{},egoVehicle);结束%将点云打包为跟踪器所需的传感器数据格式sensorData = packAsSensorData (ptClouds、sensorConfigs、时间);呼叫追踪者跟踪=追踪(sensorData、sensorConfigs、时间);%更新显示显示(场景、egoVehicle、激光雷达、ptClouds、跟踪器、轨迹);drawnow;结束

结果

接下来,使用本例中使用的可视化分析跟踪器的性能。

基于栅格的跟踪器使用来自估计栅格地图的动态单元来提取对象轨迹。下面的动画显示了此场景中跟踪器的结果。“基于网格的跟踪器”面板显示估计的动态地图以及对象的估计轨迹。它还将安装在ego车辆上的传感器配置显示为蓝色圆形扇区。请注意,这些传感器封装的区域在动态地图中估计为“灰色”,表示该区域未被任何传感器观察到。该补丁还可作为ego车辆在动态网格上位置的指示。

请注意,轨道仅从动态网格单元中提取,因此跟踪器能够过滤静态对象。另请注意,在车辆进入网格区域后,其轨道机构需要几个时间步。这是由于两个主要原因。首先,将细胞分类的建立延迟作为动态。其次,对象的确认阈值采用一些步骤来建立作为确认对象的轨道。

接下来,您将查看几个轨道的历史,以了解轨道的状态如何受到动态网格估计的影响。

纵向移动的轨迹

下面的快照显示了T1表示的轨迹的历史。T1轨道表示在模拟的最初几秒钟内,黄色车辆超过左侧的ego车辆。注意,这条轨迹所占据的网格单元格是红色的,表示它们在正X方向上的运动。航迹利用分配的网格单元的速度分布获取航迹的速度和航向信息。它还使用分配的网格单元格的空间分布来获得它的长度、宽度和方向。默认的TrackUpdateFcn追踪器从每一步关联网格单元的空间分布中提取新的长度、宽度和方向信息。这个效果可以在下面的快照中看到,轨迹的长度和宽度根据相关网格单元格的边界框进行调整。一个额外的滤波方案可以添加使用预测的长度,宽度,和方向的轨道使用自定义TrackUpdateFcn

%显示TrackID = 1的快照也显示了T3和T4等近似的曲目%表示汽车和卡车朝相反方向移动。showSnapshots (display.GridView, 1);

图中包含9个轴对象。标题为TrackID = 1 Time = 1的轴对象1包含一个类型为image的对象。标题为TrackID = 1 Time = 1.5的轴对象2包含一个类型为image的对象。标题为TrackID = 1 Time = 2的轴对象3包含一个类型为image的对象。标题为TrackID = 1 Time = 2.5的轴对象4包含一个类型为image的对象。标题为TrackID = 1 Time = 3的轴对象5包含一个类型为image的对象。标题为TrackID = 1 Time = 3.5的轴对象6包含一个类型为image的对象。标题为TrackID = 1 Time = 4的轴对象7包含一个类型为image的对象。标题为TrackID = 1 Time = 4.5的轴对象8包含一个类型为image的对象。标题为TrackID = 1 Time = 5的轴对象9包含一个类型为image的对象。

showSnapshots (display.GridView 4);

图中包含9个轴对象。轴对象1具有标题RouseDID = 4次= 3包含类型图像的对象。轴对象2带标题RouseDID = 4次= 3.5包含类型图像的对象。轴对象3具有标题RouseDID = 4次= 4包含类型图像的对象。轴对象4具有标题RouseDID = 4次= 4.5包含类型图像的对象。轴对象5具有标题RouseDID = 4次= 5包含类型图像的对象。轴对象6具有标题RouseDID = 4次= 5.5包含类型图像的对象。轴对象7具有标题RouseDID = 4次= 6包含类型图像的对象。轴对象8具有标题RouseDID = 4次= 6.5包含类型图像的对象。轴对象9具有标题RouseDID = 4次= 7包含类型图像的对象。

接下来,深入了解T4的历史。T4轨道表示卡车向自我车辆的相反方向移动。注意,表示这个轨迹的网格单元格是蓝色的,表示估计的网格单元格的运动方向。另外,请注意在跟踪器中有网格单元被误分类为静态(白色)。这些错误分类的网格单元经常发生在传感器报告之前的闭塞区域的目标,因为跟踪器有建立延迟分类这些单元属性。

注意,在时间= 4时,当卡车和车辆彼此接近时,网格单元保持各自的颜色,表示它们估计的速度方向之间的明显差异。这也导致了网格单元与T1和T4的预测轨迹之间的正确数据关联,这有助于跟踪器将它们作为单独的对象进行解析。

横向移动的轨迹

下面的快照为T7所表示的轨迹。这个轨迹表示当自我车辆在十字路口停止时,车辆在横向方向移动。注意,这个轨迹的网格单元格是紫色的,表示负Y方向的运动方向。与其他轨迹类似,轨迹使用分配的网格单元格的空间分布来保持其长度和宽度。

showdnapshots(display.gridview,7);

图中包含9个轴对象。轴对象1带标题RouseDID = 7次= 10包含类型图像的对象。轴对象2具有标题RouseDID = 7次= 10.5包含类型图像的对象。轴对象3带标题RouseDID = 7次= 11包含类型图像的对象。轴对象4具有标题RouseDID = 7次= 11.5包含类型图像的对象。轴对象5具有标题RouseDID = 7次= 12包含类型图像的对象。轴对象6具有标题RouseDID = 7次= 12.5包含类型图像的对象。轴对象7具有标题RouseDID = 7次= 13包含类型图像的对象。轴对象8具有标题RouseDID = 7次= 13.5包含类型图像的对象。轴对象9具有标题RouseDID = 7次= 14包含类型图像的对象。

追踪改变方向

在本例中,您使用了一个带有跟踪器的“恒定速度”模型。这个运动模型假设目标以恒定的速度移动,这意味着恒定的速度和方向。然而,在城市场景中,这种假设通常是不准确的。为了补偿物体的未知加速度,在跟踪器上指定一个过程噪声。下面的快照显示了T2轨道的历史。这个轨迹代表了在自我车辆前面的车辆。注意地面上的事实,这辆车在十字路口右转。

showSnapshots(显示。显示数据表格,2);

图中包含9个轴对象。标题轨迹ID=2时间=6的轴对象1包含图像类型的对象。标题轨迹ID=2时间=6.5的轴对象2包含图像类型的对象。标题轨迹ID=2时间=7的轴对象3包含图像类型的对象。标题轨迹ID=2时间=7.5的轴对象4包含图像类型的对象图像。标题轨迹ID=2时间=8的轴对象5包含图像类型的对象。标题轨迹ID=2时间=8.5的轴对象6包含图像类型的对象。标题轨迹ID=2时间=9的轴对象7包含图像类型的对象。标题轨迹ID=2时间=9.5的轴对象8包含图像类型的对象。标题轨迹ID=2时间=9.5的轴对象9包含图像类型的对象title TrackID=2 Time=10包含类型为image的对象。

注意,与此轨迹相关的网格单元格的颜色从红色变为紫色。此外,颜色的过渡导致一些错误分类的细胞,这可能导致对车辆的长度和宽度的估计很差。跟踪器在车辆上保持跟踪的能力是由于三个主要原因的耦合作用。首先,跟踪器允许指定分配阈值。即使预测的轨迹没有与动态网格单元对齐,它也可以与它们关联到某个阈值。其次,要从保持在阈值之外的网格单元创建一个新的轨道,需要满足最小单元数的标准。第三,跟踪器有一个删除阈值,允许跟踪在删除前滑行几个步骤。如果在转弯过程中网格单元的分类很差,轨迹可以存活几个步骤并重新与网格单元关联。注意,在Track T8中,错误分类的网格单元更容易被观察到,如下图所示。T8轨道代表在十字路口右转前的正Y方向行驶的淡蓝色车辆。 This vehicle was partially occluded before the turn and had another closely traveling vehicle while making the turn.

显示快照(display.GridView,8);

图中包含9个轴对象。标题为TrackID = 8 Time = 8的轴对象1包含一个类型为image的对象。标题为TrackID = 8 Time = 8.5的轴对象2包含一个类型为image的对象。标题为TrackID = 8 Time = 9的轴对象3包含一个类型为image的对象。标题为TrackID = 8 Time = 9.5的轴对象4包含一个类型为image的对象。标题为TrackID = 8 Time = 10的轴对象5包含一个类型为image的对象。标题为TrackID = 8 Time = 10.5的轴对象6包含一个类型为image的对象。标题为TrackID = 8 Time = 11的轴对象7包含一个类型为image的对象。标题为TrackID = 8 Time = 11.5的轴对象8包含一个类型为image的对象。标题为TrackID = 8 Time = 12的轴对象9包含一个类型为image的对象。

总结

在此示例中,您了解了基于网格的跟踪器的基础知识以及如何用于跟踪复杂的城市驾驶环境中的动态对象。您还学习了如何使用来自多个LIDAR传感器的点云来配置跟踪器来跟踪对象。

金宝app支持功能

函数sensorData = packAsSensorData(ptCloud, configs, time)%激光雷达模拟以点云对象的形式返回输出点云的%属性用于提取X,Y和Z位置%返回并将它们打包为跟踪器所需的信息结构。sensoldata = struct(“传感器索引”{},...“时间”,{},...“测量”,{},...“测量参数”, {});i=1:numel(ptCloud)这个传感器的云thisPtCloud = ptCloud {};%允许数据和配置之间的映射,而不强制%静态传感器的有序输入和需要配置输入。sensoldata(i).sensorindex = configs {i} .sensorindex;%当前时间sensorData(我)。时间=时间;%测量为3 × n定义点的位置sensorData(我)。测量=重塑(thisPtCloud.Location [], 3) ';%数据在传感器坐标系中报告,因此进行测量%参数与传感器变换参数相同。sensorData(i).MeasurementParameters=configs{i}.SensorTransformParameters;结束结束函数config=helperGetLidarConfig(激光雷达、ego)定义从传感器到自我的转变senToEgo =结构(“帧”,FusionCoordinationFrameType(1),...“OriginPosition”, (lidar.SensorLocation (:); lidar.Height],...“定位”,rotmat(四元数([lidar.yaw lidar.pitch lidar.roll],“欧勒德”“ZYX”“帧”),“帧”),...“IsParentToChild”,对);定义从自我到跟踪坐标的转换egoToScenario=struct(“帧”,FusionCoordinationFrameType(1),...“OriginPosition”,ego.Position(:),...“定位”,rotmat(四元数([ego.Yaw ego.Pitch ego.Roll],“欧勒德”“ZYX”“帧”),“帧”),...“IsParentToChild”,对);%使用trackingSensorConfiguration进行组装。配置=跟踪传感器配置(...“传感器索引”,lidar.sensorindex,...“IsValidTime”,真的,...“SensorLimits”, (lidar.AzimuthLimits; 0激光雷达。MaxRange),...“SensorTransformParameters”,[senToEgo;egoToScenario],...“DetectionProbability”,0.95);结束

参考文献

Nuss, Dominik等。一种用于实时应用的动态占用网格图的随机有限集方法。国际机器人研究杂志37.8(2018):841-866。

[2] Steyer、Sascha、Georg Tanzmeister和Dirk Wollherr.“基于城市环境中证据动态占用网格的目标跟踪”,《2017年IEEE智能车辆研讨会》(第四期)。IEEE,2017年。