В этом примере показано, как программно создать множество пересечений дорог с функциями 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');
Как альтернатива определению дорожных ширин, можно задать маршруты путем обеспечения спецификации маршрута. Вот пример определения дороги с одной полосой слева и два справа.
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)