В этом примере показано, как использовать центр земли trackingScenario и geoTrajectory объект для моделирования траектории полета, которая охватывает тысячи километров. Для генерации синтетических обнаружений самолета используются две различные модели: моностатический радар и отчеты ADS-B. Вы используете многообъектный трекер для оценки траектории плоскости, сравнения производительности отслеживания и изучения влияния, которое ADS-B оказывает на общее качество отслеживания.
В Соединенных Штатах Федеральное управление гражданской авиации (FAA) отвечает за регулирование тысяч полетов ежедневно по всему национальному воздушному пространству. Коммерческие рейсы обычно отслеживаются в любое время, от аэропорта вылета до прибытия. Система управления воздушным движением представляет собой сложную многоуровневую систему. Диспетчерские вышки аэропортов отвечают за мониторинг и обработку данных в непосредственной близости от аэропорта, а центры управления воздушным движением (ARTCC) отвечают за дальнее наблюдение в различных регионах, составляющих национальное воздушное пространство.
За последние десятилетия значительно возросли возможности и сложность радаров воздушного движения/наблюдения. Добавление транспондеров на самолете добавляет двустороннюю связь между радиолокационным устройством и самолетами, что позволяет очень точно оценивать положение и принимать решения о преимуществах в центрах управления. В 2020 году все самолеты, пролетающие выше 10 000 футов, должны быть оснащены транспондером автоматического зависимого наблюдения (ADS-B) для трансляции их бортового расчетного положения. Это сообщение принимается и обрабатывается авиадиспетчерами.
Сначала создается сценарий, ориентированный на Землю.
% Save current random generator state s = rng; % Set random seed for predictable results rng(2020); % Create scenario scene = trackingScenario('IsEarthCentered',true,'UpdateRate',1);
matfile flightwaypoints в данном примере содержится синтезированная информация о координатах и времени траектории полета от Уичито до Чикаго. Вы используете geoTrajectory объект для создания траектории полета.
load('flightwaypoints.mat') flightRoute = geoTrajectory(lla,timeofarrival); airplane = platform(scene,'Trajectory',flightRoute);
В настоящее время все коммерческие самолеты оснащены приемниками GPS в составе их бортовых приборов. Для моделирования приборов полета необходимо установить PoseEstimator свойство платформы самолета. В качестве основы ADS-B точность бортовой GPS может быть установлена в соответствии с требованиями ADS-B. Категория точности навигации, используемая в ADS-B для положения и скорости, называется NACp и NACv. Согласно правилам FAA [1], NACp должен быть менее 0,05 морских миль, а NACv - менее 10 метров в секунду. В этом примере используется insSensor модель с точностью положения 100 м и точностью скорости 10 м/с.
onboardINS = insSensor('PositionAccuracy',100,'VelocityAccuracy',10,... "RandomStream","mt19937ar with seed"); airplane.PoseEstimator = onboardINS; load('737rcs.mat'); airplane.Signatures{1} = boeing737rcs;
Существует несколько моделей радаров дальнего наблюдения, используемых FAA. Радар наблюдения за воздушными маршрутами 4 (ARSR-4) - радар, введённый в 1990-х годах, который может обеспечивать 3D возврат любого 1 квадратного метра объекта на дальность 250 морских миль (463 километра). Большинство ARSR-4 РЛС расположены вдоль границ континентальной части США, в то время как РЛС несколько меньшей дальности в основном расположены на радиолокационных объектах FAA на континенте. В этом примере один тип радара моделируется в соответствии с общими спецификациями ARSR-4, как указано ниже:
Частота обновления: 12 с
Максимальная дальность (1 метр-квадрат): 463 км
Разрешение по дальности: 323 м
Точность диапазона: 116 м
Азимутальное поле зрения: 360 град.
Разрешение по азимуту: 1,4 град.
Точность по азимуту: 0,176 град.
Точность по высоте: 900 м
К сценарию для каждой радиолокационной площадки добавляется платформа. Сигнатура RCS этих платформ установлена равной -50 децибел, чтобы избежать создания нежелательных радарных возвращений.
По умолчанию о обнаружениях РЛС сообщается в корпусе РЛС, который в данном случае является локальным кадром NED в положении каждой РЛС. Однако в этом примере устанавливается значение DetectionCoordinates свойство для Scenario для вывода обнаружений в кадре ECEF, что позволяет трекеру обрабатывать все обнаружения от различных радиолокационных станций в общем кадре.
% Model an ARSR-4 radar updaterate = 1/12; fov = [360;30.001]; elAccuracy = atan2d(0.9,463); % 900m accuracy @ max range elBiasFraction = 0.1; arsr4 = monostaticRadarSensor(1,'UpdateRate',updaterate,... 'FieldOfView',fov,..., 'HasElevation',true,... 'ScanMode','Mechanical',... 'MechanicalScanLimits',[0 360; -30 0],... 'HasINS',true,... 'HasRangeRate',true,... 'HasFalseAlarms',false,... 'ReferenceRange',463000,... 'ReferenceRCS',0,... 'AzimuthResolution',1.4,... 'AzimuthBiasFraction',0.176/1.4,... 'ElevationResolution',elAccuracy/elBiasFraction,... 'ElevationBiasFraction',elBiasFraction,... 'RangeResolution', 323,... 'RangeBiasFraction',116/323,... Accuracy / Resolution 'RangeRateResolution',100,... 'DetectionCoordinates','Scenario'); % Add ARSR-4 radars at each ARTCC site radarsitesLLA = [41.4228 -88.0583 0;... 40.6989 -89.8258 0;... 39.2219 -95.2461 0]; for i=1:3 radar = clone(arsr4); radar.SensorIndex = i; platform(scene,'Position',radarsitesLLA(i,:),... 'Signatures',rcsSignature('Pattern',-50),'Sensors',{radar}); end
Как правило, один ARTCC поддерживает дорожки для всех объектов в пределах своей зоны наблюдения и передает информацию отслеживания следующему ARTCC, когда объект летит в новую зону. В этом примере определяется единый централизованный трекер для всех радаров. Вы используете trackerGNN объект для взрывания радиолокационных обнаружений самолета с множества РЛС с другой сенсорной информацией, такой как ADS-B.
tracker = trackerGNN('FilterInitializationFcn',@initfilter,... 'ConfirmationThreshold',[3 5],... 'DeletionThreshold',[5 5],... 'AssignmentThreshold',[1000 Inf]);
Вы используете helperGlobeViewer объект, прикрепленный в этом примере для отображения платформ, траекторий, обнаружений и дорожек на Земле.
gl = helperGlobeViewer; setCamera(gl,[28.9176 -95.3388 5.8e5],[0 -30 10]); % Show radar sites plotPlatform(gl,scene.Platforms(2:end),'d'); % Show radar coverage covcon = coverageConfig(scene); plotCoverage(gl,covcon); % Show flight route plotTrajectory(gl,airplane); % Take a snapshot snap(gl);

