Визуализируйте записанные данные из нереальной симуляции Engine

В этом примере показано, как настроить визуализацию регистрируемых данных моделирования синхронизируемым со временем способом при помощи Инспектора данных моделирования (SDI).

Введение

Автоматизированные ведущие приложения используют многоуровневые датчики, такие как камеры, радары, и лоцируют датчики, чтобы реализовать восприятие, планирование и алгоритмы управления. Automated Driving Toolbox™ обеспечивает инструменты для создания и визуализации различных сценариев тестирования, чтобы протестировать и проверить поведение вашего приложения. Улучшение проекта приложения часто требует, чтобы данные о визуализации из различных датчиков, наряду с данными моделирования, анализировали и отладили отказавшие тесты.

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

  1. Исследуйте и симулируйте тестовую модель — модель состоит из транспортных средств, среды и среды визуализации. Сконфигурируйте и симулируйте модель, чтобы регистрировать данные для постанализа методом моделирования.

  2. Смотрите записанные данные — Исследуют и смотрят записанные данные.

  3. Сконфигурируйте и визуализируйте экземпляр данных — Конфигурируют и визуализируют записанные данные в определенном экземпляре времени.

  4. Визуализируйте записанные данные с помощью SDI — Визуализируют записанные данные для целого запуска симуляции с помощью SDI.

Поскольку этот пример требует, чтобы фотореалистическая среда симуляции собрала данные от различных датчиков в процессе моделирования, вы включаете симуляцию посредством интеграции с Нереальным Engine® от Epic Games®. 3D среда симуляции требует Windows® 64-битная платформа.

if ~ispc
    error(['3D Simulation is supported only on Microsoft', char(174), ' Windows', char(174), '.'])
end

Исследуйте и симулируйте тестовую модель

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

Откройте тестовую модель.

open_system("VisualizeSensorDataTestBench")

Тестовая модель содержит эти подсистемы:

  • Vehicles and Environment — Задает сцену и транспортные средства.

  • Camera — Задает датчик камеры, накладывает ограничительные рамки для транспортных средств в сцене и регистрирует данные к мультимедийному файлу.

  • Map data — Генерирует широту и долготу от положения эго, и отображает географические данные на графике с помощью geoplayer.

  • Lidar — Задает датчик лидара, вычисляет ограничительные рамки для транспортных средств и визуализирует данные об облаке точек.

  • INS — Задает датчик INS, чтобы получить информацию положения для автомобиля, оборудованного датчиком.

  • Radar — Задает радарный датчик, чтобы получить радарные обнаружения.

Vehicles and Environment подсистема использует предварительно созданную Виртуальную сцену Макити с предопределенными траекториями транспортного средства. Откройте Vehicles and Environment подсистема.

open_system("VisualizeSensorDataTestBench/Vehicles and Environment")

Сценарий содержит шесть транспортных средств, перемещающихся с предопределенными траекториями. Автомобиль, оборудованный датчиком соединяется с камерой, радаром и датчиками лидара. Этот пример позволяет вам визуализировать данные этих датчиков и основную истину транспортных средств.

Можно также сконфигурировать логгирование необходимых данных и сигналов для визуализации постсимуляции. Для получения дополнительной информации смотрите, Конфигурируют Сигнал для Логгирования (Simulink). Когда вы запускаете симуляцию, модель открывает различные окна, чтобы визуализировать различные типы данных:

  • Нереальный Engine создает 3D окно симуляции, чтобы отобразить сценарий.

  • Блок To Video Display отображает изображения, наложенные с транспортными средствами основной истины.

  • Map Display подсистема открывает географический проигрыватель, чтобы отобразить географическое положение автомобиля, оборудованного датчиком.

  • Visualize Point Cloud Функциональный блок MATLAB® открывает лидар pcplayer окно, чтобы отобразить облако точек.

Симулируйте модель, чтобы регистрировать необходимые данные.

sim("VisualizeSensorDataTestBench");
close("PointCloud data")

Смотрите записанные данные

Для визуализации постсимуляции модель регистрирует данные моделирования к logsout переменная, которая является Simulink.SimulationData.Dataset (Simulink) объект. Регистрируемые сигналы хранятся в Simulink.SimulationData.Signal (Simulink) тип данных.

Отобразите logsout.

