Этот пример иллюстрирует отслеживание объектов с помощью измерений от пространственно распределенных и синхронных пассивных датчиков. В Расположении Пассивного элемента Используя Один Датчик Маневрирования вы узнали, что пассивные измерения обеспечивают неполную наблюдаемость состояния цели и как один датчик может быть выведен, чтобы получить информацию об области значений. В качестве альтернативы несколько стационарных датчиков могут также использоваться, чтобы получить наблюдаемость. В этом примере вы изучите, как отследить несколько объектов путем плавления нескольких обнаружений от пассивных синхронных датчиков.
В синхронизируемой проблеме отслеживания мультицели мультидатчика обнаружения от нескольких пассивных датчиков собраны синхронно и используются, чтобы оценить следующее:
Количество целей в сценарии
Положение и скорость тех целей
Этот пример демонстрирует использование Статического Fusion Прежде, чем Отследить [1] архитектура для отслеживания использующих пассивных измерений. Статическая часть Fusion архитектуры стремится триангулировать наиболее вероятный набор обнаружений и выводить сплавленные обнаружения, содержащие оцененные положения целей. Когда измерения должны быть сплавлены вместе статическим сплавом, датчики должны сообщить об измерениях синхронно.
С измерениями, содержащими только информацию об угле обзора (LOS), по крайней мере 2 датчика необходимы, чтобы найти положение. Однако с 2 датчиками, проблема двоения (пересечения в точках без целей) происходит, когда несколько целей лежат в той же плоскости. С 2 целями и 2 датчиками, невозможно идентифицировать правильную пару от одной системы координат измерений, как продемонстрировано на рисунке ниже:
Поэтому нужно использовать 3 или больше датчика, чтобы уменьшать проблему двоения. Из-за присутствия шума измерения и ложных измерений, это затрудняет, чтобы устранить проблему двоения полностью. Раздвоитесь триангуляции, возвращенные статической ассоциацией, вероятно, будут отброшены динамическими блоками ассоциации как геометрия целей и изменений датчиков во время сценария.
Относительное размещение датчиков и целей в сценарии, используемом здесь, взято из примера в [1]. Сценарий состоит из пяти равномерно распределенных целей, наблюдаемых тремя - пятью пассивными датчиками. Пассивные обнаружения моделируются с помощью radarEmitter
и radarSensor
с 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',50,... '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; dT = 1; % 1 Hz update rate of scenario. % Loop through detections and track targets for iter = 1:numel(detectionBuffer) % Truth information time = time + dT; 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); 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 _______ _______________ ___________ ________________ 1 10 58 false 2 9 58 false 3 8 58 false 4 7 58 false 5 6 58 false
Ошибка в предполагаемом положении и скорости целей может быть получена в итоге с помощью ошибочных метрик. Ошибки в положении и скорости в 7 метрах и 2 метрах/секунда соответственно для всех целей, и нормированные ошибки близко к 1. Ошибочные метрики указывают на хорошую динамическую ассоциацию и эффективность отслеживания.
disp(cumulativeTrackMetrics(errorMetrics));
TrackID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 1 5.6264 1.2647 1.8461 0.56551 2 3.452 1.3206 1.2788 0.59367 3 4.689 1.5054 2.011 0.80126 4 3.9549 1.2235 1.562 0.60194 5 4.7398 1.6053 1.7627 0.74181
Эффект точности измерения
Сплав пассивных обнаружений, чтобы устранить двоение очень зависит от точности пассивных измерений. Когда шум измерения увеличивается, различие между фантомными ассоциациями и истинными ассоциациями становится менее видным, приводя к значительному понижению точности статической ассоциации. С близко расположенными целями может также произойти неправильная ассоциация сплавленных обнаружений к дорожкам. В следующем разделе помощник функционирует 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 = 12×4 table TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 1 10 58 false 2 NaN 11 true 3 NaN 8 true 5 8 57 false 6 6 58 false 8 7 57 false 12 9 51 false 13 NaN 7 true 22 NaN 6 false 23 NaN 3 true 27 NaN 9 false 32 NaN 2 false
Предполагаемая ошибка для каждой истины выше. Заметьте, что дорожка переходит в театральном отображении выше.
disp(cumulativeTruthMetrics(errorMetrics));
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 620.97 10.426 810.2 8.9916 7 336.03 5.3142 32235 2.5579 8 81.688 3.0383 6.0661 0.56988 9 39.44 7.1249 1.5144 1.6229 10 328.32 8.499 1929.2 3.8069
Точность ассоциации может быть улучшена путем увеличения числа датчиков. Однако вычислительные требования увеличиваются экспоненциально со сложением каждого датчика. Статический алгоритм сплава тратит наиболее часто вычисление выполнимости каждой триангуляции. Эта часть алгоритма параллелизируется когда UseParallel
свойство staticDetectionFuser
установлен в true
, который обеспечивает линейное ускорение, пропорциональное количеству процессоров. Чтобы далее ускорить выполнение, можно также сгенерировать код C/C++, который также запустится в параллельном выполнении на нескольких процессорах. Можно изучить основы генерации кода, использующей 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);
Можно проверить ускорение, достигнутое генерацией кода путем сравнения времени, потраченного ими для плавления одной системы координат обнаружений
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 = 23.767 MEX Code Execution time = 0.83915
В этом разделе обнаружения от всех пяти датчиков используются для отслеживания, и шум измерения 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]);
Результаты присвоения отслеживания использования пяти датчиков показывают, что все истины были присвоены дорожка во время целой симуляции. Не было также никакой дорожки, заглядывает симуляции по сравнению с 6 падениями дорожки низкой точности три симуляции датчика.
assignmentTable = trackMetricsTable(trackingMetrics); assignmentTable(:,{'TrackID','AssignedTruthID','TotalLength','FalseTrackStatus'})
ans = 5×4 table TrackID AssignedTruthID TotalLength FalseTrackStatus _______ _______________ ___________ ________________ 1 10 58 false 2 9 58 false 3 8 58 false 4 7 58 false 5 6 58 false
Предполагаемые ошибки для положений намного ниже для каждой истинной цели по сравнению с тремя симуляциями датчика. Заметьте, что результаты оценки для положения и скорости действительно ухудшаются по сравнению с тремя датчиками с высокоточными измерениями.
disp(cumulativeTruthMetrics(errorMetrics))
TruthID posRMS velRMS posANEES velANEES _______ ______ ______ ________ ________ 6 28.555 3.1714 2.381 0.74884 7 18.141 2.6749 1.8022 0.55938 8 17.165 2.5338 1.6855 0.64878 9 17.697 2.0996 2.1846 0.52041 10 25.686 3.4936 2.0517 0.66066
Этот пример показал как отслеживаемым объектам с помощью сети распределенных пассивных датчиков. Вы изучили, как использовать 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).