В этом примере показано, как создать множество пересечений дорог с функциями 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; 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; % 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)