空中管制

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

空中交通管制方案

模拟空中交通管制(ATC)塔和移动目标的情况下为平台。该平台的在场景中的运动模拟由管理trackingScenario

创建一个trackingScenario和ATC塔添加到方案。

%创建跟踪方案场景= trackingScenario;增加一个固定平台来模拟空中交通管制塔塔=平台(场景);

机场监视雷达

机场监视雷达(ASR)添加到ATC塔。典型的ATC塔具有雷达安装在地面15米以上。该雷达在方位角以固定的速率机械地扫描,以提供360度覆盖在ATC塔架附近。对于ASR常用规格列:

  • 灵敏度:0 dBsm为单位@111公里

  • 只有方位角:机械扫描

  • 机械扫描率:12.5 RPM

  • 电子扫描:无

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

  • 方位分辨率:1.4度

  • 范围分辨率:135米

使用上述规格型号的ASRmonostaticRadarSensor

rpm = 12.5;fov = (1.4; 10);scanrate = rpm * 360/60;%度/秒updaterate = scanrate / FOV(1);%赫兹雷达= monostaticRadarSensor(1,“肩”...'UpdateRate',updaterate,...%赫兹“FieldOfView”,FOV,...%[AZ; EL]度'MaxMechanicalScanRate',scanrate,...%度/秒'AzimuthResolution',FOV(1),...%度'参考范围',111e3,...%M'ReferenceRCS',0,...%dBsm为单位'RangeResolution',135,...%M'HasINS',真的,...'DetectionCoordinates'“场景”);%安装雷达在塔的顶部radar.MountingLocation = [0 0 -15]。tower.Sensors =雷达;

倾斜雷达,以便它在调查了2度的地平线上方开始的区域。要做到这一点,使抬高并设置机械扫描范围跨越视图开始的雷达高度场在2度在地平线以上。因为trackingScenario采用北 - 东 - 向下(NED)坐标系,负隆起对应于地平线以上的点。

%启用仰角扫描radar.HasElevation = TRUE;%设定机械仰角扫描开始在2度在地平线以上elFov = FOV(2);倾斜= 2;%度radar.MechanicalScanLimits(2,:) = [-fov(2)0] -tilt;%度

设置所述视场标高为比由扫描范围所跨越的海拔稍大。这防止在光栅扫描仰角和倾斜的雷达点的标高扫描范围的中间。

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

monostaticRadarSensor型号范围和高度偏差是由于大气折射。这些偏见成为在低海拔地区,并在远距离目标更加明显。因为折射率改变(减小)与高度,所述雷达信号沿着弯曲路径传播。这导致雷达在海拔它比自己的真实海拔较高的观测目标,并在超出线的视距其射程范围。

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

trackingScenario采用北 - 东 - 下(NED)坐标系。当定义为下面的客机的航点,z坐标对应于下来,所以在地面上方的高度被设定为负值。

情景%的时间sceneDuration = 60;%S%入境客机HT = 3E3;SPD = 900 * 1E3 / 3600;% 多发性硬化症WP = [-5e3 -40e3 -ht; -5e3 -40e3 + SPD * sceneDuration -ht];TRAJ = waypointTrajectory(“路标”,WP,'到达时间',[0 sceneDuration]);平台(的情况下,“轨迹”,TRAJ);%出站客机HT = 4E3;SPD = 700 * 1E3 / 3600;% 多发性硬化症WP = [20e3 10E3 -ht; 20e3 + SPD * sceneDuration 10E3 -ht];TRAJ = waypointTrajectory(“路标”,WP,'到达时间',[0 sceneDuration]);平台(的情况下,“轨迹”,TRAJ);%切线客机HT = 4E3;SPD = 300 * 1E3 / 3600;% 多发性硬化症WP = [-20e3 -spd * sceneDuration / 2 -ht; -20e3 SPD * sceneDuration / 2 -ht];TRAJ = waypointTrajectory(“路标”,WP,'到达时间',[0 sceneDuration]);平台(的情况下,“轨迹”,TRAJ);%创建一个显示器显示的真实,测量和跟踪的位置%客机。[戏剧,无花果] = helperATCExample(“创建显示”,场景);helperATCExample(“更新显示”,戏剧,场景,塔);

GNN跟踪

创建一个trackerGNN以形成从来自三个客机产生的雷达检测轨道。更新与在方位角完整的360度扫描完成后所产生的检测的跟踪器。

跟踪器使用initFilter万博1manbetx支撑功能初始化的等速扩展卡尔曼滤波器对于每一个新的轨道。initFilter修改过滤器的返回initcvekf以匹配目标速度和跟踪更新间隔。

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

仿真和跟踪客机

下面的循环前进的平台位置,直到方案结束时已经达到。对于在场景中的每一步前进,雷达在其视场中生成从目标检测。跟踪器与这些检测更新雷达已完成在方位角360度扫描之后。

