主要内容

空中管制

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

空中交通管制方案

在场景中模拟空中交通管制(ATC)塔台和移动目标为平台.该方案中平台的运动仿真由跟踪Cenario

创建一个跟踪Cenario并将空中交通管制塔添加到场景中。

%创建跟踪方案场景=跟踪Cenario;%添加一个固定平台来模拟ATC塔塔=平台(场景);

机场监视雷达

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

  • 灵敏度:0 dBsm @ 111公里

  • 机械扫描:方位扫描

  • 机械扫描速率:12.5 rpm

  • 电子扫描:无

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

  • 方位角分辨率:1.4°

  • 距离分辨率:135米

根据上述规格,使用Fusionradarsensor.

rpm = 12.5;foV = [1.4; 10];ScanRate = RPM * 360/60;%deg / supdaterate = scanrate /视场(1);%赫兹雷达= fusionRadarSensor (1,“旋转”...'updaterate',updaterate,...%赫兹'fieldofview',fov,...% (az; el)度'maxazimuthscanrate'scanrate,...%deg / sec'azimuthresolution',fov(1),...%deg.'参考范围',111e3,...% m“ReferenceRCS”0,...% dBsm“RangeResolution”, 135,...% m'hasins', 真的,...'检测''设想');在塔顶安装雷达雷达。安装位置= [0 0 -15];塔。传感器=雷达;

倾斜雷达,使其在地平线上方的2度开始调查区域。为此,请启用高程并设置机械扫描限制,以跨越雷达的高程视野在地平线上方的2度开始。因为跟踪Cenario使用东北向下(NED)坐标系,负高度对应于地平线以上的点。

%启用高程扫描Radar.haselevation = True;%设置机械高程扫描以在地平线上方的2度开始elFov = fov (2);倾斜= 2;%deg.Radar.MechanicalElevationLimits = [-fov(2)0] -ttilt;%deg.

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

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

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

在ATC控制扇区内添加三个客机。一个客机从漫长的范围内接近ATC,另一个离开,第三个是飞向塔的切向。在60秒间隔内模拟这些客机的运动。

跟踪Cenario使用一个东北-向下(NED)坐标框架。当为下面的航线定义航路点时,z坐标对应向下,因此离地面的高度设置为负值。

%持续时间sceneDuration = 60;% s%入学客机ht = 3 e3;社民党= 900 * 1 e3/3600;% m / sWp = [-5e3 -40e3 -ht; -5e3 -40e3 + spd * scenedion -ht];traj = waypointTrajectory ('waypoints'wp,'抵达时间',[0 sceneduration]);平台(场景,'弹道', traj);%出境客机ht = 4 e3;社民党= 700 * 1 e3/3600;% m / swp = [20e3 10e3 -ht;20e3+spd*sceneDuration 10e3 -ht];traj = waypointTrajectory ('waypoints'wp,'抵达时间',[0 sceneduration]);平台(场景,'弹道', traj);百分比平等机构ht = 4 e3;社民党= 300 * 1 e3/3600;% m / swp = [-20e3 -spd*sceneDuration/2 -ht];traj = waypointTrajectory ('waypoints'wp,'抵达时间',[0 sceneduration]);平台(场景,'弹道', traj);

GNN追踪

创建一个Trackergnn.从三类客机产生的雷达检测中形成曲目。使用在方位角的完整360度扫描完成后生成的检测器更新跟踪器。

追踪器使用initFilter金宝app支持功能初始化每个新轨道的恒定速度扩展卡尔曼滤波器。initFilter修改返回的过滤器initcvekf以匹配目标速度和跟踪器更新间隔。

追踪= trackerGNN (...'任务'“拍卖”...“AssignmentThreshold”,50,...“FilterInitializationFcn”, @initFilter);

在地图上形象化

你用trackingglobeviewer.在地图显示的顶部可视化结果。您将塔雷达和跟踪仪在波士顿洛根机场的位置定位塔雷达和跟踪器所使用的当地向东(NED)坐标系的起源。原产地位于42.36306纬度和-71.00639经度,海拔50米。

来源= [42.366978,-71.022362,50];MapViewer = trackingglobeviewer(“ReferenceLocation”起源,...“技术”“streets-dark”);Campos(MapViewer,Origin + [0 0 1E5]);drawnPlotscenario(MapViewer,方案);快照(MapViewer);

