В этом примере показано, как визуализировать движение транспортного средства в 3D сцене механизма визуализации с Simulink® и Automated Driving Toolbox™. Это сопровождает Автоматизированного Камердинера Парковки в примере Simulink.
Automated Driving Toolbox интегрирует 3D среду симуляции в Simulink. 3D среда симуляции использует Нереальный Engine® Epic Games®. Можно использовать этот механизм, чтобы визуализировать движение транспортного средства в предварительно созданной 3D сцене. Этот механизм обеспечивает интуитивный способ анализировать производительность алгоритмов управления транспортного средства и планирования пути. Автоматизированный Камердинер Парковки в примере Simulink показывает, как спроектировать планирование пути и алгоритм управления транспортного средства для автоматизированной системы камердинера парковки в Simulink. В этом примере показано, как увеличить модель, чтобы визуализировать движение транспортного средства в сцене с помощью 3D механизма визуализации. Шаги в этом рабочем процессе:
Создайте costmap из 3D сцены.
Создайте план маршрута из сцены.
Сконфигурируйте 3D сцену и автомобиль, оборудованный датчиком в Simulink.
Симулируйте и визуализируйте движение транспортного средства в 3D сцене.
Интегрирование визуализации идет со многими предварительно созданными сценами. Каждая сцена идет с изображением с высоким разрешением, которое может использоваться, чтобы исследовать сцену. Используйте helperShowSceneImage
функционируйте, чтобы отобразить изображения. Этот пример использует Большую сцену Парковки.
% Load and display the image of the parking lot sceneName = 'LargeParkingLot'; [sceneImage, sceneRef] = helperGetSceneImage(sceneName); % Visualize the scene image figure helperShowSceneImage(sceneImage, sceneRef)
Такое изображение с высоким разрешением является точным описанием среды до некоторого разрешения. Можно использовать это изображение, чтобы создать
для планирования пути и навигации.vehicleCostmap
Во-первых, оцените свободное пространство от изображения. Свободное пространство является областью, где транспортное средство может управлять без столкновения с другими статическими объектами, такими как припаркованные автомобили, конусы и дорожные контуры, и не пересекая отмеченные линии. В этом примере можно оценить свободное пространство на основе цвета изображения. Используйте приложение Color Thresholder из Image Processing Toolbox, чтобы выполнить сегментацию и сгенерировать двухуровневое изображение от изображения. Можно также использовать функцию помощника helperCreateCostmapFromImage
в конце примера, чтобы сгенерировать двухуровневое изображение:
sceneImageBinary = helperCreateCostmapFromImage(sceneImage);
В качестве альтернативы загрузите предсгенерированное двухуровневое изображение.
sceneImageBinary = imread('sim3d_LargeParkingLotBinary.bmp');
Затем создайте costmap из двухуровневого изображения. Используйте двухуровневое изображение, чтобы задать величину затрат в каждой ячейке.
% Get the left-bottom corner location of the map mapLocation = [sceneRef.XWorldLimits(1), sceneRef.YWorldLimits(1)]; % [meters, meters] % Compute resolution mapWidth = sceneRef.XWorldLimits(2)-sceneRef.XWorldLimits(1); % meters cellSize = mapWidth/size(sceneImageBinary, 2); % Create the costmap costmap = vehicleCostmap(im2single(sceneImageBinary), 'CellSize', cellSize, 'MapLocation', mapLocation); figure plot(costmap, 'Inflation', 'off'); legend off
Также необходимо задать размерности транспортного средства, которое припаркуется автоматически на основе транспортных средств, доступных в 3D сцене. Этот пример использует размерность Хэтчбека. Эти размерности должны быть сопоставимыми между costmap и моделью Simulink.
centerToFront = 1.104; % meters centerToRear = 1.343; % meters frontOverhang = 0.828; % meters rearOverhang = 0.589; % meters vehicleWidth = 1.653; % meters vehicleHeight = 1.513; % meters vehicleLength = centerToFront + centerToRear + frontOverhang + rearOverhang; vehicleDims = vehicleDimensions(vehicleLength, vehicleWidth, vehicleHeight,... 'FrontOverhang', frontOverhang, 'RearOverhang', rearOverhang); costmap.CollisionChecker.VehicleDimensions = vehicleDims;
Установите радиус инфляции путем определения количества кругов, заключающих транспортное средство.
costmap.CollisionChecker.NumCircles = 5;
Глобальный план маршрута описан как последовательность сегментов маршрута, чтобы пересечь для того, чтобы добраться до места для парковки. Можно в интерактивном режиме выбрать промежуточные целевые положения из изображения сцены с помощью инструмента, описанного в, Выбирают Waypoints для 3D Симуляции. В этом примере план маршрута был создан и сохранен в таблице. Перед симуляцией, PreLoadFcn
функция обратного вызова модели загружает план маршрута.
data = load('routePlanUnreal.mat'); routePlan = data.routePlan %#ok<NOPTS> % Plot vehicle at the starting pose startPose = routePlan.StartPose(1,:); hold on helperPlotVehicle(startPose, vehicleDims, 'DisplayName', 'Current Pose') legend for n = 1 : height(routePlan) % Extract the goal waypoint vehiclePose = routePlan{n, 'EndPose'}; % Plot the pose legendEntry = sprintf('Goal %i', n); helperPlotVehicle(vehiclePose, vehicleDims, 'DisplayName', legendEntry); hold on end hold off
routePlan = 5×3 table StartPose EndPose Attributes _______________________ _______________________ ____________ 44.5 8 180 -33.5 8.5 180 [1×1 struct] -33.5 8.5 180 -45.2 -0.7 250 [1×1 struct] -45.2 -0.7 250 -33.5 -13.5 0 [1×1 struct] -33.5 -13.5 0 -20.3 -13.5 -7 [1×1 struct] -20.3 -13.5 -7 -13.5 -6.8 90 [1×1 struct]
Закройте фигуры и откройте модель.
helperCloseFigures if ~ispc error(['3D Simulation is only supported on Microsoft', char(174), ' Windows', char(174), '.']); end modelName = 'AutomatedParkingValetWith3DSimulation'; open_system(modelName) snapnow
Эта модель расширяет тот, используемый в Автоматизированном Камердинере Парковки в примере Simulink путем добавления двух блоков для визуализации транспортного средства в 3D сцене:
Симуляция 3D Настройка Сцены: Реализует 3D среду симуляции. Параметр описания Сцены устанавливается на Large parking lot
.
Симуляция 3D Транспортное средство с Наземным следующим: Обеспечивает интерфейс, который меняет положение и ориентацию транспортного средства в 3D сцене. Тип транспортного средства установлен в Hatchback
быть сопоставимым с размерностями транспортного средства в costmap
. Входными параметрами с этим блоком является [X, Y]
транспортного средства положение в метрах и
Yaw
заголовок угла в градусах. Эти значения находятся в системе мировой координаты.
Симулируйте модель, чтобы видеть, как транспортное средство управляет в желаемое место для парковки.
sim(modelName)
Когда симуляция запускается, окружение Simulink обновляет положение и ориентацию транспортного средства в 3D механизме визуализации посредством Симуляции 3D Транспортное средство с блоком Ground Following. Новое окно показывает автомобиль, оборудованный датчиком в 3D механизме визуализации. Automated Parking Valet
фигура отображает запланированный путь синего цвета и фактический путь транспортного средства красного цвета. Parking Maneuver
фигурируйте показывает локальный costmap, используемый в поиске итогового маневра парковки.
Блок Path Planner планирует выполнимый путь через карту среды с помощью оптимального быстро исследующего случайного дерева (RRT*) алгоритм. Чтобы гарантировать производительность алгоритма планирования, модуль планирования пути изменяется, чтобы включать два отдельных модуля:
Управление Режимом: Использует costmap целой парковки для навигации. Эта реализация также используется в Автоматизированном Камердинере Парковки в примере Simulink.
Парковка Режима: Использует локальный costmap в итоговом маневре парковки. Локальный costmap является подкартой costmap с квадратной формой. Чтобы задать размер этой карты, используйте Локальный costmap размер (m) параметр диалогового окна блока Планировщика Пути. costmap с меньшими размерностями значительно уменьшает нагрузку расчета в поиске выполнимого пути к итоговому месту для парковки. Это также увеличивает вероятность нахождения выполнимого пути, учитывая те же настройки планировщика.
Откройте подсистему Планировщика Пути.
open_system([modelName, '/Path Planner'], 'force')
Два модуля планировщика пути реализованы как Enabled блоки Subsystem. Разрешать сигнал от IsParkingManeuver
сигнал во входе Config
шина отправляется от блока Behavior Planner. Когда подсистема Режима Парковки включена, локальный costmap создается с центром как текущее положение транспортного средства.
Закройте модель и фигуры.
bdclose all
helperCloseFigures
Этот пример показал, как интегрировать 3D симуляцию с существующим Автоматизированным Камердинером Парковки в примере Simulink, чтобы визуализировать движение транспортного средства в 3D сцене парковки.
helperCreateCostmapFromImage
function BW = helperCreateCostmapFromImage(sceneImage) %#ok<DEFNU> %helperCreateCostmapFromImage Create a costmap from an RGB image. % Flip the scene image sceneImage = flipud(sceneImage); % Call the autogenerated code from the Color Thresholder app BW = helperCreateMask(sceneImage); % Smooth the image BW = im2uint8(medfilt2(BW)); % Resize BW = imresize(BW, 0.5); % Compute complement BW = imcomplement(BW); end
helperCreateMask
function [BW,maskedRGBImage] = helperCreateMask(RGB) %helperCreateMask Threshold RGB image using auto-generated code from Color Thresholder app. % [BW,maskedRGBImage] = createMask(RGB) thresholds image RGB using % autogenerated code from the Color Thresholder app. The colorspace and % range for each channel of the colorspace were set within the app. The % segmentation mask is returned in BW, and a composite of the mask and % original RGB image is returned in maskedRGBImage. % Convert RGB image to chosen colorspace I = RGB; % Define thresholds for channel 1 based on histogram settings channel1Min = 67.000; channel1Max = 216.000; % Define thresholds for channel 2 based on histogram settings channel2Min = 68.000; channel2Max = 171.000; % Define thresholds for channel 3 based on histogram settings channel3Min = 69.000; channel3Max = 160.000; % Create mask based on chosen histogram thresholds sliderBW = (I(:,:,1) >= channel1Min ) & (I(:,:,1) <= channel1Max) & ... (I(:,:,2) >= channel2Min ) & (I(:,:,2) <= channel2Max) & ... (I(:,:,3) >= channel3Min ) & (I(:,:,3) <= channel3Max); BW = sliderBW; % Initialize output masked image based on input image maskedRGBImage = I; % When BW is false, set background pixels to zero maskedRGBImage(repmat(~BW,[1 1 3])) = 0; end
helperCloseFigures
function helperCloseFigures() %helperCloseFigures Close all the figures except the simulation visualization % Find all the figure objects figHandles = findobj('Type', 'figure'); % Close the figures for i = 1: length(figHandles) close(figHandles(i)); end end