主要内容

模拟、检测和跟踪着陆进近中的异常情况

该示例显示了如何自动检测飞机中的偏差和异常,以获得机场跑道的最终方法。在此示例中,您将建模理想的着陆方法轨迹并从中生成变体,模拟雷达轨道,并一旦轨道偏离安全着陆规则,就会发出警告。

介绍

着陆是一种安全的临界阶段。最终着陆方法的飞机必须与跑道保持一致,逐渐向地下降,并降低其基准速度,同时将其安全地保持在速度上方。完成所有这些步骤,以确保飞机轻轻地接触地面,以降低乘客的风险,并避免对飞机或跑道的物理损坏。这些规则可以通过航空专业人员容易地定义,或者可以使用机器学习从跟踪数据进行推断[1]。在此示例中,您假设已经定义了规则。

大型机场通常有多条面向不同方向的跑道。接近的飞机在机场塔台的空中交通管制员的指引下,降落在一条最好与当时风向相反的跑道上。在进场过程中,管制员通过跟踪系统对飞机进行监控。在过去的几十年里,机场交通量增加了,空中交通管制员的工作量也随之增加。因此,有必要对以不安全方式接近着陆点的飞机自动、可靠地发出警报:与跑道对齐不当、降落太快或太慢、接近太快或太慢。

生成并标记真相

你定义一个降落进近轨道到洛根国际机场在波士顿,马萨诸塞州使用地球轨道对象。轨迹航路点与22L跑道对齐,22L跑道由东北向西南方向运行,下滑坡度为3度。到达时间和爬升速率的定义是为了使接近的飞机减速到安全的速度和平稳的着陆。请注意,上升速率的正值用于下降轨迹。你使用helperPertScenarioGlobeViewer(请参阅支持文件)金宝app以在地图上可视化轨迹。

基线法轨道=地质轨道([42.7069-70.8395 1500;42.5403-70.9203 950;42.3736-71.001 0],[0;180;400],......“ClimbRate”,[6;3.75;3.75]);查看器= Helperpertscenarioglobeviewer;查看器.TargethistoryLength = 0;查看器.TrackhistoryLength = 0;查看器.Tracklabelscale = 0.75;PositionCamera(查看者,[42.3072 -70.8463 12455],[0 -34 335]);plottrajectory(查看者,baselineaproachtraptory,“颜色”, [15 255 255]/255“宽度”1);

为了确保在罗根机场22L跑道着陆的轨迹安全,轨迹必须满足以下规则:

  • 飞行轨迹必须与跑道方向紧密对齐。

  • 最后20963米的下滑坡度必须在2.5到4度之间。在20963米以上的距离,海拔必须至少3000英尺。

  • 在着陆点的速度必须在120节到180节之间。速度上限可随离着陆点的距离线性增加。

属性定义这些规则helperTrajectoryValidationRule(参见支持文件)并金宝app在地图上可视化规则。

%定义并显示轨迹规则。trajRules = defineTrajectoryRules ();trajRules showRules(观众)吸附(观众)

你用了扰动对象函数来定义基线轨迹周围的正态分布,approachTrajectory.轨迹中的每个航路点都受到零均值正态分布和从第一个航路点到最后一个(着陆点)的标准差变小的干扰。在第一个航路点,标准偏差经度5e-3度,高度300米。在中点处,标准偏差减小到经度1e-3度、高度150米,在地面端点处,标准偏差减小到经度1e-4度、高度0米。

定义进近轨迹的摄动扰动(baselineApproachTrajectory'waypoints',“正常”,零(3,3),[0 5e-3 300;0 1e-3 150;0 1e-4 0]);

创建20个从基线轨迹扰乱的轨迹,首先克隆轨迹然后使焦虑信息技术

%生成扰动轨迹s = rng (2021“龙卷风”);%为可重复的结果设置随机噪声发生器numTrajectories = 20;轨迹=细胞(1、numTrajectories);对于i = 1: numtrajectory {i} = clone(baselineApproachTrajectory);扰乱(轨迹{我});终止

要查看哪些扰动轨迹满足安全着陆的规则,可以使用辅助函数validatetrajectory.,此页底部提供。如果从中采样的点中至少有1%违反任何轨迹规则,则函数将轨迹声明为异常。

[truthAnomalyFlags,truthPercentAnomalousSteps]=验证跟踪(轨迹、轨迹);

