Состояния
В этом модуле мы переходим к изучению языка программирования машин состояний. Самый первый элемент, который мы изучим, — это состояние. Машина состояний — это, по сути, множество возможных состояний и правила перехода между ними
Методист образовательных программ «Программирование киберфизических систем»
Анита Ходова
Что такое состояние?
Состояние — это режим работы системы, в котором совершаются какие-то определенные действия. В «Защите пасеки» дрон может находиться в одном из нескольких состояний: искать противника, атаковать его и т. п. Мы сталкиваемся с состояниями и у окружающих нас приборов: режимы работы есть у стиральной машины, а ноутбук может переходить в спящий режим
В каждый момент времени программа может находиться только в одном состоянии. Состояния могут меняться в зависимости от той ситуации, в которой находятся дрон или ноутбук. Машина состояний, как автомат, переключается между состояниями при возникновении определенных событий. Такой подход к программированию называется событийным.
В прошлом модуле мы создавали в «Защите пасеки» программу с отступающим «Степлером». Рассмотрим, какие состояния может принимать запрограммированный так дрон. На диаграмме машины состояний состояние изображается в виде прямоугольника со скругленными или срезанными краями. Каждое состояние имеет заголовок с именем.
В данной программе есть четыре таких прямоугольника:
«Скан», «Бой», «Сближение»
«Атака».
и
Начальные состояния отмечаются точкой со стрелкой: выполнение этой программы начинается со входа в состояние
Это четыре возможных состояния.
«Скан».
Внутри каждого из этих состояний могут быть описаны возможные события и команды, которые реализуются только в данном состоянии. Например, в состоянии «Скан» дрон ищет ближайшего к себе противника. Если противник найден, дрон переходит в состояние «Сближение» и начинает двигаться к противнику. Как только противник заходит в зону действия оружия, дрон переходит в состояние «Атака» и начинает атаковать противника, одновременно отступая, так как мы добавили эту функцию в изначальную программу.
Рассмотрим еще один пример не из «Защиты пасеки» — программу микроволновки с грилем. В этой программе также четыре состояния: «нагрев», «поджаривание», «выпекание» и «дверца_открыта». В этой диаграмме начальным состоянием будет «нагрев», сразу после входа в которое машина состояний перейдет в состояние «поджаривание». Если дверца будет открыта и произойдет соответствующее событие, нагреватель будет отключен в целях безопасности. Обратите внимание, что состояния «поджаривание» и «выпекание» находятся внутри состояния «нагрев», что называется иерархией состояний. Это значит, что «нагрев» является родительским состоянием, а «поджаривание» и «выпекание» — его дочерними состояниями. Когда машина состояний находится в дочернем состоянии, она одновременно с этим находится и в его родительском состоянии.
Иерархия состояний
Рассмотрим еще один пример иерархической машины состояний — программу умной теплицы. В диаграмме описаны два родительских состояния, или макросостояния: «День» и «Ночь». Эти состояния содержат дочерние состояния. Так, состояние «День» содержит состояния «Умеренно» и «Жарко». В состоянии «День» контроллер теплицы мониторит температуру и в зависимости от показаний термометра переключается между дочерними состояниями, которые связаны с выполнением соответствующих команд: в состоянии «Умеренно» нужно открыть форточку наполовину и выключить вентилятор, а в состоянии «Жарко» — открыть форточку целиком и включить вентилятор. Аналогичным образом контроллер теплицы меняет дочерние состояния ночью, опираясь на показания уровня влажности.
Напомним, что, находясь в дочернем состоянии, машина состояний одновременно продолжает находиться и в родительском. Поэтому последовательность состояний контроллера теплицы может выглядеть примерно так:
«День::Умеренно» → «День::Жарко» → «День::Умеренно» → «День::Жарко» → «День::Умеренно» → «Ночь::Ожидание» → «Ночь::Полив» → «Ночь::Ожидание» → «День::Умеренно» → …
Отладка
При программировании машин состояний важно понимать, в каком состоянии система находится в каждый момент времени. В «Защите пасеки» для этого можно использовать индикатор — модуль «Светодиод».
«Атака»
Задача
включался зеленый индикатор (светодиод),
а при переходе в состояние
— красный индикатор
Измените базовую программу дрона таким образом, чтобы при нахождении его в состоянии
«Скан»
Разбор решения
Для этого нужно при входе в состояние выполнить команду «Включить ()» модуля «Светодиод», выбрав нужный цвет в качестве параметра. А при выходе из состояния выполнить команду «Выключить ()» модуля «Светодиод». Не забывайте выключать светодиод для корректной работы программы! На рисунке показано, как может выглядеть в игре отслеживание состояния дрона с помощью светодиодов специальных цветов.

