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