drivingScenario

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

Описание

Объект drivingScenario представляет 3-D арену, содержащую дороги, автомобили, пешеходов и другие аспекты ведущего сценария. Используйте этот объект смоделировать реалистические сценарии трафика и сгенерировать синтетические обнаружения для тестирования контроллеров или алгоритмов сплава датчика.

  • Чтобы добавить дороги, используйте функцию road. Чтобы задать маршруты на дорогах, создайте объект lanespec.

  • Добавить агентов (автомобили, пешеходы, велосипеды, и так далее), используют функцию actor. Чтобы добавить агентов со свойствами, специально разработанными для автомобилей, используйте функцию vehicle. Все агенты, включая автомобили, моделируются как кубоиды (формы поля).

  • Чтобы моделировать сценарий, вызовите функцию advance в цикле, который совершенствует симуляцию один временной шаг за один раз.

Можно также создать ведущие сценарии в интерактивном режиме при помощи приложения Driving Scenario Designer.

Создание

Синтаксис

sc = drivingScenario
sc = drivingScenario(Name,Value)

Описание

пример

sc = drivingScenario создает пустой ведущий сценарий.

пример

sc = drivingScenario(Name,Value) устанавливает свойства SampleTime и StopTime с помощью пар "имя-значение". Например, drivingScenario('SampleTime',0.1','StopTime',10) выбирает сценарий каждую 0.1 секунды в течение 10 секунд. Заключите каждое имя свойства в кавычки.

Свойства

развернуть все

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

Пример: 1.5

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

Пример: 60.0

Это свойство доступно только для чтения.

Текущее время симуляции, заданной как положительный действительный скаляр. Чтобы сбросить время, чтобы обнулить, вызовите функцию restart. Модули находятся в секундах.

Это свойство доступно только для чтения.

Состояние симуляции, заданное как true или false. Если симуляция запускается, IsRunning является true.

Это свойство доступно только для чтения.

Агенты и автомобили содержатся в сценарии, заданном как разнородный массив объектов Vehicle и Actor. Чтобы добавить агентов и автомобили к ведущему сценарию, используйте функции vehicle и actor.

Функции объекта

развернуть все

advanceУсовершенствуйте ведущую симуляцию сценария одним временным шагом
plotСоздайте ведущий график сценария
recordЗапустите ведущий сценарий и запишите состояния агента
restartПерезапустите ведущую симуляцию сценария с начала
updatePlotsОбновите ведущие графики сценария
actorДобавьте агента в ведущий сценарий
actorPosesПоложения, скорости и ориентации агентов в ведущем сценарии
actorProfilesФизический и радарные характеристики агентов в ведущем сценарии
vehicleДобавьте автомобиль в ведущий сценарий
chasePlotЭгоцентрический проективный перспективный график
trajectoryСоздайте агента или траекторию автомобиля в ведущем сценарии
targetPosesЦелевые положения и ориентации относительно автомобиля, оборудованного датчиком
targetOutlinesОсновы целей просматриваются агентом
driving.scenario.targetsToEgoПреобразуйте положения агента в координаты автомобиля, оборудованного датчиком
roadАдд-Роуд к ведущему сценарию
roadNetworkДобавьте дорожную сеть в ведущий сценарий
roadBoundariesПолучите дорожные контуры
driving.scenario.roadBoundariesToEgoПреобразуйте дорожные контуры в координаты автомобиля, оборудованного датчиком
currentLaneПолучите текущий маршрут агента
lanespecСоздайте дорожные спецификации маршрута
laneMarkingСоздайте дорожный объект маркировки маршрута
laneMarkingVerticesВершины маркировки маршрута и поверхности в ведущем сценарии
laneBoundariesПолучите контуры маршрута маршрута агента
clothoidLaneBoundaryМодель контура маршрута, имеющая форму клотоиды
computeBoundaryModelВычислите граничные точки маршрута из модели контура маршрута клотоиды

Примеры

свернуть все

Создайте ведущий сценарий, содержащий кривую дорогу, две дороги подряд и двух агентов: автомобиль и велосипед. Оба агента проходят дорога в течение 60 секунд.

Создайте ведущий объект сценария.

sc = drivingScenario('SampleTime',0.1','StopTime',60);

Создайте кривую дорогу с помощью дорожных центральных точек после дуги круга с 800-метровым радиусом. Дуга запускается на уровне 0 °, заканчивается на уровне 90 ° и выбирается в шаге на 5 °.

angs = [0:5:90]';
R = 800;
roadcenters = R*[cosd(angs) sind(angs) zeros(size(angs))];
roadwidth = 10;
road(sc,roadcenters,roadwidth);

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

roadcenters = [700 0 0; 100 0 0];
road(sc,roadcenters)
roadcenters = [400 400 0; 0 0 0];
road(sc,roadcenters)

Получите дорожные контуры.

rbdry = roadBoundaries(sc);

Добавьте автомобиль и велосипед к сценарию. Расположите автомобиль в начале первой дороги подряд.

car = vehicle(sc,'Position',[700 0 0],'Length',3,'Width',2,'Height',1.6);

Расположите велосипед дальше в будущем.

bicycle = actor(sc,'Position',[706 376 0]','Length',2,'Width',0.45,'Height',1.5);

Постройте сценарий.

plot(sc,'Centerline','on','RoadCenters','on');
title('Scenario');

Отобразите положения агента и профили.

poses = actorPoses(sc)
poses = 2x1 struct array with fields:
    ActorID
    Position
    Velocity
    Roll
    Pitch
    Yaw
    AngularVelocity

profiles = actorProfiles(sc)
profiles = 2x1 struct array with fields:
    ActorID
    ClassID
    Length
    Width
    Height
    OriginOffset
    RCSPattern
    RCSAzimuthAngles
    RCSElevationAngles

Создайте ведущий сценарий и покажите, как целевые основы изменяются, когда симуляция совершенствуется.

Создайте ведущий сценарий, состоящий из двух пересекающихся прямых дорог. Первый дорожный сегмент 45 метров длиной. Вторая дорога подряд 32 метра длиной и пересекает первую дорогу. Автомобиль, перемещающийся на уровне 12,0 метров в секунду вдоль первой дороги, приближается к рабочему пешеходному переходу пересечение на уровне 2,0 метров в секунду.

sc = drivingScenario('SampleTime',0.1,'StopTime',1);
road(sc,[-10 0 0; 45 -20 0]);
road(sc,[-10 -10 0; 35 10 0]);
ped = actor(sc,'Length',0.4,'Width',0.6,'Height',1.7);
car = vehicle(sc);
pedspeed = 2.0;
carspeed = 12.0;
trajectory(ped,[15 -3 0; 15 3 0],pedspeed);
trajectory(car,[-10 -10 0; 35 10 0],carspeed);

Создайте эгоцентрический график преследования для автомобиля.

chasePlot(car,'Centerline','on')

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

  • Обновите график преследования отобразить дорожные контуры и целевые основы.

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

bepPlot = birdsEyePlot('XLim',[-50 50],'YLim',[-40 40]);
outlineplotter = outlinePlotter(bepPlot);
laneplotter = laneBoundaryPlotter(bepPlot);
legend('off')

while advance(sc)
    rb = roadBoundaries(car);
    [position,yaw,length,width,originOffset,color] = targetOutlines(car);    
    plotLaneBoundary(laneplotter,rb)
    plotOutline(outlineplotter,position,yaw,length,width, ...
        'OriginOffset',originOffset,'Color',color)
    pause(0.01)
end

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

sc = drivingScenario;

Создайте трехполосную дорогу при помощи спецификаций маршрута.

roadCenters = [0 0 0; 60 0 0; 120 30 0];
lspc = lanespec(3);
road(sc,roadCenters,'Lanes',lspc);

Укажите, что автомобиль, оборудованный датчиком следует за центральным маршрутом на уровне 30 м/с.

egovehicle = vehicle(sc);
egopath = [1.5 0 0; 60 0 0; 111 25 0];
egospeed = 30;
trajectory(egovehicle,egopath,egospeed);

Укажите, что целевые перемещения автомобиля перед автомобилем, оборудованным датчиком на уровне 40 м/с и перестраиваются на другую полосу близко к автомобилю, оборудованному датчиком.

targetcar = vehicle(sc,'ClassID',2);
targetpath = [8 2; 60 -3.2; 120 33];
targetspeed = 40;
trajectory(targetcar,targetpath,targetspeed);

Отобразите график преследования для 3-D представления сценария из-за автомобиля, оборудованного датчиком.

chasePlot(egovehicle)

Создайте генератор обнаружения видения, который обнаруживает маршруты и объекты. Подача датчика указывает одну степень вниз.

visionSensor = visionDetectionGenerator('Pitch',1.0);
visionSensor.DetectorOutput = 'Lanes and objects';
visionSensor.ActorProfiles = actorProfiles(sc);

Запустите симуляцию.

  1. Создайте видимый с большого расстояния график и связанные плоттеры.

  2. Отобразите зону охвата датчика.

  3. Отобразите маркировки маршрута.

  4. Получите наземные положения истины целей на дороге.

  5. Получите идеальные граничные точки маршрута до 60 м вперед.

  6. Сгенерируйте обнаружения от идеальных целевых положений и контуров маршрута.

  7. Отобразите схему цели.

  8. Обнаружения экранного объекта, когда обнаружение объектов допустимо.

  9. Отобразите контур маршрута, когда обнаружение маршрута будет допустимо.

bep = birdsEyePlot('XLim',[0 60],'YLim',[-35 35]);
caPlotter = coverageAreaPlotter(bep,'DisplayName','Coverage area', ...
    'FaceColor','blue');
detPlotter = detectionPlotter(bep,'DisplayName','Object detections');
lmPlotter = laneMarkingPlotter(bep,'DisplayName','Lane markings');
lbPlotter = laneBoundaryPlotter(bep,'DisplayName', ...
    'Lane boundary detections','Color','red');
olPlotter = outlinePlotter(bep);
plotCoverageArea(caPlotter,visionSensor.SensorLocation,...
    visionSensor.MaxRange,visionSensor.Yaw, ...
    visionSensor.FieldOfView(1));
while advance(sc)
    [lmv,lmf] = laneMarkingVertices(egovehicle);
    plotLaneMarking(lmPlotter,lmv,lmf)
    tgtpose = targetPoses(egovehicle);
    lookaheadDistance = 0:0.5:60;
    lb = laneBoundaries(egovehicle,'XDistance',lookaheadDistance,'LocationType','inner');
    [obdets,nobdets,obValid,lb_dets,nlb_dets,lbValid] = ...
        visionSensor(tgtpose,lb,sc.SimulationTime);
    [objposition,objyaw,objlength,objwidth,objoriginOffset,color] = targetOutlines(egovehicle);
    plotOutline(olPlotter,objposition,objyaw,objlength,objwidth, ...
        'OriginOffset',objoriginOffset,'Color',color)
    if obValid
        detPos = cellfun(@(d)d.Measurement(1:2),obdets,'UniformOutput',false);
        detPos = vertcat(zeros(0,2),cell2mat(detPos')');
        plotDetection(detPlotter,detPos)
    end
    if lbValid
        plotLaneBoundary(lbPlotter,vertcat(lb_dets.LaneBoundaries))
    end
end

Алгоритмы

развернуть все

Введенный в R2017a