Визуализация автоматизированной парковки с помощью Unreal Engine Simulation

В этом примере показано, как визуализировать движение транспортного средства в 3D среде симуляции, визуализированной с помощью Unreal Engine ® из Epic Games ®. Он внимательно следует примеру Automated Parking Valet в Simulink.

Введение

Automated Driving Toolbox™ интегрирует среду симуляции Unreal Engine в Simulink ®. Можно использовать это окружение, чтобы визуализировать движение транспортного средства в предварительно построенной сцене. Это окружение предоставляет интуитивно понятный способ анализа эффективности планирования пути и алгоритмов управления автомобиля. Пример Automated Parking Valet в Simulink показывает, как спроектировать алгоритм планирования пути и управления автомобилем для автоматизированной системы парковки в Simulink. Этот пример показывает, как увеличить модель, чтобы визуализировать движение транспортного средства в сцене, используя механизм визуализации. Шаги в этом рабочем процессе:

  1. Создайте косметику из 3D сцены.

  2. Создайте план трассы с места происшествия.

  3. Сконфигурируйте 3D сцену и автомобиль , оборудованный датчиком в Simulink.

  4. Симулируйте и визуализируйте движение транспортного средства в 3D сцене.

Создайте Costmap из 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;

Создайте план трассы из 3D сцены

Глобальный план трассы описывается как последовательность сегментов маршрута для прохождения по порядку достижения парковочного места. Можно интерактивно выбрать промежуточные положения целей из изображения сцены с помощью инструмента, описанного в разделе «Выбор путевых точек для 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]

Сконфигурируйте 3D Scene и Автомобиль , Оборудованный Датчиком

Закройте рисунки и откройте модель.

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 угол рыскания в степенях. Эти значения находятся в мировой системе координат.

Визуализация движения транспортного средства в 3D сцене

Симулируйте модель, чтобы увидеть, как транспортное средство въезжает в желаемое место парковки.

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

См. также

Блоки

Функции

Приложения

Похожие темы