为安全轨迹和深蓝的异常轨迹和深蓝绘制黄色的轨迹。总的来说,20个产生的轨迹中有7个异常轨迹。

绘图轨迹(查看器、轨迹(truthAnomalyFlags),“颜色”, [255 255 17]/255,“宽度”, 1); 绘图轨迹(查看器、轨迹(~truthAnomalyFlags),“颜色”, [15 255 255]/255“宽度”1);positionCamera(查看器,[42.4808 -70.916 1136],[0 0 340]);提前(观众)

定义一个场景

基于跟踪数据实时检测异常是一个挑战,原因有几个。首先,由于跟踪数据不完美,加上噪声,跟踪结果不确定。因此,必须提供一些公差以避免发出错误警告。其次,传感器报告错误检测,跟踪系统必须小心,不要基于这些错误检测来确认轨迹。仔细的确认要求跟踪系统需要更多的时间来确认轨迹。为了避免在虚假轨道上出现过多的警告,只能在确认轨道后才发出警告。

你定义了一个以地球为中心的跟踪场景。

%创建了以地球为中心的跟踪方案场景=跟踪Cenario(“UpdateRate”,1,'Isearthcentred', 真的);

在机场接近着陆的飞机预定避免在唤醒之后的一架飞机上的空气动力学冲击。两架飞机之间的最低安全时间差是一分钟。

你用了扰动使焦虑再次使用对象函数来扰动到达时间来确保没有额外的扰动作用于路点。然后将每条轨迹连接到一个新平台。若要扰乱整个场景,请使用使焦虑对象功能。

%安排轨迹并将每个轨迹连接到一个平台上。对于i = 1: numtrajectory扰动(trajectory {i},'抵达时间','制服',(i-1)*60,(i-1)*60+10);扰动(轨迹{i},'waypoints',“没有”); 平台(场景,“轨迹”,轨迹{i});终止扰乱(场景);

像美国其他主要机场一样,洛根机场使用机场地面探测设备-型号X (ASDE-X)跟踪飞机在最后进场和地面[2]。ASDE-X依靠机场监视雷达、来自接近飞机的自动依赖监视广播(ADS-B)报告和其他方法提供每秒更新的精确跟踪(更多细节,见[1])。

为了简化跟踪系统的模型,可以使用统计雷达模型,fusionRadarSensor,连接到机场塔楼,并将传感器连接到trackerGNN对象。通过设置确认察觉确认曲目是否接收到5次更新中的4次更新。

asdex=融合雷达传感器(1,......'scanmode','没有扫描',......“MountingAngles”,[0 0 0],......“FieldOfView”(360; 20),......“UpdateRate”,1,......“ReferenceRange”, 40000,......“范围限制”, [0 50000],......“RangeResolution”, 100,......“HasElevation”,真的,......“之内”,真的,......“DetectionCoordinates”,“场景”,......'falsealmarrate',1e-7,......“提升分辨率”, 0.4,......“AzimuthResolution”, 0.4); p=平台(场景,“位置”,[42.3606 -71.011 0],“传感器”,asdex);跟踪器= trackergnn(“AssignmentThreshold”(100 2000),“确认阈值”[4 - 5]);tam = trackAssignmentMetrics (“AssignmentThreshold”, 100,“DivergenceThreshold”, 200);

运行方案并检测异常曲目

在以下几行中,您将模拟场景并跟踪正在接近的飞机。你用了验证跟踪为轨道生成异常警告的辅助函数。您可以在本页的底部看到该函数的代码。

违反安全进场规则的轨道用黄色表示,而遵循这些规则的轨道用青色表示。请注意,当轨道违反任何规则时,警告将立即发出,当它满足所有规则时,警告将被删除。

%清理显示并为模拟做准备。清除(查看器)位置摄像机(查看器[42.3072-70.8463 12455],[0-34 335]);showRules(查看器、trajRules)清除验证跟踪%主循环推进(场景)%收集检测结果DETS =检测(方案);%更新跟踪器和输出轨迹。如果~isempty(dets) || isLocked(tracker) tracks = tracker(dets, scenariationtime);其他的跟踪= objectTrack.empty;终止在轨道和真理之间获取平台姿态和分配。姿势=平台(方案,“四元数”,“CoordinateSystem”,“笛卡儿”); tam(轨迹、姿势);[assignedTrackIDs,AssignedTrustids]=当前分配(tam);用规则验证轨道以发现异常轨道。[tracks, trackAnomalyHistory] = validateTracks(tracks, trajRules, assigndtrackid, assigndtruthid);%可视化UpdateDisplay(查看器,方案.simulationTime,[方案.platforms {:}],dets,[],曲目);终止

