В этом примере показано, как сплавлять радиолокационные детекторы из многоплатформной радиолокационной сети. Сеть включает в себя две бортовые и одну наземную радиолокационные платформы дальнего действия. Дополнительные сведения см. в Мультиплексформное радиолокационное обнаружение Fusion example. Центральный трекер обрабатывает обнаружения со всех платформ с фиксированным интервалом обновления. Это позволяет оценить производительность сети в сравнении с целевыми типами, маневрами платформы, а также конфигурациями и местоположениями платформы.
MultiplatformRadarDetectionGeneration MAT-файл содержит запись сценария отслеживания, ранее сгенерированную с помощью следующей команды:
recording = record(scene,'IncludeSensors',true,'InitialSeed',2018,'RecordingFormat','Recording')
где scene - это сценарий отслеживания, созданный в примере создания многоплатформного радиолокационного обнаружения.
load('MultiplatformScenarioRecording.mat');Используйте trackerGNN в качестве центрального трекера, который обрабатывает обнаружения, полученные от всех радиолокационных платформ в сценарии.
Трекер использует initFilter поддерживающая функция для инициализации расширенного фильтра Калмана с постоянной скоростью для каждой новой дорожки. initFilter изменяет фильтр, возвращенный initcvekf для соответствия высоким целевым скоростям. Технологический шум фильтра устанавливается в (м/с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

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

Чтобы учесть вогнутую форму фактической ковариации на больших диапазонах, longRangeCorrection функция поддержки ограничивает номер условия сообщаемого шума измерения. Скорректированная ковариация измерения, показанная выше, ограничена максимальным числом условий 300. Другими словами, никакое собственное значение в ковариации измерения не может быть более чем в 300 раз меньше, чем наибольшее собственное значение ковариации. Эта обработка расширяет шум измерения вдоль размера диапазона, чтобы лучше соответствовать вогнутости фактической неопределенности измерения.
Повторно запустите предыдущее моделирование с помощью longRangeCorrection поддерживающая функция для коррекции сообщаемого шума измерений на больших диапазонах.
[confirmedTracks,correctedAssignmentTable,ctheaterDisplay] = ...
runMultiPlatFusionSim(recording,tracker,@longRangeCorrection);
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')

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

Из другого вида, в котором струя выполняет горизонтальный поворот, видно, что высота оценена правильно, несмотря на неточные измерения высоты от датчиков. Один из датчиков вообще не сообщает о высоте, как видно из больших вертикальных эллипсоидов, в то время как два других датчика недооценивают свою неопределенность в высоте.
xlim([-25000 -9000]); ylim([-31000 -19000]); zlim([-9000 -2000]);
view([-45 10])
title('Crossing Airliners')
Переключая точку зрения на сосредоточение на пересекающихся авиалайнерах, изображаются те же неточные измерения высоты. Обратите внимание, как красные детекторы центрированы на высоте 8 км, в то время как два лайнера летают на высотах 3 и 4 км соответственно. Использование очень большой ковариации в высоте позволяет трекеру игнорировать ошибочное считывание высоты с красных обнаружений и отслеживать высоту с помощью двух других радаров. Наблюдая ковариацию неопределенности треков T07 и T08, можно увидеть, что они дают последовательную оценку платформ P04 и P05 соответственно.
xlim([-10000 10000]); ylim([-0 10000]); zlim([-12000 -5000]);
view([-15 10])
title('Airborne Radar Platforms')
Последний сюжет сосредоточен на двух бортовых радиолокационных платформах. Каждая платформа обнаруживается другой платформой, а также наземной РЛС. Траектории платформы пересекают друг друга, разделённые 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