主要内容

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

该实例展示了如何自动检测偏差和异常飞机最后接近机场跑道。在本例中,您将模拟一个理想的着陆进场轨迹并从中生成变体,模拟雷达轨迹,并在轨迹偏离安全着陆规则时发出警告。

介绍

着陆是飞行安全的关键阶段。飞机在最后接近着陆时,必须与跑道对齐,逐渐下降到地面,降低对地速度,同时保持安全的失速速度以上。所有这些步骤都是为了确保飞机轻触地面,以减少对乘客的风险,并避免对飞机或跑道造成物理损坏。这些规则可以由航空专业人员轻松定义,也可以使用机器学习[1]从跟踪数据中推断出来。在本例中,假设已经定义了规则。

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

生成和标记真理

您使用A将着陆方法定义了登陆方法轨迹到波士顿的洛根国际机场地球轨道对象。轨迹航路点与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(viewer, [42.3072 -70.8463 12455], [0 -34 335]); plotTrajectory(viewer, baselineApproachTrajectory,'颜色', [15 255 255]/255“宽度”1);

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

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

  • 在最后20963米中,下滑坡度必须在2.5到4度之间。距离超过20963米时,高度必须至少为3000英尺。

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

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

定义和显示轨迹规则。trajrules = defileetrajectoryrules();Showrules(查看者,Trajrules)Snap(查看者)

您使用扰动对象函数定义基线轨迹周围的正态分布,approachTrajectory.轨迹中的每个航点都具有零平均正态分布和标准偏差,从第一航点到最后一个(着陆点)。在第一航点,标准偏差是5E-3度的经度,高度300米。标准偏差在中点的高度中减少到1E-3度,并且在中间点150米处,在地面上的端点处的高度有1E-4度。

%定义对方法轨迹的扰动扰动(Baselineaproachtranjectory,“锚点”,“正常”,零(3,3),[0 5e-3 300;0 1e-3 150;0 1e-4 0]);

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

%生成扰动轨迹s = RNG(2021,“龙卷风”);%为可重复的结果设置随机噪声发生器numtrajectories = 20;轨迹=单元格(1,Numtrajections);对于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]);提前(观众)

定义一个场景

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

您定义了以地球为中心的跟踪方案。

创造一个以地球为中心的跟踪场景场景= trackingScenario (“UpdateRate”, 1“IsEarthCentered”,真正的);

飞机接近降落在机场是为了避免一架飞机对另一架飞机的空气动力学影响。两架飞机之间的最小安全时间差是一分钟。

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

%安排轨迹并将每个轨迹附加到平台上。对于i = 1:numtrajectiones扰动(轨迹{i},“TimeOfArrival”,“统一”,(i-1)*60,(i-1)*60+10);扰动(轨迹{i},“锚点”,'没有任何'); 平台(场景,'弹道',轨迹{i});终止perurburm(情景);

与美国的其他主要机场一样,洛根使用机场表面检测设备 - 型号X(ASDE-X)在最终方法和地面上跟踪飞机[2]。Asde-X依赖于机场监控雷达,从接近飞机的自动依赖监控广播(ADS-B)报告,以及其他方法提供每秒更新的准确跟踪(有关详细信息,请参阅[1])。

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

asdex=融合雷达传感器(1,...“ScanMode”,“没有扫描”,...“登山角”, [0 0 0],...'fieldofview'(360; 20),...“UpdateRate”, 1...“ReferenceRange”, 40000,...“范围限制”, [0 50000],...'rangeresolution',100,...'haselevation', 真的,...“之内”, 真的,...“DetectionCoordinates”,'设想',...“FalseAlarmRate”1 e -...“提升分辨率”, 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)清除验证跟踪%主循环推进(场景)%收集检测结果依据=检测(场景);%更新跟踪器和输出轨迹。如果〜isempty(dets)||Islocked(跟踪器)曲目=跟踪器(DETS,Scenario.simulationTime);其他的跟踪= objectTrack.empty;终止在轨道和真理之间获取平台姿态和分配。提出了= platformPoses(场景中,“四元数”,“坐标系”,“笛卡尔”); tam(轨迹、姿势);[assignedTrackIDs,AssignedTrustids]=当前分配(tam);%验证具有规则的曲目以找到异常曲目。[Tracks,TrackanomalyHistory] ​​= Validatetracks(曲目,Trajrules,AssendedTrackIds,AssendedTreInds);%可视化updateDisplay(观众、scenario.SimulationTime [scenario.Platforms{}):,侦破,[],追踪);终止

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

比较轨道异常报告的真实性

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

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

ComparisOntable = Analyze(TrackanomalyHistory,TheeppercentanomalouseSteps);DISP(比较)
真实的真理异常旗帜轨道异常旗帜_______ ________________ _________________一个假假2假假假假假假假假假假假假假假假假假假错误5个错误错误6错误假假假5个真实8错误假假5错误13真实14真正的15个假假值16假假语17错误假18错误假5 true 20 true true

