drivingScenario

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

Описание

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

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

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

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

Можно также создавать сценарии вождения в интерактивном режиме при помощи Driving Scenario Designer приложения. В сложение можно экспортировать drivingScenario объекты из приложения для создания изменений сценария для использования либо в приложении, либо в Simulink®. Для получения дополнительной информации смотрите Создание изменений сценария программно.

Создание

Описание

пример

scenario = drivingScenario создает пустой сценарий вождения.

пример

scenario = drivingScenario(Name,Value) устанавливает SampleTime, StopTime, и GeoReference свойства с использованием пар "имя-значение". Для примера, drivingScenario('GeoReference',[42.3 -71.0 0]) устанавливает географический источник сцены в координату широта-долгота (42,3, -71,0) и высоту 0.

Свойства

расширить все

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

Пример: 1.5

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

Пример: 60.0

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

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

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

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

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

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

Барьеры, содержащиеся в сценарии, заданные как разнородный массив Barrier объекты. Чтобы добавить барьеры к сценарию вождения, используйте barrier функция.

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

Географические координаты источника дорожной сети, заданные в виде трехэлементного числового вектора-строки вида [lat, lon, alt], где:

  • lat - широта координат в степенях.

  • lon - долгота координат в степенях.

  • alt - высота координат в метрах.

Эти значения относятся к WGS84 эталонному эллипсоиду, который является стандартным эллипсоидом, используемым данными GPS.

Можно задать GeoReference при создании сценария вождения. roadNetwork функция также устанавливает это свойство при импорте дорог в пустой сценарий вождения.

  • Если вы импортируете дороги, задавая координаты, то roadNetwork наборы функций GeoReference к первой (или только) указанной координате.

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

roadNetwork функция переопределяет любой ранее установленный GeoReference значение.

В приложении Driving Scenario Designer, когда вы импортируете данные карты и экспортируете drivingScenario объект, GeoReference свойство этого объекта устанавливается на географическую ссылку сценария приложения.

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

Если ваш сценарий вождения не использует географические координаты, то GeoReference - пустой массив, [].

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

расширить все

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

Примеры

свернуть все

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

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

scenario = 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(scenario,roadcenters,roadwidth);

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

roadcenters = [700 0 0; 100 0 0];
road(scenario,roadcenters)
ans = 
  Road with properties:

           Name: ""
         RoadID: 2
    RoadCenters: [2x3 double]
      RoadWidth: 6
      BankAngle: [2x1 double]

roadcenters = [400 400 0; 0 0 0];
road(scenario,roadcenters)
ans = 
  Road with properties:

           Name: ""
         RoadID: 3
    RoadCenters: [2x3 double]
      RoadWidth: 6
      BankAngle: [2x1 double]

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

rbdry = roadBoundaries(scenario);

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

car = vehicle(scenario,'ClassID',1,'Position',[700 0 0], ...
    'Length',3,'Width',2,'Height',1.6);

Расположите велосипед дальше по дороге.

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

Постройте график сценария.

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

Figure contains an axes. The axes with title Scenario contains 1219 objects of type patch, line.

Отображение положений и профилей актёра.

poses = actorPoses(scenario)
poses=2×1 struct array with fields:
    ActorID
    Position
    Velocity
    Roll
    Pitch
    Yaw
    AngularVelocity

profiles = actorProfiles(scenario)
profiles=2×1 struct array with fields:
    ActorID
    ClassID
    Length
    Width
    Height
    OriginOffset
    MeshVertices
    MeshFaces
    RCSPattern
    RCSAzimuthAngles
    RCSElevationAngles

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

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

scenario = drivingScenario('SampleTime',0.1,'StopTime',1);
road1 = road(scenario,[-10 0 0; 45 -20 0]);
road2 = road(scenario,[-10 -10 0; 35 10 0]);
barrier(scenario,road1)
barrier(scenario,road1,'RoadEdge','left')
ped = actor(scenario,'ClassID',4,'Length',0.4,'Width',0.6,'Height',1.7);
car = vehicle(scenario,'ClassID',1);
pedspeed = 2.0;
carspeed = 12.0;
smoothTrajectory(ped,[15 -3 0; 15 3 0],pedspeed);
smoothTrajectory(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(scenario)
    rb = roadBoundaries(car);
    [position,yaw,length,width,originOffset,color] = targetOutlines(car);
    [bposition,byaw,blength,bwidth,boriginOffset,bcolor,barrierSegments] = targetOutlines(car,'Barriers');
    plotLaneBoundary(laneplotter,rb)
    plotOutline(outlineplotter,position,yaw,length,width, ...
        'OriginOffset',originOffset,'Color',color)
    plotBarrierOutline(outlineplotter,barrierSegments,bposition,byaw,blength,bwidth, ...
        'OriginOffset',boriginOffset,'Color',bcolor)
    pause(0.01)
end

Figure contains an axes. The axes is empty.

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

scenario = drivingScenario;

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

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

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

egovehicle = vehicle(scenario,'ClassID',1);
egopath = [1.5 0 0; 60 0 0; 111 25 0];
egospeed = 30;
smoothTrajectory(egovehicle,egopath,egospeed);

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

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

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

chasePlot(egovehicle)

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

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

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

  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(scenario)
    [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,scenario.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