主要内容

空中交通管制

本示例展示了如何生成空中交通管制场景,模拟机场监视雷达(ASR)的雷达探测,并配置全局最近邻(GNN)跟踪器来跟踪使用雷达探测的模拟目标。这使您能够评估不同的目标场景、雷达需求和跟踪器配置,而不需要访问昂贵的飞机或设备。这个示例涵盖了整个合成数据工作流。

空中交通管制场景

模拟空中交通管制塔和移动目标平台.场景中平台运动的模拟由trackingScenario

创建一个trackingScenario并将ATC塔添加到场景中。

%创建跟踪场景scenario = trackingScenario;增加一个固定的平台来模拟ATC塔塔=平台(场景);

机场监视雷达

增加一个机场监视雷达(ASR)到ATC塔台。一个典型的空中交通管制塔有一个雷达安装在离地面15米的地方。该雷达以固定速率机械扫描方位角,在ATC塔附近提供360度覆盖。ASR的常见规格如下:

  • 灵敏度:0 dBsm @ 111千米

  • 机械扫描:仅方位扫描

  • 机械扫描速度:12.5 RPM

  • 电子扫描:无

  • 视野:方位角1.4度,仰角10度

  • 方位分辨率:1.4度

  • 距离分辨率:135米

使用上述规格为ASR建模fusionRadarSensor

转速= 12.5;Fov = [1.4;10];扫描速率= rpm*360/60;%度/秒update = scanrate/fov(1);%赫兹雷达= fusionRadarSensor(1,“旋转”...“UpdateRate”updaterate,...%赫兹“FieldOfView”fov,...% [az;el]度“MaxAzimuthScanRate”scanrate,...%度/秒“AzimuthResolution”fov (1),...%度“ReferenceRange”111年e3,...% m“ReferenceRCS”0,...% dBsm“RangeResolution”, 135,...% m“之内”,真的,...“DetectionCoordinates”“场景”);在塔顶安装雷达雷达。MountingLocation = [0 0 -15];塔。传感器=雷达;

倾斜雷达,使其从地平线以上2度开始观测一个区域。为此,启用仰角并设置机械扫描限制,以跨越从地平线以上2度开始的雷达仰角视场。因为trackingScenario使用东北向下(NED)坐标框架,负海拔对应的点高于地平线。

%启用仰角扫描雷达。HasElevation = true;%设置机械仰角扫描从地平线以上2度开始elFov = fov(2);倾斜= 2;%度雷达。机械高度限制= [-fov(2) 0]-tilt;%度

将视场的仰角设置为略大于扫描限制所跨越的仰角。这可以防止光栅扫描的高度和倾斜雷达指向在高度扫描限制的中间。

radar.FieldOfView(2) = elFov+1e-3;

fusionRadarSensor模式范围和高度偏差由于大气折射。这些偏差在低海拔和远距离目标上更加明显。由于折射率随高度变化(减小),雷达信号沿弯曲路径传播。这导致雷达在高于目标真实高度和超出其视距范围的高度上观测目标。

在空中交通管制区增加三架客机。一架飞机从远距离接近空中交通管制中心,另一架离开,第三架正切向塔台飞行。模拟这些飞机在60秒间隔内的运动。

trackingScenario使用东北向下(NED)坐标系。在为下面的航班定义航路点时,z坐标对应于下,因此地面上的高度被设置为负值。

%场景持续时间sceneDuration = 60;% s进港航班百分比Ht = 3e3;SPD = 900*1e3/3600;% m / swp = [-5e3 -40e3 -ht;-5e3 -40e3+spd*sceneDuration -ht];轨迹轨迹(“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);出站客机百分比Ht = 4e3;SPD = 700*1e3/3600;% m / swp = [20e3 10e3 -ht;20e3+spd*sceneDuration 10e3 -ht];轨迹轨迹(“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);%切线客机Ht = 4e3;SPD = 300*1e3/3600;% m / swp = [-20e3 -spd*sceneDuration/2 -ht;-20e3 spd*sceneDuration/2 -ht];轨迹轨迹(“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);

GNN追踪

创建一个trackerGNN根据三架客机的雷达探测结果形成航迹。用完成360度全方位扫描后生成的检测更新跟踪器。

跟踪器使用initFilter金宝app为每个新轨道初始化一个恒速度扩展卡尔曼滤波器的支持函数。initFilter返回的筛选器initcvekf匹配目标速度和跟踪器更新间隔。

跟踪器= trackerGNN(...“作业”“拍卖”...“AssignmentThreshold”, 50岁,...“FilterInitializationFcn”, @initFilter);

在地图上想象

你使用trackingGlobeViewer将结果显示在地图显示的顶部。将塔雷达和跟踪器使用的本地东北向下(NED)坐标系的原点定位在波士顿Logan机场的位置。原点位于北纬42.36306,东经-71.00639,海拔50米。

Origin = [42.366978, - 71.022362,50];mapViewer = trackingGlobeViewer(“ReferenceLocation”起源,...“技术”“streets-dark”);campos(mapViewer, origin + [0 0 1e5]);drawnow;plotScenario (mapview场景);快照(mapview);

