exponenta event banner

Визуализация автоматической парковки с использованием имитации нереального двигателя

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

Введение

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

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

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

  3. Настройте сцену 3D и автомобиль ego в Simulink.

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

Создание карты затрат из 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 для планирования путей и навигации.

Сначала оцените свободное пространство по изображению. Свободное пространство - это область, в которой транспортное средство может ездить без столкновения с другими статическими объектами, такими как припаркованные автомобили, конусы и границы дорог, и без пересечения обозначенных линий. В этом примере можно оценить свободное пространство на основе цвета изображения. Используйте приложение «Пороговые значения цвета» на панели инструментов обработки изображений, чтобы выполнить сегментацию и создать двоичное изображение из изображения. Также можно использовать функцию помощника 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

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

Закройте фигуры и откройте модель.

helperCloseFigures

if ~ispc
    error(['3D Simulation is only supported on Microsoft', char(174), ' Windows', char(174), '.']);
end

modelName = 'APVWith3DSimulation';
open_system(modelName)
snapnow

Эта модель расширяет модель, используемую в примере автоматической парковки в Simulink, добавляя два блока для визуализации транспортного средства в 3D сцене:

  • Моделирование 3D Конфигурация сцены: реализует среду моделирования 3D. Для параметра Описание сцены (Scene description) установлено значение Large parking lot.

  • Моделирование 3D Транспортное средство с Наземным следующим: Обеспечивает интерфейс, который меняет положение и ориентацию транспортного средства в 3D сцене. Тип транспортного средства устанавливается равным Hatchback чтобы соответствовать размерам транспортного средства в costmap. Входами в этот блок являются входы транспортного средства. [X, Y] положение в метрах и Yaw угол курса в градусах. Эти значения находятся в мировой системе координат.

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

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

sim(modelName)

По мере выполнения моделирования среда Simulink обновляет положение и ориентацию транспортного средства в 3D механизме визуализации с помощью блока «Имитация транспортного средства» (Simulation 3D Vehicle). В новом окне показан автомобиль ego в механизме визуализации 3D. Automated Parking Valet На рисунке показана запланированная траектория синего цвета и фактическая траектория транспортного средства красного цвета. Parking Maneuver На рисунке показана локальная карта затрат, используемая при поиске конечного маневра парковки.

Обзор усовершенствованной системы планирования путей

Блок планировщика путей планирует возможный путь через карту среды, используя оптимальный алгоритм быстрого исследования случайного дерева (RRT *). Для обеспечения эффективности алгоритма планирования модуль планирования тракта модифицируется для включения двух отдельных модулей:

  • Режим вождения: Использует карту стоимости всей парковки для навигации. Эта реализация также используется в примере автоматической парковки в Simulink.

  • Режим парковки: использует локальную карту затрат для окончательного парковочного маневра. Локальная карта - это частичная карта карты с квадратной формой. Чтобы указать размер этой карты, используйте параметр Local costmap size (m) в диалоговом окне «Блок планировщика путей». Карта затрат с меньшими размерами значительно снижает вычислительную нагрузку при поиске возможного пути к конечному месту парковки. Это также увеличивает вероятность нахождения возможного пути при тех же параметрах настройки плановика.

Откройте подсистему планировщика путей.

open_system([modelName, '/Path Planner'], 'force')

Два модуля планировщика трактов реализованы в виде блоков Enabled Subsystem (Simulink). Разрешающий сигнал поступает от IsParkingManeuver сигнал на входе Config шина, отправленная из блока планировщика поведения. Когда подсистема режима парковки включена, создается локальная карта затрат с центром в качестве текущей позиции транспортного средства.

Закройте модель и фигуры.

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

См. также

Блоки

Функции

Приложения

Связанные темы