主要内容

模拟、检测和跟踪异常着陆的方法

这个例子展示了如何自动检测偏差和异常在飞机最后的机场跑道的方法。在这个例子中,您将模型理想轨迹着陆方法和生成变种,模拟雷达追踪,并尽快发出警告轨道偏离安全着陆的规则。

介绍

着陆是一个安全的飞行关键阶段。飞机最终降落方法必须使自己与跑道,逐渐下降到地面,并减少其地面速度,同时保持它安全高于失速速度。完成所有这些步骤,以确保飞机乘客轻轻地接触地面,减少风险,避免物理损坏飞机或跑道。这些规则可以很容易地定义为一个航空专业或者他们可以推断使用机器学习从跟踪数据[1]。在这个例子中,假设已经定义的规则。

主要面向通常有多个机场跑道的不同的方向。接近飞机在机场空中交通管制员指引的塔降落的跑道,最好是一致的对风的方向。在方法中,控制器根据跟踪系统监控飞机。机场交通增加了在过去的几十年里,,空中交通管制员的工作量也增加。因此,需要自动、可靠地提醒空中交通管制员的飞机降落在一个不安全的方式方法:不对准跑道,降的太快或太慢,或者接近太快或太慢。

生成和标签的真理

你定义一个轨迹在波士顿洛根国际机场着陆方法,使用geoTrajectory对象。轨迹路径点是与跑道22 l,从东北到西南,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]);观众= helperPertScenarioGlobeViewer;查看器。TargetHistoryLength = 0;查看器。TrackHistoryLength = 0;查看器。TrackLabelScale = 0.75; positionCamera(viewer, [42.3072 -70.8463 12455], [0 -34 335]); plotTrajectory(viewer, baselineApproachTrajectory,“颜色”(255 255)/ 255,“宽度”1);

的轨迹来土地Logan机场跑道22 l是安全的,轨迹必须满足以下规则:

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

  • 滑翔道必须2.5到4度在过去20963米。在距离20963米以上,高度必须至少3000英尺。

  • 速度120节和180节之间必须降落点。较高的速度限制可以增加线性距离降落点。

您定义这些规则使用helperTrajectoryValidationRule(见支持文件)和可金宝app视化地图上的规则。

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

您使用扰动目标函数定义一个正态分布在基准轨迹,approachTrajectory。轨道摄动中的每个路标为正态分布和标准偏差,从第一个路标变小最后着陆(点)。在第一个路标,标准差是5 e - 3度经度和海拔300米。标准偏差降低到1 e - 3度经度和海拔150米的中点,然后1 0度经度和海拔的军医在端点在地上。

%定义微扰轨迹的方法扰动(baselineApproachTrajectory“锚点”,“正常”0 (3),[0 5 e - 3 300;0 150 e - 3;0 1 0]的军医);

创建20轨迹从基线轨道摄动,放在第一位克隆轨迹,然后扰乱它。

%产生摄动轨迹s = rng (2021“旋风”);%设置随机噪声发生器可重复的结果numTrajectories = 20;轨迹=细胞(1、numTrajectories);i = 1: numTrajectories轨迹{我}=克隆(baselineApproachTrajectory);扰乱(轨迹{我});结束

看到这摄动轨迹满足安全着陆方法的规则,使用helper函数validateTrajectory,只要这个页面的底部。函数声明一个轨迹异常如果至少1%的采样点数从它违反任何轨迹法则。

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

用黄色画轨迹异常轨迹和青色的安全方法。总的来说,有7异常轨迹的20生成的轨迹。

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

定义一个场景

基于跟踪数据的实时检测异常是有几个原因的一个挑战。首先,由于跟踪数据的不完善与噪音,跟踪结果不确定。因此,一些公差必须提供避免发出错误警告。第二,传感器报告错误的检测和跟踪系统必须小心不要确认跟踪基于这些错误的检测。仔细的确认要求跟踪系统需要更多的时间来确认追踪。在错误的轨道,避免过度警告你只发出警告后跟踪确认。

你定义一个地球跟踪场景。

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

飞机即将降落在机场将避免从一个飞机的空气动力影响后。两架飞机之间的最小安全时差是一分钟。

您使用扰动扰乱对象功能再次扰乱TimeOfArrival每一个轨迹,并确保没有应用到更多的扰动路点。然后你把每个轨迹跟一个新平台。扰乱整个场景中,您使用扰乱对象的功能。

%的轨迹和每个附加到一个平台。i = 1: numTrajectories扰动(轨迹{},“TimeOfArrival”,“统一”(张)* 60岁(张)* 60 + 10);扰动(轨迹{我}“锚点”,“没有”);平台(场景中,“轨迹”、轨迹{我});结束扰乱(场景);