disp(logsout)
Simulink.SimulationData.Dataset 'logsout' with 15 elements

                         Name                  BlockPath                                
                         ____________________  ________________________________________ 
    1  [1x1 Signal]      lidar_truth           ...ataTestBench/Compute Vehicle Boxes 3D
    2  [1x1 Signal]      ins_acceleration      VisualizeSensorDataTestBench/INS        
    3  [1x1 Signal]      ins_angular_velocity  VisualizeSensorDataTestBench/INS        
    4  [1x1 Signal]      ins_orientation       VisualizeSensorDataTestBench/INS        
    5  [1x1 Signal]      ins_position          VisualizeSensorDataTestBench/INS        
    6  [1x1 Signal]      ins_velocity          VisualizeSensorDataTestBench/INS        
    7  [1x1 Signal]      actor_boxes           ...izeSensorDataTestBench/MATLAB System1
    8  [1x1 Signal]      ego_latitude          ...ataTestBench/Map Display/Conv2LatLong
    9  [1x1 Signal]      ego_longitude         ...ataTestBench/Map Display/Conv2LatLong
   10  [1x1 Signal]      point_cloud           ...nsorDataTestBench/Simulation 3D Lidar
   11  [1x1 Signal]      ''                    ...mulation 3D Lidar/Simulation 3D Lidar
   12  [1x1 Signal]      radar_detections      ...nch/Simulation 3D Probabilistic Radar
   13  [1x1 Signal]      ''                    ...dar/Simulation 3D Probabilistic Radar
   14  [1x1 Signal]      actors                ...icles and Environment/Scenario Reader
   15  [1x1 Signal]      ego                   ...icles and Environment/Scenario Reader

  - Use braces { } to access, modify, or add elements using index.

Можно получить доступ к регистрируемому сигналу с помощью его Name или BlockPath при помощи get метод. Например, получите доступ к сигналу для регистрируемых радарных обнаружений с помощью этой команды.

radarSignal = logsout.get("radar_detections")
radarSignal = 

  Simulink.SimulationData.Signal
  Package: Simulink.SimulationData

  Properties:
              Name: 'radar_detections'
    PropagatedName: ''
         BlockPath: [1×1 Simulink.SimulationData.BlockPath]
          PortType: 'outport'
         PortIndex: 1
            Values: [1×1 struct]

Чтобы получить доступ к данным из сигнала, используйте Values свойство Simulink.SimulationData.Signal объект. Получите данные радарного сигнала.

radarData = radarSignal.Values
radarData = 

  struct with fields:

    NumDetections: [1×1 timeseries]
      IsValidTime: [1×1 timeseries]
       Detections: [50×1 struct]

Заметьте, что NumDetections поле находится в формате timeseries. Это содержит данные для полной симуляции, запущенной в формате массивов. Отобразите NumDetections данные.

disp(radarData.NumDetections)
  timeseries with properties:

               Events: []
                 Name: 'NumDetections'
             UserData: []
                 Data: [1×1×1121 double]
             DataInfo: [1×1 tsdata.datametadata]
                 Time: [1121×1 double]
             TimeInfo: [1×1 tsdata.timemetadata]
              Quality: []
          QualityInfo: [1×1 tsdata.qualmetadata]
          IsTimeFirst: 0
    TreatNaNasMissing: 1
               Length: 1121

Time свойство содержит соответствующее время для каждого регистрируемого сигнала. Data свойство содержит количество обнаружений на каждом временном шаге.

Найдите количество обнаружений и соответствующее время симуляции, точки данных 481.

disp(['At ',num2str(radarData.NumDetections.Time(481)), ...
    's, the Number of Radar Detections is ', num2str(radarData.NumDetections.Data(481)), '.'])
At 24s, the Number of Radar Detections is 13.

Сконфигурируйте и визуализируйте экземпляр данных

Этот раздел показывает, как сконфигурировать скрипт настройки, чтобы визуализировать записанные данные в требуемое время.

Сконфигурируйте параметры визуализации

Используйте helperVisualizationSetup функция, чтобы настроить визуализацию ваших датчиков.

helperVisualizationSetup функция возвращает конфигурационную структуру визуализации, которая может хранить необходимые данные о датчике для визуализации наряду с флагами, указывающими, визуализировать ли камеры, радарные датчики и датчики лидара. По умолчанию конфигурационная структура имеет, обнуляет для данных о датчике.

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

visualizationDataConfig = helperVisualizationSetup
visualizationDataConfig = 

  struct with fields:

    enableCameraVisualization: 1
     enableRadarVisualization: 1
     enableLidarVisualization: 1
                    numCamera: 1
                     numRadar: 1
                     numLidar: 1
                BusCameraData: [1×1 struct]
                 BusRadarData: [1×1 struct]
                 BusLidarData: [1×1 struct]

Обратите внимание на то, что флаги собираются визуализировать данные из камеры, радара и датчиков лидара. Данные каждого датчика хранятся в отдельной структуре. Можно использовать Редактор Шины, чтобы изучить формат данных о датчике. Для получения дополнительной информации см. Редактор Шины (Simulink).

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

