Симулируйте радар сканирования

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

Введение

Статистическая радарная модель

Статистические радарные модели, такие как radarDataGenerator предложите ценные данные для молодой разработки радиолокационных систем. Система моделируется с точки зрения ее показателей производительности, и минимальный набор параметров используется наряду с установленной теорией определить, как эта система будет взаимодействовать со своей средой. Это включает спецификацию основных системных параметров, таких как рабочая частота, полоса пропускания и импульсная частота повторения (PRF), наряду с важными метриками как угол и разрешение области значений, ложный сигнальный уровень и вероятность обнаружения. Радарная модель выделила режимы для моностатической, бистатической, и пассивной операции. Первичный выход этой модели является необработанными данными об обнаружении или последовательностью обновлений дорожки. В то время как сигналы временной области не сгенерированы, эмиттер может задать числовой ID для формы волны, которую он использует так, чтобы усиление сигнала approriate и отклонение могли быть рассмотрены. Обнаружения могут быть выведены в радарной системе координат, или в системе координат сценария, если радар получения имеет знание местоположения и ориентацию передатчика. Дорожки сгенерированы с помощью одного из разнообразия отслеживания и отслеживают алгоритмы управления. Скорость передачи данных обработана системной спецификацией частоты обновления, так, чтобы обнаружения были сгенерированы на соответствующем уровне.

Управление сценарием

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

Сканирование

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

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

Сценарий: воздушное наблюдение

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

Радиолокационная система

Используйте центральную частоту на 1 ГГц и полосу пропускания 1,5 МГц, чтобы дать к разрешению области значений приблизительно 100 метров. Чтобы смоделировать один импульс на положение скана, установите частоту обновления на желаемый PRF. Установите размер неоднозначности области значений отражать выбор PRF и устанавливать верхний предел области значений к дважды размеру неоднозначности области значений, чтобы включить обнаружения объектов в первой и второй неоднозначности области значений.

% Set the seed for repeatability
rng('default');

% System parameters
c = physconst('lightspeed');
fc = 1e9; % Hz
bandwidth = 1.5e6; % Hz
prf = 4e3; % Hz
updateRate = prf;
rangeRes = c/(2*bandwidth); % m
rangeAmb = c/(2*prf); % m
rangeLims = [0 2*rangeAmb];

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

Отсканируйте +/-20 степени в области азимута и +/-10 степени в области вертикального изменения. Установите FoV на 4 азимута степеней и 8 вертикальных изменений степеней. Наконец, задайте общее количество полных сканов, чтобы симулировать, который продиктует общее время симуляции.

% Scanning parameters
azLimits = [-20 20];
elLimits = [-10 10];
fov = [4;8]; % deg
numFullScans = 24; % number of full scans to simulate

Общее количество точек скана может быть найдено можно следующим образом. Пределы скана обозначают минимальные и максимальные углы сканирования, на которые ссылаются к вектору опорного направления антенны, таким образом, общая площадь, отсканированная в одном направлении, больше степени пределов скана до половины FoV в том направлении. Шаблон всегда является прямоугольной сеткой по az/el.

numScanPointsAz = floor(diff(azLimits)/fov(1)) + 1;
numScanPointsEl = floor(diff(elLimits)/fov(2)) + 1;
numScanPoints = numScanPointsAz*numScanPointsEl;

Спецификация углового разрешения, отдельного от FoV, используется, который допускает моделирование угловых алгоритмов оценки, таких как моноимпульс. Это угловое разрешение определяет способность различить между целями и используется, чтобы вывести фактическую угловую точность из нижней границы Крамера-Рао (CRLB) для моноимпульсной угловой оценки с тем разрешением. Точно так же разрешение области значений определяет минимальный интервал в области значений, требуемой отличать две цели, но фактическая точность измерения области значений прибывает из CRLB для оценки области значений. Точный measureables (область значений, уровень области значений, угол, и т.д.) может использоваться путем выключения шума измерения с HasNoise свойство. Как правило, погрешность измерения не идет, чтобы обнулить, когда ОСШ увеличивается без связанного. Это может быть получено свойствами смещения (RangeBiasFraction, и т.д.), которых существует один для каждого типа измеримых. В наших целях мы оставим их в их значениях по умолчанию.

Используйте угловое разрешение, равное 1/4-му из FoV в каждом направлении, которое позволяет различать максимум между 16 целями точки в FoV в той же области значений.

angRes = fov/4;

