主要内容

以地球为中心的飞行模拟与跟踪

这个例子向您展示了如何使用以地球为中心的trackingScenario和一个geoTrajectory对象来模拟跨越数千公里的飞行轨迹。您使用两种不同的模型来生成飞机的合成探测:单站雷达和ADS-B报告。您使用多目标跟踪器来估计飞机轨迹,比较跟踪性能,并探索ADS-B对整体跟踪质量的影响。

在美国,联邦航空管理局(FAA)负责整个国家领空每天数千次航班的监管。商业航班通常会一直被跟踪,从起飞机场到抵达机场。空中交通管制系统是一个复杂的多层系统。机场管制塔负责监视和处理机场附近的情况,而空中航线交通管制中心(ARTCC)负责在构成国家空域的各个地区进行远程空中监视。

在过去的几十年里,空中交通/监视雷达的能力和复杂性显著增加。飞机上的应答器增加了雷达设备和飞机之间的双向通信,允许非常准确的位置估计和有利于控制中心的决策。到2020年,所有飞行在10,000英尺以上的飞机都必须配备自动相关监视广播(ADS-B)应答器,以广播飞机上的估计位置。此信息由空中交通管制中心接收和处理。

创建一个途中空中交通场景

首先创建一个以地球为中心的场景。

保存当前随机发电机状态S = rng;为可预测的结果设置随机种子rng (2020);%创建场景scene = trackingScenario(“IsEarthCentered”,真的,“UpdateRate”1);

定义飞机模型和飞行轨迹

的matfileflightwaypoints本例附件包含从威奇托到芝加哥的飞行轨迹的合成坐标和时间信息。你使用geoTrajectory对象来创建飞行轨迹。

负载(“flightwaypoints.mat”) flightRoute =地理轨迹(lla,到达时间);飞机=平台(场景,“轨迹”, flightRoute);

现在,商用飞机都装有GPS接收器。作为ADS-B的骨干,车载GPS的精度可以设置为符合ADS-B的要求。ADS-B中用于位置和速度的导航精度类别分别称为NACp和NACv。根据FAA规则[1],NACp必须小于0.05海里,NACv必须小于每秒10米。在本例中,使用agpsSensor型号具有50米的位置精度和10米/秒的速度精度来配置adsbTransponder模型。您还为飞机使用了更真实的RCS签名,灵感来自波音737。

posAccuracy = 50;%米velAccuracy = 10;% m / sgps = gpsSensor(“PositionInputFormat”“大地”“HorizontalPositionAccuracy”posAccuracy,...“VerticalPositionAccuracy”posAccuracy,“VelocityAccuracy”10);adsbTx = adsbTransponder(“MW2020”“UpdateRate”, 1“全球定位系统”全球定位系统(gps),“类别”, adsbCategory.Large);负载(737 rcs.mat);飞机。签名{1}= boeing737rcs;

沿途增加监视站

美国联邦航空局使用的远程监视雷达有几种型号。航路监视雷达4号(ARSR-4)是20世纪90年代推出的一种雷达,可以在250海里(463公里)的远距离内提供任何1平方米物体的3D回波。大多数ARSR-4雷达位于美国大陆边界,而距离稍近的雷达则主要位于美国联邦航空局在美国大陆的雷达站点。在本例中,单个雷达类型的建模遵循ARSR-4的常见规格,如下所示:

  • 更新速度:12秒

  • 最大射程(1平方米目标):463公里

  • 距离分辨率:323米

  • 射程精度:116米

  • 方位视野:360度

  • 方位分辨率:1.4度

  • 方位精度:0.176度

  • 高度精度:900米

为每个雷达站点添加一个平台。这些平台的RCS签名设置为 - 50分贝以避免产生不必要的雷达回波。