在美国和其他主要机场,洛根使用机场地面检测设备- X(机场)跟踪模型飞机在最后的方法和在地上[2]。机场地面依赖于机场监视雷达,自动从属监控广播”(ads - b)的报告接近飞机,和其他方法提供准确跟踪更新每一秒(有关详细信息,请参见[1])。

这种跟踪系统的简化模型,您使用一个统计雷达模型,fusionRadarSensor附着在机场大厦,连接的传感器trackerGNN对象。你配置跟踪确认跟踪通过设置保守ConfirmationThreshold确认如果跟踪接收4-out-of-5更新。

asdex = fusionRadarSensor (1,“ScanMode”,“没有扫描”,“MountingAngles”(0 0 0),“FieldOfView”(360;20),“UpdateRate”, 1“ReferenceRange”,40000,“RangeLimits”50000年[0],“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);

运行场景和检测异常追踪

在第二行,你接近飞机模拟场景和跟踪。您使用validateTrackshelper函数生成异常追踪的警告。你可以看到的代码函数这一页的底部。

追踪违反安全规则方法所示所示黄色痕迹,遵循这些规则是青色。注意,立即发出警告时,跟踪删除违反任何规则,当它满足所有的规则。

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

positionCamera(观众[42.3072 - -70.8463 12455年],[0 -34 335]);trajRules showRules(观众)清晰validateTracks%主循环推进(场景)%收集检测依据=检测(场景);%更新跟踪器和输出跟踪。如果~ isempty(检波器)| | isLocked(跟踪)跟踪=追踪(侦破,scenario.SimulationTime);其他的跟踪= objectTrack.empty;结束%得到平台的姿态和作业跟踪与真理。提出了= platformPoses(场景中,“四元数”,“CoordinateSystem”,“笛卡儿”);tam(痕迹,姿势);[assignedTrackIDs, assignedTruthIDs] = currentAssignment (tam);%与规则来查找异常跟踪验证跟踪。[追踪,trackAnomalyHistory] = validateTracks(跟踪、trajRules assignedTrackIDs, assignedTruthIDs);%可视化updateDisplay(观众、scenario.SimulationTime [scenario.Platforms{}):,侦破,[],追踪);结束

以下gif是当一分钟的模拟从900秒到960秒。它显示跟踪确认为安全的青色和黄色追踪确认为异常。这样做识别是在每一个仿真可以看到跟踪1893步。

比较跟踪异常报告的事实

验证异常警告发出了正确的轨道,你使用分析辅助功能,显示这个页面的底部。

这个函数使用trackAnomalyHistory期间收集的模拟和比较truthPercentAnomalousSteps为每个轨迹计算。类似于真理,跟踪分配异常标志如果他们宣布异常至少1%的时间步骤。您可以看到异常发出正确的七发现异常的轨迹。

comparisonTable =分析(trackAnomalyHistory truthPercentAnomalousSteps);disp (comparisonTable)
TruthID真理异常标志追踪异常标志_________ _____________ _____________ 1假假2 5 4 3假假假假假假假假假假6 7真的真的8真的真的9假假10真的真的11 12假假假假13真的真的14真的真的15 16 17假假假假假假18 19真的真的20真的真的假假

总结

在这个示例中,您了解了如何使用跟踪数据生成实时警告等异常不安全的着陆方式。

你用geoTrajectory来定义一个理想的降落方法在地理坐标轨迹。然后使用扰动扰乱创建20个轨迹偏离理想的着陆轨迹和安排的一个接一个的轨迹trackingScenario。机场跟踪系统模型,简化了系统模型使用一个统计雷达模型,由fusionRadarSensor系统对象,追踪的trackerGNN系统对象。

引用

  1. 拉杰德斯穆克Inseok黄,“异常检测终端空域操作使用基于时序逻辑的学习”,张仁科技论坛,2019年。

  2. 联邦航空管理局”,简报,机场地面检测设备模型X(机场)”。2020年5月检索。

金宝app支持功能

defineTrajectoryRules定义轨迹规则

