主要内容

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

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

介绍

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

point对象追踪器

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

扩展对象跟踪器

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

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

在本例中,使用trackerGridRFS系统对象™来配置基于网格的跟踪器。该跟踪器使用随机有限集(RFS)公式和Dempster-Shafer近似[1]来估计动态地图。此外,它使用最近邻单元跟踪关联[2]方案来跟踪场景中的动态对象。为了初始化新的轨道,跟踪器使用DBSCAN算法来聚类未分配的动态网格单元。

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

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

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

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

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

设置基于网格的跟踪器

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

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

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

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

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

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

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

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

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

跟踪器使用Dempster-Shafer方法来定义每个单元的占用率。动态网格估计网格占用状态和空闲状态的置信质量。在预测过程中,由于对粒子分布的预测,网格单元的占用置信质量更新。的死亡率控制存活概率( P 年代 ),导致预测过程中占用信度质量的衰减。由于自由信念质量与粒子无关,自由信念质量使用预先指定的常数折现因子衰减。这个折现因子指定了在预测期间自由区域保持自由的概率。

跟踪器。死亡率= 1e-3;%单位时间。转换为Ps = 0.9999为10 Hz跟踪器。FreeSpaceDiscountFactor = 1e-2;%单位时间。换算成10 Hz的折扣因子为0.63 (1e-2^dT)

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

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

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

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

跟踪器。UseGPU= false;

可视化

本例中使用的可视化是使用一个helper类定义的,helperGridTrackingDisplay,附上这个例子。可视化包含三个部分。

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

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

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

display = helperGridTrackingDisplay;

运行场景并跟踪动态对象

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

初始化每个传感器的pointCloud输出ptClouds = cell(数字(激光雷达),1);sensorConfigs = cell(数字(激光雷达),1);推进(场景)%当前模拟时间时间= scenario.SimulationTime;%物体相对于自我载具的姿态tgtpose = targetpose (egoVehicle);模拟来自每个传感器的点云i = 1: nummel (lidar) [ptClouds{i}, isValidTime] = step(lidar {i}, tgtpositions,time);sensorConfigs{i} = helperGetLidarConfig(lidar {i},egoVehicle);结束将点云打包为跟踪器所需的传感器数据格式sensorData = packAsSensorData(ptClouds,sensorConfigs,time);呼叫跟踪器tracks =跟踪器(sensorData,sensorConfigs,time);更新显示显示(场景,egoVehicle,激光雷达,ptClouds,跟踪器,轨道);drawnow;结束

结果

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

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

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

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

纵向移动轨道

下面的快照显示了T1表示的轨道的历史。T1轨道代表在模拟开始的前几秒内超过左侧自我车辆的黄色汽车。注意,该轨道占用的网格单元格是红色的,表示它们在正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的Axes对象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的Axes对象8包含一个image类型的对象。标题为TrackID = 1 Time = 5的坐标轴对象9包含一个image类型的对象。

showSnapshots (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的Axes对象8包含一个image类型的对象。标题为TrackID = 4 Time = 7的坐标轴对象9包含一个image类型的对象。

接下来,仔细看看T4的历史。T4轨道表示与自我车辆相反方向行驶的卡车。注意,表示这条轨迹的网格单元格用蓝色表示,表示网格单元格的估计运动方向。另外,请注意跟踪器错误地将轨道中的网格单元划分为静态(白色)。这些错误分类的网格单元经常发生在传感器报告之前被遮挡的物体区域时,因为跟踪器有一个建立延迟来分类这些网格单元属性。

请注意,在time = 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的Axes对象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的Axes对象8包含一个image类型的对象。标题为TrackID = 7 Time = 14的坐标轴对象9包含一个image类型的对象。

轨道改变方向

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

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的Axes对象8包含一个image类型的对象。标题为TrackID = 2 Time = 10的坐标轴对象9包含一个image类型的对象。

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

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的Axes对象4包含一个image类型的对象。标题为TrackID = 8 Time = 10的坐标轴对象5包含一个image类型的对象。标题为TrackID = 8 Time = 10.5的坐标轴对象6包含一个image类型的对象。标题为TrackID = 8 Time = 11的Axes对象7包含一个image类型的对象。标题为TrackID = 8 Time = 11.5的Axes对象8包含一个image类型的对象。标题为TrackID = 8 Time = 12的坐标轴对象9包含一个image类型的对象。

总结

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

金宝app支持功能

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

参考文献

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

Steyer, Sascha, Georg Tanzmeister和Dirk Wollherr。“基于城市环境中证据动态占用网格的目标跟踪。”2017 IEEE智能汽车学术研讨会(四). IEEE, 2017。