Comment on page
Добавление ограничений в 2D-модель
Для подготовки упражнений для учеников существует возможность внесения ограничений с помощью редактирования XML-файла.
Ограничения бывают трех видов:
- 1.Временны́е. Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.
- 2.Пространственные. Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.
- 3.Ограничения на устройства. Например, ограничение на набор датчиков или на поведение устройств.
Для описания ограничений используется главный тег
<constraints>…</constraints>
, в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:Тег | Описание |
Временное ограничение. | |
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. | |
Основной инструмент задания динамических ограничений. Используется как контейнер. | |
Безусловное событие, выполняющееся перед началом выполнения программы. |
Основной тег, в который вписываются все ограничения. Используется как контейнер.
<constraints>
<!-- Временное ограничение -->
<timelimit value="30000"/>
<!-- Ограничение с условием. При нарушении условия будет выдана ошибка -->
<constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Инициализация переменной x со значением 2 -->
<init>
<setter name="x">
<int value="2"/>
</setter>
</init>
</constraints>
Временное ограничение. Является обязательным.
Атрибут | Описание |
value="значение" | Количество миллисекунд, через которое исполнение будет прекращено и выдана ошибка «Превышен лимит времени». |
<timelimit value="35000"/>
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег:
<conditions>...</conditions>
.Атрибут | Описание |
checkOnce="true" | Логический атрибут. Если в значении стоит true, то ограничение будет проверено 1 раз при старте программы и больше проверяться не будет. Полезно, например, если нужно 1 раз проверить, что датчики расставлены верно, а дальше во время исполнения ничего не поменяется. |
failMessage="Ошибка!" | Сообщение об ошибке, которое будет показано при нарушении ограничения. |
<constraint checkOnce="true" failMessage="Робот должен находиться на старте перед запуском!">
<!-- Проверяет при запуске, что на порту А1 установлен инфракрасный датчик расстояния -->
<constraint checkOnce="true" failMessage="У робота должен быть установлен инфракрасный датчик расстояния на порту А1">
<equals>
<typeOf objectId="robot1.A1"/>
<string value="twoDModel::robotModel::parts::RangeSensor"/>
</equals>
</constraint>
<!-- Проверяет, что робот находится в допустимом регионе на протяжении всего времени выполнения программы -->
<constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
Основной инструмент задания динамических ограничений. Используется как контейнер.
Атрибут | Описание |
settedUpInitially="true" | Атрибут, позволяющий указать взведено ли событие при старте программы. Событие может быть взведено или спущено (setted up и dropped). Во взведенном состоянии событие выполняет свой триггер по выполнению своего условия, в спущенном оно просто игнорируется системой. Значение по умолчанию — false. |
id="finish checker" | Уникальный идентификатор события. По этому идентификатору можно обращаться к данному событию из других. Опциональный. |
dropsOnFire = "true" | Логический атрибут, который указывает, продолжать ли быть событию взведенным после его срабатывания или нет. Опциональный. Значение по умолчанию -- true. |
<event id="finish checker" settedUpInitially="false">
<condition>
<inside objectId="robot1" regionId="finish"/>
</condition>
<trigger>
<success/>
</trigger>
</event>
Безусловное событие, выполняющееся перед началом выполнения программы.
<!-- Перед началом выполнения программы заводим переменную "my_value" со значением два -->
<init>
<setter name="my_value">
<int value="2"/>
</setter>
</init>
Теперь обсудим, какими могут быть условия в элементах <constraint> и <event>. Условия задаются с помощью тега <condition> в случае, если проверяется только одно из атомарных условий, или тега <conditions>, если проверяется составное условие.
Внутри этого тега описывается проверяемое условие.
<condition>
<!-- Внутри тега описано условие равенства двух значений -->
<equals>
<objectState object="robot1.display.smiles"/>
<bool value="true"/>
</equals>
</condition>
Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть
and
или or
. Отрицание выражения задается тегом <not>
без атрибутов. Среди подвыражений могут также встречаться другие элементы <conditions>.Атрибут | Описание |
glue="and" | Логическая связка. |
<conditions glue="and">
<!-- Условие1 -->
<!-- Условие2 -->
<!-- ... -->
<!-- УсловиеN -->
</conditions>
<conditions glue="and">
<not>
<!-- Условие1 -->
</not>
</conditions>
<conditions glue="and">
<timer timeout="1000" forceDropOnTimeout="true"/>
<conditions glue="or">
<greater>
<objectState object="robot1.display.labels.size"/>
<int value="20"/>
</greater>
<less>
<objectState object="robot1.display.labels.size"/>
<int value="19"/>
</less>
</conditions>
</conditions>
Атомарное условие представляет собой один из следующих элементов:
Равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
<equals>
<objectState object="robot1.display.labels.first.text"/>
<string value="finish"/>
</equals>
Не равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
<notEqual>
<objectState object="robot1.display.labels.first.text"/>
<string value="finish"/>
</notEqual>
Больше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
<greater>
<objectState object="robot1.display.labels.size"/>
<int value="0"/>
</greater>
Меньше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
<less>
<objectState object="robot1.display.labels.size"/>
<int value="10"/>
</less>
Позволяет задавать пространственные ограничения.
Атрибут | Описание |
objectId="id" | id взятого объекта. |
regionId="id" | id взятого региона. |
objectPoint="center|all|any" | Осуществляет проверку того, что: center — центр объекта находится в зоне,
all — все точки объекта находятся в зоне,
any — хоть какая-то точка объекта находится в зоне |
<!-- Задаем ограничение на то, что объект робот находится в регионе с id=”start” -->
<inside objectId="robot1" regionId="start"/>
Позволяет проверить, взведено событие или нет.
Атрибут | Описание |
id="event1" | Идентификатор проверяемого события |
<!-- Условие, что событие с id=”event1” взведено -->
<condition>
<settedUp id="event1"/>
</condition>
<!-- Условие, что событие с id=”event2” опущено -->
<condition>
<dropped id="event2"/>
</condition>
В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.
<event id="check event" settedUpInitially="true">
<conditions glue="and">
<settedUp id="Try move"/>
<dropped id="Go back"/>
</conditions>
<trigger>
<success/>
</trigger>
</event>
Предикат, который начинает выдавать true, когда с момента взведения данного события прошло заданное время, а до этого момента выдает false.
Атрибут | Описание |
timeout="1000" | Промежуток времени, через которой данный предикат станет истинным. Обязательный, значение должно быть неотрицательным и целочисленным. |
forceDropOnTimeout="true" | Логический атрибут, позволяющий опустить событие, которое имеет в условии данный таймер. Если выставлен в true, событие будет опущено даже при наличии других активных таймеров и невыполненных условий. Опциональный. Значение по умолчанию -- true |
<timer timeout="1000" forceDropOnTimeout="false"/>
Рассмотрим использование <timer/> c различными значениями атрибута forceDropOnTimeout .
В событии “check region” проверяются временное и пространственное ограничения. Первое условие (timer) становится истинным спустя 1000мс, а до этого момента ложно. После этого его значение больше не изменяется. Второе условие (inside) проверяет, что робот находится в регионе с id=”start_zone”. В тот момент, когда оба этих условия будут выполнены одновременно, программа будет выполнена успешно.
1. Т. к. атрибут forceDropOnTimeout равен "false", то после заданного количества времени событие будет продолжать оставаться взведенным и ждать выполнения второго условия.
<event id="check region" settedUpInitially="true">
<conditions glue="and">
<timer timeout="1000" forceDropOnTimeout="false"/>
<inside objectId="robot1" regionId="start_zone"/>
</conditions>
<trigger>
<success/>
</trigger>
</event>
2. Т. к. атрибут forceDropOnTimeout равен "true", то после заданного количества миллисекунд событие будет опущено, несмотря на наличие .другого условия. Таким образом, если в момент времени 1000 мс робот не находится в нужном регионе, то сообщение об успешном выполнении не будет выведено даже в случае, если робот окажется там спустя некоторое время.
<event id="check region" settedUpInitially="true">
<conditions glue="and">
<timer timeout="1000" forceDropOnTimeout="true"/>
<inside objectId="robot1" regionId="start_zone"/>
</conditions>
<trigger>
<success/>
</trigger>
</event>
Переменная | Описание |
Целочисленная, дробная, строковая и логическая константы. | |
Значение переменной. | |
Взять состояние объекта. | |
Взять метатип объекта с заданным идентификатором. | |
Унарные арифметические функции, имеют ровно 1 дочерний элемент, значение которого должно быть целочисленным. | |
Бинарные арифметические функции, имеют ровно 2 дочерних элемента, значение каждого из которых должно быть целочисленным. |
Задание константы.
Атрибут | Описание |
value="0″ | Значение заданной константы. |
<int value="0"/>
<string value="finish"/>
Значение переменной.
Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.
Атрибут | Описание |
name="my_value" | Имя переменной |
<variableValue name="rotation"/>
Взять состояние объекта.
Атрибут | Описание |
object="robot1.display.labels.size" | id взятого объекта. |
<objectState object="robot1.display.labels.first.text"/>
<!-- Присвоим переменной rotation значение угла поворота робота -->
<setter name="rotation">
<objectState object="robot1.rotation"/>
</setter>
<!-- Проверяем равно ли значение переменной rotation значению угла поворота робота -->
<equals>
<variableValue name="rotation"/>
<objectState object="robot1.rotation"/>
</equals>
Взять метатип объекта с заданным идентификатором. Например: если взять
typeOf
объекта wall
с id=777
, то он вернет, что тип этого объекта wall
.Чаще всего этот элемент будет нужен для проверки типа подключенных датчиков и моторов.
Атрибут | Описание |
objectId="id" | Уникальный идентификатор взятого объекта. |
<typeOf objectId="robot1.A3"/>
Унарные арифметические операции отвечающие за изменение знака и взятие модуля числа.
<minus>
<objectState object="robot1.rotation"/>
</minus>
<abs>
<objectState object="robot1.rotation"/>
</abs>
<!-- Модуль разности переменной rotation и значения угла поворота робота -->
<abs>
<difference>
<variableValue name="rotation"/>
<objectState object="robot1.rotation"/>
</difference>
</abs>
Сумма и разность значений. Минимальное и максимальное значение.
<!-- Разность между переменной rotation и значением угла поворота робота -->
<difference>
<variableValue name="rotation"/>
<objectState object="robot1.rotation"/>
</difference>
<!-- Сумма переменной counter и единицы -->
<sum>
<variableValue name="counter"/>
<int value="1"/>
</sum>
Тег | Описание |
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события. | |
Показать ошибку пользователю, завершить проверку задания. | |
Показать п ользователю сообщение об успешном прохождении задания и завершить проверку. | |
Установить значение переменной. | |
Взводит или опускает событие | |
Выводит текст |
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.
<trigger>
<success/>
</trigger>
Показать ошибку, завершить проверку задания.
Атрибут | Описание |
message="Неверный ответ!" | текст выведенной ошибки |
<fail message="Неверный ответ!"/>
Задание успешно пройдено.
Атрибут | Описание |
deffered="false" | Опциональный. По умолчанию равен "false". При выставлении его в true данный триггер не остановит выполнение программы, т. е. чекер дождется конца программы и, либо скажет, что программа выполнена успешно, если ошибок не было, либо выпадет с ошибкой в противном случае. Другими словами атрибут deferred не позволяет получить ошибку "Программа закончилась, но задание не выполнено": программа либо завершится с успехом, либо с содержательной ошибкой типа "Превышен лимит времени". |
<success/>
Установить значение переменной
Атрибут | Описание |
name="my_value" | Название переменной |
<!-- Создаем переменную total_score со значением 0.-->
<setter name="total_score">
<int value="0"/>
</setter>
<!-- Добавляем к переменной total_score + 2. -->
<setter name="total_score">
<sum>
<variableValue name="total_score"/>
<int value="2"/>
</sum>
</setter>
Взводит или опускает событие
Атрибут | Описание |
id="finish checker" | id выбранного события |
<!-- Запустить событие "finish checker" -->
<triggers>
<setUp id="finish checker"/>
</triggers>
Выводит текст в консоль
Атрибуты
Атрибут | Описание |
text="Hello, world!" | Необходимый текст |
| |
<trigger>
<message text="Hello, world!"/>
</trigger>
При срабатывании такого триггера в консоль робота будет выведен текст "Hello, world!"
Название | Описание |
twoDModel::robotModel::parts::RangeSensor | Датчик расстояния |
trik::robotModel::twoD::parts::TwoDLightSensor | Датчик освещенности |
twoDModel::robotModel::parts::TouchSensor | Датчик касания |
trik::robotModel::twoD::parts::LineSensor | Датчик линии |
Название | Описание |
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 |