В этом примере показано, как сгенерировать радарные обнаружения от многоплатформенной радарной сети. Сеть включает три платформы дальних: два бортовых и одно наземное. Такие синтетические данные могут использоваться, чтобы проверить производительность отслеживания архитектуры для различных целевых типов и маневров.
Радарные платформы и цели моделируются в сценарии как platforms
. Симуляция движения платформ в сценарии управляема trackingScenario
.
% Add path to helper files used by this example. helperPath = fullfile(matlabroot,'examples','fusion','main'); addpath(helperPath); % Remove path to helper files when 'cleanPath' variable is cleared or deleted. cleanPath = onCleanup(@()rmpath(helperPath)); % Create a tracking scenario to manage the movement of the platforms. scene = trackingScenario; % Create tracking scenario sceneDuration = 60; % Duration of scenario in seconds scene.StopTime = sceneDuration;
Добавьте бортовую платформу в сценарий, переместившись на север на уровне 650 км/час на крейсерской высоте 10 км. Сгенерируйте траекторию платформы от waypoints использование waypointTrajectory
.
ht = 10e3; % Altitude in meters spd = 650*1e3/3600; % Speed in m/s start = [-spd*sceneDuration/2 5e3 -ht]; stop = [spd*sceneDuration/2 5e3 -ht]; traj = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]); % Create the airborne platform with its trajectory. plat1 = platform(scene,'Trajectory',traj);
Добавьте плоский радар массивов в платформу. Смонтируйте радар в антенном колпаке на 5 метров выше платформы. Смоделируйте радар, когда механически вращение поэтапно осуществило массив. Радар электронно складывает лучи в вертикальном изменении вдоль опорного направления массива. Спецификации для смоделированного радара сведены в таблицу ниже:
Чувствительность: 0 dBsm 375 км
Механическое Сканирование: Азимут только
Механические Пределы Сканирования: от 0 до 360 градусов
Электронное Сканирование: Вертикальное изменение только
Электронные Пределы Сканирования:-2 к 45 градусам
Поле зрения: азимут на 1 градус, вертикальное изменение на 47 градусов
Измерения: Азимут, вертикальное изменение, область значений
Разрешение азимута: 1 градус
Разрешение вертикального изменения: 5 градусов
Разрешение области значений: 30 м
Смоделируйте механически вращающийся радар с помощью monostaticRadarSensor
.
sensorIndex = 1; % Identifies originating sensor of each detection radar = monostaticRadarSensor(sensorIndex, 'Rotator', ... 'MountingLocation', [0 0 -5], ... % m 'UpdateRate', 12.5, ... % Hz 'ReferenceRCS', 0, ... % dBsm 'ReferenceRange', 375e3, ... % m 'ScanMode', 'Mechanical and electronic', ... 'MechanicalScanLimits', [0 360;0 0], ... % deg 'ElectronicScanLimits', [0 0;-2 45], ... % deg 'FieldOfView',[1;47.1], ... % deg 'HasElevation', true, ... 'AzimuthResolution', 1, ... % deg 'ElevationResolution', 5, ... % deg 'RangeResolution', 30, ... % m 'HasINS', true); % Attach the radar to its airborne platform. plat1.Sensors = radar;
Добавьте вторую бортовую платформу в сценарий, переместившись на юг на уровне 550 км/час на крейсерской высоте 8 км.
ht = 8e3; % Altitude in meters spd = 550*1e3/3600; % Speed in m/s start = [spd*sceneDuration/2 5e3 -ht]; stop = [-spd*sceneDuration/2 5e3 -ht]; traj = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]); plat2 = platform(scene,'Trajectory',traj);
Несколько датчиков могут быть смонтированы на платформе. Добавьте радар, состоявший из двух линейных поэтапных массивов, смонтированных на 5 метров выше платформы. Смонтируйте массивы так, чтобы один массив просмотрел правую сторону корпуса, и другой массив просматривает левую сторону корпуса. Оба массива предоставляют страховую защиту по 150 секторам азимута степени по обе стороны от платформы. Вертикальное изменение не измеряется линейными матрицами. Спецификации для этого радара сведены в таблицу ниже:
Чувствительность: 0 dBsm 350 км
Механическое сканирование: нет
Электронное Сканирование: Азимут только
Электронные Пределы Сканирования:-75 к 75 градусам
Поле зрения: азимут на 1 градус, вертикальное изменение на 60 градусов
Измерения: Азимут, область значений
Разрешение азимута: 1 градус
Разрешение области значений: 30 м
Смоделируйте линейный поэтапный радар массивов с помощью monostaticRadarSensor
.
% Create right facing radar by setting radar's yaw to 90 degrees. sensorIndex = sensorIndex+1; rightRadar = monostaticRadarSensor(sensorIndex, 'Sector', ... 'SensorIndex', sensorIndex, ... 'MountingLocation', [0 0 -5], ... % m 'MountingAngles', [90 0 0], ... % deg, look over right side 'UpdateRate', 12.5, ... % Hz 'ReferenceRCS', 0, ... % dBsm 'ReferenceRange', 350e3, ... % m 'ScanMode','Electronic', ... 'ElectronicScanLimits',[-75 75], ... % deg 'FieldOfView',[1;60], ... % deg 'HasElevation', false, ... 'AzimuthResolution', 1, ... % deg 'RangeResolution', 30, ... % m 'HasINS', true); % Create an identical radar looking over the left side of the airframe. leftRadar = clone(rightRadar); sensorIndex = sensorIndex+1; leftRadar.SensorIndex = sensorIndex; leftRadar.MountingAngles(1) = -90; % Look over the left side % Attach the two linear radar arrays to the airborne platform. plat2.Sensors = {leftRadar, rightRadar};
Добавьте наземный радар с помощью прямоугольного поэтапного массива, смонтированного на 5 метров выше его трейлера. Радар электронно рассматривает 60 промежутков азимута степени и 20 градусов вертикального изменения над землей с помощью электронного шаблона развертки растра.
Чувствительность: 0 dBsm 350 км
Механическое сканирование: нет
Электронное Сканирование: Азимут и повышение
Электронные Пределы Сканирования:-30 к азимуту на 30 градусов,-20 к вертикальному изменению на 0 градусов
Поле зрения: азимут на 1 градус, вертикальное изменение на 5 градусов
Измерения: Азимут, вертикальное изменение, область значений
Разрешение азимута: 1 градус
Разрешение вертикального изменения: 5 градусов
Разрешение области значений: 30 м
Смоделируйте прямоугольный поэтапный радар массивов с помощью monostaticRadarSensor
.
% Create an electronically scanning rectangular array radar. sensorIndex = sensorIndex+1; radar = monostaticRadarSensor(sensorIndex, 'Raster', ... 'MountingLocation', [0 0 -5], ... % m 'UpdateRate', 25, ... % Hz 'ReferenceRCS', 0, ... % dBsm 'ReferenceRange', 350e3, ... % m 'ScanMode','Electronic', ... 'ElectronicScanLimits',[-30 30;-20 0],... % deg 'FieldOfView', [1;5], ... % deg 'HasElevation', true, ... 'AzimuthResolution', 1, ... % deg 'ElevationResolution', 5, ... % deg 'RangeResolution', 30, ... % m 'HasINS', true); % Attach the rectangular radar array to the trailer platform. plat3 = platform(scene,'Sensors',radar); plat3.Trajectory.Position = [-30e3 30e3 0]; plat3.Trajectory.Orientation = quaternion([-60 0 0],'eulerd','zyx','frame');
Добавьте четыре бортовых цели в области наблюдения.
Авиалайнер перемещаясь на северо-восток на уровне 700 км/час на высоте на 3 000 м
Пересечение авиалайнера, перемещаясь на юго-восток на уровне 900 км/час на высоте на 4 000 м
Авиалайнер перемещаясь на восток на уровне 600 км/час на высоте на 9 000 м
Струя, перемещающаяся на уровне 300 км/час и выполняющая 90 поворотов степени на высоте на 3 000 м
% Add airliner traveling northeast. ht = 3e3; % Altitude in meters spd = 700*1e3/3600; % Speed in m/s ang = 45; rot = [cosd(ang) sind(ang) 0;-sind(ang) cosd(ang) 0; 0 0 1]; offset = [-15e3 -25e3 -ht]; start = offset - [spd*sceneDuration/2 0 0]*rot; stop = offset + [spd*sceneDuration/2 0 0]*rot; traj = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]); rcs = rcsSignature('Pattern', [10 10; 10 10], ... 'Azimuth', [-180 180], 'Elevation', [-90 90], ... 'Frequency', [0 10e9]); % Define custom RCS signature of target platform(scene,'Trajectory',traj,'Signatures',rcs); % Add crossing airliner traveling southeast. ht = 4e3; % Altitude in meters spd = 900*1e3/3600; % Speed in m/s offset = [(start(1)+stop(1))/2 (start(2)+stop(2))/2 -ht]; start = offset + [0 -spd*sceneDuration/2 0]*rot; stop = offset + [0 spd*sceneDuration/2 0]*rot; traj = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]); rcs = rcsSignature; % Default 10 dBsm RCS at all viewing angles platform(scene,'Trajectory',traj,'Signatures',rcs); % Add eastbound airliner. ht = 9e3; % Altitude in meters spd = 600*1e3/3600; % Speed in m/s start = [30e3 -spd*sceneDuration/2-20e3 -ht]; stop = [30e3 spd*sceneDuration/2-20e3 -ht]; traj = waypointTrajectory('Waypoints',[start;stop],'TimeOfArrival',[0; sceneDuration]); platform(scene,'Trajectory',traj); % Default 10 dBsm RCS at all viewing angles % Add jet turning with horizontal acceleration of 0.3 G. ht = 3e3; % Altitude in meters spd = 300*1e3/3600; % Speed in m/s accel = 0.3*9.8; % Centripetal acceleration m/s^2 radius = spd^2/accel; % Turn radius in meters t0 = 0; t1 = t0+5; t2 = t1+pi/2*radius/spd; t3 = sceneDuration; start = [0e4 -4e4 -ht]; wps = [ ... 0 0 0; ... % Begin straight segment spd*t1 0 0; ... % Begin horizontal turn spd*t1+radius radius 0; ... % End of horizontal turn spd*t1+radius radius+spd*(t3-t2) 0]; % End of second straight segment traj = waypointTrajectory('Waypoints',start+wps,'TimeOfArrival',[t0; t1; t2; t3]); platform(scene,'Trajectory',traj);
Следующий цикл совершенствует платформу и целевые положения, пока конец сценария не был достигнут. Для каждого шага вперед в сценарии обнаружения сгенерированы с каждой платформы и буферизованы.
trackingScenario
должен совершенствоваться в фиксированном временном интервале. Установите UpdateRate
для сценария так, чтобы временной интервал был самым большим общим знаменателем (GCD) всех интервалов обновления, сопоставленных с частотами обновления радаров. commonUpdateRate
поддерживание функции находит интервал обновления характерным для всех радаров в этом сценарии.
platforms = scene.Platforms; scene.UpdateRate = commonUpdateRate(platforms); nPlat = numel(platforms); rng(2018); % Set random seed for repeatable results % Create a display to show the true and measured positions of the detected targets and platforms. theaterDisplay = helperMultiPlatDisplay(scene, 'XLim', [-45 45], ... 'YLim', [-45 45], 'ZLim', [-40 0]); title('Multiplatform Radar Scenario'); legend('show'); % Show 3D view of the scenario. view(-60,10); while advance(scene) % Get current simulation time. time = scene.SimulationTime; % Generate detections from radars on each platform. detBuffer = {}; configsBuffer = []; for iPlat = 1:nPlat % Generate detections from the platform's radars. [dets,~,configs] = detect(platforms{iPlat}, time); % Buffer detections and configurations from this platform's radars. detBuffer = [detBuffer;dets]; %#ok<AGROW> configsBuffer = [configsBuffer;configs]; %#ok<AGROW> end % Update display with current beam positions and detections. theaterDisplay(detBuffer,configsBuffer); % Log sensor data and ground truth. [truthLog, dataLog] = logScenario(time, scene, configsBuffer, detBuffer); end snapnow(theaterDisplay); % Save scenario and detections. save MultiplatformRadarDetectionGeneration.mat scene truthLog dataLog
Заметьте большие лучи вентилятора с бортовых платформ и узкий луч карандаша от наземного радара, выполняющего развертку растра. Траектории основной истины лучше визуализируются в 2D проекции. Заметьте четыре цели, представленные треугольниками. Приблизительно 30 км на оси X являются авиалайнером, перемещаясь на восток (слева направо). Приблизительно 2 км на оси X являются струей, выполняющей поворот по часовой стрелке. Дальнейший юг является двумя пересекающимися авиалайнерами.
view(-90,90); % 2D view
Постройте регистрируемые обнаружения с их неопределенностью измерения. Каждый цвет соответствует платформе, генерирующей обнаружения. Легенда от предыдущего отображения применяется ко всем графикам в следующем анализе. Для краткости не повторяется эта легенда. Заметьте, что радары генерируют ложные предупреждения. Это обнаружения в следующем графике, которые не лежат около ни одной из целевых траекторий.
theaterDisplay(dataLog.Detections); title([num2str(numel(dataLog.Detections)) ' Detections Logged from ' num2str(numel(truthLog.SimulationTime)) ' Simulation Steps']); legend('hide');
3D представление в следующем графике показывает, как эти обнаружения распределяются в вертикальном изменении. Для платформ с 3D датчиками (синие и желтые платформы), обнаружения сопровождают целевые траектории. Обнаружения 2D платформы (красная платформа) возмещены в вертикальном изменении от целевых траекторий, потому что ее радар не может измерить вертикальное изменение. Неопределенность измерения с 1 сигмой показывают для каждого обнаружения как серый эллипсоид, сосредоточенный на измеренном целевом положении его обнаружения (показавшую заполненными кругами).
view([-60 25]); % 3D view
Увеличьте масштаб струи, выполняющей 90 горизонтальных поворотов степени. О неопределенности измерения с 1 сигмой сообщает радар согласно разрешению радара и отношению сигнал-шум (SNR) для каждого обнаружения. Цели в более длинных областях значений или с меньшими значениями ОСШ будут иметь большую неопределенность измерения, чем цели в более близких областях значений, которые будут иметь меньшие размеры интервала разрешения и большие значения ОСШ. Заметьте, что синие обнаружения имеют меньшую неопределенность измерения, чем желтые обнаружения. Это вызвано тем, что синие обнаружения происходят из бортовой платформы (Платформа 1), который намного ближе к цели, чем наземная платформа (Платформа 3), который сгенерировал желтые обнаружения.
xlim([-3 9]); ylim([-44 -32]); zlim([-12 0]); axis('square'); title('Jet Executing Horizontal Turn');
Заметьте большую неопределенность в вертикальном изменении для красных обнаружений, прибывающих из бортовой платформы, которая использует две линейных матрицы, чтобы обнаружить цели по левым и правым сторонам самолета (Платформа 2). Эллипсоиды имеют маленькие оси, соответствующие области значений и размерностям азимута радара, но имеют очень большие оси по измерению вертикального изменения радара. Это вызвано тем, что линейные матрицы на этой платформе не могут обеспечить оценки в вертикальном изменении. В этом случае, обнаружения показаний радара платформы в 0 градусах с неопределенностью в вертикальном изменении, соответствующем полю зрения вертикального изменения радара.
Увеличьте масштаб двух пересекающихся авиалайнеров. Заметьте, что синий бортовой радар с вращающимся массивом генерирует наименьшее количество количества обнаружений (только 4 обнаружения для этих двух целей), но эти обнаружения являются самыми точными (самые маленькие замещающие знаки). Небольшое количество обнаружений с этой платформы происходит из-за 360 механических сканирований ее радара, которые ограничивают, как часто ее луч может пересмотреть цель в сценарии. Другие платформы имеют радары, которые сканируют меньшие области, позволяя им пересмотреть цели на более высоком уровне.
view([-55 20]);
xlim([-22 -10]); ylim([-31 -19]);
title('Crossing Airliners');
Увеличьте масштаб авиалайнера, переместившись на восток. Те же наблюдения относительно относительного количества обнаружений и точности с различных радарных платформ применяются.
view([-70 10]);
xlim([24 36]); ylim([-26 -14]); zlim([-15 -3])
title('Airliner Traveling East');
В этом примере показано, как смоделировать радарную сеть наблюдения и симулировать обнаружения, сгенерированные несколькими бортовыми и наземными радарными платформами. В этом примере вы изучили, как задать сценарии, включая цели и платформы, которые могут быть стационарными или в движении. Вы также изучили, как визуализировать траектории основной истины, лучи датчика, обнаружения и сопоставленную неопределенность измерения. Можно обработать эти синтетические данные через алгоритмы отслеживания и сплава, чтобы оценить их производительность для этого сценария. Можно также изменить этот пример, чтобы осуществить мультицелевое средство отслеживания против различных целевых типов и маневров.
% Remove path to helper files used by this example.
delete(cleanPath);
commonUpdateRate
Эта функция находит общую частоту обновления через все датчики присоединенной к каждому platform
в массиве ячеек платформ. trackingScenario
должен усовершенствованный в фиксированном временном интервале. Эта функция обеспечивает интервал выборки, который характерен для всех датчиков, смоделированных в сценарии.
function rate = commonUpdateRate(platforms) dt = []; for iPlat = 1:numel(platforms) thisPlatform = platforms{iPlat}; theseSensors = thisPlatform.Sensors; for iSensor = 1:numel(theseSensors) thisSensor = theseSensors{iSensor}; tau = round(1e6/thisSensor.UpdateRate); % microseconds if isempty(dt) dt = tau; else dt = gcd(dt,tau); end end end rate = 1e6./dt; % Hz end
logScenario
Эта функция регистрирует основную истину и данные о датчике сценария.
function [truthLog, dataLog] = logScenario(time, scene, configsBuffer, detBuffer) persistent isInitialized persistent ptruthLog persistent pdataLog if isempty(isInitialized) ptruthLog.SimulationTime = []; ptruthLog.Truth = []; ptruthLog.Configurations = []; pdataLog.DetectionTime = []; pdataLog.Detections = {}; isInitialized = true; end % Log position and velocity of all platforms at each time step along with % each sensor field of view ptruthLog.SimulationTime = [ptruthLog.SimulationTime; time]; ptruthLog.Truth = [ptruthLog.Truth; platformPoses(scene)']; ptruthLog.Configurations = [ptruthLog.Configurations; configsBuffer']; truthLog = ptruthLog; % Log sensor detections for k = 1:numel(detBuffer) pdataLog.DetectionTime = [pdataLog.DetectionTime; time]; pdataLog.Detections = [pdataLog.Detections(:); detBuffer(k)]; end dataLog = pdataLog; end