exponenta event banner

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

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

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

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

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

где scene - это сценарий отслеживания, созданный в примере создания многоплатформного радиолокационного обнаружения.

load('MultiplatformScenarioRecording.mat');

Определение центрального трекера

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

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

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

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

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

Отслеживание целей путем слияния обнаружений в центральном трекере

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