exponenta event banner

Моделирование и отслеживание маршрутных самолетов в сценариях, ориентированных на Землю

В этом примере показано, как использовать центр земли 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

Ссылка

[1] FAR § 91.227 Автоматическое зависимое наблюдение-вещание (ADS-B) Требования к производительности оборудования