Этот пример иллюстрирует отслеживание объектов с помощью измерений от пространственно распределенных и синхронных пассивных датчиков. В Расположении Пассивного элемента Используя Один Датчик Маневрирования вы узнали, что пассивные измерения обеспечивают неполную наблюдаемость состояния цели и как один датчик может быть выведен, чтобы получить информацию об области значений. В качестве альтернативы несколько стационарных датчиков могут также использоваться, чтобы получить наблюдаемость. В этом примере вы изучите, как отследить несколько объектов путем плавления нескольких обнаружений от пассивных синхронных датчиков.
В синхронизируемой проблеме отслеживания мультицели мультидатчика обнаружения от нескольких пассивных датчиков собраны синхронно и используются, чтобы оценить следующее:
Количество целей в сценарии
Положение и скорость тех целей
Этот пример демонстрирует использование Статического Fusion Прежде, чем Отследить [1] архитектура для отслеживания использующих пассивных измерений. Статическая часть Fusion архитектуры стремится триангулировать наиболее вероятный набор обнаружений и выводить сплавленные обнаружения, содержащие оцененные положения целей. Когда измерения должны быть сплавлены вместе статическим сплавом, датчики должны сообщить об измерениях синхронно.
С измерениями, содержащими только информацию об угле обзора (LOS), по крайней мере 2 датчика необходимы, чтобы найти положение. Однако с 2 датчиками, проблема двоения (пересечения в точках без целей) происходит, когда несколько целей лежат в той же плоскости. С 2 целями и 2 датчиками, невозможно идентифицировать правильную пару от одной системы координат измерений, как продемонстрировано в рисунке ниже:
Поэтому нужно использовать 3 или больше датчика, чтобы уменьшать проблему двоения. Из-за присутствия шума измерения и ложных измерений, это затрудняет, чтобы устранить проблему двоения полностью. Раздвоитесь триангуляции, возвращенные статической ассоциацией, вероятно, будут отброшены динамическими блоками ассоциации как геометрия целей и изменений датчиков во время сценария.
Относительное размещение датчиков и целей в сценарии, используемом здесь, взято из примера в [1]. Сценарий состоит из пяти равномерно распределенных целей, наблюдаемых тремя - пятью пассивными датчиками. Пассивные обнаружения моделируются с помощью radarEmitter
и fusionRadarSensor
с DetectionMode
установите на ESM
. HasNoise
свойство датчиков установлено в false
сгенерировать бесшумные обнаружения наряду с ложными предупреждениями. Шум добавляется к измерениям в этом примере через управляемую пользователями переменную. Это должно симулировать эффект шума датчика на статическом сплаве. Каждый датчик имеет поле зрения 180 градусов в области азимута и FalseAlarmRate
из 1e-3 на ячейку разрешения азимута. Это приводит к 2 - 3 ложным предупреждениям на скан. Определение сценария перенесено в функции помощника helperGenerateFusionScenarioData
.
[detectionBuffer,truthLog,theaterDisplay] = helperGenerateStaticFusionScenarioData; showScenario(theaterDisplay);
showGrabs(theaterDisplay,[]);
В этом разделе только рассматриваются измерения от внутренних трех датчиков, и ковариация шума измерения для каждого датчика установлена в 0,01 градуса, в квадрате.
Обнаружения от каждого датчика передаются staticDetectionFuser
. MeasurementFusionFcn
поскольку пассивная триангуляция задана как triangulateLOS
. MeasurementFusionFcn
позволяет задавать функцию, чтобы плавить данную комбинацию обнаружений (самое большее одно обнаружение от каждого датчика) и возвратить сплавленное положение и его ошибочную ковариацию. Параметры FalseAlarmRate
объем
и DetectionProbability
заданы, чтобы отразить параметры датчиков, симулированных в этом сценарии. Эти параметры используются, чтобы вычислить вероятность выполнимых ассоциаций. UseParallel
свойство, когда установлено в true
, позволяет термофиксатору оценивать выполнимые ассоциации с помощью параллельных процессоров.
Отслеживание выполняется ассоциацией данных GNN при помощи trackerGNN
.
Эффективность отслеживания оценена с помощью trackAssignmentMetrics
и trackErrorMetrics
.
Настройка
% Number of sensors numSensors = 3; % Create a detection fuser using triangulateLOS function as the % MeasurementFusionFcn and specify parameters of sensors. fuser = staticDetectionFuser('MeasurementFusionFcn',@triangulateLOS,... 'MaxNumSensors',numSensors,... 'UseParallel',true,... 'FalseAlarmRate',1e-3,... 'Volume',0.0716,... 'DetectionProbability',0.99); % Tracking using a GNN tracker tracker = trackerGNN('AssignmentThreshold',45,... 'ConfirmationThreshold',[3 5],'DeletionThreshold',[4 5]); % Use assignment and error metrics to compute accuracy. trackingMetrics = trackAssignmentMetrics('DistanceFunctionFormat','custom',... 'AssignmentDistanceFcn',@trueAssignment,'DivergenceDistanceFcn',@trueAssignment); errorMetrics = trackErrorMetrics;
Запустите симуляцию с тремя датчиками
% Measurement noise measNoise = 0.01; time = 0; % simulation time dT = 1; % 1 Hz update rate of scenario. % Loop through detections and track targets for iter = 1:numel(detectionBuffer) % Truth information sensorPlatPoses = truthLog{iter}(1:numSensors); targetPlatPoses = truthLog{iter}(6:end); groundTruth = [sensorPlatPoses;targetPlatPoses]; % Generate noisy detections using recorded detections thisBuffer = detectionBuffer{iter}; availableDetections = vertcat(thisBuffer{1:numSensors}); noiseDetections = addNoise(availableDetections,measNoise); % Fuse noisy detections using fuser fusedDetections = fuser(noiseDetections); % Run a tracker on fused detections confTracks = tracker(fusedDetections,time); % Update track and assignment metrics trackingMetrics(confTracks,targetPlatPoses); [trackIDs,truthIDs] = currentAssignment(trackingMetrics); errorMetrics(confTracks,trackIDs,targetPlatPoses,truthIDs); % Update theater display detsToPlot = [noiseDetections(:);fusedDetections(:)]; theaterDisplay(confTracks,detsToPlot,groundTruth); % Increment simulation time time = time + dT; end axes(theaterDisplay.TheaterPlot.Parent);
ylim([0 1.5]);
Результаты отслеживания использования трех датчиков с 0,01 в квадрате градусами из шумовой ковариации могут быть получены в итоге с помощью метрик присвоения. Обратите внимание на то, что все дорожки были присвоены правильным истинам, и никакие ложные дорожки не были подтверждены средством отслеживания. Эти результаты показывают на хорошую статическую точность ассоциации.
assignmentTable = trackMetricsTable(trackingMetrics); assignmentTable(:,{'TrackID','AssignedTruthID','TotalLength','FalseTrackStatus'})
ans = 5×4 table TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 3 10 59 false 6 7 59 false 7 6 59 false 10 9 58 false 11 8 58 false
Ошибка в предполагаемом положении и скорости целей может быть получена в итоге с помощью ошибочных метрик. Ошибки в положении и скорости в 7 метрах и 2 метрах/секунда соответственно для всех целей, и нормированные ошибки близко к 1. Ошибочные метрики указывают на хорошую динамическую ассоциацию и эффективность отслеживания.
disp(cumulativeTrackMetrics(errorMetrics));
TrackID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 3 6.8821 1.595 2.51 0.80396 6 3.9895 1.1149 1.6409 0.5416 7 5.8195 1.3356 1.9041 0.66745 10 4.2425 1.2514 1.6719 0.62374 11 3.6443 1.1453 1.375 0.55326
Эффект точности измерения
Сплав пассивных обнаружений, чтобы устранить двоение очень зависит от точности пассивных измерений. Когда шум измерения увеличивается, различие между фантомными ассоциациями и истинными ассоциациями становится менее видным, приводя к значительному понижению точности статической ассоциации. С близко расположенными целями может также произойти неправильная ассоциация сплавленных обнаружений к дорожкам. В следующем разделе помощник функционирует helperRunStaticFusionSimulation
используется, чтобы повторно выполниться, сценарий с ковариацией шума измерения 2 градусов придал квадратную форму.
Запустите сценарий снова с высоким шумом измерения
numSensors = 3;
measNoise = 2; %standard deviation of sqrt(2) degrees
[trackingMetrics,errorMetrics] = helperRunStaticFusionSimulation(detectionBuffer,truthLog,numSensors,measNoise,theaterDisplay,false);
axes(theaterDisplay.TheaterPlot.Parent);
ylim([0 1.5]);
Обратите внимание на то, что несколько дорожек были подтверждены и затем заглядывали этой симуляции. Плохая статическая точность ассоциации ведет, чтобы повторять целевые триангуляции чаще, который приводит к средству отслеживания, удаляя эти дорожки из-за нескольких промахов.
assignmentTable = trackMetricsTable(trackingMetrics); assignmentTable(:,{'TrackID','AssignedTruthID','TotalLength','FalseTrackStatus'})
ans = 9×4 table TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 1 10 59 false 3 NaN 4 true 4 NaN 5 false 6 7 59 false 7 6 59 false 10 9 57 false 11 8 56 false 13 NaN 5 false 18 NaN 5 true
Предполагаемая ошибка для каждой истины выше. Заметьте, что дорожка переходит в театральном отображении выше.
disp(cumulativeTruthMetrics(errorMetrics));
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 261.26 7.498 82.824 1.4568 7 54.822 3.226 3.9109 0.92307 8 50.606 4.6234 2.8907 1.1096 9 83.002 5.0335 7.1213 1.6252 10 206.17 7.0411 47.227 1.8917
Точность ассоциации может быть улучшена путем увеличения числа датчиков. Однако вычислительные требования увеличиваются экспоненциально со сложением каждого датчика. Статический алгоритм сплава тратит наиболее часто вычисление выполнимости каждой триангуляции. Эта часть алгоритма параллелизируется когда UseParallel
свойство staticDetectionFuser
установлен в true
, который обеспечивает линейное ускорение, пропорциональное количеству процессоров. Чтобы далее ускорить выполнение, можно также сгенерировать код C/C++, который также запустится в параллельном выполнении на нескольких процессорах. Можно изучить основы генерации кода, использующей MATLAB® Coder™ в Начало работы с MATLAB Coder (MATLAB Coder).
Чтобы ускорить код MATLAB для симуляции, алгоритм должен быть реструктурирован как функция MATLAB, которая может быть скомпилирована в файл MEX или разделяемую библиотеку. С этой целью статический алгоритм сплава реструктурирован в функцию. Чтобы сохранить состояние термофиксатора между множественными вызовами, это задано как persistent
переменная.
type('mexFuser');
function [superDets,info] = mexFuser(detections) %#codegen persistent fuser if isempty(fuser) fuser = staticDetectionFuser('MeasurementFusionFcn',@triangulateLOS,... 'MaxNumSensors',5,... 'UseParallel',true,... 'FalseAlarmRate',1e-3,... 'Volume',0.0716,... 'DetectionProbability',0.99); end [superDets,info] = fuser(detections);
MATLAB® Coder™ требует определения свойств всех входных параметров. Простой способ сделать это путем определения входных свойств на примере в командной строке с помощью -args
опция. Для получения дополнительной информации смотрите, Задают Входные свойства на примере в Командной строке (MATLAB Coder). Чтобы позволить переменное количество обнаружений, вы будете использовать coder.typeof
функция, чтобы выделить типы данных и размеры для входных параметров.
% Get a sample detection from the stored buffer sampleDetection = detectionBuffer{1}{1}{1}; % Use the coder.typeof function to allow variable-size inputs for % detections. maxNumDets = 500; inputDets = coder.typeof({sampleDetection},[maxNumDets,1],[1 0]); h = msgbox({'Generating code for function. This may take a few minutes...';... 'This message box will close when done.'},'Codegen Message'); % Use the codegen command to generate code by specifying input arguments % via example by using the |-args| option. codegen mexFuser -args {inputDets}; close(h);
Code generation successful.
Можно проверить ускорение, достигнутое генерацией кода путем сравнения времени, потраченного ими для плавления одной системы координат обнаружений
testDetections = addNoise(vertcat(detectionBuffer{1}{1:5}),1); tic;mexFuser(testDetections);t_ML = toc; tic;mexFuser_mex(testDetections);t_Mex = toc; disp(['MATLAB Code Execution time = ',num2str(t_ML)]); disp(['MEX Code Execution time = ',num2str(t_Mex)]);
MATLAB Code Execution time = 37.9316 MEX Code Execution time = 0.4011
В этом разделе обнаружения от всех пяти датчиков используются для отслеживания, и шум измерения 2 градусов придал квадратную форму, используется.
measNoise = 2; % Same noise as 3 sensors
numSensors = 5;
[trackingMetrics,errorMetrics] = helperRunStaticFusionSimulation(detectionBuffer,truthLog,numSensors,measNoise,theaterDisplay,true);
axes(theaterDisplay.TheaterPlot.Parent);
ylim([0 1.5]);
Результаты присвоения отслеживания использования пяти датчиков показывают, что все истины были присвоены дорожка во время целой симуляции. Не было также никакой дорожки, заглядывает симуляции по сравнению с 4 падениями дорожки низкой точности три симуляции датчика.
assignmentTable = trackMetricsTable(trackingMetrics); assignmentTable(:,{'TrackID','AssignedTruthID','TotalLength','FalseTrackStatus'})
ans = 5×4 table TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 2 10 59 false 3 9 59 false 4 8 59 false 5 7 59 false 6 6 59 false
Предполагаемые ошибки для положений намного ниже для каждой истинной цели по сравнению с тремя симуляциями датчика. Заметьте, что результаты оценки для положения и скорости действительно ухудшаются по сравнению с тремя датчиками с высокоточными измерениями.
disp(cumulativeTruthMetrics(errorMetrics))
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 34.74 3.0009 3.0358 0.75358 7 16.415 2.7014 1.3547 0.53336 8 16.555 2.5768 1.5645 0.49951 9 16.361 2.5381 1.474 0.55633 10 26.137 4.0457 2.3739 1.0349
Этот пример показал как отслеживаемым объектам с помощью сети распределенных пассивных датчиков. Вы изучили, как использовать staticDetectionFuser
статически сопоставлять и плавить обнаружения от нескольких датчиков. Пример, продемонстрированный, как эта архитектура, зависит параметры как количество датчиков в сети и точности измерений датчика. Пример также показал, как ускорить эффективность путем использования параллельных вычислений и автоматически генерации кода С из кода MATLAB.
trueAssignment
Используйте ObjectAttributes дорожки, чтобы присвоить его правильной истине.
function distance = trueAssignment(track,truth) tIDs = [track.ObjectAttributes.TargetIndex]; tIDs = tIDs(tIDs > 0); if numel(tIDs) > 1 && all(tIDs == truth.PlatformID) distance = 0; else distance = inf; end end
addNoise
Добавьте шум в обнаружения
function dets = addNoise(dets,measNoise) for i = 1:numel(dets) dets{i}.Measurement(1) = dets{i}.Measurement(1) + sqrt(measNoise)*randn; dets{i}.MeasurementNoise(1) = measNoise; end end
[1] Панель шалом, Яаков, Питер К. Виллетт и Синь Тянь. "Отслеживание и Fusion данных: руководство алгоритмов". (2011).