Симулируйте маневр парковки транспортного средства в управлении сценарием

В этом примере показано, как симулировать маневр парковки и сгенерировать обнаружения датчика на большой парковке с помощью кубоида ведущая среда сценария. Эта среда симуляции сценария и датчика позволяет вам сгенерировать редкие и потенциально опасные события, на которых можно протестировать ваши автономные алгоритмы транспортного средства.

Создайте сценарий

Сценарий, используемый в этом примере, содержит дорогу, парковку, движущиеся транспортные средства, стационарные транспортные средства и пешеходов. Автомобиль, оборудованный датчиком в этом сценарии содержит радарный датчик, который генерирует синтетические обнаружения для других агентов в сцене.

Задайте пустой сценарий.

scenario = drivingScenario;
scenario.SampleTime = 0.2;

Добавьте 2D маршрут, 70-метровую дорогу к сценарию.

roadCenters = [69.2 11.7 0;
              -1.1 11.5 0];
marking = [laneMarking("Solid")
           laneMarking("DoubleSolid",Color=[1 0.9 0])
           laneMarking("Solid")];
laneSpecification = lanespec(2,Width=5.925,Marking=marking);
road(scenario,roadCenters,Lanes=laneSpecification,Name="Road");

Добавьте вторую, более короткую дорогу, чтобы служить входом на парковку.

roadCenters = [12.4 7.7 0;
               12.4 -15.8 0];
road(scenario,roadCenters,Name="Road1");

Используйте parkingLot функция, чтобы создать парковку с четырьмя сетками парковочных мест: один каждый вдоль верхнего и нижнего ребра партии, и два посреди партии. Сетки парковки вдоль ребер содержат обычные парковочные места, в то время как сетки парковки в середине содержат комбинацию обычных и доступных парковочных мест. Парковка также содержит маршрут огня вдоль правого края.

lot = parkingLot(scenario,[3 -5; 60 -5; 60 -48; 3 -48]);

% Create the parking spaces.
cars = parkingSpace;
accessible = parkingSpace(Type="Accessible");
accessibleLane = parkingSpace(Type="NoParking",MarkingColor=[1 1 1],Width=1.5);
fireLane = parkingSpace(Type="NoParking",Length=2,Width=40);

% Insert the parking spaces.
insertParkingSpaces(lot,cars,Edge=2); % Top edge
insertParkingSpaces(lot,cars,Edge=4); % Bottom edge
insertParkingSpaces(lot, ...
    [cars accessibleLane accessible accessibleLane accessible], ...
    [7 1 1 1 1],Rows=2,Position=[42 -12]);
insertParkingSpaces(lot, ...
    [cars accessibleLane accessible accessibleLane accessible], ...
    [7 1 1 1 1],Rows=2,Position=[23 -12]);
insertParkingSpaces(lot,fireLane,1,Edge=3,Offset=8); % Right edge

% Plot the scenario.
plot(scenario)

Добавьте агентов в ведущий сценарий. Положения и траектории агентов заданы в helperAddActors вспомогательный файл.

% Add actors.
scenario = helperAddActors(scenario);

% Define ego vehicle.
ego = scenario.Actors(1);

Задайте радарный датчик

В этом примере вы симулируете автомобиль, оборудованный датчиком, который имеет один радарный датчик дальний, расположенный на переднем бампере транспортного средства. Датчик имеет максимальную область значений 50 метров, поле зрения азимута 60 градусов и поле зрения вертикального изменения 5 градусов. Фигура в следующем разделе отображает покрытие датчика.

sensors = cell(1,1);
% Front-facing long-range radar sensor at the center of the front bumper of the car.
sensors{1} = drivingRadarDataGenerator(SensorIndex=1,RangeLimits=[0 50], ...
    MountingLocation=[(ego.Wheelbase + ego.FrontOverhang) 0 0.2],FieldOfView=[60 5]);

% Register actor profiles with the sensors.
profiles = actorProfiles(scenario);
for m = 1:numel(sensors)
    sensors{m}.Profiles = profiles;
end

Визуализируйте сценарий

Создайте отображение для сценария. Это отображение визуализирует сценарий с точки зрения автомобиля, оборудованного датчиком от верхней части вниз и из-за автомобиля, оборудованного датчиком. Это также отображает покрытие датчика на видимом с большого расстояния графике и возвращает указатель на этот график вызвать в процессе моделирования.

BEP = createDemoDisplay(ego,sensors);

Симулируйте сценарий

Используйте цикл, чтобы переместить транспортные средства и вызвать симуляцию датчика.

Обратите внимание на то, что генерация сценария и симуляция датчика могут иметь различные временные шаги. Определение различных временных шагов для сценария и датчиков позволяет вам разъединить симуляцию сценария от симуляции датчика. Этот метод полезен для моделирования движения агента с высокой точностью независимо от уровня измерения датчика.

В этом примере сценарий имеет временной шаг 0,01 секунд, в то время как датчик обнаруживает каждую 0.1 секунды. Датчик возвращает логический флаг, isValidTime, это - true если датчик генерирует обнаружения.

