В этом примере показано, как определить архитектуру отслеживания системы систем, которая включает в себя несколько многообъектных трекеров уровня обнаружения и алгоритмы слияния уровня дорожки. Вы можете использовать архитектуры отслеживания, чтобы сравнить различные разработки системы отслеживания и найти лучшее решение для вашей системы.
Пример 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);
Архитектура, описанная выше, является только одной возможной архитектурой, и инженеры систем слежения часто рассматривают различные другие опции. Существует много факторов, которые определяют, как система может быть спроектирована, некоторые из них:
Выходы датчика: Некоторые производители датчиков проектируют свои датчики, чтобы выводить списки обнаружений, в то время как другие отслеживают объекты внутренне и предоставляют только дорожки датчика в качестве выходов.
Сети связи: Объем данных, которые необходимо передать, может быть уменьшен, если датчики сообщают о треках вместо обнаружений. Кроме того, задержка, физическое расстояние и другие ограничения могут потребовать, чтобы датчики сообщали о треках.
Вычислительные ресурсы: Обработка всех обнаружений в одном центральном трекере обычно требует большей памяти и расчетов, чем при распределении данных между различными узлами.
Однако существуют причины предпочитать центральную обработку по сравнению с децентрализованными архитектурами. Во-первых, централизованные системы отслеживания могут быть оптимальными, потому что все доступные данные обрабатываются в одном месте, и нет никаких ограничений на обрабатываемые данные. В сложение архитектура намного проще, так как существует только один трекер.
В качестве базовой линии для сравнения вы задаете архитектуру, которая отражает централизованную систему слежения, описанную в примере 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)
Запуск сценария и отслеживание с помощью архитектуры отслеживания
% 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)
The 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