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

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

Введение

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

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

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

Этот пример демонстрирует использование Статического 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, 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',[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 =

  20×4 table

    TrackID    AssignedTruthID    TotalLength    FalseTrackStatus
    _______    _______________    ___________    ________________

       1             NaN               2              false      
       2             NaN               1              false      
       3             NaN               1              true       
       4             NaN               1              false      
       5             NaN               1              false      
       7             NaN               1              true       
       9             NaN               1              true       
      16             NaN               1              true       
      17             NaN               2              false      
      18             NaN               1              false      
      19             NaN               1              true       
      20               9              43              false      
      21               6              45              false      
      22             NaN               2              false      
      26             NaN               1              false      
      29             NaN               1              false      
      30              10              35              false      
      31               8              35              false      
      33             NaN              13              false      
      39               7              21              false      

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

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

       6       74.557    3.5667     16.975     0.74084 
       7       303.51    28.614     192.25      46.315 
       8       75.527    3.1085     15.035     0.54186 
       9       47.258     8.735     11.388      3.1964 
      10       103.01    9.6098     20.507      2.1667 

Точность ассоциации может быть улучшена путем увеличения числа датчиков. Однако вычислительные требования увеличиваются экспоненциально со сложением каждого датчика. Статический алгоритм сплава тратит наиболее часто вычисление выполнимости каждой триангуляции. Эта часть алгоритма параллелизируется, когда свойство 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 = 24.2043
MEX Code Execution time = 0.25277

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

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