Этот пример иллюстрирует отслеживание объектов с помощью измерений от пространственно распределенных и синхронных пассивных датчиков. В разделе Пассивное ранжирование с использованием одного датчика маневрирования вы узнали, что пассивные измерения обеспечивают неполную наблюдаемость состояния цели и то, как один датчик может быть маневрирован для получения информации о дальности. Альтернативно, для получения наблюдаемости можно также использовать множество стационарных датчиков. В этом примере показано, как отслеживать несколько объектов путем слияния нескольких обнаружений от пассивных синхронных датчиков.
При синхронизированном многосенсорно-многоцелевом отслеживании обнаруженные сигналы от нескольких пассивных датчиков собираются синхронно и используются для оценки следующего:
Количество целей в сценарии
Положение и скорость этих целей
В этом примере показано использование архитектуры Static Fusion Before Tracking [1] для отслеживания с использованием пассивных измерений. Часть архитектуры Static 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, Volume и 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 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); % Update 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
_______ _______________ ___________ ________________
1 10 59 false
2 9 59 false
3 8 59 false
4 7 59 false
5 6 59 false
Погрешность в оцененном положении и скорости целей можно суммировать с использованием метрик погрешности. Погрешности по положению и скорости находятся в пределах 7 м и 2 м/с соответственно для всех целей, а нормированные погрешности близки к 1. Метрики ошибок указывают на хорошую динамическую ассоциацию и производительность отслеживания.
disp(cumulativeTrackMetrics(errorMetrics));
TrackID posRMS velRMS posANEES velANEES
_______ ______ ______ ________ ________
1 5.8143 1.5379 1.7273 0.61788
2 4.0385 1.2251 1.7547 0.66935
3 4.1647 1.2866 1.7555 0.64513
4 3.6861 1.3207 1.3389 0.44256
5 5.364 1.2745 1.6521 0.52297
Влияние точности измерений
Слияние пассивных детекторов для устранения призраков сильно зависит от точности пассивных измерений. По мере увеличения шума измерения различие между ассоциациями-призраками и истинными ассоциациями становится менее заметным, что приводит к значительному снижению точности статической ассоциации. При близко расположенных мишенях также может иметь место неправильная связь обнаруженных взрывателей с дорожками. В следующем разделе функция помощника 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 =
11×4 table
TrackID AssignedTruthID TotalLength FalseTrackStatus
_______ _______________ ___________ ________________
1 9 58 false
4 NaN 6 true
5 7 59 false
6 6 58 false
7 10 58 false
8 NaN 13 true
9 NaN 12 false
15 8 52 false
16 NaN 4 true
20 NaN 4 true
28 NaN 3 true
Предполагаемая ошибка для каждой истины выше. Обратите внимание, что дорожка скачет в кинотеатре.
disp(cumulativeTruthMetrics(errorMetrics));
TruthID posRMS velRMS posANEES velANEES
_______ ______ ______ ________ ________
6 517.05 4.5871 109.74 1.0434
7 51.5 3.8501 3.281 0.83398
8 59.893 3.0373 3.1765 0.63048
9 105.88 17.459 6.821 9.9861
10 68.313 4.7792 2.42 0.90618
Точность ассоциации может быть повышена за счет увеличения числа датчиков. Однако вычислительные требования увеличиваются экспоненциально с добавлением каждого датчика. Алгоритм статического слияния тратит большую часть времени на вычисление осуществимости каждой триангуляции. Эта часть алгоритма параллелизируется, когда UseParallel имущества staticDetectionFuser имеет значение true, что обеспечивает линейную скорость, пропорциональную количеству процессоров. Для дальнейшего ускорения выполнения можно также создать код C/C + +, который также будет выполняться параллельно на нескольких процессорах. Основы создания кода можно изучить с помощью Coder™ MATLAB ® в разделе Начало работы с кодером MATLAB (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.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 = 27.0929 MEX Code Execution time = 0.3682
В этом разделе для слежения используются детекторы от всех пяти датчиков и используется измерительный шум 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 59 false
2 9 59 false
3 8 59 false
4 7 59 false
5 6 59 false
Предполагаемые погрешности для позиций намного ниже для каждой истинной цели по сравнению с имитацией трех датчиков. Обратите внимание, что результаты оценки положения и скорости действительно ухудшаются по сравнению с тремя датчиками с высокоточными измерениями.
disp(cumulativeTruthMetrics(errorMetrics))
TruthID posRMS velRMS posANEES velANEES
_______ ______ ______ ________ ________
6 22.362 3.2363 1.5848 0.58334
7 15.024 2.6634 1.613 0.60255
8 22.632 2.7984 2.5508 0.82252
9 24.555 3.4442 2.6984 0.98232
10 24.388 2.7997 1.7192 0.57244
В этом примере показано, как отслеживать объекты с помощью сети распределенных пассивных датчиков. Вы научились пользоваться staticDetectionFuser статически связывать и предохранять детекторы от нескольких датчиков. В примере показано, как эта архитектура зависит от таких параметров, как количество датчиков в сети и точность измерений датчиков. Пример также показал, как ускорить производительность за счет использования параллельных вычислений и автоматического генерирования кода C из кода 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] Бар-Шалом, Яаков, Питер К. Виллетт и Синь Тянь. «Отслеживание и слияние данных: справочник по алгоритмам». (2011).