В этом примере показано, как определить архитектуру отслеживания системы-системы, которая включает в себя многообъектные трекеры с несколькими уровнями обнаружения и алгоритмы слияния на уровне отслеживания. Вы можете использовать архитектуры отслеживания, чтобы сравнить различные конструкции систем отслеживания и найти лучшее решение для вашей системы.
Пример «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);
Вышеописанная архитектура является только одной возможной архитектурой, и инженеры системы слежения часто рассматривают различные другие варианты. Есть много факторов, которые определяют, как система может быть построена, некоторые из них:
Выходы датчиков: некоторые производители датчиков проектируют свои датчики для вывода списков обнаружения, в то время как другие отслеживают объекты внутри и предоставляют только следы датчиков в качестве выхода.
Коммуникационные сети: Объем данных, который требуется передать, может быть уменьшен, если датчики сообщают о следах, а не обнаружениях. Кроме того, задержка, физическое расстояние и другие ограничения могут потребовать, чтобы датчики сообщали о дорожках.
Вычислительные ресурсы: Обработка всех обнаружений в одном центральном трекере обычно требует больше памяти и вычислений, чем при распределенной обработке данных между различными узлами.
Однако есть причины предпочитать центральную обработку децентрализованным архитектурам. Во-первых, централизованные системы отслеживания могут быть оптимальными, поскольку все имеющиеся данные обрабатываются в одном месте и нет никаких ограничений на обрабатываемые данные. Кроме того, архитектура намного проще, так как существует только один трекер.
В качестве базовой линии для сравнения можно определить архитектуру, которая отражает централизованную систему слежения, описанную в примере 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)
![]()
Выполнение сценария и отслеживание с использованием архитектуры отслеживания
% 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);
![]()
Вы хотите изучить, как работает система, когда каждый радар сообщает о дорожках уровня датчика, которые слиты с дорожками 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)
![]()
replayScenario функция считывает записанные данные сценария, выполняет шаги по новой архитектуре и отображает результаты.
% Rerun the scenario and observe tracking results
replayScenario(decentralizedArchitecture,scenarioData,viewer)![]()
Другая возможная конфигурация может находиться между централизованной и децентрализованной архитектурами выше. Во многих случаях нет необходимости в центре управления воздушным движением для отслеживания самолетов, которые находятся слишком далеко от него. В этом случае могут использоваться региональные центры управления воздушным движением, где один или несколько радаров сообщают каждому региону.
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)
![]()
% Rerun the scenario and observe tracking results
replayScenario(regionalArchitecture,scenarioData,viewer)![]()
В этом примере вы научились определять архитектуры отслеживания для систем, использующих несколько трекеров и алгоритмы объединения дорожек. Вы видели, как передавать обнаружения и дорожки в качестве входных данных в архитектуру отслеживания и как выводить дорожки из нее.
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