exponenta event banner

Определение и тестирование архитектур отслеживания систем

В этом примере показано, как определить архитектуру отслеживания системы-системы, которая включает в себя многообъектные трекеры с несколькими уровнями обнаружения и алгоритмы слияния на уровне отслеживания. Вы можете использовать архитектуры отслеживания, чтобы сравнить различные конструкции систем отслеживания и найти лучшее решение для вашей системы.

Введение

Пример «Simulate» и «Track En-Route Aircraft in Earth-Centered Scriptions» показывает, как отслеживать самолеты с помощью нескольких радиолокационных систем дальнего радиуса действия и взрывать данные с транспондеров автоматического зависимого наблюдения (ADS-B) для получения точной картины воздушной обстановки. В этом примере радиолокационные детекторы сливаются централизованно трекером перед тем, как эти дорожки сливаются с трассами из отчетов ADS-B. Сначала необходимо загрузить данные сценария из этого примера и настроить глобальную визуализацию.

% Create the scenario and globe viewer
load('recordedScenario','scenarioData');
viewer = createGlobe(scenarioData);

Вышеописанная архитектура является только одной возможной архитектурой, и инженеры системы слежения часто рассматривают различные другие варианты. Есть много факторов, которые определяют, как система может быть построена, некоторые из них:

  1. Выходы датчиков: некоторые производители датчиков проектируют свои датчики для вывода списков обнаружения, в то время как другие отслеживают объекты внутри и предоставляют только следы датчиков в качестве выхода.

  2. Коммуникационные сети: Объем данных, который требуется передать, может быть уменьшен, если датчики сообщают о следах, а не обнаружениях. Кроме того, задержка, физическое расстояние и другие ограничения могут потребовать, чтобы датчики сообщали о дорожках.

  3. Вычислительные ресурсы: Обработка всех обнаружений в одном центральном трекере обычно требует больше памяти и вычислений, чем при распределенной обработке данных между различными узлами.

Однако есть причины предпочитать центральную обработку децентрализованным архитектурам. Во-первых, централизованные системы отслеживания могут быть оптимальными, поскольку все имеющиеся данные обрабатываются в одном месте и нет никаких ограничений на обрабатываемые данные. Кроме того, архитектура намного проще, так как существует только один трекер.

Архитектура централизованного воздушного наблюдения

В качестве базовой линии для сравнения можно определить архитектуру, которая отражает централизованную систему слежения, описанную в примере Simulate и Track En-Route Aircraft in Earth-Centered Scriptions. Для этого сначала необходимо определить один и тот же централизованный trackerGNN для радаров. Обратите внимание, что РЛС обновляются каждые 12 секунд, а приемник ADS-B обновляется каждую секунду. Чтобы разместить различные скорости обновления, вы переносите трекер внутрь helperScheduledTracker объект.

gnn = trackerGNN(...
    'TrackerIndex',2,...
    'FilterInitializationFcn',@initfilter,...
    'ConfirmationThreshold',[3 5],...
    'DeletionThreshold',[5 5],...
    'AssignmentThreshold',[1000 Inf]);

tracker = helperScheduledTracker(gnn, 12);

ADS-B и трекер определяются как два источника, слитые trackFuser. Обратите внимание, что SourceIndex значение для каждой конфигурации источника должно соответствовать SourceIndex значение дорожек ADS-B (1) и TrackerIndex значение трекера (2). Кроме того, FuserIndex значение также должно быть уникальным. В этом случае устанавливается значение 3.

sources = {...
    fuserSourceConfiguration("SourceIndex", 1);... % ADS-B
    fuserSourceConfiguration("SourceIndex", 2) ... % Tracker
    };

fuser = trackFuser("FuserIndex",3, ...
    "MaxNumSources", 2,...
    "SourceConfigurations", sources, ...
    "AssignmentThreshold", [1000 Inf],...
    "StateFusion", "Intersection",...
    "StateFusionParameters", "trace",...
    "ProcessNoise", 10*eye(3));

При определении трекера и путевого фузера определяется trackingArchitecture. К нему добавляется трекер с датчиками 1, 2 и 3, сообщающими трекеру. Вы также добавляете путевой фузер в trackingArchitecture. trackingArchitecture направляет источники фузера на фузер на основе SoucreConfigurations собственность. Наконец, вы используете show объектная функция для отображения архитектуры.