函数trajRules = defineTrajectoryRules%这个函数定义了安全规则方法22 l在跑道上着陆%在波士顿洛根国际机场,马。% helperTrajectoryValidationRule连接作为一个函数使用%这金宝app个例子支持文件%的轨迹必须紧密与跑道方向保持一致。longitudeRule = helperTrajectoryValidationRule ([42.37 - 42.71], [0.4587, -90.4379], [0.5128, -92.730]);%的下滑坡度必须2.5至4度在过去的20963年%米。在距离20963米以上,高度必须至少% 3000英尺。规则是相对于从跑道降落点。altitudeRule1 = helperTrajectoryValidationRule(20963[100],[信德(2.5)0],[信德(4)0]);altitudeRule2 = helperTrajectoryValidationRule(3000 * 0.3048(20963 40000),[信德(4)0]);%的速度120节和180节之间必须降落点。%的速度与距离约束可以增加线性%降落点。speedRule = helperTrajectoryValidationRule (40000) [0, 61.733, e - 3 (100);%收集所有的规则。trajRules = [longitudeRule; altitudeRule1; altitudeRule2 speedRule);结束

validateTrajectory验证每一个轨迹

函数[truthAnomalyFlags, percentAnomalousSteps] = validateTrajectory(轨迹、规则)numTrajectories =元素个数(轨迹);numTrajectories numAnomalousSteps = 0 (1);tr = 1: numTrajectories如果iscell(轨迹)traj = {tr}轨迹;elseifnumTrajectories = = 1 traj =轨迹;其他的traj =轨迹(tr);结束timesamples = (traj.TimeOfArrival (1): traj.TimeOfArrival(结束));[pos, ~,韦尔]= lookupPose (traj timesamples);posECEF = lookupPose (traj timesamples,“ECEF”);landingPoint = (1.536321 -4.462053 4.276352) * 1 e6;i = 1:元素个数(timesamples)距离=规范(posECEF(我,:)- landingPoint);isLongitudeValid =验证(规则(1)、pos(我,1),pos(我,2));isAltitudeValid =(验证规则(2)、距离、pos(我,3)& &验证(规则(3)、距离、pos(我,3)));isSpeedValid =验证(规则(4),距离,规范(韦尔(我,:)));isValid = isLongitudeValid & & isAltitudeValid & & isSpeedValid;numAnomalousSteps (tr) = numAnomalousSteps (tr) + ~ isValid;结束结束percentAnomalousSteps = numAnomalousSteps。/元素个数(timesamples) * 100;truthAnomalyFlags = (percentAnomalousSteps > 1);结束

validateTrack验证跟踪和异常规则

函数(追踪、历史)= validateTracks(跟踪、规则assignedTrackIDs assignedTruthIDs)持续的trackAnomalyHistory如果isempty (trackAnomalyHistory) trackAnomalyHistory = repmat(结构体(“TrackID”0,“AssignedTruthID”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);韦尔= getTrackVelocities(追踪,[0 1 0 0 0 0;0 0 0 1 0 0;0 0 0 0 0 1);numTracks =元素个数(跟踪);landingPoint = (1.536321 -4.462053 4.276352) * 1 e6;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),距离,规范(韦尔(tr,:)));isValid = isLongitudeValid & & isAltitudeValid & & isSpeedValid;其他的isValid = true;结束跟踪(tr)。ObjectClassID = uint8 (~ isValid) + uint8 (isValid) * 6;%为追踪得到正确的颜色%更新anomlay历史历史上=(跟踪(tr)。TrackID = = trackIDs);如果任何(历史上)trackAnomalyHistory(历史上)。NumSteps = trackAnomalyHistory(历史上)。NumSteps + 1;trackAnomalyHistory(历史上)。NumAnomalousSteps = trackAnomalyHistory(历史上)。NumAnomalousSteps + ~ isValid;其他的印第安纳州=找到(trackIDs = = 0, 1,“第一”);trackAnomalyHistory(印第安纳州)。AssignedTruthID = assignedTruthIDs(跟踪(tr)。TrackID = = assignedTrackIDs);trackAnomalyHistory(印第安纳州)。TrackID =跟踪(tr) .TrackID;trackAnomalyHistory(印第安纳州)。NumSteps = 1;trackAnomalyHistory(印第安纳州)。NumAnomalousSteps = ~ isValid;结束结束历史= trackAnomalyHistory;结束

分析——分析跟踪异常历史和真相异常的百分比进行比较

函数comparisonTable =分析(trackAnomalyHistory percentTruthAnomalous) trackAnomalyHistory = trackAnomalyHistory ([trackAnomalyHistory。TrackID] > 0);anomalousSteps = [trackAnomalyHistory.NumAnomalousSteps];numSteps = [trackAnomalyHistory.NumSteps];trackAssignedTruths = [trackAnomalyHistory.AssignedTruthID];assignedTruths =独特(trackAssignedTruths);numTrackAnomalousSteps = 0(元素个数(assignedTruths), 1);numTrackSteps = 0(元素个数(assignedTruths), 1);i = 1:元素个数(assignedTruths)第1 = (assignedTruths (i) = = trackAssignedTruths);numTrackAnomalousSteps (i) =总和(anomalousSteps(第1));numTrackSteps (i) =总和(numSteps(第1));结束percentTrackAnomalous = numTrackAnomalousSteps。/ numTrackSteps * 100;trueAnomaly = (percentTruthAnomalous > 1) ';anomalyFlags = (percentTrackAnomalous > 1);comparisonTable =表((1:20)”,anomalyFlags trueAnomaly“VariableNames”,{“TruthID”,“真理异常标志”,“跟踪异常标志”});结束