Добавление ограничений в 2D-модель
Для подготовки упражнений для учеников существует возможность внесения ограничений с помощью редактирования XML-файла.
Ограничения бывают трех видов:
Временны́е. Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.
Пространственные. Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.
Ограничения на устройства. Например, ограничение на набор датчиков или на поведение устройств.
Структура написания ограничений
Для описания ограничений используется главный тег <constraints>…</constraints>
, в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:
Тег | Описание |
Временное ограничение. | |
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. | |
Основной инструмент задания динамических ограничений. Используется как контейнер. | |
Безусловное событие, выполняющееся перед началом выполнения программы. |
<constraints>...</constraints>
Основной тег, в который вписываются все ограничения. Используется как контейнер.
<timelimit/>
Временное ограничение. Является обязательным.
Атрибуты
Атрибут | Описание |
value="значение" | Количество миллисекунд, через которое исполнение будет прекращено и выдана ошибка «Превышен лимит времени». |
Синтаксис
<constraint>...</constraint>
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег: <conditions>...</conditions>
.
Атрибуты
Атрибут | Описание |
checkOnce="true" | Логический атрибут. Если в значении стоит true, то ограничение будет проверено 1 раз при старте программы и больше проверяться не будет. Полезно, например, если нужно 1 раз проверить, что датчики расставлены верно, а дальше во время исполнения ничего не поменяется. |
failMessage="Ошибка!" | Сообщение об ошибке, которое будет показано при нарушении ограничения. |
Синтаксис
<event>...</event>
Основной инструмент задания динамических ограничений. Используется как контейнер.
Событие - это просто пара (условие, триггер).
Атрибуты
Атрибут | Описание |
settedUpInitially="true" | Атрибут, позволяющий указать взведено ли событие при старте программы. Событие может быть взведено или спущено (setted up и dropped). Во взведенном состоянии событие выполняет свой триггер по выполнению своего условия, в спущенном оно просто игнорируется системой. Значение по умолчанию — false. |
id="finish checker" | Уникальный идентификатор события. По этому идентификатору можно обращаться к данному событию из других. Опциональный. |
dropsOnFire = "true" | Логический атрибут, который указывает, продолжать ли быть событию взведенным после его срабатывания или нет. Опциональный. Значение по умолчанию -- true. |
Синтаксис
<init>...</init>
Безусловное событие, выполняющееся перед началом выполнения программы.
Пример
Условия
Теперь обсудим, какими могут быть условия в элементах <constraint> и <event>. Условия задаются с помощью тега <condition> в случае, если проверяется только одно из атомарных условий, или тега <conditions>, если проверяется составное условие.
<condition>...</condition>
Внутри этого тега описывается проверяемое условие.
Пример
<conditions>...</conditions>
Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть and
или or
. Отрицание выражения задается тегом <not>
без атрибутов. Среди подвыражений могут также встречаться другие элементы <conditions>.
Атрибуты
Атрибут | Описание |
glue="and" | Логическая связка. |
Синтаксис
Атомарные условия
Атомарное условие представляет собой один из следующих элементов:
Тег | Описание |
Операции сравнения значений. | |
Позволяет задавать пространственные ограничения. | |
Позволяет проверить, взведено событие или нет. | |
Позволяет задать время в мс, после которого данное условие считается истинным. |
<equals>...</equals>
Равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Синтаксис
<notEqual>...</notEqual>
Не равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Синтаксис
<greater>...</greater>
Больше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Синтаксис
<less>...</less>
Меньше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Синтаксис
<inside/>
Позволяет задавать пространственные ограничения.
Атрибуты
Атрибут | Описание |
objectId="id" | id взятого объекта. |
regionId="id" | id взятого региона. |
objectPoint="center|all|any" | Осуществляет проверку того, что: center — центр объекта находится в зоне, all — все точки объекта находятся в зоне, any — хоть какая-то точка объекта находится в зоне |
Синтаксис
<settedUp/> и <dropped/>
Позволяет проверить, взведено событие или нет.
Атрибуты
Атрибут | Описание |
id="event1" | Идентификатор проверяемого события |
Синтаксис
Пример
В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.
<timer/>
Предикат, который начинает выдавать true, когда с момента взведения данного события прошло заданное время, а до этого момента выдает false.
Атрибуты
Атрибут | Описание |
timeout="1000" | Промежуток времени, через которой данный предикат станет истинным. Обязательный, значение должно быть неотрицательным и целочисленным. |
forceDropOnTimeout="true" | Логический атрибут, позволяющий опустить событие, которое имеет в условии данный таймер. Если выставлен в true, событие будет опущено даже при наличии других активных таймеров и невыполненных условий. Опциональный. Значение по умолчанию -- true |
Синтаксис
Пример
Рассмотрим использование <timer/> c различными значениями атрибута forceDropOnTimeout .
В событии “check region” проверяются временное и пространственное ограничения. Первое условие (timer) становится истинным спустя 1000мс, а до этого момента ложно. После этого его значение больше не изменяется. Второе условие (inside) проверяет, что робот находится в регионе с id=”start_zone”. В тот момент, когда оба этих условия будут выполнены одновременно, программа будет выполнена успешно.
1. Т. к. атрибут forceDropOnTimeout равен "false", то после заданного количества времени событие будет продолжать оставаться взведенным и ждать выполнения второго условия.
2. Т. к. атрибут forceDropOnTimeout равен "true", то после заданного количества миллисекунд событие будет опущено, несмотря на наличие .другого условия. Таким образом, если в момент времени 1000 мс робот не находится в нужном регионе, то сообщение об успешном выполнении не будет выведено даже в случае, если робот окажется там спустя некоторое время.
Типы переменных и арифметические операции
Переменная | Описание |
Целочисленная, дробная, строковая и логическая константы. | |
Значение переменной. | |
Взять состояние объекта. | |
Взять метатип объекта с заданным идентификатором. | |
Унарные арифметические функции, имеют ровно 1 дочерний элемент, значение которого должно быть целочисленным. | |
Бинарные арифметические функции, имеют ровно 2 дочерних элемента, значение каждого из которых должно быть целочисленным. |
<int/>, <double/>, <string>, <bool/>
Задание константы.
Атрибуты
Атрибут | Описание |
value="0″ | Значение заданной константы. |
Синтаксис
<variableValue/>
Значение переменной.
Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.
Атрибуты
Атрибут | Описание |
name="my_value" | Имя переменной |
Синтаксис
<objectState/>
Взять состояние объекта.
Атрибуты
Атрибут | Описание |
object="robot1.display.labels.size" | id взятого объекта. |
Синтаксис
Пример
<typeOf/>
Взять метатип объекта с заданным идентификатором. Например: если взять typeOf
объекта wall
с id=777
, то он вернет, что тип этого объекта wall
.
Чаще всего этот элемент будет нужен для проверки типа подключенных датчиков и моторов.
Атрибуты
Атрибут | Описание |
objectId="id" | Уникальный идентификатор взятого объекта. |
Синтаксис
<minus>..</minus>, <abs>...</abs>
Унарные арифметические операции отвечающие за изменение знака и взятие модуля числа.
Синтаксис
Пример
<sum>, <difference>, <min>, <max>
Сумма и разность значений. Минимальное и максимальное значение.
Пример
Триггеры
Тег | Описание |
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события. | |
Показать ошибку пользователю, завершить проверку задания. | |
Показать пользователю сообщение об успешном прохождении задания и завершить проверку. | |
Установить значение переменной. | |
Взводит или опускает событие | |
Выводит текст |
<trigger>...</trigger>
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.
Синтаксис
<fail/>
Показать ошибку, завершить проверку задания.
Атрибуты
Атрибут | Описание |
message="Неверный ответ!" | текст выведенной ошибки |
Синтаксис
<success/>
Задание успешно пройдено.
Атрибуты
Атрибут | Описание |
deffered="false" | Опциональный. По умолчанию равен "false". При выставлении его в true данный триггер не остановит выполнение программы, т. е. чекер дождется конца программы и, либо скажет, что программа выполнена успешно, если ошибок не было, либо выпадет с ошибкой в противном случае. Другими словами атрибут deferred не позволяет получить ошибку "Программа закончилась, но задание не выполнено": программа либо завершится с успехом, либо с содержательной ошибкой типа "Превышен лимит времени". |
Синтаксис
<setter>...</setter>
Установить значение переменной
Атрибуты
Атрибут | Описание |
name="my_value" | Название переменной |
Пример
<setUp/>, <drop/>
Взводит или опускает событие
Атрибуты
Атрибут | Описание |
id="finish checker" | id выбранного события |
Пример
<message/>
Выводит текст в консоль
Атрибуты
Атрибут | Описание |
text="Hello, world!" | Необходимый текст |
Названия датчиков
Датчики для робота TRIK
Название | Описание |
twoDModel::robotModel::parts::RangeSensor | Датчик расстояния |
trik::robotModel::twoD::parts::TwoDLightSensor | Датчик освещенности |
twoDModel::robotModel::parts::TouchSensor | Датчик касания |
trik::robotModel::twoD::parts::LineSensor | Датчик линии |
Датчики для робота Lego EV3
Название | Описание |
twoDModel::robotModel::parts::RangeSensor | Датчик расстояния |
twoDModel::robotModel::parts::LightSensor | Датчик освещённости |
twoDModel::robotModel::parts::TouchSensor | Датчик касания |
twoDModel::robotModel::parts::ColorSensorRed | Датчик цвета (красный) |
twoDModel::robotModel::parts::ColorSensorGreen | Датчик цвета (зеленый) |
twoDModel::robotModel::parts::ColorSensorBlue | Датчик цвета (синий) |
twoDModel::robotModel::parts::ColorSensorPassive | Датчик цвета (пассивный) |
twoDModel::robotModel::parts::ColorSensorFull | Датчик цвета EVX/NXT (цвет) |
twoDModel::robotModel::parts::ColorSensorAmbient | Датчик цвета EV3 (рассеянный) |
ev3::robotModel::twoD::parts::GyroscopeSensor | Гиродатчик |
ev3::robotModel::twoD::parts::GyroscopeSensor | Компас |
Дополнительные свойства робота
Свойство | Описание |
robot1.rotation | Позволяет узнать текущий угол поворота робота |
robot1.x и robot1.y | Позволяет узнать координаты робота |
robot1.led.color | Позволяет узнать цвет диода |
robot1.marker.isDown | Проверяет, что у робота установлен маркер и он рисует линию на поле. Возвращает значения true или false |
robot1.shell.lastPhrase | Узнать текст, который сказал робот |
Работа с экраном контроллера
Свойство | Описание |
robot1.display.sadSmiles | Проверяет, что на экране контроллера установлен грустный смайлик. Возвращает значение true или false. |
robot1.display.smiles | Проверяет, что на экране контроллера установлен веселый смайлик. Возвращает значение true или false. |
robot1.display.labels.first.text | Текст сообщения (label), которое было выведено на экран первым. |
robot1.display.labels.last.text | Тест сообщения (label), которое было выведено на экран последним. |
robot1.display.labels.size | Узнать количество label-ов, выведенных на экран. |
Пример
Проверяем, что на экран контроллера было выведено слово “сообщение”. Регистр слова важен.
Пример добавления ограничений
Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.
Last updated