模拟和跟踪客机

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

%设置模拟以雷达的更新速度前进场景。UpdateRate = radar.UpdateRate;%创建缓冲区以从雷达的完整扫描中收集检测scanBuffer = {};%初始化轨道数组曲目= ObjectTrack.empty;%保存每次扫描的可视化快照ALLSNAPS = {};scancount = 0;%为可重复的结果设置随机种子S = RNG;RNG(2020)尽管前进(方案)%更新航班位置plotPlatform (mapview场景。平台([2 3 4]),“TrajectoryMode”“全部”);%在雷达当前视野中的目标上生成检测[DETS,CONFIG] =检测(方案);scanbuffer = [scanbuffer; dets];%#OK %绘图波束和检测plotCoverage (mapview coverageConfig(场景)plotDetection (mapview scanBuffer);当360度扫描完成时%更新曲目SIMTIME =场景.simulationtime;iscandone = config.isscandone;如果isScanDone scanCount = scanCount+1;%更新跟踪器[曲目,〜,〜,INFO] =跟踪器(ScanBuffer,SIMTEME);%为下一次扫描清除扫描缓冲区scanBuffer = {};elseif陷入困境(跟踪器)预测轨道到当前模拟时间跟踪= predictTracksToTime(追踪,“确认”,simtime);结束%更新地图并拍摄快照allsnaps = snapPlotTrack(mapViewer,tracks,isScanDone, scanCount, allsnaps);结束Allsnaps = [Allsnaps,{Snapshot(MapViewer)}];

显示雷达第二扫描完成时采取的第一个快照。

图imshow (allsnaps {1});

前图显示了雷达第二次360度扫描结束时的场景。显示为浅蓝色点的雷达检测适用于每个模拟的客机。此时,跟踪器已经通过雷达的一个完整扫描更新。在内部,跟踪器为每个客机有初始化的曲目。这些曲目将在此扫描后更新后显示,当促进轨道确认时,会满足跟踪器的确认要求2个命中率为3更新。

接下来的两张快照显示了出站航班的跟踪情况。

图imshow (allsnaps {2});

图imshow (allsnaps {3});

上一页在雷达第二扫描后跟踪器更新之后,先前的图显示了曲目图像。在跟踪器更新之前的图中检测用于更新并确认从先前的扫描对此客机的检测中初始化的曲目。下图显示了确认的轨道的位置和速度。轨道位置估计的不确定性显示为黄色椭圆。在只有两个检测之后,跟踪器已经建立了对出站客机位置和速度的准确估计。客机的真正高度是4公里,它以700 km / hr为北方旅行。

图imshow (allsnaps {4});

数字imshow(Allsnaps {5});

出站客机轨道的状态沿着第三次扫描结束,并在上面的图中显示以及均最新的客机检测。请注意,曲目如何不确定性已经增长,因为它在上一个数字中更新了。通过检测更新后的曲目显示在下一个数字中。您注意到更新后轨道位置的不确定性降低。轨道不确定性在更新之间生长,并且只要使用新的测量更新时都会减少。您还观察到第三次更新后,赛道位于客机的真实位置之上。

图imshow (allsnaps {6});

最后一个图显示了场景末尾所有三架飞机的轨道状态。这三架飞机各有一条轨道。在整个场景期间,每个航班都被分配了相同的轨道号码,这表明在场景期间没有任何轨道被丢弃。估计的轨迹与飞机的真实位置和速度非常吻合。

truthTrackTable = tabulateData(场景,轨迹)% #好< NOPTS >
真相触发=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的曲目以获得更好的估计高度感。

重新定位和定位相机,以显示3-D性质的地图露营=起源+ [0.367,0.495,1.5E4];CamoInientation = [235,-17,0];百分比向西向西,17度以下地平线坎波斯(mapview camPosition);camorient (mapview camOrientation);drawnow

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

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

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

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

  • 要缩放地图,请使用鼠标滚轮。

快照(MapViewer);

概括

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

金宝app支持功能

initFilter

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

