exponenta event banner

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

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

Введение

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

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

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

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