exponenta event banner

дорога

Добавить дорогу к сценарию вождения или группе дорог

Описание

Добавить дороги к сценарию вождения

пример

road(scenario,roadcenters) добавляет дорогу к сценарию вождения, scenario. Форма дороги и ориентация дороги в плоскости 2-D определяются с помощью набора центров дорог. roadcenters, в дискретных точках. При указании количества полос на дороге полосы нумеруются относительно центров дорог. Дополнительные сведения см. в разделе Направление дороги и нумерация полос движения.

road(scenario,roadcenters,roadwidth) добавляет дорогу указанной ширины, roadwidth.

пример

road(scenario,roadcenters,roadwidth,bankingangle) добавляет дорогу с заданной шириной и углом поворота, bankingangle.

пример

road(scenario,roadcenters,'Lanes',lspec) добавляет дорогу с указанными полосами движения, lspec.

road(scenario,roadcenters,bankingangle,'Lanes',lspec) добавляет дорогу с указанным банковским углом и полосами движения.

road(___,'Name',name) задает имя дороги, используя любую из комбинаций входных аргументов из предыдущих синтаксисов.

rd = road(___) возвращает Road объект, в котором хранятся свойства созданной дороги.

Добавление дорог в группу дорог

пример

road(rg,roadcenters) добавление сегмента дороги в группу дорог, rg. Группа дорог используется для создания развязки или перекрестка дороги. Форма и ориентация сегмента дороги в плоскости 2-D определяются с помощью набора центров дорог. roadcenters, в дискретных точках. При указании количества полос на сегменте дороги полосы нумеруются относительно центров дорог. Дополнительные сведения см. в разделе Направление дороги и нумерация полос движения.

пример

road(rg,roadcenters,roadwidth) добавляет сегмент дороги указанной ширины, roadwidth, в дорожную группу.

road(rg,roadcenters,roadwidth,bankingangle) добавляет сегмент дороги с заданной шириной и углом поворота, bankingangle, в дорожную группу.

пример

road(rg,roadcenters,'Lanes',lspec) добавление сегмента дороги с указанными полосами; lspec, в дорожную группу.

пример

road(rg,roadcenters,bankingangle,'Lanes',lspec) добавляет сегмент дороги с указанным банковским углом и полосами в группу дорог.

пример

road(___,'Name',name) задает имя сегмента дороги с использованием любой комбинации входных аргументов из предыдущих синтаксисов.

Примеры

свернуть все

Создайте сценарий вождения, содержащий кривую дорогу, две прямые дороги и двух актеров: автомобиль и велосипед. Оба актёра двигаются по дороге в течение 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

Создайте сценарий движения, содержащий фигуру 8, указанную в мировых координатах сценария. Преобразование мировых координат сценария в систему координат эго-транспортного средства.

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

scenario = drivingScenario;

Добавьте фигуру-8 к сценарию. Просмотрите сценарий.

roadCenters = [0  0  1
             20 -20  1
             20  20  1
            -20 -20  1
            -20  20  1
              0   0  1];

roadWidth = 3;
bankAngle = [0 15 15 -15 -15 0];
road(scenario,roadCenters,roadWidth,bankAngle);
plot(scenario)

Figure contains an axes. The axes contains 4 objects of type patch, line.

Добавьте ego-транспортное средство к сценарию. Расположите транспортное средство в точке с мировыми координатами (20, -20) и сориентируйте его под углом рыскания -15 градусов.

ego = actor(scenario,'ClassID',1,'Position',[20 -20 0],'Yaw',-15);

Figure contains an axes. The axes contains 5 objects of type patch, line.

Получение границ дорог в координатах эго-транспортного средства с помощью roadBoundaries функция. Укажите средство ego в качестве входного аргумента.

rbEgo1 = roadBoundaries(ego);

Отображение результата на графике птичьего глаза.

bep = birdsEyePlot;
lbp = laneBoundaryPlotter(bep,'DisplayName','Road');
plotLaneBoundary(lbp,rbEgo1)

Figure contains an axes. The axes contains an object of type line. This object represents Road.

Получение границ дорог в мировых координатах с помощью roadBoundaries функция. Укажите сценарий в качестве входного аргумента.

rbScenario = roadBoundaries(scenario);

Получение границ дорог в координатах эго-транспортного средства с помощью driving.scenario.roadBoundariesToEgo функция.

rbEgo2 = driving.scenario.roadBoundariesToEgo(rbScenario,ego);

Отображение границ дороги на графике птичьего полета.

bep = birdsEyePlot;
lbp = laneBoundaryPlotter(bep,'DisplayName','Road boundaries');
plotLaneBoundary(lbp,{rbEgo2})

Figure contains an axes. The axes contains an object of type line. This object represents Road boundaries.

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

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

scenario = drivingScenario;

Создайте прямой 25-метровый сегмент дороги с двумя полосами движения в одном направлении.

lm = [laneMarking('Solid')
      laneMarking('Dashed','Length',2,'Space',4)
      laneMarking('Solid')];
