В этом примере показано, как визуализировать движение транспортного средства в среде моделирования 3D, визуализированной с помощью Unreal Engine ® от Epic Games ®. Он точно соответствует примеру автоматической парковки в Simulink.
Automated Driving Toolbox™ интегрирует среду моделирования Unreal Engine в Simulink ®. Эту среду можно использовать для визуализации движения транспортного средства в заранее построенной сцене. Эта среда обеспечивает интуитивно понятный способ анализа эффективности планирования пути и алгоритмов управления транспортным средством. Пример автоматической парковки в Simulink показывает, как проектировать планирование пути и алгоритм управления транспортным средством для автоматизированной системы парковки в Simulink. В этом примере показано, как дополнить модель для визуализации движения транспортного средства в сцене с помощью механизма визуализации. В этом рабочем процессе выполняются следующие шаги:
Создайте карту затрат из сцены 3D.
Создайте план трассы из сцены.
Настройте сцену 3D и автомобиль ego в 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
Сначала оцените свободное пространство по изображению. Свободное пространство - это область, в которой транспортное средство может ездить без столкновения с другими статическими объектами, такими как припаркованные автомобили, конусы и границы дорог, и без пересечения обозначенных линий. В этом примере можно оценить свободное пространство на основе цвета изображения. Используйте приложение «Пороговые значения цвета» на панели инструментов обработки изображений, чтобы выполнить сегментацию и создать двоичное изображение из изображения. Также можно использовать функцию помощника 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;
Глобальный план трассы описывается как последовательность сегментов полосы движения, пересекаемых для достижения места парковки. Можно в интерактивном режиме выбрать промежуточные позиции цели из изображения сцены с помощью инструмента, описанного в разделе Выбор ППМ для моделирования нереального механизма. В этом примере план маршрута создан и сохранен в таблице. Перед моделированием 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

Эта модель расширяет модель, используемую в примере автоматической парковки в Simulink, добавляя два блока для визуализации транспортного средства в 3D сцене:
Моделирование 3D Конфигурация сцены: реализует среду моделирования 3D. Для параметра Описание сцены (Scene description) установлено значение Large parking lot.
Моделирование 3D Транспортное средство с Наземным следующим: Обеспечивает интерфейс, который меняет положение и ориентацию транспортного средства в 3D сцене. Тип транспортного средства устанавливается равным Hatchback чтобы соответствовать размерам транспортного средства в costmap. Входами в этот блок являются входы транспортного средства. [X, Y] положение в метрах и Yaw угол курса в градусах. Эти значения находятся в мировой системе координат.
Смоделировать модель, чтобы увидеть, как транспортное средство въезжает в нужное место парковки.
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