Симулируйте и отследите в пути самолет в сосредоточенных землей сценариях

Этот пример показывает вам, как использовать Сосредоточенный Землей trackingScenario и geoTrajectory возразите, чтобы смоделировать траекторию рейса, которая охватывает тысячи километров. Вы используете две различных модели, чтобы сгенерировать синтетические обнаружения самолета: моностатический радар и отчеты ADS-B. Вы используете мультиобъектное средство отслеживания, чтобы оценить плоскую траекторию, сравнить эффективность отслеживания и исследовать удар, который ADS-B обеспечивает на полном качестве отслеживания.

В Соединенных Штатах Федеральное управление авиации (FAA) каждый день ответственно за регулирование тысяч рейсов через целое национальное воздушное пространство. Коммерческие рейсы обычно прослеживаются во все время от их исходного аэропорта до прибытия. Система управления воздушным движением является комплексной многоуровневой системой. Контрольно-диспетчерские пункты аэропорта ответственны за контроль и обработку мгновенной близости аэропорта, в то время как Центры управления движением авиалинии (ARTCC) ответственны за большое расстояние в пути наблюдение через различные области, которые составляют национальное воздушное пространство.

Возможность, а также сложность воздушного движения / радары наблюдения увеличилась значительно за прошлые десятилетия. Сложение транспондеров на самолете добавляет двухстороннюю связь между радарным средством и самолетами, который допускает очень точную оценку положения и приносит пользу принятию решения в центрах управления. В 2 020, все самолеты, летящие выше 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. На постановление [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;

Добавьте станции наблюдения вдоль маршрута

Существует несколько моделей радаров наблюдения дальних, используемых ФАА. Радар Наблюдения Авиалинии 4 (ARSR-4) является радаром, введенным в 1990-х, который может обеспечить 3D возвраты любого объекта на 1 квадратный метр в большом расстоянии 250 морских миль (463 километра). Большинство радаров ARSR-4 расположено вдоль границ континентальной части США, в то время как немного короче располагаются, радары в основном расположены на радарных сайтах ФАА на континенте. В этом примере один радарный тип моделируется после общих технических требований 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

Первый матч рейса далек от любого радара, и обнаружения имеют высокий шум измерения. Кроме того, постоянная скоростная модель движения не моделирует движение хорошо во время начального поворота рейса после взлета. Когда самолет вводит зону охвата второго радара наблюдения, дополнительные обнаружения корректируют дорожку, показанную на втором снимке состояния. Дорожка (в желтом) следует за истиной (в белом) очень тесно, когда это вводит зону охвата второго радара.

Отследите рейс с помощью радаров и ADS-B

Служебная функция adsbDetect использует предполагаемое положение, измеренное самолетом собственный инструмент навигации, смоделированный PoseEstimator свойство платформы. Предполагаемое положение обычно кодируется и широковещательно передается на канале на 1 090 МГц для соседних приемников 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. В управлении воздушным движением динамические состояния интересов являются положениями, представленными широтой, долготой, и высотой, заголовком и groundspeed.

% 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, оказывают значительное влияние на высотную оценку, когда высота является наименее достоверной информацией, о которой сообщают радары. Между тем groundspeed и возглавляющий оценку также улучшен с преимуществом более частых обновлений (каждую секунду по сравнению с каждыми 12 секундами).

Сводные данные

В этом примере вы изучили, как создать сосредоточенный Землей сценарий и задать траектории с помощью геодезических координат. Вы также изучили, как к модели Air Route Surveillance Radars и генерируют синтетические обнаружения. Вы кормите этими обнаружениями мультиобъектное средство отслеживания и оцениваете положение, скорость и заголовок плоскости. Производительность отслеживания улучшается путем добавления и плавления информации о ADS-B. Вы использовали простой подход к отчетам модели ADS-B, и интегрируйте их к отслеживанию решения. В этом примере был смоделирован только один рейс. Однако преимущество ADS-B может быть далее проявлено при моделировании нескольких рейсов в сценарии, где безопасные разделительные расстояния должны быть обеспечены воздушными диспетчерами.

Вспомогательные Функции

simulateScene содержит цикл симуляции, который может быть запущен с или без ADS-B. Сценарий обновляется каждую секунду. Обнаружения ADS-B сгенерированы, каждая секунда и обнаружения ARSR доступны в конце скана каждых 12 секунд. Функциональные выходные параметры предполагаемое положение плоскости как широта (градус), долгота (градус) и высота WGS84 (m), предполагаемая скорость относительно земли (m/s), предполагаемый заголовок (градус) и соответствующее время (времена) симуляции.

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) требования рабочей характеристики

Для просмотра документации необходимо авторизоваться на сайте