Мультиплатформенное слияние радиолокационного обнаружения

Этот пример показывает, как сплавить радиолокационные обнаружения от мультиплатформенной радиолокационной сети. Сеть включает две воздушные и одну наземную радиолокационные платформы большой дальности. Мультиплатформенное слияние радиолокационного обнаружения Для получения дополнительной информации см. example. Центральный трекер обрабатывает обнаружения со всех платформ с фиксированным интервалом обновления. Это позволяет вам оценить эффективность сети по типам целей, маневрам на платформе, а также конфигурациям и местоположениям платформ.

Загрузка записи сценария отслеживания

The MultiplatformRadarDetectionGeneration MAT-файл содержит запись сценария отслеживания, ранее сгенерированную с помощью следующей команды

recording = record(scene,'IncludeSensors',true,'InitialSeed',2018,'RecordingFormat','Recording')

где scene- сценарий отслеживания, созданный в примере Multiplatform Radar Detection Generation.

load('MultiplatformScenarioRecording.mat');

Задайте центральный трекер

Используйте trackerGNN как центральный трекер, который обрабатывает обнаружения, полученные со всех радиолокационных платформ в сценарии.

Трекер использует initFilter поддерживающая функция для инициализации расширенного фильтра Калмана с постоянной скоростью для каждой новой дорожки. initFilter изменяет фильтр, возвращенный initcvekf чтобы соответствовать высоким целевым скоростям. Технологический шум фильтра установлен в 1g (g=9.8m/s2) обеспечить сопровождение маневрирующих целей в сценарии.

Трекер AssignmentThreshold установлено равным 50, чтобы позволить обнаружениям с большим смещением области значений (из-за эффектов атмосферного преломления в длинных диапазонах обнаружения) быть сопоставленными с треками в трекере. The DeletionThreshold установлено значение 3, чтобы быстро удалить избыточные дорожки.

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

tracker = trackerGNN('FilterInitializationFcn', @initFilter, ...
        'AssignmentThreshold', 50, 'DeletionThreshold', 3, ...
        'HasDetectableTrackIDsInput', true);

Отслеживайте цели при помощи Fusing Detections в центральном трекере

Следующий цикл запускает запись сценария отслеживания до конца сценария. Для каждого шага вперед в сценарии обнаружение собирается для обработки центральным трекером. Трекер обновляется этими обнаружениями каждые 2 секунды.

trackUpdateRate = 0.5;   % Update the tracker every 2 seconds

% Create a display to show the true, measured, and tracked positions of the
% detected targets and platforms.
theaterDisplay = helperMultiPlatFusionDisplay(recording,'PlotAssignmentMetrics', true);

% Construct an object to analyze assignment and error metrics
tam = trackAssignmentMetrics('DistanceFunctionFormat','custom',...
    'AssignmentDistanceFcn',@truthAssignmentDistance,...
    'DivergenceDistanceFcn',@truthAssignmentDistance);

% Initialize buffers
detBuffer = {};
sensorConfigBuffer = [];
allTracks = [];
detectableTrackIDs = uint32([]);
assignmentTable = [];

% Initialize next tracker update time
nextTrackUpdateTime = 2;

