主要内容

扩展对象与激光雷达跟踪机场地面监视

围裙是一个定义的区域在机场旨在适应飞机乘客装载或卸载的目的,邮件或货物、燃料、停车或维护[1]。机场围裙围裙的通常是高度动态的和异构环境中人员和车辆在靠近对方。由于这种性质的围裙,它提出了一个更高的地面处理的风险事故飞机以及地面人员。Lidar-based监测系统在围裙已经被提议作为一个有效的方法来改善这种情况的照片,作为衡量减轻高风险围裙[2]。

这个例子向您展示了如何为围裙交通场景模拟激光雷达数据和跟踪地面交通使用GGIW-PHD(伽马高斯逆Wishart博士)扩展对象追踪。

设置场景

在这个示例中,我们模拟一个场景,一架飞机进入门区域。飞机由三个marshaller引导到停车位,一个飞机的两侧,一个在前面。你模拟飞机的停车位附近地面交通。飞机停车后,地面交通以及marshaller开始走向飞机。除了飞机进入门口区域,还模拟两架飞机已经停在门口。在这个例子中使用的场景是由使用跟踪场景设计师并出口到一个MATLAB®函数连接下游功能。在MATLAB指定导出的函数被修改属性为每个平台,完成轨迹场景结束时间。的财产的平台允许您定义一个几何图形的激光雷达仿真平台。在本例中,您指定飞机的几何tracking.scenario.airplaneMesh。场景中的其他对象表示使用长方体。为更多的细节在场景中,如何创建参考createScenario函数结束时,这个例子。

场景= createScenario;

感知的场景中,您使用一个360度的视野激光雷达传感器使用monostaticLidarSensor系统对象™。传感器有64海拔渠道和终端的安装的高度从地面8米。传感器的方位分辨率被定义为0.32度。在这个配置中,传感器产生72000分扫描。这组高分辨率的数据点通常被称为点云。来自传感器的数据由指定模拟5赫兹UpdateRate的传感器。

%建立激光雷达传感器激光雷达= monostaticLidarSensor (“SensorIndex”,1“UpdateRate”5,“之内”,真的,“AzimuthLimits”(-180 180),“ElevationLimits”,-10年[27],“AzimuthResolution”,0.32,“ElevationResolution”,0.5781,“DetectionCoordinates”,“场景”,“MountingLocation”(-15 8),“MountingAngles”(-90 0 0),“MaxRange”,150,“RangeAccuracy”,0.002);%获得终端平台终端= scenario.Platforms {1};%安装平台上的激光雷达终端。传感器=激光雷达;

你可以观察场景,模拟激光雷达数据从鸟瞰以及终端的屋顶下面的动画。点云是用彩色点,颜色变化从蓝色到黄色的高度。注意,激光雷达返回包含地面反射等环境。

你也可以观察动画激光雷达传感器返回多个测量每个对象。传统的多目标跟踪器等trackerGNN(GNN)追踪,trackerJPDA(JPDA)追踪假设每个传感器每个对象一个测量报告。使用常规使用激光雷达跟踪器跟踪对象,从潜在的对象通常是点云预处理和集群到新型的测量。这些新的测量通常定义位置以及空间方面的对象,例如,一个边界框测量。为一个完整的工作流使用传统的追踪器与激光雷达数据,请参考使用激光雷达跟踪车辆:从点云来跟踪列表的例子。此工作流的分段激光雷达数据和集群边界框是容易聚类缺陷,当对象太近。围裙的环境中尤其如此。另一种方法来追踪对象使用激光雷达数据是使用扩展的对象跟踪器。相比传统的追踪器,扩展对象追踪器是用来跟踪对象产生一个以上的每个传感器测量。

设置扩展对象跟踪和性能指标

扩展对象跟踪

在本例中,您使用GGIW(γ高斯逆Wishart)实现的概率假设密度(博士)追踪。这GGIW模型使用三个分布来指定目标模型:一个高斯分布来描述目标的运动学运动中心等它的位置和速度;逆Wishart (IW)分布来描述椭圆目标的程度;一个伽马分布来描述测量的预期目标。为更多的细节在GGIW-PHD过滤器,请参考[3]。

