主要内容

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

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

介绍

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

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

生成和标记真相

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

baselineApproachTrajectory = geoTrajectory([42.7069 -70.8395 1500;42.5403 -70.9203 950;[42.3736 -71.001],[0;180;400],“ClimbRate”(6;3.75;3.75]);查看器= helperpertscenario;查看器。targethhistorylength = 0;查看器。trackhistory = 0;查看器。TrackLabelScale = 0.75; positionCamera(viewer, [42.3072 -70.8463 12455], [0 -34 335]); plotTrajectory(viewer, baselineApproachTrajectory,“颜色”, [15 255 255]/255,“宽度”1);

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

  • 轨迹必须与跑道方向紧密一致。

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

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

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

定义并显示轨迹规则。trajRules = defineTrajectoryRules();showrrules(查看器,trajRules) snap(查看器)

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

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

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

%产生摄动轨迹S = rng(2021;“旋风”);设置随机噪声发生器以获得可重复的结果numTrajectories = 20;轨迹= cell(1,numTrajectories);i = 1:numTrajectories轨迹{i} = clone(baselineApproachTrajectory);扰乱(轨迹{我});结束

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

[truthAnomalyFlags, truthPercentAnomalousSteps] = validateTrajectory(trajectories, trajRules);

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

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

定义场景

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

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

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

即将在机场着陆的飞机被安排避免一架飞机对后面一架飞机的空气动力学影响。两架飞机之间的最小安全时差是一分钟。

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

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

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

为了简化这个跟踪系统的模型,你可以使用统计雷达模型,fusionRadarSensor,连接在机场塔台上,并将传感器连接到atrackerGNN对象。将跟踪器配置为保守的跟踪确认方式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.0110],“传感器”, asdex);跟踪器= trackernn“AssignmentThreshold”, [100 2000],“ConfirmationThreshold”, [4 5]);tam = trackAssignmentMetrics(“AssignmentThreshold”, 100,“DivergenceThreshold”, 200);

运行场景,检测异常轨迹

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

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

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

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

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

将轨道异常报告与真实报告进行比较

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

该函数使用trackAnomalyHistory在模拟过程中收集,并将其与truthPercentAnomalousSteps为每个轨迹计算。与truth类似,如果轨迹在至少1%的时间步长中被声明为异常,则为其分配异常标志。你可以看到,异常是正确发布的,对于被发现是异常的七条轨迹。

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降落的规则马萨诸塞州波士顿的洛根国际机场。该函数使用附加的helperTrajectoryValidationRule作为%支金宝app持文件到此示例轨迹必须与跑道方向紧密一致。经度规则= 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- 3100]);收集所有的规则。trajRules = [longitude; aluderule1; aluderule2];结束

validateTrajectory验证每个轨迹

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

validateTrack验证轨道与异常规则

函数[tracks, history] = validateTracks(tracks, rules, assigndtrackid, assigndtruthid)持续的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 1 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 0 1];numTracks = nummel (tracks);landingPoint = [1.536321 -4.462053 4.276352]*1e6;trackid = [trackAnomalyHistory.TrackID];tr = 1:numTracks只在高度大于0时验证轨道如果pos(tr,3) > 15距离= norm(posECEF(tr,:) - landingPoint);islongitude = validate(rules(1),pos(tr,1),pos(tr,2));isAltitudeValid = (validate(rules(2),distance,pos(tr,3)) && validate(rules(3),distance,pos(tr,3)));isSpeedValid = validate(rules(4),distance,norm(level (tr,:)));isValid = isLongitudeValid && isAltitudeValid && isSpeedValid;其他的isValid = true;结束跟踪(tr)。ObjectClassID = uint8(~isValid) + uint8(isValid)*6;为轨道找到正确的颜色%更新异常历史记录inHistory = (track (tr))。TrackID == TrackID);如果任何(历史上)trackAnomalyHistory(历史上)。NumSteps = trackAnomalyHistory(inHistory)。NumSteps + 1;trackAnomalyHistory(历史上)。NumAnomalousSteps = trackAnomalyHistory(inHistory)。NumAnomalousSteps + ~isValid;其他的find(trackid == 0, 1)“第一”);trackAnomalyHistory(印第安纳州)。AssignedTruthID = AssignedTruthID (tracks(tr))。TrackID == assigndtrackid);trackAnomalyHistory(印第安纳州)。TrackID = tracks(tr).TrackID;trackAnomalyHistory(印第安纳州)。NumSteps = 1;trackAnomalyHistory(印第安纳州)。NumAnomalousSteps = ~isValid;结束结束history = trackAnomalyHistory;结束

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

函数comparisonTable = analyze(trackAnomalyHistory, percentTruthAnomalous) trackAnomalyHistory = trackAnomalyHistory([trackAnomalyHistory. cn])TrackID] > 0);anomalousSteps = [trackanomalyhistory . nummanomaloussteps];numSteps = [trackAnomalyHistory.NumSteps];trackassigndtruthid = [trackanomalyhistory . assigndtruthid];assigndtruths = unique(trackassigndtruths);numTrackAnomalousSteps = 0 (nummel (assigndtruths),1);numTrackSteps = 0 (nummel (assigndtruth),1);i = 1: nummel (assigndtruths) indeds = (assigndtruths (i) == trackassigndtruths);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, abnormalflags,“VariableNames”, {“TruthID”“真相异常旗”“航迹异常标志”});结束