centralizedArchitecture = trackingArchitecture;
addTracker(centralizedArchitecture,tracker,'Name','Tracker','SensorIndices',[1 2 3],'ToOutput',false);
addTrackFuser(centralizedArchitecture,fuser,'Name','Fuser','ToOutput',true);
show(centralizedArchitecture)

Figure contains an axes. The axes with title Tracking Architecture: centralizedArchitecture contains 30 objects of type rectangle, text, line, patch.

Выполнение сценария и отслеживание с использованием архитектуры отслеживания

% Clear previous viewer data and reset the architecture if previously used
clear(viewer);
plotTruth(scenarioData, viewer);
reset(centralizedArchitecture);

for i = 1:numel(scenarioData)
    % Read the timestamp from the recorded scenario data
    time = scenarioData(i).Time;
    
    % Read detections from all radars in the scenario
    detections = scenarioData(i).Detections;
    
    % Update detections on the globe
    plotDetection(viewer, detections);
    
    % Read ADS-B tracks
    truePose = scenarioData(i).TruePose;
    adsbTracks = scenarioData(i).ADSBTrack;
    
    % Pass the detections and ADS-B tracks to the tracking architecture
    tracks = centralizedArchitecture(detections,adsbTracks,time);
    
    % Update display
    plotTrack(viewer, tracks);
end
% Provide an output image
snap(viewer);

Figure contains an axes. The axes contains an object of type image.

Децентрализованная архитектура

Вы хотите изучить, как работает система, когда каждый радар сообщает о дорожках уровня датчика, которые слиты с дорожками ADS-B по алгоритму слияния на уровне дорожки. Вы определяете trackingArchitecture это представляет собой эту децентрализованную архитектуру.

decentralizedArchitecture = trackingArchitecture;

Далее определяется трекер для каждого радара. В исходном примере имеется три радиолокационных датчика, поэтому определяются три трекера. Для простоты предположим, что эти трекеры определены так же, как и центральный случай. Поскольку SourceIndex треков ADS-B имеет значение 1, вы определяете трекеры с помощью TrackerIndex 2, 3 и 4. Между тем, радиолокационные обнаружения имеют SensorIndex = 1, 2 и 3.

sensorTracker = trackerGNN(...
    'TrackerIndex',2,...
    'FilterInitializationFcn',@initfilter,...
    'ConfirmationThreshold',[3 5],...
    'DeletionThreshold',[5 5],...
    'AssignmentThreshold',[1000 Inf]);

% Add one tracker to each radar
for i = 2:4
    tracker = helperScheduledTracker(clone(sensorTracker),12);
    tracker.TrackerIndex = i; % Specify each radar tracker with a different index
    addTracker(decentralizedArchitecture, tracker, 'Name', strcat('Radar',num2str(i-1)), 'SensorIndices', i-1, 'ToOutput', false); % Connect the tracker to the correct radar index 
end

Вы добавляете trackFuser плавление гусениц из четырех источников, ADS-B и трех радиолокационных трекеров.

% Define the sources
sources = {...
    fuserSourceConfiguration(1);... % ADS-B
    fuserSourceConfiguration(2);... % Tracker for radar 1
    fuserSourceConfiguration(3);... % Tracker for radar 2
    fuserSourceConfiguration(4);... % Tracker for radar 3
    };

% Add the fuser
fuser = trackFuser("FuserIndex", 5, ...
    "MaxNumSources", 4,...
    "SourceConfigurations", sources, ...
    "AssignmentThreshold", [1000 Inf],...
    "StateFusion", "Intersection", ...
    "StateFusionParameters", "trace", ...
    "ProcessNoise", 10*eye(3));
addTrackFuser(decentralizedArchitecture, fuser, 'Name', 'Fuser');

% Show the tracking architecture in a figure
show(decentralizedArchitecture)

Figure contains an axes. The axes with title Tracking Architecture: decentralizedArchitecture contains 38 objects of type rectangle, text, line, patch.

replayScenario функция считывает записанные данные сценария, выполняет шаги по новой архитектуре и отображает результаты.

% Rerun the scenario and observe tracking results
replayScenario(decentralizedArchitecture,scenarioData,viewer)

Figure contains an axes. The axes contains an object of type image.