模拟和跟踪客机

下面的循环将平台位置向前推进,直到到达场景的末尾。对于该场景中的每一步前进,雷达都会从其视野内的目标生成探测。跟踪器在雷达完成360度方位扫描后更新这些检测。

设置模拟以雷达的更新速度前进场景。UpdateRate = radar.UpdateRate;创建一个缓冲区来收集雷达全面扫描的检测。scanBuffer = {};初始化轨道数组tracks = objectTrack.empty;为每次扫描保存可视化快照Allsnaps = {};scanCount = 0;为可重复的结果设置随机种子S = rng;rng (2020)推进(场景)%更新客机位置plotPlatform (mapview场景。平台([2 3 4]),“TrajectoryMode”“全部”);在雷达当前视场内对目标产生探测。%[dets,config] =检测(场景);scanBuffer = [scanBuffer;dets];% #好< AGROW >绘制光束和探测图plotCoverage (mapview coverageConfig(场景)plotDetection (mapview scanBuffer);* 360度扫描完成时更新跟踪simTime = scenario.SimulationTime;isScanDone = config.IsScanDone;如果isscanone scanCount = scanCount+1;%更新跟踪器[tracks,~,~,info] = tracker(scanBuffer,simTime);为下次扫描清除扫描缓冲区scanBuffer = {};elseifisLocked(跟踪)预测轨道到当前模拟时间跟踪= predictTracksToTime(跟踪器,“确认”, simTime);结束更新映射和快照allsnaps = snapPlotTrack(mapViewer,tracks, isscanone, scanCount, allsnaps);结束allsnaps = [allsnaps,{快照(mapViewer)}];

显示雷达第二次扫描完成时拍摄的第一个快照。

图imshow (allsnaps {1});

上图显示了雷达第二次360度扫描结束时的场景。雷达探测结果显示为淡蓝色圆点,显示了每架模拟客机的情况。在这一点上,跟踪器已经更新了一个完整的雷达扫描。在内部,跟踪器已经初始化了每个航班的轨迹。这些曲目将在扫描后更新后显示,当曲目被提升为确认,满足跟踪器的确认要求2命中3次更新。

接下来的两张快照显示了对出站客机的跟踪。

图imshow (allsnaps {2});

图imshow (allsnaps {3});

上图是雷达第二次扫描后跟踪器更新前后的轨迹图。跟踪器更新之前的图中的检测用于更新和确认先前扫描检测该客机的初始化轨道。下图显示了确认的轨道位置和速度。轨道位置估计的不确定性表示为黄色椭圆。仅经过两次探测,跟踪器就建立了对出港客机位置和速度的准确估计。这架客机的真实高度为4公里,正以每小时700公里的速度向北飞行。

图imshow (allsnaps {4});

图imshow (allsnaps {5});

出站客机的航迹状态会在第三次扫描结束时保持平稳,并在上图中显示出该客机最近的检测结果。请注意轨道的不确定性是如何增长的,因为它是在前一个图中更新的。经过检测更新后的轨迹如下图所示。您注意到,更新后轨道位置的不确定性降低了。跟踪不确定性在更新之间增加,在使用新测量更新时降低。您还可以观察到,在第三次更新之后,轨道位于客机的真实位置之上。

图imshow (allsnaps {6});

最后的图表显示了场景结束时三架客机的航迹状态。这三架客机每架都只有一条航迹。在整个场景期间,为每架客机分配了相同的航迹编号,这表明在场景期间没有任何航迹被丢弃。估计的航迹与客机的真实位置和速度非常吻合。

truthTrackTable = tabulateData(场景,轨道)% #好< NOPTS >
truthTrackTable =3×4表TrackID高度航向速度真估计真估计真估计真估计_______ _________________ _________________ _________________“T1”4000 4051 90 90 700 710“T2”4000 4070 0 359 300 300“T3”3000 3057 0 359 900 908

在3D中可视化轨道,以获得更好的估计高度的感觉。

重新定位和定位相机,以显示3d性质的地图camPosition = origin + [0.367, 0.495, 1.5e4];camOrientation = [235, - 17,0];向西南看去,在地平线以下17度坎波斯(mapview camPosition);camorient (mapview camOrientation);drawnow

下图显示了该场景的3d地图。你可以在白色三角形中看到模拟射流,它们的轨迹被描绘为白线。雷达波束显示为蓝色圆锥体,蓝色圆点表示雷达探测。轨道以黄色、橙色和蓝色显示,它们的信息以各自的颜色列出。由于3d显示的性质,一些标记可能隐藏在其他标记的后面。

你可以在地图上使用以下控件来获得场景的不同视图:

  • 要平移地图,你左键单击鼠标并拖动地图。

  • 要旋转地图,按住ctrl按钮,左键单击鼠标并拖动地图。

  • 要放大或缩小地图,您可以使用鼠标滚轮。

快照(mapview);

总结