while ~isDone(recording)
    % Read the next record of the recording.
    [time, truePoses, covcon, dets, senscon, sensPlatIDs] = read(recording);
    
    % Buffer all detections and sensor configurations until the next tracker update
    detBuffer = [detBuffer ; dets]; %#ok<AGROW>
    sensorConfigBuffer = [sensorConfigBuffer ; senscon']; %#ok<AGROW>
        
    % Follow the trackUpdateRate to update the tracker
    if time >= nextTrackUpdateTime || isDone(recording)
        
        if isempty(detBuffer)
            lastDetectionTime = time;
        else
            lastDetectionTime = detBuffer{end}.Time;
        end
        
        if isLocked(tracker)
            % Collect list of tracks which fell within at least one radar's field
            % of view since the last tracker update
            predictedtracks = predictTracksToTime(tracker, 'all', lastDetectionTime);
            detectableTrackIDs = detectableTracks(allTracks, predictedtracks, sensorConfigBuffer);
        end
        
        % Update tracker. Only run track logic on tracks that fell within at
        % least one radar's field of view since the last tracker update
        [confirmedTracks, ~, allTracks] = tracker(detBuffer, lastDetectionTime, detectableTrackIDs);
        
        % Analyze and retrieve the current track-to-truth assignment metrics
        tam(confirmedTracks, truePoses);
        
        % Store assignment metrics in a table
        currentAssignmentTable = trackMetricsTable(tam);
        rowTimes = seconds(time*ones(size(currentAssignmentTable,1),1));
        assignmentTable = cat(1,assignmentTable,table2timetable(currentAssignmentTable,'RowTimes',rowTimes));
        
        % Update display with detections, coverages, and tracks
        theaterDisplay(detBuffer, covcon, confirmedTracks, assignmentTable, truePoses, sensPlatIDs);
        
        % Empty buffers
        detBuffer = {};
        sensorConfigBuffer = [];
        
        % Update next track update time
        nextTrackUpdateTime = nextTrackUpdateTime + 1/trackUpdateRate;
    end
    
end

Figure contains 2 axes. Axes 1 contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history). Axes 2 with title Platform to Track Assignment contains 19 objects of type line, text.

В конце сценария вы видите, что несколько треков были сброшены и заменены. Вы также можете увидеть ассоциацию треков с платформами на время сценария. График имеет семь строк на семь платформ в сценарии. Каждая дорожка показана в виде горизонтальной линии. Номера дорожек аннотируются в начале линий. Всякий раз, когда дорожка удаляется, ее линия останавливается. Всякий раз, когда новая дорожка назначается платформе, новая линия добавляется к строке платформы, когда несколько линии показываются одновременно для одной платформы, платформа имеет несколько назначенных ей дорожек. В этих случаях более новая дорожка, связанная с платформой, рассматривается как избыточная.

endTime = assignmentTable.Time(end);
assignmentTable(endTime,{'TrackID','AssignedTruthID','TotalLength','DivergenceCount','RedundancyCount','RedundancyLength'})
ans=9×6 timetable
     Time     TrackID    AssignedTruthID    TotalLength    DivergenceCount    RedundancyCount    RedundancyLength
    ______    _______    _______________    ___________    _______________    _______________    ________________

    60 sec       1               2              27                0                  0                  0        
    60 sec       7               4              27                0                  0                  0        
    60 sec       8               5              26                0                  0                  0        
    60 sec       9               1              22                0                  0                  0        
    60 sec      11             NaN              10                0                  0                  0        
    60 sec      12               6              20                0                  0                  0        
    60 sec      24               7              19                0                  1                  4        
    60 sec      32             NaN               7                0                  1                  7        
    60 sec      41               3              10                0                  0                  0        

Заметьте, что платформы, которые испытывают трудности с обслуживанием путей (платформы 4 и 7), также являются платформами, наиболее удаленными от радаров. Эта низкая эффективность отслеживания объясняется допущением Гауссова распределения для шума измерения. Предположение хорошо работает для целей с короткими областями значений, но при больших областях значений неопределенность измерения отклоняется от Гауссова распределения. Следующий рисунок сравнивает эллипсы ковариации 1-сигма, соответствующие фактическому распределению цели и распределению цели, заданному радарным датчиком. Датчик находится на расстоянии 5 км от цели с угловым разрешением 5 степеней. Фактическая неопределенность измерения имеет вогнутую форму, вытекающую из координатной системы координат обнаружения сферического датчика, в которой радар оценивает положение цели.

maxCondNum = 300;
figure;
helperPlotLongRangeCorrection(maxCondNum)

Figure contains an axes. The axes with title Long Range Covariance contains 3 objects of type line. These objects represent Reported covariance, Actual covariance, Corrected covariance.

Для анализа вогнутой формы фактической ковариации на больших областях значений, longRangeCorrection поддерживающая функция ограничивает число обусловленности сообщенного шума измерения. Скорректированная ковариация измерения, показанная выше, ограничена максимальным числом обусловленности 300. Другими словами, никакое собственное значение в ковариации измерения не может быть более чем в 300 раз меньше, чем самое большое собственное значение ковариации. Эта обработка расширяет шум измерения по размерности области значений, чтобы лучше соответствовать вогнутости фактической неопределенности измерения.