功能filter = initcvekf(检测);classToUse =类(filter.StateCovariance);%客机可以以900 km / h左右的速度移动。速度是%初始化为0,但需要能够快速适应%飞机以这些速度移动。使用900 km / h作为1标准偏差初始化轨道的速度噪声的%。社民党= 900 * 1 e3/3600;% m / svelCov =投(社民党^ 2,classToUse);x = filter.StateCovariance;浸(2,2)= velCov;浸(4,4)= velCov;过滤器。StateCovariance =浸;设置过滤器的处理噪声以匹配过滤器的更新速率scaleAccelHorz =投(1、classToUse);scaleAccelVert =投(1、classToUse);Q = blkdiag(scaleAccelHorz^2, scaleAccelHorz^2, scaleAccelVert^2);过滤器。ProcessNoise =问;结束

tabulateData

这个函数返回一个比较ground truth和track的表

功能truthTrackTable = tabulateData(场景,轨迹)%处理真理数据平台= scenario.Platforms(2:结束);%平台1是雷达numplats = numel(平台);truealt =零(numplats,1);truespd =零(numplats,1);Truehea = Zeros(Numplats,1);i = 1:numplats traj = platforms {i} .traptory;waypoints = traj.waypoints;时代= traj.timeofarrival;truealt(i)=  -  WAYPOINTSS(结束,3);truevel =(waypointss(结束,:)  - 航点(结束-1,:))/(次(结束) -  itimes(结束-1));truespd(i)= norm(truevel)* 3600/1000;%转换为km / htrueHea (i) = atan2d (trueVel (1) trueVel (2));结束Truehea = Mod(Truehea,360);%与目标关联曲目ATTS = [tracks.ObjectAttributes];tgtinds = [atts.targetIndex];假设恒定速度模型的过程轨迹numTrks =元素个数(跟踪);estAlt = 0 (numTrks, 1);estSpd = 0 (numTrks, 1);estHea = 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) =圆(atan2d(跟踪(i) .State(2),追踪(i) .State (4)));estHea (i) =国防部(estHea(我),360);platID = tgtInds(我);platID = 1;truthTrack(我:)= ((i)。TrackID, trueAlt(platInd), estAlt(i), trueHea(platInd), estHea(i),...Truespd(Platind),ESTSPD(I)];结束%组织表中的数据名称= {“TrackID”'truealt''估计''真正''估计]“TrueSpd”“EstimatedSpd”};truesttracktable = array2table(litthtrack,“VariableNames”、名称);truthTrackTable = mergevars(truthTrackTable, (6:7),'newvariablename'“速度”“MergeAsTable”,真正的);truthTrackTable。(6). properties。VariableNames = {“真正的”'估计的'};truthTrackTable = mergevars(truthTrackTable, (4:5),'newvariablename'“标题”“MergeAsTable”,真正的);真实的。(4).properties.variablenames = {“真正的”'估计的'};truthTrackTable = mergevars(truthTrackTable, (2:3),'newvariablename'“高度”“MergeAsTable”,真正的);真相。(2).properties.variablenames = {“真正的”'估计的'};truesttracktable.trackid =.“t”+字符串(truthTrackTable.TrackID);结束

snapPlotTrack

这个函数处理移动相机,拍摄相关的快照和更新轨迹视觉。

功能allsnaps = snapPlotTrack(mapViewer,tracks,isScanDone, scanCount,allsnaps)%在前4次扫描期间保存快照如果isScanDone && any(scanCount == [2 3]) newsnap = snapshot(mapViewer);Allsnaps = [Allsnaps,{newsnap}];%移动相机如果scancount == 2%显示出出境的客机Campos(MapViewer,[42.5650 -70.8990 7e3]);rawingow newsnap =快照(MapViewer);Allsnaps = [Allsnaps,{newsnap}];结束结束%更新显示与当前轨道位置plotTrack (mapview,跟踪,“LabelStyle”'ATC');如果isScanDone && any(scanCount ==[2 3]) / /删除所有的scanCount对已确认的轨道进行快照rawingow newsnap =快照(MapViewer);Allsnaps = [Allsnaps,{newsnap}];%重置相机视图到完整场景如果scancount == 3原产= [42.366978,-71.022362,50];Campos(MapViewer,Origin + [0 0 1E5]);drawnow结束结束结束