主要内容

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

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

简介

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

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

产生和标记真相

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

baselineApproachTrajectory = geoTrajectory([42.7069 -70.8395 1500;42.5403 -70.9203 950;42.3736 -71.001 0],[0;180;400],...“ClimbRate”(6;3.75;3.75]);viewer = helpertscenariglogloviewer;查看器。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 = defineTrajectoryRules();showRules(查看器,trajRules)

你可以使用扰动目标函数定义基线轨迹周围的正态分布,approachTrajectory.轨迹中的每个路径点都受到零均值正态分布的扰动,并且从第一个路径点到最后一个(着陆点)的标准偏差越来越小。在第一个航路点,标准差为经度5e-3度,海拔300米。在中点处,标准差减小到经度1e-3度,海拔150米;在地面终点处,标准差减小到经度1e-4度,海拔0度。

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

首先,要创建20个由基线轨迹扰动的轨迹克隆轨迹,然后扰乱它。

%生成摄动轨迹S = rng(2021,“旋风”);%设置随机噪声发生器可重复的结果numtrajectory = 20;轨迹= cell(1, numtrajectory);i = 1: numtrajectory轨迹{i} =克隆(baselinineapproachtrajectory);扰乱(轨迹{我});结束

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

[truthAnomalyFlags, truthPercentAnomalousSteps] = validateTrajectory(轨迹,trajRules);

用黄色表示异常轨迹,用青色表示安全接近。总的来说,在生成的20个轨迹中有7个异常轨迹。

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

定义场景

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

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

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

在机场降落的飞机都要避免一架飞机对后面一架飞机的空气动力学影响。两架飞机之间的最小安全时间差是一分钟。

你可以使用扰动而且扰乱对象的函数再次扰动TimeOfArrival并确保没有额外的扰动作用于路点.然后将每个轨迹连接到一个新的平台上。要扰乱整个场景,可以使用扰乱对象的功能。

计划轨迹并将每个轨道连接到一个平台上。。i = 1: numtrajectory摄动(trajectory {i},“TimeOfArrival”“统一”(张)* 60岁(张)* 60 + 10);扰动(轨迹{我}“锚点”“没有”);平台(场景中,“轨迹”、轨迹{我});结束扰乱(场景);

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

为了简化这个跟踪系统的模型,你使用一个统计雷达模型,fusionRadarSensor,连接到机场塔台,并将传感器连接到一个trackerGNN对象。可以将跟踪器配置为关于确认跟踪的保守型,方法是设置ConfirmationThreshold确认音轨是否收到5个更新中的4个。

asdex = fusionRadarSensor(1,...“ScanMode”“没有扫描”...“MountingAngles”, [0 0 0],...“FieldOfView”(360; 20),...“UpdateRate”, 1...“ReferenceRange”, 40000,...“RangeLimits”, [0 50000],...“RangeResolution”, 100,...“HasElevation”,真的,...“之内”,真的,...“DetectionCoordinates”“场景”...“FalseAlarmRate”1 e -...“ElevationResolution”, 0.4,...“AzimuthResolution”, 0.4);P =平台(场景,“位置”, [42.3606 -71.011 0],“传感器”, asdex);跟踪器= trackerGNN(“AssignmentThreshold”, [100 2000],“ConfirmationThreshold”, [4 5]);tam = trackAssignmentMetrics(“AssignmentThreshold”, 100,“DivergenceThreshold”, 200);

运行场景并检测异常轨道

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

违反安全进场规则的航迹以黄色显示,而符合这些规则的航迹则以青色显示。注意,当轨道违反任何规则时,警告立即发出,当它满足所有规则时,警告被删除。

清洁显示器并为模拟做准备。。明确的(观众)

positionCamera(viewer, [42.3072 -70.8463 12455], [0 -34 335]);showRules(viewer, trajRules)清除validateTracks%主循环推进(场景)收集检测Dets =检测(场景);更新跟踪器和输出轨道。如果~isempty(dets) || isLocked(tracker) tracks = tracker(dets, scene . simulationtime);其他的tracks = objectTrack.empty;结束在轨道和真相之间获得平台姿势和任务。。姿势=平台姿势(场景,“四元数”“CoordinateSystem”“笛卡儿”);tam(痕迹,姿势);[assignedTrackIDs, assignedTruthIDs] = currentAssignment(tam);使用规则验证轨道以查找异常轨道。。[tracks, trackAnomalyHistory] = validateTracks(tracks, trajRules, assignedTrackIDs, assignedTruthIDs);%可视化updateDisplay(观众、scenario.SimulationTime [scenario.Platforms{}):,侦破,[],追踪);结束

下面的动图是模拟900秒到960秒的一分钟。它用青色表示安全轨道,用黄色表示异常轨道。这种识别是在每一个模拟步骤,可以看到轨道1893。

比较轨道异常报告与真相

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

函数使用trackAnomalyHistory在模拟期间收集,并将其与truthPercentAnomalousSteps为每条轨迹计算。与真实情况类似,如果轨道在至少1%的时间步长被宣布为异常,则会为其分配异常标志。您可以看到,对于发现异常的7个轨迹,异常是正确的。

comparisonTable = analyze(trackAnomalyHistory,truthPercentAnomalousSteps);disp (comparisonTable)
TruthID真相异常标志轨迹异常标志_______ __________________ __________________ 1假假2假假3假假4假假5假假6假假7真真8真真9假假10真真11假假12假假13真真14真真15假假16假假17假假18假假19真真20真真

总结

在本例中,您学习了如何使用跟踪数据为不安全着陆等异常情况生成实时警告。

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

