Этот пример показывает вам, как использовать Сосредоточенный Землей 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
Первый матч рейса далек от любого радара, и обнаружения имеют высокий шум измерения. Кроме того, постоянная скоростная модель движения не моделирует движение хорошо во время начального поворота рейса после взлета. Когда самолет вводит зону охвата второго радара наблюдения, дополнительные обнаружения корректируют дорожку, показанную на втором снимке состояния. Дорожка (в желтом) следует за истиной (в белом) очень тесно, когда это вводит зону охвата второго радара.
Служебная функция 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