В этом примере показано, как визуализировать движение транспортного средства, когда оно перемещается по парковке в кубоиде ведущая среда сценария. Это сопровождает Визуализирование Автоматизированного Камердинера Парковки Используя Нереальный пример Симуляции Engine.
Automated Driving Toolbox™ предоставляет кубоиду ведущую среду сценария, которая позволяет быстро сценариям автора, сгенерируйте обнаружения с помощью датчиков радара и камеры низкого качества, и тестовых контроллеров и отследив и алгоритмов cочетания датчиков и в MATLAB® и в Simulink®. Автоматизированный Камердинер Парковки в примере Simulink показывает, как спроектировать планирование пути и алгоритм управления транспортного средства для автоматизированной системы камердинера парковки в Simulink. В этом примере показано, как увеличить тот алгоритм, чтобы визуализировать движение транспортного средства в сценарии с помощью drivingScenario
объект. Шаги в этом рабочем процессе:
Создайте ведущий сценарий, содержащий парковку.
Создайте vehicleCostmap
из ведущего сценария.
Создайте план маршрута относительно автомобиля, оборудованного датчиком в сценарии.
Симулируйте сценарий в Simulink и визуализируйте движение транспортного средства в ведущем сценарии.
drivingScenario
объект позволяет сценам низкого качества автора. Создайте drivingScenario
возразите и добавьте элементы, необходимые, чтобы смоделировать маневр парковки:
Создайте парковку, которая содержит сетки парковочных мест.
Добавьте автомобиль, оборудованный датчиком.
Вставьте статические транспортные средства в различных местоположениях на парковке, чтобы служить препятствиями.
% Create drivingScenario object scenario = drivingScenario; % Create parking lot lot = parkingLot(scenario,[3 -5; 60 -5; 60 -48; 3 -48]); % Create parking spaces cars = parkingSpace(Width=3.3); accessible = parkingSpace(Type="Accessible",Width=3.3); accessLane = parkingSpace(Type="NoParking",MarkingColor=[1 1 1],Width=1.5); fireLane = parkingSpace(Type="NoParking",Length=2,Width=40); % Insert parking spaces insertParkingSpaces(lot,cars,Edge=2); insertParkingSpaces(lot,cars,Edge=4); insertParkingSpaces(lot,[cars accessLane accessible accessLane accessible], ... [5 1 1 1 1],Rows=2,Position=[42 -12]); insertParkingSpaces(lot,[cars accessLane accessible accessLane accessible], ... [5 1 1 1 1],Rows=2,Position=[23 -12]); insertParkingSpaces(lot,fireLane,1,Edge=3,Offset=8); % Add the ego vehicle egoVehicle = vehicle(scenario, ... ClassID=1, ... Position=[13 8 0].*[1 -1 1], ... Yaw=270, ... Mesh=driving.scenario.carMesh, ... Name="Ego"); % Add stationary vehicles car1 = vehicle(scenario, ... ClassID=1, ... Position=[7.5 -42.7 0.01], ... Yaw=180, ... Mesh=driving.scenario.carMesh); car2 = vehicle(scenario, ... ClassID=1, ... Position=[19 -17.5 0.01], ... Mesh=driving.scenario.carMesh); car3 = vehicle(scenario, ... ClassID=1, ... Position=[27.5 -38.3 0.01], ... Yaw=180, ... Mesh=driving.scenario.carMesh); car4 = vehicle(scenario, ... ClassID=1, ... Position=[55.5 -13.8 0.01], ... Mesh=driving.scenario.carMesh); car5 = vehicle(scenario, ... ClassID=1, ... Position=[38 -20.8 0.01], ... Mesh=driving.scenario.carMesh); % Plot drivingScenario plot(scenario)
Чтобы создать costmap из ведущего сценария, выполните эти шаги:
Получите снимок экрана графика ведущего сценария с помощью saveas
функционируйте или инструмент по вашему выбору. Сохраните снимок экрана как файл PNG в рабочей директории.
Создайте пространственный объект привязки с помощью imref2d
функция. Используйте размерности парковки, чтобы задать пределы X и Y.
Считайте изображение PNG в переменную в базовом рабочем пространстве с помощью imread
функция.
Можно затем использовать helperShowSceneImage
функция помощника, чтобы отобразить изображение. Этот пример предоставляет ранее полученный снимок экрана с высоким разрешением сценария и пространственного объекта привязки.
% Load the image data load("SceneImageData.mat","sceneImage","sceneRef") % Visualize the scene image figure helperShowSceneImage(sceneImage,sceneRef)
Снимок экрана является точным описанием среды до некоторого разрешения. Можно использовать это изображение, чтобы создать
для планирования пути и навигации.vehicleCostmap
Во-первых, оцените свободное пространство при помощи изображения. Свободное пространство является областью, где транспортное средство может управлять без столкновения со статическими объектами, такими как припаркованные автомобили, конусы и дорожные контуры, и не пересекая отмеченные линии. В этом примере можно оценить свободное пространство на основе цвета изображения. Используйте приложение Color Thresholder, чтобы выполнить сегментацию и сгенерировать бинарное изображение от изображения. Можно также использовать helperCreateCostmapFromImage
функция помощника, детализированная в конце этого примера, чтобы сгенерировать бинарное изображение:
sceneImageBinary = helperCreateCostmapFromImage(sceneImage);
Затем создайте 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
Необходимо также задать размерности транспортного средства, которое паркуется в ведущем сценарии. Этот пример использует размерности транспортного средства, описанные в Создать Траекториях Агента и Транспортного средства Программно пример.
frontOverhang = egoVehicle.FrontOverhang;
rearOverhang = egoVehicle.RearOverhang;
vehicleWidth = egoVehicle.Width;
vehicleHeight = egoVehicle.Height;
vehicleLength = egoVehicle.Length;
centerToFront = (vehicleLength/2) - frontOverhang;
centerToRear = (vehicleLength/2) - rearOverhang;
vehicleDims = vehicleDimensions(vehicleLength,vehicleWidth,vehicleHeight, ...
FrontOverhang=frontOverhang,RearOverhang=rearOverhang);
costmap.CollisionChecker.VehicleDimensions = vehicleDims;
Установите радиус инфляции путем определения количества кругов, заключающих транспортное средство.
costmap.CollisionChecker.NumCircles = 5;
Глобальный план маршрута является последовательностью сегментов маршрута, которые транспортное средство должно пересечь, чтобы достигнуть места для парковки. В этом примере план маршрута был создан и сохранен в таблице. Для получения дополнительной информации о создании плана маршрута рассмотрите Автоматизированного Камердинера Парковки в примере Simulink. Перед симуляцией, PreLoadFcn
функция обратного вызова модели загружает план маршрута.
data = load("routePlanDrivingScenario.mat"); routePlan = data.routePlan %#ok<NOPTS> % Plot vehicle at the starting pose egoVehicle.Position = [routePlan.StartPose(1,2) routePlan.StartPose(1,1) 0].*[1 -1 1]; egoVehicle.Yaw = routePlan.StartPose(1,3) - 90; 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 = 4x3 table StartPose EndPose Attributes ____________________ ____________________ __________ 8 13 0 37.5 13 0 1x1 struct 37.5 13 0 43 22 90 1x1 struct 43 22 90 35 34 180 1x1 struct 35 34 180 24.3 29 270 1x1 struct
APVWithDrivingScenario
модель расширяет тот, используемый в Автоматизированном Камердинере Парковки в примере Simulink путем добавления графика визуализировать транспортное средство в ведущем сценарии. Откройте модель.
helperCloseFigures
modelName = "APVWithDrivingScenario";
open_system(modelName)
Блок Path Planner модели Simulink вычисляет оптимальную траекторию для автомобиля, оборудованного датчиком с помощью плана маршрута, созданного ранее. Модель генерирует положение для автомобиля, оборудованного датчиком на каждом временном шаге. Модель кормит этим положением блок Visualization, который обновляет drivingScenario
возразите и costmap визуализация. Постройте ведущий сценарий с точки зрения автомобиля, оборудованного датчиком.
chasePlot(egoVehicle,ViewHeight=3,ViewPitch=5,Meshes="on"); movegui("east");
Симулируйте модель, чтобы видеть, как транспортное средство управляет в желаемое место для парковки.
sim(modelName)
Когда симуляция запускается, окружение Simulink обновляет положение и ориентацию транспортного средства в ведущем сценарии с помощью блока Visualization. Автоматизированная фигура Камердинера Парковки отображает запланированный путь синего цвета и фактический путь транспортного средства красного цвета. Паркующийся рисунок Маневра показывает локальный costmap, используемый в поиске итогового маневра парковки.
Закройте модель и фигуры.
bdclose all
helperCloseFigures
helperCreateCostmapFromImage
function BW = helperCreateCostmapFromImage(sceneImage) %helperCreateCostmapFromImage Create a costmap from an RGB image. % 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 have been 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 color space. I = RGB; % Define thresholds for channel 1 based on histogram settings. channel1Min = 115.000; channel1Max = 246.000; % Define thresholds for channel 2 based on histogram settings. channel2Min = 155.000; channel2Max = 225.000; % Define thresholds for channel 3 based on histogram settings. channel3Min = 193.000; channel3Max = 209.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 = RGB; % Set background pixels where BW is false 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
parkingLot
| drivingScenario
| vehicleCostmap