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

В этом примере показано, как визуализировать движение транспортного средства в 3D сцене механизма визуализации с Simulink® и Automated Driving Toolbox™. Это сопровождает Автоматизированного Камердинера Парковки в примере Simulink.

Введение

Automated Driving Toolbox интегрирует 3D среду симуляции в Simulink. 3D среда симуляции использует Нереальный Engine® Epic Games®. Можно использовать этот механизм, чтобы визуализировать движение транспортного средства в предварительно созданной 3D сцене. Этот механизм обеспечивает интуитивный способ анализировать производительность алгоритмов управления транспортного средства и планирования пути. Автоматизированный Камердинер Парковки в примере Simulink показывает, как спроектировать планирование пути и алгоритм управления транспортного средства для автоматизированной системы камердинера парковки в Simulink. В этом примере показано, как увеличить модель, чтобы визуализировать движение транспортного средства в сцене с помощью 3D механизма визуализации. Шаги в этом рабочем процессе:

  1. Создайте costmap из 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, чтобы выполнить сегментацию и сгенерировать двухуровневое изображение от изображения. Можно также использовать функцию помощника 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;

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

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

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

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

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

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

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

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

Смотрите также

Блоки

Функции

Приложения

Похожие темы