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

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

Введение

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

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

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

Этот пример демонстрирует использование Статического 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 для симуляции, алгоритм должен быть реструктурирован как функция 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).