Программно задайте размещения дорог

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

См. также

Приложения

Объекты

Функции

Похожие темы