l = lanespec(2,'Marking',lm);
road(scenario,[0 0 0; 25 0 0],'Lanes',l);

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

ped = actor(scenario,'ClassID',4,'Length',0.2,'Width',0.4,'Height',1.7);
car = vehicle(scenario,'ClassID',1);
smoothTrajectory(ped,[15 -3 0; 15 3 0],1);
smoothTrajectory(car,[car.RearOverhang 0 0; 25-car.Length+car.RearOverhang 0 0],10);

Просмотрите сценарий и соответствующий график погони.

plot(scenario)

chasePlot(car)

Запустите моделирование.

  1. Создайте график птичьего глаза.

  2. Создайте плоттер контура, плоттер границ полосы движения и плоттер разметки полосы движения для графика «птичий глаз».

  3. Получение границ дорог и целевых контуров.

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

  5. Отображение границ полосы движения и маркеров полосы движения.

  6. Запустите цикл моделирования.

bep = birdsEyePlot('XLim',[-25 25],'YLim',[-10 10]);
olPlotter = outlinePlotter(bep);
lbPlotter = laneBoundaryPlotter(bep);
lmPlotter = laneMarkingPlotter(bep,'DisplayName','Lanes');
legend('off');
while advance(scenario)
    rb = roadBoundaries(car);
    [position,yaw,length,width,originOffset,color] = targetOutlines(car);
    [lmv,lmf] = laneMarkingVertices(car);
    plotLaneBoundary(lbPlotter,rb);
    plotLaneMarking(lmPlotter,lmv,lmf);
    plotOutline(olPlotter,position,yaw,length,width, ...
        'OriginOffset',originOffset,'Color',color);
end

Трёхсторонний перекрёсток - это Y-перекрёсток, в котором две смежные дороги пересекают третью дорогу под тупым углом, как показано на этом рисунке. Для соединения трех дорог необходимо создать Y-развязку путем добавления трех сегментов дороги.

Добавить три дороги к сценарию вождения

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

scenario = drivingScenario;

Укажите количество полос и ширину каждой полосы на дорогах.

ls = lanespec(2,'Width',5);

Определите центры дорог для трех дорог и добавьте их в сценарий вождения. Первая дорога диагонально ориентирована влево от сценарного полотна, вторая дорога диагонально ориентирована вправо от сценарного полотна, а третья дорога ориентирована вертикально.

% Add the first road
roadCenters = [-20 0; 6 0];
road(scenario,roadCenters,'Name','Road 1','Lanes',ls);

% Add the second road
roadCenters = [23 7; 50 33];
road(scenario,roadCenters,'Name','Road 2','Lanes',ls);

% Add the third road
roadCenters = [23 -7; 50 -33];
road(scenario,roadCenters,'Name','Road 3','Lanes',ls);

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

figure
plot(scenario)

Figure contains an axes. The axes contains 5 objects of type patch, line.

Создание Y-образной развязки для соединения дорог

Создать RoadGroup объект. Задайте ширину для каждого сегмента дороги, образующего Y-образное соединение.

rg = driving.scenario.RoadGroup('Name','Y-Junction');
roadWidth = 10;

Укажите центры дорог для трех сегментов дороги и добавьте эти сегменты дороги в RoadGroup с помощью road функция. Эти сегменты дороги пересекаются друг с другом.

% Add the first road segment
roadCenters = [23 7; 14 1; 6 0];
road(rg,roadCenters,roadWidth,'Name','Segment 1');

% Add the second road segment
roadCenters = [23 -7; 14 -1; 6 0];
road(rg,roadCenters,roadWidth,'Name','Segment 2');

% Add the third road segment
roadCenters = [23 7; 21 4; 21 -4; 23 -7];
road(rg,roadCenters,roadWidth,'Name','Segment 3');

Добавить Y-образное соединение в сценарий управления

Добавление сегментов дороги, хранящихся в RoadGroup объект к управляющему сценарию с помощью roadGroup функция. Сегменты дороги образуют Y-образную развязку, которая соединяет три дороги в сценарии вождения.

roadGroup(scenario,rg);

Figure contains an axes. The axes contains 3 objects of type patch, line.

Входные аргументы

свернуть все

Сценарий управления, указанный как drivingScenario объект.

Группа дорог, определяющая развязку или перекресток дороги, заданная как RoadGroup объект.

Центры дорог, используемые для определения дороги, задаются как вещественные N-by-2 или матрица N-by-3. Центры дорог определяют центральную линию дороги в дискретных точках.

  • Если roadcenters является N-by-2 матрицей, то каждая строка матрицы представляет координаты (x, y) центра дороги. Координата Z каждого центра дороги равна нулю.

  • Если roadcenters является N-by-3 матрицей, то каждая строка матрицы представляет координаты (x, y, z) центра дороги.

Если первая строка матрицы совпадает с последней строкой, то дорога представляет собой цикл. Единицы в метрах.

Типы данных: double

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

Чтобы указать bankingangle входные данные, но не roadwidth, указать roadwidth как пустой аргумент, [].