В этом первом моделировании вы будете моделировать сцену и отслеживать плоскость исключительно на основе радаров большой дальности.
useADSB = false; snapTimes = [300 1600]; % Declare loop variables detBuffer = {}; tLLA = []; tHeading = []; tSpeed = []; tTime = []; images = {}; % Set updata rates in seconds trackupdatetime = 12; adsbupdatetime = 1; arsrupdatetime = 12; while advance(scene) time = scene.SimulationTime; % Update position of airplane on the globe plotTarget(gl,'airplane',airplane,'^','full'); % Generate radar detections at the defined rate if mod(time,arsrupdatetime) == 0 % Generate synthetic radar detections dets = detect(scene); dets = removeBelowGround(dets); detBuffer = [detBuffer; dets]; %#ok<AGROW> end % Generate ADS-B detections at the defined rate if useADSB && mod(time,adsbupdatetime) == 0 adsb = adsbDetect(time,airplane); detBuffer = [detBuffer; adsb]; %#ok<AGROW> end % Fuse detections in tracker and update tracks on the globe if mod(time,trackupdatetime) == 0 && time > 0 % Update detections on the globe plotDetection(gl,detBuffer); % Tracker needs detections for first call i.e. cond = ~isempty(detBuffer) || ~isLocked(tracker); if cond tracks = tracker(detBuffer,time); if ~isempty(tracks) % Record the estimated airplane data [tLLA, tSpeed, tHeading, tTime] = ... helperNavigationData(tracks,tLLA, tSpeed, tHeading, tTime); end plotTrack(gl,tracks); detBuffer = {}; end end % Move camera and take snapshots images = moveCamera(gl,time,snapTimes,images); end
Следует отметить, что детекторы ARSR относительно неточны по высоте, что в целом приемлемо, поскольку авиадиспетчеры разделяют самолеты по горизонтали, а не по вертикали. Наименьшие точные обнаружения генерируются радиолокационными объектами, расположенными на больших дальностях. Эти обнаружения тем не менее связаны с дорожкой. На рисунке белая линия представляет истинную траекторию, а желтая линия - траекторию, оцененную трекером.
for i=1:numel(images) figure imshow(images{i}); end