本示例展示了如何生成空中交通管制场景,模拟机场监视雷达(ASR)的雷达探测,并配置全局最近邻(GNN)跟踪器来跟踪使用雷达探测的模拟目标。在本例中,您了解了跟踪器基于历史的逻辑如何促进跟踪。您还了解了当轨道被滑行时,轨道不确定性如何增加,而当轨道被新的检测更新时,轨道不确定性如何降低。

金宝app支持功能

initFilter

这个函数修改函数initcvekf来处理更高速度的目标,比如空中交通管制场景中的客机。

函数filter = initFilter(检测)filter = initcvekf(检测);classToUse = class(filter.StateCovariance);客机可以以每小时900公里左右的速度飞行。。速度是%初始化为0,但需要能够快速适应飞机以这样的速度移动。以900 km/h为1个标准差%表示初始化轨道的速度噪声。SPD = 900*1e3/3600;% m / svelCov = cast(spd^2,classToUse);cov = filter.StateCovariance;cov(2,2) = velCov;cov(4,4) = velCov;过滤器。StateCovariance = cov;设置过滤器的过程噪声以匹配过滤器的更新速率scaleAccelHorz = cast(1,classToUse);scaleAccelVert = cast(1,classToUse);Q = blkdiag(scaleAccelHorz²,scaleAccelHorz²,scaleAccelVert²);过滤器。ProcessNoise = Q;结束

tabulateData

这个函数返回一个比较地面真实值和轨道的表

函数truthTrackTable = tabulateData(场景,轨道)处理真值数据平台=场景。平台(2:结束);1号平台是雷达numPlats =数字(平台);trueAlt = 0 (numPlats,1);trueSpd = 0 (numPlats,1);trueHea = 0 (numPlats,1);i = 1:numPlats traj =平台{i}.轨迹;waypoints = traj.Waypoints;times = traj.TimeOfArrival;trueAlt(i) = -waypoints(end,3);trueVel = (waypoints(end,:) - waypoints(end-1,:)) / (times(end)-times(end-1));trueSpd(i) = norm(trueVel) * 3600 / 1000;换算为km/htrueHea(i) = atan2d(trueVel(1),trueVel(2));结束trueHea = mod(trueHea,360);将轨道与目标联系起来atts = [tracks.ObjectAttributes];tgtInds = [ats . targetindex];过程轨迹假设为恒定速度模型numTrks =数字(轨道);estAlt = 0 (numTrks,1);estSpd = 0 (numTrks,1);= 0 (numTrks,1);truthTrack = 0 (numTrks,7);i = 1:numTrks estAlt(i) = -round(tracks(i).State(5));estSpd(i) = round(norm(tracks(i).State(2:2:6)) * 3600 / 1000);%换算为km/h;estHea(i) = round(atan2d(tracks(i).State(2),tracks(i).State(4)));estHea(i) = mod(estHea(i),360);platID = tgtInds(i);platInd = platd - 1;truthTrack(i,:) =[跟踪(i)。TrackID, trueAlt(platInd), estAlt(i), trueHea(platInd), esta (i),...trueSpd (platInd) estSpd (i)];结束在表中组织数据名称= {“TrackID”“TrueAlt”“EstimatedAlt”“TrueHea”“EstimatedHea”“TrueSpd”“EstimatedSpd”};truthTrackTable = array2table(“VariableNames”、名称);truthTrackTable = mergevars(truthTrackTable, (6:7),“NewVariableName”“速度”“MergeAsTable”,真正的);truthTrackTable。(6). properties。变量名= {“真正的”“估计”};truthTrackTable = mergevars(truthTrackTable, (4:5),“NewVariableName”“标题”“MergeAsTable”,真正的);truthTrackTable。(4). properties。变量名= {“真正的”“估计”};truthTrackTable = mergevars(truthTrackTable, (2:3),“NewVariableName”“高度”“MergeAsTable”,真正的);truthTrackTable。(2). properties。变量名= {“真正的”“估计”};truthTrackTable。TrackID =“T”+字符串(truthTrackTable.TrackID);结束

snapPlotTrack

这个功能处理移动相机,拍摄相关快照和更新赛道视觉效果。

函数allsnaps = snapPlotTrack(mapViewer,tracks, isscanone, scanCount,allsnaps)在前4次扫描时保存快照如果isscanone && any(scanCount == [2 3]) newsnap = snapshot(mapViewer);Allsnaps = [Allsnaps, {newsnap}];%移动相机如果scanCount == 2显示出站航班campos(mapViewer, [42.5650 -70.8990 7e3]);drawnow newsnap =快照(mapViewer);Allsnaps = [Allsnaps, {newsnap}];结束结束%更新显示当前轨道位置plotTrack (mapview,跟踪,“LabelStyle”ATC的);如果isscanone && any(scanCount == [2 3])%已确认航迹的快照drawnow newsnap =快照(mapViewer);Allsnaps = [Allsnaps, {newsnap}];将相机视图重置为全场景如果scanCount == 3 origin = [42.366978, - 71.022362,50];campos(mapViewer, origin + [0 0 1e5]);drawnow结束结束结束