Цель ссылки и радарное усиление цикла

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

Используйте вероятность обнаружения 90% для цели ссылки на уровне 20 км и 0 dBsm. Используйте ложный сигнальный уровень по умолчанию 1e-6 ложных предупреждений на ячейку разрешения на обновление.

refTgtRange = 20e3;
refTgtRCS = 0;
detProb = 0.9;
faRate = 1e-6;

Построение радара

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

pitch = elLimits(1); % mount the antenna rotated upwards

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

% Create radar object
sensorIndex = 1; % a unique identifier is required
radar = radarDataGenerator(sensorIndex,'UpdateRate',updateRate,...
    'DetectionMode','Monostatic','ScanMode','Electronic','TargetReportFormat','Detections','DetectionCoordinates','scenario',...
    'HasElevation',true,'HasINS',true,'HasRangeRate',false,'HasRangeAmbiguities',true,'HasFalseAlarms',true,...
    'CenterFrequency',fc,'Bandwidth',bandwidth,...
    'RangeResolution',rangeRes,'AzimuthResolution',angRes(1),'ElevationResolution',angRes(2),...
    'ReferenceRange',refTgtRange,'ReferenceRCS',refTgtRCS,'DetectionProbability',detProb,'FalseAlarmRate',faRate,...
    'RangeLimits',rangeLims,'MaxUnambiguousRange',rangeAmb,'ElectronicAzimuthLimits',azLimits,'ElectronicElevationLimits',elLimits,...
    'FieldOfView',fov,'MountingAngles',[0 pitch 0]);

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

scanplt = helperScanPatternDisplay(radar);
scanplt.makeOverviewPlot;

Figure contains an axes object. The axes object with title Scan Pattern contains 21 objects of type line. These objects represent Scan Points, FoV, ScanLimits.

Точки скана в азимуте расширяют точно к заданным пределам скана азимута, в то время как точки скана вертикального изменения втянуты немного по мере необходимости, чтобы не перекрываться или избыточные точки скана.

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

numResolutionCells = diff(rangeLims)*prod(fov)/(rangeRes*prod(angRes));
numFrames = numFullScans*numScanPoints; % total number of frames for detection
expNumFAs = faRate*numFrames*numResolutionCells % expected number of FAs
expNumFAs = 9.5040

Сценарий и цель

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

% Create scenario
stopTime = numFullScans*numScanPoints/prf;
scene = radarScenario('StopTime',stopTime,'UpdateRate',0);

Используйте platform метод, чтобы сгенерировать новые объекты платформы, добавляют их в сцену и возвращают указатель для доступа к свойствам платформы. Каждая платформа имеет уникальный идентификатор, который присвоен сценарием после конструкции. Для статической платформы, только Position свойство должно быть установлено. Чтобы симулировать стандартную постоянную скорость кинематическая траектория, используйте kinematicTrajectory возразите и задайте положение и скорость.

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

% Create platforms
rdrPlat = platform(scene,'Position',[0 0 12]); % place 12 m above the origin
tgtPlat(1) = platform(scene,'Trajectory',kinematicTrajectory('Position',[38e3 6e3 10e3],'Velocity',[-380 -50 0]));
tgtPlat(2) = platform(scene,'Trajectory',kinematicTrajectory('Position',[25e3 -3e3 1e3],'Velocity',[-280 10 -10]));

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

% Mount radar to platform
rdrPlat.Sensors = radar;

rcsSignature класс может использоваться, чтобы задать платформу ЭПР в зависимости от угла обзора. Для простой подписи постоянного ЭПР, набор Pattern свойство к скалярному значению. Позвольте одной платформе быть 20 dBsm и другими 4 dBsm, чтобы продемонстрировать различие в обнаружительной способности.

% Set target platform RCS profiles
tgtRCS = [20, 4]; % dBsm
tgtPlat(1).Signatures = rcsSignature('Pattern',tgtRCS(1));
tgtPlat(2).Signatures = rcsSignature('Pattern',tgtRCS(2));

Обнаружительная способность

Вычислите теоретический ОСШ, который может ожидаться для целей. Поскольку простая кинематическая траектория используется, положение истины и область значений вычисляются как таковые.

