Размещения Дефайн-Роуд программно

В этом примере показано, как программно создать множество пересечений дорог с функциями Automated Driving Toolbox™. Можно объединить эти перекрестки с другими соединениями, чтобы создать сложные дорожные сети. Можно просмотреть код для каждого графика и использовать его в собственном проекте.

В качестве альтернативы можно создать пересечения дорог в интерактивном режиме при помощи приложения Driving Scenario Designer.

Прямые дороги

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

scenario = drivingScenario;

roadCenters = [0 0; 50 0];
roadWidth = 6;

road(scenario, roadCenters, roadWidth);
plot(scenario,'RoadCenters','on','Centerline','on');

Дороги Laned

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

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; 50 0];

% Define an array of lane specifications for two one-way road segments.
% Notice that one lane drops in the second road segment.
lsArray = [lanespec(3) lanespec(2)];

% Define a road segment connector object. Specify position to drop a lane
% and taper length.
lc = laneSpecConnector('Position','Left','TaperLength',30);

% Combine lane specifications of road segments.
clspec = compositeLaneSpec(lsArray,'Connector',lc);

road(scenario,roadCenters,'lanes',clspec);
plot(scenario,'RoadCenters','on');

Кривые дороги

Кривые дороги могут быть описаны при помощи трех или больше точек. Чем больше точек вы используете, тем более комплексный кривая можно создать. В этом примере у нас есть кривая, проходящая через три точки:

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')

Добавление вертикального изменения

Дороги могут опционально иметь информацию о вертикальном изменении. Это может быть выполнено включением третьего столбца в waypoints.

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)

Дорожное банковское дело

Дороги могут быть окружены валом, где углы крена могут быть заданы для каждого waypoint. Следующее является овальной трассой с окруженными валом кривыми 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;

% Add a long loop road segment
roadCenters = [2023 2362; -2504 -2141; -2036 -2634; 2444 1870; 2023 2362];

% Specify the heading angles as a constraint to the road center points
slope = roadCenters(2,:) - roadCenters(1,:);
hdAngl = atand(slope(2)/slope(1));
roadHeadings = [hdAngl+180; hdAngl+180; hdAngl; hdAngl; hdAngl+180];

% Add the heading angles into the driving scenario
road(scenario,roadCenters,'Heading',roadHeadings);

plot(scenario,'RoadCenters','on')

Ромбовидный обмен

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

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 объект. Чтобы добавить агентов и траектории к этим дорогам с помощью функций Automated Driving Toolbox, смотрите, Создают Траектории Агента и Транспортного средства Программно. В качестве альтернативы можно добавить агентов и траектории в интерактивном режиме путем загрузки drivingScenario объект в приложение Driving Scenario Designer:

drivingScenarioDesigner(scenario)

Смотрите также

Приложения

Объекты

Функции

Похожие темы