В этом примере показано, как создать и визуализировать простой сценарий радара программным способом с использованием radarScenario, theaterPlot, и radarDataGenerator объекты.
Для начала создайте пустой сценарий радара. Все свойства сценария имеют значения по умолчанию. Сценарий не содержит платформы по умолчанию.
scenario = radarScenario
scenario =
radarScenario with properties:
IsEarthCentered: 0
UpdateRate: 10
SimulationTime: 0
StopTime: Inf
SimulationStatus: NotStarted
Platforms: {}
Сценарий состоит из объектов, называемых платформами, на которых можно устанавливать датчики и излучатели. Для добавления платформы используйте platform объектная функция. Здесь создается простая башня.
tower = platform(scenario)
tower =
Platform with properties:
PlatformID: 1
ClassID: 0
Position: [0 0 0]
Orientation: [0 0 0]
Dimensions: [1x1 struct]
Trajectory: [1x1 kinematicTrajectory]
PoseEstimator: [1x1 insSensor]
Emitters: {}
Sensors: {}
Signatures: {[1x1 rcsSignature]}
При первом создании платформы она имеет PlatformID, который является уникальным идентификатором, который можно использовать для идентификации платформы. Сценарий назначает идентификаторы платформ в порядке их создания. Можно указать ClassID для обозначения классификации платформы. Например, здесь для обозначения башни используется 3.
tower.ClassID = 3;
Датчики могут обнаруживать платформы. Для радиолокационных датчиков соответствующей характеристикой является сечение РЛС (RCS). По умолчанию используется единая сигнатура RCS:
tower.Signatures{1}
ans =
rcsSignature with properties:
Pattern: [2x2 double]
Azimuth: [-180 180]
Elevation: [2x1 double]
Frequency: [0 1.0000e+20]
Загрузите предварительно определенные данные RCS цилиндра и используйте эти данные для определения RCS платформы башни.
load('RCSCylinderExampleData.mat','cylinder'); tower.Signatures{1} = rcsSignature('Pattern', cylinder.RCSdBsm, ... 'Azimuth', cylinder.Azimuth, 'Elevation', cylinder.Elevation, ... 'Frequency', cylinder.Frequency);
По умолчанию платформы не имеют размеров и моделируются как точечные цели. При необходимости можно указать длину, ширину и высоту, чтобы обозначить протяженность объекта, а также смещение начала каркаса тела от его геометрического центра. Размеры платформы можно задать с помощью Dimensions собственность.
Размеры башни определяются следующим образом:
tower.Dimensions = struct( ... 'Length', 10, ... 'Width', 10, ... 'Height', 60, ... 'OriginOffset', [0 0 30]);
Башня имеет длину, ширину и высоту 10, 10 и 60 метров. Смещение начала координат [0 0 30] указывает на то, что начало координат рамы кузова (центр вращения) составляет 30 метров в положительном направлении Z локальной оси кузова платформы.
Вы можете получить текущее положение и ориентацию платформы через ее Position и Orientation свойства. Дополнительную информацию о платформах можно получить с помощью метода platformPoses сценария:
scenario.platformPoses
ans =
struct with fields:
PlatformID: 1
ClassID: 3
Position: [0 0 0]
Velocity: [0 0 0]
Acceleration: [0 0 0]
Orientation: [1x1 quaternion]
AngularVelocity: [0 0 0]
Можно указать положение и ориентацию платформы с течением времени, используя ее Trajectory собственность. Можно задать траекторию платформы с помощью kinematicTrajectory, waypoinTrajectory, или geoTrajectory объект.
По умолчанию платформа состоит из статического kineticTrajectory ось тела которого идеально центрирована и выровнена с осями сценария:
tower.Trajectory
ans =
kinematicTrajectory with properties:
SampleRate: 100
Position: [0 0 0]
Orientation: [1x1 quaternion]
Velocity: [0 0 0]
AccelerationSource: 'Input'
AngularVelocitySource: 'Input'
Чтобы получить угол наклона 4 градуса, используйте Orientation свойства объекта траектории. Укажите ориентацию с помощью кватерниона, полученного из углов Эйлера.
tYaw = 0; tPitch = 4; tRoll = 0; tower.Trajectory.Orientation = quaternion([tYaw tPitch tRoll],'eulerd','zyx','frame');
В большинстве примеров в Radar Toolbox используется соглашение «Север-Восток-Вниз». Это означает, что ось X указывает на север, ось Y указывает на восток, а ось Z указывает вниз. Кроме того, направления x, y и z локального корпуса являются направлениями вперед, вправо и вниз соответственно.
theaterPlot объект обеспечивает интерфейс для динамической печати объектов в сцене 3-D. Можно использовать стандартные методы печати осей MATLAB для добавления или удаления аннотаций к осям графика кинотеатра, которые можно получить с помощью его Parent собственность.
Использовать platformPlotter для построения графиков платформ.
Как и ожидалось, башня центрирована в начале координат NED с шагом 4 градуса.
tPlot = theaterPlot('XLim',[-50 50],'YLim',[-50 50],'ZLim',[-100 0]); pPlotter = platformPlotter(tPlot,'DisplayName','tower'); pose = platformPoses(scenario); towerPose = pose(1); towerDims = tower.Dimensions; plotPlatform(pPlotter, towerPose.Position, towerDims, towerPose.Orientation); set(tPlot.Parent,'YDir','reverse', 'ZDir','reverse'); view(tPlot.Parent, -37.5, 30)

