Радарный пример по сценарию

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

Визуализация сценария

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

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

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

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

Для просмотра документации необходимо авторизоваться на сайте