Конечные автоматы
Проект: Робот-пылесос
Роботы-пылесосы
Автономные роботы-пылесосы, как правило, имеют несколько специфических режимов работы. В этом проекте вы смоделируете работу робота-пылесоса, который имеет четыре режима:
- Выключен,
- Уборка,
- Парковка,
- Зарядка.
Переключение между этими режимами задается определенными правилами. Например, пылесос можно отключить во время уборки, но он не может перейти от уборки к зарядке без предварительной парковки.
Вы можете моделировать режимы и правила перемещения между ними, используя конечные автоматы. Представьте, что вы инженер, которому поручено разработать логику управления роботом-пылесосом.
Требования к конструкции робота-пылесоса
К роботу-пылесосу предъявляются следующие конструктивные требования:
- Он может находиться в четырех режимах: выключен, уборка, парковка и зарядка.
- Пользователь может вручную включить режимы выключения, уборки и парковки.
- Зарядка начинается сразу после завершения парковки.
- После зарядки робот выключается.
- Аккумулятор разряжается с заданной скоростью в любое время, когда робот движется (в режиме уборки или парковки), и заряжается с другой скоростью, находясь в режиме зарядки.
- Робот автоматически переключается с режима уборки на режим парковки при двух условиях: если во время уборки уровень заряда аккумулятора опустится ниже 30% или когда уборка будет завершена.
- При низком заряде аккумулятора режим уборки не может быть включен.
Эти правила будут предоставляться вам повторно по мере необходимости для выполнения каждого задания, поэтому вам не нужно их запоминать или копировать.
Практическая часть
✏️Задание 1
- Откройте модель
Модель 6_Начало.ngscript.

- Войдите внутрь блока Chart. Добавьте на диаграмму 4 состояния:
Off(выключен)Vacuum(уборка)SeekDock(парковка)Charge(зарядка).
Переход по умолчанию должен вести в состояние Off.
Решение
Когда пользователь включает режим выключения, уборки или парковки, это действие обрабатывается как входной сигнал requestMode. Он может принимать три значения:
-1– Выключение,1– Парковка,2– Уборка.
Пользователь может запросить следующие переходы:
- в режим
Offкак из режимаVacuum, так и из режимаseekDock; - в режимы
VacuumиseekDockиз режимаOff; - в режим
seekDockиз режимаVacuum.
✏️Задание 2
- Создайте соответствующие переходы и добавьте условия, описывающие переходы между состояниями
Off,VacuumиSeekDockв зависимости от действий пользователя.
Например, робот должен перейти из состояния Off в состояние Vacuum, если requestMode == 2.
- В окне настроек диаграммы состояний озадайте переменную
requestModeв качестве входного сигнала.
Решение
Запросы, вводимые пользователем, сохраняются в переменной requestMode. Однако модель Engee должна также знать текущий режим работы. Текущий режим может отличаться от запроса пользователя, например, если заряд батареи слишком низкий для продолжения уборки. Таким образом, вам нужно будет задать значения выходных данных с использованием действий entry.
✏️Задание 3
- Добавьте действие
entryв каждое состояние для описания текущего режима работыdriveMode:
- Для состояний
OffиCharge–driveMode = 0; - Для состояния
seekDock–driveMode = 1 - Для состояния
Vacuum–driveMode = 2;
- В окне настроек диаграммы состояний задайте переменную
driveModeв качестве выходного сигнала.
Решение
В дополнение к режимам, задаваемым пользователем, робот также автоматически меняет режим работы, когда текущая задача выполнена. Модель Engee посылает сигнал complete, когда робот заканчивает уборку или находит станцию.
✏️Задание 4
-
Добавьте условие
complete == 1для перехода из состоянияVacuumв состояниеseekDock(соедините его оператором ИЛИ||с уже имеющимся условием на этом переходе), а также из состоянияseekDockвCharge. Для этого вам нужно будет добавить новый переход из состоянияseekDockвCharge. -
В окне настроек диаграммы состояний задайте переменную
completeв качестве входного сигнала.
Решение
Батарея разряжается во время движения робота, т.е. в состояниях Vacuum и seekDock. В состоянии Charge батарея заряжается.
Для этого проекта вы будете пользоваться упрощенной моделью линейной разрядки и зарядки батареи. Для описания заряда батареи вам потребуется новая локальная переменная SOC (state of charge).
✏️Задание 5
- Добавьте действия
duringв соответствующие состояния для моделирования состояния батареи:
- Если батарея разряжается, то
SOC = SOC - 1e-5;. - Если батарея заряжается, то
SOC = SOC + 2e-5;.
- В окне настроек диаграммы состояний задайте переменную
SOCв качестве локальной переменной. Задайте начальное значение переменнойSOCравным 100.
Решение
Величина заряда батареи также влияет на поведение робота.
- Во-первых, робот автоматически начинает искать зарядную станцию (т.е. перейдет в состояние
seekDock), если во время уборки заряд батареи упадет ниже 30%. - Во-вторых, зарядка считается завершенной, если заряд батареи достигает 97%. После завершения зарядки робот выключается.
✏️Задание 6
Добавьте следующие условия для сответствующих переходов (вам нужно будет создать новые и модифицировать существующие переходы):
- Заряд батареи менее 30% (
SOC < 30). - Зарядка завершена (
SOC >= 97).
Решение
✏️Задание 7
- Перейдите в основную модель. Соедините выходы двух блоков Из рабочей области с соответствующими входами блока Chart, а выход блока Chart – со входом блока Выход1.
- Выполните следующую кодовую ячейку, в которой формируются входные сигналы
requestModeиcompleteдля конечного автомата.
using DataFrames
T = 500
t = 1.0:T
d = zeros(T)
d[1] = 2
df = DataFrame(time = t, value = d)
requestMode = WorkspaceArray(string(rand()), df)
c = zeros(T)
c[400] = 1
c[420] = 1
dc = DataFrame(time = t, value = c)
complete = WorkspaceArray(string(rand()), dc)
- Залогируйте выходной сигнал блока Chart.
- Запустите симуляцию модели и постройте график выходного сигнала
driveMode.
Решение
Модель:

График выходного сигнала: