主要内容

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

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

介绍

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

point对象追踪器

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

扩展对象追踪器

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

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

在本例中,使用trackerGridRFS系统对象™配置基于网格的跟踪器。该跟踪器使用具有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财产.当使用真实数据或道路模拟数据时,必须使用点云预处理去除来自地面和其他环境的返回。有关更多信息,请参阅用激光雷达探测地面和障碍物(自动驾驶工具箱)的例子。

建立基于网格的跟踪器

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

效用函数helperGetLidarConfig使用模拟的激光雷达传感器模型并返回其各自的配置。在本例中,通过使用车辆的模拟姿态在全球或世界坐标系中跟踪目标。此信息通常通过惯性导航系统获得。当传感器在场景系统中移动时,其配置必须每次通过将配置指定为跟踪器的输入来更新。

%存储所有传感器的配置sensorConfigs =细胞(元素个数(激光雷达),1);%填写传感器配置i = 1:numel(sensorConfigs) sensorConfigs{i} = helperGetLidarConfig(lidar {i},egoVehicle);结束%创建追踪。您可以在使用跟踪器之前定义属性。追踪= trackerGridRFS (“SensorConfigurations”sensorConfigs,...“HasSensorConfigurationsInput”,真正的);

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

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

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

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

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

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

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

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

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

每个动态网格单元都会考虑与现有轨迹进行分配。如果网格单元和轨迹之间的负对数似然低于指定阈值,则将动态网格单元指定给其最近的轨迹。超出分配阈值的动态网格单元被视为未分配。跟踪器在每一步使用未分配的网格单元来启动新轨迹。由于多个未分配的网格单元可以属于同一个对象轨迹,因此使用DBSCAN聚类算法来辅助此步骤。由于在将单元分类为静态或动态时存在误报,因此跟踪器通过两种方式过滤这些误报。首先,只有未分配的单元形成具有超过指定数量点的簇(MinNumPointsPerCluster)可以创建新的轨道。其次,每个轨道首先被初始化为试探性轨道,只有在N次中检测到M次时才被确认。

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

你也可以通过在GPU上执行动态映射估计来加速模拟UseGPU跟踪器的属性。

跟踪器。UseGPU= false;

可视化

本例中使用的可视化是使用helper类定义的,helperGridTrackingDisplay,随附此示例。可视化包含三个部分。

  • 地面真实-前视图:此面板使用来自ego载体的追逐情节显示地面真实的前视图。为了强调场景中的动态角色,静态对象显示为灰色。

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

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

显示= helperGridTrackingDisplay;

运行场景和跟踪动态对象

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

%初始化来自每个传感器的pointCloud输出ptClouds =细胞(元素个数(激光雷达),1);sensorConfigs =细胞(元素个数(激光雷达),1);推进(场景)电流模拟时间时间= scenario.SimulationTime;物体相对于自我载体的姿态tgtPoses = targetPoses (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车辆上的传感器的配置为蓝色圆形扇区。注意,这些传感器封装的区域在动态地图中被估计为“灰色”,表示该区域没有被任何传感器观察到。这个补丁也可以作为自我车在动态网格中的位置指示。

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

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

纵向移动的轨迹

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

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

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

接下来,仔细查看T4的历史记录。T4轨迹表示与ego车辆相反方向行驶的卡车。请注意,表示此轨迹的网格单元用蓝色表示,表示网格单元的估计运动方向。此外,请注意,轨迹中的网格单元被跟踪器为静态(白色)。当传感器报告对象先前被遮挡的区域时,这些错误分类的网格单元经常发生,因为跟踪器有一个建立延迟来分类这些单元。

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

横向移动的轨迹

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

showSnapshots (display.GridView 7);

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

跟踪改变方向

在本例中,您使用了“恒定速度”带跟踪器的模型。此运动模型假设目标以恒定速度移动,意味着恒定速度和方向。但是,在城市场景中,此假设通常不准确。为了补偿对象的未知加速度,在跟踪器上指定了过程噪声。以下快照显示了轨道T2。该轨道表示ego车辆正前方的车辆。请注意地面事实,该车辆在十字路口右转。

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

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

请注意,与此轨迹相关的网格单元格的颜色从红色变为紫色。此外,颜色的转换会导致一些错误分类的单元格,这可能会导致对车辆长度和宽度的错误估计。跟踪器保持此车辆轨迹的能力是由于三个主要原因的耦合效应。首先,跟踪器允许指定分配阈值。即使预测的轨迹未与动态网格单元对齐,它也可以将它们关联到某个阈值。其次,要从保持在阈值之外的网格单元创建新轨迹,需要满足最小单元数标准。第三,跟踪器具有删除阈值,允许轨迹在删除前滑行几步。如果在转弯过程中网格单元的分类非常差,则轨迹可以存活几步并与网格单元重新关联。请注意,错误分类的网格单元在轨迹T8中更容易观察到,如其历史中所示。T8轨道表示在交叉口右转前沿正Y方向行驶的浅蓝色车辆。该车辆在转弯前部分受阻,转弯时有另一辆近距离行驶的车辆。

showSnapshots (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的对象。

总结

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

金宝app支持功能

作用sensorData = packAsSensorData(ptCloud, configs, time)激光雷达模拟以pointCloud对象的形式返回输出。的位置属性提取点云的x、y、z位置%返回并将它们打包为跟踪器所需的信息结构。sensorData =结构(“SensorIndex”{},...“时间”{},...“测量”{},...“MeasurementParameters”, {});i = 1:元素个数(ptCloud)这个传感器的云thisPtCloud = ptCloud {};%允许数据和配置之间的映射,而不强制%命令输入和静态传感器需要配置输入。sensorData(我)。SensorIndex =款{我}.SensorIndex;%当前时间sensorData(我)。时间=时间;%测量为3 × n定义点的位置sensorData(我)。测量=重塑(thisPtCloud.Location [], 3) ';%在传感器坐标系中报告数据,从而进行测量%参数与传感器变换参数相同。sensorData(我)。MeasurementParameters =款{我}.SensorTransformParameters;结束结束作用config = helperGetLidarConfig(lidar, ego)定义从传感器到自我的转变senToEgo =结构(“框架”fusionCoordinateFrameType (1)...“OriginPosition”, (lidar.SensorLocation (:); lidar.Height],...“定位”rotmat(四元数([激光雷达。偏航激光雷达。Pitch lidar.Roll],“eulerd”“ZYX股票”“帧”),“帧”),...“IsParentToChild”,真正的);%定义从自我坐标到跟踪坐标的转换egoToScenario =结构(“框架”fusionCoordinateFrameType (1)...“OriginPosition”ego.Position (:)...“定位”rotmat(四元数([自我。偏航自我。Pitch ego.Roll],“eulerd”“ZYX股票”“帧”),“帧”),...“IsParentToChild”,真正的);%使用trackingSensorConfiguration进行组装。配置= trackingSensorConfiguration (...“SensorIndex”激光雷达。SensorIndex,...“IsValidTime”符合事实的...“SensorLimits”, (lidar.AzimuthLimits; 0激光雷达。MaxRange),...“传感器参数”(senToEgo; egoToScenario),...“DetectionProbability”, 0.95);结束

参考文献

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

[2] Steyer, Sascha, Georg Tanzmeister和Dirk Wollherr。“基于证据动态占用网格的城市环境目标跟踪”。2017 IEEE智能汽车论坛(第四届)。