扩展对象博士跟踪器使用分区算法来处理输入测量集。分区算法负责指定多个可能的分割假说传感器测量。随着总假设数量的分割通常是非常大的,近似技术距离分区(见partitionDetections),预测分区和期望最大化(EM) [3]。distance-partitioning算法的工作原理类似于基于距离的聚类技术的差异可能产生多个分区。prediction-partitioning和EM算法使用预测的跟踪测量的对象来协助分区为多个可能的集群。这种技术使用跟踪器的预测是至关重要的,当对象空间上彼此接近,如在围裙的环境。在本例中,您使用一个助手类helperPartitioningAlgorithm使用预测分区测量设置跟踪。利用你获得这些预测predictTracksToTime的函数trackerPHD

%处理对象通过预测跟踪到分区算法瓜分者= helperPartitioningAlgorithm;%将检测函数作为输入并返回分区partitioningFcn = @(检测)partitionDetections(分割者,检测);

要设置一个博士跟踪器,首先定义传感器的配置使用trackingSensorConfiguration对象。你使用模拟激光雷达传感器的属性来指定属性的配置。您还定义了一个函数initFilter初始化一个常速ggiwphd过滤器。这个函数封装在initcvggiwphd并增加伽马分布的确定性和逆Wishart分布的目标。它还配置过滤器工作大量的检测通过指定MaxNumDetections财产ggiwphd过滤器。

%传感器的视场中定义的顺序返回%由传感器的变换函数sensorLimits = [lidar.AzimuthLimits; lidar.ElevationLimits; 0 lidar.MaxRange];%传感器的决议中定义的顺序限制sensorResolution = [lidar.AzimuthResolution; lidar.ElevationResolution lidar.MaxRange];%参数变换状态跟踪的变换函数。trackToSensorTransform =结构(“帧”,“球”,“OriginPosition”lidar.MountingLocation (:)“定位”rotmat(四元数(lidar.MountingAngles“eulerd”,“ZYX股票”,“帧”),“帧”),“IsParentToChild”,真的,“HasVelocity”、假);%函数启动博士过滤器的传感器filterInitFcn = @initFilter;配置= trackingSensorConfiguration (1,“IsValidTime”,真的,%更新与传感器在每个步骤调用“FilterInitializationFcn”filterInitFcn,%函数来初始化一个博士过滤器“SensorTransformFcn”@cvmeas,%转换函数从国家到阿兹,el, r“SensorTransformParameters”trackToSensorTransform,%参数变换函数“SensorLimits”sensorLimits,“SensorResolution”sensorResolution,“DetectionProbability”,0.95%的概率检测目标);

接下来,您组装这些信息并创建一个扩展对象博士跟踪器使用trackerPHD系统对象™。

追踪= trackerPHD (“SensorConfigurations”配置,“PartitioningFcn”partitioningFcn,“AssignmentThreshold”30岁的% -log-likelihood超出一个测量单元初始化新组件“ConfirmationThreshold”,0.9,%阈值调用组件跟踪确认“ExtractionThreshold”,0.75,%阈值调用组件“MergingThreshold”25岁的%阈值合并组件相同的标签“LabelingThresholds”[1.1 0.1 0.05]);%防止track-splitting

指标

接下来,您设置一个GOSPA指标计算器使用trackGOSPAMetric类对跟踪器的性能进行评估。GOSPA指标旨在分析跟踪器的性能提供一个单一的成本价值。低成本的价值代表更好的跟踪性能。使用GOSPA度量,定义距离函数跟踪和真理。这个距离函数计算成本分配一个跟踪和真理。它还可以用于代表本地化或track-level估计的准确性。跟踪和真理之间的距离在这个例子中使用一个定义“自定义”距离函数trackTruthDistance,包括在金宝app支持功能在下面。随着GGIW-PHD跟踪估计几何中心,自定义距离函数使用平台的几何中心的位置定义位置错误。

gospaObj = trackGOSPAMetric (“距离”,“自定义”,“DistanceFcn”,@trackTruthDistance);

您使用一个助手类helperAirportTrackingDisplay地面实况形象化,模拟数据和估计的跟踪。

显示= helperAirportTrackingDisplay;

运行场景和追踪

