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