§12. Исполнитель Робот

12.1. Роботы в жизни человека

Человек с древности мечтал об искусственном создании, которое могло бы выполнять его приказы.
Сегодня мечта стала реальностью – в жизни человека появились роботы. Они способны выполнять практически любую работу, доступную человеку, а также делать многие вещи, которые ему выполнить сложно или невозможно.
Роботы используются на производстве и в быту, могут работать в сфере услуг и развлекать человека. Есть роботы, похожие на человека и совсем непохожие.

Робот – автоматическое устройство, которое действует по заранее составленной программе.

Робот получает информацию о внешнем мире от датчиков (аналогов органов чувств живых организмов) и предназначен для осуществления различных операций.
Мир роботов очень разнообразен. В быту современного человека используются автоматические стиральные и посудомоечные машины, роботы-пылесосы. С помощью роботов можно выращивать растения или управлять домом.
На производстве роботы способны выполнять сложные и трудоемкие работы. Широкое применение роботы находят в транспортировке грузов, расчистке завалов. Роботы эффективны для выполнения опасных и вредных видов работ, таких как: опрыскивание полей ядохимикатами, тушения пожаров и исследования опасных объектов.

Робот может быть материальным или виртуальным. Виртуальный робот – специальная программа, выполняющая определенные действия.
Роботы являются исполнителями. Виртуального робота можно рассматривать как компьютерного исполнителя.
Для исполнителей обычно определяют среду обитания и систему команд. Общим для всех роботов является то, что человек может ими управлять.
Робот может получать команды от оператора и выполнять их по одной, или действовать автономно по предварительно составленной программе.

12.2. Среда обитания и система команд компьютерного исполнителя Робот

Средой обитания исполнителя Робот является прямоугольное клетчатое поле. Между некоторыми клетками, а также по периметру поля находятся стены. Серое кольцо означает начальное положение Робота, черная точка – конечное. Робот может передвигаться по полю и закрашивать указанные клетки. В заданиях из встроенного задачника Робота закрашенные клетки помечены голубым цветом, те клетки, которые Робот должен закрасить – светло желтым (пример 9.1).

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

Для подключения исполнителя Робот в программе прописывается команда from pyrob.api import *. Готовые задания с обстановками для Робота хранятся в задачнике, и вызываются командой @task. О том как установить исполнителя Робот вместе с задачником можно прочитать в Приложении.
Структура программы для записи решения задачи из задачника показана в примере 12.2. Имя функции в программе должно соответствовать имени задачи. Все имена задач, которые соответствуют примерам из учебного пособия, начинаются со слова prim. Задачи, соответствующие упражнениям начинаются с upr. Дальше, после слов prim или upr следует соответствующий номер. В теле функции записываются команды исполнителя Робот.

Система команд исполнителя Робот:

Команда Действие
move_right() перемещает Робота вправо
move_left() перемещает Робота влево
move_up() перемещает Робота вверх
move_down() перемещает Робота вниз
fill_cell()
закрашивает текущую ячейку

Команды при наборе можно выбирать из выпадающего списка. Для этого достаточно набрать первые буквы команды и нажать Ctrl + пробел (пример 12.3). Команды перемещения Робота могут направлении. Если число не указано, то Робот сдвигается на одну клетку. содержать в качестве параметра число, которое указывает, на сколько клеток должен переместиться Робот в указанном направлении. Если число не указано, то Робот сдвигается на одну клетку.

Решение задачи prim_12_1 приведено в примере 12.4. Если задача решена верно, кольцо, изображающее Робота, окрашивается в зеленый цвет (пример 12.5).

Робот может становиться на любую клетку. Робот не может переместиться с клетки на клетку, если они разделены стеной. Робот не может переместиться за границы поля. При попытке выполнить недопустимое действие, Робот изображается красным кругом (пример 12.6). Робот может закрасить уже закрашенную клетку. Такое действие ошибку не вызывает. Если Робот выполнил все команды, но закрасил не все клетки, или закрасил лишние клетки, или оказался не в конечной точке, то он изображается в форме серого круга (пример 12.7).

12.3. Использование алгоритмической конструкции следование для исполнителя Робот

Рассмотрим примеры решения задач для исполнителя Робот.
Пример 12.8. Робот находится на поле размером 3 на 3 клетки. Нужно закрасить все клетки, кроме средней.

робот

Для решения задачи Робот должен выполнить следующий алгоритм:

закрасить, вправо
закрасить, вправо
закрасить, вниз
закрасить, вниз
закрасить, влево
закрасить, влево
закрасить, вверх
закрасить, вверх

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

Пример 12.9. Составить программу для закраски клеток поля Робота по образцу:

Для решения задачи Робот должен выполнить следующий алгоритм:

вниз
закрасить
вправо, вверх
закрасить
вправо, вверх
закрасить
влево на 4 клетки
закрасить
вправо, вниз
закрасить

