В этом примере показано, как симулировать маневр парковки и сгенерировать обнаружения датчика на большой парковке с помощью кубоида ведущая среда сценария. Эта среда симуляции сценария и датчика позволяет вам сгенерировать редкие и потенциально опасные события, на которых можно протестировать ваши автономные алгоритмы транспортного средства.
Сценарий, используемый в этом примере, содержит дорогу, парковку, движущиеся транспортные средства, стационарные транспортные средства и пешеходов. Автомобиль, оборудованный датчиком в этом сценарии содержит радарный датчик, который генерирует синтетические обнаружения для других агентов в сцене.
Задайте пустой сценарий.
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
Эта функция создает отображение с тремя панелями:
Верхняя левая панель — вид сверху, который следует за автомобилем, оборудованным датчиком.
Нижняя левая панель — поле зрения камеры преследования, которое следует за автомобилем, оборудованным датчиком.
Правая панель —
отображение.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
drivingScenario
| parkingSpace
| insertParkingSpaces
| birdsEyePlot