time = (0:numFrames-1).'/updateRate;
tgtPosTruth(:,:,1) = tgtPlat(1).Position + time*tgtPlat(1).Trajectory.Velocity;
tgtPosTruth(:,:,2) = tgtPlat(2).Position + time*tgtPlat(2).Trajectory.Velocity;
tgtRangeTruth(:,1) = sqrt(sum((tgtPosTruth(:,:,1)-rdrPlat.Position).^2,2));
tgtRangeTruth(:,2) = sqrt(sum((tgtPosTruth(:,:,2)-rdrPlat.Position).^2,2));

Затем используйте известный ЭПР цели и радарное усиление цикла, вычисленное радарной моделью, чтобы получить ОСШ истины для каждой цели.

tgtSnr = tgtRCS - 40*log10(tgtRangeTruth) + radar.RadarLoopGain;

Для схемы обнаружения только для величины, такой как CFAR, с заданной вероятностью обнаружения и ложного сигнального уровня, минимальным ОСШ, требуемым для обнаружения, дают

minSnr = 20*log10(erfcinv(2*radar.FalseAlarmRate) - erfcinv(2*radar.DetectionProbability)); % dB

Вычислите минимальную область значений для обнаружения.

Rd = 10.^((tgtRCS - minSnr + radar.RadarLoopGain)/40); % meters

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

snrMargin = mean(tgtSnr,1) - minSnr
snrMargin = 1×2

    8.0854    0.0051

rangeMargin = (Rd - mean(tgtRangeTruth,1))/1e3 % km
rangeMargin = 1×2

   23.5360    0.0074

Первая цель на приблизительно 8 дБ более ярка, чем необходимый для обнаружения данными параметрами CFAR, в то время как вторая цель рассматривается едва обнаруживаемой.

Симулируйте обнаружения

Первичный цикл симуляции запускается путем вызова advance на объекте сценария. Эти шаги метода, которые сценарий передает следующему разу, когда в который объект в сцене требует обновления, и возвращает false, когда заданное время остановки достигнуто, выйдя из цикла. Обратите внимание на то, что первый вызов advance не продвигается время симуляции, так, чтобы первая система координат сбора данных могла произойти в 0 с. Как альтернатива использованию advance, scene.SimulationStatus может проверяться, чтобы определить, выполнение ли симуляция до завершения.

В цикле обнаружение и методы генерации дорожки могут быть названы для любого объекта датчика индивидуально (см. датчик step метод), но удобные методы существуют, чтобы сгенерировать обнаружения и дорожки для всех датчиков и от всех целей в сцене с одним вызовом функции. Поскольку у нас только есть один датчик, detect(scene) хорошее решение должно получить список обнаружений для всех целей в сцене. Путем инициирования генерации обнаружений в верхнем уровне как это сама сцена обрабатывает передачу необходимой синхронизации, INS и других данных конфигурации к датчику. Класс помощника визуализации используется здесь также, чтобы анимировать шаблон скана.

allDets = []; % initialize list of all detections generated
lookAngs = zeros(2,numFrames);
simTime = zeros(1,numFrames);
frame = 0; % current frame
while advance(scene) % advance until StopTime is reached
    
    % Increment frame index and record simulation time
    frame = frame + 1;
    simTime(frame) = scene.SimulationTime;
    
    % Generate new detections
    dets = detect(scene);
    
    % Record look angle for inspection
    lookAngs(:,frame) = radar.LookAngle;
    
    % Update coverage plot
    scanplt.updatePlot(radar.LookAngle);
    
    % Compile any new detections
    allDets = [allDets;dets];
    
end

Figure contains 2 axes objects. Axes object 1 with title Scan Pattern contains 22 objects of type line, patch. These objects represent Scan Points, FoV, ScanLimits. Axes object 2 with title Beam Pointing contains 39 objects of type surface, quiver, line.

Отсканируйте поведение

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

figure;
plot(simTime(1:2*numScanPoints)*1e3,lookAngs(:,1:2*numScanPoints));
xlabel('Time (ms)');
ylabel('Look Angle (deg)');
legend('Azimuth','Elevation');
title('Look Angles');

Figure contains an axes object. The axes object with title Look Angles contains 2 objects of type line. These objects represent Azimuth, Elevation.

Обнаружения

Смотрите содержимое objectDetection как выведено нашим радаром.

allDets{1}
ans = 
  objectDetection with properties:

                     Time: 7.5000e-04
              Measurement: [3x1 double]
         MeasurementNoise: [3x3 double]
              SensorIndex: 1
            ObjectClassID: 0
    MeasurementParameters: [1x1 struct]
         ObjectAttributes: {[1x1 struct]}

