Руководство по радарному сценарию

В этом примере показано, как создать и визуализировать простой радиолокационный сценарий программно с помощью radarScenario, theaterPlot, и radarDataGenerator объекты.

Setup сценария

Для начала создайте пустой радиолокационный сценарий. Все свойства сценария имеют значения по умолчанию. Сценарий не содержит никакой платформы по умолчанию.

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

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

Сводные данные

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