Пример 12.10. Составить программу для закраски клеток поля Робота по образцу.

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

Алгоритм решения задачи:

вправо на 4 клетки
вверх
влево, закрасить
влево, закрасить
влево, закрасить
влево, закрасить
влево

В примерах 12.8 – 12.10 команды исполнителя Робот выполнялись последовательно, одна за другой, в том порядке, в котором они были записаны. Все приведенные алгоритмы реализованы с использованием алгоритмической конструкции следование.

12.4. Вспомогательные алгоритмы для исполнителя Робот

Пример 12.11. Робот должен закрасить все клетки на поле размером 2 × 4. Но двигаться по прямой линии ему мешают стены, которые нужно обойти.

Алгоритм решения задачи:

закрасить, вниз
закрасить, вправо
закрасить, вверх
закрасить
вправо
закрасить, вниз
закрасить, вправо
закрасить, вверх
закрасить

Если проанализировать алгоритм, то можно заметить, что дважды повторяется последовательность команд, которая закрашивает квадрат из четырех клеток:

закрасить, вниз
закрасить, вправо
закрасить, вверх
закрасить

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

квадрат
вправо
квадрат

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

Пример 12.12. Написать программу для закраски клеток поля Робота по образцу.

В данной задаче Робот должен нарисовать две отдельные фигуры: крест и рамку. Составим два вспомогательных алгоритма: крест и рамка.

Вспомогательный алгоритм крест:

влево
закрасить, влево
закрасить, влево
закрасить
вниз, вправо
закрасить, вверх
закрасить, вверх
закрасить

В качестве вспомогательного алгоритма рамка можно использовать алгоритм решения задачи из примера 12.8. Для перехода от одной фигуры к другой Робот должен сдвинуться на 3 клетки вправо, после рисования рамки Робот должен вернуться в исходную клетку.

Описание основного алгоритма решения задачи:

крест
вправо на 3 клетки
рамка
влево
вниз
робот

Робот на базе трактор  BELARUS-132.

робот

Роботизированный комплекс для пошива обуви на фабрике «Белвест»

робот

Робот-пони для детей.

робот

Робот-кентавр FEDOR для освоения Луны.

робот

Робот-официант в кафе.

Робот

Роботизированная рука в офисе белорусского производителя манипуляторов Rozum Robotics может играть в шашки.

Робототехническое оборудование для инженернотехнических центров

 

Программируемые роботы (конструктор LEGO Education)

В отличие от исполнителя Черепаха, исполнитель Робот не входит в набор стандартных модулей языка Python.
Сегодня можно выбрать несколько разных реализаций Робота этого языка. В учебном пособии использован Робот, разработанный МФТИ.

Пример 12.1. Поле исполнителя Робот с начальной обстановкой.

Пример 12.2. Вызов задачи prim_12_1 из встроенного задачника

Пример 12.3. Выбор команды Робота из выпадающего списка.

Пример 12.4. Решение задачи prim_12_1.

Пример 12.5. Обстановка Робота после выполнения программы:

Пример 12.6. Робот врезался в стену:

Эта ситуация возникнет, если первой командой Робота будет команда move_up().

Пример 12.7. Робот не закрасил одну клетку и не пришел в конечную точку:

Пример 12.8. Программа для Робота.

from pyrob.api import *

@task
def prim_12_8():
      fill_cell()
      move_right()
      fill_cell()
      move_right()
      fill_cell()
      move_down()
      fill_cell()
      move_down()
      fill_cell()
      move_left()
      fill_cell()
      move_left()
      fill_cell()
      move_up()
      fill_cell()
      move_up()

run_tasks()

Результат работы программы:

Другой способ записи программы для Робота:

from pyrob.api import *

@task
def prim_12_8():
      fill_cell(), move_right()
      fill_cell(), move_right()
      fill_cell(), move_down()
      fill_cell(), move_down()
      fill_cell(), move_left()
      fill_cell(), move_left()
      fill_cell(), move_up()
      fill_cell(), move_up()

run_tasks()

Пример 12.9. Программа для Робота.

from pyrob.api import *

@task
def prim_12_9():
      move_down()
      fill_cell()
      move_right(), move_up()
      fill_cell()
      move_right(), move_up()
      fill_cell()
      move_left(4)
      fill_cell()
      move_right(), move_down()
      fill_cell()
      move_right()

run_tasks()

Результат работы программы:

Пример 12.10. Изменение программы для Робота из примера 12.4.

Для более компактной записи можно объединить команды move_left(), fill_cell() в одной строке.

Измененная программа:

from pyrob.api import *

@task
def prim_12_10():
      move_right(4)
      move_up()
      move_left(), fill_cell()
      move_left(), fill_cell()
      move_left(), fill_cell()
      move_left(), fill_cell()
      move_left()

run_tasks()

Результат работы программы:

Пример 12.11. Начальная обстановка.

Программа 1 для исполнителя Робот:

from pyrob.api import *

@task
def prim_12_11():
      fill_cell(), move_down()
      fill_cell(), move_right()
      fill_cell(), move_up()
      fill_cell()
      move_right()
      fill_cell(), move_down()
      fill_cell(), move_right()
      fill_cell(), move_up()
      fill_cell()

run_tasks()

Результат работы программы:

Программа 2 (с использованием вспомогательного алгоритма) для исполнителя Робот:

from pyrob.api import *

@task
def prim_12_11():
      def kvadrat():
            fill_cell(), move_down()
            fill_cell(), move_right()
            fill_cell(), move_up()
            fill_cell()
      kvadrat()
      move_right()
      kvadrat()

run_tasks()

При наборе текста программы обратите внимание на расположение описания вспомогательного алгоритма kvadrat() в программе и правильную расстановку отступов при записи команд. Функция kvadrat() располагается внутри функции prim_12_11, поэтому для всех команд, составляющих тело функции kvadrat() необходим двойной отступ.

Пример 12.12. Программа для исполнителя Робот.

from pyrob.api import *

@task
def prim_12_12():
      def krest():
            move_left()
            fill_cell(), move_left()
            fill_cell(), move_left()
            fill_cell()
            move_down(), move_right()
            fill_cell(), move_up()
            fill_cell(), move_up()
            fill_cell()
      def ramka():
            fill_cell(), move_right()
            fill_cell(), move_right()
            fill_cell(), move_down()
            fill_cell(), move_down()
            fill_cell(), move_left()
            fill_cell(), move_left()
            fill_cell(), move_up()
            fill_cell(), move_up()

      krest()
      move_right(3)
      ramka()
      move_left()
      move_down()

run_tasks()

Результат работы программы:

1. Что такое робот?
2. Какие команды входят в систему команд учебного компьютерного исполнителя Робот?
3. Опишите среду обитания учебного исполнителя Робот?
4. В чем особенность применения алгоритмической конструкции следование?
5. В каких случаях полезно использовать вспомогательные алгоритмы? 

Упражнения

1. Начальная обстановка на поле Робота изображена на рисунке справа. Трое учащихся составили и выполнили алгоритм, по которому Робот закрасил все клетки пути от начальной к конечной. На каком из рисунков – а, б или в – изображено решение этой задачи? Почему?

робот2. Определите какой из приведенных алгоритмов решает задачу, сформулированную в упражнении 1? Объясните, почему другие программы не могут быть алгоритмами решения данной задачи?

робот3. Определите для какого исполнителя приведен алгоритм в упражнении 2, в?

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

4. Предложите другие способы решения задачи из примера 12.9?

5. Для исполнителя Робот была составлена следующая программа:

роботИзобразите в тетради «узор», который нарисует Робот. При каких минимальных размерах поля Робот сможет выполнить данную программу?

6. Все команды в программе из упражнения 4 ученик скопировал три раза. Как изменится «узор» после выполнения программы? Как можно по-другому записать этот алгоритм? Какого размера поле нужно создать? Подсказка. Воспользуйтесь вспомогательным алгоритмом.

7. Программа решения задачи была записана на доске. Два ученика, записывая этот алгоритм для исполнителя Робот, пропустили из-за невнимательности по одной команде из этой программы. Какую команду пропустил каждый из учеников? Что будет результатом работы каждой программы? Проверьте свой ответ на компьютере.

Программа, записанная первым учеником Программа, записанная вторым учеником
from pyrob.api import *
@task
def upr_12_7():
      fill_cell(), move_right()
      fill_cell(), move_right()
      fill_cell(), move_down()
      fill_cell(), move_down()
      fill_cell(), move_down()
      move_left()
      move_down()
      move_left()
      fill_cell(), move_down()
      fill_cell(), move_down()
      fill_cell(), move_right()
      fill_cell(), move_right()
      fill_cell(), move_up()
      fill_cell(), move_up()
      fill_cell(), move_up()
      move_left()
      fill_cell(), move_up()
      move_left()
      fill_cell(), move_up()
      fill_cell(), move_up()run_tasks()
from pyrob.api import *
@task
def upr_12_7():
      fill_cell(), move_right()
      fill_cell(), move_right()
      fill_cell(), move_down()
      fill_cell(), move_down()
      fill_cell(), move_down()
      move_left()
      fill_cell()
      move_left()
      fill_cell(), move_down()
      fill_cell(), move_down()
      fill_cell(), move_right()
      fill_cell(), move_right()
      fill_cell(), move_up()
      fill_cell(), move_up()
      fill_cell(), move_up()
      move_left()
      fill_cell(), move_up()
      move_left()
      fill_cell(), move_up()
      fill_cell(), move_up()run_tasks()

8. Составьте программу для решения задачи upr_12_8. Реализуйте два алгоритма: один с использованием алгоритмической конструкции следование, другой – с использованием вспомогательного алгоритма. Сравните решения.