默认情况下,雷达探测报告在雷达安装平台主体框架中,在本例中,雷达安装平台主体框架是每个雷达站位置的本地东北下框架。但是,在本例中,您设置了DetectionCoordinates财产场景以便在地球中心地球固定(ECEF)框架中输出探测,这允许跟踪器在一个公共框架中处理来自不同雷达站点的所有探测。

模拟一个ARSR-4雷达Updaterate = 1/12;Fov = [360;30.001];elAccuracy = atan2d(0.9,463);% 900m精度@最大范围elBiasFraction = 0.1;arsr4 = fusionRadarSensor(1,“UpdateRate”updaterate,...“FieldOfView”, 360;30.001),...“HasElevation”,真的,...“ScanMode”“机械”...“MechanicalAzimuthLimits”360年[0],...“MechanicalElevationLimits”(-30 0),...“之内”,真的,...“HasRangeRate”,真的,...“HasFalseAlarms”假的,...“ReferenceRange”, 463000,...“ReferenceRCS”0,...“RangeLimits”, [0 463000],...“AzimuthResolution”, 1.4,...“AzimuthBiasFraction”, 0.176/1.4,...“ElevationResolution”elAccuracy / elBiasFraction...“ElevationBiasFraction”elBiasFraction,...“RangeResolution”, 323,...“RangeBiasFraction”, 116/323,...精确度/分辨率“RangeRateResolution”, 100,...“DetectionCoordinates”“场景”);在每个ARTCC站点添加ARSR-4雷达radarsitesLLA = [41.4228 -88.0583 0;...40.6989 -89.8258 0;...39.2219 -95.2461 0];I =1:3雷达=克隆(arsr4);雷达。SensorIndex = i;平台(场景,“位置”radarsitesLLA(我,:)...“签名”rcsSignature (“模式”, -50),“传感器”,{雷达});结束

你使用adsbReceiver模拟ADS-B信息的接收。ADS-B信息包含飞机自身GPS仪器测量的位置。信息通常被编码并在1090mhz频道上广播,以供附近的ADS-B接收器接收。在每个监测站周围定义200公里的接收范围。在本例中,假设监控站之间有完美的通信。因此,中央接收器在至少一个电台的范围内接收广播的ADS-B消息。

定义中央adsbReceiveradsbRx = adsbReceiver(“ReceiverIndex”2);adsbRange = 2e5;

想象场景

你可以使用trackingGlobeViewer显示地球上的平台、轨迹、探测和轨道。

