В этом примере показано, как программно создавать различные автодорожные развязки с функциями автоматизированного вождения Toolbox™. Эти развязки можно объединить с другими развязками для создания сложных дорожных сетей. Можно просмотреть код для каждого графика и использовать его в собственном проекте.
Можно также создать развязки дорог в интерактивном режиме с помощью приложения «Конструктор сценариев вождения».
Дороги фиксированной ширины могут быть определены рядом точек, определяющих расположение центра дороги. Прямую дорогу очень просто описать, указав место ее начала и остановки. Вот пример дороги, которая начинается от (0,0) и заканчивается от (50,0) и имеет ширину 6 (метров).
scenario = drivingScenario; roadCenters = [0 0; 50 0]; roadWidth = 6; road(scenario, roadCenters, roadWidth); plot(scenario,'RoadCenters','on','Centerline','on');

В качестве альтернативы заданию ширины дороги можно задать полосы движения, предоставив спецификацию полосы движения. Вот пример указания дороги с одной полосой слева и двумя справа.
scenario = drivingScenario; roadCenters = [0 0; 50 0]; road(scenario, roadCenters, 'lanes', lanespec([1 2])); plot(scenario,'RoadCenters','on');

Пересечения создаются автоматически там, где встречаются две дороги. В этом примере мы добавим еще 50 м участок дороги.
roadCenters = [25 -25; 25 25];
road(scenario, roadCenters, 'lanes', lanespec([1 1]));

Криволинейные дороги могут быть описаны с использованием трех или более точек. Чем больше точек используется, тем сложнее создаваемая кривая. В этом примере кривая проходит через три точки:
scenario = drivingScenario; roadCenters = [0 0; 10 0; 53 -20]; roadWidth = 6; road(scenario, roadCenters, roadWidth,'lanes',lanespec(2)); plot(scenario,'RoadCenters','on');

При задании центров дорог между каждым сегментом помещается кусочно-клотоидная кривая, где кривизна сохраняется между точками. Клотоидные кривые широко используются при проектировании дорог, поскольку они имеют кривизну, которая изменяется линейно с расстоянием, пройденным вдоль дороги, что очень просто для водителей.
По умолчанию дороги, построенные по сценарию, не имеют кривизны в конечных точках. Чтобы создать дорожный контур, повторите первую и последнюю точки.
В этом примере показан круговой сегмент дороги шириной 4 м, ограниченный площадью 30 м. Добавление дорог, подаваемых на круговой перекресток, требует указания других прямых или криволинейных сегментов дороги
scenario = drivingScenario;
roadCenters = [-15 -15
15 -15
15 15
-15 15
-15 -15];
road(scenario, roadCenters, 'lanes', lanespec(1));
% Define roundabout exits with two lanes each
road(scenario, [-35 0; -20 0],'lanes', lanespec([1 1]));
road(scenario, [ 20 0; 35 0],'lanes', lanespec([1 1]));
road(scenario, [ 0 35; 0 20],'lanes', lanespec([1 1]));
road(scenario, [ 0 -20; 0 -35],'lanes', lanespec([1 1]));
plot(scenario,'RoadCenters','on');

В этом примере моделируется простая выходная полоса. Мы начинаем с простой прямой дороги, а затем перекрываем несколько точек другой дороги так, что она перекрывает исходную прямую дорогу:
scenario = drivingScenario; ls = lanespec(2); laneWidth = ls.Width(1); % add straight road segment road(scenario, [0 0 0; 50 0 0], 'lanes', lanespec(2)); % define waypoints of lane exit roadCenters = [3.0 -laneWidth/2 3.1 -laneWidth/2 15.0 -laneWidth 45.0 -20]; % add the exit lane road(scenario, roadCenters, laneWidth); plot(scenario,'RoadCenters','on')

Дороги могут дополнительно содержать информацию об отметках. Это может быть достигнуто путем включения третьего столбца в ППМ.
scenario = drivingScenario;
roadCenters = [ 0 0 0
25 0 3
50 0 0];
road(scenario, roadCenters, 'lanes', lanespec(2));
plot(scenario,'RoadCenters','on');
view(30,24);