参考文献

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

  2. 联邦航空管理局,“情况说明书-机场表面探测设备,X型(ASDE-X)”。2020年5月检索。

金宝app支持功能

defineTrajectoryRules定义轨迹规则

函数trajRules = defineTrajectoryRules此函数定义在22L跑道安全降落的规则。马萨诸塞州波士顿的洛根国际机场。该函数使用附加的helpertrajectory yvalidationrule作为参数%支金宝app持文件到此示例轨迹必须与跑道方向紧密对齐。。longitude erule = helperTrajectoryValidationRule([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 =[经度规则;高程规则1;高程规则2;speedRule];结束

validateTrajectory验证每个轨迹

函数[truthAnomalyFlags, percentAnomalousSteps] = validateTrajectory(轨迹,规则)numtrajectory = nummel(轨迹);nummanomaloussteps = 0 (1, numtrajectory);tr = 1:numTrajectories如果Iscell(轨迹)traj =轨迹{tr};elseifnumtrajectory == 1 traj =轨迹;其他的Traj =轨迹(tr);结束timesamples = (traj.TimeOfArrival(1):traj.TimeOfArrival(end));[pos,~,vel] = lookupPose(traj, timesamples);posECEF = lookupPose(traj, timesamples,“ECEF”);landingPoint = [1.536321 -4.462053 4.276352]*1e6;i = 1:numel(timesamples) distance = norm(posECEF(i,:) - landingPoint);isLongitudeValid = validate(规则(1),pos(i,1),pos(i,2));isAltitudeValid =(验证(规则(2),距离,pos(i,3)) &&验证(规则(3),距离,pos(i,3)));isSpeedValid = validate(规则(4),距离,norm(vel(i,:)));isValid = islongitude && isAltitudeValid && isSpeedValid;numAnomalousSteps(tr) = numAnomalousSteps(tr) + ~isValid;结束结束percentAnomalousSteps = numAnomalousSteps ./ numel(timesamples) * 100;truthAnomalyFlags = (percentAnomalousSteps > 1);结束

validateTrack验证轨迹vs异常规则

函数[tracks, history] = validateTracks(tracks, rules, assignedTrackIDs, assignedTruthIDs)持续的trackAnomalyHistory如果isempty(trackAnomalyHistory) = repmat(struct(“TrackID”0,“AssignedTruthID”0,“NumSteps”0,“NumAnomalousSteps”, 0), 30岁,1);结束posECEF = getTrackPositions(tracks, [1 0 0 0 0 0 0;0 0 1 0 0 0;0 0 0 0 0 0]);pos = fusion.internal.frames.ecef2lla(posECEF);vel = gettrackvelocity(跟踪,[0 1 0 0 0 0 0;0 0 0 1 0 0;0 0 0 0 1]);numTracks = numel(tracks);landingPoint = [1.536321 -4.462053 4.276352]*1e6;trackid = [trackAnomalyHistory.TrackID];tr = 1:numTracks仅当高度大于0时才验证航迹如果pos(tr,3) > 15 distance = norm(posECEF(tr,:) - landingPoint);isLongitudeValid = validate(规则(1),pos(tr,1),pos(tr,2));isAltitudeValid =(验证(规则(2),距离,pos(tr,3)) &&验证(规则(3),距离,pos(tr,3)));isSpeedValid = validate(规则(4),距离,norm(vel(tr,:)));isValid = islongitude && isAltitudeValid && isSpeedValid;其他的isValid = true;结束跟踪(tr)。ObjectClassID = uint8(~isValid) + uint8(isValid)*6;为轨道设置正确的颜色更新异常记录inHistory =(轨道(tr)。TrackID == TrackID);如果任何(历史上)trackAnomalyHistory(历史上)。NumSteps = trackAnomalyHistory(inHistory)。NumSteps + 1;trackAnomalyHistory(历史上)。NumAnomalousSteps = trackAnomalyHistory(inHistory)。NumAnomalousSteps + ~isValid其他的ind = find(trackIDs == 0,1,“第一”);trackAnomalyHistory(印第安纳州)。AssignedTruthID = AssignedTruthID (tracks(tr)。TrackID == assignedTrackIDs);trackAnomalyHistory(印第安纳州)。TrackID = tracks(tr).TrackID;trackAnomalyHistory(印第安纳州)。NumSteps = 1;trackAnomalyHistory(印第安纳州)。NumAnomalousSteps = ~isValid;结束结束history = trackAnomalyHistory;结束

分析—分析轨道异常历史,并与真实异常率进行对比

函数comparisonTable = analyze(trackAnomalyHistory, percentTruthAnomalous) trackAnomalyHistory = trackAnomalyHistory([trackAnomalyHistory, percentTruthAnomalous])TrackID] > 0);anomalousSteps = [trackAnomalyHistory.NumAnomalousSteps];numSteps = [trackAnomalyHistory.NumSteps];trackassignedtruth = [trackAnomalyHistory.AssignedTruthID];assignedtruth = unique(trackassignedtruth);numTrackAnomalousSteps = 0(数字(赋值真理),1);numTrackSteps = 0 (nummel (assigndtruth),1);i = 1: nummel (assignedTruths) inds = (assignedTruths(i) == trackAssignedTruths);numTrackAnomalousSteps(i) = sum(anomalousSteps(inds));numTrackSteps(i) = sum(numSteps(inds));结束percentTrackAnomalous = numTrackAnomalousSteps ./ numTrackSteps * 100;trueAnomaly = (percentTruthAnomalous > 1)';anomalyFlags = (percentTrackAnomalous > 1);comparisonTable = table((1:20)',trueAnomaly, exception flags,...“VariableNames”, {“TruthID”“真相异常旗”“航迹异常标志”});结束