Архитектура регионального воздушного наблюдения

Другая возможная конфигурация может находиться между централизованной и децентрализованной архитектурами выше. Во многих случаях нет необходимости в центре управления воздушным движением для отслеживания самолетов, которые находятся слишком далеко от него. В этом случае могут использоваться региональные центры управления воздушным движением, где один или несколько радаров сообщают каждому региону.

regionalArchitecture = trackingArchitecture;
for i = 2:4
    tracker = helperScheduledTracker(clone(sensorTracker),12);
    tracker.TrackerIndex = i; % Specify each radar with a different index
    addTracker(regionalArchitecture, tracker, 'Name', strcat('Radar',num2str(i-1)), 'SensorIndices', i-1, 'ToOutput', false);
end

Определите две области и прикрепите к каждой по два радиолокационных датчика. Кроме того, каждый регион предохраняет ADS-B только в том случае, если сообщающий самолет находится достаточно близко к региону.

region1Fuser = trackFuser('FuserIndex',5, 'MaxNumSources',3, ...
    'SourceConfigurations',sources([1,2,3]),... % Two radars and ADS-B
    "AssignmentThreshold",[1000 Inf],... 
    "StateFusion",'Intersection',...
    'StateFusionParameters','trace',...
    'ProcessNoise',10*eye(3)); 
region2Fuser = trackFuser('FuserIndex',6, 'MaxNumSources',3, ...
    'SourceConfigurations',sources([1,3,4]),... % Two radars and ADS-B
    "AssignmentThreshold",[1000 Inf],... 
    "StateFusion",'Intersection',...
    'StateFusionParameters','trace',...
    'ProcessNoise',10*eye(3));
addTrackFuser(regionalArchitecture, region1Fuser, 'Name', 'Region1');
addTrackFuser(regionalArchitecture, region2Fuser, 'Name', 'Region2');
show(regionalArchitecture)

Figure contains an axes. The axes with title Tracking Architecture: regionalArchitecture contains 48 objects of type rectangle, text, line, patch.

% Rerun the scenario and observe tracking results
replayScenario(regionalArchitecture,scenarioData,viewer)

Figure contains an axes. The axes contains an object of type image.

Резюме

В этом примере вы научились определять архитектуры отслеживания для систем, использующих несколько трекеров и алгоритмы объединения дорожек. Вы видели, как передавать обнаружения и дорожки в качестве входных данных в архитектуру отслеживания и как выводить дорожки из нее.

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

createGlobe Создание визуализации глобуса

function gl = createGlobe(scenarioData)
% You use the helperGlobeViewer object attached in this example to display
% platforms, trajectories, detections, and tracks on the Earth.
gl = helperGlobeViewer;
setCamera(gl,[28.9176  -95.3388  5.8e5],[0 -30 10]);

% Show flight route
plotTruth(scenarioData, gl);
end

plotTruth строит график положения истинности земли

function plotTruth(scenarioData, viewer)
poses = [scenarioData.TruePose];
positions = vertcat(poses.Position);
plotLines(viewer, positions(:,1), positions(:,2), positions(:,3))
end

initfilter определяет расширенный фильтр Калмана, используемый трекером

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

function filter = initfilter(detection)
filter = initcvekf(detection);
filter.StateCovariance = 10*filter.StateCovariance; % initcvekf uses measurement noise as the default
filter.ProcessNoise = eye(3);
end

replayScenario Воспроизводит записанный сценарий и генерирует результаты

function replayScenario(arch,scenarioData,viewer)
clear(viewer);
plotTruth(scenarioData, viewer);
reset(arch);
numFusers = numel(arch.TrackFusers);
tracks = cell(1,numFusers);
for i = 1:numel(scenarioData)
    time = scenarioData(i).Time;
    
    % Create detections from all radars in the scenario
    detections = scenarioData(i).Detections;
    
    % Update detections on the globe
    plotDetection(viewer, detections);
    
    % Generate ADS-B tracks
    adsbTracks = scenarioData(i).ADSBTrack;
    
    % Pass the detections and ADS-B tracks to the tracking architecture
    [tracks{1:numFusers}] = arch(detections,adsbTracks,time);
    
    % Update display
    plotTrack(viewer, vertcat(tracks{:}));
end
snap(viewer);
end