В статье предлагается
задача, которую должен решить робот LEGO MINDSTORMS, запрограммированный
с помощью NXT-G, и предоставляются необходимые шаги для достижения
одного из возможных решений поставленного задания.
Задание
В середине круга, ограниченного черной
линией, находятся две полные 330cc банки содовой. Ваша задача - создать и
запрограммировать робот таким образом, чтобы он вынес банки из круга,
после чего проиграл мелодию и остановился.
В Вашем распоряжении находится один
набор LEGO MINDSTORMS NXT 2.0, который, по неизвестным причинам, не
содержит никаких других датчиков, кроме датчика касания и датчика цвета
(светочувствительный датчик может использоваться взамен датчика цвета).
С чего начать
Планирование - основной принцип, если Вы
хотите получить хороший результат. Исходной точкой должно быть
продумывание и определение шагов, которые необходимо предпринять. Не
забывайте, что любая задача с вовлечением в нее роботов состоит из двух
разных, хотя и тесно связанных, частей: аппаратной (робот
непосредственно) и программной (программа). Каждая из этих частей
обусловливает другую, потому в нашем случае использования метода проб и
ошибок нужно принимать во внимание обе части.
Имеем следующие задачи:
- Разработка и конструирование робота.
- Написание программы (с использованием
NXT-G путем соединения блоков). Для этого сначала необходимо написать
алгоритм, а затем уже преобразовать его в программу.
- Тестирование программы.
- Внесение коррективов.
Робот
Необходимо помнить об ограничениях (в конструировании и программировании) этой задачи и возможностей робота. Они следующие:
Ограничения
- Робот может использовать только датчик
касания и датчик цвета/света. Нет ограничений на размер или количество
деталей, которые он должен переместить и повернуть на игровой площадке.
- Робот должен обнаружить черную линию, ограничивающую область, внутри которой он обязан находиться.
- Робот должен определить, когда стыкается с одной из банок, и переместить ее за пределы поля.
- Робот должен знать, когда вынес обе
банки из поля. При создании и тестировании робота часто возникают
сложности, которые требуют модификаций. Например, одна из сложностей, с
которой ранее сталкивались, связана с датчиком цвета: он определял все
как черное. После нескольких тестов и изменений стало понятно, что
проблема заключалась в слишком близком расположении датчика к
поверхности пола, таким образом, не было пространства для отражения
света в датчик. Плавное перемещение датчика немного выше решило
проблему.
Алгоритм
Прежде, чем начать комбинировать блоки
кода, составляющие программу, было бы неплохо записать ее на нормальном
языке, то есть, записать шаги, которые должен сделать робот для
выполнения его миссии. Не бывает одного-единственного решения для
задачи, люди выполняют одни и те же задачи по-разному. Так после записи
программы, подумайте об альтернативных способах достижения требуемой
цели более эффективным способом.
В таком случае задачи программирования следующие:
1. Создайте счетчик и обнулите его
(благодаря этому сохраняется число банок, которые были уже перемещены за
пределы игрового поля).
2. Двигайтесь вперед до тех пор, пока робот не обнаружит черную линию или объект.
a. Если робот обнаружит объект,
продолжайте двигаться вперед, пока он не определит черную линию
(означает, что объект находится теперь вне игрового поля), добавьте
единицу к счетчику.
3. Остановиться, развернуться и вернуться назад.
4. Если счетчик достигает значения 2, проиграть мелодию и остановиться. В противном случае продолжить поиск.
Это - только начальная точка для совершенствования программных навыков.
Программа
Теперь Вы знаете, какие шаги должен
предпринять робот для выполнения своей миссии, но не рекомендуется
сразу запускать всю программу. Это - очень полезная стратегия разбивать
сложные задачи на более легкие. В этом случае Вы можете разделить
программу на две части и объединить их позже.
- Робот произвольно перемещается в пределах игрового поля, не покидая его.
- Робот перемещает банку за пределы поля, возвращается назад и проигрывает мелодию.
Задание: часть 1
Прежде, чем записать программу, рассмотрим алгоритм:
- Перемещение вперед до тех пор, пока датчик цвета определяет черный цвет.
- Остановка.
- Возвращение назад.
- Поворот.
- Повтор шагов 1-4.
Ожидание робота, пока датчик не считает
черный цвет, можно задать с использованием любой из следующих трех
опций. Применение каждой из них даст тот же самый результат, но третья
опция открывает путь к объединению частей задачи.
Программа будет следующей:
Протестируйте программу и
удостоверьтесь, что ее поведение соответствует ожиданиям, но прежде
прочитайте «Тестирование робота» в конце этой статьи.
Задание: часть 2
Чтобы сделать задачу проще, предположим,
что робот имеет дело с одной из банок (таким образом, ему не нужно ее
искать), что требует более легкого алгоритма, например, как этот:
- Перемещение вперед, пока не произойдет столкновение с банкой.
- Продолжение перемещения, пока не достигнете черную линию на краю игрового поля.
- Остановка.
- Возвращение назад.
- Проигрывание мелодии.
Полная программа
Если две части задачи по отдельности
работают, как ожидалось, пора объединить их. Создадим переменную, с
помощью которой будем фиксировать число банок, перемещенных за пределы
поля. Переменная создается опцией Определить Переменную в меню
Инструменты и задается с начальным значением 0 таким образом:
Сначала проверьте, можно ли
контролировать два датчика одновременно и принимать решения на основании
их показаний (шаг 2 алгоритма).
Фрагмент кода на изображении начинается с
блока перемещения для приведения робота в движение прежде, чем
запустить цикл, который повторяется до тех пор, пока или датчик цвета
считывает черный цвет линии, или датчик касания зажат (вступает в
контакт с банкой). Цикл непрерывно считывает показания двух датчиков и
посредством логической операции (в этом случае OR), комбинирует оба
показания, генерируя логическое значение, которое является истинным,
если происходит контакт с банкой или обнаруживается черная линия, либо
оба фактора имеют место одновременно.
Робот должен знать, достиг ли он границы
игрового поля или коснулся банки. С этой целью можно использовать
условие, которое будет выполняться только, если датчик касания был
активирован. В этом случае робот будет перемещать банку до тех пор, пока
не достигнет черной линии, затем добавит единицу к счетчику (шаг 3).
После остановки, возвращения и поворота
робота (шаг 4) необходимо проверить, сколько банок было перемещено за
пределы игрового поля. Таким образом, программа проверяет значение
счетчика и, если оно равно 2, завершает цикл, после чего робот
проигрывает мелодию и останавливается (шаг 5).
Тестирование робота
Теперь можно протестировать робота и
оценить результаты. Если они не будут соответствовать ожиданиям, то
необходимо оценить, нужно ли вносить изменения в конструкцию робота или
программу.
Рекомендация! Не делайте одновременно
слишком много изменений, поскольку это затрудняет определение того,
какие изменения улучшают или ухудшают поведение робота.
Как продолжать
На данном этапе можно провести следующие модификации:
- После достижения черной линии робот
возвращается назад и поворачивается, но он всегда двигается одним и тем
же путем. Измените программу так, чтобы сделать каждый поворот случайным
(например, при помощи броска кубика для определения, сколько раз
повернуться).
- При наличии ультразвукового датчика
робот не будет перемещаться вслепую. Он в состоянии определить
местоположение банок, не касаясь их.
- Замените банку на что-то более тяжелое
(на большую банку или что-то подобное). Это - интересное занятие вроде
соревнования по сумо с мертвым весом.
Источник: электронный журнал В«Hispabrick Magazine 010 English EditionВ»
|