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 команды исполнителя Робот выполнялись последовательно, одна за другой, в том порядке, в котором они были записаны. Все приведенные алгоритмы реализованы с использованием алгоритмической конструкции следование.
|
|
 Робот на базе трактор 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() |
Результат работы программы:

|