Что, в общих словах, можно сказать про робота, который выполняет какую-то программу? Если, например, в момент начала наблюдения, робот едет? Ответ, лежащий на поверхности, – робот двигается. Но, очевидно, этот же ответ не подойдет как общий для того момента времени, когда робот стоит. |
Таким образом, поведение робота – это череда его состояний. Например, движение по квадрату – сначала робот в состоянии движения прямо, затем, в состоянии поворота налево, которое сменяется опять, состоянием движения прямо и т.д.
Что заставляет робота изменить свое состояние? Если рассматривать пример про движение по квадрату, то смена одного состояния на другое происходит после прохождения всем роботом определенной дистанции, в случае движения прямо, или после прохождения определенной дистанции одним колесом, в случае поворота. Здесь, в обоих случаях, пройденная дистанция определяется сенсором поворота оси двигателя. Иначе можно сказать, что робот сменил направление движения (состояние) после наступления определенного события на сенсоре поворота, в данном случае событие – сигнал от сенсора о достижении определенного угла поворота оси.
Теперь, если взглянуть на всю программу в целом, то она будет выглядеть как изменение состояния робота в зависимости от наступившего события.
Как же эта диаграмма будет отображена в программу на NXT-G? Например, так:
Как видно, программа состоит из блоков движения. Но где же тогда в данной программе обработчики событий?
Дело в том, что каждый блок движения, в котором явно задается количество необходимого движения в градусах, поворотах или секундах, содержит уже обработчик, направленный на определение возникновения перечисленных выше событий:
Иначе, такой блок можно было бы описать целой последовательностью:
"Ехать бесконечно до тех пор, пока ось мотора не сделает поворот в 720 градусов":
Или более сложный вариант, раскрывающий, что же действительно подразумевается под блоком "Wait":
Как показывает этот довольно простой пример, даже самая простая программа состоит из череды состояний и ожиданий событий. Любая.
Будь то просто вывод на экран: состояние вывода на экран букв текста, пока не наступит событие "конец текста", или сложная программа игры в крестики-нолики.
Причем со сложными программами дело обстоит гораздо интереснее. Сложную программу можно сначала разбить на большие блоки состояние-действие, которые бы сменяли друг друга по наступлению каких-либо событий. В свою очередь, каждый блок можно было бы разделить на маленькие подблоки со своими событиями. И так далее.
Пример, все те же "Крестики-Нолики".
Крупные блоки:
Тогда блок "Выполнить ход робота", возможно представить в виде подблоков:
Здесь, уже каждый подблок может быть представлен в виде конкретных действий языка NXT-G.
Важно также отметить, что переходы из одного и того же состояния, при разных событиях, могут быть разные.
Например, робот ищет выход из лабиринта с помощью обхода по принципу правой руки.
Как видно из схемы, существуют три разных события, на которые может реагировать робот в состоянии движения прямо:
- если справа все еще есть стена, продолжать движение прямо
- если справа стена закончилась, перейти в состояние выполнения разворота вправо
- если робот уперся в препятствие, перейти в состояние выполнения разворота влево
Вывод: каждая программа состоит из череды состояний-действий и событий, определяющих чередование состояний. В то время как маленькие программы сразу состоят из неделимых состояний-действий, большие программы могут быть описаны в виде больших блоков - макро-состояний, переход к которым выполняется тоже при определении возникновения какого-то события. Макро-состояния в свою очередь могут разбиваться на подблоки, "связанные" своими состояниями и т.д.
Комментариев нет:
Отправить комментарий