Time время симуляции, в котором радар сгенерировал обнаружение. SensorIndex показывает, какой датчик это обнаружение было сгенерировано (который важен, когда существует несколько датчиков, и вы используете уровень сцены, обнаруживают метод). Measurement измеримое значение, сопоставленное с обнаружением. Формат зависит от выбора режима обнаружения и выходных координат. MeasurementNoise дает отклонение или ковариацию измерения и используется моделями средства отслеживания. При выводе обнаружений в координатах сценария поле измерения является просто предполагаемым радиус-вектором цели, и шум измерения дает ковариацию той оценки положения.

ObjectAttributes поле содержит некоторые полезные метаданные. Смотрите содержимое метаданных для первого обнаружения.

allDets{1}.ObjectAttributes{1}
ans = struct with fields:
    TargetIndex: 3
            SNR: 12.5894

TargetIndex показывает индекс платформы, которая сгенерировала обнаружение, которое является уникальным идентификатором, присвоенным сценарием в порядке, платформы создаются. ОСШ этого обнаружения о том, что мы ожидали от соответствующей целевой платформы. Когда обнаружение является ложным предупреждением, TargetIndex будет-1, который является недопустимым ID платформы.

Соберите целевой индекс, ОСШ, и время каждого обнаружения в векторы.

detTgtIdx = cellfun(@(t) t.ObjectAttributes{1}.TargetIndex, allDets);
detTgtSnr = cellfun(@(t) t.ObjectAttributes{1}.SNR, allDets);
detTime   = cellfun(@(t) t.Time, allDets);
firstTgtDet  = find(detTgtIdx == tgtPlat(1).PlatformID);
secondTgtDet = find(detTgtIdx == tgtPlat(2).PlatformID);

Найдите общее количество обнаружений FA.

numFAs = numel(find(detTgtIdx==-1))
numFAs = 7

Это близко к ожидаемому количеству ФАСА, вычисленного ранее.

Соберите данные об измерении через обнаружения и график наряду с положениями истины для этих двух целевых платформ.