%设定模拟预先在雷达的更新率scenario.UpdateRate = radar.UpdateRate;创建一个缓冲区来收集来自雷达全扫描的检测结果scanBuffer = {};%初始化轨道阵列曲目= [];可重复的结果%设置随机数种子RNG(2020)提前(场景)&& ishghandle(图)在雷达当前视场中检测目标[引爆器,配置]=检测(场景);scanBuffer = (scanBuffer;依据);%#确定%更新曲目时,360度扫描完成simTime = scenario.SimulationTime;如果config.IsScanDone%更新跟踪器曲目=跟踪器(scanBuffer,simTime);%清除扫描缓冲下一扫描scanBuffer = {};ELSEIFisLocked(跟踪)%预测轨道当前仿真时间曲目= predictTracksToTime(跟踪器,“证实”, simTime);结束%更新显示与当前的电子束位置,缓冲检测,和%的轨道位置helperATCExample(“拍摄快照”,无花果,场景中,配置);helperATCExample(“更新显示”,戏剧,场景,塔,scanBuffer,轨道);helperATCExample(“拍摄快照”,无花果,场景中,配置);结束helperATCExample(“拍摄快照”,无花果,场景中,配置);

helperATCExample显示在雷达的第二次扫描完成后采取的第一个快照。

helperATCExample(“显示快照”,1);

上图中示出在雷达的第二360度扫描结束的情况。雷达检测,显示为蓝色的点,存在对于每个模拟客机。在这一点上,跟踪器已经通过雷达的一个完整的扫描更新。在内部,追踪器对每个客机的初始化轨道。这些轨道将按照本扫描更新后显示,当轨道被提升到证实,满足2次命中跟踪的确认要求,开出3次更新。

接下来的两个快照显示出飞机的跟踪。

helperATCExample(“显示快照”,[2 3]);

前面的数字显示(左)和(右)雷达的第二次扫描后的跟踪更新后,之前的轨迹图片。在左边的图中的检测来更新和确认前一次扫描的检测该航班初始化轨道。在右侧显示确认轨道的位置和速度的身影。所估计的轨道速度通过从轨道的位置延伸的黑线表示。轨道的位置估计的不确定性被示出为灰色椭圆。只有两个检测后,将跟踪器已经建立的出客机的位置和速度的精确估计。该客机的真实高度是4公里,它是在700公里/小时向东行驶。

helperATCExample(“显示快照”[4 - 5]);

出站客机的轨迹状态沿第三次扫描的末端倾斜,并显示在上图左侧与该客机最近的检测结果一起。注意轨道的不确定性是如何增长的,因为它在之前的数字中被更新。经过检测更新后的轨迹如图所示。您注意到,在更新之后,跟踪位置的不确定性降低了。航迹不确定度在两次更新之间增大,每当用新的测量方法更新时减小。您还可以观察到,在第三次更新后,轨道位于客机的真实位置的顶部。

helperATCExample(“显示快照”,6);

最后的数字显示在场景结束所有三个客机轨道的状态。恰好有一个轨道为三个客机。相同的轨道编号分配给各航空公司为场景的整个过程中,这表明没有这些轨道的场景中被丢弃。估计轨迹紧密地匹配飞机的真实位置和速度。

truthTrackTable = tabulateData(场景,轨道)%#确定
truthTrackTable = 3×4表TrackID高度方向速度真的估计真的估计正确估计_________ _________________ _________________ _________________ T1 4000 3874 90 89 700 710”T2“4000 3977 0 358 300 293 3000 3077 0 0 900 899“T3”

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

广场视图(50,10)XLIM(1E3 * [ -  25 35])ylim(1E3 * [ -  40 20])zlim(1E3 * [ -  6 0])

在地图可视化轨道

在本节中,您将使用helperATCMap可视化上的地图显示的顶部的结果。你位置Logan在波士顿机场的位置使用的塔雷达和跟踪当地东北向下(NED)坐标系的原点。该原点位于42.36306纬度和经度-71.00639 50米的海拔。辅助提供必要的工具来的坐标从NED转换成地球为中心的坐标由地图使用的帧。

重启(情况);原点= [42.366978,-71.022362,50];的MapViewer = helperATCMap(原点);createDisplay(MapViewer的,场景);positionCamera(MapViewer的,原点+ [-0.11 0.1 70000]);

例子中的其余部分重新运行情况,并在地图上显示的结果。

创建一个缓冲区来收集来自雷达全扫描的检测结果scanBuffer = {};%初始化轨道阵列曲目= [];可重复的结果%设置随机数种子RNG(2020)%重置跟踪器复位(跟踪器);推进(场景)& & (mapview)是否是可用的。在雷达当前视场中检测目标[引爆器,配置]=检测(场景);scanBuffer = (scanBuffer;依据);%#确定%更新曲目时,360度扫描完成simTime = scenario.SimulationTime;如果config.IsScanDone%更新跟踪器曲目=跟踪器(scanBuffer,simTime);%清除扫描缓冲下一扫描scanBuffer = {};ELSEIFisLocked(跟踪)%预测轨道当前仿真时间曲目= predictTracksToTime(跟踪器,“证实”, simTime);结束%更新显示与当前的电子束位置,缓冲检测,和%的轨道位置updateDisplay(MapViewer的,场景中,scanBuffer,轨道);结束%重新定位和定向相机,显示地图的3-d性质camPosition =原点+ [-0.5478,0.1%,9866];camOrientation = [0,-10,0];%远眺,16​​度在地平线以下positionCamera (mapview camPosition camOrientation);

