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

В этом примере показано, как визуализировать движение транспортного средства, когда оно перемещается по парковке в кубоиде ведущая среда сценария. Это сопровождает Визуализирование Автоматизированного Камердинера Парковки Используя Нереальный пример Симуляции Engine.

Рабочий процесс визуализации

Automated Driving Toolbox™ предоставляет кубоиду ведущую среду сценария, которая позволяет быстро сценариям автора, сгенерируйте обнаружения с помощью датчиков радара и камеры низкого качества, и тестовых контроллеров и отследив и алгоритмов cочетания датчиков и в MATLAB® и в Simulink®. Автоматизированный Камердинер Парковки в примере Simulink показывает, как спроектировать планирование пути и алгоритм управления транспортного средства для автоматизированной системы камердинера парковки в Simulink. В этом примере показано, как увеличить тот алгоритм, чтобы визуализировать движение транспортного средства в сценарии с помощью drivingScenario объект. Шаги в этом рабочем процессе:

  1. Создайте ведущий сценарий, содержащий парковку.

  2. Создайте vehicleCostmap из ведущего сценария.

  3. Создайте план маршрута относительно автомобиля, оборудованного датчиком в сценарии.

  4. Симулируйте сценарий в 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 из управления сценарием

Чтобы создать costmap из ведущего сценария, выполните эти шаги:

  1. Получите снимок экрана графика ведущего сценария с помощью saveas функционируйте или инструмент по вашему выбору. Сохраните снимок экрана как файл PNG в рабочей директории.

  2. Создайте пространственный объект привязки с помощью imref2d функция. Используйте размерности парковки, чтобы задать пределы X и Y.

  3. Считайте изображение 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

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

| |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте