В этом примере показано, как настроить визуализацию регистрируемых данных моделирования синхронизируемым со временем способом при помощи Инспектора данных моделирования (SDI).
Автоматизированные ведущие приложения используют многоуровневые датчики, такие как камеры, радары, и лоцируют датчики, чтобы реализовать восприятие, планирование и алгоритмы управления. Automated Driving Toolbox™ обеспечивает инструменты для создания и визуализации различных сценариев тестирования, чтобы протестировать и проверить поведение вашего приложения. Улучшение проекта приложения часто требует, чтобы данные о визуализации из различных датчиков, наряду с данными моделирования, анализировали и отладили отказавшие тесты.
В этом примере показано, как настроить визуализацию регистрируемых данных моделирования для постанализа методом моделирования автоматизированного ведущего приложения. Это показывает, как сконфигурировать и визуализировать регистрируемый датчик и данные моделирования синхронизируемым со временем способом с помощью SDI. В этом примере, вас:
Исследуйте и симулируйте тестовую модель — модель состоит из транспортных средств, среды и среды визуализации. Сконфигурируйте и симулируйте модель, чтобы регистрировать данные для постанализа методом моделирования.
Смотрите записанные данные — Исследуют и смотрят записанные данные.
Сконфигурируйте и визуализируйте экземпляр данных — Конфигурируют и визуализируют записанные данные в определенном экземпляре времени.
Визуализируйте записанные данные с помощью 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, чтобы визуализировать данные в режиме воспроизведения. Можно также присвоить функцию обратного вызова курсору, с помощью 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)