В этом примере показано, как визуализировать движение транспортного средства в 3D среде симуляции, представленной с помощью Нереального Engine® от Epic Games®. Это сопровождает Автоматизированного Камердинера Парковки в примере Simulink.
Automated Driving Toolbox™ интегрирует Нереальную среду симуляции Engine в Simulink®. Можно использовать эту среду, чтобы визуализировать движение транспортного средства в предварительно созданной сцене. Эта среда обеспечивает интуитивный способ анализировать эффективность алгоритмов управления транспортного средства и планирования пути. Автоматизированный Камердинер Парковки в примере Simulink показывает, как спроектировать планирование пути и алгоритм управления транспортного средства для автоматизированной системы камердинера парковки в Simulink. В этом примере показано, как увеличить модель, чтобы визуализировать движение транспортного средства в сцене с помощью механизма визуализации. Шаги в этом рабочем процессе:
Создайте 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) приложение из 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 for Unreal Engine Simulation. В этом примере план маршрута был создан и сохранен в таблице. Перед симуляцией, 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 Подсистема (Simulink) блоки. Разрешать сигнал от 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