При указании roadwidth, то вы не можете указать lspec вход.

Типы данных: double

Банковский угол дороги, определяемый как действительный вектор N-by-1. N - количество дорожных центров. Угол качения - угол крена дороги вдоль направления дороги. Единицы измерения в градусах.

Спецификация полосы движения, указанная как lanespec или compositeLaneSpec объект. Использовать lanespec объект для создания дороги с одной спецификацией полосы движения. Можно указать количество полос движения, ширину каждой полосы движения и тип разметки полосы движения с помощью команды lanespec объект. Задание разметки полосы движения в пределах lanespec, используйте laneMarking функция.

Использовать compositeLaneSpec объект для создания дороги с несколькими сегментами дороги с различными спецификациями полосы движения. Дополнительные сведения см. в разделе compositeLaneSpec.

При указании lspec, то вы не можете указать roadwidth вход.

Пример: 'Lanes',lanespec(3) определяет трехполосную дорогу с шириной полосы по умолчанию и разметкой полосы.

Имя дороги, указанное как вектор символа или скаляр строки.

Пример: 'Name','Road1'

Пример: "Name","Road1"

Типы данных: char | string

Выходные аргументы

свернуть все

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

СобственностьСтоимость
Name

Имя дороги, указанное как строковый скаляр

name входной аргумент задает это свойство. Даже если указать name в качестве символьного вектора, Name значение свойства является строковым скаляром.

RoadID

Идентификатор дороги, указанный как положительное целое число

scenario входной аргумент генерирует уникальный идентификатор для каждой дороги в сценарии вождения.

RoadCenters

Дорожные центры, используемые для определения дороги, определяемой как вещественно-значимая N-by-2 или матрица N-by-3, где N - количество дорожных центров

roadcenters входной аргумент задает это свойство.

RoadWidth

Ширина дороги, заданная как положительный действительный скаляр

roadwidth входной аргумент задает это свойство.

BankAngle

Банковский угол дороги, заданный как N-by-1 действительный вектор, где N - количество дорожных центров в дороге

bankingangle входной аргумент задает это свойство.

Подробнее

свернуть все

Рисование направления дороги и нумерация полос движения

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

Чтобы создать дорогу с помощью приложения «Конструктор сценариев вождения», можно либо указать параметр «Центры дорог», либо в интерактивном режиме нарисовать на холсте сценария. Подробный пример см. в разделе Создание сценария управления. В этом случае направление прорисовки - это направление, в котором тонируются дороги в холсте «Сценарий».

  • Для дороги с направлением прорисовки сверху вниз разница между координатами X первых двух последовательных центров дороги является положительной.

  • Для дороги с направлением прорисовки снизу вверх разница между координатами X первых двух последовательных центров дороги отрицательна.

Road with top-to-bottom draw direction

Road with bottom-to-top draw direction

  • Для дороги с направлением прорисовки слева направо разница между координатами y первых двух последовательных центров дороги является положительной.

  • Для дороги с направлением прорисовки справа налево разница между координатами y первых двух последовательных центров дороги отрицательна.

Road with left-to-right draw direction

Road with right-to-left draw direction

Нумерация полос

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

Например, на этих диаграммах показано, как полосы пронумерованы на дороге с односторонним и двусторонним движением с направлением вытягивания сверху вниз.

Нумерация полос в дороге с односторонним движениемНумерация полос движения в двухсторонней дороге

Укажите количество полос движения как положительное целое число для дороги с односторонним движением. Если целочисленное значение задано как 3, то дорога имеет три полосы, которые едут в одном направлении. Полосы пронумерованы начиная с левого края дороги.

1, 2, 3 обозначают первую, вторую и третью полосы дороги соответственно.

Lane numbers in one-way road

Укажите количество полос движения в виде двухэлементного вектора положительного целого числа для дороги с двусторонним движением. Если установить вектор как [1 2], то дорога имеет три полосы: две полосы движения в одном направлении и одна полоса движения в противоположном направлении. Из-за направления розыгрыша дорога имеет одну левую полосу и две правые полосы. Полосы пронумерованы начиная с левого края дороги.

1L обозначают единственную левую полосу дороги. 1R и 2R обозначают первую и вторую правую полосы дороги соответственно.

Lane numbers in two-way road

Спецификации полос применяются в порядке нумерации полос.

Алгоритмы

road функция создает дорогу для актера, которому необходимо следовать в сценарии вождения. Дорога задается с помощью N двумерных или трехмерных ППМ. Каждый из N-1 сегментов между ППМ определяет кривую, кривизна которой изменяется линейно с расстоянием вдоль сегмента. Функция соответствует кусочно-клотоидной кривой координатам (x, y) ППМ путем сопоставления кривизны с обеих сторон ППМ. Для незамкнутой кривой кривизна в первой и последней ППМ равна нулю. Если первая и последняя ППМ совпадают, кривизны до и после конечных точек совпадают. Координаты Z дороги интерполируются с использованием сохраняющей форму кусочно-кубической кривой.

Представлен в R2017a