disp(visualizationDataConfig.BusCameraData)
           enableCameraLaneTruth: 0
         enableCameraObjectTruth: 1
      enableCameraLaneDetections: 0
    enableCameraObjectDetections: 0
                           Frame: [768×1024×3 double]
                     GroundTruth: [1×1 struct]
                      Detections: [1×1 struct]
                      Parameters: [1×1 struct]

Флаг, чтобы визуализировать ограничительные рамки транспортного средства, наложенные на изображении камеры, установлен в true. Другие флаги для визуализации маршрута (истина и обнаружения) и обнаружения транспортного средства установлены в false.

Frame поле хранит данные изображения для визуализации как массив. GroundTruth структура хранит достоверные данные для транспортных средств и маршрутов.

disp(visualizationDataConfig.BusCameraData.GroundTruth)
    Objects: [20×4 double]
      Lanes: [1×1 struct]

Detections структура хранит обнаружения от транспортных средств и маршрутов.

disp(visualizationDataConfig.BusCameraData.Detections)
    Objects: [1×1 struct]
      Lanes: [1×1 struct]

Parameters структура хранит параметры камеры, которые могут быть изменены путем редактирования helperVisualizationSetup функциональный скрипт.

disp(visualizationDataConfig.BusCameraData.Parameters)
             NumColumns: 1024
                NumRows: 768
            FieldOfView: [45 45]
              ImageSize: [768 1024]
         PrincipalPoint: [512 384]
            FocalLength: [512 512]
               Position: [1.8750 0 1.2000]
          PositionSim3d: [0.5700 0 1.2000]
               Rotation: [0 0 0]
        DetectionRanges: [6 50]
    LaneDetectionRanges: [6 30]
       MeasurementNoise: [3×3 double]
     MinObjectImageSize: [10 10]

BusRadarData структура хранит флаги, чтобы включить визуализацию истины агента и сценария, наложенного на виде с высоты птичьего полета. По умолчанию эти два флага установлены в true. Эта структура также хранит основную истину агента, радарные обнаружения и радарные параметры. Можно изменить радарные параметры с помощью helperVisualizationSetup функция.

disp(visualizationDataConfig.BusRadarData)
         enableRadarObjectTruth: 1
    enableScenarioVisualization: 1
                         Actors: [1×1 struct]
                     Detections: [1×1 struct]
                     Parameters: [1×1 struct]

disp(visualizationDataConfig.BusRadarData.Parameters)
        FieldOfView: [40 5]
    DetectionRanges: [1 150]
           Position: [3.7290 0 0.8000]
      PositionSim3d: [2.4240 0 0.8000]
           Rotation: [0 0 0]

BusLidarData хранит enableLidarObjectTruth отметьте, который включает визуализацию ограничительных рамок транспортного средства основной истины на облаке точек. Чтобы хранить информацию основной истины, установите этот флаг на true. PointCloud поле хранит данные об облаке точек для визуализации.

disp(visualizationDataConfig.BusLidarData)
    enableLidarObjectTruth: 1
               ObjectTruth: [20×9 double]
                PointCloud: [0 0 0]

Получите экземпляр данных

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

Задайте время для визуализации.

time = 24;
simulationTimeStep = max(1,round(time/Ts)); % Ts is simulation step size.

Считайте данные о камере и истину транспортного средства 2D ограничительные рамки от logsout.

% Read camera image recording
videoSrc = VideoReader("forwardFacingCamera_Mcity.mp4");

% Vehicle ground truth 2D bounding boxes
cameraObjectTruthData = logsout.get("actor_boxes").Values;

Получите систему координат камеры в требуемое время.

frame = read(videoSrc, simulationTimeStep);

Добавьте систему координат камеры и истину транспортного средства к visualizationDataConfig структура.

% Add camera frame into structure
visualizationDataConfig.BusCameraData.Frame = frame;
% Add vehicle truth 2D bounding boxes into structure
visualizationDataConfig.BusCameraData.GroundTruth.Objects = cameraObjectTruthData.data(:,:,simulationTimeStep);

Считайте радарные обнаружения, шину эго и истину транспортного средства.

radarDetectionsData = logsout.get("radar_detections").Values;
egoVehicleData = logsout.get("ego").Values;
radarActorTruth = logsout.get("actors").Values;

Добавьте радарные обнаружения в visualizationDataConfig структура.

% Radar object detections
numDetections = radarDetectionsData.NumDetections.Data(simulationTimeStep);
for k = 1:numDetections
    visualizationDataConfig.BusRadarData.Detections.Detections(k).Measurement = radarDetectionsData.Detections(k).Measurement.Data(:,:,simulationTimeStep);
    visualizationDataConfig.BusRadarData.Detections.Detections(k).MeasurementNoise = radarDetectionsData.Detections(k).MeasurementNoise.Data(:,:,simulationTimeStep);