Чтобы добавить радиолокационный датчик к платформе, можно добавить radarDataGenerator объект на платформе с использованием его Sensors собственность.
Помните, что в системе координат NED направление «Z» указывает вниз. Поэтому, если вы хотите смонтировать радар в верхней части башни, следует установить его положение «z» на -60 метров.
radarDataGenerator имеет возможность сообщать об обнаружениях в координатах сценария. Отчеты об обнаружениях в координатах сценария упрощают сравнение созданных обнаружений с позициями объектов в сценарии.
towerRadar = radarDataGenerator('SensorIndex', 1, ... 'UpdateRate', 10, ... 'MountingLocation', [0 0 -60], ... 'ScanMode', 'No scanning', ... 'HasINS', true, ... 'TargetReportFormat', 'Detections', ... 'DetectionCoordinates', 'Scenario'); tower.Sensors = towerRadar;
Для просмотра покрытий датчиков в сценарии используется плоттер покрытия и выполняется график конфигурации покрытия в сценарии. Расширить диапазон театрального сюжета можно, настроив пределы его внутренних осей:
tPlot.XLimits = [-5000 5000]; tPlot.YLimits = [-5000 5000]; tPlot.ZLimits = [-1000 0]; covPlotter = coveragePlotter(tPlot,'DisplayName','Sensor Coverage'); plotCoverage(covPlotter, coverageConfig(scenario));

В сценарии можно добавить другие платформы и настроить параметры, влияющие на то, как другие датчики наблюдают за платформами. Вы можете использовать rcsSignature чтобы смоделировать то, что увидит радар, установленный на башне.
Следующий код создает вертолет и устанавливает его сечение РЛС всерёд на величину 40 дБсм.
helicopter = platform(scenario); helicopter.Dimensions = struct( ... 'Length',30, ... 'Width', .1, ... 'Height', 7, ... 'OriginOffset',[0 8 -3.2]); helicopter.Signatures = rcsSignature( ... 'Pattern',[40 40; 40 40], ... 'Elevation',[-90; 90], ... 'Azimuth',[-180,180]);
Можно установить несколько датчиков на любой платформе, поместив их в массив ячеек перед назначением Sensors собственность.
helicopter.Sensors = { ...
radarDataGenerator('SensorIndex', 2, ...
'UpdateRate', 20, ...
'MountingLocation', [22 0 0], ...
'MountingAngles', [-5 0 0], ...
'ScanMode', 'No scanning', ...
'HasINS', true, ...
'TargetReportFormat', 'Detections', ...
'DetectionCoordinates', 'Scenario'), ...
radarDataGenerator('SensorIndex', 3, ...
'UpdateRate', 30, ...
'MountingLocation', [22 0 0], ...
'MountingAngles', [5 0 0], ...
'ScanMode', 'No scanning', ...
'HasINS', true, ...
'TargetReportFormat', 'Detections', ...
'DetectionCoordinates', 'Scenario')};
Можно организовать пересечение вертолётом траектории радиолокационного луча. Это показывает, как заставить вертолет следовать по прямой 100-метровой траектории с постоянной скоростью с отметкой 250 метров в течение семи секунд:
helicopter.Trajectory = waypointTrajectory([2000 50 -250; 2000 -50 -250],[0 7]);
Перемещение платформы по времени выполняется с помощью while-loop и вызова сценария advance способ.
Можно распечатать все положения, ориентации и размеры платформ в контуре:
profiles = platformProfiles(scenario); dimensions = vertcat(profiles.Dimensions); while advance(scenario) poses = platformPoses(scenario); positions = vertcat(poses.Position); orientations = vertcat(poses.Orientation); plotPlatform(pPlotter, positions, dimensions, orientations); plotCoverage(covPlotter, coverageConfig(scenario)); % to animate more slowly uncomment the following line % pause(0.01) end

В приведенном выше примере вы добавили три радара с различными скоростями обновления: башня имеет частоту обновления 10 Гц, а вертолет имел два радара с частотами обновления 20 Гц и 30 Гц соответственно.
Сценарий может быть переведен в режим, в котором вызов advance обновляет время моделирования, необходимое для обновления каждого из содержащихся в нем датчиков. Этого можно достичь, установив UpdateRate сценария до нуля.
scenario.UpdateRate = 0;
Чтобы показать время моделирования, добавьте к рисунку элемент управления пользовательским интерфейсом.
fig = ancestor(tPlot.Parent,'Figure'); timeReadout = uicontrol(fig,'Style','text','HorizontalAlignment','left','Position',[0 0 200 20]); timeReadout.String = "SimulationTime: " + scenario.SimulationTime;

Теперь можно установить правильное время работы датчика. Вы можете использовать detect для получения обнаружений, доступных каждому датчику в контуре. Обнаружения можно показать, создав detectionPlotter объект.
dPlotter = detectionPlotter(tPlot,'DisplayName','detections');

Можно снова запустить то же моделирование, перезапустив его и изменив для сообщения об обнаружениях.
Обнаруженные позиции для radarDataGenerator может быть извлечено из обнаружения Measurement поле:
restart(scenario); while advance(scenario) timeReadout.String = "SimulationTime: " + scenario.SimulationTime; detections = detect(scenario); % extract column vector of measurement positions allDetections = [detections{:}]; if ~isempty(allDetections) measurement = cat(2,allDetections.Measurement)'; else measurement = zeros(0,3); end plotDetection(dPlotter, measurement); poses = platformPoses(scenario); positions = vertcat(poses.Position); orientations = vertcat(poses.Orientation); plotPlatform(pPlotter, positions, dimensions, orientations); plotCoverage(covPlotter, coverageConfig(scenario)); end

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