Симулируйте с большой ковариационной коррекцией

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

[confirmedTracks,correctedAssignmentTable,ctheaterDisplay] = ...
    runMultiPlatFusionSim(recording,tracker,@longRangeCorrection);

Figure contains 2 axes. Axes 1 contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history). Axes 2 with title Platform to Track Assignment contains 15 objects of type line, text.

endTime = correctedAssignmentTable.Time(end);
correctedAssignmentTable(endTime,{'TrackID','AssignedTruthID','TotalLength','DivergenceCount','RedundancyCount','RedundancyLength'})
ans=7×6 timetable
     Time     TrackID    AssignedTruthID    TotalLength    DivergenceCount    RedundancyCount    RedundancyLength
    ______    _______    _______________    ___________    _______________    _______________    ________________

    60 sec       1              2               27                0                  0                  0        
    60 sec       7              4               27                0                  0                  0        
    60 sec       8              5               26                0                  0                  0        
    60 sec       9              1               22                0                  0                  0        
    60 sec      11              7               25                0                  0                  0        
    60 sec      12              6               20                0                  0                  0        
    60 sec      38              3               10                0                  0                  0        

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

allDetections = vertcat(recording.RecordedData.Detections);
ctheaterDisplay(allDetections,covcon,confirmedTracks,correctedAssignmentTable,truePoses, sensPlatIDs) 
axes(ctheaterDisplay.TheaterPlot.Parent)
legend('off')
xlim([-1000 5000]); ylim([-41000 -36000]); zlim([-5000 0]);
view([-90 90])
axis square
title('Jet Executing Horizontal Turn')

Figure contains 2 axes. Axes 1 with title Platform to Track Assignment contains 15 objects of type line, text. Axes 2 with title Jet Executing Horizontal Turn contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history).

Масштабирование в виде, в котором струя выполняет горизонтальный поворот, дорожка относительно хорошо следует маневрирующей цели, даже если модель движения, используемая в этом примере, является постоянной скоростью. Отслеживание маневра может быть дополнительно улучшено с помощью взаимодействующего фильтра с несколькими моделями (IMM), такого как trackingIMM фильтр.

view([-60 25])

Figure contains 2 axes. Axes 1 with title Platform to Track Assignment contains 15 objects of type line, text. Axes 2 with title Jet Executing Horizontal Turn contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history).

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

xlim([-25000 -9000]); ylim([-31000 -19000]); zlim([-9000 -2000]);
view([-45 10])
title('Crossing Airliners')

Figure contains 2 axes. Axes 1 with title Platform to Track Assignment contains 15 objects of type line, text. Axes 2 with title Crossing Airliners contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history).

Переключая точку зрения, чтобы сосредоточиться на пересекающих лайнерах, изображены те же неточные измерения высоты. Обратите внимание, как красные обнаружения центрируются на высоте 8 км, в то время как два лайнера летают на высотах 3 и 4 км соответственно. Использование очень большой ковариации на высоте позволяет трекеру игнорировать ошибочные показания высоты от красных обнаружений и отслеживать высоту с помощью двух других радаров. Наблюдая ковариацию неопределенности треков T07 и T08, можно увидеть, что они дают последовательную оценку платформ P04 и P05, соответственно.

xlim([-10000 10000]); ylim([-0 10000]); zlim([-12000 -5000]);
view([-15 10])
title('Airborne Radar Platforms')

Figure contains 2 axes. Axes 1 with title Platform to Track Assignment contains 15 objects of type line, text. Axes 2 with title Airborne Radar Platforms contains 20 objects of type patch, line, text. These objects represent Ground, Platform 1, Detections 1, Platform 2, Detections 2, Platform 3, Detections 3, Targets, Tracks, (history).

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

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

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

Вспомогательные функции

initFilter Эта функция изменяет функцию initcvekf для обработки целей более высокой скорости, таких как авиалайнеры в сценарии.

function filter = initFilter(detection)
filter = initcvekf(detection);
classToUse = class(filter.StateCovariance);

