Ограничение скорости

В этом уроке:

  • Модернизируем блок движения по линии;
  • Учим машинку распознавать знак "Ограничение скорости";

Знак "Ограничение скорости" в ПДД

Знак "Ограничение скорости", как можно догадаться из названия, ограничивает максимальную скорость движения автомобиля. Обычно скорость устанавливается исходя из следующих соображений:

  • 90 км/ч  — скорость вне населённых пунктов, или на скоростных дорогах;
  • 60 км/ч — скорость в населенных пунктах;
  • 40 км/ч — скорость на участках, где необходимо повышенное внимание водителя;
  • 20 км/ч — скорость вблизи школ, в жилых зонах, и прочих местах, где на проезжей части могут присутствовать люди. 

Добавляем параметр задания скорости в блок движения по линии

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

В этом уроке мы будем работать со знаком "Ограничение скорости", а значит нам потребуется менять скорость движения машинки. 

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

Нажмите на блоке движения по линии на значок шестерёнки "Редактировать".

Нажмите "Добавить параметр".

Перейдите во вкладку "Настройка параметров". Введите имя параметра "speed" (т.е. "скорость"). Тип параметра "Ввод", тип данных — "Число". Можно задать значение по умолчанию, мы поставили 20.

Теперь перейдите во вкладку "Значки параметров". Выберите подходящий значок и нажмите "Завершить".

Мы попадаем в окно редактирования блока. Видим, что на экране теперь есть параметр, который мы только что добавили. Необходимо передать его значение в блок "Рулевое управление" для задания скорости. 

Чтобы сделать это, используем переменную. Устанавливаем её в начале блока. Задаём имя, например speed. Подключаем входной параметр к этой переменной.

Задаём "Записать -> Числовое значение". 

Теперь добавим считывание из этой переменной. Вставим её перед блоком "Рулевое управление".

Передаём считанное из переменной значение на "Рулевое управление". Теперь блок движения по линии будет выглядеть следующим образом:

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

Сохранение изменения.

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

Теперь мы можем задать значение скорости или здесь напрямую, или передать его сюда из другого блока.

Попробуйте задать разные скорости и загрузить программу. Убедитесь, что машинка едет с разной скоростью.

Распознавание знака "Ограничение скорости"

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

startSpeedНачальная скорость (стандартная). Машинка будет двигаться с этой скоростью, когда не встретила знак ограничения скорости, или ограничение скорости отменил другой знак.
currentSpeedСкорость, считанная со знака.
speedСкорость, которая передаётся непосредственно на моторы. Это та скорость, с которой двигается машинка в данный момент. Мы уже ввели эту переменную в блоке движения по линии: это та же самая переменная.

Давайте добавим в начало программы новую переменную startSpeed

Присвоим ей значение, пусть это будет 20. После этого присвоим переменной speed значение startSpeed. Итак, мы задали начальную скорость и присвоили её переменной, которая управляет скоростью моторов. 

Также передадим скорость speed на вход блока движения по линии.

Для чего необходима такая сложность?

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

Только что вы создали основную ветку программы. Она будет отвечать за движение машинки. Теперь на протяжении остальных уроков мы будем добавлять функционал в нашу программу: распознавание знаков. 

Каждый новый знак будем оформлять отдельной веткой. Алгоритм в них будет влиять на поведение алгоритма основной ветки. В частности, сейчас мы работаем со знаком, влияющим на скорость, а значит, будем менять переменную speed.

Давайте добавим блок ИК-приёмника, чтобы получать информацию от знака.

*Если у вас нет данного блока, убедитесь, что вы выполнили действия, описанные в статье.

Подключите блок к началу бесконечного цикла и выберите знак "Ограничение скорости". Это наша новая ветка, о которой мы написали выше.

На первом выходе блока — скорость, считанная со знака. Если знак в данный момент не встретился, то блок выдаст скорость 0. Это уточнение важно, поскольку это значит, что мы не можем просто так передать считанную скорость алгоритму движения по линии.

Запишем полученную скорость в переменную currentSpeed (создадим её), после чего проверим, не равна ли она 0. Если не равна (т.е. знак распознан), то присваем переменной speed значение скорости, полученное от знака (currentSpeed). Если currentSpeed равна 0, то никаких действий не происходит, т.к. это значит, что машинка не встретила знак.

Таким образом, мы изменили переменную speed. В основной ветке в блок управления движением машинки теперь передаётся новая скорость, поэтому теперь робот движется со скоростью, указанной на знаке.

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

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

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

Если машинка не распознаёт знак, проверьте переключатель на ИК-приёмнике. Он должен быть переведён в сторону, с которой расположены знаки на трассе (направо). Если ИК-приёмник успешно принимает сигнал от знака, то на нём вспыхивает светодиод (эта функция работает независимо от того, загружен алгоритм в машинку или нет). Также проверьте правильность установки знаков на трассе, подробнее об этом читайте в первом уроке.

Поздравляю с изучением данного урока!
Следующий урок:
№7. Конец всех ограничений.
приступить к изучению

Обсуждение

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