Первая ветвь полета далека от любого радара и детекторы имеют высокий измерительный шум. Кроме того, модель движения с постоянной скоростью плохо моделирует движение во время начального разворота полета после взлета. Когда самолет входит в зону действия второго радара наблюдения, дополнительные обнаружения исправляют дорожку, показанную на втором снимке. Дорожка (желтым цветом) следует истине (белым цветом) гораздо ближе, когда она входит в зону покрытия второго радара.
Функция утилиты adsbDetect использует расчетное положение, измеренное собственным навигационным прибором самолета, смоделированным PoseEstimator свойство платформы. Предполагаемое положение обычно кодируется и транслируется по каналу 1090 МГц для соседних приемников ADS-B. в США почти полное покрытие коммерческих рейсов, курсирующих на высотах 10 000 метров или ниже.
useADSB = true; snapTimes = [200 1244]; [trackLLA2, trackSpeed2, trackHeading2, trackTime2, images] = ... simulateScene(gl,scene,tracker,useADSB,snapTimes); % Reset random seed rng(s);
Ниже показано отображение снимков в то же время моделирования, что и в предыдущем разделе.
for i=1:numel(images) figure imshow(images{i}); end


Обнаружения ADS-B представлены фиолетовым цветом на земном шаре. Дорожка более близко совпадает с наземной правдой, хотя при входе в среднюю зону действия радара существенного улучшения не наблюдается.
Сравнение записанных данных дорожки выполняется в обоих моделированиях. Истинное положение и скорость доступны из geoTrajectory. В управлении воздушным движением динамическими состояниями интересов являются позиции, представленные широтой, долготой, высотой над уровнем моря, курсом и нулевой скоростью.
% Query truth at the recorded timestamps for both runs [trueLLA, ~, trueVel] = lookupPose(flightRoute,tTime); [trueLLAadsb, ~, trueVeladsb] = lookupPose(flightRoute,trackTime2); figure tiledlayout(3,1); nexttile hold on plot(tTime/60,trueLLA(:,3),'LineWidth',2,'LineStyle','--','DisplayName','Truth'); plot(tTime/60,tLLA(:,3),'DisplayName','Surveillance radar only'); plot(trackTime2/60,trackLLA2(:,3),'DisplayName','Surveillance radar + ADS-B'); legend('Location','northeastoutside') xlabel('Time (minute)'); ylabel('Altitude (meter)') title('Altitude') nexttile hold on plot(tTime/60,vecnorm(trueVel(:,(1:2)),2,2),'LineWidth',2,'LineStyle','--'); plot(tTime/60,tSpeed); plot(trackTime2/60,trackSpeed2); xlabel('Time (minute)'); ylabel('Speed (m/s)') title('Groundspeed') nexttile hold on plot(tTime/60,atan2d(trueVel(:,2),trueVel(:,1)),'LineWidth',2,'LineStyle','--'); plot(tTime/60,tHeading); plot(trackTime2/60,trackHeading2); xlabel('Time (minute)'); ylabel('Heading (degree)') title('Heading')