% Airliners can move at speeds around 900 km/h. The velocity is initialized
% to 0, but will need to be able to quickly adapt to aircraft moving at
% these speeds. Use 900 km/h as 1 standard deviation for the velocity
% noise.
spd = 900*1e3/3600; % m/s
velCov = cast(spd^2,classToUse);
cov = filter.StateCovariance;
cov(2,2) = velCov;
cov(4,4) = velCov;
filter.StateCovariance = cov;

% Set filter's process noise to allow for some horizontal maneuver
scaleAccel = cast(10,classToUse);
Q = blkdiag(scaleAccel^2, scaleAccel^2, 1);
filter.ProcessNoise = Q;
end

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

function trackIDs = detectableTracks(tracks,predictedtracks,configs)
% Identify which tracks fell within a sensor's field of view

numTrks = size(tracks,1);
[numsteps, numSensors] = size(configs);
allposTrack = zeros(3,numsteps);
isDetectable = false(numTrks,1);
for iTrk = 1:numTrks
    % Interpolate track positions between current position and predicted
    % positions for each simulation step
    posTrack = tracks(iTrk).State(1:2:end);
    posPreditedTrack = predictedtracks(iTrk).State(1:2:end);
    for iPos = 1:3
        allposTrack(iPos,:) = linspace(posTrack(iPos),posPreditedTrack(iPos),numsteps);
    end
    for iSensor = 1:numSensors
        thisConfig = configs(:,iSensor);
        for k = 1:numsteps
            if thisConfig(k).IsValidTime
                pos = trackToSensor(allposTrack(:,k),thisConfig(k));
                % Check if predicted track position is in sensor field of
                % view
                [az,el] = cart2sph(pos(1),pos(2),pos(3));
                az = az*180/pi;
                el = el*180/pi;
                inFov = abs(az)<thisConfig(k).FieldOfView(1)/2 && abs(el) < thisConfig(k).FieldOfView(2)/2;
                if inFov
                    isDetectable(iTrk) = inFov;
                    k = numsteps; %#ok<FXSET>
                    iSensor = numSensors; %#ok<FXSET>
                end
            end
        end
    end

end

trackIDs = [tracks.TrackID]';
trackIDs = trackIDs(isDetectable);
end

trackToSensor Эта функция возвращает положение дорожки в координатной системе координат датчика. Структура дорожки возвращается trackerGNN объект и конфигурационная структура, определяющая ориентацию датчика относительно координатной системы координат дорожки, возвращаются monostaticRadarSensor объект.

function pos = trackToSensor(pos,config)

frames = config.MeasurementParameters;
for m = numel(frames):-1:1
    rotmat = frames(m).Orientation;
    if ~frames(m).IsParentToChild
        rotmat = rotmat';
    end
    offset = frames(m).OriginPosition;
    pos = bsxfun(@minus,pos,offset);
    pos = rotmat*pos;
end
end

longRangeCorrection Эта функция ограничивает точность шума измерения, сообщаемую радаром, не превышая максимальное число обусловленности. Число обусловленности определяется как отношение собственных значений шума измерения к наибольшему собственному значению.

Когда цели обнаруживаются в больших областях значений от радара, поверхностная кривизна неопределенности измерения больше не хорошо аппроксимируется эллипсоидом, но принимает на себя кривизну вогнутого эллипсоида. Шум измерения должен быть увеличен в диапазоне размерности для расчета вогнутости, создавая плоский эллипс, который охватывает вогнутый эллипсоид. Существует несколько методов в литературе для решения этой проблемы. Здесь максимальное число обусловленности измерения шума ограничивается увеличением наименьших собственных значений, чтобы удовлетворить ограничению максимального числа обусловленности. Это имеет эффект увеличения неопределенности вдоль размерности области значений, создавая эллипс, который лучше окружает вогнутую неопределенность.

function dets = longRangeCorrection(dets,maxCond)
for m = 1:numel(dets)
    R = dets{m}.MeasurementNoise;
    [Q,D] = eig(R);
    Q = real(Q);
    d = real(diag(D));
    dMax = max(d);
    condNums = dMax./d;
    iFix = condNums>maxCond;
    d(iFix) = dMax/maxCond;
    R = Q*diag(d)*Q';
    dets{m}.MeasurementNoise = R;
end
end