end
visualizationDataConfig.BusRadarData.Detections.NumDetections = numDetections;

Добавьте информацию об эго в visualizationDataConfig для визуализации сценария в видимом с большого расстояния графике.

% Ego information
visualizationDataConfig.BusRadarData.Actors.NumActors = 1;
visualizationDataConfig.BusRadarData.Actors.Actors(1).Position = egoVehicleData.Position.Data(:,:,simulationTimeStep);
visualizationDataConfig.BusRadarData.Actors.Actors(1).Yaw = egoVehicleData.Yaw.Data(:,:,simulationTimeStep);

Добавьте истину агента в visualizationDataConfig структура для визуализации в видимом с большого расстояния графике.

% Get actor truth for radar
numActors = radarActorTruth.NumActors.Data(simulationTimeStep);
% Add Actor bus data into structure
visualizationDataConfig.BusRadarData.Actors.NumActors = radarActorTruth.NumActors.Data(simulationTimeStep) + 1;
fn = fieldnames(visualizationDataConfig.BusRadarData.Actors.Actors);
for i = 1:numActors
    for k = 1:numel(fn)
        visualizationDataConfig.BusRadarData.Actors.Actors(i+1).(fn{k}) = radarActorTruth.Actors(i).(fn{k}).Data(:,:,simulationTimeStep);
    end
end

Считайте данные о лидаре и истину транспортного средства 3D ограничительные рамки от данных моделирования.

% Lidar data
pointCloudData = logsout.get("point_cloud").Values;
% Vehicle ground truth 3D bounding boxes
lidarActorBoxes = logsout.get("lidar_truth").Values;

Добавьте данные о лидаре и истину транспортного средства к visualizationDataConfig структура.

% Add point cloud into structure
visualizationDataConfig.BusLidarData.PointCloud = pointCloudData.Data(:,:,:,simulationTimeStep);
% Add vehicle truth 3D bounding boxes into structure
visualizationDataConfig.BusLidarData.ObjectTruth = lidarActorBoxes.Data(:,:,simulationTimeStep);

Визуализируйте экземпляр данных

Используйте helperPlotSensorData функция, чтобы визуализировать данные в visualizationDataConfig. Поскольку эта функция использует персистентные переменные, чтобы задать фигуру и оси для визуализации, необходимо очистить существующие персистентные переменные.

clear helperPlotSensorData

Визуализируйте экземпляр данных.

helperPlotSensorData(visualizationDataConfig, scenario)

Визуализируйте Записанные данные с помощью SDI

Можно также использовать SDI, чтобы визуализировать записанные данные для целой симуляции. SDI является мощным инструментом для визуализации и сравнения нескольких видов данных, включая данные о карте. Используя SDI, можно визуализировать регистрируемые сигналы в течение и после симуляции. Можно использовать курсор в SDI, чтобы визуализировать данные в режиме воспроизведения. Можно также присвоить функцию обратного вызова курсору, с помощью Simulink.sdi.registerCursorCallback функция, которая инициировала, когда вы перемещаете курсор SDI. Поскольку Simulink.sdi.registerCursorCallback функция возвращает ID коллбэка, который необходимо очистить прежде, чем присвоить другую функцию обратного вызова, использовать Simulink.sdi.unregisterCursorCallback функционируйте, чтобы очистить коллбэк SDI.

Эта блок-схема показывает рабочий процесс для визуализации записанных данных с помощью SDI. Используя helperVisualizeData функция, можно задать имена сигналов это записанные данные в процессе моделирования. Можно также визуализировать данные о карте с регистрируемым ego_latitude и ego_longitude сигналы. Для получения дополнительной информации, вид на море и Данные о Карте Воспроизведения (Simulink).

helperVisualizeData функция инициализирует SDI и добавляет seekSDICallbackFunction функционируйте как функцию обратного вызова курсора SDI. Функция обратного вызова берет данные из logsout и добавляет его в структуру при каждом перемещении курсора. Функция обратного вызова передает эту структуру helperPlotSensorData функция, которая позволяет вам визуализировать данные о датчике в режиме воспроизведения.

visualizationDataConfig = helperVisualizationSetup;
id = helperVisualizeData(logsout, scenario, visualizationDataConfig);

helperVisualizeData функция возвращает ID коллбэка функции обратного вызова курсора SDI. Не укажите функцию обратного вызова курсора SDI прежде, чем запустить симуляцию снова.

Simulink.sdi.unregisterCursorCallback(id)

Похожие темы

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