Дороги могут пересекать друг друга без пересечения, если они имеют различную отметку. Дорожное покрытие путепровода обычно находится на высоте от 6 до 8 метров над дорогой.
scenario = drivingScenario;
roadCenters = [ 0 0 0
20 -20 0
20 20 8
-20 -20 8
-20 20 0
0 0 0];
road(scenario, roadCenters, 'lanes',lanespec([1 2]));
plot(scenario,'RoadCenters','on');
view(30,24)

Дороги могут быть обанкрочены; где углы банка могут быть определены для каждого ППМ. Ниже приведен овальный гоночный трек с закругленными кривыми 9 градусов.
scenario = drivingScenario; % transpose waypoints so they visually align with bank angles below roadCenters = ... [ 0 40 49 50 100 50 49 40 -40 -49 -50 -100 -50 -49 -40 0 -50 -50 -50 -50 0 50 50 50 50 50 50 0 -50 -50 -50 -50 0 0 .45 .45 .45 .45 .45 0 0 .45 .45 .45 .45 .45 0 0]'; bankAngles = ... [ 0 0 9 9 9 9 9 0 0 9 9 9 9 9 0 0]; road(scenario, roadCenters, bankAngles, 'lanes', lanespec(2)); plot(scenario,'RoadCenters','on'); view(-60,20)

Автомагистрали и скоростные автомагистрали обычно состоят из двух параллельных дорог, каждая из которых проходит в противоположном направлении. Экономической развязкой между шоссе и местной дорогой является алмазная развязка, которая обычно состоит из местного дорожного путепровода и четырех пандусов.
scenario = drivingScenario; % Highways road(scenario, [-200 -8 0; 200 -8 0], 'lanes',lanespec(3)); % north road(scenario, [ 200 8 0;-200 8 0], 'lanes',lanespec(3)); % south % Local Road road(scenario, [-0 -200 8; 0 200 8], 'lanes',lanespec([1 1])); % Access ramps rampNE = [ 3 -20 8; 10 -20 7.8; 126 -20 .2; 130 -20 0; 200 -13.5 0]; road(scenario, [ 1 1 1] .* rampNE, 'lanes',lanespec(1)); road(scenario, [ 1 -1 1] .* flipud(rampNE), 'lanes',lanespec(1)); road(scenario, [-1 -1 1] .* rampNE, 'lanes',lanespec(1)); road(scenario, [-1 1 1] .* flipud(rampNE), 'lanes',lanespec(1)); plot(scenario); view(-60,30)

Популярной развязкой между двумя автомагистралями является развязка из клеверлифа. Развязка с клиновидным листом состоит из четырех внутренних и четырех внешних пандусов.
Ограничение сценария вождения заключается в том, что дорожная информация удаляется вблизи дорожной развязки
scenario = drivingScenario; % Highways road(scenario, [-300 -8 0; 300 -8 0], 15); % north road(scenario, [-300 8 0; 300 8 0], 15); % south road(scenario, [-8 -300 8; -8 300 8], 15); % east road(scenario, [ 8 -300 8; 8 300 8], 15); % west % Inner ramps rampNE = [0 -18 0; 20 -18 0; 120 -120 4; 18 -20 8; 18 0 8]; rampNW = [ 1 -1 1] .* rampNE(end:-1:1,:); rampSW = [-1 -1 1] .* rampNE; rampSE = [ 1 -1 1] .* rampSW(end:-1:1,:); innerRamps = [rampNE(1:end-1,:) rampNW(1:end-1,:) rampSW(1:end-1,:) rampSE]; road(scenario, innerRamps, 5.4); % Outer ramps roadCenters = [13.5 -300 8; 15 -260 8; 125 -125 4; 260 -15 0; 300 -13.5 0]; road(scenario, [ 1 1 1] .* roadCenters, 5.4); road(scenario, [ 1 -1 1] .* roadCenters, 5.4); road(scenario, [-1 -1 1] .* roadCenters, 5.4); road(scenario, [-1 1 1] .* roadCenters, 5.4); plot(scenario,'RoadCenters','on'); view(-60,30);

В этом примере показано, как с помощью drivingScenario объект. Сведения о добавлении актёров и траекторий к этим дорогам с помощью функций автоматизированного набора инструментов вождения см. в разделе Программное создание траекторий актёров и транспортных средств. Кроме того, можно добавить актеров и траектории в интерактивном режиме, загрузив drivingScenario объект в приложении «Конструктор сценариев управления»:
drivingScenarioDesigner(scenario)