Светофор (без дополнительных секций). Проезд перекрёстка

В этом уроке:

  • Распознавание перекрёстка;
  • Выбор направления поворота;
  • Определение сигналов светофора.

В данном уроке на светофоре не должно быть установлено дополнительных секций.

Принцип распознавания перекрёстка

Перед тем, как работать со светофором, необходимо научиться определять перекрёсток, ведь машинка должна повернуть, находясь именно на нём. 

Сейчас датчики линии находятся по бокам от линии. Как мы помним, значения отражённого света считываются каждым датчиком, после чего вычисляется их разность. По величине и знаку полученного значения мы делаем вывод о том, в какую сторону сместилась линия.

Давайте теперь посмотрим на то, что будут фиксировать датчики при проезде перекрёстка.

В момент, когда машинка въезжает на перекрёсток, оба датчика начинают фиксировать линию. Кроме как на перекрёстке, такая ситуация больше нигде не может произойти. Таким образом, мы можем с уверенностью определить Х-образный перекрёсток.

Давайте создадим алгоритм, который позволит машинке поворачивать на перекрёстке, причём выбирать направление поворота случайным образом. Сначала сделаем это без светофора — его мы добавим позже. 

Алгоритм проезда перекрёстка. Выбор направления движения

Для нахождения перекрёстка мы выбрали способ определения цвета трассы под датчиками, потому что такой алгоритм будет проще в реализации: в режиме отражённого света (который мы использовали для езды по линии) даже когда оба датчика находятся над линией, они могут возвращать немного разные значения. Нам необходимо было бы учесть эти отклонения и настроить машинку так, чтобы она чётко реагировала на наличие перекрёстка. Определяя перекрёсток по цвету мы избавляемся от этой необходимости. Однако, разумеется, способов реализации данного алгоритма, как и любого другого, существует множество и вы можете выбрать другой.

Добавим блок датчика для определения цвета.

Зададим тёмные цвета, соответствующие линии: черный и коричневый.

Добавим второй такой же блок, соответствующий правому датчику. 

Поместим оба блока в цикл, длящийся до тех порт, пока оба условия не станут истинными (оба датчика зафиксируют линию).

Итак, машинка будет ехать прямо*, а в момент въезда на перекрёсток цикл завершится. Необходимо начать поворот.

*Прежде чем продолжить, обратим внимание на то, что пока выполняется условие этого цикла, скорости моторов будут фиксированными. Это происходит потому что в данном цикле нет управления движением по линии. Его нет потому что для его реализации используется другой режим работы датчиков — определение количества отражённого света, а  использовать один датчик в разных режимах работы одновременно, невозможно. 

Учитывая, что машинка находится перед перекрёстком и ехать ей не далеко, мы не будем усложнять алгоритм: машинка не должна сильно отклониться от линии при проезде пары десятков сантиметров по прямому участку трассы. 

Итак, необходимо выбрать направление дальнейшего движения. Для этого воспользуемся генератором случайных чисел. Будем генерировать числа от 1 до 3, где 1 — поворот налево, 2 — движение прямо, 3 — поворот направо. 

Число с генератора случайных чисел передаём на переключатель.

Теперь рассмотрим алгоритм поворота налево. Если на генераторе случайных чисел выпало число 1, то начинается поворот налево. Для этого при помощи блока "Рулевое управление" запускаем моторы для поворота налево. Делаем пол оборота на скорости 10. Здесь задача — повернуть от перекрёстка в нужную сторону, чтобы уйти с линии трассы. 

Далее — цикл. Продолжаем поворот, постоянно отслеживая цвет трассы под левым датчиком (под левым, потому что при левом повороте он первым окажется над линией). Когда он зафиксирует линию, это значит что поворот завершен: датчик выдаёт истину и цикл завершается. На этом поворот прекращается и начинается обычное движение по линии, которое мы реализовали в одном из первых уроков. 

(картинка кликабельна)

Поворот направо реализуем аналогичным образом (не забудьте изменить направление поворота и порт, к которому подключен правый датчик линии — 4). При движении прямо никаких действий предпринимать не нужно, поэтому блок остаётся пустым.

(картинка кликабельна)

Схема LEGO Mindstorms EV3 знаки ПДД

Давайте добавим в начало алгоритма данного урока блок "рулевое управление" и зададим скорость движения 10. Так мы сможем рассмотреть все этапы проезда перекрёстка и убедиться в правильности работы алгоритма. Кроме того, на высокой скорости машинка может проехать перекрёсток мимо, ведь его участок довольно узкий (равна ширине линии пересекающей дороги).

Поставьте машинку на трассу (прямо перед перекрестком) и запустите программу. Машинка будет поворачивать на перекрёстке, выбирая направление случайным образом. 

Пока у нас получился фрагмент программы, который нарушает работу остального алгоритма (именно поэтому мы ставили машинку прямо перед перекрестком). Пока в алгоритме нет условия для начала выполнения кода данного урока (распознавания перекрёстка), программа постоянно будет заходить в этот цикл, что нарушает работу остальных условий.

Давайте исправим это, добавив условие проезда перекрёстка.

    Распознавание знака

    На нашей трассе перекрёсток не может появиться внезапно: перед ним обязательно будет установлен какой-либо знак или светофор. Поэтому давайте поместим блок ИК-приёмника с распознаванием светофора перед алгоритмом поворота на перекрёстке.

    Весь написанный ранее алгоритми будет выполняться, только если распознан зелёный сигнал светофора.

    (картинка кликабельна)

    Чтобы сделать алгоритм компактнее, мы создали блоки из алгоритмов поворота налево и направо в переключателе после генератора случайных чисел (аналогично мы делали в уроке "Движение по линии"). Эти блоки мы назвали turn_left и turn_right соответственно. Они пригодятся нам в последующих уроках, поэтому вы тоже создайте их.

    Теперь всё работает более корректно: машинка движется по трассе, а, подъезжая к светофору, снижает скорость, едет до перекрёстка и выбирает дальнейшее направление движения. После поворота (или проезда прямо) работа основного алгоритма движения по линии возобновляется. 

    Однако, всё это сработает только если машинка подъедет к светофору во время горения зелёного сигнала. Красный сигнал будет проигнорирован. Давайте это исправим и добавим к алгоритму ещё одну ветку.

    Эта часть алгоритма будет простой: если горит красный свет, то останавливаемся до тех пор, пока не загорится зелёный.

    (картинка кликабельна)

    Более подробно: когда встречаем красный сигнал светофора, попадаем в переключатель. Выключаем моторы и попадаем в цикл, в котором постоянно отслеживаем сигнал светофора. Когда загорится зелёный, произойдет выход из цикла. После этого программа выйдет из переключателя и при следующем цикле попадёт в ветвь алгоритма, которую мы создали выше, поскольку сейчас горит зелёный сигнал светофора.

    Поставьте машинку на трассу и проверьте её работу совместно с остальными знаками. Всё должно работать слаженно и без ошибок.

    Сейчас ваш автомобиль реагирует только на основной зеленый сигнал светофора. Однако, алгоритм работы со светофором может быть более интересным, если на светофоре установлены дополнительные секции. Мы вернёмся к светофору позже и научим машинку распознавать дополнительные секции. 

    Поздравляю с изучением данного урока!
    Следующий урок:
    №10. Железнодорожный переезд со шлагбаумом.
    приступить к изучению

    Обсуждение

    Гарантии и возврат. Используя сайт, Вы соглашаетесь с условиями.