Отслеживание Используя распределенные синхронные пассивные датчики

Этот пример иллюстрирует отслеживание объектов с помощью измерений от пространственно распределенных и синхронных пассивных датчиков. В Пассивном Расположении Используя Один Датчик Маневрирования вы узнали, что пассивные измерения обеспечивают неполную наблюдаемость состояния цели и как один датчик может быть выведен, чтобы получить информацию об области значений. В качестве альтернативы несколько стационарных датчиков могут также использоваться, чтобы получить наблюдаемость. В этом примере вы изучите, как отследить несколько объектов путем плавления нескольких обнаружений от пассивных синхронных датчиков.

Введение

В синхронизируемой проблеме отслеживания мультицели мультидатчика обнаружения от нескольких пассивных датчиков собраны синхронно и используются, чтобы оценить следующее:

  • Количество целей в сценарии

  • Положение и скорость тех целей

Этот пример демонстрирует использование Статического Fusion Прежде, чем Отследить [1] архитектура для отслеживания использующих пассивных измерений. Статическая часть Fusion архитектуры стремится триангулировать наиболее вероятный набор обнаружений и выводить сплавленные обнаружения, содержащие оцененные положения целей. Когда измерения должны быть сплавлены вместе статическим сплавом, датчики должны сообщить об измерениях синхронно.

С измерениями, содержащими только информацию об угле обзора (LOS), по крайней мере 2 датчика необходимы, чтобы найти положение. Однако с 2 датчиками, проблема двоения (пересечения в точках без целей) происходит, когда несколько целей лежат в той же плоскости. С 2 целями и 2 датчиками, невозможно идентифицировать правильную пару от одной системы координат измерений, как продемонстрировано в фигуре ниже:

Поэтому нужно использовать 3 или больше датчика, чтобы уменьшать проблему двоения. Из-за присутствия шума измерения и ложных измерений, это затрудняет, чтобы устранить проблему двоения полностью. Раздвоитесь триангуляции, возвращенные статической ассоциацией, вероятно, будут отброшены динамическими блоками ассоциации как геометрия целей и изменений датчиков во время сценария.

Задайте сценарий

Относительное размещение датчиков и целей в сценарии, используемом здесь, взято из примера в [1]. Сценарий состоит из пяти равномерно распределенных целей, наблюдаемых тремя - пятью пассивными датчиками. Пассивные обнаружения моделируются с помощью radarEmitter и radarSensor с DetectionMode установите на ESM. HasNoise свойство датчиков установлено в false сгенерировать бесшумные обнаружения наряду с ложными предупреждениями. Шум к измерениям добавляется в этом примере через управляемую пользователями переменную. Это должно симулировать эффект шума датчика на статическом сплаве. Каждый датчик имеет поле зрения 180 градусов в области азимута и FalseAlarmRate из 1e-3 на ячейку разрешения азимута. Это приводит к 2 - 3 ложным предупреждениям на сканирование. Определение сценария перенесено в функции помощника helperGenerateFusionScenarioData.

exPath = fullfile(matlabroot,'examples','fusion','main');
addpath(exPath);
[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',[6 10],'DeletionThreshold',[6 10]);

% 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               55              false      
       2              9               55              false      
       3              8               55              false      
       4              7               55              false      
       5              6               55              false      

Ошибка в предполагаемом положении и скорости целей может быть получена в итоге с помощью ошибочных метрик. Ошибки в положении и скорости в 7 метрах и 2 метрах/секунда соответственно для всех целей, и нормированные ошибки близко к 1. Ошибочные метрики указывают на хорошую динамическую ассоциацию и производительность отслеживания.

disp(cumulativeTrackMetrics(errorMetrics));
    TrackID    posRMS    velRMS    posANEES    velANEES
    _______    ______    ______    ________    ________

       1       5.7493    1.2921     15.436      0.6106 
       2       3.2283    1.0877     10.909     0.53626 
       3       4.2759    1.3379     11.386     0.78276 
       4       3.8672    1.1143     11.513     0.50168 
       5       5.4992    1.4111     15.103     0.74195 

Эффект точности измерения

Сплав пассивных обнаружений, чтобы устранить двоение очень зависит от точности пассивных измерений. Когда шум измерения увеличивается, различие между фантомными ассоциациями и истинными ассоциациями становится менее видным, приводя к значительному понижению точности статической ассоциации. С близко расположенными целями может также произойти неправильная ассоциация сплавленных обнаружений к дорожкам. В следующем разделе помощник функционирует 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 =

  14×4 table

    TrackID    AssignedTruthID    TotalLength    FalseTrackStatus
    _______    _______________    ___________    ________________

       1             NaN               4              false      
       2             NaN               1              false      
       3             NaN               1              true       
       4             NaN               1              false      
       5             NaN               1              false      
       7             NaN               1              true       
       9             NaN               3              true       
      16             NaN               3              true       
      17             NaN              26              false      
      18              10              43              false      
      19               9              43              false      
      21               6              45              false      
      26               8              40              false      
      37               7              21              false      

Предполагаемая ошибка для каждой истины выше. Заметьте, что дорожка переходит в театральном отображении выше.

disp(cumulativeTruthMetrics(errorMetrics));
    TruthID    posRMS    velRMS    posANEES    velANEES
    _______    ______    ______    ________    ________

       6       74.557    3.5667     16.975     0.74084 
       7       239.11    16.704     144.66      26.352 
       8        76.87    2.8294      15.17     0.46185 
       9       47.258     8.735     11.388      3.1964 
      10       131.62    9.9829     22.295      2.0524 

Точность ассоциации может быть улучшена путем увеличения числа датчиков. Однако вычислительные требования увеличиваются экспоненциально со сложением каждого датчика. Статический алгоритм сплава тратит наиболее часто вычисление выполнимости каждой триангуляции. Эта часть алгоритма параллелизируется когда UseParallel свойство staticDetectionFuser установлен в true, который обеспечивает линейное ускорение, пропорциональное количеству процессоров. Чтобы далее ускорить выполнение, можно также сгенерировать код C/C++, который также запустится в параллельном выполнении на нескольких процессорах. Можно изучить основы генерации кода, использующей MATLAB® Coder™ при Начале работы с MATLAB Coder.

Ускорьте код MATLAB посредством распараллеливания и генерации кода

Чтобы ускорить код 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 = 22.7117
MEX Code Execution time = 0.21391

Отследите с пятью датчиками

В этом разделе обнаружения от всех пяти датчиков используются в отслеживании, и шум измерения 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               56              false      
       2              9               56              false      
       3              8               56              false      
       4              7               56              false      
       5              6               56              false      

Предполагаемые ошибки для положений намного ниже для каждой истинной цели по сравнению с тремя симуляциями датчика. Заметьте, что результаты оценки для положения и скорости действительно ухудшаются по сравнению с тремя датчиками с высокоточными измерениями.

disp(cumulativeTruthMetrics(errorMetrics))

rmpath(exPath);
    TruthID    posRMS    velRMS    posANEES    velANEES
    _______    ______    ______    ________    ________

       6       28.843    2.7198     30.343      0.7353 
       7       18.045    2.3182     19.703     0.54752 
       8       16.798    2.4239     17.215     0.66499 
       9       19.535     2.184     19.846     0.60814 
      10       25.005    2.8339     28.911     0.63183 

Сводные данные

Этот пример показал как отслеживаемым объектам с помощью сети распределенных пассивных датчиков. Вы изучили, как использовать 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).