主要内容

空中交通管制

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

空中交通管制方案

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

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

%创建跟踪场景场景= trackingScenario;添加一个固定平台的模型ATC塔。塔=平台(场景);

机场监视雷达

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

  • 灵敏度:0 dBsm @ 111公里

  • 机械扫描:只有方位角

  • 机械扫描速率:12.5 RPM

  • 电子扫描:没有

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

  • 方位分辨率:1.4度

  • 距离分辨率:135米

使用上述规格的ASR模型fusionRadarSensor

rpm = 12.5;fov = (1.4; 10);scanrate = rpm * 360/60;%度/秒updaterate = scanrate /视场(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 + 1 e - 3;

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

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

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

%场景持续时间sceneDuration = 60;% s%的入站客机ht = 3 e3;社民党= 900 * 1 e3/3600;% m / swp = [-5e3 -40e3 -ht;-5e3 -40e3+spd*sceneDuration -ht];traj = waypointTrajectory (“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);%出站客机ht = 4 e3;社民党= 700 * 1 e3/3600;% m / swp = [20e3 10e3 -ht;20e3+spd*sceneDuration 10e3 -ht];traj = waypointTrajectory (“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);%切线客机ht = 4 e3;社民党= 300 * 1 e3/3600;% m / swp = [-20e3 -spd*sceneDuration/2 -ht;-20e3 spd*sceneDuration/2 -ht];traj = waypointTrajectory (“锚点”wp,“TimeOfArrival”[0 sceneDuration]);平台(场景中,“轨迹”, traj);

GNN追踪

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

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

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

在地图上可视化

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

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

模拟和跟踪客机

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

设置模拟以雷达的更新速率前进场景。UpdateRate = radar.UpdateRate;创建一个缓冲区来收集雷达全扫描的探测结果。scanBuffer = {};初始化跟踪数组跟踪= objectTrack.empty;为每次扫描保存可视化快照allsnaps = {};scanCount = 0;为可重复的结果设置随机种子s =提高;rng (2020)推进(场景)%更新客机位置plotPlatform (mapview场景。平台([2 3 4]),“TrajectoryMode”“全部”);对雷达当前视场内的目标产生探测。[引爆器,配置]=检测(场景);scanBuffer = (scanBuffer;依据);% #好< AGROW >绘制光束和探测图plotCoverage (mapview coverageConfig(场景)plotDetection (mapview scanBuffer);完成360度扫描时%更新跟踪simTime = scenario.SimulationTime;isScanDone = config.IsScanDone;如果isscanone scanCount = scanCount+1;%更新追踪[痕迹,~,~,信息]=追踪(scanBuffer simTime);清除下次扫描的扫描缓冲区scanBuffer = {};elseifisLocked(跟踪)预测到当前模拟时间的轨迹跟踪= 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公里的速度向北飞行。

图imshow (allsnaps {4});

图imshow (allsnaps {5});

出港客机的航迹状态在第三次扫描结束时滑行,如上图所示,同时显示了该客机的最新探测结果。注意轨迹的不确定性是如何在上一张图中更新后增长的。经过检测更新后的轨迹如下图所示。您会注意到,更新后航迹位置的不确定性降低了。跟踪的不确定性在更新之间增加,并且在使用新的度量更新时减少。你还可以观察到,在第三次更新之后,轨迹位于客机的真实位置之上。

图imshow (allsnaps {6});

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

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

在3D中可视化轨迹,以更好地了解估计的高度。

重新定位和定位相机,以显示地图的3-D性质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)跟踪器,以使用雷达探测跟踪模拟目标。在本例中,您了解了跟踪器基于历史的逻辑如何提升跟踪。您还了解了轨迹的不确定性是如何在轨迹漂移时增加的,以及如何在轨迹被新检测更新时减少的。

支持功能

initFilter

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

函数filter = initFilter(检测)filter = initcvekf(检测);classToUse =类(filter.StateCovariance);客机的飞行速度可达每小时900公里左右。。速度是%初始化为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(scaleaccelerhorz ^2, scaleaccelerhorz ^2, scaleaccelerhorz ^2);过滤器。ProcessNoise =问;结束

tabulateData

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

函数truthTrackTable = tabulateData(场景,曲目)处理真值数据平台= scenario.Platforms(2:结束);1号平台是雷达numPlats =元素个数(平台);trueAlt = 0 (numPlats, 1);trueSpd = 0 (numPlats, 1);trueHea = 0 (numPlats, 1);i = 1:numPlats traj =平台{i}.Trajectory;路点= traj.Waypoints;* = traj.TimeOfArrival;trueAlt (i) =锚点(结束,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 =国防部(trueHea, 360);将跟踪与目标相关联丙氨酸= [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(我);platInd = platID - 1;truthTrack(我:)= ((i)。TrackID, trueAlt(platInd), estAlt(i), trueHea(platInd), esia (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);结束

snapPlotTrack

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

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