ПДД РФ, 13. Проезд перекрестков \ КонсультантПлюс
ПДД РФ, 13. Проезд перекрестков
13.1. При повороте направо или налево водитель обязан уступить дорогу пешеходам, лицам, использующим для передвижения средства индивидуальной мобильности, и велосипедистам, пересекающим проезжую часть дороги, на которую он поворачивает.
(в ред. Постановлений Правительства РФ от 22.03.2014 N 221, от 06.10.2022 N 1769)
(см. текст в предыдущей редакции)
13.2. Запрещается выезжать на перекресток, пересечение проезжих частей или участка перекрестка, обозначенного разметкой 1.26, если впереди по пути следования образовался затор, который вынудит водителя остановиться, создав препятствие для движения транспортных средств в поперечном направлении, за исключением поворота направо или налево в случаях, установленных настоящими Правилами.
(п. 13.2 в ред. Постановления Правительства РФ от 20.10.2017 N 1276)
(см. текст в предыдущей редакции)
13.3. Перекресток, где очередность движения определяется сигналами светофора или регулировщика, считается регулируемым.
При желтом мигающем сигнале, неработающих светофорах или отсутствии регулировщика перекресток считается нерегулируемым, и водители обязаны руководствоваться правилами проезда нерегулируемых перекрестков и установленными на перекрестке знаками приоритета.
Регулируемые перекрестки
13.4. При повороте налево или развороте по зеленому сигналу светофора водитель безрельсового транспортного средства обязан уступить дорогу транспортным средствам, движущимся со встречного направления прямо или направо. Таким же правилом должны руководствоваться между собой водители трамваев.
(в ред. Постановления Правительства РФ от 28.03.2012 N 254)
(см. текст в предыдущей редакции)
13.5. При движении в направлении стрелки, включенной в дополнительной секции одновременно с желтым или красным сигналом светофора, водитель обязан уступить дорогу транспортным средствам, движущимся с других направлений.
13.6. Если сигналы светофора или регулировщика разрешают движение одновременно трамваю и безрельсовым транспортным средствам, то трамвай имеет преимущество независимо от направления его движения. Однако при движении в направлении стрелки, включенной в дополнительной секции одновременно с красным или желтым сигналом светофора, трамвай должен уступить дорогу транспортным средствам, движущимся с других направлений.
13.7. Водитель, въехавший на перекресток при разрешающем сигнале светофора, должен выехать в намеченном направлении независимо от сигналов светофора на выходе с перекрестка. Однако, если на перекрестке перед светофорами, расположенными на пути следования водителя, имеются стоп-линии (знаки 6.16), водитель обязан руководствоваться сигналами каждого светофора.
(в ред. Постановления Правительства РФ от 14.12.2005 N 767)
(см. текст в предыдущей редакции)
13.8. При включении разрешающего сигнала светофора водитель обязан уступить дорогу транспортным средствам, завершающим движение через перекресток, и пешеходам, не закончившим переход проезжей части данного направления.
Нерегулируемые перекрестки
13.9. На перекрестке неравнозначных дорог водитель транспортного средства, движущегося по второстепенной дороге, должен уступить дорогу транспортным средствам, приближающимся по главной, независимо от направления их дальнейшего движения.
На таких перекрестках трамвай имеет преимущество перед безрельсовыми транспортными средствами, движущимися в попутном или встречном направлении по равнозначной дороге, независимо от направления его движения.
(абзац введен Постановлением Правительства РФ от 25.09.2003 N 595)
Абзац утратил силу. — Постановление Правительства РФ от 26.10.2017 N 1300.
(см. текст в предыдущей редакции)
13.10. В случае, когда главная дорога на перекрестке меняет направление, водители, движущиеся по главной дороге, должны руководствоваться между собой правилами проезда перекрестков равнозначных дорог. Этими же правилами должны руководствоваться водители, движущиеся по второстепенным дорогам.
13.11. На перекрестке равнозначных дорог, за исключением случая, предусмотренного пунктом 13.11(1) Правил, водитель безрельсового транспортного средства обязан уступить дорогу транспортным средствам, приближающимся справа. Этим же правилом должны руководствоваться между собой водители трамваев.
(в ред. Постановления Правительства РФ от 26.10.2017 N 1300)
(см. текст в предыдущей редакции)
На таких перекрестках трамвай имеет преимущество перед безрельсовыми транспортными средствами независимо от направления его движения.
13.11(1). При въезде по дороге, не являющейся главной, на перекресток, на котором организовано круговое движение и который обозначен знаком 4.3, водитель транспортного средства обязан уступить дорогу транспортным средствам, движущимся по такому перекрестку.
(п. 13.11(1) в ред. Постановления Правительства РФ от 06.10.2022 N 1769)
(см. текст в предыдущей редакции)
13.12. При повороте налево или развороте водитель безрельсового транспортного средства обязан уступить дорогу транспортным средствам, движущимся по равнозначной дороге со встречного направления прямо или направо. Этим же правилом должны руководствоваться между собой водители трамваев.
13.13. Если водитель не может определить наличие покрытия на дороге (темное время суток, грязь, снег и тому подобное), а знаков приоритета нет, он должен считать, что находится на второстепенной дороге.
что это такое, какие бывают, общие правила, в картинках
Перекрёсток является одним из основных элементов дорожной инфраструктуры, так как на нём сходятся различные пути, проезд по которым строго регламентируется правилами дорожного движения. Какие виды пересечений проезжих частей существуют, и как их правильно преодолевать, рассматривается в данном обзоре.
- Понятие «Перекрёсток» по ПДД
- Виды перекрёстков
- Общие правила проезда
- Регулируемого перекрёстка
- Нерегулируемого перекрёстка
- Равнозначных
- С круговым движением
- С трамвайными путями
- Неравнозначных
- Со светофором
- Тонкости кругового движения на перекрёстке
Понятие «Перекрёсток» по ПДД
В ПДД прописана следующая формулировка этого термина: место, где пересекаются, примыкают или разветвляются дороги в одной плоскости, которое ограничивается воображаемыми прямыми, соединяющими противоположные начала закруглений проезжих частей, находящиеся на наибольшем удалении. К данному определению не относятся все выезды с территорий различных организаций и предприятий.
Виды перекрёстков
Пересечения дорог могут быть таких конфигураций:
- Т-образные;
- Y-образные;
- Х-образные;
- круговые.
Т-образные примыкания, несмотря на свою простоту, имеют свои подвохи, так как в них с одной стороны нет закруглений. Это мешает в полной мере определить границы перекрёстка.
Y-образные пересечения путей могут сходиться под разными углами — от острого до тупого, поэтому главенство его проезда определяется в каждом случае индивидуально.
Х-образные являются пересечением четырёх путей. В идеале — это две перпендикулярные дороги, но угол схождения проезжих частей может быть самым разным.
Круговые перекрёстки самые сложные, так как количество примыкающих к кругу дорог может быть различным. Этот вид пересечения подробнее рассмотрен ниже.
Общие правила проезда
В зависимости от типа пересечения дорог, регламентируются и правила их проезда. Поэтому, при подъезде к такому месту, водителю важно правильное определение вида перекрёстка.
Регулируемого перекрёстка
Наиболее просто пересечь именно такое сочленение дорог, так как оно однозначно определяется сигналами светофора или регулировщика. Все знаки и разметка являются вторичными по отношению к регулируемым пересечениям проезжих частей. Проезд на разрешающий сигнал светофора ничем не ограничивается.
Осуществляя манёвр налево по стрелке (горящей постоянно или включающейся по заданному интервалу) необходимо пропустить автомобили, движущиеся прямо на зелёный свет. Также пропускаются пешеходы и велосипедисты, пересекающие магистраль на «свой» зелёный сигнал. При повороте налево нужно пропустить все встречные транспортные средства, которые движутся прямо. Также даётся преимущество и встречным машинам, поворачивающим направо — по правилу «помеха справа».
Важно! При наличии регулировщика его сигналы имеют больший приоритет, чем работающий светофор.
Нерегулируемого перекрёстка
Как видно из названия, на таком пересечении дорог нужно руководствоваться знаками, дорожной разметкой и всё тем же правилом «помеха справа». К нерегулируемым перекрёсткам относятся и те, на которых временно прекращает работу светофор, отсутствует представитель ГИБДД, который должен направлять транспортные потоки в случае форс-мажорных обстоятельств.
Равнозначных
Равнозначные дороги регулируются следующим образом — дать преимущество проезда транспортному средству, которое приближается справа. Тут может возникнуть коллизия: сразу со всех направлений подъедут автомобили, поворачивающие налево.
В таких случаях дорожные службы устанавливают регулирующие знаки («Уступи дорогу», «Стоп»).
С круговым движением
Регулировать движение «по кругу» с ноября 2017 года стало намного проще. Главной дорогой считается круговое автополотно, поэтому любое транспортное средство, въезжающее на «кольцо», обязано пропустить другое, уже движущееся по нему.
Это логичное решение привело к единому алгоритму при распределении транспортных потоков по такому сложному участку дороги.
С трамвайными путями
Трамвай, как рельсовое транспортное средство общего пользования, имеет ряд преимуществ при переезде через перекрёсток. Зачастую, перед или сразу после пересечения дорог, расположены остановки, где потенциальные пассажиры могут массово нарушать правила дорожного движения.
Преимущество для трамвая отсутствует:
- при выезде из трамвайного депо;
- в случае поворота на зелёную «стрелку» во время действия основного запрещающего сигнала светофора;
- при подъезде по второстепенной дороге с мигающим жёлтым светофором.
Неравнозначных
При подъезде к пересечению путей по второстепенной дороге водитель должен пропустить автомобиль, который приближается по главной. В данном случае не имеет значение дальнейшее направление движения транспортных средств.
Важно! При изменении направления главной дороги все водители, перемещающиеся по ней, должны использовать правила проезда равнозначных перекрёстков. То же касается и второстепенных путей.
Со светофором
Как уже говорилось выше — работающий светофор однозначно указывает на приоритет пересечения перекрёстка. В таком случае разночтений не возникнет. А вот если это устройство по какой-то причине перестало работать (например, такое часто случается после грозы), то необходимо руководствоваться дорожными знаками и разметкой.
Тонкости кругового движения на перекрёстке
Круговое движение имеет некоторые нюансы:
- не нужно включать сигнал поворота — так как сначала нужно пропустить тех, кто уже едет по кругу, а потом — имеется преимущество при съезде;
- сигнал поворота включается только при перестроении между рядами;
- при правостороннем движении круг проезжается против часовой стрелки, а вот при левостороннем — наоборот, по ней;
- знак «Круговое движение» является лишь указывающим на направление и не даёт никакого приоритета;
- при наличии перехода в таких зонах водитель обязан пропустить всех пешеходов.
Проезд перекрёстка является очень важной составляющей дорожного движения. Внимательность и чёткое соблюдение всех правил избавит автолюбителя от неприятностей и проблем — как финансовых, так и медицинских.
350+ изображений перекрестков | Скачать бесплатные картинки на Unsplash
350+ Картинки пересечения | Download Free Images on Unsplash- A photoPhotos 10k
- A stack of photosCollections 10k
- A group of peopleUsers 6
outdoor
freeway
asphalt
nature
landscape
tarmac
vehicle
transportation
Логотип UnsplashUnsplash+
В сотрудничестве с Рафаэлем Лопесом
Unsplash+
Разблокировать
Hd wallpaperswallpaperatown
Денис Невожай
Hd city wallpaperschinaaerial
–––– –––– –––– –––– – –––– –– – –– –– –– – – –– ––– –– –––– – –.
Deb Dowd
Australiagold Coast Qldvehicle
John Lockwood
HQ FOONAL ImagesRoadslandscape Изображения и картин0011 Unsplash logo
Unsplash+
In collaboration with Carles Rabada
Unsplash+
Unlock
Nature imagesoutdoorsHd wallpapers
Avi Waxman
united statesglendalelooking down
Siyuan
shanghaiLight backgroundsnight
Deva Darshan
malaysiasemenyihhighway
Deb Dowd
Hd серые обоиПерекрёсток. УлицаHd пейзажи обои
Redd F
urbanjapanginza
Unsplash logoUnsplash+
In collaboration with Kristaps Ungurs
Unsplash+
Unlock
junctionbridge
Jeremy Bishop
roadfreewaygrid
CHUTTERSNAP
Car images & picturesTree images & picturestraffic
Helen Ngoc N.
street photographyseattlePeople изображения и изображения
Кейт Трифо
covidomicronpandemic
Тимо Строманн
асфальтостроительствоасфальт
Unsplash logoUnsplash+
In collaboration with Kristaps Ungurs
Unsplash+
Unlock
motorway junctionmotorway
Simon Launay
tokyostreetaerial view
Hd wallpaperswallpaperatown
Hq background imagesroadsLandscape images & pictures
中国重庆市荷塘路16号
shanghaiСветлые фоныночь
Hd серые обоиперекрёсток. УлицаHd пейзаж обои
Junctionbridge
roadfreewaygrid
covidomicronpandemic
развязка автомагистралейшоссе
–––– –––– –––– – –––– – –––– –– – –– –––– – – –– ––– –– –––– – –.
Hd city wallpaperschinaaerial
australiagold coast qldvehicle
Hd blue wallpaperstransportationautomobile
Nature imagesoutdoorsHd wallpapers
united statesglendalelooking down
malaysiasemenyihhighway
urbanjapanginza
Car images & picturesTree images & picturestraffic
street photographyseattlePeople images & images
Похожие коллекции
Intersection
32 фото · Куратор hana liIntersection Online
31 фото · Куратор Vanessa Bel0 пересечение 9 | crossings 32 фото · Куратор Diane Lassila0011junctionbridge
Car images & picturesTree images & picturestraffic
covidomicronpandemic
motorway junctionmotorway
Hd city wallpaperschinaaerial
Hq background imagesroadsLandscape images & pictures
united statesglendalelooking down
Hd grey wallpaperscrossroads.
roadfreewaygrid
асфальтзданиеасфальт
–––– –––– –––– – –––– – –––– –– –– –––– – ––– ––– – –––– – –.
australiagold coast qldvehicle
Hd blue wallpaperstransportationautomobile
Nature imagesoutdoorsHd wallpapers
shanghaiLight backgroundsnight
Related collections
Intersection
32 photos · Curated by hana liIntersection Online
31 photos · Curated by Vanessa Belперекресток | crossings
32 фото · Куратор Diane Lassilaurbanjapanginza
street photographyseattlePeople images & images
tokyostreetaerial view
Просмотр премиальных изображений на iStock | Скидка 20% на iStock
Unsplash logoСделайте что-нибудь потрясающее
Моделирование пересечения дорог с помощью Pygame, часть 1 | by Mihir Gandhi
Эта серия статей содержит пошаговое руководство по разработке моделирования транспортных развязок с нуля с использованием Pygame.
Окончательный результат симуляцииМы разрабатываем с нуля симуляцию с использованием Pygame для имитации движения транспортных средств через перекресток со светофорами с таймером. Он содержит 4-полосную транспортную развязку со светофорами, контролирующими поток движения в каждом направлении. У каждого сигнала есть таймер, который показывает время, оставшееся до переключения сигнала с зеленого на желтый, с желтого на красный или с красного на зеленый. Транспортные средства, такие как автомобили, велосипеды, автобусы и грузовики, генерируются, и их движение контролируется в соответствии с сигналами и транспортными средствами вокруг них. Эту симуляцию можно в дальнейшем использовать для анализа данных или для визуализации приложений AI или ML. На видео ниже показан окончательный результат моделирования, которое мы будем строить.
Прежде чем погрузиться в программирование и увидеть, как наша красивая симуляция оживает, давайте получим несколько изображений, которые нам понадобятся для создания симуляции. Вот список того, что нам нужно:
- 4-сторонний перекресток
- Светофоры: красный, желтый и зеленый
- Автомобиль:
- Автобус
- Truck
Пожалуйста, убедитесь, что вы переименовали изображения, которые вы загружаете, в соответствии с подписью к изображениям выше. Далее нам нужно изменить размер изображений светофоров и транспортных средств в соответствии с размером изображения четырехстороннего перекрестка. Это единственный шаг, который потребует некоторых проб и ошибок, но поскольку мы создаем симуляцию с нуля, это необходимо.
Откройте изображение четырехстороннего перекрестка в приложении, таком как Paint для Windows или Preview для Mac. Выберите область, равную тому, как вы хотите, чтобы транспортное средство выглядело в вашей окончательной симуляции. Запишите размеры.
Получение размера и координат транспортного средства из изображения перекресткаТеперь измените размер транспортных средств до этого размера, открыв их в любом инструменте по вашему выбору. Повторите тот же процесс для изображений сигналов светофора.
Остался последний шаг, прежде чем мы перейдем к кодированию. Как вы могли заметить, у нас есть изображения транспортных средств, обращенных только вправо. Поэтому поверните изображения транспортных средств и сохраните каждое из них, чтобы получить изображения, обращенные во всех направлениях, как показано на изображении ниже.
Создать папку Traffic Intersection Simulation » и внутри него создайте папку « images ». Здесь мы будем хранить все эти изображения. Структура папки показана ниже:
- вниз : содержит изображения транспортных средств, обращенных вниз
- вверх : содержит изображения транспортных средств, обращенных вверх
- влево : содержит изображения транспортных средств, обращенных влево 3 : содержит изображения транспортных средств, обращенных вправо
- сигналы : содержит изображения светофоров
Теперь давайте углубимся в кодирование.
Установка Pygame
Перед установкой PyGame в вашей системе должен быть установлен Python 3.1+. Вы можете скачать Python отсюда. Самый простой способ установить Pygame — использовать pip. Просто запустите следующую команду в cmd/Terminal.
$ pip install pygame
Импорт необходимых библиотек
Начнем с создания файла с именем ‘ Simulation.py » и импортировать библиотеки, которые нам потребуются для разработки этой симуляции.
import randomimport timeimport threadingimport pygameimport sys
Обратите внимание, что на данном этапе структура вашей папки должна выглядеть примерно так.
Структура папок проектаОпределение констант
Далее мы определяем некоторые константы, которые будут использоваться при моделировании движения транспортных средств, а также при управлении таймерами светофоров.
# Значения таймеров сигналов по умолчанию в секундахdefaultGreen = {0:20, 1:20, 2:20, 3:20}defaultRed = 150defaultYellow = 5signals = []noOfSignals = 4currentGreen = 0 # Указывает, какой сигнал является зеленым в настоящее времяnextGreen = ( currentGreen+1)%noOfSignals currentYellow = 0 # Указывает, включен желтый сигнал или нет. Speeds = {'car': 2.25, 'bus': 1.8, 'truck': 1.8, 'bike': 2.5} # средняя скорость транспортных средств
Приведенные ниже координаты также извлекаются путем открытия изображения четырехстороннего пересечения в Paint/Preview и получения значений пикселей.
# Координаты начала движения транспорта
x = {'right':[0,0,0], 'down':[755,727,697], 'left':[1400,1400,1400], 'up':[602,627,657 ]}y = {'право':[348 370 398], 'вниз':[0,0,0], 'влево': [498 466 436], 'вверх': [800 800 800]}автомобили = {'право': {0 :[], 1:[], 2:[], 'перечеркнуто':0}, 'вниз': {0:[], 1:[], 2:[], 'перечеркнуто':0}, 'влево ': {0:[], 1:[], 2:[], 'перечеркнуто':0}, 'вверх': {0:[], 1:[], 2:[], 'перечеркнуто':0 }}vehicleTypes = {0:'машина', 1:'автобус', 2:'грузовик', 3:'велосипед'}directionNumbers = {0:'право', 1:'вниз', 2:'лево', 3:'up'}# Координаты изображения сигнала, таймера и счетчика транспортных средствsignalCoods = [(530,230),(810,230),(810,570),(530,570)]signalTimerCoods = [(530,210),(810,210),(810,550), (530,550)]# Координаты стоп-линийstopLines = {'right': 590, «вниз»: 330, «влево»: 800, «вверх»: 535} defaultStop = {'вправо': 580, «вниз»: 320, «влево»: 810, «вверх»: 545}# Промежуток между VehiclestoppingGap = 15 # остановка gapmovingGap = 15 # перемещение промежутка
Инициализация Pygame
Затем мы инициализируем Pygame следующим кодом:
pygame. init()simulation = pygame.sprite.Group()
Определение классов
9
9 давайте создадим несколько классов, объекты которых мы будем генерировать в симуляции. У нас есть 2 класса, которые нам нужно определить.
- Светофор : Нам нужно сгенерировать 4 светофора для нашей симуляции. Итак, мы создаем класс TrafficSignal со следующими атрибутами:
- красный : значение таймера красного сигнала
- желтый : значение таймера желтого сигнала signalText : Значение таймера для отображения
class TrafficSignal:
def __init__(self, red, yellow, green):
self.red = красный
self.yellow = желтый
self.green = зеленый
self.signalText = ""
2. Vehicle : Это класс, который представляет объекты транспортных средств, которые мы будем генерировать в моделировании. . Класс Vehicle имеет следующие атрибуты и методы:
- VehicleClass : Представляет класс транспортного средства, такого как автомобиль, автобус, грузовик или велосипед
- скорость : Представляет скорость транспортного средства в соответствии с его классом
- direction_number : Представляет направление — 0 вправо, 1 вниз, 2 влево и 3 вверх
- direction : Представляет направление в текстовом формате
- y : Представляет текущую координату y транспортного средства
- Пересечение : Представляет, пересекло ли транспортное средство сигнал или нет
- index : Представляет относительное положение транспортного средства среди транспортных средств движутся в том же направлении и по той же полосе
- image : Представляет изображение для визуализации
- render(): Для отображения изображения на экране
- move(): Для управления движением транспортного средства в соответствии со светофором и транспортными средствами впереди
class Vehicle(pygame. sprite.Sprite):
def __init__(self, lane, VehicleClass, direction_number, direction):
pygame.sprite.Sprite.__init__(self)
self.lane = lane
self.vehicleClass = VehicleClass
self. скорость = скорость [класс автомобиля]
self.direction_number = direction_number
self.direction = направление
self.x = x[направление][полоса]
self.y = y[направление][полоса]
self.crossed = 0
транспортных средств[направление][полоса] .append(self)
self.index = len(транспортные средства [направление][полоса]) - 1
path = "images/" + direction + "/" + VehicleClass + ".png"
self.image = pygame.image .load(path) if(len(транспортные средства [направление][полоса])>1
и транспортные средства[направление][полоса][self.index-1].crossed==0):
if(direction=='right '):
self.stop =
транспортных средств[направление][полоса][self.index-1].stop
- транспортные средства[направление][полоса][self.index-1].image.get_rect().width
- stopingGap
elif(direction=='left'):
self. stop =
транспортных средств[направление][полоса][self.index-1].stop
+ транспортные средства[направление][полоса][self.index-1].image .get_rect().width
+ stopGap
elif(direction=='down'):
self.stop =
транспортных средств[направление][полоса][self.index-1].stop
- транспортные средства[направление][полоса ][self.index-1].image.get_rect().высота
- stopingGap
elif(direction=='up'):
self.stop =
транспортных средств[направление][полоса][self.index-1].stop
+ транспортные средства[направление][полоса][self.index- 1].image.get_rect().height
+ stopGap
еще:
self.stop = defaultStop[направление]if(direction=='right'):
temp = self.image.get_rect().width + stopgap
x[направление][полоса] -= temp
elif(direction=='left'):
temp = self.image.get_rect().width + stopgap
x[направление][полоса] += temp
elif(направление=='вниз'):
temp = self.image.get_rect().height + stopingGap
y[направление][полоса] -= temp
elif(направление=='вверх'):
temp = self. image.get_rect().height + stopGap
y[направление][полоса] += temp
Simulation.add(self) def render(self, screen):
screen.blit(self.image, (self.x , self.y))
Давайте разберемся с последней частью конструктора.
В конструкторе, после инициализации всех переменных, мы проверяем, есть ли уже транспортные средства в том же направлении и полосе движения, что и текущее транспортное средство. Если да, нам нужно установить значение ‘ стоп ’ текущего автомобиля с учетом значения ‘ стоп ’ и ширины/высоты впереди идущего автомобиля, а также stopingGap . Если впереди уже нет транспортного средства, то значение stop устанавливается равным defaultStop . Это значение стоп используется для управления местом остановки транспортных средств при красном сигнале. Как только это будет сделано, мы обновим координаты, откуда генерируются транспортные средства. Это сделано для того, чтобы избежать наложения вновь сгенерированных транспортных средств на существующие транспортные средства, когда на красный свет остановилось много транспортных средств.
Теперь давайте поговорим о функции move(), которая является одним из самых важных фрагментов кода в нашей симуляции. Обратите внимание, что эта функция также является частью класса Vehicle, определенного выше, и должна иметь соответствующий отступ.
def move(self):
if(self.direction=='right'):
if(self.crossed==0 and self.x+self.image.get_rect().width>stopLines[self.direction ]):
self.crossed = 1
if((self.x+self.image.get_rect().width<=self.stop
или self.crossed == 1 или (currentGreen==0 and currentYellow==0 ))
и (self.index==0 или self.x+self.image.get_rect().width
<(автомобили[self.direction][self.lane][self.index-1].x - movingGap)) ):
self.x += self.speed
elif(self.direction=='down'):
if(self.crossed==0 и
self.y+self.image.get_rect().height>stopLines [self.direction]):
self.crossed = 1
if((self.y+self.image.get_rect().height<=self.stop
или self.crossed == 1 или (currentGreen==1 и currentYellow==0))
и (self. index==0 или self.y+self.image.get_rect().height
<(транспортные средства[self.direction][self.lane][self.index-1].y - movingGap))):
self.y += self.speed
elif(self.direction=='left') :
if(self.crossed==0 и
self.xself.crossed = 1
if((self.x>=self.stop or self.crossed == 1
или (currentGreen==2 и currentYellow==0))
и (self.index==0 или self.x
>(транспортные средства[self.direction][self.lane][self.index-1].x
+ транспортные средства[self.direction][self.lane][self.index-1].image.get_rect().width
+ movingGap))):
self.x -= self.speed
elif(self.direction=='up'):
if(self.crossed==0 и
self.yself.crossed = 1
if((self.y>=self.stop или self.crossed == 1
или (currentGreen==3 и currentYellow==0))
и (self.index==0 или self.y
>(транспортные средства[self.direction][self.lane][self.index-1].y
+ транспортные средства[self. direction][self.lane][self.index-1].image. get_rect().height
+ movingGap))):
self.y -= self.speed
Для каждого направления мы сначала проверяем, пересек ли автомобиль перекресток или нет. Это важно, потому что если транспортное средство уже пересекло дорогу, то оно может продолжать движение независимо от того, зеленый или красный сигнал светофора. Поэтому, когда транспортное средство пересекло перекресток, мы устанавливаем значение пересечения равным 1. Затем мы решаем, когда транспортное средство движется и когда останавливается. Возможны 3 случая, когда транспортное средство движется:
- Если оно не достигло точки остановки перед перекрестком
- Если он уже пересек перекресток
- Если сигнал светофора, контролирующий направление движения транспортного средства, зеленый
Только в этих 3 случаях координаты транспортного средства обновляются путем увеличения/уменьшения их на скорость транспортных средств в зависимости от направления их движения. Однако нам необходимо рассмотреть еще одну возможность того, что впереди находится транспортное средство, движущееся в том же направлении и по той же полосе. В этом случае транспортное средство может двигаться только при наличии достаточного расстояния до впереди идущего транспортного средства, и это решается с учетом координат и ширины/высоты впереди идущего транспортного средства, а также перемещениеGap .
Создание объектов класса TrafficSignal
Далее мы инициализируем 4 объекта TrafficSignal, сверху слева вниз по часовой стрелке, со значениями таймеров сигналов по умолчанию. Таймер красного сигнала ts2 устанавливается равным сумме таймеров желтого и зеленого сигналов ts1 .
def initialize():
ts1 = TrafficSignal(0, defaultYellow, defaultGreen[0])
signal.append(ts1)
ts2 = TrafficSignal(ts1.yellow+ts1.green, defaultYellow, defaultGreen[1])
signal.append(ts2)
ts3 = TrafficSignal(по умолчаниюRed, defaultYellow, defaultGreen[2])
signal. append(ts3)
ts4 = TrafficSignal(defaultRed, defaultYellow, defaultGreen[3])
signal.append(ts4)
Repeat()
Repeat() function
Функция repeat(), которая вызывается в конце функции initialize() выше, является рекурсивной функцией, которая запускает всю нашу симуляцию. Это движущая сила нашего моделирования.
def repeat():
global currentGreen, currentYellow, nextGreen
while(signals[currentGreen].green>0):
updateValues()
time.sleep(1)
currentYellow = 1
для i в диапазоне (0,3):
для транспортного средства в транспортных средствах[directionNumbers[currentGreen]] [i]:
Vehicle.stop=DefaultStop[directionNumbers[currentGreen]]
while(signals[currentGreen].yellow>0):
updateValues()
time.sleep(1)
currentYellow = 0signals[currentGreen]. зеленый = defaultGreen[currentGreen]
signal[currentGreen].yellow = defaultYellow
signal[currentGreen].red = defaultRedcurrentGreen = nextGreen
nextGreen = (currentGreen+1)%noOfSignals
signal[nextGreen]. red = signal[currentGreen].yellow+signals[currentGreen].green
repeat()
Функция repeat() сначала вызывает функцию updateValues() каждую секунду для обновления таймеров сигнала до тех пор, пока зеленый таймер currentGreen не достигнет 0. Затем она устанавливает этот сигнал на желтый и сбрасывает стоп значение всех транспортных средств, движущихся в направлении, контролируемом сигналом currentGreen . Затем он снова вызывает функцию updateValues() через каждую секунду, пока таймер yellow сигнала currentGreen не достигнет 0. Значение currentYellow теперь установлено на 0, так как этот сигнал теперь станет красным. Наконец, значения сигнала currentGreen восстанавливаются до значений по умолчанию, значения currentGreen и nextGreen 9.0294 обновляется, чтобы указать на следующие сигналы в цикле, а значение таймера красного сигнала nextGreen обновляется в соответствии с желтым и зеленым обновленного сигнала currentGreen . Затем функция repeat() вызывает себя, и процесс повторяется с обновленным сигналом currentGreen .
Функция updateValues()
Функция updateValues() обновляет таймеры всех сигналов каждую секунду.
def updateValues():
для i в диапазоне (0, noOfSignals):
if(i==currentGreen):
if(currentYellow==0):
signal[i].green-=1
else:
signal[i].yellow-=1
else:
signal[i].red-=1
функция generateVehicles()
Функция generateVehicles() используется для генерации транспортных средств. Тип транспортного средства (автомобиль, автобус, грузовик или велосипед), номер полосы движения (1 или 2), а также направление движения транспортного средства определяются с помощью случайных чисел. Переменная dist представляет совокупное распределение транспортных средств в процентах. Таким образом, распределение [25,50,75,100] означает, что существует равное распределение (по 25% в каждом) транспортных средств по всем 4 направлениям. Некоторые другие распределения могут быть [20,50,70,100], [10,20,30,100] и так далее. Каждую секунду в симуляцию добавляется новое транспортное средство.
def generateVehicles():
while(True):
Vehicle_type = random.randint(0,3)
lane_number = random.randint(1,2)
temp = random.randint(0,99)
direction_number = 0
dist= [25,50,75,100]
if(tempdirection_number = 0
elif(tempdirection_number = 1
elif(tempdirection_number = 2
elif(tempdirection_number = 3
Vehicle(lane_number, VehicleTypes[vehicle_type], direction_number, directionNumbers[direction_number])
time.sleep(1)
Основной класс
И мы добрались до нашего последнего фрагмента кода, класса Main, после чего мы можем увидеть нашу симуляцию в действии.
class Main:
thread1 = threading.Thread(name="initialization",target=initialize, args=())
thread1.daemon = True
thread1. start()black = (0, 0, 0)
белый = (255, 255, 255)
screenWidth = 1400
screenHeight = 800
screenSize = (screenWidth, screenHeight)
background = pygame.image.load('images/intersection.png')
screen = pygame.display.set_mode (screenSize)
pygame.display.set_caption("СИМУЛЯЦИЯ") redSignal = pygame.image.load('images/signals/red.png')
yellowSignal = pygame.image.load('images/signals/yellow.png')
greenSignal = pygame.image.load('images/signals/green.png')
font = pygame.font.Font(None, 30 ) thread2 = threading.Thread(name="generateVehicles",target=generateVehicles, args=())
thread2.daemon = True
thread2.start(), в то время как True:
для события в pygame.event.get():
if event.type == pygame.QUIT:
sys.exit() screen.blit(background,(0,0))
для i в диапазоне(0,noOfSignals):
if(i==currentGreen):
if(currentYellow==1):
signal[i].signalText = signal[i].yellow
screen.blit(yellowSignal, signalCoods[i])
else:
signal[i]. signalText = signal[i] .green
screen.blit(greenSignal, signalCoods[i])
else:
if(signals[i].red<=10):
signal[i].signalText = signal[i].red
else:
signal [i].signalText = "---"
screen.blit(redSignal, signalCoods[i])
signalTexts = ["","","",""]
для i в диапазоне (0,noOfSignals):
signalTexts[i] = font.render(str(signals[i].signalText), True, белый, черный)
screen.blit(signalTexts[i],signalTimerCoods[i])для автомобиля в симуляции:
screen.blit(vehicle.image, [vehicle.x, Vehicle.y])
Vehicle.move()
pygame. display.update()
Давайте разберемся с функцией Main(), разбив ее на более мелкие части. Начнем с создания отдельного потока для метода initialize(), который создает экземпляры 4 объекта TrafficSignal . Затем мы определяем 2 цвета, белый и черный , которые мы будем использовать в нашем отображении. Затем мы определяем ширину и размер экрана, а также фон и заголовок, которые будут отображаться в окне моделирования. Затем мы загружаем изображения трех сигналов, то есть красного, желтого и зеленого. Теперь мы создаем еще один поток для generateVehicles().
Затем мы запускаем бесконечный цикл, который постоянно обновляет экран моделирования. Внутри цикла мы сначала определяем критерии выхода. В следующем разделе мы визуализируем соответствующее изображение сигнала и таймер сигнала для каждого из 4 светофоров. Наконец, мы визуализируем транспортные средства на экране и вызываем функцию move() для каждого транспортного средства. Эта функция заставляет транспортные средства двигаться в следующем обновлении.
Функция blit() используется для рендеринга объектов на экране. Он принимает 2 аргумента: изображение для рендеринга и координаты. Координаты указывают на верхний левый угол изображения.
Почти готово! Теперь нам просто нужно вызвать программу Main(), и наш код готов.
Main()
Запуск кода
Время посмотреть результаты. Запустите cmd/терминал и выполните команду:
$ python Simulation.pyСнимок окончательного результата моделирования
И вуаля! У нас есть полнофункциональная симуляция четырехстороннего перекрестка, которую мы построили с нуля, начиная с получения изображения перекрестка, сигналов и транспортных средств и заканчивая кодированием логики переключения сигналов и движения транспортных средств.
Исходный код: https://github.com/mihir-m-gandhi/Basic-Traffic-Intersection-Simulation
Это первая часть из серии статей:
- Моделирование транспортных развязок с использованием Pygame, Часть 2
- Моделирование транспортных развязок с использованием Pygame, Часть 3
Это моделирование было разработано в рамках исследовательского проекта под названием «Умное управление светофорами с использованием искусственного интеллекта». Посмотрите его демонстрационное видео здесь.