Александр Григорьев. Публикация-зеркало на Новаторе.
Сегодня мы создадим проект в среде Snap4arduino для моделирования поведения робота при перемещении по чёрной разметке. На сцене мы нарисуем линию, и наш виртуальный робот будет следовать по этой линии автоматически.
ЭТАП 1: Готовим объекты, рисуем и компонуем
Запустите среду Snap4arduino ( установочный файл можно загрузить по ссылке http://snap4arduino.rocks/#download ), проверьте, что выбран русский язык интерфейса. Выберите "Плоский дизайн" как более удобный.
В новом пустом проекте сейчас лишь два объекта - Сцена и спрайт с костюмом стрелки и названием "Спрайт".
Измените размер Сцены. В этом проекте нам будет удобнее иметь 640х480 пикселей (точек) вместо 480х360. Используйте пункт меню "Настройки", "Размер сцены".
При необходимости в будущем мы сможем сделать сцену ещё больше.
Теперь отредактируем фон, нарисуем линию разметки, по которой будет ездить робот. Выберите объект "Сцена".
Переключитесь на вкладку "Фоны", щёлкните по кнопке "Нарисовать новый костюм".
Откроется окно простого графического редактора.
Выберите светло-серый, почти белый цвет и, используя инструмент "Заливка", заполните им весь фон. Затем нарисуйте линию разметки (трассу) чёрным или почти чёрным цветом при помощи инструмента "Кисть" размером 10 пикселей. Если нужно отменить последнее действие, используйте кнопку "отменить" в левом верхнем углу, не путайте её с кнопкой закрытия всего окна.
Должно получиться примерно как на рисунке ниже. Закройте окно редактора кнопкой "ОК".
Трасса готова, теперь займёмся созданием робота. Щёлкните по объекту "Спрайт", переименуйте его. Мы будем использовать имя "Робот".
Не обязательно рисовать все объекты самостоятельно, воспользуемся готовым изображением "EV3-mini.png".
Сохраните изображение выше с использованием контекстного меню браузера (щёлкнув правой кнопкой мыши по изображению).
Обратите внимание, что на вкладке "Костюмы" есть надпись "Вы можете перенести и бросить сюда изображение со своего компьютера". Откройте в окне проводника папку, в которой лежит файл с нужным рисунком, перетащите этот файл на вкладку "Костюмы" среды Snap4arduino.
Изображение спрайта изменилось. Теперь появился и стал использоваться новый костюм с названием "EV3-mini". Мы сразу же отредактируем его, чтобы поведение робота при разворотах было более естественным. Щёлкните по костюму правой кнопкой мыши и выберите "редактировать".
Теперь при помощи инструмента "Установка центра вращения" выберите точку, вокруг которой будет вращаться робот. Она должна располагаться на оси его ведущих колёс. Нажмите на кнопку "ОК".
Пришло время добавить роботу пару датчиков, при помощи которых он будет определять позицию линии. В нашем проекте роль датчиков будут выполнять два спрайта круглой формы.
Создайте новый спрайт, щёлкнув по кнопке "нарисовать новый спрайт".
Вновь появилось окно графического редактора. Выберите серый цвет, нарисуйте кружок диаметром, примерно равным двойной ширине линии разметки (20 пикселей), ориентируясь на расположенное рядом изображение. Используйте инструмент "Закрашенный эллипс". Чтобы кружок получился ровным, держите зажатой клавишу "Shift".
При помощи инструмента "Установка центра вращения" убедитесь, что перекрестье лежит в центре круга, закончите редактирование, нажав на кнопку "ОК".
Переименуйте новый спрайт, дав ему название "Сенсор1". Передняя часть робота в настоящий момент направлена направо, перетащите мышкой сенсор, поменяв его положение так, чтобы он был расположен впереди слева по направлению движения робота.
Сдублируйте спрайт сенсора.
Дайте дублю название "Сенсор2". Перетащите второй сенсор, чтобы он располагался впереди справа по направлению движения робота.
еперь мы сделаем очень интересную операцию - объединим несколько спрайтов, чтобы они стали одним целостным объектом. После этого все спрайты, составляющие объект, будут перемещаться вместе.
"Ухватите" мышкой иконку спрайта "Сенсор2" на панели спрайтов и "бросьте" её на изображение робота на сцене.
Иконка вернулась на панель спрайтов, но кое-что изменилось: появились дополнительные значки, обозначающие взаимосвязанность спрайтов. Главным спрайтом ("хозяином") является спрайт "Робот".
Повторите операцию для спрайта "Сенсор1", "зацепите" его иконку и "бросьте" на изображение робота на сцене. Готово, все три спрайта взаимосвязаны, и теперь при перемещении робота будут перемещаться и его сенсоры. Проверьте это, перетащив робота и поставив на линию.
Давайте чуть уменьшим размер робота. Выберите спрайт "Робот".
Переключитесь на вкладку "Скрипты". Найдите на панели скриптов блок "установить размер в" (категория "Внешность") и вытяните на рабочее поле.
Отредактируйте значение и щёлкните по блоку, задав размер 50%. И сам робот, и его сенсоры стали меньше, пропорционально поменяв свой размер.
Готово! Осталось сохранить свой проект, чтобы можно было вернуться к нему после паузы для написания программы следования по линии.
Откройте меню "Файл", "Сохранить как".
Выберите "Компьютер", напечатайте имя проекта, нажмите кнопку "Сохранить".
В стандартном диалоговом окне выберите папку, в которую будет помещён сохраняемый файл "Робот на линии.xml". Обратите внимание, что заголовок нашего проекта тоже изменился.
Теперь среду Snap4arduino можно закрывать, результаты нашей работы сохранятся.
ЭТАП 2: Программируем робота для движения по линии
Снова откройте среду Snap4arduino. Загрузите проект "Робот на линии.xml" командой "Файл", "Открыть". Мы будем составлять программу для робота, убедитесь, что выбран именно спрайт "Робот".
Обратите внимание, что поле скриптов спрайта "Робот" уже содержит блок "Установить размер в", который мы туда ранее поместили.
Масштаб отображения сцены можно менять кнопкой, расположенной над сценой слева, это позволяет с большим удобством работать со скриптами.
В нашем проекте мы будем использовать пропорциональное регулирование: чем дальше линия отклонилась от средней позиции, тем быстрее робот будет поворачиваться в соответствующую сторону, чтобы линия оказалась снова посередине.
Давайте для наглядности создадим необходимые переменные и назовём их понятными именами.
Нам нужны 4 переменные: "яркость1", "яркость2", "ошибка_положения_линии", "управляющее_воздействие". Обратите внимание, что большинство языков программирования не позволяют использовать в именах пробелы, поэтому мы заменяем их символами подчеркивания.
Щелкните по кнопке "Объявить переменную".
Корректнее использовать локальные переменные ("только для текущего спрайта"), которые будут доступны лишь в спрайте "Робот". В будущем наш проект может быть дополнен другими спрайтами, которые будут иметь собственные переменные с аналогичными названиями. Итак, создайте 4 локальных переменных.
Снимите маркеры, чтобы значения переменных не отображались на сцене и не мешали нам.
В нашей программе будет использоваться очень полезный блок из категории "Сенсоры", который позволяет определять яркость, насыщенность цвета и оттенок под выбранным объектом.
Соберите скрипт из блоков по образцу ниже. Ещё раз убедитесь, что выбран именно спрайт "Робот". Все остальные объекты нашей программы не нуждаются в собственных скриптах.
Запустите программу и проверьте её функционирование. Робот должен уверенно следовать по линии.
Переключитесь на режим "Турбо".
Попробуйте запустить робота вне линии, проверьте, что получится. Экспериментируйте, меняя время задержки цикла, скорость движения (количество шагов за один цикл), а также коэффициент пропорциональности, превращающий ошибку положения линии в управляющее воздействие.
Сохраните свой проект. При сохранении в новое место опять выберите "Computer", при необходимости дайте новое имя.
ЭТАП 3 (дополнительно):
Выясняем недостатки нашей компьютерной модели, определяем пути её усовершенствования
Что будет, если запустить по линии одновременно двух роботов? Давайте проверим.
Сдублируйте спрайт "Робот". Вы видите, что сдублировались и подчинённые спрайты сенсоров. Теперь у нас 6 спрайтов: "Робот", "Сенсор1", "Сенсор2", "Робот(2)", "Сенсор1(2)" и "Сенсор2(2)".
Второй робот получил и копию управляющего скрипта. Однако этот скрипт необходимо поправить, чтобы второй робот использовал свои собственные сенсоры, а не сенсоры первого робота.
Поставьте второго робота на линию так, чтобы он двигался навстречу первому, и запустите программу.
Как видите, следует ещё поработать над моделью столкновений объектов. И кстати, это позволит нашему виртуальному роботу в будущем решать задачи по перемещению (толканию) грузов.