В этом примере показано, как создать и визуализировать простой радиолокационный сценарий программно с помощью 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 - локального каркаса кузова являются направлениями вперед, вправо и вниз, соответственно.
The 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 метров.
The 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-цикла и вызова 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;
Чтобы показать время симуляции, добавьте элемент управления UI к рисунку.
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
Заметьте, что время обновления симуляции увеличивается неоднородно до времени, требуемого каждым из датчиков.
В этом примере вы научились создавать и визуализировать простой сценарий и получать обнаружения, сгенерированные генератором радиолокационных данных.