在从900秒到960秒的一分钟模拟中,拍摄了以下gif。它以青色显示被识别为安全的轨迹,以黄色显示被识别为异常的轨迹。该识别在每个模拟步骤中完成,如轨迹1893所示。

比较轨道异常报告对真理

要验证是否对正确的轨道发出了异常警告,可以使用分析助手函数,显示在本页底部。

该功能使用轨迹异常史在模拟过程中收集的数据,并与真实百分比异常步骤为每条轨迹计算。与“真值”类似,如果轨迹在至少1%的时间步长内被宣布为异常,则轨迹会被分配异常标志。您可以看到,对于发现异常的七条轨迹,异常会被正确发布。

comparisonTable = analyze(trackAnomalyHistory, truthpercentabnormoussteps);disp (comparisonTable)
TruthID真理异常标志追踪异常标志  _______ __________________ __________________ 4 3 2 1假假假假假假假假假假5 6 7假假真真正8真的真的9假假10真的真的11 12假假假假13真的真的14真的真的15 16 17假假假假假假18 19真的假假true 20 true true

总结

在本例中,您学习了如何使用跟踪数据生成异常(如不安全着陆方法)的实时警告。

你用地球轨道以地理坐标定义理想的着陆进近轨迹。然后使用扰动使焦虑创建20个偏离理想着陆进场轨迹的轨迹并将轨迹一个接一个地安排在跟踪Cenario..为了对机场跟踪系统建模,您使用统计雷达模型简化了系统模型,通过fusionRadarSensor系统对象和跟踪器,由此trackerGNN系统对象。

参考文献

  1. Raj Deshmukh和Inseok Hwang,“基于时间逻辑学习的终端空域操作异常检测”,AIAA科学技术论坛,2019。

  2. 联邦航空管理局,“事实表 - 机场表面检测设备,X(ASDE-X)”。https://www.faa.gov/news/fact_sheets/news_story.cfm?newsid=170952020年5月检索。

金宝app支持功能

defineTrajectoryRules定义轨迹规则

函数trajRules = defineTrajectoryRules这个函数定义了在22L跑道上安全进场降落的规则波士顿洛根国际机场,马萨诸塞州。%该函数使用附加的HelpertrajectoryValidationRule%支金宝app持文件到此示例%轨迹必须与跑道方向紧密对齐。longitude erule = helpertrajectory ([42.37 42.71], [0.4587, -90.4379], [0.5128, -92.730]);最近20963年的下滑坡度必须在2.5到4度之间%米。在20963米以上的距离,高度必须至少3000英尺。规则是相对于跑道着陆点的距离。altitudeRule1 = helperTrajectoryValidationRule([100 20963], [sind(2.5) 0], [sind(4) 0]);altitudeRule2 = helperTrajectoryValidationRule([20963 40000], 3000 * 0.3048, [sind(4) 0]);%着陆点的速度必须在120节到180节之间。%速度上限可以随距离的增加而线性增加%降落点。speedrule = helpertrajectoryvalidationrule([0 40000],61.733,[1E-3 100]);收集所有的规则。trajRules = [longitudeRule; altitudeRule1; altitudeRule2 speedRule);终止

validatetrajectory.验证每个轨迹

函数[truthAnomalyFlags,PercentanomalySteps]=验证跟踪(轨迹,规则)numTrajectories=numel(轨迹);numTrajectories=0(1,numTrajectories);对于tr = 1: numTrajectories如果Iscell (trajectory) traj = trajectory {tr};eleesif.numTrajectories == 1 traj = trajectories;其他的traj =轨迹(tr);终止TimeAmples =(Traj.timeofarrival(1):traj.timeofarrival(END));[pos,〜,vel] =看起来(traj,timeample);posecef = gookappose(traj,timeamples,“ECEF”); 着陆点=[1.536321-4.462053 4.276352]*1e6;对于i = 1:numel(时倍)距离= norm(posecef(i,:)  -  landingpoint);Islongitudevalid =验证(规则(1),POS(I,1),POS(I,2));Isaltitudevalid =(验证(规则(2),距离,POS(I,3))&&验证(规则(3),距离,POS(i,3)));IsspeedValid =验证(规则(4),距离,常量(Vel(i,:)));IsValid = Islongitudevalid && Isaltitudevalid && IsspeedValid;numanomaloussteps(tr)= numanomaloussteps(tr)+〜Isvalid;终止终止percentAnomalousSteps=numAnomalousSteps./numel(时间样本)*100;truthAnomalyFlags=(percentAnomalousSteps>1);终止

