exponenta event banner

Учебное пособие по сценарию радара

В этом примере показано, как создать и визуализировать простой сценарий радара программным способом с использованием 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

Обратите внимание, что время обновления моделирования неравномерно увеличивается до времени, требуемого для каждого из датчиков.

Резюме

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