Результаты показывают, что дополнительные данные, предоставляемые ADS-B, оказывают значительное влияние на оценку высоты, поскольку высота является наименее точной информацией, сообщаемой радарами. Между тем, оценка скорости и курса также улучшается с помощью более частых обновлений (каждая секунда против каждые 12 секунд).
В этом примере вы научились создавать сценарий с центром Земли и определять траектории с помощью геодезических координат. Вы также научились моделировать радары наблюдения за воздушными маршрутами и создавать синтетические детекторы. Эти обнаружения подаются в многообъектный трекер и оценивают положение, скорость и курс плоскости. Эффективность отслеживания улучшается за счет добавления и слияния информации ADS-B. Вы использовали простой подход к моделированию отчетов ADS-B и их интеграции в решение для отслеживания. В этом примере был смоделирован только один полёт. Однако преимущества ADS-B могут быть еще больше проявлены при моделировании нескольких полетов в сценарии, когда авиадиспетчеры должны поддерживать безопасные разделительные расстояния.
simulateScene содержит цикл моделирования, который может выполняться с ADS-B или без нее. Сценарий обновляется каждую секунду. Обнаружения ADS-B генерируются каждую секунду, и обнаружения ARSR доступны в конце сканирования каждые 12 секунд. Функция выводит расчетное положение плоскости в виде широты (град), долготы (град) и высоты WGS84 (м), расчетной наземной скорости (м/с), расчетного курса (град) и соответствующего времени (ов) моделирования.
function [tLLA,tSpeed,tHeading,tTime,images] = simulateScene(gl,scene,tracker,useADSB,snapTimes) % Reset the scenario, globe, and seed rng(2020); restart(scene); airplane = scene.Platforms{1}; release(tracker); clear(gl); setCamera(gl,[39.4563 -90.1187 2.356e6]); % Display initial state of the scene covcon = coverageConfig(scene); plotPlatform(gl,scene.Platforms(2:end),'d'); plotCoverage(gl,covcon); % Declare loop variables detBuffer = {}; tLLA = []; tHeading = []; tSpeed = []; tTime = []; images = {}; % Set update rates in seconds if useADSB trackupdatetime = 1; else trackupdatetime = 12; end adsbupdatetime = 1; arsrupdatetime = 12; while advance(scene) time = scene.SimulationTime; % Update position of airplane on the globe plotTarget(gl,'airplane',airplane,'^','full'); % Generate radar detections at the defined rate if mod(time,arsrupdatetime) == 0 && time > 0 % Generate synthetic radar detections dets = detect(scene); dets = removeBelowGround(dets); detBuffer = [detBuffer; dets]; %#ok<AGROW> end % Generate ADS-B detections at the defined rate if useADSB && mod(time,adsbupdatetime) == 0 adsb = adsbDetect(time,airplane); detBuffer = [detBuffer; adsb]; %#ok<AGROW> end % Update detections on the globe plotDetection(gl,detBuffer); % Fuse detections in tracker and update tracks on the globe if mod(time,trackupdatetime) == 0 && time > 0 % Tracker needs detections for first call cond = ~(isempty(detBuffer) && ~isLocked(tracker)); if cond tracks = tracker(detBuffer,time); if ~isempty(tracks) % Record the estimated airplane data [tLLA, tSpeed, tHeading, tTime] = ... helperNavigationData(tracks,tLLA, tSpeed, tHeading, tTime); end plotTrack(gl,tracks); detBuffer = {}; end end % Move camera and take snapshots images = moveCamera(gl,time,snapTimes,images); end end
adsbDetect генерирует обнаружение самолета на основе его бортового набора датчиков, смоделированного insSensor.
function detection = adsbDetect(time,airplane,~) %adsbDetect generate ADS-B detections estimpose = pose(airplane,'CoordinateSystem','Cartesian'); meas = [estimpose.Position(:) ; estimpose.Velocity(:)]; measnoise = diag([100 100 100 10 10 10].^2); mparams = struct('Frame','Rectangular',... 'OriginPositin',zeros(3,1),... 'OriginVelocity',zeros(3,1),... 'Orientation',eye(3),... ADS-B does not report orientation 'IsParentToChild', 1,... 'HasAzimuth', 1,... 'HasElevation', 1,... 'HasRange', 1, ... 'HasVelocity', 1); attr ={ struct('TargetIndex',airplane.PlatformID,'SNR',10)}; detection = {objectDetection(time, meas, 'SensorIndex',20,... 'MeasurementNoise',measnoise,... 'MeasurementParameters',mparams,... 'ObjectAttributes',attr)}; end
initfilter определяет расширенный калмановый фильтр, используемый trackerGNN. Движение самолета хорошо аппроксимируется моделью движения с постоянной скоростью. Поэтому довольно небольшой технологический шум придаст больше веса динамике по сравнению с измерениями, которые, как ожидается, будут достаточно шумными на больших расстояниях.
function filter = initfilter(detection) filter = initcvekf(detection); filter.StateCovariance = 4*filter.StateCovariance; % initcvekf uses measurement noise as the default filter.ProcessNoise = 0.02*eye(3); end
removeBelowGround удаляет радиолокационные обнаружения, которые лежат под поверхностью Земли, поскольку они не могут быть созданы настоящим радаром.
function detsout = removeBelowGround(detsin) n = numel(detsin); keep = zeros(1,n,'logical'); for i=1:n meas = detsin{i}.Measurement(1:3)'; lla = fusion.internal.frames.ecef2lla(meas); if lla(3)>0 keep(i) = true; else keep(i) = false; end end detsout = detsin(keep); end
moveCamera определяет новые позиции камеры для наблюдения за самолетом и создания снимков.
function images = moveCamera(gl, time, snapTimes,images) if time == 120 setCamera(gl,[37, -97.935, 4.328e4],[0 -23 30]); end if time == 1244 setCamera(gl,[38.8693 -95.6109 1.214e4],[0 -26.8 38.7]); end if time == 1445 setCamera(gl,[37.995, -94.60 6.87e4],[0 -15 2]); end if time == 2100 setCamera(gl, [38.9747 -94.6385 1.3e5], [0 -20 55]); end if time == 3000 setCamera(gl,[41.636 -87.011 6.33e4],[0 -25 270]); end % Snaps if any(time == snapTimes) img = snap(gl); images = [ images, {img}]; end end