验证追踪验证跟踪与异常规则

函数[tracks, history] = validateTracks(tracks, rules, assigned trackid, assigned truthid)持久的轨迹异常史如果isempty(trackAnomalyHistory)trackAnomalyHistory=repmat(struct(“TrackID”,0,'ensignedtreid',0,“NumSteps”,0,'numanomaloussteps', 0),30,1);终止posecef = getTrackpositions(曲目,[1 0 0 0 0 0; 0 0 1 0 0 0; 0 0 0 0 1 0]);pos = fusion.internal.frames.ecef2lla(posecef);vel = getTrackvelocities(轨道,[0 1 0 0 0 0; 0 0 0 1 0 0; 0 0 0 0 0 1]);numtracks = numel(曲目);LandingPoint = [1.536321 -4.462053 4.276352] * 1E6;trackIds = [trackanomalyhistory.trackid];对于tr = 1:numtracks%仅在高度大于0时验证航迹如果pos(tr,3) > 15 distance = norm(posECEF(tr,:) - landingPoint);isLongitudeValid =验证(规则(1)、pos (tr, 1), pos (tr, 2));isAltitudeValid = (validate(rules(2),distance,pos(tr,3)) && validate(rules(3),distance,pos(tr,3)));isSpeedValid =验证(规则(4),距离,规范(韦尔(tr,:)));IsValid = Islongitudevalid && Isaltitudevalid && IsspeedValid;其他的isValid=true;终止跟踪(tr)。ObjectClassID = uint8(~isValid) + uint8(isValid)*6;%以获得正确的曲目颜色更新异常历史记录历史上=(跟踪(tr)。TrackID = = trackIDs);如果任何(历史上)trackAnomalyHistory(历史上)。NumSteps = trackAnomalyHistory(历史上)。NumSteps + 1;trackAnomalyHistory(历史上)。NumAnomalousSteps = trackAnomalyHistory(历史上)。NumAnomalousSteps + ~ isValid;其他的find(trackid == 0,1,“第一”);trackAnomalyHistory(印第安纳州)。AssignedTruthID = assignedTruthIDs(跟踪(tr)。TrackID = = assignedTrackIDs);trackAnomalyHistory(印第安纳州)。TrackID =跟踪(tr) .TrackID;trackAnomalyHistory(印第安纳州)。NumSteps = 1;trackAnomalyHistory(印第安纳州)。NumAnomalousSteps = ~ isValid;终止终止历史= trackAnomalyHistory;终止

分析-分析轨迹异常历史,并将其与真实异常百分比进行比较

函数ComparisOlable = Analyze(Trackanomalyhistory,PercileTruthanomalous)TrackanomalyHistory = TrackanomalyHistory([trackanomalyhistory.trackid]> 0);anomaloussteps = [trackanomalyhistory.numanomaloussteps];numsteps = [trackanomalyhistory.numsteps];trackassignedtruths = [trackanomalyhistory.assignedtruthid];descnetedtruths =唯一(trackassignedtruths);numtrackanomaloussteps = zeros(numel(dsignedtruths),1);numtracksteps = zeros(numel(dsignedtruths),1);对于i=1:numel(分配的真理)inds=(分配的真理(i)=跟踪分配的真理);numTrackAnomalousSteps(i)=和(anomalousSteps(inds));numTrackSteps(i)=总和(numSteps(inds));终止percentTrackAnomalous = numTrackAnomalousSteps ./ numTrackSteps * 100;true = (percentTruthAnomalous > 1)';异常标志= (percenttrackanomaly > 1);comparisonTable = table((1:20)',true, anomalyFlags,......'variablenames', {“TruthID”,“真理异常标志”,“跟踪异常标志”});终止