接下来,您运行场景,模拟返回的激光雷达传感器使用跟踪和处理它们。你也计算轨道的GOSPA度量使用可用的地面实况。这个例子假定激光雷达数据的预处理去除地面激光雷达等环境的回报和终端已经执行。因此,返回从环境中被使用可用的地面实况信息从模拟激光雷达的回报。

%初始化跟踪confTracks = struct.empty (0,1);%地面真理标准平台= scenario.Platforms;trackablePlatforms =平台(cellfun (@ (x) x.ClassID、平台)> 0);%初始化度量值gospaMetrics = 0 (0, 4);%的跟踪记录的MATLAB和墨西哥人numTrackML = 0 (0, 1);%推进情况推进(场景)时间= scenario.SimulationTime;%打电话给lidarDetect终端模拟点云的回报。[ptCloud, ~, groundTruthIdx] = lidarDetect(终端、时间);% objectDetection包返回。包括在支持功能金宝app检测= packAsObjectDetection (ptCloud、groundTruthIdx、时间);%为预测分区提供预测跟踪如果isLocked(跟踪)predictedTracks = predictTracksToTime(追踪,“所有”、时间);瓜分者。PredictedTrackList = predictedTracks;结束%的电话追踪使用检测步骤和时间confTracks =追踪(检测、时间);%计算OSPA规truthStruct = cellfun (@ (x) x.pose trackablePlatforms);[gospa, ~ ~, loc,欢迎,falseT] = gospaObj (confTracks trackablePlatforms);gospaMetrics (+ 1,:) = (gospa loc欢迎falseT);% #好< SAGROW >%更新显示显示(场景、ptCloud confTracks);结束

结果

接下来,评估每个跟踪器的性能使用可视化以及定量指标。下面的动画轨迹由蓝色方块注释他们的身份(TrackID)。T他在对象描述了椭球程度估计的GGIW-PHD过滤器。

跟踪维护

直到飞机停,跟踪器能跟踪所有对象,除了marshaller右边的飞机。这是因为marshaller仍未被发现的传感器在其初始位置。飞机停车后,跟踪器能够对物体的运动估计他们的位置和速度。跟踪器能够保持跟踪所有对象约34秒。之后,左边的marshaller被阻挡在飞机喷气发动机和它的轨道是下降了跟踪器由于多个了。飞机地面交通的方法,跟踪器能跟踪它们作为独立的对象,不混淆他们与另一个的测量。这是可能的,因为预测的跟踪对象协助分区测量设置正确。

你也可以定量分析这个使用GOSPA跟踪器的性能指标及其组件。注意的错误跟踪分量指标仍然是零,这表明没有错误的跟踪确认。非零错过目标组件代表着未被发现的信号员。注意,一旦跟踪建立跟踪对象,该组件会降到零。错过的目标组件再次上升到一个非零值,代表轨道下降由于对象阻塞。

图;订单= [“总GOSPA”,“定位”,“错过了目标”,“假追踪”];我= 1:4 ax =次要情节(2,2,我);情节(gospaMetrics(:,我)“线宽”2);标题(订单(i));包含(“时间”);ylabel (“指标”);网格;结束

图包含4轴对象。总GOSPA坐标轴对象1标题包含一个类型的对象。坐标轴对象2标题定位包含一个类型的对象。坐标轴对象3标题错过目标包含一个类型的对象。坐标轴对象4标题错误跟踪包含一个类型的对象。

Track-level准确性

Track-level准确性指的准确性的估计每个对象的状态,如位置,速度和维度。你可以观察到跟踪躺在地上真理的对象。当对象开始移动,速度矢量绘制,代表了速度方向和大小。注意,估计速度和物体运动方向相同。GGIW-PHD过滤器假定目标分布的测量估计目标的椭圆形。这导致筛选评估对象的大小使用可观察到的或non-occluded区域的对象。注意停地面车辆上的轨道有一个偏移量对可观测的位置。

track-level错误也可以定量估计使用的本地化组件GOSPA指标。GOSPA度量是一个总量指标的组件,因此捕捉定位精度的影响,错过了目标,和假的踪迹。

总结

在这个例子中,您学习了如何围裙场景模拟激光雷达数据和过程扩展对象GGIW-PHD追踪。您还了解了如何使用GOSPA评估跟踪器的性能指标及其相关组件。

金宝app支持功能

packAsObjectDetection