查看器= trackingGlobeViewer(“技术”“streets-dark”...“TrackLabelScale”, 1.3,“TrackHistoryDepth”, 4000,...“CoverageMode”“报道”);%显示雷达站点plotPlatform(观众,scene.Platforms(2:结束);显示雷达覆盖范围covcon = coverageConfig(场景);covcon plotCoverage(查看器,“ECEF”“α”, 0.1);%显示飞行路线plotTrajectory(观众、flightRoute);

RadarCone.png

监视雷达有一个天线盲锥,有时被称为“沉默锥”。这是一大片位于雷达正上方的空间,由于天线扫描的限制,它无法被监视。在雷达网络中重叠覆盖是一种常见的缓解盲锥区域的策略。然而,使用重叠策略,仍然可能存在网络无法完全覆盖的区域。在这个例子中,最南端雷达的沉默锥(上图中橙色部分所示)只被网络中相邻雷达的部分覆盖。这就产生了一个盲点,任何雷达都不会发现飞机。

定义一个中央雷达跟踪器和一个跟踪引信器。

通常,一个ARTCC维护其监视区域内所有对象的跟踪,并在对象飞进新区域时将跟踪信息传递给下一个ARTCC。在本例中,您为所有雷达定义了一个集中跟踪器。你使用trackerGNN对象来融合来自多个雷达的飞机雷达探测。

radarGNN = trackerGNN(“TrackerIndex”, 1...“MaxNumTracks”, 50岁,...“FilterInitializationFcn”@initfilter,...“ConfirmationThreshold”[3 - 5],...“DeletionThreshold”, 5 [5],...“AssignmentThreshold”2000年[250]);

您还将雷达轨迹与ADS-B接收机获得的ADS-B轨迹融合。为此,需要配置一个中心trackFuser对象。你设置ConfirmationThreshold而且DeletionThreshold以考虑ADS-B接收器频率1hz与雷达追踪器频率1/ 12hz之间的更新速率差异。为了允许至少两条雷达轨迹被分配到一个中心轨迹,命中次数必须至少为 2 × 12

fuser = trackFuser(“FuserIndex”3,“MaxNumSources”,2,...“AssignmentThreshold”(250 500),...“StateFusion”“十字路口”...“StateFusionParameters”“跟踪”...“ConfirmationThreshold”(2 3 * 12),...“DeletionThreshold”4 [4] * 12);

使用雷达和ADS-B跟踪航班

在本节中,您将模拟该场景,并对雷达跟踪器、跟踪引信器、ADS-B应答器和接收机进行步骤操作。

声明一些变量detBuffer = {};radarTrackLog = {};fusedTrackLog = {};adsbTrackLog = {};图片= {};snapTimes = [84,564, 1128,2083];跟踪标签和颜色adsblabel =“ads - b”;radarlabel =“雷达”;Fusedlabel = string(sprintf(“% s \ n”""“融合”));Adsbclr = [183 70 255]/255;Radarclr = [255 255 17]/255;Fusedclr = [255 105 41]/255;advance(scene) time = scene. simulationtime;飞机在地球上的最新位置plotPlatform(观众、飞机、“TrajectoryMode”“没有”);生成并绘制合成雷达探测图[dets, configs] =检测(场景);dets = postProcessDetection(dets);detBuffer = [detBuffer;依据);% #好< AGROW >detBuffer plotDetection(查看器,“ECEF”);%的踪迹adsbTracks = objectTrack.empty;radarTracks = objectTrack.empty;fusedTracks = objectTrack.empty;生成ADS-B消息truePose =姿态(飞机,“真正的”“CoordinateSystem”“大地”);adsbMessage = adsbTx(true姿态。位置,truePose.Velocity);%讯息可在每个监视站的范围内接收如果isWithinRange (radarsitesLLA truePose。adsbTracks = adsbRx(adsbMessage,时间);结束扫描结束时更新雷达跟踪器如果all([config . isvalidtime]) && (~isempty(detBuffer) || isLocked(radarGNN)) radarTracks = radarGNN(detBuffer,time);detBuffer = {};结束%保险丝轨道如果isLocked(fuser) || ~isempty([adsbTracks;radarTracks]) fusedTracks = fuser([adsbTracks;radarTracks],时间);结束% plot只跟踪雷达扫描一次如果all([config . isvalidtime]) labels = [repmat(adsblabel,1,numel(adsbTracks)),...repmat (radarlabel 1元素个数(radarTracks)),...repmat (fusedlabel 1元素个数(fusedTracks)));colors = [repmat(adsbclr, numel(adsbTracks), 1);...repmat(radarclr, numel(radarTracks), 1);...repmat(fusedclr, numel(fusedTracks), 1)];plotTrack(观众[adsbTracks;radarTracks;fusedTracks),“ECEF”...“LabelStyle”“自定义”“CustomLabel”、标签“颜色”、颜色、...“线宽”3);结束记录估计的飞机数据fusedTrackLog = [fusedTrackLog, {fusedTracks}];% #好< AGROW >radarTrackLog = [radarTrackLog, {radarTracks}];% #好< AGROW >adsbTrackLog = [adsbTrackLog, {adsbTracks}];% #好< AGROW >移动相机并拍摄快照images = moveCamera(查看器,飞机,时间,snapTimes,图像);结束
图imshow(图片{1});

图中包含一个轴对象。axis对象包含一个image类型的对象。

在场景开始时,飞机远离最南端的监测站,没有发送ADS-B消息。结果,飞机只能被雷达追踪。请注意,ARSR检测在高度上相对不准确,这通常是可以接受的,因为空中交通管制员将飞机水平分开,而不是垂直分开。最不准确的探测是由位于较远距离的雷达站点产生的。尽管如此,这些探测还是与轨道有关。图中,白线代表真实弹道,黄线代表雷达跟踪器估计的弹道。飞行的第一段距离远离任何雷达,相应的探测有很高的测量噪声。此外,匀速运动模型不能很好地模拟起飞后初始飞行转弯的运动。雷达航迹被传递给熔断器,熔断器输出一个被熔断的航迹,显示为橙色,紧紧跟随雷达航迹。融合航迹不同于雷达航迹,因为融合器将其自身的过程噪声添加到航迹状态。

图像图imshow ({2});

图中包含一个轴对象。axis对象包含一个image类型的对象。

在上面的快照中,飞机在ADS-B通信范围内,并建立了新的ADS-B航迹。熔丝机对这条新轨道进行了加工,提高了熔丝轨道的精度。

{3}图imshow(图像);

图中包含一个轴对象。axis对象包含一个image类型的对象。

在上面的快照中,飞机进入了沉默的锥。雷达跟踪器在几次更新后删除轨道,没有任何新的检测。此时,引信器仅依靠ADS-B轨道来估计飞机的位置。

{4}图imshow(图像);

图中包含一个轴对象。axis对象包含一个image类型的对象。

当飞机进入第二个和第三个监视雷达站所覆盖的区域时,建立了一个新的雷达轨迹。来自两个雷达站的探测由雷达跟踪器进行融合,航迹熔断器将新的雷达航迹与ADS-B航迹进行融合。

分析结果

你比较雷达和ADS-B记录的轨迹数据。真实的位置和速度可从geoTrajectory。您可以使用OSPA度量来比较雷达、ADS-B和ADS-B融合雷达的跟踪质量。的默认设置trackOSPAMetric对象比较NEES(归一化估计误差平方)的跟踪位置和检测分配。

ospa = trackOSPAMetric;radarospa = 0 (ceil(数字(radarTrackLog)/12),1);计算雷达跟踪器OSPAi=1:12: number (radarTrackLog) tracks = radarTrackLog{i};(真理。位置,~,真理。(flightRoute, i-1,“ECEF”);Radarospa (i) = ospa(轨道,真理);结束计算ADS-B OSPAadsbospa = 0(数字(adsbTrackLog),1);重置(ospa);i=1:数字(adsbTrackLog) tracks = adsbTrackLog{i};(真理。位置,~,真理。(flightRoute, i-1,“ECEF”);Adsbospa (i) = ospa(轨道,真理);结束%计算融合OSPAfusedospa = 0(数字(fusedTrackLog),1);重置(ospa);i=1:numel(fusedTrackLog) tracks = fusedTrackLog{i};(真理。位置,~,真理。(flightRoute, i-1,“ECEF”);Fusedospa (i) = ospa(轨道,真理);结束
% Plot OSPA图保存情节(0:12:(元素个数(radarTrackLog) 1)) / 60, radarospa(1:12:结束),“颜色”, radarclr);情节((0:(元素个数(adsbTrackLog) 1)) / 60, adsbospa,“颜色”adsbclr,“线宽”2);情节((0:(元素个数(fusedTrackLog) 1)) / 60, fusedospa,“颜色”, fusedclr);l =传奇(“雷达”“ads - b”“雷达+ ADS-B”);l.Color = [0.1 0.1 0.1];l.TextColor = [1 1 1];包含(的时间(分钟)) ylabel (“OSPA”) ax = gca;网格;盒子;斧子。Color = [0.1 0.1 0.1];斧子。GridColor = [1 1 1];

图中包含一个轴对象。axis对象包含3个line类型的对象。这些物体代表雷达,ADS-B,雷达+ ADS-B。

OSPA指标显示了从ADS-B航迹与雷达航迹融合中获得的改进。从模拟时间19 min到25 min,由于飞机在雷达网络盲点上空飞行,雷达只有OSPA偏高。ADS-B在这一领域的可用性显著提高了跟踪性能,正如融合的OSPA所示。此外,该度量在开始时显示两个峰值,这可以归因于在弹道的初始转弯期间匀速滤波器的性能较差,以及ADS-B的不可用性。大约在40min时,由于该区域内ADS-B可用性的丧失,只有ADS-B OSPA被降级。在模拟的后面部分,雷达和ADS-B都可用。雷达OSPA总体上比ADS-B差。这是因为与GPS相比,雷达的垂直精度较差。

总结

在本例中,您已经学习了如何创建以地球为中心的场景并使用大地坐标定义轨迹。您还学习了如何建模航路监视雷达和生成合成探测。你将这些检测数据输入多目标跟踪器,并估计飞机的位置、速度和航向。通过ADS-B信息的添加和融合,提高了跟踪性能。您建模了ADS-B报告,并将它们集成到跟踪解决方案中。在这个例子中,只模拟了一次飞行。ADS-B的好处可以在空中交通管制员必须保持安全距离的情况下对多个飞行进行建模时得到进一步体现。

金宝app支持功能

initfilter定义所使用的扩展卡尔曼滤波器trackerGNN.匀速运动模型很好地近似了飞机的运动。因此,使用相对较小的过程噪声来为动态分配更多的权重,相比之下,在长范围内预计会有相当大的噪声。

函数Filter = initfilter(检测)Filter = initcvekf(检测);过滤器。StateCovariance = 100*filter.StateCovariance;% initcvekf使用测量噪声作为默认值过滤器。ProcessNoise = 0.1;结束

postProcessDetection通过两个操作对检测进行后处理:

  1. 它消除了位于地球表面以下的雷达探测,因为这些无法由真正的雷达产生。

  2. 它增加了垂直于径向分量的测速分量的检测噪声级。

函数detsout = postProcessDetection(detsin) n = num (detsin);Keep = 0 (1,n,“逻辑”);i=1:n meas = detsin{i}.Measurement(1:3)';Lla = fusion.internal.frames.ecef2lla(meas);如果Lla (3)>0 keep(i) = true;其他的Keep (i) = false;结束结束Detsout = detsin(保持);velcovtraverse = 100^2;i=1:numel(detsout) velCov = detsout{i}.MeasurementNoise(4:6,4:6);[P,D] = eig(velCov);[m,ind] = min(diag(D));D = velcovtraverse * eye(3);D(ind,ind) = m;correctedCov = P*D*P';detsout{i}.MeasurementNoise(4:6,4:6) = correctedCov;结束结束

isWithinRange如果飞机位置在任何监测站的ADS-B接收器范围内,则返回true。

函数flag = isWithinRange(stationsLLA, pos, range) cartDistance = fusion.internal.frames.lla2ecef(stationsLLA) - fusion.internal.frames.lla2ecef(pos);flag = any(vecnorm(cartDistance,2,2) < range);结束

moveCamera指定跟踪飞机和拍摄快照的新相机位置。

函数images = moveCamera(查看器,飞机,时间,snapTimes,图像)如果mod(时间,12)== 0 pos =飞机。如果Time == 0 campos(viewer, pos(1),pos(2), 2e4);elseif时间== 1100%缩小坎波斯(观众、pos (1), pos (2), 1 e5);elseif时间== 2000%放大坎波斯(观众、pos (1), pos (2), 2.6 e4);其他的保持先前高度,但跟随飞机飞行坎波斯(观众、pos (1), pos (2));结束结束%的快照如果任何(时间== snapTimes) drawnow img =快照(查看器);Images = [Images, {img}];结束结束

参考

自动依赖监视-广播(ADS-B):https://www.faa.gov/about/office_org/headquarters_offices/avs/offices/afx/afs/afs400/afs410/ads-b