Такой подход часто применяется в программировании и называется отладкой. Отладка программы (debugging) — это отслеживание того, что именно делает программа, чтобы убедиться, что она работает так, как задумал программист. Фактически так мы приводим в соответствие наши идеальные представления о работе программы и ее реальное исполнение. В следующих частях курса и при решении более сложных задач мы предлагаем использовать это в работе.
Имена состояний
В программах, которые мы рассматривали, все состояния имели имена. В машинах состояний это обязательное требование, ведь с помощью имен мы можем отличать состояния друг от друга по смыслу. Имена можно присваивать во всех развитых языках программирования: давать их функциям, переменным, объектам. Это одно из самых фундаментальных отношений в программировании — между «что это» и «как оно работает», которое один из основателей информатики Э. Дейкстра называл «колебанием между „представлением” и „тем, что за ним стоит”». Имя переменной или состояния в машине состояний и лежащий за ней смысл — это простейшая модель той реальности, которую программист скрывает за этим именем. Так, имя состояния «Скан» или «День» подразумевают определенное поведение виртуальной или реальной системы при нахождении в этом состоянии.
В машине состояний имена на каждом уровне иерархии должны быть уникальными. Это не просто требования стандарта, это способ держать программу в ясности, иметь возможность понять логику ее работы с одного взгляда. Поэтому в «Защите пасеки» мы настоятельно рекомендуем менять имена у вновь созданных состояний со стандартного «Состояние» на то имя, которое лучше всего характеризует работу дрона в новом состоянии.
Комментарий для педагога
Выделим наиболее важные для педагога моменты. Модуль был посвящен базовому для машин состояний понятию — состоянию. Состояние — это, с одной стороны, часть диаграммы, которая имеет цифровое (вершина графа) или материальное (прямоугольник на бумаге) воплощение. Но для нас важно, что состояние — это идеальное представление, описывающее какую-то работу, этап управления системой.
Управление дронами связано с их действием в игре. Программисту необходимо видеть и удерживать эту связь между идеальным представлением состояния и его воплощением в виде действий дрона в игре
Как возникает идеальное представление? В языках программирования самый простой способ моделирования реальности — выбор названия переменной или функции. Это установление отношения между элементом программы и ожидаемыми действиями программы по отношению к реальному миру, на который воздействует программа. Таким образом, переменная удерживает идеальные представления о мире, которые найдут свое воплощение в ходе применения программы. Так же мы поступаем и при именовании состояний в машине состояний.
Для того чтобы дать имя состоянию, нужно представить всю работу дрона, его «жизненный цикл» в реальном или виртуальном мире, процесс управления дроном, а затем выделить в нем какую-то смысловую часть. Эта часть и станет именованным состоянием. При этом можно опираться на разные основания выделения состояний, например:
  • Состояние — это внутреннее качество дрона («подбит», «отремонтирован» и т. п.)
  • Состояние — это текущие действия дрона («скан», «бой»)
  • Состояние — это направленность дрона на что-то в будущем («в ожидании», «готовность»)
  • И другие представления
При любом выбранном подходе мы, как программисты, должны быть уверены, что при нахождении машины состояний дрона в конкретном состоянии дрон имеет этот режим работы, выполняет именно то, что от него ожидается в этот момент.
Методист образовательных программ «Программирование киберфизических систем»
Анита Ходова
Игра «Защиты пасеки» позволяет постоянно переключаться между виртуальным миром с действующими дронами и программой, тем самым видеть эту связь или создавать ее, фактически многократно проходить цикл, о котором мы говорили в первой главе: управление → моделирование → программирование → управление → …
Как обеспечить выход учащихся на такую работу с идеальным? Для этого потребуется выделить три режима совместной работы (индивидуально или в командах):
  • Программирование и управление — создание программ и их верификация в виртуальном мире (работа за компьютером, в игре)
  • Схематизация — размышления и внутренние обсуждения в случае командной работы, фиксация результатов на нарисованных схемах (работа с рисунками и схемами)
  • Обсуждение версий — сравнение схем разных участников, обнаружение различий и обобщение (общая работа с единой доской и пространством коммуникации)
Каждый из этих режимов работы должен контролировать педагог. В программировании нужно создать акцент на содержании и способе создания программ, по отдельности консультировать участников в трудных моментах. В схематизации — помогать удержать, выразить собственную мысль, выбрать способ ее обозначения. В обсуждении версий — создать общее пространство не критики, но понимания и удержания сложности, в т. ч. за счет специальных вопросов к предложенным вариантам схем участников
Это значит, что одновременно с самим программированием в этом курсе мы будем учиться способам формулирования идей и моделирования, выражения мысли, рисования схем и обсуждения различных взглядов на систему и ее управление. Это и формирует подлинные способности и культуру будущего программиста.

Запишитесь на курс, чтобы выполнять задания и получить сертификат!

Программирование автономных систем на примере игры «Берлога: Защита пасеки»
Курс о том, как с помощью простых инструментов научиться программировать поведение автономных агентов. Вы увидите, как игровые дроны подчиняются коду и как эти же принципы применимы к роботам в реальной жизни.
  • Что вы получите
    • 12 уроков с разбором заданий прямо в игре
    • Авторская подача: сложное программирование простым языком
    • Возможность осмыслить педагогические методики, применяемые в каждой теме
    • Свободное расписание: нет дедлайнов и сроков сдачи заданий
    • Все материалы доступны сразу, можно начать обучение в удобное время
    • Проверочные задания после каждого урока
    • Профессиональное видео и современная графика
    • Быстрая связь с техподдержкой
    • Сертификат о прохождении курса
  • Зачем
    • Научиться и научить программировать через игру
    • Освоить язык ПРИМС — инструмент для создания умных и понятных алгоритмов
    • Разобраться, как работают современные киберфизические системы
    • Научиться строить управление: от простых реакций до сложных сценариев поведения
    • Получить готовую методику проведения занятий: с пояснениями, примерами и игровыми задачами
    • Сделать первый шаг к проектной работе с настоящими роботами и автономными системами
Находясь на сайте, вы даете согласие на обработку файлов cookie. Это необходимо для более стабильной работы сайта
OK