函数检测= packAsObjectDetection (ptCloud groundTruthIdx,时间)%得到x, y, z单元阵列的位置loc = ptCloud {1} ';%点是南反映那些没有与任何光线%的对象nanPoints =任何(isnan (loc), 1);% groundTruthIdx{1}代表点的地面实况。第一个%列表示PlatformID和第二列表示ClassID。% ClassID环境被指定为0。envPoints = groundTruthIdx {1} (:, 2) = = 0;% nanPoints或envPoints删除toRemove = nanPoints | envPoints ';%保持有效的回报loc = loc (:, ~ toRemove);%把每objectDetection返回。n =总和(~ toRemove);%分配内存检测= repmat ({objectDetection ((0, 0, 0),“MeasurementNoise”,1依照*眼(3))},n, 1);%填补测量i = 1: n检测{我}。测量= loc(:,我);结束结束

createScenario

函数场景= createScenario%创建场景场景= trackingScenario;场景。UpdateRate = 0;planeMesh = tracking.scenario.airplaneMesh;%建立平台终端=平台(场景中,“ClassID”,0);终端。尺寸=结构(“长度”,100,“宽度”29岁的“高度”,20岁,“OriginOffset”[0 0 10]);飞机=平台(场景中,“ClassID”,1“网”,planeMesh);飞机。尺寸=结构(“长度”39岁的“宽度”34岁的“高度”,13.4,“OriginOffset”[39/2 0 13.4 / 2]);飞机。{1}=签名rcsSignature (“模式”(20 20;20 20),“方位”(-180 180),“高度”(-90;90),“频率”[0 1 e + 20]);飞机。Trajectory = waypointTrajectory((73.2829 - -80.5669 0;60.7973 - -37.3337 0),[0,11.25]“水平”(8;0),“课程”[106.1085,106.1085],“定位”四元数((106.1085 0 0;106.1085 0 0),“eulerd”,“ZYX股票”,“帧”));delayTrajectory(飞机,0.1,70);地面=平台(场景中,“ClassID”,0);Ground.Trajectory。位置= (0 0 0);地面。尺寸=结构(“长度”,500,“宽度”,500,“高度”,1“OriginOffset”[0 0 -0.5]);飞机=平台(场景中,“ClassID”,1“网”,planeMesh);飞机。尺寸=结构(“长度”现年40岁的“宽度”30岁的“高度”10“OriginOffset”,0 0 5);飞机。{1}=签名rcsSignature (“模式”(20 20;20 20),“方位”(-180 180),“高度”(-90;90),“频率”[0 1 e + 20]);Plane.Trajectory。位置= (-11 -50.3 0);Plane.Trajectory。取向=四元数((90 0 0),“eulerd”,“zyx股票”,“帧”);马歇尔=平台(场景中,“ClassID”6);马歇尔。尺寸=结构(“长度”,0.24,“宽度”,0.45,“高度”,1.7,“OriginOffset”[0 0 0.85]);s = (57.3868 - -25.5244 0; 59.41 - -32.53 0);s2 = (57.3868 - -25.5244 0; 60.5429 - -36.4531 0);马歇尔。Trajectory = waypointTrajectory(s2,[0;8],“课程”(-75;-75),“水平”(0,0),“ClimbRate”(0,0),“定位”四元数((0.793353340291235 0 0 -0.608761429008721;0.793353340291235 0 0 -0.608761429008721]));delayTrajectory(马歇尔,70);Marshall1 =平台(场景中,“ClassID”6);Marshall1。尺寸=结构(“长度”,0.24,“宽度”,0.45,“高度”,1.7,“OriginOffset”[0 0 0.85]);Marshall1。Trajectory = waypointTrajectory([50 -100 0;56.5 - -89.3 0;56.8 - -73.6 0;60.9 - -59.5 0],(0;6.28880678506828;14.2336975651715;38.5523666710762),“课程”,(52.5692412453125;71.0447132029417;101.247131543705;107.567935050594),“水平”,(2;2;2。0),“ClimbRate”,(0,0,0,0),“定位”四元数([0 0 0.581020576363237 0.896605327597113 0 0 0.442830539286162;0.813888868238491;0.634412633965184 0 0 0.772994572985708;0.590831447702589 0 0 0.806795017588522]));delayTrajectory (Marshall1 12 70);Marshall2 =平台(场景中,“ClassID”6);Marshall2。尺寸=结构(“长度”,0.24,“宽度”,0.45,“高度”,1.7,“OriginOffset”[0 0 0.85]);Marshall2。Trajectory = waypointTrajectory((135.1 - -87.7 0;118.3 - -87.7 0;112.2 - -73.3 0;80.8 - -47.6 0],[0,10.3490919743252;18.1872070129823;42),“课程”,(155.957629971433;124.12848387907;114.734795167842;153.606988602699),“水平”,(2;2;2。0),“ClimbRate”,(0,0,0,0),“定位”四元数([0 0 0.581020576363237 0.896605327597113 0 0 0.442830539286162;0.813888868238491;0.634412633965184 0 0 0.772994572985708;0.590831447702589 0 0 0.806795017588522]));delayTrajectory (Marshall2 12 70);装载机=平台(场景中,“ClassID”2);加载程序。尺寸=结构(“长度”10“宽度”4“高度”4“OriginOffset”[0 0 2]);加载程序。Trajectory = waypointTrajectory((25.2 - -42.2 0;39.4500 - -42.3000 0;53.7 - -42.4 0],[0、5、10)“课程”(-0.4021;-0.4021;-0.4021),“定位”(四元数((-0.4021 0 0),“eulerd”,“ZYX股票”,“帧”);四元数([-0.4021 0 0],“eulerd”,“ZYX股票”,“帧”);四元数([-0.4021 0 0],“eulerd”,“ZYX股票”,“帧”)),“水平”(0、5.8、0),“ClimbRate”,(0,0,0));delayTrajectory(装载机、70);Loader2 =平台(场景中,“ClassID”2);Loader2。尺寸=结构(“长度”10“宽度”4“高度”4“OriginOffset”[0 0 2]);Loader2。Trajectory = waypointTrajectory((27.142823040363762 -75 0;42.5614 - -71.9000 0;57.98 - -68.8 0],[0、5、10)“课程”(11.368107148451321;11.368107148451321;11.368107148451321),“定位”四元数((11.368107148451321 0 0;11.368107148451321 0 0;11.368107148451321 0 0],“eulerd”,“ZYX股票”,“帧”),“水平”(0、5.824096001626275、0),“ClimbRate”,(0,0,0));delayTrajectory (Loader2、50、70);功率=平台(场景中,“ClassID”2);权力。尺寸=结构(“长度”5,“宽度”2,“高度”, 1“OriginOffset”[0 0 0.5]);权力。Trajectory = waypointTrajectory((27.2312963703295 - -20.7687036296705 0;40.1656 - -27.6344 0;53.1 - -34.5 0],[0、5、10)“课程”(-27.9596882700088;-27.9596882700088;-27.9596882700088),“定位”(四元数((-27.9596882700088 0 0),“eulerd”,“ZYX股票”,“帧”);四元数([-27.9596882700088 0 0],“eulerd”,“ZYX股票”,“帧”);四元数([-27.9596882700088 0 0],“eulerd”,“ZYX股票”,“帧”)),“水平”(0、5.8574、0),“ClimbRate”,(0,0,0));delayTrajectory(权力,70);汽油加油车=平台(场景中,“ClassID”2);汽油加油车。尺寸=结构(“长度”7“宽度”3,“高度”2,“OriginOffset”,0 0 1);汽油加油车。Trajectory = waypointTrajectory((92.3 - -31.6 0;83.3 - -36.7 0;74.3 - -41.8 0],[0、5、10)“课程”(-150.4612;-150.4612;-150.4612),“定位”(四元数((-150.4612 0 0),“eulerd”,“ZYX股票”,“帧”);四元数([-150.4612 0 0],“eulerd”,“ZYX股票”,“帧”);四元数([-150.4612 0 0],“eulerd”,“ZYX股票”,“帧”)),“水平”(0、4.137825515896000、0),“ClimbRate”,(0,0,0));delayTrajectory(汽油加油车,70);车=平台(场景中,“ClassID”2);的车。尺寸=结构(“长度”,4.7,“宽度”,1.8,“高度”,1.4,“OriginOffset”[0 0 0.7]);的车。Trajectory = waypointTrajectory((111.1 - -44.8 0;93.8100 - -48.1725 0;76.5200 - -51.5450 0],[0、7.046336423986581、14.092672847973162),“课程”(-169.250904745059;-169.250904745059;-169.250904745059),“定位”(四元数((-169.250904745059 0 0),“eulerd”,“ZYX股票”,“帧”);四元数([-169.250904745059 0 0],“eulerd”,“ZYX股票”,“帧”);四元数([-169.250904745059 0 0],“eulerd”,“ZYX股票”,“帧”)),“水平”(0;5。0),“ClimbRate”,(0,0,0));delayTrajectory(车,70);Plane1 =平台(场景中,“ClassID”,1“网”,planeMesh);Plane1。尺寸=结构(“长度”现年40岁的“宽度”30岁的“高度”10“OriginOffset”,0 0 5);Plane1。{1}=签名rcsSignature (“模式”(20 20;20 20),“方位”(-180 180),“高度”(-90;90),“频率”[0 1 e + 20]);Plane1.Trajectory。位置= (110 0 0);Plane1.Trajectory。取向=四元数((180 0 0),“eulerd”,“zyx股票”,“帧”);函数delayTrajectory (tOffset,平台往往)traj = plat.Trajectory;wp = traj.Waypoints;toa = traj.TimeOfArrival;g = traj.GroundSpeed;c = traj.Course;cr = traj.ClimbRate;o = traj.Orientation;往往= max (toa(结束),往往);wp = [repmat (wp (1:), 1, 1), wp; repmat (wp(最终:),1,1)];toa = [0, toa + tOffset;往往]; g = [0;g;0]; c = [c(1);c;c(end)]; cr = [0;cr;0]; o = [repmat(o(1),1,1);o;repmat(o(end),1,1)]; newTraj = waypointTrajectory(wp,toa,;“课程”c“水平”,g,“ClimbRate”、铬、“定位”啊,);平台。Trajectory = newTraj;结束结束