tgtPosObs = cell2mat(cellfun(@(t) t.Measurement,allDets,'UniformOutput',0).');
subplot(1,2,1);
helperPlotPositionError( tgtPosTruth(:,:,1),time,tgtPosObs(:,firstTgtDet),detTime(firstTgtDet),scene.SimulationTime );
title('Target 1 Position Error');
subplot(1,2,2);
helperPlotPositionError( tgtPosTruth(:,:,2),time,tgtPosObs(:,secondTgtDet),detTime(secondTgtDet),scene.SimulationTime );
title('Target 2 Position Error');
set(gcf,'Position',get(gcf,'Position')+[0 0 600 0]);

Figure contains 2 axes objects. Axes object 1 with title Target 1 Position Error contains an object of type line. Axes object 2 with title Target 2 Position Error contains an object of type line.

Большинство обнаружений происходит из первой цели. Однако первая цель не была обнаружена на каждой системе координат, и вторая цель сгенерировала много обнаружений несмотря на наличие низкого ОСШ. Хотя первая цель легко обнаруживается, погрешность измерения большая, потому что цель находится во второй неоднозначности области значений, и никакое разрешение неоднозначности не было выполнено. Вторая цель, когда обнаружено, показывает ошибку положения, которая сопоставима с 100-метровым разрешением области значений и относительно плохим угловым разрешением.

Посмотрите на общее отклонение обнаружений против ОСШ. Общее отклонение является суммой крайних отклонений в каждом декартовом направлении (X, Y, и Z). Это отклонение включает эффекты оценки пробел угла области значений наряду с преобразованием тех статистических данных к координатам сценария.

detTotVar = cellfun(@(t) trace(t.MeasurementNoise),allDets);
figure;
subplot(1,2,1);
helperPlotPositionTotVar( detTgtSnr(firstTgtDet),detTotVar(firstTgtDet) );
title('First Target');
subplot(1,2,2);
helperPlotPositionTotVar( detTgtSnr(secondTgtDet),detTotVar(secondTgtDet) );
title('Second Target');
set(gcf,'Position',get(gcf,'Position')+[0 0 600 0]);

Figure contains 2 axes objects. Axes object 1 with title First Target contains an object of type line. Axes object 2 with title Second Target contains an object of type line.

Несмотря на то, что абсолютная ошибка положения для первой цели была больше из-за неоднозначности области значений, более низкое отклонение измерения отражает и больший ОСШ первой цели и ее по-видимому малую дальность.

Симулируйте дорожки

radarDataGenerator также способно к выполнению отслеживания разомкнутого контура. Вместо того, чтобы вывести обнаружения, это может вывести обновления дорожки.

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

release(radar); % unlock for re-simulation
radar.TargetReportFormat = 'Tracks';
radar.TrackCoordinates = 'Scenario';

Отслеживание может быть выполнено многими различными алгоритмами. Существуют простые фильтры альфы - беты и Фильтры Калмана линейного, расширенного, и недушистого разнообразия, наряду с постоянной скоростью, постоянным ускорением и постоянными-turnrate моделями движения. Задайте который алгоритм использовать с FilterInitializationFcn свойство. Это - указатель на функцию или имя функции в векторе символов, например, @initcvekf или 'initcvekf'. При использовании указателя на функцию это должно взять начальное обнаружение, как введено и возвратить инициализированный объект средства отслеживания. Любая пользовательская функция с той же подписью может использоваться. В данном примере используйте расширенный Фильтр Калмана постоянной скорости.

radar.FilterInitializationFcn = @initcvekf;

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

restart(scene); % restart scenario

allTracks = []; % initialize list of all track data
while advance(scene)
    
    % Generate new track data
    tgtPoses = targetPoses(rdrPlat);
    ins = pose(rdrPlat);
    tracks = radar(tgtPoses,ins,scene.SimulationTime);
    
    % Compile any new track data
    allTracks = [allTracks;tracks];
    
end

Смотрите отслеживаемый объект.

allTracks(1) % look at first track update
ans = 
  objectTrack with properties:

             TrackID: 1
            BranchID: 0
         SourceIndex: 1
          UpdateTime: 0.0093
                 Age: 34
               State: [6x1 double]
     StateCovariance: [6x6 double]
     StateParameters: [1x1 struct]
       ObjectClassID: 0
          TrackLogic: 'History'
     TrackLogicState: [1 1 0 0 0]
         IsConfirmed: 1
           IsCoasted: 0
      IsSelfReported: 1
    ObjectAttributes: [1x1 struct]

TrackID уникальный идентификатор файла дорожки и SourceIndex ID объекта средства отслеживания создание отчетов о дорожке, которая полезна, когда у вас есть несколько средств отслеживания в сцене. Когда средство отслеживания мультигипотезы используется, BranchID дает индекс используемой гипотезы. State поле содержит информацию состояния об этом обновлении. Поскольку модель постоянной скорости и координаты дорожки системы координат сценария используются, State состоит из радиус-векторов и векторов скорости. UpdateTime дает время, в которое было сгенерировано это обновление дорожки. Другое важное свойство, IsCoasted, говорит вам, если это обновление дорожки использовало новое целевое обнаружение, чтобы обновить фильтр, или если это было просто распространено вперед вовремя от последнего целевого обнаружения (дорожка "курсируется").

Структура ObjectAttributes дает ID платформы, подпись которой обнаруживается, и ОСШ той подписи во время обновления.

allTracks(1).ObjectAttributes
ans = struct with fields:
    TargetIndex: 3
            SNR: 18.5910

Соберите целевой индекс и время обновления. Также проверяйте, сколько обнаружений использовалось, чтобы обновить наши дорожки.

trackTgtIdx = arrayfun(@(t) t.TargetIndex,[allTracks.ObjectAttributes]);
updateTime = [allTracks.UpdateTime];
firstTgtTrack = find(trackTgtIdx == tgtPlat(1).PlatformID);
secondTgtTrack = find(trackTgtIdx == tgtPlat(2).PlatformID);

numUpdates = numel(find(~[allTracks.IsCoasted])) % total number of track updates with new detection data
numUpdates = 33

Это - примерно количество обнаружений неFA, сгенерированных в первой части.

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

los = tgtPosTruth(:,:,1) - rdrPlat.Position;
R = sqrt(sum(los.^2,2));
los = los./R;
Ramb = mod(R,rangeAmb);
tgtPosTruthAmb = rdrPlat.Position + los.*Ramb;

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

figure;
subplot(1,2,1);
helperPlotPositionTrack( tgtPosTruthAmb,allTracks(firstTgtTrack) );
title('First Target Track');
subplot(1,2,2);
helperPlotPositionTrack( tgtPosTruth(:,:,2),allTracks(secondTgtTrack) );
title('Second Target Track');
set(gcf,'Position',get(gcf,'Position')+[0 0 600 0]);

Figure contains 2 axes objects. Axes object 1 with title First Target Track contains 11 objects of type line. These objects represent Truth Position, Position Estimates, Covariance. Axes object 2 with title Second Target Track contains 25 objects of type line. These objects represent Truth Position, Position Estimates, Covariance.

В обоих случаях оценки положения запускаются путем схождения на истине (или неоднозначной областью значений истине) траектории. Для первой цели у нас есть больше обновлений дорожки, и конечное состояние кажется ближе к установившейся сходимости. Рассмотрение контуров ковариации, заметьте ожидаемое начальное уменьшение в размере, когда фильтр отслеживания нагревается.

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

figure;
subplot(1,2,1);
helperPlotPositionTrackError( tgtPosTruthAmb,time,allTracks(firstTgtTrack),updateTime(firstTgtTrack) );
title('First Target Ambiguous Position Error');
subplot(1,2,2);
helperPlotPositionTrackError( tgtPosTruth(:,:,2),time,allTracks(secondTgtTrack),updateTime(secondTgtTrack) );
title('Second Target Position Error');
set(gcf,'Position',get(gcf,'Position')+[0 0 600 0]);

Figure contains 2 axes objects. Axes object 1 with title First Target Ambiguous Position Error contains 2 objects of type line. These objects represent Coasted, Update. Axes object 2 with title Second Target Position Error contains 2 objects of type line. These objects represent Coasted, Update.

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

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

Заключение

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

Функции помощника

function helperPlotPositionError( tgtPosTruth,time,tgtPosObs,detTime,T )

tgtPosTruthX = interp1(time,tgtPosTruth(:,1),detTime).';
tgtPosTruthY = interp1(time,tgtPosTruth(:,2),detTime).';
tgtPosTruthZ = interp1(time,tgtPosTruth(:,3),detTime).';

err = sqrt((tgtPosTruthX - tgtPosObs(1,:)).^2+(tgtPosTruthY - tgtPosObs(2,:)).^2+(tgtPosTruthZ - tgtPosObs(3,:)).^2);

plot(detTime*1e3,err/1e3,'--o');
grid on;
xlim([0 T*1e3]);
ylabel('RMS Error (km)');
xlabel('Time (ms)');

end

function helperPlotPositionTotVar( detTgtSnr,detTotVar )

plot(detTgtSnr,detTotVar,'--o');
grid on;
xlabel('SNR (dB)');
ylabel('Total Var (m^2)');

end

function helperPlotPositionTrack( tgtPosTruth,tracks )

plot(tgtPosTruth(:,1)/1e3,tgtPosTruth(:,2)/1e3);
hold on;

updateIdx = find(~[tracks.IsCoasted]);
theta = 0:0.01:2*pi;

for ind = 1:2:numel(updateIdx)
    
    % plot update
    T = tracks(updateIdx(ind));
    plot(T.State(1)/1e3,T.State(3)/1e3,'*black');
    sigma = T.StateCovariance([1 3],[1 3]);
    [evec,eval] = eigs(sigma);
    mag = sqrt(diag(eval)).';
    u = evec(:,1)*mag(1);
    v = evec(:,2)*mag(2);
    x = cos(theta)*u(1) + sin(theta)*v(1);
    y = cos(theta)*u(2) + sin(theta)*v(2);
    plot(x/1e3 + T.State(1)/1e3,y/1e3 + T.State(3)/1e3,'magenta');
    
end

hold off;
grid on;
xlabel('X (km)');
ylabel('Y (km)');
legend('Truth Position','Position Estimates','Covariance','Location','northwest');

end

function helperPlotPositionTrackError( tgtPosTruth,time,tracks,updateTime )

state = [tracks.State];

sx = state(1,:);
sy = state(3,:);
sz = state(5,:);

x = interp1(time,tgtPosTruth(:,1),updateTime);
y = interp1(time,tgtPosTruth(:,2),updateTime);
z = interp1(time,tgtPosTruth(:,3),updateTime);

err = sqrt((x-sx).^2+(y-sy).^2+(z-sz).^2);

isUpdate = ~[tracks.IsCoasted];

plot(updateTime*1e3,err);
hold on;
plot(updateTime(isUpdate)*1e3,err(isUpdate),'or');
hold off;
grid on;
xlabel('Update Time (ms)');
ylabel('Error (m)')
legend('Coasted','Update','Location','northwest');

end