В этом примере показано, как симулировать обнаружение и отслеживающий со сканирующим моностатическим радаром. Этот пример показывает вам, как сконфигурировать статистическую радарную модель с механическим устройством и электронными возможностями сканирования, как настроить инструмент управления сценария, чтобы обработать динамику платформы и синхронизацию, и как смотреть обнаружения и дорожки, которые сгенерированы.
Статистические радарные модели, такие как 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;
Точки скана в азимуте расширяют точно к заданным пределам скана азимута, в то время как точки скана вертикального изменения втянуты немного по мере необходимости, чтобы не перекрываться или избыточные точки скана.
Вычислите общее количество ячеек разрешения угла области значений для системы и общее количество систем координат, которые будут использоваться для обнаружения. Затем вычислите ожидаемое количество ложных предупреждений путем умножения ложного сигнального уровня на общее количество ячеек разрешения, опрошенных в течение симуляции.
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; plot(simTime(1:2*numScanPoints)*1e3,lookAngs(:,1:2*numScanPoints)); xlabel('Time (ms)'); ylabel('Look Angle (deg)'); legend('Azimuth','Elevation'); title('Look Angles');
Смотрите содержимое 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]);
Большинство обнаружений происходит из первой цели. Однако первая цель не была обнаружена на каждой системе координат, и вторая цель сгенерировала много обнаружений несмотря на наличие низкого ОСШ. Хотя первая цель легко обнаруживается, погрешность измерения большая, потому что цель находится во второй неоднозначности области значений, и никакое разрешение неоднозначности не было выполнено. Вторая цель, когда обнаружено, показывает ошибку положения, которая сопоставима с 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]);
Несмотря на то, что абсолютная ошибка положения для первой цели была больше из-за неоднозначности области значений, более низкое отклонение измерения отражает и больший ОСШ первой цели и ее по-видимому малую дальность.
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; 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]);
Для первой цели, которая имеет больший ОСШ, ошибка положения уменьшается на выборках, которые имели новое обнаружение, чтобы обновить файл дорожки (обозначенный красным кругом). Поскольку вторая цель имела намного более низкий ОСШ, ошибка в некоторых отдельных обнаружениях была достаточно большой увеличить ошибку положения дорожки. Несмотря на это, вторая целевая ошибка положения дорожки имеет начальную тенденцию к понижению, и предполагаемое состояние будет, вероятно, сходиться.
Существует проблема с первой целевой дорожкой. Поскольку это находится во второй неоднозначности области значений и имеет компонент перпендикуляра движения к углу обзора, очевидная скорость изменяется, и Фильтр Калмана постоянной скорости не может сходиться.
В этом примере вы сконфигурировали статистическую радиолокационную систему для использования в симуляции и анализе целевой обнаружительной способности и отслеживаемости. Вы видели, как использовать пределы скана и свойства поля зрения задать шаблон скана, как запустить радарную модель с инструментом управления сценария, и как смотреть сгенерированные обнаружения и дорожки.
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