initFilter

函数过滤器= initFilter(变长度输入宗量)%这个函数与跟踪器在两个签名% = initFilter过滤()在预测阶段添加%组件博士学位。%% = initFilter过滤(检测)校正阶段添加%组件的博士学位检测集概率很低%对现有的跟踪。所有检测输入的假设%属于相同的目标。%增加零组件在预测阶段过滤器= initcvggiwphd(变长度输入宗量{:});%如果叫检测如果输入参数个数= = 1%得到预期的大小expSize = filter.ScaleMatrices /(过滤器。DegreesOfFreedom - 4);%景深越高,更高维度的确定景深= 50;过滤器。DegreesOfFreedom =景深;过滤器。ScaleMatrices = (dof-4) * expSize;%得到预期数量的检测expNumDets = filter.Shapes / filter.Rates;%的形状/率^ 2 =不确定性;不确定性= (expNumDets / 4) ^ 2;过滤器。形状= expNumDets ^ 2 /不确定性;过滤器。率= expNumDets /不确定性;结束% GammaForgettingFactors就像过程噪声%对测量速度filter.GammaForgettingFactors (,) = 1.03;%时间衰变就像过程噪声%的维度。低衰减、高方差增加过滤器。TemporalDecay = 500;%指定MaxNumDetections过滤器。MaxNumDetections = 10000;结束

trackTruthDistance

函数dist = trackTruthDistance(跟踪、真理)%的跟踪估计物体的中心。计算原点位置rOriginToCenter =真理{1}.Dimensions.OriginOffset (:);真理腐烂=四元数([{1}.Orientation),“eulerd”,“ZYX股票”,“帧”);真理actPos = {1} .Position (:) + rotatepoint(腐烂,rOriginToCenter ') ';%估计跟踪位置estPos = track.State(1:2:结束);%错误位置之间的距离。dist =规范(actPos (:) - estPos);结束

引用

[1]韦伯,路德维希。国际民航组织。提供法律国际BV, 2017。

[2]Mund,约翰,洛萨Meyer,哈特穆特•Fricke。“激光雷达性能需求和优化传感器定位为点云的风险缓解机场围裙。”第六届国际会议上研究学报》在航空运输。2014年。

[3]Granstrom,卡尔,et al。“使用博士过滤器扩展目标跟踪。”(2012).