while advance(scenario) && ishghandle(BEP.Parent)

    % Get scenario time
    time = scenario.SimulationTime;

    % Get position of other vehicle in ego vehicle coordinates
    poses = targetPoses(ego);

    % Simulate sensors
    detections = {};
    isValidTime = false; %#ok<NASGU>

    [sensorDets,numValidDets,isValidTime] = sensors{1}(poses,time);
    if numValidDets
        detections = [detections; sensorDets]; %#ok<AGROW>
    end

    % Update bird's-eye plot
    if any(isValidTime)
        updateBEP(BEP,ego,detections);
    end
end

Сводные данные

Этот пример показал, как сгенерировать сценарий, содержащий парковку, симулировать обнаружения датчика и использовать эти обнаружения, чтобы обнаружить транспортные средства и пешеходов на парковке.

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

Вспомогательные Функции

createDemoDisplay

Эта функция создает отображение с тремя панелями:

  1. Верхняя левая панель — вид сверху, который следует за автомобилем, оборудованным датчиком.

  2. Нижняя левая панель — поле зрения камеры преследования, которое следует за автомобилем, оборудованным датчиком.

  3. Правая панель — birdsEyePlot отображение.

function BEP = createDemoDisplay(egoCar,sensors)
    % Make a figure
    hFigure = figure(Position=[0 0 1200 640],Name="Parking Maneuver Scenario");
    movegui(hFigure,[0 -1]); % Moves figure left and a little down from the top

    % Add a car plot that follows the ego vehicle from behind
    hCarViewPanel = uipanel(hFigure,Position=[0 0 0.5 0.5],Title="Chase Camera View");
    hCarPlot = axes(hCarViewPanel);
    chasePlot(egoCar,Parent=hCarPlot,Meshes="on");

    % Add a car plot that follows the ego vehicle from a top view
    hTopViewPanel = uipanel(hFigure,Position=[0 0.5 0.5 0.5],Title="Top View");
    hCarPlot = axes(hTopViewPanel);
    chasePlot(egoCar,Parent=hCarPlot,ViewHeight=130,ViewLocation=[0 0],ViewPitch=90);

    % Add pane for bird's-eye plot
    hBEVPanel = uipanel(hFigure,Position=[0.5 0 0.5 1],Title="Bird's-Eye Plot");

    % Create bird's-eye plot for the ego vehicle and sensor coverage
    hBEVPlot = axes(hBEVPanel);
    frontBackLim = 60;
    BEP = birdsEyePlot(Parent=hBEVPlot,Xlimits=[-frontBackLim frontBackLim],Ylimits=[-35 35]);

    % Plot the coverage area for radar
    cap = coverageAreaPlotter(BEP,FaceColor="red",EdgeColor="red");
    plotCoverageArea(cap,sensors{1}.MountingLocation(1:2), ...
        sensors{1}.RangeLimits(2),sensors{1}.MountingAngles(1),sensors{1}.FieldOfView(1));

    % Combine all radar detections into one entry and store it for later update
    detectionPlotter(BEP,DisplayName="Radar",MarkerEdgeColor="red");

    % Add road borders to plot
    laneBoundaryPlotter(BEP,DisplayName="Road boundaries");

    % Add lane markings to plot
    laneMarkingPlotter(BEP,DisplayName="Lane markings");

    axis(BEP.Parent,"equal");
    xlim(BEP.Parent,[-frontBackLim frontBackLim]);
    ylim(BEP.Parent,[-40 40]);

    % Add an outline plotter for ground truth
    outlinePlotter(BEP,Tag="Ground truth");
end

updateBEP

Эта функция обновляет видимый с большого расстояния график с дорожными контурами, обнаружениями и дорожками.

function updateBEP(BEP,ego,detections)
    % Update road boundaries and their display
    [lmv,lmf] = laneMarkingVertices(ego);
    plotLaneMarking(findPlotter(BEP,DisplayName="Lane markings"),lmv,lmf);

    % Update parking lot boundaries and markings and their display
    [plmv,plmf] = parkingLaneMarkingVertices(ego);
    plotParkingLaneMarking(findPlotter(BEP,DisplayName="Lane markings"),plmv,plmf);

    % Update ground truth data
    [position,yaw,length,width,originOffset,color] = targetOutlines(ego);
    plotOutline(findPlotter(BEP,Tag="Ground truth"),position,yaw,length,width, ...
        OriginOffset=originOffset,Color=color);

    % Update road boundaries
    rbs = roadBoundaries(ego);
    plotLaneBoundary(findPlotter(BEP,DisplayName="Road boundaries"),rbs);

    % Prepare and update detections display
    N = numel(detections);
    detPos = zeros(N,2);
    isRadar = true(N,1);
    for i = 1:N
        detPos(i,:) = detections{i}.Measurement(1:2)';
    end
    plotDetection(findPlotter(BEP,DisplayName="Radar"), detPos(isRadar,:));
end

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

| | |