В этом примере показано, как визуализировать движение транспортного средства в 3D среде симуляции, визуализированной с помощью Unreal Engine ® из Epic Games ®. Он внимательно следует примеру Automated Parking Valet в Simulink.
Automated Driving Toolbox™ интегрирует среду симуляции Unreal Engine в Simulink ®. Можно использовать это окружение, чтобы визуализировать движение транспортного средства в предварительно построенной сцене. Это окружение предоставляет интуитивно понятный способ анализа эффективности планирования пути и алгоритмов управления автомобиля. Пример Automated Parking Valet в Simulink показывает, как спроектировать алгоритм планирования пути и управления автомобилем для автоматизированной системы парковки в Simulink. Этот пример показывает, как увеличить модель, чтобы визуализировать движение транспортного средства в сцене, используя механизм визуализации. Шаги в этом рабочем процессе:
Создайте косметику из 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, чтобы выполнить сегментацию и сгенерировать бинарное изображение из изображения. Можно также использовать функцию helper helperCreateCostmapFromImage
в конце примера для генерации бинарного изображения:
sceneImageBinary = helperCreateCostmapFromImage(sceneImage);
В качестве альтернативы загружает предварительно генерированное бинарное изображение.
sceneImageBinary = imread('sim3d_LargeParkingLotBinary.bmp');
Затем создайте косметику из бинарного изображения. Используйте бинарное изображение, чтобы задать значение стоимости для каждой камеры.
% 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 сцене. В этом примере используется размерность хетчбэка. Эти размерности должны быть последовательными между косметикой и моделью 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;
Глобальный план трассы описывается как последовательность сегментов маршрута для прохождения по порядку достижения парковочного места. Можно интерактивно выбрать промежуточные положения целей из изображения сцены с помощью инструмента, описанного в разделе «Выбор путевых точек для 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 = 'APVWith3DSimulation'; open_system(modelName) snapnow
Эта модель расширяет ту, которая используется в примере Automated Parking Valet в Simulink, добавляя два блока для визуализации транспортного средства в 3D сцене:
Simulation 3D Scene Строение: реализует 3D среду симуляции. Параметр Scene description установлен в Large parking lot
.
Симуляция 3D транспортного средства с землей Следующее: Обеспечивает интерфейс, который изменяет положение и ориентацию транспортного средства в 3D сцене. Тип транспортного средства установлен в Hatchback
чтобы соответствовать размерностям транспортного средства в costmap
. Входами к этому блоку являются [X, Y]
транспортного средства положение в метрах и
Yaw
угол рыскания в степенях. Эти значения находятся в мировой системе координат.
Симулируйте модель, чтобы увидеть, как транспортное средство въезжает в желаемое место парковки.
sim(modelName)
Когда симуляция выполняется, окружение Simulink обновляет положение и ориентацию транспортного средства в 3D механизме визуализации через блок Simulation 3D Vehicle с Ground Following. Новое окно показывает автомобиль , оборудованный датчиком в 3D механизме визуализации. The Automated Parking Valet
рисунок отображает плановый путь синего цвета и фактический путь транспортного средства красного цвета. The Parking Maneuver
рисунок показывает локальную косметическую карту, используемую при поиске окончательного маневра стоянки.
Блок Path Planner планирует допустимый путь через карту окружения с помощью оптимального быстро исследующего алгоритма случайного дерева (RRT *). Для обеспечения эффективности алгоритма планирования модуль планирования пути изменяется таким образом, чтобы включать два отдельных модуля:
Режим вождения: Использует косметику всей стоянки для навигации. Эта реализация также используется в примере Automated Parking Valet в Simulink.
Парковочный режим: использует местную косметическую карту для окончательного маневра парковки. Локальная косметическая карта является подкартой косметической карты с квадратной формой. Чтобы задать размер этой карты, используйте параметр Local costmap size (m) Пути Planner диалогового окна блока. Косметическая карта с меньшими размерностями значительно уменьшает вычислительное бремя при поиске допустимого пути к конечному парковочному месту. Это также увеличивает вероятность нахождения допустимого пути при тех же настройках планировщика.
Откройте подсистему Path Planner.
open_system([modelName, '/Path Planner'], 'force')
Два модуля планировщика пути реализованы как блоки Enabled Subsystem (Simulink). Сигнал включения от IsParkingManeuver
сигнал в вход Config
шина, отправленная из блока Behavior Planner. Когда подсистема Parking Mode включена, создается локальная косметическая карта с центром в качестве текущего положения транспортного средства.
Закройте модель и рисунки.
bdclose all
helperCloseFigures
Этот пример показал, как интегрировать симуляцию 3D с существующим примером Automated Parking Valet в 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