road

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

Описание

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

пример

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.

Добавьте автомобиля , оборудованного датчиком к сценарию. Поместите транспортное средство в мировые координаты (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 функция. Задайте автомобиль , оборудованный датчиком как входной параметр.

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 - количество дорожных центров. banking angle - угол крена дороги по направлению дороги. Модули указаны в степенях.

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

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

Если вы задаете lspec, тогда вы не можете задать roadwidth вход.

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

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

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

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

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

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

свернуть все

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

СвойствоЗначение
Name

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

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

RoadID

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

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

RoadCenters

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

The roadcenters входной параметр устанавливает это свойство.

RoadWidth

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

The roadwidth входной параметр устанавливает это свойство.

BankAngle

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

The bankingangle входной параметр устанавливает это свойство.

Подробнее о

свернуть все

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

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

Чтобы создать дорогу при помощи приложения Driving Scenario Designer, можно либо задать параметр Road Centers, либо в интерактивном режиме нарисовать на Scenario Canvas. Подробный пример см. в разделе Создание сценария вождения. В этом случае направление рисования является направлением, в котором дороги визуализируются в Scenario Canvas.

  • Для дороги с направлением ничьей от начала до конца разница между 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 сегментов между путевыми точками задает кривую, кривизна которой изменяется линейно с расстоянием вдоль сегмента. Функция подбирает кусочно- clothoid кривую к (x, y) координатам путевых точек путем соответствия кривизны с обеих сторон путевой точки. Для некрылой кривой кривизна в первой и последней путевой точке равна нулю. Если первая и последняя точки пути совпадают, то кривизны до и после конечных точек совпадают. z -кординаты дороги интерполируются с помощью кусочно-кубической кривой, сохраняющей форму .

Введенный в R2017a