下图显示了该方案的一个3-d地图。你可以看到模拟飞机在黄色的三角形与他们的轨迹描绘成黄线。雷达波束被示为蓝色锥体与表示雷达检测蓝点。轨道显示在蓝绿色和他们的信息被列入白名单。由于3 d显示的性质,一些标记可以跟在人家后面隐藏。

您可以使用地图上以下控件来获取场景的不同看法:

  • 要平移地图,你留在鼠标点击和拖动地图。

  • 要旋转地图,按住Ctrl键,你留在鼠标点击和拖动地图。

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

总结

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

万博1manbetx支持功能

initFilter

这个函数修改功能initcvekf处理更高的速度目标,如在ATC方案的客机。

功能滤波器= initFilter(检测)滤波器= initcvekf(检测);classToUse =类(filter.StateCovariance);%客机能够以大约900公里每小时的速度移动。速度是%初始化为0,但将需要能够快速适应%的飞机在这些速度移动。使用900公里每小时为1个标准差%,为初始化轨道的速度噪音。SPD = 900 * 1E3 / 3600;% 多发性硬化症velCov =铸造(SPD ^ 2,classToUse);COV = filter.StateCovariance;COV(2,2)= velCov;COV(4,4)= velCov;filter.StateCovariance = COV;%设置过滤器的过程中噪声匹配滤波器的更新速度scaleAccelHorz =铸造(1,classToUse);scaleAccelVert =铸造(1,classToUse);Q = blkdiag(scaleAccelHorz ^ 2,scaleAccelHorz ^ 2,scaleAccelVert ^ 2);filter.ProcessNoise = Q;结束

tabulateData

该函数返回对比地面实况和轨道表

功能truthTrackTable = tabulateData(场景,轨道)%加工实况数据平台= scenario.Platforms(2:结束);%平台1是雷达numPlats = numel(平台);trueAlt =零(numPlats,1);trueSpd =零(numPlats,1);trueHea =零(numPlats,1);对于i = 1:numPlats traj =平台{i}.轨迹;路点= traj.Waypoints;* = traj.TimeOfArrival;trueAlt (i) =锚点(结束,3);/ (times(end)-times(end-1)); / (times(end)-times(end-1));trueSpd(i) = norm(trueVel) * 3600 / 1000;%转换为公里/小时trueHea(ⅰ)= atan2d(trueVel(1),trueVel(2));结束trueHea = MOD(trueHea,360);将轨迹与目标相关联的ATT = [tracks.ObjectAttributes];tgtInds = [atts.TargetIndex];%加工轨道假定恒定的速度模型numTrks = numel(轨道);estAlt =零(numTrks,1);estSpd =零(numTrks,1);estHea =零(numTrks,1);truthTrack =零(numTrks,7);对于I = 1:numTrks estAlt(ⅰ)= -round(轨道(ⅰ).STATE(5));estSpd(ⅰ)= ROUND(范数(轨道(ⅰ).STATE(2:2:6))* 3600/1000);%转换为km/h;estHea(ⅰ)= ROUND(atan2d(轨道(ⅰ).STATE(2),轨道(ⅰ).STATE(4)));estHea(ⅰ)= MOD(estHea(i)中,360);platID = tgtInds(ⅰ);platInd = platID  -  1;truthTrack(I,:) = [轨道(ⅰ).TrackID,trueAlt(platInd),estAlt(i)中,trueHea(platInd),estHea(i)中,...trueSpd(platInd),estSpd(I)];结束%整理在表中的数据名称= {'的TrackID'“TrueAlt”'EstimatedAlt''TrueHea''EstimatedHea''TrueSpd''EstimatedSpd'};truthTrackTable = array2table (truthTrack,'VariableNames',名);truthTrackTable = mergevars(truthTrackTable,(6:7),'NewVariableName''速度''MergeAsTable',真正的);truthTrackTable。(6).Properties.VariableNames = {'真正'“估计”};truthTrackTable = mergevars(truthTrackTable,(4:5),'NewVariableName''标题''MergeAsTable',真正的);truthTrackTable。(4).Properties.VariableNames = {'真正'“估计”};truthTrackTable = mergevars(truthTrackTable,(2:3),'NewVariableName''高度''MergeAsTable',真正的);truthTrackTable。(2). properties。VariableNames = {'真正'“估计”};truthTrackTable.TrackID =“T”+串(truthTrackTable.TrackID);结束