总结

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

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

工具书类

  1. raj deshmukh和inseok hwang,“基于时间逻辑的学习的异常探测终端空域操作”,2019年的Aiaa Scitech论坛。

  2. 美国联邦航空管理局,“情况说明书-机场地面探测设备,型号X (ASDE-X)”。https://www.faa.gov/news/fact_sheets/news_story.cfm?newsId=17095检索到2020年5月。

金宝app支持功能

defineTrajectoryRules定义轨迹规则

函数trajrules = defineTraometrules.这个函数定义了在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 = [龙玺; altituderule1; altituderule2; speedrule];终止

validateTrajectory验证每一个轨迹

函数[truthAnomalyFlags,PercentanomalySteps]=验证跟踪(轨迹,规则)numTrajectories=numel(轨迹);numTrajectories=0(1,numTrajectories);对于tr = 1: numTrajectories如果Iscell(轨迹)traj =轨迹{tr};elseifnumtrajections == 1 traj =轨迹;其他的traj =轨迹(tr);终止timesamples = (traj.TimeOfArrival (1): traj.TimeOfArrival(结束));[pos,~,vel] = lookupPose(traj, timessamples);posECEF = lookupPose(traj, timessamples,“ECEF”); 着陆点=[1.536321-4.462053 4.276352]*1e6;对于i = 1:numel(timessamples)距离= norm(posECEF(i,:) - landingPoint);isLongitudeValid =验证(规则(1)、pos(我,1),pos(我,2));isAltitudeValid = (validate(rules(2),distance,pos(i,3)) && validate(rules(3),distance,pos(i,3)));isSpeedValid =验证(规则(4),距离,规范(韦尔(我,:)));isValid = islongitude && islongitude && isSpeedValid;nummanomaloussteps (tr) = nummanomaloussteps (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,“AssignedTruthID”0,“NumSteps”0,“NumAnomalousSteps”, 0),30,1);终止posECEF = getTrackPositions(轨道,[1 0 0 0 0;0 0 1 0 0 0;0 0 0 0 1 0]);pos = fusion.internal.frames.ecef2lla (posECEF);vel = gettrackvelocity(轨道,[0 1 0 0 0;0 0 0 1 0 0;0 0 0 0 1]);numTracks =元素个数(跟踪);landingPoint = [1.536321 -4.462053 4.276352]*1e6;trackIDs = [trackAnomalyHistory.TrackID];对于tr = 1: numTracks%仅在高度大于0时验证航迹如果POS(TR,3)> 15距离=常规(POSecef(TR,:)  -  LandingPoint);Islongitudevalid =验证(规则(1),POS(TR,1),POS(TR,2));Isaltitudevalid =(验证(规则(2),距离,POS(TR,3))&&验证(规则(3),距离,POS(TR,3)));ISSPEEDVALID =验证(规则(4),距离,常规(VEL(TR,:)));isValid = islongitude && islongitude && isSpeedValid;其他的isValid=true;终止跟踪(tr)。ObjectClassID = uint8(~isValid) + uint8(isValid)*6;为音轨获得正确的颜色更新异常历史记录历史上=(跟踪(tr)。TrackID = = trackIDs);如果任何(inhistory)trackanomalyhistory(inhistory).numsteps = trackanomalyhistory(Inhistory).numsteps + 1;trackanomalyhistory(inhistory).numanomaloussteps = trackanomalyhistory(Inhistory).numanomaloussteps +〜是isvalid;其他的find(trackid == 0,1,“第一”);trackAnomalyHistory(印第安纳州)。AssignedTruthID = assignedTruthIDs(跟踪(tr)。TrackID = = assignedTrackIDs);trackAnomalyHistory(印第安纳州)。TrackID =跟踪(tr) .TrackID;trackAnomalyHistory(印第安纳州)。NumSteps = 1;trackAnomalyHistory(印第安纳州)。NumAnomalousSteps = ~ isValid;终止终止历史= trackAnomalyHistory;终止

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

函数comparisonTable = analyze(trackAnomalyHistory, percentTruthAnomalous) trackAnomalyHistory = trackAnomalyHistory([trackAnomalyHistory. com])。TrackID] > 0);anomalousSteps = [trackAnomalyHistory.NumAnomalousSteps];numSteps = [trackAnomalyHistory.NumSteps];trackAssignedTruths = [trackAnomalyHistory.AssignedTruthID];assignedTruths =独特(trackAssignedTruths);numTrackAnomalousSteps = 0(元素个数(assignedTruths), 1);numTrackSteps = 0(元素个数(assignedTruths), 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”,“真理异常标志”,“跟踪异常标志”});终止