exponenta event banner

drivingScenario

Создание сценария управления

Описание

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

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

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

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

Кроме того, можно создавать сценарии управления в интерактивном режиме с помощью приложения Конструктор сценариев управления. 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 значение.

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

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

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

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

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

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