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

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

Введение

Пример Simulate and Track En-Route Aircraft in Earth-Centered Scenarios показывает, как отслеживать самолеты с помощью нескольких радиолокационных систем большой дальности и взрывать данные из транспондеров Automatic Dependent Surveillance Broadcast (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 Scenarios. Для этого сначала задаете ту же централизованную 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));

С помощью трекера и track fuser defined, вы задаете trackingArchitecture. Вы добавляете к нему трекер с датчиками 1, 2 и 3, сообщающими в трекер. Вы также добавляете track fuser к trackingArchitecture. The trackingArchitecture направляет fuser источники к fuser на основе fuser's 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.

The 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