Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
TRIK Studio — бесплатная среда программирования роботов.
Она позволяет решать задачи как с помощью визуального программирования, так и текстовых языков.
Отличительной особенностью TRIK Studio является интерактивный режим имитационного моделирования. Чтобы научиться программировать, необязательно иметь конструктор.
TRIK Studio — универсальное программное обеспечение для преподавания основ программирования. В ней предусмотрен переход .
TRIK Studio поддерживает 4 платформы:
.
.
.
.
Последнюю версию TRIK Studio можно скачать на сайте .
Оперативная память: 4 ГБ или больше.
Операционная система:
64-разрядная Windows 10.
Ubuntu 16.04 и выше.
Справочный центр ТРИК — руководство по работе с бесплатной средой программирования роботов TRIK Studio. Открытый код TRIK Studio вы можете найти в нашем репозитории на GitHub.
О TRIK StudioТакже в справке описано взаимодействие TRIK Studio с поддерживаемыми платформами:
.
.
Версия TRIK Studio отображается в заголовке окна.
А также на стартовой странице.
Некоторые антивирусы распознают TRIK Studio как угрозу, что мешает корректной работе TRIK Studio.
Ниже приведены инструкции для решения подобных проблем с антивирусами:
Редактирование свойств элементов в TRIK Studio Junior аналогичен редактированию свойств элементов в TRIK Studio:
Редактирование свойств элементовУпражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).
Создание и загрузка упражнений в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:
УпражненияДля программирования контроллера ТРИК на визуальном языке в TRIK Studio есть специализированные блоки, а также сенсорные переменные.
Подробнее о визуальном программировании читайте в статье
Программирование на визуальном языкеmacOS 10.12 Sierra и выше.
Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio.
Или в главном меню выберите Файл → Новый проект.
Откроется окно с новой программой на визуальном языке программирования:
О программировании на визуальном языке читайте в статье:
Про создание новой текстовой программы читайте в статье:
Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio.
Или в главном меню выберите Файл → Открыть....
По умолчанию TRIK Studio ищет файлы в формате *.qrs или последнего открытого формата (например, *.js). Если требуется существующий проект в другом формате, выберите в выпадающем меню нужный формат (например, *.py) или Все файлы (*.*).
Если программа запущена в режиме интерпретации на роботе или в двумерной модели, можно посмотреть показания сенсоров робота на графике в специальном окне.
График масштабируется автоматически таким образом, чтобы кривая показаний помещалась по высоте целиком.
Из выпадающего списка снизу можно выбрать сенсор, значения с которого будут отображаться на графике.
При наведении курсора мыши на точку на графике отобразится значение в этой точке.
Справа от графика есть четыре кнопки для работы с ним:
Изменить язык можно в настройках TRIK Studio.
1. Выберите в главном меню Настройки → Настройки....
2. В открывшемся окне во вкладке «Поведение» выберите нужный язык. «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.
3. Нажмите «OK» и перезапустите TRIK Studio.
PuTTY, WinSCP, TRIK Gamepad
В TRIK Studio доступны три сторонние утилиты:
Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты.
TRIK Studio можно интегрировать с внешней средой программирования VSCode.
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:
статические анализаторы,
автоформаттеры,
цветовые темы.
О том, как интегрировать VSCode с TRIK Studio читайте в статьях:
1. Включите контроллер.
2. Перейдите в Ещё... → Версия и обновление.
3. «Версия ОС» и есть версия встроенного программного обеспечения контроллера.
Главное меню TRIK Studio содержит набор базовых операций и настроек среды:
Кроме , в TRIK Studio доступны зарезервированные переменные, которые хранят значения показаний сенсоров, подключенных к соответствующим портам.
Эти значения можно присваивать переменным и использовать в математических выражениях.
Переменные имеют вид
Например, sensorA1 для ТРИК или sensor1 для Lego NXT.
Полный список сенсорных переменных приводится в разделах к конкретным платформам:
Добавление и удаление блоков в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:
Связи между блоками в TRIK Studio Junior обозначают направление передачи управления между блоками.
Пусть необходимо, чтобы вслед за задержкой программа сразу же завершилась. Для этого надо соединить блоки и стрелкой, имеющей направление от блока «Таймер» к блоку завершения программы.
Создание и удаление связей в TRIK Studio Junior происходит так же, как и в TRIK Studio:
TRIK Studio Junior так же, как и , имеет два режима работы.
Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.
Предназначен для исполнения и отладки программы на 2D-модели.
Интерфейс TRIK Studio Junior зависит от выбранного режима и совпадает с интерфесом для TRIK Studio:
Версия TRIK Studio Junior отображается в заголовке окна.
А также на стартовой странице.
Любую программу в TRIK Studio Junior можно сохранить как подпрограмму и использовать в другой программе.
Работа с подпрограммами в TRIK Studio Junior аналогична работе с подпрограммами в TRIK Studio:
TRIK Studio можно интегрировать с внешней средой программирования .
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:
статические анализаторы,
автоформаттеры,
Синтаксис выражений в блоках в TRIK Studio Junior аналогичен синтаксису выражиний в блоках TRIK Studio:
brick.battery().readVoltage()brick.battery().readVoltage();В TRIK Studio сейчас только одна встроенная константа. С ней можно работать так же, как и с сенсорными переменными, но ее значение не меняется.
pi
3.14159265358979
Представляет отношение длины окружности к ее диаметру, определяемое константой π.
О том, как интегрировать Sublime с TRIK Studio читайте в статьях:


sensor<имя порта сенсора>Новый проект — создать новый проект.
Недавние проекты — открыть один из недавно использовавшихся проектов.
Новая диаграмма — создать новую диаграмму в текущем проекте.
Открыть… — открыть сохраненный проект. Проекты хранятся на диске в файлах с расширением .qrs.
Сохранить — сохранить текущий проект.
Сохранить как… — сохранить текущий проект в выбранное местоположение. Последующие сохранения будут производиться в выбранный файл.
Сохранить диаграмму как картинку… — сохранить на диск текущее изображение на сцене.
Печать — распечатать диаграмму или текст, используя стандартный диалог печати.
Выход — выйти из программы.
Восстановить настройки по-умолчанию и выйти — восстановить настройки по-умолчанию и выйти из программы.
Отменить — отменить выполненное действие.
Повторить — сделать снова отмененное действие.
Копировать — копировать выбранный элемент.
Вставить — вставить выбранный элемент.
Вырезать — вырезать выбранный элемент.
Найти... — открыть диалог поиска по проекту.
Найти и заменить — открыть диалог поиска по проекту и заменить.
Приблизить — увеличить масштаб сцены.
Отдалить — уменьшить масштаб сцены.
Панели — включить / выключить отображение различных окон.
На главную — вернуться на главную.
Внимание! Пункты в этом меню могут появляться и исчезать в зависимости от конфигурации программы.
Жесты мышью — открыть вкладку со списком доступных жестов мышью (см. раздел «Добавление блоков жестами мыши»).
Выполнить — запустить выполнение отображаемой в данный момент диаграммы на роботе в режиме интерпретации (пункт отображается только в режиме интерпретации).
2D-модель — переключить режим работы интерпретатора на двумерную модель.
Реальный робот — переключить режим работы интерпретатора на управление реальным роботом по Wi-Fi, Bluetooth или USB в зависимости от используемой и настроек соединения с роботом.
Настройки — открыть окно настройки модели робота, с которой осуществляется работа в TRIK Studio (подробнее см. раздел «» в статье «»).
Сохранить как упражнение… — сохранить текущую диаграмму и двумерную модель как упражнение для учащихся. В упражнении нельзя модифицировать некоторые части решения. Например, расположение объектов в двумерной модели или конфигурацию датчиков. Выбор этого пункта меню открывает диалог, в котором можно выбрать фиксируемые части (подробнее про упражнения см. в статье «»)
Подпрограммы — управление подпрограммами (подробнее см. в статье «»).
Генерировать код — открыть вкладку со сгенерированным кодом, соответствующим текущей диаграмме и выбранному текстовому языку (этот пункт может выглядеть как «Генерировать код на JavaScript», «Генерировать код на Python», «Генерировать код на C» и т.д.). Код не загружается на робот и не исполняется, но может быть отредактирован и загружен позже.
Загрузить программу — только сгенерировать код и загрузить на робот, не исполняя его.
Загрузить и выполнить программу — сгенерировать код, соответствующий текущей диаграмме, загрузить его и исполнить на роботе.
Остановить робота — прервать выполнение программы и послать роботу команды отключения моторов.
Подключиться — установить соединение с роботом. Робот должен быть включен. Показывается только в том случае, если выбранный режим работы с роботом предполагает необходимость постоянного подключения (например, интерпретация программы по Bluetooth или Wi-Fi).
Настройки… — открыть окно настроек среды TRIK Studio (см. статью «Настройки TRIK Studio»).
Показать сетку — включить/отключить отображение сетки на сцене.
Показать направляющие — включить/отключить режим отображения вертикальных и горизонтальных направляющих линий для позиционирования объектов относительно друг друга.
Включить сетку — включить/отключить режим автоматического выравнивания по сетке.
Включить направляющие — включить/отключить режим вертикальных и горизонтальных направляющих линий для позиционирования блоков относительно друг друга.
Показать весь текст — включить/отключить отображение всех свойств блока прямо на диаграмме. Если текст под блоками отключён, свойства можно просматривать и редактировать в редакторе свойств слева вверху.
Помощь — открыть справку.
О программе — просмотреть краткую информацию о TRIK Studio.
Открыть лог-файлы — открыть папку с лог-файлами.
Проверить на наличие обновлений — получить из интернета информацию о наличии новой версии среды или какого-либо из подключаемых модулей и запустить при необходимости автообновление.
1. Выберите в главном меню Настройки → Настройки....
2. В открывшемся окне выберите вкладку «Роботы».
Диаграммы с подпрограммами создаются автоматически при добавлении блока «Подпрограмма» на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.
Подробнее о подпрограммах читайте в статье:
Кнопка
Описание
Изменение масштаба графика.
Очистить график.
Экспорт показаний графика в формате .csv (comma-separated value). Экспортируются все показания выбранного датчика с начала их записи.
Интерфейс TRIK Studio зависит от выбранного режима. TRIK Studio имеет два режима:
Режим редактирования Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.
Предназначен для исполнения и отладки программы на 2D-модели или в режиме интерпретации на реальном роботе.
Переключение режимов возможно тремя способами. С помощью:
Сочетаний клавиш Ctrl+1 / Ctrl+2.
.
.
TRIK Studio в режиме редактирования имеет следующие элементы интерфейса:
Сцена отображает диаграмму и позволяет ее редактировать.
О создании нового проекта и работе с диаграммами читайте в статьях:
Здесь же осуществляется отображение текущего исполняемого блока при интерпретации диаграмм.
Главное меню TRIK Studio содержит набор базовых операций и настроек среды:
Подробнее смотрите в статье:
Панель «Файл» повторяет основные операции, доступные из меню «».
Создать новый проект. Открыть сохраненный проект. Сохранить текущий проект.
Отмена операции. Повтор операции.
Панель «Вид» содержит кнопки, позволяющие масштабировать диаграммы.
Приблизить / отдалить.
Также масштабировать сцену можно с помощью:
Зажатия клавиши Ctrl и вращения колесика мыши.
Сочетания клавиш Ctrl+= и Ctrl+-.
Панель «Интерпретатор» содержит команды запуска и остановки выполнения программы, кнопки переключения режимов интерпретации между двумерной моделью и реальным роботом, а также кнопку открытия , доступных из меню «Инструменты».
При работе с реальным роботом в режиме интерпретации эта панель также содержит кнопку «Подключиться».
Запуск выполнения программы. Остановка выполнения программы. Двумерная модель. Реальный робот. Настройки робота.
Панель «Генераторы» содержит команды генерации кода и загрузки программы на контроллер.
Генерировать код. Загрузить программу.
Панель «Прочее» может содержать различную информацию в зависимости от выбранной платформы.
Например, для на данной панели отображается IP-адрес контроллера, к которому вы подключаетесь.
Панель переключения режимов отображает текущий режим TRIK Studio и позволяет переключаться между режимами редактирования и отладки.
Редактор. Отладка.
Редактор свойств используется для отображения и редактирования значений свойств выделенных объектов (блоков, связей).
О работе с редактором смотрите статью:
Настройки сенсоров позволяют указать, какие сенсоры использованы на каком порту. То же можно сделать из диалога настроек робота.
Палитра элементов содержит набор доступных блоков и связей между ними, которые можно добавить на диаграмму.
О добавлении и удалении блоков на сцену в TRIK Studio читайте в статье:
Список переменных, используемых при выполнении диаграммы с их текущими значениями, включая . При исполнении в режиме интерпретации на двумерной модели или реальном роботе берутся с робота в реальном времени. В режиме генерации не используются.
Строка статуса отображает текущий режим TRIK Studio ( или ) и позволяет переключаться между режимами. Для переключения достаточно кликнуть на строку статуса.
Элементы интерфейса TRIK Studio в режиме отладки повторяют элементы в , кроме окна редактора, панелей редактора свойств и палитры. Вместо этих элементов отображаются:
Окно «Двумерная модель» открывается, если в качестве режима исполнения программы выбрана 2D-модель.
Окно позволяет задать окружение, в котором будет работать робот, задать датчики робота и наблюдать, как будет работать написанная в режиме редактирования программа.
Подробнее о 2D-модели читайте в статье:
На панели настроек робота отображается вид контроллера и параметры робота, которые зависят от выбранной .
В случае синтаксических и семантических ошибок в TRIK Studio появляется окно с соответствующими сообщениями.
Для просмотра блока, в котором допущена ошибка, необходимо кликнуть на сообщение.
Окно «Графики» отображает в реальном времени значения, присылаемые датчиками.
Подробнее читайте в статье:
Программа в TRIK Studio представляется в виде последовательности блоков, соединённых связями.
Каждой программе соответствует главная диаграмма, которая может содержать другие диаграммы (подпрограммы). Диаграммы упаковываются в проекты, хранящиеся на диске.
Главная диаграмма создаётся при . Про добавление и удаление блоков на читайте в статье:
Диаграммы с подпрограммами создаются автоматически при добавлении блока на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.
Подробнее о подпрограммах читайте в статье:
В TRIK Studio есть два способа редактирования значений свойств, которые имеются у блоков и связей на диаграммах:
Внимание! Редактирование свойств блока осуществляется только с помощью контекстного меню.
При выделении блока, связи, или элемента, на панели отображаются все свойства текущего элемента.
Редактор свойств представляет собой таблицу. В левой колонке отображается название свойства элемента, в правой — его значение.
Изменить значение любого свойства можно, кликнув на соответствующей ячейке правой колонки и введя нужное значение.
Для свойств, которые допускают только определенный набор значений, например, свойство «Порт» у блока , при попытке их редактирования, появится выпадающее меню, где выбирается нужное значение:
Для редактирования свойств прямо на диаграмме:
Наведите курсор мыши на значение нужного свойства.
Двойным нажатием левой кнопки мыши активируйте редактирование свойства.
Введите нужное значение.
Кликните в произвольное место сцены.
Внимание! Данный подход может служить источником ошибок, поскольку позволяет ввести произвольное текстовое значение свойства, в том числе и некорректное. Будьте внимательны.
PuTTY — клиентская программа для работы с сетевыми протоколами. К контроллеру ТРИК можно подключиться, используя протоколы SSH и Serial.
Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты → PuTTY.
1. Подключите контроллер к компьютеру по .
2. Пропишите в настройках студии на вкладке «» IP-адрес контроллера, который отображается на главном экране контроллера.
3. Запустите PuTTY из TRIK Studio, выбрав в главном меню Инструменты → Сторонние утилиты → PuTTY.
4. В открывшемся окне введите логин root. Поле Пароль оставьте пустым.
На контроллере ТРИК стоит Wi-Fi-модуль, который может работать в двух режимах:
В режиме точки доступа, то есть когда контроллер сам создает новую сеть, и мы к нему подключаем устройства.
В режиме Wi-Fi-клиента, то есть когда мы подключаем контроллер к уже существующей сети.
Для выбора режима в меню контроллера выберите пункт Сеть.
О подключении контроллера к устройствам в разных режимах и взаимодействии нескольких контроллеров читайте в статьях:
1. Подключите контроллер к компьютеру, на котором установлена TRIK Studio, любым из двух способов.
2. В настройках TRIK Studio перейдите в раздел «Роботы» и выберите платформу ТРИК в окне «Платформы».
3. Укажите IP-адрес контроллера в строке «Настройки TCP».
Также IP-адрес контроллера можно указать на панели инструментов:
4. Нажмите «OK».
Попробуйте программу на контроллер.
Если соединения с контроллером нет, TRIK Studio выдаст ошибку:
В этом случае проверьте:
Совпадает ли IP-адрес в TRIK Studio с IP-адресом на контроллере.
Отображает ли контроллер ТРИК свой IP-адрес. IP-адреса может не быть, если контроллер в режиме Wi-Fi-клиента подключен к Wi-Fi-сети, но роутер не выдал его. Рекомендуем немного подождать или переключиться в режим «Точка доступа» и обратно в режиме Wi-Fi-клиента. Также это может произойти в режиме «Точка доступа». Рекомендуем выключить контроллер на некоторое время, а затем снова запустить.
Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек.
В качестве передаваемого параметра нужно указать полный системный путь до файла с необходимыми функциями либо имя файла. Во втором случае файл для подключения должен лежать в той же директории, что и основной файл, в котором вызывается include.
TRIK Studio можно интегрировать с внешней средой программирования PyCharm.
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:
статические анализаторы,
автоформаттеры,
цветовые темы.
О том, как интегрировать PyCharm с TRIK Studio читайте в статьях:


В отличие от язык TRIK Studio статически типизирован, то есть тип каждого выражения и каждой переменной должен быть известен во время компиляции. При этом язык не требует (и даже не позволяет!) явно писать типы переменных. Используется автоматический вывод типов по использованию переменных.
Например, по выражению a = 1 среда «поймёт», что тип a — целое.
Массив — один из , хранящий набор значений (элементов массива), идентифицируемых по индексу. Нумерация индексов в массиве начинается с 0.
Массивы можно создавать явно, используя следующие выражения (варианты записи равносильны):
Или с явным указанием индексов:
Можно использовать массивы, не создавая их. Например, так:
При этом «пустые места» в массиве (индексы, которым не было явного присваивания) будут заполнены значениями по умолчанию:
0 — для целых и вещественных;
Язык использует пробелы, табуляции и переводы строк вне строковых литералов только как разделители между лексемами — влияния на интерпретацию выражений они не оказывают.
В языке есть следующие ключевые слова:
and
false
Создание новой текстовой программы, генерация диаграммы в код и поддерживаемые языки программирования
Текстовый режим программирования позволяет редактировать по диаграмме программу перед загрузкой на робота или в текстовом виде с нуля.
1. , содержащую блоки «Начало» и «Конец».
2. Выберите режим реального робота.
3. Нажмите на кнопку «Генерировать код». После этого появится пустой шаблон программы, которая содержит все необходимые объявления, но ничего не делает.
TRIK Studio Junior — бесплатная среда программирования с для начальной и средней школы.
Среда имеет общий интерфейс со средой программирования роботов , что позволяет вести непрерывный процесс обучения, начиная с начальной школы.
1. Поддержаны основные алгоритмические структуры (следование, ветвление, циклы, подпрограммы, массивы), математические и логические операции, а также команды для перемещения «Исполнителя».
Изменить изображение «Исполнителя» можно двумя способами:
. Здесь можно добавить несколько изображений, которые будут менятся в зависимости от направления движения «Исполнителя».
.
Если при установке или запуске TRIK Studio антивирус Avast выдает сообщение о блокировке файла, то указанный файл следует добавить в исключения в настройках антивируса.
Для этого:
1. В появившемся окне нажмите на кнопку «Другие параметры» и выберите «Создать исключение».
Контроллер ТРИК — образовательная робототехническая платформа, разработанная командой опытных инженеров специально для робототехники.
поддерживает данную платформу для .
Контроллер ТРИК снабжён цветным сенсорным дисплеем, и Wi-Fi-модулем, который может работать в .
Контроллер ТРИК совместим с широким спектром периферийных , имеет в своем составе все необходимое оборудование для управления двигателями постоянного тока и сервоприводами, а также для приема и обработки информации от цифровых и аналоговых датчиков, микрофонов, видеомодулей. На борту у контроллера имеются встроенные гироскоп и акселерометр.
Контроллер ТРИК поддерживает различные способы , .
В режимах точки доступа и клиента
Контроллер ТРИК может быть подключен к другим устройствам двумя способами:
Используем контроллер ТРИК как **(**то есть контроллер сам создает новую сеть) и подключаем к нему устройства.
Используем контроллер ТРИК в режиме и подключаем устройства и сам контроллер к существующей сети.
Предоставляет управление светодиодом на корпусе робота.
Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту. Возвращается приведённое значение, зависящее от конфигурации порта, которая описывается в файле model-config.xml в папке trik на роботе.
Например, ИК-датчик расстояния возвращает значение в сантиметрах.
data1 = brick.sensor(sensorName).read()
data2 = brick.sensor("sensorName").read()var data1 = brick.sensor(sensorName).read();
var data2 = brick.sensor("sensorName").read();Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту. Диапазон значений зависит от конкретного сенсора и не учитывает конфигурацию робота (возвращаются физические показания сенсора, например, задержка принятого ультразвукового сигнала).
data1 = brick.sensor(sensorName).readRawData()
data2 = brick.sensor("sensorName").readRawData()var data1 = brick.sensor(sensorName).readRawData();
var data2 = brick.sensor("sensorName").readRawData();Метод
Описание
Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту.
Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту.
// Функции должны быть объявлены как глобальные переменные
sum = function(a, b) {
return a + b
}include("other_file.js");
print(sum(1, 2));


Включает светодиод в режим «красный».
brick.led().red()brick.led().red(); Включает светодиод в режим «зеленый».
brick.led().green()brick.led().green(); Включает светодиод в режим «оранжевый».
Выключает светодиод.
Метод
Описание
Включает светодиод в режим «красный».
Включает светодиод в режим «зеленый».
Включает светодиод в режим «оранжевый».
Выключает светодиод.
false — для булевых;
пустыми строками для строковых массивов.
Значения массива также могут использоваться без фигурных скобок, если используются в качестве возвращаемого значения. Например, данное выражение вернёт массив из чисел 1 и 2:
Сделано это для того, чтобы интерпретировать перечисления значений (например, порты моторов в блоке «Моторы вперёд») как массивы. Поэтому везде, где используется запись значений через запятую, можно использовать массив.
a = {1; 2; 3; 4};
a = {1, 2, 3, 4};a = {[0] = 1, [10] = 2, [20] = 3};nil
not
or
true
И следующие операторы:
Строковые литералы пишутся либо в одинарных, либо в двойных кавычках. Например,
Целые числа пишутся либо в десятичной, либо в восьмеричной, либо в шестнадцатеричной системе. Шестнадцатеричные числа начинаются с префикса 0x, восьмеричные — с префикса 0. Например,
3, 345 — десятичные числа
0xff, 0xBEBADA — шестнадцатеричные числа
07654321 — восьмеричное число
Вещественные числа пишутся либо в общепринятой, либо в экспоненциальной форме. Например,
Комментарии начинаются с -- и продолжаются до конца строки. Например,
О синтаксисе выражений в блоках читайте в статье
brick.led().orange()brick.led().orange();brick.led().off()brick.led().off();a[1] = 1;
a[2] = 2;a = 1;
b = 2;
a, b + - * / % ^ # & ~ | << >> // == ~= <= >= < > = ( ) { } [ ] ; : , . .. && ||a = 'alo123'
a = "alo123"3.0
3.1416
314.16e-2
0.31416E1
34e1a = 1; -- комментарийЦелое число
Использует 32-битное знаковое представление (позволяет хранить значения от -2 147 483 648 до 2 147 483 647).
Строка
Позволяет хранить символьные строки произвольной длины в кодировке UTF-8.
Нулевой тип
Имеет только одно значение nil и означает отсутствие «настоящего» значения.
Позволяет хранить произвольное количество значений произвольного (но для каждого значения в одном массиве одинакового) типа, в том числе и другие массивы, и обращаться к значениям по индексу.
О синтаксисе выражений в блоках читайте в статье
Тип
Описание
Булевый (логический) тип
Принимает значения true (истина) и false (ложь).
Вещественное число
Использует 64-битное представление binary64 стандарта IEEE 754 (позволяет хранить значения до 1.7E+308).
1. Выберите режим реального робота.
2. Нажмите на кнопку «Генерировать код».
Поддерживаемый текстовый язык программирования зависит от платформы. Одна платформа может иметь несколько целевых текстовых языков.
Внимание! Доступные генераторы зависят от установленных подключаемых модулей.
Для платформы ТРИК возможна генерация в:
Эксперты в EV3 могут посмотреть на сгенерированный на внутреннем языке EV3 код с помощью кнопки «Сгенерировать в байт-код EV3». Теоретически его можно подредактировать и запустить на исполнение или вообще использовать для текстового программирования EV3, но делать это неудобно — язык создавался для автоматической генерации, а не написания программ.
Для Lego NXT поддерживается генерация в язык С с использованием библиотеки ECRobot.
Для квадрокоптера Геоскан Пионер возможна генерация в Lua.
2. Вы можете загрузить как своего «Исполнителя» и мир, так и выбрать из заготовленных.
3. Вы можете создавать упражнения для самостоятельного выполнения с автоматической проверкой.
4. Так же, как и в TRIK Studio, в TRIK Studio Junior есть интерактивный режим имитационного моделирования. Чтобы научиться программировать, необязательно иметь конструктор.
«Исполнитель» — объект, который понимает и исполняет команды алгоритма. В TRIK Studio Junior можно менять изображение исполнителя.
Последнюю версию TRIK Studio Junior можно скачать на сайте trikset.com.
Оперативная память: 4 ГБ или больше.
Операционная система:
64-разрядная Windows 10.
Ubuntu 16.04 и выше.
macOS 10.12 Sierra и выше.
1. Кликните левой кнопкой мыши на «Исполнителя».
2. Поставьте «галочку» во второй строке. Появится иконка для выбора изображения «Исполнителя».
3. Нажмите на появившуюся иконку и выберите одно или несколько изображений «Исполнителей».
Выбор нескольких изображений «Исполнителей» необходим, если у вас есть изображения в разных проекциях. Имя таких файлов должны оканчиваться на:
_up — для изображения, когда «Исполнитель» движется наверх
_down— для изображения, когда «Исполнитель» движется вниз
_right — для изображения, когда «Исполнитель» движется направо
_left — для изображения, когда «Исполнитель» движется налево
1. Выберите в главном меню Настройки → Настройки....
2. В открывшемся окне выберите вкладку «Роботы», нажмите рядом с полем «Картинка робота в 2D» кнопку «Обзор» и выберите нужное изображение.
3. Нажмите «OK».
На сайте trikset.com вы можете скачать заготовленные изображения «Исполнителей».
3. После данных действий TRIK Studio запустится.
Возможна ситуация, при которой Avast может удалить исполняемый файл TRIK Studio или просто не выдавать сообщение об угрозе при запуске TRIK Studio.
В данном случае:
1. Откройте главное окно Avast.
2. В «Меню» выберите пункт «Моя статистика».
3. Затем «Угрозы в хранилище вирусов (Открыть хранилище вирусов)».
4. Наведите курсор мыши на запись о заблокированном файле, после чего справа появится кнопка выпадающего меню «...». Нажмите на нее и выберите «Другие параметры».
5. Затем выберите «Восстановить и добавить в исключения».
6. После этих действий TRIK Studio должна запускаться и работать в штатном режиме.
Подробную информацию о контроллере ТРИК смотрите на сайте производителя.
Для программирования контроллера ТРИК выберите «ТРИК» в настройках TRIK Studio во вкладке «Роботы».
Используйте специализированные и общие блоки для написания программ на визуальном языке. Подробнее о визуальном программировании читайте в статье
О текстовом программировании читайте в статье
В этом режиме контроллер сам создает новую сеть, и мы к нему подключаем устройства.
1. Выберите в меню Сеть → Wi-Fi точка доступа. Контроллер раздаст Wi-Fi, а на экране появятся параметры сети:
Имя сети.
Пароль сети.
IP-адрес контроллера.
2. При подключении к сети Wi-Fi компьютера или смартфона выберите сеть контроллера и введите пароль.
В этом режиме контроллер и устройства мы подключаем к уже существующей Wi-Fi-сети.
Для этого нам в веб-интерфейсе контроллера надо прописать имя и пароль сети, к которой будем подключать контроллер.
1. Для запуска веб-интерфейса подключите компьютер или смартфон к контроллеру как к точке доступа.
2. В адресной строке браузера введите IP-адрес контроллера. Откроется веб-интерфейс.
3. В поле «Wi-Fi-клиент» введите имя и пароль сети, к которой хотите подключить контроллер. Нажмите кнопку «Сохранить».
4. Переключите контроллер в режим Wi-Fi-клиента.
5. При успешном подключении вверху экрана рядом с иконкой отобразится ip-адрес контроллера, а в списке иконкой будет выделено имя сети.




В математических выражениях можно использовать функции, доступные для любой платформы.
Функция
Описание
time()
Возвращает время в миллисекундах с начала работы программы.
sin(angle)
Синус угла, где «angle» — угол в радианах.
cos(angle)
Косинус угла, где «angle» — угол в радианах.
ln(a)
Любую программу в TRIK Studio можно сохранить как подпрограмму и использовать в другой программе.
Подпрограммы можно сохранять в локальную коллекцию или экспортировать в отдельный файл для переноса на другие компьютеры.
Для работы с коллекцией подпрограмм используйте пункт меню Инструменты → Подпрограммы:
.
.
.
.
Для экспорта подпрограмм из открытого проекта в отдельный qrs-файл выберите в главном меню Инструменты → Подпрограммы → Экспортировать в файл.
В данный файл будут экспортированы все подпрограммы из текущего проекта.
Для загрузки сохраненных ранее подпрограмм выберите в главном меню Инструменты → Подпрограммы → Импортировать из файла.
Внимание! Если в импортируемом файле присутствуют подпрограммы с такими же именами, как в текущем проекте, то подпрограммы из проекта будут заменены импортируемыми.
Для сохранения подпрограмм из открытого проекта выберите в главном меню Инструменты → Подпрограммы → Сохранить в коллекцию.
Затем выберите подпрограммы, которые хотите сохранить, и нажмите OK.
Внимание! Если в коллекции подпрограмм есть подпрограммы с такими же именами, они будут перезаписаны.
Для загрузки подпрограмм из коллекции, выберите в главном меню Инструменты → Подпрограммы → Загрузить из коллекции.
Затем выберите подпрограммы, которые хотите импортировать в текущий проект, и нажмите OK.
Для удаления всех сохраненных в коллекцию подпрограмм выберите в главном меню Инструменты → Подпрограммы → Очистить коллекцию.
Создание нового проекта и запуск существующего
После запуска TRIK Studio Junior откроется стартовая страница, на которой будет отображена версия TRIK Studio Junior, быстрый доступ к недавним проектам, а также кнопки для открытия существующего проекта и создания нового.
Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio Junior.
Или в выберите Файл → Новый проект.
Откроется окно с новой программой на визуальном языке программирования:
Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio Junior.
Или в выберите Файл → Открыть....
По умолчанию TRIK Studio Junior ищет файлы в формате *.tsj .
Видеокамера в режиме датчика цвета.
Метод
Описание
Включает видеокамеру и инициализирует её в режиме датчика цвета.
Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра.
Выключает видеокамеру и прекращает работу датчика.
Включает видеокамеру и инициализирует её в режиме датчика цвета.
Булевый параметр определяет, выводить ли на экран изображение с камеры:
true — выводить,
false — не выводить.
Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра.
Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в model-config.xml на роботе. Квадраты индексируются с 1. То есть (1, 1) — это левый верхний край кадра, (2, 2) — его центр.
Возвращаемое значение — массив из трёх элементов от 0 до 255, индексирующийся с 0. Нулевой элемент содержит интенсивность красного (0 — совсем нет, 255 — очень много), первый — интенсивность зелёного, второй — интенсивность синего. Например, (0, 0, 0) — чёрный, (255, 255, 255) — белый, (255, 0, 0) — красный.
В качестве параметра необходимо указать индексы квадрата x и y.
Выключает видеокамеру и прекращает работу датчика.
WinSCP — графический клиент протоколов SFTP и SCP, предназначенный для Windows. С помощью него можно обмениваться файлами между контроллером ТРИК и компьютером по протоколу SCP.
Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты → WinSCP.
1. В каталоге с установленной TRIK Studio зайдите в папку winscp и запустите WinSCP.exe
2. Заполните данные:
File protocol: SCP
Host name: .
User name: root.
Поле Password оставьте пустым.
3. Нажмите кнопку «Login».
4. Если у вас появилось окно «Warning», нажмите «Yes».
5. В левой части приложения будет находиться файловая система вашего компьютера, в правой — файловая система контроллера ТРИК.
Представляет акселерометр контроллера ТРИК.
Метод
Описание
Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.
Сигнал
Описание
Сигнал, посылаемый сенсором, когда у него готовы новые данные.
Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.
Сигнал, посылаемый сенсором, когда у него готовы новые данные.
Предоставляет доступ к инфракрасному датчику MLX90640, подключенному по шине I2C, в режиме камеры и сенсора.
Инициализирует ИК-камеру и запускает захват кадров.
Возвращает цветное изображение в виде массива байтов.
Возвращает среднее значение температуры в специальной шкале в указанном участке кадра.
Останавливает захват кадров.
Инициализирует инфракрасную камеру и запускает захват кадров.
Возвращает цветное изображение ширины 32 и высоты 24 пикселя в виде массива байтов в формате «rgb32».
Вывод изображения на экран.
Возвращает среднее значение температуры в специальной шкале в указанном участке кадра.
Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в model-config.xml на роботе. Квадраты индексируются с 1. То есть (1, 1) — это левый верхний край кадра, (2, 2) — его центр.
Возвращаемое значение — среднее значение температуры в указанном квадрате в следующей шкале:
Значение меньше 0 — камера не инициализирована
0 — соответствует температуре льда из морозильной камеры и ниже
1 — соответствует температуре воды из холодильника
В качестве параметра необходимо указать индексы квадрата x и y.
Останавливает захват кадров до следующего вызова init().
В данной статье рассматривается возможность одновременной загрузки программ на группу роботов с использованием внешнего текстового редактора Sublime Text. Статья является продолжением материала
Запуск 2D-модели в TRIK Studio из Sublime TextСкачайте файл send_files.cmd для Windows и поместите его в папку, в которую установлена TRIK Studio.
Инструкция протестирована на Sublime Text 3 (Build 3211). Скачать Sublime Text можно на .
Перед первым запуском программы необходимо зайти на контроллер ТРИК через WinSCP. Инструкция о том, как это сделать, доступна по . После этого WinSCP запомнит, что было разрешено устанавливать соединение с этим роботом и не будет требовать подтверждений. Это действие необходимо повторять при подключении каждого нового контроллера.
1. Откройте Sublime Text.
2. Выберите Tools → Build System → New Build System
3. Откроется окно с текстовым файлом. В нем необходимо всё стереть и вставить вместо этого следующий код:
Здесь:
<path to scripts dir> — полный путь к папке с программами, которые необходимо загрузить на роботов,
<file with ip addresses> — название файла .txt, в котором содержатся ip-адреса роботов для загрузки файлов. Каждый ip-адрес на новой строке. Файл с ip-адресами роботов должен находиться в той же папке, что и отправляемые программы.
4. Укажите свой путь к файлу send_files.cmd вместо указанного в коде. Например:
5. Сохраните этот текстовый файл в предлагаемой директории <папка с системными файлами>\Sublime Text 3\Packages\User под именем TRIK_SEND.sublime-build.
6. Выберите Tools → Build System и в открывшемся списке выберите TRIK_send.
7. Для начала отправки программ на роботов достаточно нажать Tools → Build или соответствующую комбинацию клавиш Ctrl+B. Для того чтобы вернуться к , необходимо выбрать Tools → Build System и в открывшемся списке выбрать TRIK.
Про создание новой текстовой программы и генерацию диаграммы в код читайте в статье:
Программирование на текстовом языкеДоступ к функциональности среды выполнения предоставляется с помощью предопределённых объектов и функций.


Для объявления переменных и задания им определенных значений используется блок .
А для записи математических вычислений — блок .
Также математические выражения, в том числе и изменяющие значения переменных, могут встречаться почти везде, где можно указать какое-либо значение.
Блоки и их свойства, не допускающие использования математических выражений, описаны в разделе .
Все переменные в программе являются глобальными, т.е. их значения могут использоваться в любом блоке в программе.
Создание и загрузка упражнений
Упражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).
1. Нарисуйте на сцене поле с помощью , если это необходимо для вашей задачи.
2. Создайте диаграмму.
В таблице ниже указаны горячие клавиши, установленные по умолчанию. Изменить сочетание клавиш для действий можно в .
В данной статье рассматривается настройка и использование внешней среды программирования PyCharm для вызова программ в TRIK Studio.
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.
Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, ).
Для работы с контроллером ТРИК в настройках TRIK Studio перейдите в и выберите платформу ТРИК.
Существует несколько вариантов выполнения программ для контроллера ТРИК:
.
.
Контроллеры ТРИК могут взаимодействовать друг с другом, что позволяет решать по передаче сообщений между роботами.
Для взаимодействия контроллеров необходимо будет выбрать ведущий контроллер — тот, к которому мы будем подключать остальные контроллеры. А также подключить все контроллеры к одной сети. Это можно сделать двумя способами:
1. С помощью существующей сети.
2. С помощью создания точки доступа Wi-Fi на одном из контроллеров.
Предоставляет управление параллельными потоками.
Видеокамера в режиме датчика объекта. Захватывает контрастный объект в центре кадра и возвращает его координаты и размер в кадре.
В данной статье рассматривается настройка и использование внешней среды программирования Sublime Text для вызова программ в TRIK Studio.
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.
Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, ).
Натуральный логарифм, где «a» — число.
exp(a)
Экспонента («e» в степени аргумента «a»).
asin(a)
Арксинус, где «a» — число.
acos(a)
Арккосинус, где «a» — число.
atan(a)
Арктангенс, где «a» — число.
atan2(a1, a2)
Арктангенс от a1/a2 c проверкой деления на 0.
sgn(a)
Знак. Возвращает 1, если аргумент «a» положительный, -1, если отрицательный, и 0, если аргумент равен нулю.
sqrt(a)
Квадратный корень аргумента «a». В случае если аргумент отрицательный, переменной будет присвоено значение «NaN» (Not A Number).
abs(a)
Модуль аргумента «a».
ceil(a)
Округляет переданный аргумент «a» до целого в большую сторону.
floor(a)
Округляет переданный аргумент «a» до целого в меньшую сторону.
random(a)
Случайное число в интервале от 0 до переданного аргумента «a».
Объект
Описание
Представляет контроллер ТРИК и предоставляет доступ к устройствам робота.
Представляет методы управления выполнением скрипта и предоставляет доступ к функциям операционной системы.
Реализует связь между роботами в сети посредством механизма почтовых ящиков.
Служит для работы с пультом управления.
Предоставляет управление параллельными потоками.
Функция
Описание
Возвращает одномерный массив байт, в который записаны пиксели изображения в формате rgb32, снятого с камеры.
Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек. В качестве передаваемого параметра необходимо указать полный системный путь до файла с необходимыми функциями.





brick.accelerometer().read()brick.accelerometer().read();Работа с диаграммой
Показать весь текст
Ctrl+Shift+T
Увеличить масштаб сцены
Ctrl+=
Уменьшить масштаб сцены
Ctrl+-
Повторить
Ctrl+Shift+Z
Отменить
Ctrl+Z
Найти
Ctrl+F
Найти и заменить
Ctrl+H
Работа с проектом
Закрыть все вкладки
Ctrl+Shift+W
Закрыть текущую вкладку
Ctrl+W
Создать проект
Ctrl+N
Открыть проект
Ctrl+O
Сохранить проект
Ctrl+S
Сохранить проект как
Ctrl+Shift+S
Загрузить программу на робота
Ctrl+U
Показать/спрятать панель ошибок
Alt+1
Показать/спрятать панель консоли
Alt+2
Действие
Сочетание клавиш
Переключение режимов TRIK Studio
Включить режим редактирования
Ctrl+1
Включить режим отладки
Ctrl+2

Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта. После этого метод «read» начинает возвращать данные для объекта.
brick.objectSensor().detect()brick.objectSensor().detect();Включает видеокамеру и инициализирует её в режиме датчика объекта. Булевый параметр определяет, выводить ли на экран изображение с камеры (true — выводить).
brick.objectSensor().init(True)brick.objectSensor().init(true);Булевый параметр определяет, выводить ли на экран изображение с камеры:
true — выводить,
false — не выводить.
Возвращает массив, в ячейках которого находятся следующие данные:
в нулевой ячейке координата по оси X центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра слева);
в первой ячейке — координата по оси Y центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра сверху);
во второй ячейке — относительный размер объекта, число от 0 до 100 (100 — объекта занимает почти весь кадр, 0 — объекта нет на кадре).
Выключает видеокамеру и прекращает работу датчика.
Метод
Описание
Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта.
Включает видеокамеру и инициализирует её в режиме датчика объекта.
Возвращает массив с координатой по оси X центра объекта относительно центра кадра, координатой по оси Y центра объекта относительно центра кадра, относительным размером объекта.
Выключает видеокамеру и прекращает работу датчика.
brick.colorSensor("video1").init(True)brick.colorSensor("video1").init(true);2 — соответствует температуре в помещении3 — соответствует температуре тела человека
4 — соответствует температуре тёплой воды
5 — соответствует температуре горячей (близкой к температуре кипения) воды
6 — соответствует температуре больше температуры кипения воды
brick.irCamera().init()brick.irCamera().init();image = brick.irCamera().getImage()var image = brick.irCamera().getImage();brick.objectSensor().read()brick.objectSensor().read();brick.objectSensor().stop()brick.objectSensor().stop();brick.colorSensor("video1").read(x, y)brick.colorSensor("video1").read(x, y);brick.colorSensor("video1").stop()brick.colorSensor("video1").stop();image = brick.irCamera().getImage()
brik.display().show(image, 32, 24, "rgb32")var image = brick.irCamera().getImage();
brik.display().show(image, 32, 24, "rgb32");temp = brick.irCamera().readSensor(x, y)var temp = brick.irCamera().readSensor(x, y);brick.irCamera().stop()brick.irCamera().stop();Связи можно создавать двумя способами:
Наведите курсор на блок, зажмите правую кнопку мыши и проведите линию до второго блока. Форма линии может быть произвольной. Важно, чтобы она начиналась строго на одном блоке и заканчивалась на втором.
Если навести на связь курсор мыши, то на ее концах отобразятся серые маркеры. Потянув за один из этих маркеров, можно управлять связью. Чтобы присоединить один из концов связи к блоку, нужно потянуть за соответствующий серый маркер и отпустить его на интересующем блоке.
Линкер — цветной кружок справа от блока, появляющийся после выделения блока. При нажатии на этот кружок и движении мыши с зажатой левой клавишей, из элемента начинает вытягиваться связь.
Если «бросить» эту связь на существующем элементе, произойдет соединение данных элементов.
Если же отпустить левую клавишу мыши, когда курсор находится на пустом участке диаграммы, то появится меню с пунктами:
Удалить
Создать новый элемент
При выборе пункта меню «Удалить» созданная связь удаляется.
При наведении на пункт меню «Создать новый элемент» появляется новое меню, в котором перечислены все возможные для создания элементы. При выборе одного из этих пунктов на диаграмме создастся соответствующий элемент и присоединится к текущему связью.
Удаление связей осуществляется аналогично удалению блоков.
Если необходимо добавить новый блок между двумя связанными блоками, перетащите из панели «Палитра» блок на связь. Отпустите кнопку мыши при наведении курсора (не блока) на связь.
Связи в TRIK Studio могут быть ломаными линиями. Для добавления точки излома наведите курсор мыши на линию связи, нажмите левую кнопку мыши и потяните появившийся серый маркер.
Если точку излома связи разместить так, что она и две ближайшие к ней будут располагаться примерно на одной прямой, то это приведет к уничтожению этой точки излома и сглаживанию ломаной в этом месте.
Используемый внутри блоков язык создан на базе Lua 5.3 и во многом следует его синтаксису. Тем не менее имеются существенные отличия, поэтому полное описание используемого в TRIK Studio языка приводится здесь.
Объявление нескольких переменных в одном блоке «Выражение»:
То же через блоки «Инициализация переменной»:
Пропорциональный регулятор для езды по линии с использованием двух датчиков света для платформы ТРИК:
Пример использования массивов для задания портов блока «Моторы вперёд». Создаётся массив с именем a, нулевому элементу присваивается порт M3, первому — M1, потом содержимое первого элемента массива меняется на M4, затем получившийся массив передаётся в свойство «Порты» блока «Моторы вперёд»:
4. Выберите в главном меню Инструменты → Сохранить как упражнение….
5. В появившемся диалоговом окне выберите ограничения для упражнения.
Название
Описание
1
Двумерная модель неизменяема
Запрещает редактировать стены и цветные линии в двумерной модели.
2
Положение и конфигурация сенсоров неизменяемы
Запрещает изменять конфигурацию датчиков, а также их положение и направление в двумерной модели.
3
Начальное положение робота в двумерной модели неизменяемо
Запрещает двигать робот «вручную».
4
6. Нажмите «OK» и выберите путь для сохранения упражнения.
7. После сохранения упражнение автоматически откроется в TRIK Studio, где можно будет убедиться, что выбранные опции недоступны для редактирования.
Загрузка сохраненного упражнения происходит как обычная программа. Например, с помощью панели «Файл».
.xml.qrs.Скачайте файл run_2d_model.cmd для Windows или run_2d_model.sh для Linux и поместите его в папку, в которой установлена TRIK Studio.
Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате .xml, создайте в данной папке пустой проект default.qrs.
Инструкция протестирована на PyCharm Professional Edition (2019.3). Скачать PyCharm можно на официальном сайте.
1. Откройте папку с исходным кодом в PyCharm c помощью File → Open.
2. Выберите File → Settings или нажмите комбинацию клавиш «Ctrl+Alt+S».
3. Выберите Tools → External tools и нажмите на значок «+».
4. В поле Name введите желаемое имя тула, например, «run_2d_model». В открывшимся окне подставьте в поле Program свой путь к файлу run_2d_model.cmd. В поле Arguments впишите параметры $FileDir$ и $FileName$ или выберите Insert Macros и выберите из списка нужные параметры. В поле Working Directory впишите $FileDir$ или выберите Insert Macros и выберите нужный параметр. Нажмите кнопку «ОК».
5. Для того чтобы запустить код, выберите Tools→ External tools и run_2d_model (либо свое название, выбранное ранее).
6. Для добавления «горячих клавиш» выберите File → Settings или нажмите комбинацию клавиш «Ctrl+Alt+S». В открывшемся меню выберите вкладку Keymap и перейдите к созданному external tool. Нажмите на run_2d_model правой кнопкой мыши, выберите Add Keyboard Shortcut.
7. В открывшемся окне введите желаемое сочетание клавиш для вызова тула и нажмите кнопку «ОК».
8. Теперь для запуска кода достаточно нажать выбранное сочетание (в данном случае Shift+B, но возможно выбрать любое другое).
В случае возникновения ошибки выберите Settings → Tools → Terminal и введите свой путь к файлу cmd.exe (shell path). Затем нажмите Apply.
При первом запуске программы для установки соединения с роботом потребуется подтверждение от пользователя.
Чтобы разрешить соединение, введите в командной строке Y или Yes.
1. Откройте папку с файлами, которые хотите отправить, в VSCode с помощью File → Open Folder.
2. Вызовите Terminal → Configure Tasks.
3. Если ранее задач не было, то выберите в выпадающем меню Create tasks.json file from template → Others. Откроется файл tasks.json. Если tasks были созданы ранее, он откроется сразу после пункта 2.
4. Удалите всё из этого файла и вставьте данный код:
Здесь:
<path to scripts dir> — полный путь к папке с программами, которые необходимо загрузить на роботов,
<file with ip addresses> — название файла .txt, в котором содержатся ip-адреса роботов для загрузки файлов. Каждый ip-адрес на новой строке.
5. В строке, соответствующей полю "windows": { "command" укажите путь к файлу send_files.cmd. Файл с ip-адресами роботов должен находиться в той же папке, что и отправляемые программы. Например:
6. Сохраните файл tasks.json.
7. Теперь при нажатии Terminal → Run Task в выпадающем меню выбираем Send files, чтобы загрузить программы на роботов, или соответствующую комбинацию клавиш Ctrl+Shift+B.
1. Включите режим двумерной модели.
2. Нажмите на кнопку «Выполнить».
3. Откроется окно двумерной модели и начнется выполнение программы.
4. При переключении в режим редактирования можно отслеживать шаги выполнения программы.
Из TRIK Studio можно загрузить готовую программу на робота, чтобы в дальнейшем автономно её исполнять без связи с компьютером. 1 . Подключите контроллер ТРИК к TRIK Studio. 2 . Нажмите на кнопку «Загрузить программу».
3 . Для запуска программы на контроллере зайдите в меню «Файлы», выберите нужную программу и нажмите на кнопку «Ввод».
1. Выберите ведущий контроллер и подключите его к существующей Wi-Fi-сети в режиме клиента.
2. В веб-интерфейсе ведущего контроллера в поле «Взаимодействие роботов» укажите бортовой номер (обычно для ведущего это 01, но можно любой другой) и его IP-адрес.
3. Подключите все остальные контроллеры к этой же Wi-Fi-сети в режиме клиента.
4. Укажите для каждого из них в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес ведущего контроллера.
4. На всех контроллерах зайдите в пункт меню Взаимодействие и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллеров должна появиться иконка.
1. Выберите ведущий контроллер и раздайте с него Wi-Fi с помощью режима точки доступа (выберите в меню Сеть → Wi-Fi точка доступа).
2. Далее вернитесь на главный экран меню и выберите пункт Взаимодействие.
3. Укажите бортовой номер (обычно для ведущего это 01, но можно любой другой) и его IP-адрес.
4. Подключите остальные контроллеры к ведущему с помощью режима Wi-Fi-клиент. Для этого в веб-интерфейсе каждого контроллера необходимо в полях «Wi-Fi клиент» указать имя и пароль сети ведущего контроллера в режиме Wi-Fi точки доступа.
5. Зайдите в веб-интерфейс, используя IP-адрес, который отображается на контроллере в режиме Wi-Fi клиент.
6. Укажите для каждого из контроллеров в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес ведущего контроллера.
7. На всех контроллерах зайдите в пункт меню Взаимодействие и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллера должна появиться иконка.
Запускает переданную в качестве параметра функцию в отдельном потоке.
Ожидает завершения указанного потока.
Threading.joinThread("threadId")В качестве параметра необходимо указать id потока.
Заканчивает исполнение указанного потока.
Threading.killThread("threadId")В качестве параметра необходимо указать id потока.
Запрашивает принятое сообщение.
Если wait равен true, то ожидает, пока не придет сообщение.
Посылает сообщение указанному потоку.
В качестве параметров необходимо указать id потока и сообщение.
Запускает переданную в качестве параметра функцию в отдельном потоке.
Внимание! При этом создаётся новая копия для всех глобальных переменных. Так что если в одном потоке значение переменной меняется, в другом потоке оно остаётся старым.
В качестве параметров необходимо указать id потока и функцию.
Метод
Описание
Ожидает завершения указанного потока.
Заканчивает исполнение указанного потока.
Запрашивает принятое сообщение.
Посылает сообщение указанному потоку.
.xml.qrs.Скачайте файл run_2d_model.cmd для Windows или run_2d_model.sh для Linux и поместите его в папку, в которой установлена TRIK Studio.
Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате .xml, создайте в данной папке пустой проект default.qrs.
Инструкция протестирована на Sublime Text 3 (Build 3211). Скачать Sublime Text можно на официальном сайте.
1. Откройте Sublime Text.
2. Выберите Tools → Build System → New Build System.
3. Откроется окно с текстовым файлом. В нем необходимо всё стереть и вставить вместо этого следующий код, где <path to field dir> — полный путь к папке с полями:
4. В зависимости от вашей операционной системы отредактируйте этот файл:
Для Linux необходимо подставить свой путь к файлу run_2d_model.sh вместо указанного в коде. Например:
"cmd": ["/home/admin/TRIKStudio/run_2d_model.sh", “/home/admin/fields/”, "$file"]
Для Windows необходимо подставить свой путь к файлу run_2d_model.cmd вместо указанного в коде. Например:
"cmd": ["D:\TRIKStudio\run_2d_model.cmd", "D:\Users\Admin\fields", "$file"]
5. Сохраните этот текстовый файл в предлагаемой директории
<папка с системными файлами>\Sublime Text 3\Packages\User
под именем TRIK.sublime-build.
6. Откройте ваш исходный код в Sublime Text. Для его запуска достаточно нажать Tools → Build или соответствующую комбинацию клавиш (Ctrl+B).
За предложение добавить данную функциональность команда проекта ТРИК благодарит участника Олимпиады НТИ ИРС 2018—2020 гг. Александра Журавлева.



Блоки на сцену в TRIK Studio можно добавить тремя способами:
Перетаскиванием соответствующих иконок из палитры элементов на диаграмму.
.
между блоками с помощью линкеров.
Кликнете левой кнопкой мыши на необходимый блок, расположенный на панели . Не отпуская кнопку мыши, передвиньте блок на сцену.
Нарисуйте на сцене условное изображение блока левой кнопкой мыши. Блок появится в центре нарисованного изображения.
Жесты можно рисовать несколькими штрихами. Ввод жеста заканчивается, если штрихи некоторое время не рисовали (настроить время можно в окне настроек на вкладке ).
Доступные условные изображения можно посмотреть двумя способами:
1. В окне «Жесты мышью», открывающемся через главное меню Инструменты → Жесты мышью.
2. Во всплывающей подсказке, появляющейся при наведении курсора мыши на блок на панели «Палитра».
Начните (цветного кружка справа от блока, появляющегося после выделения блока) и отпустите левую клавишу мыши, когда курсор будет находится на пустом участке диаграммы.
В появившемся меню выберите пункт «Создать новый элемент». Появится новое меню с блоками.
Выберите нужный блок.
Удаление добавленного блока возможно двумя способами:
Выделите блок левой кнопкой мыши и затем нажмите кнопку «Delete».
Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Удалить».
1. Выберите необходимые блоки одним из способов.
1.1. Зажмите кнопку «Ctrl» и выделите правой кнопкой мыши необходимые блоки.
1.2. Правой кнопкой мыши выделите область на сцене с необходимыми блоками.
2. Удалите выбранные блоки одним из способов.
2.1. Нажмите кнопку «Delete» на клавиатуре.
2.2. Нажмите правой клавишей мыши на любой выделенный блок и выберите в появившемся меню пункт «Удалить».
Для замены добавленного блока:
1. Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Заменить на…».
2. Выберите из списка блок, которым хотите заменить выделенный.
В данной статье рассматривается настройка и использование внешней среды программирования VSCode для вызова программ в 2D-модели TRIK Studio.
Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.
Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, Олимпиады НТИ ИРС).
Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате .xml (подробнее в статье ), так и в формате .qrs.
Скачайте файл для Windows или для Linux и поместите его в папку, в которой установлена TRIK Studio.
Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате xml, создайте в данной папке пустой проект default.qrs.
Инструкция протестирована на январском релизе 2020 года (version 1.42). Скачать VSCode можно на .
1. Создайте папку, в которой будет находиться файл с исходным кодом.
2. Откройте эту папку в VSCode c помощью File → Open Folder.
3. Вызовите Terminal → Configure Tasks.
4. Если ранее задач не было, то выберите в выпадающем меню Create tasks.json file from template → Others. Откроется файл tasks.json.
Если tasks были созданы ранее, он откроется сразу после пункта 3.
5. Удалите всё из этого файла и вставьте данный код, где <path to field dir> — полный путь к папке с полями:
6. В зависимости от вашей операционной системы отредактируйте файл tasks.json:
Для Linux необходимо в строке, соответствующей полю "command", указать путь к отредактированному run_2d_model.sh и третьим аргументом указать файл вашего исходного кода. Данный файл должен находиться в папке, которую мы открыли с помощью VSCode. Например: "command": "/home/admin/TRIKStudio/run_2d_model.sh /home/admin/fields/ script.js"
Для Windows необходимо в строке соответствующей полю "windows": { "command" указать путь к отредактированному run_2d_model.cmd и третьим аргументом указать файл вашего исходного кода. Данный файл должен находиться в папке, которую мы открыли с помощью VSCode
7. Сохраните файл tasks.json.
8. Теперь при нажатии Terminal → Run Task в выпадающем меню выберитеRun TRIK 2D model, чтобы запустить ваш код, или соответствующую комбинацию клавиш (Ctrl+Shift+B).
За предложение добавить данную функциональность команда проекта ТРИК благодарит участника Олимпиады НТИ ИРС 2018—2020 гг. Александра Журавлева.
Видеокамера в режиме датчика линии.
Метод
Описание
Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии.
Включает видеокамеру и инициализирует её в режиме датчика линии.
Возвращает массив с координатой по оси X центра линии относительно центра кадра, вероятность перекрёстка, относительный размер линии.
Выключает видеокамеру и прекращает работу датчика.
Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии. После этого метод «» начинает возвращать данные для этой линии.
Включает видеокамеру и инициализирует её в режиме датчика линии. Булевый параметр определяет, выводить ли на экран изображение с камеры (true — выводить).
Булевый параметр определяет, выводить ли на экран изображение с камеры:
true — выводить,
false — не выводить.
Возвращает массив, в ячейках которого находятся следующие данные:
в нулевой ячейке координата по оси X центра линии относительно центра кадра (от -100 до 100, -100 — центр линии на краю кадра слева);
в первой ячейке — вероятность перекрёстка (число от 0 до 100, показывающее сколько точек цвета линии находится в горизонтальной полосе в центре кадра);
во второй ячейке — относительный размер линии, число от 0 до 100 (100 — линия занимает почти весь кадр, 0 — линии нет на кадре).
Выключает видеокамеру и прекращает работу датчика.
Представляет энкодеры силовых моторов, подключающиеся к портам E1, E2, E3, E4.
Метод
Описание
Возвращает текущее показание энкодера в градусах на заданном порту.
Сбрасывает на 0 текущее показание энкодера.
Возвращает текущее показание энкодера в «тиках» на заданном порту.
Возвращает текущее показание энкодера в градусах на заданном порту.
В качестве параметра необходимо указать порт.
Сбрасывает в 0 текущее показание энкодера.
В качестве параметра необходимо указать порт.
Возвращает текущее показание энкодера в «тиках» на заданном порту.
С помощью веб-интерфейса, а также утилит PuTTY и WinSCP
Скриншот экрана контроллера ТРИК можно сделать двумя способами:
С помощью веб-интерфейса.
С помощью утилит PuTTY и WinSCP.
1. Подключитесь к контроллеру по Wi-Fi любым из .
2. Войдите в , набрав ip-адрес контроллера в браузере.
3. Убедитесь, что на экран контроллера выведено изображение или текст, скриншот которого хотите сделать.
4. Выберите в веб-интерфейсе пункт меню «Изображение» и нажмите кнопку «Сделать снимок экрана».
5. После этого скриншот появится в списке. Если этого не произошло, обновите страницу.
6. Для загрузки сделанных скриншотов нажмите кнопку «Загрузить всё».
1. Подключитесь к контроллеру по Wi-Fi любым из .
2. Откройте TRIK Studio.
3. Запустите утилиту . Для этого в главном меню откройте Инструменты → Сторонние программы → PuTTY.
4. Дождитесь завершения процесса подключения.
5. Убедитесь, что на экран контроллера выведено изображение или текст, скриншот которого хотите сделать.
6. Введите команду fbgrab image.png, где image — произвольное название сохраненного изображения.
7. При удачном исходе в консоль будет выведен следующий текст:
Resolution: 240x320 depth 16
Converting image from 16
Now writing PNG file (compression -1)
8. Запустите утилиту . Для этого в главном меню откройте Инструменты → Сторонние программы → WinSCP.
9. Если у вас появилось окно «Warning», нажмите «Yes».
10. Выберите в левом окне директорию, в которую хотите сохранить снимок. Перетащите созданное изображение из правого окна в левое.
Предоставляет управление мотором робота (силовым или сервомотором), подключающимся к портам M1, …, M4, S1, ..., S6.
Метод
Описание
Блокировка моторов для торможения в течение указанного времени.
Возвращает текущую мощность мотора.
Выключает мотор.
Блокировка моторов для торможения в течение указанного времени в миллисекундах. Функция асинхронная, то есть не блокирующая (после ее вызова программа переходит к следующему действию, а не ожидает указанное время торможения).
В качестве параметра необходимо указать время в миллисекундах. По умолчанию (если параметр не указан), моторы блокируются на 500 миллисекунд.
При написании алгоритма учитывайте, что после блокировки подача тока на двигатели выключается, поэтому необходимо дождаться этого состояния прежде чем подавать новую мощность на двигатели.
Возвращает текущую мощность мотора (от -100 до 100).
Выключает мотор. Перестает подавать на него питание, но мотор может продолжить свободное вращение по инерции или под действием иных внешних сил.
Включает мотор с указанной мощностью.
В качестве параметра необходимо указать мощность.Мощность задаётся в диапазоне от -100 («полный назад») до 100 («полный вперёд»). 0 соответствует force break, то есть мотор останавливается, при этом он заблокирован и остаётся под напряжением.
Служит для работы с кнопками на пульте робота.
Метод
Описание
Посылается, когда кнопка с указанным кодом нажата или отпущена.
Возвращает true, если кнопка с указанным кодом нажата в данный момент.
Сбрасывает запомненные нажатия кнопок.
Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки.
Посылается, когда кнопка с указанным кодом нажата или отпущена.
Первый параметр — код кнопки, второй — 1, если кнопка нажата, 0, если отпущена.
Возвращает true, если кнопка с указанным кодом нажата в данный момент.
Возможные варианты:
KeysEnum.Left (код 105),
KeysEnum.Up (код 103),
KeysEnum.Down (код 108),
Сбрасывает запомненные нажатия кнопок.
Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки. Возможные варианты:
KeysEnum.Left (код 105),
KeysEnum.Up (код 103),
KeysEnum.Down (код 108),
Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме 2D модели.
Метод
Описание
Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен.
Закончить рисование маркером.
Возвращает true, если маркер активен, false- если нет.
Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен.
Закончить рисование маркером.
Возвращает true, если маркер активен, false- если нет.
Вызывает метод down("black"), или up() в зависимости от аргумента.
Отправить сообщение «5» с одного робота и принять его на втором.
Обратите внимание, что решить задачу возможно только в режиме реального робота.
Для решения задачи необходимо:
Написать для ведущего робота.
Написать для второго робота.
роботов в единую сеть.
Запустить программы на роботах.
1. Перейдите в TRIK Studio в режим .
2. Введите переменную для сообщения message и инициализируйте её, присвоив ей цифру 5 в блоке «».
3. Добавьте блок «» и «». В свойствах блока «» укажите бортномер робота, на который вы хотите отправить сообщение, и переменную, содержащую сообщение.
1. Перейдите в TRIK Studio в режим .
2. Добавьте блок «».
В свойствах блока укажите переменную, в которую хотите записать сообщение, отправленное с другого робота. Переменная может называться как угодно.
В свойстве «Дождаться сообщения» укажите значение истина.
3. После того как сообщение пришло, выведите его на экран робота в течение 3 секунд, а затем закончите выполнение алгоритма. Для этого добавьте блоки «», «» и «».
В свойствах блока «Напечатать текст» поставьте флажок Вычислять и укажите значение истина в поле «Обновить картинку».




Реализует связь между роботами в сети посредством механизма почтовых ящиков.
{
"version": "2.0.0",
"tasks": [ {
"label": "Send files",
"type": "shell",
"windows": {
"command": "C:\\TRIKStudio\\send_files.cmd <path to scripts dir> <file with ip addresses>"
},
"group": "test",
"presentation": {
"reveal": "always",
"panel": "new"
}
}]
}"command": "C:\TRIKStudio\send_files.cmd C:\Users\Admin\myfiles ip_addr.txt"Threading.receiveMessage(wait)Threading.sendMessage("threadId", "message")Threading.startThread("newThreadId", "functionName"){
"cmd": ["D:\\TRIKStudio\\run_2d_model.cmd", “<path to fields dir>”, "$file"],
"selector": "source.js",
"encoding": "windows-1251"
}{
"cmd": ["D:\\TRIKStudio\\send_filesl.cmd", “<path to scripts dir>”, "<file with ip addresses>"],
"selector": "source.js"
}"cmd": ["C:\\TRIKStudio\\send_files.cmd", "C:\\Users\\Admin\\myfiles", "ip_addr.txt"]








brick.lineSensor("video1").detect()brick.lineSensor("video1").detect();brick.lineSensor("video1").init(True)brick.lineSensor("video1").init(true);brick.encoder(portName).read()
brick.encoder("portName").read()brick.encoder(portName).read();
brick.encoder("portName").read();brick.encoder(E1).read()
brick.encoder("E2").read()brick.encoder(E1).read();
brick.encoder("E2").read();Включает мотор с указанной мощностью.
brick.motor(motorName).brake(durationMs)
brick.motor("motorName").brake(durationMs)brick.motor(motorName).brake(durationMs);
brick.motor("motorName").brake(durationMs);KeysEnum.Enter (код 28),
KeysEnum.Right (код 106),
KeysEnum.Power (код 116),
KeysEnum.Esc (код 1).
KeysEnum.Enter (код 28),
KeysEnum.Right (код 106),
KeysEnum.Power (код 116),
KeysEnum.Esc (код 1).
brick.keys().buttonPressed.connect(lambda code, value: brick.stop() if code == KeysEnum.Up else print(code))brick.keys().buttonPressed.connect(function(code, value){if (code==KeysEnum.Up)brick.stop() ; });Вызывает метод down("black"), или up() в зависимости от аргумента.
brick.marker().down(color)
brick.marker().down("color")brick.marker().down(color)
brick.marker().down("color")brick.marker().down("blue")brick.marker().down("blue")brick.lineSensor("video1").read()brick.lineSensor("video1").read();brick.lineSensor("video1").stop()brick.lineSensor("video1").stop();brick.encoder(portName).reset()
brick.encoder("portName").reset()brick.encoder(portName).reset();
brick.encoder("portName").reset();brick.encoder(E1).reset()
brick.encoder("E2").reset()brick.encoder(E1).reset();
brick.encoder("E2").reset();brick.encoder(portName).readRawData()
brick.encoder("portName").readRawData()brick.encoder(portName).readRawData();
brick.encoder("portName").readRawData();brick.encoder(E1).readRawData()
brick.encoder("E2").readRawData()brick.encoder(E1).readRawData();
brick.encoder("E2").readRawData();pow1 = brick.motor(motorName).power()
pow2 = brick.motor("motorName").power()var pow1 = brick.motor(motorName).power();
var pow2 = brick.motor("motorName").power();brick.motor(motorName).powerOff()
brick.motor("motorName").powerOff()brick.motor(motorName).powerOff();
brick.motor("motorName").powerOff();brick.motor(motorName).setPower(power)
brick.motor("motorName").setPower(power)brick.motor(motorName).setPower(power);
brick.motor("motorName").setPower(power);brick.keys().isPressed(KeysEnum.Up)brick.keys().isPressed(KeysEnum.Up);brick.keys().reset()brick.keys().reset();brick.keys().wasPressed(KeysEnum.Up)brick.keys().wasPressed(KeysEnum.Up);brick.marker().up()brick.marker().up()brick.marker().isDown()brick.marker().isDown();brick.marker().setDown(True) # Вызывает brick.marker().down("black")
brick.marker().setDown(False) # Вызывает brick.marker().up()brick.marker().setDown(true) // Вызывает brick.marker().down("black")
brick.marker().setDown(false) // Вызывает brick.marker().up()"command": "D:\TRIKStudio\run_2d_model.cmd D:\Users\Admin\fields script.js"Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.
Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.
Подключается к роботу с заданным IP-адресом по заданному порту (или порту по умолчанию), сообщает ему свой бортовой номер и регистрируется в сети «почтовых ящиков».
mailbox.joinNetwork("ip", port, hullNumber)
mailbox.joinNetwork("", port, hullNumber)mailbox.joinNetwork("ip", port, hullNumber);
mailbox.joinNetwork("", port, hullNumber);В качестве параметров необходимо указать IP-адрес робота, порт и бортномер. В случае, если порт не указан, используется порт по умолчанию. Борт номер должен быть положительным числом, начиная с 1. Если не указан IP-адрес, но изменен бортномер, то происходит смена бортномера без подключения.
mailbox.joinNetwork("192.168.77.1", -1, 1)
//Подключение к 192.168.77.1, порту 8889 без смены бортномера
mailbox.joinNetwork("192.168.77.1", -1, 2)
mailbox.joinNetwork("192.168.77.1", -1, 1);
//Подключение к 192.168.77.1, порту 8889 без смены бортномера
mailbox.joinNetwork("192.168.77.1", -1, 2);
//Подключение к 192.168.77.1, порту 8889 со сменой бортномера на 2
mailbox.joinNetwork(""
Возвращает true, если роботу пришло новое сообщение.
Возвращает бортовой номер робота.
Посылает сообщение после получения нового сообщения.
Первый параметр — бортовой номер отправителя, второй — само сообщение.
Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.
Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.
В качестве параметра необходимо указать бортовой номер робота, которому хотите послать сообщение и сообщение. Если бортовой номер не указан, то сообщение отправляется всем роботам, зарегистрированным в сети.
Метод
Описание
Подключается к роботу с заданным IP-адресом по заданному порту (или порту по умолчанию)номеру. Сообщает ему свой бортовой номер и регистрируется в сети «почтовых ящиков».
Возвращает true, если роботу пришло новое сообщение.
Возвращает бортовой номер робота.
Посылает сообщение после получения сообщения.
Соответствие портов моторов и колёс неизменяемо
Запрещает менять моторы в настройках двумерной модели.
5
Настройки симуляции двумерной модели (физика, шумы и т.д.) неизменяемы
Запрещает менять настройки шумов датчиков и моторов, а также физический движок в двумерной модели.




.
.
Имеет следующий вид:
переменная1, переменная2, …, переменнаяN = выражение1, выражение2, …, выражениеN
В самом простом виде переменная = выражение.
Записывается как обычное выражение и должен находиться в конце блока операторов.
Записывается как ;.
Блок операторов с двумя операторами присваивания и оператором возврата значения:
Инструкция для Windows, Linux и Ubuntu
Выберите операционную систему:
1. Скачайте последнюю версию . 2. Скачайте и установите программу .
Внимание! Для установки и использования DiskImager вам понадобятся права администратора.
3. Извлеките карту памяти microSD из контроллера ТРИК.
4. Вставьте её в компьютер, используя картридер.
5. Запустите DiskImager. Для смены языка выберите в меню About → Language.
6. Выберите диск для записи.
7. Нажмите «Восстановить флешки из образа» («Restore drives from»).
8. В появившемся окне отфильтруйте файлы по типу .xz и выберите скачанный файл.
9. Нажмите «Открыть».
10. Дождитесь выполнения операции.
1. Скачайте последнюю версию . 2. Извлеките карту памяти microSD из контроллера ТРИК. 3. Вставьте её в компьютер, используя картридер. 4. Если SD-карта имеет правильную таблицу разделов (первый раздел не менее 2 Гб, файловая система ext4), то перейдите к пункту 18. 5. Получите права суперпользователя (root):
6. Посмотрите устройства, которые в данный момент подключены к компьютеру:
7. Размонтируйте все разделы с помощью команды umount.
Пример:
8. Выберите вставленную карту памяти microSD:
Пример:
9. Посмотрите текущую таблицу разделов с помощью команды p.
10. Удалите все существующие разделы с помощью команды d.
11. Убедитесь, что все разделы удалились:
12. Создайте новый раздел с помощью команды n.
13. Все параметры, кроме размера, оставьте по умолчанию — жмите Enter. На запрос «Last sector, +sectors or +size{K, M, G}» укажите +2G.
14. Создайте раздел на оставшейся части карты памяти с помощью команды n. Все параметры оставьте по умолчанию.
15. Проверьте командой p, что получилось.
16. Примените изменения с помощью команды w.
17. Отформатируйте разделы с помощью команд sudo mkfs. ext4.
Пример:
18. Размонтируйте первый раздел с помощью команды umount.
Пример:
19. Распакуйте скачанный образ прошивки с помощью Archive Manager.
20. Скопируйте распакованный образ на карту памяти с помощью команды dd.
Пример:
1. Скачайте последнюю версию . 2. Извлеките карту памяти microSD из контроллера ТРИК. 3. Вставьте её в компьютер, используя картридер. 4. Откройте в файловом менеджере местоположение загруженного образа прошивки. 5. Вызовите контекстное меню правым кликом мыши по архиву и выберите первый пункт «Открыть в „Создание загрузочного диска“». 6. Из выпадающего меню выберите диск, на который хотите записать прошивку. Затем нажмите кнопку «Начать восстановление».
Представляет гироскоп контроллера ТРИК. В состоянии покоя среднее значение выходного сигнала гироскопа не равно нулю и называется смещением нуля (bias) или систематической ошибкой (bias error).
Параметр обусловлен многими факторами и может изменяться, например, в зависимости от окружающей температуры.
Для правильной работы гироскопа необходимо вычитать смещение нуля из приходящих значений. Вычислить его можно с помощью метода «calibrate».
Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «getCalibrationVaules», а при запуске программы вместо калибровки вызывать «setCalibrationValues».
Вычисляет смещение нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона.Рекомендуемое время калибровки — 10−20 секунд.
В качестве параметра необходимо указать:
msec — время в миллисекундах.
Сигнал, посылаемый сенсором после окончания калибровки.
Возвращает объект, в котором содержатся необходимые данные о смещении нуля.
Возвращает true в случае завершении калибровки, false — в противном случае.
Сигнал, посылаемый сенсором, когда у него готовы новые данные.
Возвращает массив из семи элементов:
0−2 — угловые скорости по трем осям (в миллиградусах/секунды),
3 — время последнего замера (в микросекундах),
4−6 — углы наклона по трем осям (в миллиградусах).
Возвращает массив из трех элементов с угловыми скоростями по трем осям.
Устанавливает объект, содержащий необходимые параметры о смещении нуля.
Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «», а при запуске программы вместо калибровки вызывать «setCalibrationValues».
В качестве параметра необходимо указать:
values — объект, содержащий данные о биасе.
Функция возвращает одномерный массив байт, в который записаны пиксели изображения в формате rgb32, снятого с камеры (размер изображения — 160x120). Данная функция может быть использована для решения задач распознавания маркеров.
Рассмотрим пример преобразования кадра, снятого на камеру, в цветовые форматы «оттенок серого» и «черно-белый».
Сделайте снимок и выведите результат на экран c помощью функции .
Результат:
Перевод изображения в черно-белый формат и вывод на дисплей:
Результат:
Перевод изображения в черно-белого и вывод на дисплей:
Результат:



Интерфейс и работа с 2D-моделью (интерактивным режимом имитационного моделирования) в TRIK Studio Junior почти полностью совпадает с интерфейсом и работой в TRIK Studio:
Отличительной особенностью является только элемент на панели редактирования модели мира.
Редактирование модели мира осуществляется с помощью соответствующей панели.
Служит для работы с программируемым пультом управления «».
{
"version": "2.0.0",
"tasks": [ {
"label": "Run TRIK 2D model",
"type": "shell",
"command": "/home/admin/TRIKStudio/run_2d_model.sh" <path to fields dir> script.js",
"windows": {
"command": "D:\\TRIKStudio\\run_2d_model.cmd <path to fields dir> script.js"
},
"group": "test",
"presentation": {
"reveal": "always",
"panel": "new"
}
}]
}mailbox.hasMessages()mailbox.hasMessages();x = mailbox.myHullNumber()var x = mailbox.myHullNumber();mailbox.newMessage.connect(lambda sender, message: print(message))mailbox.newMessage.connect(function(sender, message) { print(message); });message = mailbox.receive()var message = mailbox.receive(); mailbox.send("message")
mailbox.send(hullNumber, "message")mailbox.send("message");
mailbox.send(boardNumber, "message");mailbox.send(1, "Hello") # отправка сообщения роботу с бортовым номер 1mailbox.send(1, "Hello"); // отправка сообщения роботу с бортовым номер 1














Применимо к вещественным и целым значениям. Результат вещественный.
//
Целочисленное деление
Применимо к целым значениям. Результат целый.
^
Возведение в степень
Применимо к вещественным и целым значениям. Результат вещественный.
%
Остаток от деления
Применим к целым значениям. Результат целый.
&
Побитовое «и»
Применимо к целым значениям. Результат целый.
|
Побитовое «или»
Применимо к целым значениям. Результат целый.
>>, <<
Побитовые сдвиги вправо и влево
Применимы к целым значениям. Результат целый.
..
Конкатенация
Применим к строковым значениям. Результат — строка.
>=, >, <, <=
Операции сравнения
Применимы к целым и вещественным значениям. Результат булевый.
==
Операция проверки равенства
Применима к значениям любых типов. Результат булевый.
~=, !=, '~=', '!='
Операция проверки неравенства
Применима к значениям любых типов. Результат булевый. Альтернативные способы записи операции не различаются по смыслу.
and, &&
Логическое «и»
Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются.
or, ||
Логическое «или»
Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются.
Применим к строковым значениям. Результат целый.
Title
Title
Title
+
Сложение
Применимо к вещественным и целым значениям. Результат целый,
если оба аргумента целые, иначе вещественный.
-
Вычитание
Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.
*
Умножение
Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.
/
Title
Title
Title
-
Арифметический унарный минус
Применим к целым и вещественным значениям. Результат целый или вещественный (в зависимости от типа аргумента).
~
Побитовое «не»
Применимо к целым значениям. Результат целый.
not
Логическое «не»
Применимо к булевым, целым, вещественным и строковым значениям, результат булевый (0 или пустая строка считается false, всё остальное — true).
#
Деление
Оператор взятия длины
Метод
Описание
Вычисляет смещением нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона.
Возвращает объект, в котором содержатся необходимые данные о смещении нуля.
Возвращает true в случае завершении калибровки, false — в противном случае.
Возвращает массив из семи элементов: угловые скорости по трем осям, время последнего замера, углы наклона по трем осям.
Возвращает массив из трех элементов с угловыми скоростями по трем осям.
Устанавливает объект, содержащий необходимые параметры о смещении нуля.
Сигнал
Описание
Сигнал, посылаемый сенсором после окончания калибровки.
Сигнал, посылаемый сенсором, когда у него готовы новые данные.
brick.gyroscope().calibrate(msec)brick.gyroscope().calibrate(msec);a, b = 1, 2; -- оператор присваивания и пустой оператор
c = 3; -- оператор присваивания и пустой оператор
a + b + c -- оператор возврата значенияbrick.gyroscope().getCalibrationValues()brick.gyroscope().getCalibrationValues();brick.gyroscope().isCalibrated()brick.gyroscope().isCalibrated();brick.gyroscope().read()brick.gyroscope().read();brick.gyroscope().readRawData()brick.gyroscope().readRawData();brick.gyroscope().setCalibrationValues(values)brick.gyroscope().setCalibrationValues(values);Название
Описание
Горячая клавиша
Курсор
Переключение в режим выбора.
1
Стена
Добавление на сцену препятствия в виде стены.
При добавлении с нажатой клавишей Shift стена помещается либо под прямым углом, либо под углом в 45° относительно границ окна. Отображается стена в виде «кирпичной» линии.
При касании такой линии датчиком касания или при попадании в зону действия датчиком расстояния происходит срабатывание сенсора. Робот не может проехать сквозь стену.
2
Добавление на сцену препятствия в виде кубика
3
Мяч
Добавление на сцену препятствия в виде мяча. При касании тележки он отскакивает на некоторое расстояние.
4
Линия
Добавление на сцену прямой линии.
При добавлении линии с нажатой клавишей Shift линия помещается либо под прямым углом, либо под углом в 45° относительно границ окна.
На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.
Можно цвет и толщину линии.
5
Кривая Безье
Добавление на сцену линии с возможностью закругления. На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе. Можно цвет и толщину линии.
6
Прямоугольник
Добавление на сцену прямоугольника. Можно цвет и толщину линий прямоугольника, а также цвет его заливки.
7
Эллипс
Добавление на сцену эллипса. Можно цвет и толщину линий эллипса, а также цвет его заливки.
8
Стилус
Рисование линии мышью.
На нарисованную линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.
Можно цвет и толщину линий.
9
Добавление на сцену готового фона.
0
Элемент «Кубик» позволяет создавать упражнения в виде игр-головоломок, в которой «Исполнителю» необходимо расставить ящики по обозначенным местам лабиринта.
Посылается, когда пользователь оторвал палец от области управления с указанным номером.
Сбрасывает запомненные события от пульта.
Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.
Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство.
Сигнал
Описание
Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.
Посылается при подключении пульта к роботу.
Посылается при отключении пульта.
Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней.
Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.
Возвращает true, если на пульте была нажата кнопка с указанным номером. Сбрасывает запомненное нажатие для этой кнопки.
В качестве параметра необходимо указать номер кнопки — от 1 до 5.
Посылается при подключении пульта к роботу.
Посылается при отключении пульта.
Возвращает, нажата ли в данный момент область управления на пульте. Области управления имеют номера 0 и 1.
В качестве параметра необходимо указать номер области управления — 0 или 1.
Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней.
Если указанная область управления на пульте нажата, возвращает текущую x-координату нажатия.
В качестве параметра необходимо указать — номер области управления padId.
Если указанная область управления на пульте нажата, возвращает текущую y-координату нажатия.
В качестве параметра необходимо указать — номер области управления padId.
Посылается, когда пользователь оторвал палец от области управления с указанным номером.
В качестве параметров необходимо указать:
padId — номер области управления.
x, y — координаты последнего известного нажатия от -100 до 100. Координата (-100, -100) соответствует левому верхнему углу области управления.
Сбрасывает запомненные события от пульта.
Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.
Наклон кодируется числом от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.
Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство.
В качестве параметра необходимо указать число от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.
Метод
Описание
Возвращает true, если на пульте была нажата кнопка с указанным номером.
Возвращает, нажата ли в данный момент область управления на пульте.
Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси X.
Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси Y.
pic = getPhoto()var pic = getPhoto();# взять кадр в формате rgb32
pic = getPhoto()
brick.display().show(pic, total_height, total_width, "rgb32")
script.wait(2000)// взять кадр в формате rgb32
var pic = getPhoto();
brick.display().show(pic, total_height, total_width, "rgb32");
script.wait(2000);


























gamepad.buttonWasPressed(buttonNumber)gamepad.buttonWasPressed(buttonNumber);gamepad.buttonWasPressed(5)gamepad.buttonWasPressed(5);gamepad.isPadPressed(padId)gamepad.isPadPressed(padId);gamepad.isPadPressed(1)gamepad.isPadPressed(1);gamepad.padX(padId)gamepad.padX(padId);gamepad.padY(padId)gamepad.padY(padId);gamepad.padUp.connect(lambda padId, x, y: brick.stop())gamepad.padUp.connect( function(padId, x, y) { brick.stop(); });gamepad.reset()gamepad.reset();gamepad.wheel()gamepad.wheel();gamepad.wheelEvent.connect(lambda percent: brick.motor("E1").setPower(percent))gamepad.wheelEvent.connect(function(percent) { brick.motor("E1").setPower(percent); });sudo -ifdisk -lumount /dev/{first partition}
umount /dev/{second partition}
...umount /dev/sdb1fdisk /dev/{устройство}sudo fdisk /dev/sdbpdpnCommand (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Partition number (1-4, default 1):
First sector (4096-784932712):
Last sector, +sectors or +size{K,M,G}: +2GCommand (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Partition number (1-4, default 1):
First sector (4096-784932712):
Last sector, +sectors or +size{K,M,G}:pwsudo mkfs.ext4 /dev/{раздел}sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2umount /dev/{first partition}umount /dev/sdb1sudo dd bs=4M if=trik-base-v2-trikboard.ext4 of=/dev/{first partion}sudo dd bs=4M if=trik-base-v2-trikboard.ext4 of=/dev/sdb1def grayScale(sPic):
bufPic = []
for i in range(total_height):
for j in range(total_width):
x = i * total_width + j
p = sPic[x]
r = (p & 0xff0000) >> 16 # взять значение компоненты красного
g = (p & 0xff00) >> 8 # взять значение компоненты зеленого
b = (p & 0xff) # взять значение компоненты синего
p = r * 0.299 + g * 0.587 + b * 0.114; # компонента Y из YUV
bufPic.append(p)
return bufPicfunction grayScale(sPic){
bufPic = [];
for(var i = 0; i < total_height; i++)
for(var j = 0; j < total_width; j++){
var x = i * total_width + j;
var p = sPic[x];
var r = (p & 0xff0000) >> 16; // взять значение компоненты красного
var g = (p & 0xff00) >> 8; // взять значение компоненты зеленого
var b = (p & 0xff); // взять значение компоненты синего
p = r * 0.299 + g * 0.587 + b * 0.114; // компонента Y из YUV
bufPic[x] = p;
}
return bufPic;
}pic = grayScale(pic)
brick.display().show(pic, total_height, total_width, "grayscale8")
script.wait(2000)var pic = grayScale(pic);
brick.display().show(pic, total_height, total_width, "grayscale8");
script.wait(2000);# Бинаризация -- перевод изображения в ЧБ
def binarization(treshold, sPic):
bufPic = []
for i in range(len(sPic)):
bufPic.append(255 if sPic[i] > treshold else 0)
return bufPic// Бинаризация -- перевод изображения в ЧБ
function binarization(treshold, sPic){
bufPic = []
for(var i = 0; i < sPic.length; i++){
bufPic[i] = sPic[i] > treshold ? 255 : 0;
}
return bufPic;
}pic = binarization(80, pic)
brick.display().show(pic, total_height, total_width, "grayscale8")
script.wait(2000)var pic = binarization(80, pic);
brick.display().show(pic, total_height, total_width, "grayscale8");
script.wait(2000);





















































Сенсорные переменные — зарезервированные переменные для получения показаний сенсоров, подключенных к соответствующим портам.
Эти значения можно присваивать переменным и использовать в математических выражениях.
Изменение переменных можно отследить по ходу программы в таблице переменных.
Переменная
Описание
Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z.
buttonDown
buttonUp
buttonEnter
buttonEsc
buttonPower
buttonLeft
buttonRight
Состояние кнопок на корпусе контроллера ТРИК: «Вниз»,
«Вверх»,
«Ввод»,
«Отмена», «Питание», «Влево»,
«Вправо». Возможные значения: 0 — кнопка не нажата. 1 — нажатая кнопка.
Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z соответственно.
Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.
Обновляются только когда датчик цвета включён и инициализирован.
От 0 до 255.
Координаты нажатия активных областей на пульте.
Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.
От (-100, -100) до (100, 100), (-100, -100) — левый верхний угол активной области. (-101, -101) — если нажатия нет.
Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.
Массив из трёх элементов, содержащий показания камеры в режиме датчика линии.Значения обновляются при включенном и инициализированном датчике.









Представляет методы управления выполнением скрипта и доступ к функциям операционной системы.


























2. Панель с полями для редактирования настроек текущей вкладки. Кнопки «Импорт» и «Экспорт» внизу окна позволяют сохранить текущие настройки в файл и загрузить его на другом компьютере.
Язык — язык среды. После изменения требуется перезапуск TRIK Studio. Настройка «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.
Автосохранение — возможность включить или выключить автосохранение открытого проекта, а также задать интервал автосохранения в секундах.
Жесты мышью — включить или выключить механизм распознавания жестов мышью.
Задержка после жеста — временной отрезок системного ожидания между выполнением жеста мышью и его исполнением. Задержка позволяет рисовать жест в несколько штрихов. Значение указывается в миллисекундах.
Проверять на наличие обновлений при старте — связываться при запуске с сервером обновлений и запускать автообновление при необходимости.
Режим работы на тач-экране — включить оптимизацию пользовательского интерфейса для сенсорных экранов.
Режим плавающих окон — открепляет окна для свободного передвижения.
Антиалиасинг — режим рисования линий со сглаживанием, улучшает внешний вид диаграмм за счёт незначительного снижения скорости работы системы.
Показывать сплешскрин — включить/выключить отображение стартового экрана с логотипом TRIK Studio.
Длина списка недавних проектов — сколько проектов показывать в пункте «Недавние проекты» меню «Файл».
Какой набор иконок использовать для отображения диаграммы.
Размер панели инструментов — задать размер кнопок на панели инструментов.
Использовать системный шрифт — заменить шрифт для отображения надписей на диаграмме по умолчанию на один из шрифтов, установленных в системе. Размеры надписей на блоках заданы жёстко, поэтому изменение шрифта может привести к наползанию надписей друг на друга, однако можно экспериментировать.
Показывать сетку — отображать выравнивающую сетку на сцене редактора диаграмм.
Выравнивание по сетке — осуществлять выравнивание блоков по сетке.
Показать направляющие — отображать направляющие линии на сцене редактора диаграмм. Направляющие линии появляются, когда блок находится на одной горизонтали или вертикали с другим блоком, и помогают выравнивать блоки на сцене.
Выравнивание по направляющим — осуществлять выравнивание блоков по направляющим.
Толщина сетки — толщина линий сетки. Настраивается в зависимости от яркости монитора или проектора.
Размер ячейки — размер одной ячейки сетки. Размер по умолчанию подобран так, чтобы блок накрывал четыре ячейки.
Размер области масштабирования — размер области, потянув за которую, можно изменить размер блока «Комментарий».
Тип связей — режим рисования связей на диаграмме.
Ломаные линии — связи рисуются как ломаные с точками излома, которые добавляются пользователем.
Прямоугольные линии — связи рисуются как ломаные линии, каждый сегмент которых параллелен осям координат. Точки излома в этом случае добавляются системой автоматически.
Кривые Безье — связи рисуются как гладкие кривые, кривизна которых может быть задана пользователем.
Отступ связей-петель — насколько связь, входящая в тот же блок, из которого она исходит, должна отступать от блока.
Размер — размер встроенного линкера, т.е. кружка рядом с блоком на диаграмме, осуществляющего создание связей между элементами (см. статью «Связи между блоками»).
Отступ — отступ встроенного линкера от пиктограммы блока.
Представление — выбор между режимом отображения иконок и названий или только иконок в палитре.
Количество иконок в строке — количество иконок на строку палитры при выбранном режиме «Иконки».
Состав этой вкладки зависит от установленных подключаемых модулей поддержки платформ и от текущей выбранной платформы. Типовые элементы вкладки описаны ниже.
Конструктор, для которого пишутся программы в среде. От этой опции зависит список доступных блоков в палитре и доступных действий на панели инструментов.
Выбор типа модели исполнения для выбранного конструктора. В большинстве случаев это 2D-модель или реальный робот, но для некоторых конструкторов одна из моделей может быть недоступной, в этом случае этот пункт в окне не отображается.
Внешний вид робота в 2D-модели.
Специфичные для конструктора настройки подключения к роботу, такие как IP-адрес робота для ТРИК или COM-порт Bluetooth-соединения для Lego NXT. Если соединение в выбранном режиме не требуется, данный пункт не отображается.
Специфичные для конструктора настройки программ, непоставляемых в комплекте с TRIK Studio, которые должны быть установлены на компьютере. Для большинства режимов работы дополнительные установленные программы не нужны, так что соответствующие пункты не отображаются в окне.
Здесь указывается, какие сенсоры подключены к портам робота.
Запуск после загрузки — запускать программу сразу после загрузки её на робот или нет. Применимо только для некоторых режимов некоторых конструкторов (например, для Lego NXT в режиме генерации).
Сенсоры — интервал в миллисекундах, после которого добавляется новая точка с показанием сенсора.
Масштабирование — интервал в миллисекундах, после которого график автоматически изменяет свой масштаб, чтобы оптимально отобразить значения.
Текстовая информация — интервал в миллисекундах, после которого на графике обновляются надписи со значениями.
Данная вкладка позволяет задать или изменить горячие клавиши для наиболее часто используемых действий. Для этого надо выбрать ячейку, соответствующую действию, и в строке «Сочетание» внизу окна нажать нужное сочетание клавиш.
Кнопка «Очистить» удаляет сочетание клавиш из ячейки.
Все горячие клавиши, установленные по умолчанию, вы можете посмотреть в статье:
TRIK Studio позволяет экспортировать текущие настройки в файл для загрузки их на другом компьютере. Для этого необходимо нажать кнопку «Экспорт» внизу окна.
TRIK Studio позволяет импортировать настройки из экспортированного ранее файла. Для этого необходимо нажать кнопку «Импорт» внизу окна и выбрать нужный файл .ini.
Устанавливает флаг событийно-ориентированной программы.
Выполняет переданную в качестве параметра команду консоли операционной системы.
Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу.
Создаёт и возвращает таймер.
Приостанавливает выполнение скрипта на переданное количество миллисекунд.
Записывает строку в файл.
Устанавливает флаг окончания работы для событийно-ориентированной программы. Как только будет завершён текущий обработчик события, исполнение скрипта закончится.
script.quit()script.quit(); Возвращает случайное число из заданного диапазона.
В качестве параметров необходимо указать границы диапазона.
Считывает всё содержимое указанного файла в массив строк.
В качестве параметра необходимо указать название файла с расширением.
Удаляет указанный файл.
В качестве параметра необходимо указать название файла с расширением.
Устанавливает флаг событийно-ориентированной программы. По окончанию работы скрипт не выгружается из памяти, а продолжает ждать наступления событий до тех пор, пока какой-либо из обработчиков не вызовет метод «quit».
Выполняет переданную команду.
В качестве параметра необходимо указать команду консоли операционной системы.
Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу.
Создаёт и возвращает таймер (класс «QTimer»), посылающий сигнал timeout каждые n миллисекунд.
В качестве параметра передаётся n .
Приостанавливает выполнение скрипта на переданное количество миллисекунд.
В качестве параметра передаётся количество миллисекунд.
Записывает сроку в файл.
В качестве параметров необходимо указать название файла и записываемую строку.
Метод
Описание
Устанавливает флаг окончания работы для событийно-ориентированной программы.
Возвращает случайное число из заданного диапазона.
Считывает всё содержимое указанного файла в массив строк.
Удаляет указанный файл.
Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.
Обновляются только когда датчик цвета включён и инициализирован.
Возможные значения: 0 .. 255
encoder1 encoder2 encoder3 encoder4
Показания энкодеров на портах E1, E2, E3, E4 соответственно.
gamepadButton1
...
gamepadButton5
Состояние кнопок на пульте с 1 по 5 соответственно. 0 — кнопка не нажата. 1 — кнопка нажата.
gamepadConnected
Состояние подключения пульта.
0 — пульт не подключен. 1 — пульт подключен.
Координаты нажатия активных областей на пульте. Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.
Возможные значения: От (-100, -100) до (100, 100).
(-101, -101) — если нажатия нет.
gamepadPad1Pressed gamepadPad2Pressed
Состояние нажатия на область левую и правую область пульта соответственно. Координаты нажатия можно узнать с помощью переменных gamepadPad1 и gamepadPad2. Возможные значения: 1 — активная область на пульте нажата. 0 — активная область на пульте не нажата.
gamepadWheel
Значение наклона пульта (если он подключён и на нём включён «руль»). Возможные значения: -100 ... 100.
-101 — если данных о положении «руля» нет.
-100 — крайнее левое положение. 100 — крайнее правое положение.
Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.
Массив из трёх элементов, содержащий показания камеры в режиме датчика линии. Значения обновляются при включенном и инициализированном датчике линии.
objectSensorX objectSensorY
Координаты распознанного объекта видеокамерой относительно центра экрана. Значения обновляются при включенном и инициализированном датчике.
Возможные значения: От -100 до 100 (относительно центра кадра).
objectSensorSize
Размер распознанного объекта видеокамерой. Значение обновляется при включенном и инициализированном датчике объекта.
Возможные значения: От 0 до 100. 100 — объект занимает весь кадр.
sensorA1 ... sensorA6
Показания датчиков, подключенных к соответствующим аналоговым портам.
sensorD1 sensorD2
Показания датчиков, подключенных к соответствующим цифровым портам.
colorSensor[0]
Интенсивность красного цвета
colorSensor[1]
Интенсивность зеленого цвета.
colorSensor[2]
Интенсивность синего цвета
lineSensor[0]
Отклонение линии от центра экрана от -100 (крайнее левое положение линии в кадре) до 100 (крайнее правое положение).
lineSensor[1]
Вероятность перекрёстка — определяется как процент точек внутри горизонтальной полосы в центре кадра, распознанных как линия.От 0 (таких точек нет) до 100 (все точки в горизонтальной полосе распознаны как линия).
lineSensor[2]
Относительный размер линии, то есть количество точек в кадре, определённых как линия, от 0 (линии в кадре нет) до 100 (весь кадр распознан как линия).















Подробная инструкция
Кроме подключения контроллера ТРИК к компьютеру с помощью Wi-Fi, его можно подлючить через преобразователь интерфейса USB в интерфейс UART на базе чипа CP2102:
Ниже описан алгоритм подключения.
1. с официального сайта производителя преобразователя: .
2. Распакуйте архив и запустите установщик драйвера, соответствующий вашей операционной системе (32 или 64 бит).
3. После окончания установки подключите преобразователь USB — UART к компьютеру (без контроллера). Дождитесь, пока устройство определится.
4. Проверьте в «Диспетчере устройств», правильно ли установился драйвер.
5. Если в «Диспетчере устройств» CP2102 USB to UART Bridge Controller отображается с восклицательным знаком, как на примере ниже, значит драйвер устройства не установлен. Повторите процедуру установки или обратитесь к специалисту.
Если данное устройство в списке «Диспетчера устройств» отсутствует, проверьте работоспособность USB-порта и правильность установки устройства в USB-порт. При корректном подключении преоразователя на нем должен загореться красный светодиод «POWER».
1. В «Диспетчере Устройств» вызовите свойства Silicon Labs CP210x USB to UART Bridge (COMx).
На вкладке «Параметры порта» установите:
Бит в секунду: 115200.
Управление потоком: Нет.
По кнопке «Дополнительно» можно выбрать номер COM-порта, если это необходимо:
1. На панели управления выберите раздел «Телефон и модем».
2. Введите любой телефонный код города и нажмите «ОК».
3. На вкладке «Модемы» нажмите кнопку «Добавить».
4. Выберите «Не определять тип модема (выбор из списка)» и нажмите «Далее».
5. Выберите «Стандартные типы модемов» → «Последовательный кабель для соединения компьютеров» и нажмите «Далее».
6. Выберите указанный ранее порт (в нашем примере — COM3), затем нажмите «Далее» и «Готово».
1. Вновь на панели управления выберите «Телефон и модем» и перейдите на вкладку «Модемы».
2. Выберите «Последовательный кабель для соединения компьютеров (COM3)» и нажмите кнопку «Свойства».
3. Если параметры на вкладках «Модем» и «Дополнительные параметры связи» невозможно изменить,
на вкладке «Общие» нажмите кнопку «Изменить параметры».
4. На вкладке «Дополнительные параметры связи» нажмите кнопку «Изменить умолчания...»
5. На вкладке «Общие» установите: – Скорость порта: 115200. – Управление потоком: Отсутствует.
И нажмите «ОК».
6. На вкладке «Модем» должны правильно отображаться COM-порт (COM3) и скорость соединения (115200).
1. На панели управления выберите «Центр управления сетями и общим доступом».
2. Затем «Настройка нового подключения или сети».
3. Выберите «Настройка телефонного подключения» и нажмите «Далее».
4. В поле «Набираемый номер» введите 1 и нажмите кнопку «Подключить».
5. Затем выберите «Всё равно создать это подключение».
6. Нажмите «Закрыть».
1. На панели управления выберите «Центр управления сетями и общим доступом», а затем нажмите «Изменение параметров адаптера».
2. Зайдите в свойства «Телефонного подключения».
3. На вкладке «Общие» в окне «Подключаться через» выберите «Последовательный кабель для соединения компьютеров (COMx)» и нажмите «Настроить».
4. Выберите следующий параметр: – Наибольшая скорость: 115200.
И уберите галочку «Аппаратное управление потоком». Нажмите «ОК».
5. На вкладке «Параметры» нажмите на кнопку «Параметры PPP...»
6. Уберите галочку «Использовать программное сжатие данных» и нажмите «ОК».
7. На вкладке «Сеть» должен быть включен протокол «IPv4».
1. Извлеките преобразователь USB — UART из разъема USB.
2. Включите контроллер.
3. Подключите преобразователь USB — UART к соответствующему порту контроллера.
3. Подкючите преобразователь USB — UART к компьютеру.
4. Откройте «Сетевые подключения» (Панель управления → «Центр управления сетями и общим доступом»→ «Изменение параметров адаптера»).
5. Откройте «Телефонное подключение» и нажмите на кнопку «Вызов».
6. Если всё сделано верно, на преобразователе должны замигать лампочки «RXD» и «TXD».
А статус соединения должен измениться на активный.
7. Откройте окно состояния телефонного подлючения.
8. Нажмите на кнопку «Сведения».
9. Адрес IPv4 должен быть 10.0.5.1 .
10. Если всё верно, то можно зайти в по адресу 10.0.5.2.
11. Или указать IP-адрес 10.0.5.2 в соответствующем окне TRIK Studio для управления контроллером.
Меню контроллера ТРИК состоит из шести разделов:
Файлы — запуск и удаление программ.
Тестирование — тестирование подключенных к контроллеру ТРИК устройств.
Сеть — подключение контроллера ТРИК к другим устройствам.
— взаимодействие нескольких контроллеров ТРИК.
— выбор языка.
— программирование на контроллере, настройки системы и информация о версии прошивки.
Раздел «Файлы» предназначен для просмотра, запуска и удаления загруженных на контроллер программ.
Для запуска программы нажмите кнопку «Ввод» (галочка).
Для удаления программы нажмите кнопку «Вправо» и подтвердите удаление.
Для удаления всех программы выберите пункт «Удалить всё...» и подтвердите удаление.
На контроллере ТРИК с помощью данного пункта меню можно протестировать подключенные устройства:
Аналоговые датчики.
Сервоприводы.
Силовые моторы.
Цифровые датчики.
Подробнее смотрите в статье
Данный раздел предназначен для настройки подключения контроллера к компьютеру или смартфону.
В пункте «Сеть» вы можете подключить контроллер к компьютеру или смартфону в двух режимах:
Wi-Fi точка доступа.
Wi-Fi клиент.
Подробнее смотрите в статье
В пункте «Взаимодействие» вы можете настроить параметры для взаимодействия контроллеров.
Подробнее смотрите в статье
Данный раздел позволяет выбрать язык меню контроллера ТРИК.
1. Выберите требуемый язык и нажмите «Ввод». 2. После появления предупреждения о перезапуске контроллера нажмите еще раз кнопку «Ввод». 3. После перезагрузки язык сменится на выбранный.
Пункт меню «Ещё…» состоит из подпунктов:
.
.
Раздел «Программирование» предназначен для написания программы на контроллере из готовых команд.
Добавьте последовательно команды в алгоритм с помощью пункта .
После завершения составления алгоритма выберите пункт .
Для очистки алгоритма используйте пункт меню .
Пункт «<новая команда>» позволяет добавить команду в конец алгоритма.
Выберите необходимую команду с помощью кнопок «Вверх» и «Вниз» и нажмите «Ввод».
Добавляя последовательно команды в список, вы получите конечную программу.
При добавлении в алгоритм команды «Моторы вперед» необходимо указать мощность.
При добавлении в алгоритм команды «Таймер» необходимо указать время ожидания в миллисекундах.
Пункт «Запустить программу» позволяет выполнить написанный алгоритм.
Пункт «Очистить список» позволяет удалить написанный алгоритм.
В данном подразделе вы можете выбрать, что будет отображаться в папке «Файлы»:
Папка со скриптами. В данном случае будут отображаться только загруженные программы из TRIK Studio.
Файловая система.
В данном подразделе вы можете посмотреть версию прошивки и MAC-адрес.






script.random(min, max)script.random(min, max);a = script.random(0, 10) # случайное число от 0 до 10var a = script.random(0, 10); // случайное число от 0 до 10script.readAll("fileName")script.readAll("fileName");lines = script.readAll("input.txt") # считывает текстовый файл input.txtvar lines = script.readAll("input.txt"); // считывает текстовый файл input.txtscript.removeFile("fileName")script.removeFile("fileName");script.removeFile("file.txt"); # удалить файл file.txtscript.removeFile("file.txt"); // удалить файл file.txtscript.run()script.run();ript.system()script.system();script.system("reboot")script.system("reboot");script.time()script.time();script.timer(n)script.timer(n);def foo():
print("It's Alive!!!")
tim = script.timer(500) # таймер на 500 мс
tim.timeout.connect(foo) # подписываем функцию foo на срабатывание по таймеру tim
script.wait(5000)
tim.stop()function foo(){
print("It's Alive!!!")
}
tim = script.timer(500) // таймер на 500 мс
tim.timeout.connect(foo) // подписываем функцию foo на срабатывание по таймеру tim
script.wait(5000)
tim.stop()script.wait(msCount)script.wait(msCount);script.wait(1000) # остановить выполнение скрипта на одну секундуscript.wait(1000); // остановить выполнение скрипта на одну секундуscript.writeToFile("fileName", "text")script.writeToFile("fileName", "text");script.writeToFile("output.txt", "Hello, world") # записать «Hello, world» в файл output.tscript.writeToFile("output.txt", "Hello, world"); // записать «Hello, world» в файл output.tx = accelerometer[0]; -- показания акселерометра по оси X
y = accelerometer[1]; -- показания акселерометра по оси Y
z = accelerometer[2]; -- показания акселерометра по оси Zr = colorSensor[0]; -- интенсивность красного цвета
g = colorSensor[1]; -- интенсивность зеленого цвета
b = colorSensor[2]; -- интенсивность синего цветаx = gyroscope[0]; -- показания гироскопа по оси X (скорость)
y = gyroscope[1]; -- показания гироскопа по оси Y (скорость)
z = gyroscope[2]; -- показания гироскопа по оси Z (скорость)
t = gyroscope[3]; -- абсолютное время показания (мс)
pos_x = gyroscope[4]; -- угол отклонения робота по оси X (градусы)
pos_y = gyroscope[5]; -- угол отклонения робота по оси Y (градусы)
pos_z = gyroscope[6]; -- угол отклонения робота по оси Z (градусы)




Энкодеры.
Гироскоп.
Акселерометр.
Объект «brick» представляет контроллер ТРИК и предоставляет доступ к устройствам робота.
Предоставляет доступ к акселерометру.
Предоставляет доступ к информации об аккумуляторе.
Предоставляет доступ к датчику цвета по видеокамере.
Предоставляет доступ к дисплею робота.
Предоставляет доступ к акселерометру (класс «»).
Предоставляет доступ к информации об аккумуляторе.(класс «»).
Предоставляет доступ к датчику цвета по видеокамере (класс «»).
Предоставляет доступ к дисплею робота (класс «»).
Предоставляет доступ к энкодеру на указанном порту (класс «»).
В качестве параметра необходимо указать порт.
Получить фотографию с камеры в виде массива байт.
Предоставляет доступ к гироскопу (класс «»).
Предоставляет доступ к кнопкам на корпусе робота (класс «»).
Предоставляет доступ к светодиоду на корпусе робота (класс «»).
Предоставляет доступ к датчику линии по видеокамере (класс «»).
Предоставляет доступ к мотору (силовому или сервомотору) на указанном порту (класс «»).
В качестве параметра необходимо указать порт.
Предоставляет доступ к датчику объекта по видеокамере (класс «»).
Проиграть звуковой файл.
В качестве параметра необходимо указать имя файла с абсолютным путем или путем относительно папки trik на контроллере.
Внимание! Файл должен быть предварительно загружен на контроллер.
Проиграть звук с заданной частотой.
В качестве параметров необходимо указать частоту звука frequency и время time в мс, в течение которого необходимо проигрывать звук.
Произнести строку (на русском или английском языке).
В качестве параметра необходимо указать строку на английском или русском языке.
Предоставляет доступ к сенсору на указанном порту (класс «»).
В качестве параметра необходимо указать порт.
Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.
Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели (класс «»)
Предоставляет доступ к инфракрасному датчику (класс «»).
Предоставляет доступ к энкодеру на указанном порту.
Получить фотографию с камеры в виде массива байт.
Предоставляет доступ к гироскопу.
Предоставляет доступ к кнопкам на корпусе робота.
Проиграть звуковой файл.
Проиграть звук с заданной частотой.
Предоставляет доступ к светодиоду на корпусе робота.
Предоставляет доступ к датчику линии по видеокамере.
Предоставляет доступ к мотору на указанном порту.
Предоставляет доступ к датчику объекта по видеокамере.
Произнести переданную как параметр строку (на русском или английском языке).
Предоставляет доступ к сенсору на указанном порту.
Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.
Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели.
Предоставляет доступ к инфракрасному датчику.
brick.accelerometer();brick.accelerometer();brick.battery();brick.battery();brick.colorSensor("video1")brick.colorSensor("video1");brick.display()brick.display();brick.encoder(portName)
brick.encoder("portName")brick.encoder(portName);
brick.encoder("portName");brick.encoder(E1) # вызов энкодера на порту E1
brick.encoder("E2") # вызов энкодера на порту E2brick.encoder(E1); // вызов энкодера на порту E1
brick.encoder("E2"); // вызов энкодера на порту E2brick.getStillImage()brick.getStillImage();brick.gyroscope()brick.gyroscope();brick.keys()brick.keys();brick.led()brick.led();brick.lineSensor("video1")brick.lineSensor("video1");brick.motor(motorName)
brick.motor("motorName")brick.motor(motorName);
brick.motor("motorName");brick.motor(M1) # вызов мотора на порту M1
brick.motor("M2") # вызов мотора на порту M2brick.motor(M1) // вызов мотора на порту M1
brick.motor("M2") // вызов мотора на порту M2brick.objectSensor()brick.objectSensor();brick.playSound("filename")brick.playSound("filename");brick.playSound("media/sound.mp3") # проиграть файл sound.mp3 из папки mediabrick.playSound("media/sound.mp3"); // проиграть файл sound.mp3 из папки mediabrick.playTone(frequency, time)brick.playSound(frequency, time);brick.playTone(1000, 1000)brick.playTone(1000, 1000);brick.say(string)brick.say(string);brick.say("Привет, я ТРИК")brick.say("Привет, я ТРИК");brick.sensor(portName)
brick.sensor("portName")brick.sensor(portName);
brick.sensor("portName");brick.sensor(A1) # вызов сенсора на порту A1
brick.sensor("A2") # вызов сенсора на порту A2brick.sensor(A1) // вызов сенсора на порту A1
brick.sensor("A2") // вызов сенсора на порту A2brick.stop()brick.stop();brick.marker()brick.marker();brick.irCamera()brick.irCamera();


















































































Список доступных блоков зависит от выбранной платформы и от модели робота (реальный робот или двумерная модель). При этом недоступные для данной платформы блоки не показываются вообще, а недоступные для данной модели в рамках одной платформы блоки показываются в палитре серым и недоступны для перетаскивания на сцену.
Общие блоки для всех платформ представлены ниже. Программа, использующая только эти блоки, будет исполняться на любой платформе без каких-либо правок.
Список блоков, специфичных для конкретного конструктора, можно найти в соответствующих разделах:
Начальная точка выполнения программы.
На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.
Процесс интерпретации диаграммы начинается именно с этого блока.
Конец программы.
Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.
У данного блока не может быть исходящих связей.
Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «», но этот блок делает программу понятнее.
Разделение выполнения программы в соответствии с заданным условием.
У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».
Обозначает слияние двух веток условного оператора.
Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «» или «» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов goto.
Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).
Блок, организующий выполнение последовательности блоков несколько раз.
Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз.
Бесконечные циклы и циклы вида while/do и while организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «».
Условие с несколькими альтернативами. В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.
Считает значение заданного выражения. Также допускается инициализация переменных. Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «».
Вызов подпрограммы. Подпрограммы используются для вынесения повторяющихся фрагментов программы на отдельную диаграмму. При добавлении этого блока на диаграмму будет предложено ввести имя подпрограммы, после чего двойным кликом на блоке можно будет перейти на диаграмму, соответствующую данной подпрограмме. Также появится дополнительная палитра со всеми подпрограммами. Подпрограммы из неё можно перетаскивать на сцену и использовать как обычные блоки. Вид, имя и свойства блока можно изменить с помощью контекстного меню.
Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».
В открывшемся окне вы можете:
Изменить имя подпрограммы.
Добавить и изменить параметры подпрограммы, задав имя, тип и значение.
Изменить картинку на иконке вашей подпрограммы.
Изменить фон иконки подпрограммы.
Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала.
Блок должен иметь хотя бы две исходящие связи.
Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «» или в блоке «») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — main.
Блок слияния параллельных задач. Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока. Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.
Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.
Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.
Блок для добавления на диаграмму произвольного текста в качестве комментария.
Используется для пояснения конкретного блока или участка диаграммы. Может быть связан с блоком, который он поясняет.
При выполнении программы блок не учитывается.
Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.
Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.
Блок доступен только в режиме двумерной модели.
Закончить рисование маркером.
Блок доступен только в режиме двухмерной модели.
Предоставляет доступ к дисплею робота.
Метод
Описание
Вывести на экран указанный текст, начиная с указанной координаты.
Вывести на экран указанный текст в указанные координаты. Если в указанных координатах уже был текст, он будет заменён новым.
Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать:
text — выводимый текст,
x, y — координаты экрана.
size – размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).
Очистить окно для рисования.
Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать:
x, y — координаты левого верхнего угла прямоугольника на экране,
l — ширина прямоугольника,
h — высота прямоугольника,
Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать:
x, y — координаты левого верхнего угла прямоугольника,
l — ширина прямоугольника,
h — высота прямоугольника,
Нарисовать линию с началом и концом в заданных координатах. Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать:
x0, y0 — координаты начала линии,
x1, y1 — координаты конца линии.
Нарисовать точку в заданных координатах. Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать координаты точки x, y.
Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».
В качестве параметров необходимо указать:
x, y — координаты левого верхнего угла прямоугольника,
l — ширина прямоугольника,
h — высота прямоугольника,
Закрыть и очистить окно для рисования.
Перерисовать окно для рисования. Изменения на дисплее произойдут только после вызова этого метода.
Удалить с экрана весь текст, добавленный на него вызовами метода «».
Установить фон экрана в указанный цвет.
Возможные цвета:
white,
red, darkRed,
green, darkGreen,
blue, darkBlue,
В качестве параметра необходимо указать цвет.
Установить цвет кисти, которой рисуются графические примитивы.
Возможные цвета:
white,
red, darkRed,
green, darkGreen,
blue, darkBlue,
В качестве параметра необходимо указать цвет.
Установить толщину кисти, которой рисуются графические примитивы, в пикселях.
В качестве параметра необходимо указать толщину d.
Вывести на дисплей контроллера изображение, преобразованное из однородного массива данных.
Параметры:
array — одномерный целочисленный массив, имеющий размеры width×height
width и height — ширина и высота изображения соответственно
Примеры использования show() на изображении, снятом с использованием функции .
Вывести на экран изображение, предварительно загруженное на робот.
В качестве параметра необходимо указать имя файла с изображением (в форматах BMP, GIF, JPG, JPEG, PNG, PBM, PGM, PPM, TIFF, XBM, XPM), путь указывается либо абсолютным, либо относительно папки trik.
from — начальный угол, ограничивающий дугу,
to — конечный угол, ограничивающий дугу.
filled — заливать фигуру или нет, по умолчанию false
filled — заливать фигуру или нет, по умолчанию false
cyan, darkCyan,
magenta, darkMagenta,
yellow, darkYellow,
gray, darkGray, lightGray,
black.
cyan, darkCyan,
magenta, darkMagenta,
yellow, darkYellow,
gray, darkGray, lightGray,
black.
Очистить окно для рисования.
Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
Нарисовать линию с началом и концом в заданных координатах.
Нарисовать точку в заданных координатах.
Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
Закрыть и очистить окно для рисования.
Перерисовать окно для рисования. Изменения в окне произойдут только после вызова этого метода.
Удалить с экрана весь текст, добавленный на него вызовами метода «addLabel».
Установить фон экрана в указанный цвет.
Установить цвет кисти, которой рисуются графические примитивы.
Установить толщину кисти, которой рисуются графические примитивы, в пикселях.
Вывести на дисплей контроллера изображение, сформированное в одномерном массиве.
Вывести на экран изображение, предварительно загруженное на робот.
brick.display().addLabel("text", x, y, size)brick.display().addLabel("text", x, y, size);brick.display().addLabel('Привет, мир!', 1, 1, 20)brick.display().addLabel('Привет, мир!', 1, 1);brick.display().clear()brick.display().clear();brick.display().drawArc(x, y, l, h, from, to)brick.display().drawArc(x, y, l, h, from, to);brick.display().drawArc(0, 0, 10, 10, 20, 50)brick.display().drawArc(0, 0, 10, 10, 20, 50);brick.display().drawEllipse(x, y, l, h, filled)brick.display().drawEllipse(x, y, l, h, filled);brick.display().drawEllipse(0, 0, 10, 10, True)brick.display().drawEllipse(0, 0, 10, 10, true);brick.display().drawLine(x0, y0, x1, y1)brick.display().drawLine(x0, y0, x1, y1);brick.display().drawLine(0, 0, 10, 10)brick.display().drawLine(0, 0, 10, 10);brick.display().drawPoint(x, y)brick.display().drawPoint(x, y);brick.display().drawPoint(10, 10)brick.display().drawPoint(10, 10);brick.display().drawRect(x, y, l, h, filled)brick.display().drawRect(x, y, l, h, filled);brick.display().drawRect(0, 0, 10, 10, True)brick.display().drawRect(0, 0, 10, 10, true);brick.display().hide()brick.display().hide();brick.display().redraw()brick.display().redraw();brick.display().removeLabels()brick.display().removeLabels();brick.display().setBackground("color")brick.display().setBackground("color");brick.display().setBackground("red")brick.display().setBackground("red");brick.display().setPainterColor("color")brick.display().setPainterColor("color");brick.display().setPainterColor("red")brick.display().setPainterColor("red");brick.display().setPainterWidth(d)brick.display().setPainterWidth(d);brick.display().setPainterWidth(5)brick.display().setPainterWidth(5);brick.display().show(array, width, height, format)brick.display().show(array, width, height, format)#rgb32
photo = getPhoto()
brick.display().show(photo, 160, 120, "rgb32")
script.wait(5000)
#rgb888
pic = []
photo = getPhoto()
l = len(photo)
for i in range(l):
p = photo[i]
pic.append((p&0xff0000)>>16)
pic.append((p&0xff00)>>8)
pic.append((p&0xff))
brick.display().show(pic, 160, 120, "rgb888")
script.wait(5000);
#grayscale8
pic = []
photo = getPhoto()
l = len(photo)
for i in range(l):
p = photo[i]
pic.append(((p&0xff0000)>>18) + ((p&0xff00)>>10) + ((p&0xff)>>2))
brick.display().show(pic, 160, 120, "grayscale8")
script.wait(5000)
//rgb32
var photo = getPhoto();
brick.display().show(photo, 160, 120, "rgb32");
script.wait(5000);
//rgb888
pic = []
photo = getPhoto();
l = photo.length;
for (i = 0; i < l; i++) {
var p = photo[i];
pic.push((p&0xff0000)>>16);
pic.push((p&0xff00)>>8);
pic.push((p&0xff));
}
brick.display().show(pic, 160, 120, "rgb888");
script.wait(5000);
//grayscale8
pic = []
photo = getPhoto();
l = photo.length;
for (i = 0; i < l; i++) {
var p = photo[i];
pic.push(((p&0xff0000)>>18) + ((p&0xff00)>>10) + ((p&0xff)>>2));
}
brick.display().show(pic, 160, 120, "grayscale8");
script.wait(5000);brick.display().showImage("imagePath")brick.display().showImage("imagePath");brick.display().showImage("media/trik_smile_sad.png")brick.display().showImage("media/trik_smile_sad.png");Разделение выполнения программы в соответствии с заданным условием.
Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.
Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).
Блок, организующий выполнение последовательности блоков несколько раз.
Условие с несколькими альтернативами.
Считает значение заданного выражения. Также допускается инициализация переменных.
Вызов подпрограммы.
Блок разделяет выполнение программы на несколько потоков.
Блок слияния параллельных задач.
Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.
Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.
Блок для добавления на диаграмму произвольного текста в качестве комментария.
Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.
Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.
Закончить рисование маркером.
Вид
Название
Описание
Начальная точка выполнения программы.
На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.
Процесс интерпретации диаграммы начинается именно с этого блока.
Конец программы.
Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.
У данного блока не может быть исходящих связей.
Блок для объявления новой переменной и задания ей значения.
Свойство
Описание
Значение
Указывается выражение, определяющее начальное значение переменной.
Переменная
Указывается имя переменной.
Свойство
Описание
Условие
Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.
Свойство
Описание
Условие
Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.























Интерактивный режим имитационного моделирования — отличительная особенность TRIK Studio. В нем команды не передаются роботу, а исполняются для виртуальной модели, отображающейся на экране. Для платформ ТРИК, Lego EV3 и Lego NXT — это трехколесная тележка.
Изначально робот находится в бесконечном пустом пространстве, а у пользователя есть возможность расставлять препятствия в виде стен, рисовать цветные линии и области на полу.
При этом эмулируется работа большинства реальных датчиков конструктора. Например, датчика касания, ультразвукового датчика расстояния, датчиков цвета и света для NXT, компас и гироскоп для EV3, инфракрасного и ультразвукового датчиков расстояния, датчика касания и датчика освещённости для ТРИК.
Двумерная модель может иметь устройства, недоступные на реальном роботе. Например, возможность рисовать цветные линии маркером на полу. Внешний вид и набор устройств двумерной модели зависит от выбранной платформы.
Режим двумерной модели полезен для отладки программ и в случае отсутствия реального робота.
Для переключения между режимами «Таскания сцены» и «Выделения» воспользуйтесь .
Для открытия окна 2D-модели необходимо нажать кнопку на панели инструментов или в выбрать пункт «2D-модель».
Элементы окна 2D-модели:
Редактирование модели мира осуществляется с помощью соответствующей панели.
При выделении линии, кривой Безье, стилуса, прямоугольника или эллипса появляется всплывающее окно, позволяющее настраивать их цвет и толщину.
У инструментов эллипс и прямоугольник есть возможность закрасить внутреннюю область заданным цветом. Также можно редактировать размеры, форму и положение выделенных геометрических объектов.
Помимо инструментов рисования различных геометрических объектов, поддержана возможность загрузки нескольких готовых изображений из файла.
При включенной сетке изображения автоматически выравниваются по ней при перетаскивании.
Если выделить изображение, его можно будет переместить, изменить размеры и настроить следующие параметры:
Для открытия панели с настройками нажмите кнопку справа от :
На данной панели располагаются:
Эмулятор экрана и кнопок робота отображает вывод программы на экран робота и позволяет эмулировать нажатие на его кнопки (кликом мыши по соответствующей кнопке на роботе).
Панель управления портами позволяет менять конфигурацию и расположение сенсоров модели робота.
Для каждого порта можно выбрать интересующий датчик, и он автоматически добавится на сцену.
При изменении конфигурации сенсоров из настроек сенсоры в двумерной модели автоматически подстраиваются. При этом будет считаться, что сенсор соединен с роботом. То есть при движении иконки робота сенсоры будут двигаться вместе с ним, даже если они находятся на некотором расстоянии от модели робота.
Рядом с ультразвуковым или инфракрасным датчиком отображается серый конус, обозначающий область, в которой этот датчик будет регистрировать препятствия.
Для каждого порта можно выбрать интересующий датчик, и он автоматически добавится на сцену. Добавленные сенсоры всегда закреплены на роботе, их можно перемещать и вращать.
При вращении с нажатой клавишей Shift сенсор поворачивается либо под прямым углом, либо под углом в 45° относительно границ окна.
Панель управления моторами позволяет задать, какой из портов моторов будет соответствовать левому и правому колесам.
Реалистичная физика точнее эмулирует силы, действующие на робота: он поворачивает при столкновении со стеной, разгоняется с ускорением и т. д.
Реалистичные сенсоры — включить / выключить эмуляцию неточной работы сенсоров.
Реалистичные моторы — включить / выключить эмуляцию неточной работы моторов.
Отображение параметров модели робота:
диаметра колеса,
высоты робота,
ширины робота,
массы робота.
Также функции двумерной модели доступны при нажатии на правую кнопку мыши на сцене.
Включение отображения на сцене сетки и привязка стен к её узлам. Слайдер позволяет настроить размер сетки.
Панель управления скоростью позволяет задать скорость симуляции.
При выборе низкой скорости одной секунде модельного времени соответствует несколько секунд реального, при выборе высокой скорости — наоборот.
Здесь же отображается текущее модельное время, прошедшее с запуска программы. Оно может отличаться от реального времени (зависит от настроек скорости и возможностей компьютера).
Линейка показывает расстояния на сцене, в сантиметрах (относительно размера робота).
Кнопка возврата на старт устанавливает робота в исходное положение, задаваемое красным крестиком на сцене.
Крестик можно вращать вокруг своей оси, выделив его и таская конец появившейся стрелки. Так задаётся начальное направление робота.
При добавлении с нажатой клавишей «Shift» стрелка крестика помещается либо под прямым углом, либо под углом в 45° относительно границ окна.
Запуск программы.
Остановка программы.
Всплывающее меню управления роботом появляется при его выделении.
С помощью текстового поля удобно создавать виртуальные миры и описывать задание прям в них. Также можно использовать для комментариев или обозначения названий отдельных элементов. Редактировать поле можно с помощью html разметки, используя теги <b>жирный</b>, <i>курсив</i> и другие.
1) В панели редактирование мира выберите иконку Text (прямоугольник с буквами ABC), либо используйте горячую клавишу 0.
2) Нажмите на удобное место на экране, должно появиться текстовое поле
3) Для редактирования текста необходимо нажать правой кнопкой мыши в центральную часть текстового поля (прямоугольник в центре, чуть выше блока с текстом)
4) Выбрать пункт «Редактор» в появившемся контекстном меню
5) Ввести необходимый текст
6) Снова правой кнопкой мыши нажать в центральную часть текстового поля
7) В появившемся контекстном меню выбрать пункт Save
Чтобы редактировать текст можно использовать HTML разметку. Для того, чтобы она сработала необходимо использовать теги в виде <тег>ваш текст</тег>
Доступные теги
Добавление на сцену препятствия в виде банки
3
Мяч
Добавление на сцену препятствия в виде мяча. При касании тележки он отскакивает на некоторое расстояние.
4
Линия
Добавление на сцену прямой линии.
При добавлении линии с нажатой клавишей Shift линия помещается либо под прямым углом, либо под углом в 45° относительно границ окна.
На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.
Можно цвет и толщину линии.
5
Кривая Безье
Добавление на сцену линии с возможностью закругления. На линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе. Можно цвет и толщину линии.
6
Прямоугольник
Добавление на сцену прямоугольника. Можно цвет и толщину линий прямоугольника, а также цвет его заливки.
7
Эллипс
Добавление на сцену эллипса. Можно цвет и толщину линий эллипса, а также цвет его заливки.
8
Стилус
Рисование линии мышью.
На нарисованную линию могут реагировать датчики света и цвета, расположенные на виртуальном роботе.
Можно цвет и толщину линий.
9
Добавление на сцену готового фона.
Text
Добавление
0
Удаление всех цветных линий, нарисованных маркером робота. Остальные элементы остаются на сцене.
Подстрочный текст
<big>
Большой шрифт
<small>
Маленький шрифт
Комбинация клавиш
Описание действия
Ctrl+Колесо мыши
Увелечение / уменьшение сцены.
Shift+Колесо мыши
Прокрутка сцены по горизонтали.
Название
Описание
Горячая клавиша
Курсор
Переключение в режим выбора.
1
Стена
Добавление на сцену препятствия в виде стены.
При добавлении с нажатой клавишей Shift стена помещается либо под прямым углом, либо под углом в 45° относительно границ окна. Отображается стена в виде «кирпичной» линии.
При касании такой линии датчиком касания или при попадании в зону действия датчиком расстояния происходит срабатывание сенсора. Робот не может проехать сквозь стену.
2
Свойство
Описание
Картинка не будет включена в файл сохранения. При открытии текущего проекта на другом компьютере или переименовании файла с картинкой изображение в 2D-модели пропадёт.
Картинка будет запакована в проект. Будьте внимательны, это значительно увеличит размер файла сохранения. Однако при открытии проекта на другом компьютере, изображение останется в двумерной модели.
Изображение будет на переднем плане. Робот видит это изображение с помощью сенсоров.
Изображение будет на заднем плане. Робот не видит это изображение.
Изменить картинку... Заменить изображение на выбранное через диалоговое окно.
Пункт меню
Описание
Режим таскания сцены
Позволяет перемещать сцену с роботом, стенами и линиями при клике и перетаскивании на свободный участок сцены.
Режим выделения
Позволяет выделять группу стен, линий и других частей модели при клике и перетаскивании на свободный участок сцены.
Сохранить модель мира...
Сохранение нарисованной сцены в виде XML-файла, который потом может быть загружен и использован в другом проекте.
Загрузить модель мира…
Загрузка ранее сохранённой модели мира.
Очистить всё
Удаление всех стен и цветных линий. Робот при этом остаётся на сцене.
Элемент
Описание
Следование за роботом
При включённом режиме сцена автоматически перемещается, выставляя робот в центр, если он выезжает за границы видимого участка.
Возврат робота
Возврат робота на исходную позицию, обозначаемую красным крестиком.
Изменение толщины следа
Изменение толщины следа, оставляемого роботом при рисовании маркером.
Тег
Функция
<b>
Жирный шрифт
<i>
Курсив
<u>
Подчеркивание
<s>
Зачеркнутый тест
<sup>
Надстрочный текст



Банка
Очистить пол от следов робота
<sub>
































Специализированные блоки для ТРИК делятся на три категории:
Действия — блоки, выполняющие какое-либо действие на контроллере: включение моторов, проигрывание звука и т. д.
Ожидания — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.
Рисования — блоки, используемые для вывода графики и текста на экран.
Блоки, доступные для всех платформ см. в статье
Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке ). В качестве сообщения может быть любое выражение.
Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».
Проигрывает на контроллере звук с заданной частотой и длительностью.
Проиграть на контроллере заданный звуковой файл.
Файл должен быть заранее загружен на контроллер. Путь до файла указывается относительно папки trik на контроллере. Загрузить файл на контроллер можно, например, с помощью программы .
Включить моторы по заданным портам с заданной мощностью. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми. Мощность задается в процентах числом от -100 до 100. Если задано отрицательное значение, мотор включается в режиме реверса.
Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока .
Выключить моторы по заданным портам. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми.
Сбросить показания количества оборотов моторов по указанным портам. Порты задаются строками E1, E2, E3 и E4, разделенными запятыми.
Установить валы угловых сервомоторов на указанных портах в указанное положение (в градусах, от -90 до 90). Порты задаются строками, разделенными запятыми.
Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Установить указанный цвет светодиода на корпусе контроллера.
Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.
Включить видеокамеру на контроллере в одном из трёх режимов:
Сенсор линии — детектирует цветную линию в центре кадра и в дальнейшем возвращает отклонение центра линии от центра кадра, как число в интервале от -100 (влево) до 100 (вправо).
Сенсор объекта — детектирует контрастный объект в центре кадра и в дальнейшем возвращает координаты его центра и диаметр в пикселях.
Сенсор цвета — возвращает доминирующий цвет в центре кадра в виде его координат в цветовой шкале RGB.
Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта. Камера должна быть включена в соответствующем режиме блоком .
Помещает текущее показание датчика линии в указанную переменную. Камера должна быть включена в режиме датчика линии блоком и инициализирована блоком .
Запускает видеотрансляцию на роботе.
Видео может быть просмотрено на пульте управления ТРИК или в браузере по адресу вида:
{ip-адрес робота}:8080/?action=stream/.
Отправляет данное сообщение роботу с данным бортовым номером.
Робот должен быть в той же сети, что и робот, отправляющий сообщение, и зарегистрирован как ведущий или ведомый с помощью меню Настройки → Сообщения на роботе. Если роботов с данным бортовым номером в сети несколько, сообщение получат все они.
Записывает значение данного выражения в заданный файл на роботе.
Путь до файла может быть абсолютным или относительно папки с trik-studio.exe.
Файл можно получить с контроллера, например, с помощью программы для Windows или scp для Linux.
Удаляет заданный файл на роботе.
Путь до файла может быть абсолютным или относительно папки с trik-studio.exe.
Выключает видеокамеру.
Останавливает видеотрансляцию с камеры робота.
Устанавливает гироскоп в 0 в текущей позиции.
Устанавливает соединение между роботами и объединяет их в одну сеть. Имеет 3 свойства: Address, Порт и Бортномер. В свойстве Address указывается ip-адрес робота или экземпляра TRIK Studio, к которой он подключается. В свойстве Порт указываем номер порта, начиная с -1. Следующий экземпляр TRIK Studio будет иметь номер 0, следующий 1 и так далее. В свойстве Бортномер указывается бортномер вашего робота или TRIK Studio, начиная с 1. Если у нескольких роботов будет одинаковый бортномер, то они будут объединены в группу.
Ждать получения сообщения из другой параллельной задачи. Когда сообщение будет получено, оно будет присвоено указанной в блоке переменной. Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, присвоив переменной пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника. Пример: если вы посылаете число в виде строки, то оно будет принято как число.
Ждать ввода значения от пользователя. После ввода значение будет присвоено указанной в блоке переменной.
Блок «Пользовательский ввод» имеет 3 свойства:
Пример
Ждать, пока значение, возвращаемое гиродатчиком на указанном порту, не будет сравнимо с указанным в значении параметра «градусы».
Ждать срабатывания датчика касания на указанном порту.
Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным значением в параметре «Проценты». Параметры: «Проценты» — значение для сравнения со значением, возвращаемым датчиком света. «Порт» — порт, к которому подключен сенсор света. «Считанное значение» — операция, которая будет использоваться для сравнения со значением параметра «Проценты».
Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо со значением, указанным в параметре «Расстояние» (расстояние задается в сантиметрах, от 0 до 300). Параметры: «Расстояние» — значение для сравнения со значением, возвращаемым датчиком расстояния. «Порт» — порт, к которому подключен датчик расстояния. «Считанное значение» — операция, которая будет использоваться для сравнения со значением параметра «Расстояние».
Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра «Расстояние». По умолчанию на портах A1 и A2 расстояние задается в сантиметрах (от 0 до 100), к остальным подключение не рекомендуется, так как чистое значение с датчика будет обработано с ожиданием другого подключенного датчика. Еще один параметр — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием.
Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра «Предел оборотов».
Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.
Ждать нажатия на кнопку на пульте, подключённом к роботу. Кнопки имеют номера от 1 до 5.
Ждать нажатия на одну из двух активных областей пульта, подключённого к роботу. Координаты нажатия можно получить с помощью сенсорных переменных .
Ждать нужного наклона пульта, подключённого к роботу. Наклон регистрируется только если на пульте включён режим «руля», угол наклона кодируется числами от -100 (максимально влево) до 100 (максимально вправо). Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра «Угол».
Ждать, пока пульт не отключится от робота. Если пульт не подключен, программа продолжит выполнение.
Ждать, пока к роботу не подключится пульт. Если пульт уже подключен, программа продолжит выполнение.
Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать на экране точку в указанных координатах.
Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.
Нарисовать на экране смайлик.
Нарисовать на экране грустный смайлик.
Задаёт цвет фона экрана.
Печатает заданную строку в заданном месте на экране робота.
Для вывода текста:
В свойстве «Текст» напишите нужный текст.
Уберите галочку в свойстве «Вычислять».
Для вывода значения переменной:
В свойстве «Текст» напишите имя переменной.
Поставьте галочку в свойстве «Вычислять».
Стереть всё, что нарисовано на экране.
Помимо создания роботов в TRIK Studio, можно делать более гибкую настройку при помощи редактирования XML-файла: указывать точнее расположения объектов, цвет, ширину и другие параметры.
Для начала необходимо XML-файл виртуальной модели.
В отладке 2D-модели оси расположены следующим образом:
Проиграть на контроллере заданный звуковой файл.
Включить моторы по заданным портам с заданной мощностью.
Включить моторы в режиме реверса по заданным портам с заданной мощностью.
Выключить моторы по заданным портам.
Сбросить показания количества оборотов моторов по указанным портам.
Установить валы угловых сервомоторов на указанных портах в указанное положение
Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Установить указанный цвет светодиода на корпусе контроллера.
Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.
Включить видеокамеру на контроллере в одном из трёх режимов.
Выключить видеокамеру.
Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта.
Помещает текущее показание датчика линии в указанную переменную.
Запускает видеотрансляцию на роботе.
Останавливает видеотрансляцию с камеры робота.
Отправляет данное сообщение роботу с данным бортовым номером.
Записывает значение данного выражения в заданный файл на роботе.
Удаляет заданный файл на роботе.
Устанавливает гироскоп в 0 в текущей позиции.
Устанавливает соединение между роботами и объединяет их в одну сеть.
Ждать срабатывания датчика касания на указанном порту.
Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным значением в параметре «Проценты».
Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо со значением, указанным в параметре «Расстояние».
Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра «Расстояние».
Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра «Предел оборотов».
Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную.
Ждать нажатия на кнопку на пульте, подключённом к роботу.
Ждать нажатия на одну из двух активных областей пульта, подключённого к роботу.
Ждать нужного наклона пульта, подключённого к роботу.
Ждать, пока пульт не отключится от робота. Если пульт не подключен, программа продолжит выполнение.
Ждать, пока к роботу не подключится пульт. Если пульт уже подключен, программа продолжит выполнение.
Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.
Нарисовать на экране смайлик.
Нарисовать на экране грустный смайлик.
Задаёт цвет фона экрана.
Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.
Стереть всё, что нарисовано на экране.
Вид
Название
Описание
Отправляет данное сообщение в параллельную задачу с заданным идентификатором.
Сохраняет в указанную переменную код нажатой на роботе кнопки.
Проигрывает на контроллере звук с заданной частотой и длительностью.
Вид
Название
Описание
Ждать получения сообщения из другой параллельной задачи.
Ждать ввода значения от пользователя.
Ждать, пока значение, возвращаемое гиродатчиком на указанном порту, не будет сравнимо с указанным в значении параметра «градусы».
Свойство
Описание
Переменная
Имя переменной.
По умолчанию
Значение переменной по умолчанию.
Текст
Описание поля ввода.
Программа
Исполнение программы
Вид
Название
Описание
Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать на экране точку в указанных координатах.
Свойство
Значение
Вычислять
Истина — вывод на экран значения переменной или выражения.
Ложь — вывод на экран текста.
Текст
Текст / имя переменной (выражение) для вывода на экран.
Обновить картинку
Истина — обновить экран. Ложь — не обновлять экран.
X, Y
Координаты начала текста.
Размер
Размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).

Внимание! Одна клетка имеет размеры 17,5×17,5 сантиметров или 50×50 пикселей.
Для создания пустого XML-файла используйте стандартные средства вашей операционной системы.
Для сохранения нарисованной в TRIK Studio модели мира:
Перейдите в режим 2D.
Перейдите в «Режим отладки».
Нажмите правой кнопкой мыши на сцену и в появившемся контекстном меню выберите «Сохранить модель мира…».
Укажите место сохранения и имя файла.
Откройте сохраненный XML-файл в любом текстовом редакторе. Например, Notepad++.
XML-файл состоит из тегов и атрибутов.
Тег — это элемент языка разметки. Существует начальный (открывающий) и конечный (закрывающий) тег. Текст, содержащийся между начальным и конечным тегом, отображается и размещается в соответствии со свойствами, указанными в начальном теге.
Например:
Атрибуты — это свойства тега, дающие дополнительные возможности форматирования текста. Они записываются в виде сочетания «имя атрибута — значение». Текстовые значения заключаются в кавычки.
В вышеуказанном примере атрибутами являются:
begin="200:-200"
id="{a3ede76b-1d7e-4c72-9ed4-08d8ea9af4bf}"
end="200:150"
Самая простая виртуальная модель мира без объектов в формате .xml выглядит следующим образом:
Для описания роботов имеются следующие теги:
Тег
Описание
Определяет робота на сцене. Используется как контейнер и должен содержать элемент .
Добавляет робота на сцену. Может использоваться как контейнер.
Определяет датчики на роботе. Используется как контейнер.
Конфигурация портов датчиков.
Определяет стартовое положение робота.
Определяет робота на сцене. Используется как контейнер, атрибутов не имеет.
Добавляет робота на сцену. Может использоваться как контейнер.
Внимание! В TRIK Studio нельзя добавить несколько роботов на сцену.
Атрибут
Описание
direction="0″
Направление робота, которое можно регулировать, нажав на робота и потянув за стрелку.
position="x:y"
Положение робота, где x, y — положение левой верхней точки квадрата робота в .
id="trikKitRobot"
Уникальный идентификатор.
Определяет датчики на роботе. Используется как контейнер, атрибутов не имеет.
Конфигурация портов датчиков.
Атрибут
Описание
position="x:y"
Положение датчика, где x, y — положение центральной точки квадрата датчика в .
direction="0″
Направление датчика, которое можно регулировать, нажав на датчик и потянув за стрелку.
port="A1###input######sensorA1"
Порт, к которому подключен датчик.
type="trik::robotModel::parts::TrikInfraredSensor"
Тип подключенного сенсора.
Существует 5 видов датчиков для TRIK и 9 видов датчиков для EV3:
Датчик
Описание
TrikSonarSensor
Ультразвуковой датчик расстояния.
TrikLineSensor
Датчик линии.
TrikLightSensor
Датчик освещённости.
TrikTouchSensor
Датчик касания.
TrikInfraredSensor
Определяет стартовое положение робота.
Атрибут
Описание
id="{name}"
Уникальный идентификатор.
direction="0″
Направление робота, если нажать на кнопку «вернуть». Чтобы отрегулировать, нажмите на крестик и потяните за стрелку.
x="25″
Положение по оси x в .
y="25″
Положение по оси y в .
Конфигурация портов моторов.
Атрибут
Описание
left="M4###output###М4###"
Порт, к которому подключен левый двигатель.
right="M3###output###М3###"
Порт, к которому подключен правый двигатель.
Для описания объектов имеются следующие теги:
Тег
Описание
walls
Определяет стены. Используется как контейнер, атрибутов не имеет.
skittles
Определяет банки. Используется как контейнер, атрибутов не имеет.
balls
Определяет мячи. Используется как контейнер, атрибутов не имеет.
colorFields
Определяет элементы, которые вы можете нарисовать (линию, кривую Безье, прямоугольник, эллипс, элементы, нарисованные с помощью стилуса). Используется как контейнер, атрибутов не имеет.
images
Определяет вставленную картинку. Используется как контейнер, атрибутов не имеет.
Добавляет на сцену стену.
Атрибут
Описание
id="{name}"
Уникальный идентификатор.
begin="x:y"
Начало стены, где x, y — положение начальной точки в .
end="x:y"
Конец стены, где x, y — положение конечной точки в .
Добавляет банку на сцену.
Атрибут
Описание
markerY="44″
Позиция, на которую встанет банка по оси Y, если нажать на кнопку «вернуть».
markerX="220″
Позиция, на которую встанет банка по оси X, если нажать на кнопку «вернуть».
id="{name}"
Уникальный идентификатор.
y="44″
Положение по оси Y.
x="220″
Положение по оси X.
Добавляет мяч на сцену.
Атрибут
Описание
markerY="169″
Позиция, на которую встанет мяч по оси Y, если нажать на кнопку «вернуть».
markerX="-18″
Позиция, на которую встанет мяч по оси X, если нажать на кнопку «вернуть».
id="{name}"
Уникальный идентификатор.
y="169″
Положение по оси Y.
x="-18″
Положение по оси X.
Добавляет линию на сцену.
Атрибут
Описание
begin="x:y"
Начало линии, где x, y — положение начальной точки в .
end="x:y"
Конец линии, где x, y — положение конечной точки в .
id="{name}"
Уникальный идентификатор.
stroke-width="6″
Ширина линии.
fill="#ff000000″
Цвет заливки линии.
Добавляет кривую Безье.
Атрибут
Описание
cp1="x:y"
Маркер, задающий изгиб кривой.
cp2="x:y"
Маркер, задающий изгиб кривой.
stroke-style="solid"
Вид кривой Безье. Виды кривой Безье аналогичны видам линии.
begin="x:y"
Начало кривой Безье, где x, y — положение начальной точки в .
end="x:y"
Конец кривой Безье, где x, y — положение конечной точки в системе координат.
Добавляет прямоугольник.
Атрибут
Описание
stroke-style="solid"
Вид границ прямоугольника. Виды прямоугольника аналогичны видам линии.
begin="x:y"
Начало прямоугольника, где x, y — положение начальной точки в .
end="x:y"
Конец прямоугольника, где x, y — положение конечной точки в .
id="{name}"
Уникальный идентификатор.
fill-style="none"
Заливка. По умолчанию стоит «none». Заполненный прямоугольник будет со значением «solid».
Добавляет эллипс.
Атрибут
Описание
stroke-style="solid"
Вид границ эллипса. Виды эллипса аналогичны видам линии.
begin="x:y"
Начало эллипса, где x, y — положение начальной точки в .
end="x:y"
Конец эллипса, где x, y — положение конечной точки в .
id="{name}"
Уникальный идентификатор.
fill-style="none"
Заливка. По умолчанию стоит «none». Заполненный эллипс — будет со значением «solid».
Определяет стилус для рисования.
Атрибут
Описание
stroke-style="solid"
Вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии.
id="{name}"
Уникальный идентификатор.
fill-style="none"
Заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные.
stroke-width="6″
Толщина стилуса.
fill="#ff000000″
Цвет стилуса.
Позволяет рисовать произвольные фигуры с помощью стилуса. Этот блок кода состоит из множества отрезков.
Атрибут
Описание
stroke-style="solid"
вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии
id="{name}"
уникальный идентификатор
fill-style="none"
заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные
stroke-width="6″
толщина стилуса
fill="#ff000000″
цвет стилуса
Позволяет добавлять регионы на сцене. Существует 2 вида региональных ограничений:
rectangle — прямоугольник
ellipse — эллипс
Атрибут
Описание
filled="true"
Заполненность. Значение по умолчанию — true.
type="rectangle"
Геометрический вид региона.
height="300″
Высота региона (в случае с эллипсом это высота прямоугольника, описывающего эллипс).
width="300″
Ширина региона (в случае с эллипсом это длина прямоугольника, описывающего эллипс).
text="Finish"
Название, которое будет выводиться в TRIK Studio.
Необходимо нарисовать штрихкод. Штрихкод состоит из белых и черных линий одинаковой толщины. Черная линия задает 1 в двоичном числе, а белая 0. Первая черная линия на пути робота — это старший бит числа.
Порядок линий в штрихкоде: 1001011011.
В данной задаче линии должны быть одинаковой толщины и длины. От руки с помощью инструмента «Линия» или «Стилус» нарисовать линии очень сложно, поэтому отредактируйте линии вручную:
1. Нарисуйте на сцене 10 линий.
2. Сохраните модель мира.
3. Откройте получившийся XML-файл в любом удобном редакторе. Обратите внимание на блок кода с тегом <line...>.
4. Для удобства назовите каждую линию black1-black5 и white1-white5. Сделать это можно в атрибуте id. Называйте линии в порядке, указанном выше.
5. Укажите толщину линий «50» в атрибуте stroke-width.
6. Присвойте цвет каждой линии: #ff000000 — черный, #ffffffff — белый. Сделать это можно в атрибуте fill. Присваивайте цвета таким образом, чтобы получился штрихкод.
7. Выставьте положение каждой линии в атрибутах begin и end без зазоров, чтобы получился ровный штрихкод.
Блоки в TRIK Studio Junior делятся на четыре категории:
Алгоритмы — блоки для описания алгоритмов.
Действия — блоки, выполняющие какое-либо действие «Исполнителя»: команды проезда вперед, поворотов, проигрывания звука и других.
Ожидания — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.
— блоки, используемые для вывода графики и текста на экран.
Начальная точка выполнения программы.
На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.
Процесс интерпретации диаграммы начинается именно с этого блока.
Конец программы.
Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.
У данного блока не может быть исходящих связей.
Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «», но этот блок делает программу понятнее.
Разделение выполнения программы в соответствии с заданным условием.
У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».
Обозначает слияние двух веток условного оператора.
Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «» или «» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов goto.
Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).
Блок, организующий выполнение последовательности блоков несколько раз.
Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз.
Бесконечные циклы и циклы вида while/do и while организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «».
Условие с несколькими альтернативами. В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.
Считает значение заданного выражения. Также допускается инициализация переменных. Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «».
Вызов подпрограммы. Подпрограммы используются для вынесения повторяющихся фрагментов программы на отдельную диаграмму. При добавлении этого блока на диаграмму будет предложено ввести имя подпрограммы, после чего двойным кликом на блоке можно будет перейти на диаграмму, соответствующую данной подпрограмме. Также появится дополнительная палитра со всеми подпрограммами. Подпрограммы из неё можно перетаскивать на сцену и использовать как обычные блоки. Вид, имя и свойства блока можно изменить с помощью контекстного меню.
Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».
В открывшемся окне вы можете:
Изменить имя подпрограммы.
Добавить и изменить параметры подпрограммы, задав имя, тип и значение.
Изменить картинку на иконке вашей подпрограммы.
Изменить фон иконки подпрограммы.
Блок «Черный ящик» используется для составления задач на поиск правила обработки информации.
На вход подается одно или несколько значений, на выходе выдается одно значение. Ученику необходимо понять, по какому правилу обрабатывается информация.
Само правило записывается в виде алгоритма «внутри» блока «Черный ящик». То есть по сути это подпрограмма, которую нельзя отредактировать после сохранения.
Добавить блок «Черный ящик» на сцену.
Написать алгоритм подпрограммы «Черного ящика».
Указать в свойствах количество переменных.
В контекстном меню выбрать «Закрыть "Черный ящик"». После этого подпрограмму отредактировать будет нельзя.
Важно! Если вы используете одну переменную в подпрограмме, то её имя должно быть input. Если вы используете несколько переменных, то input1, input2, input3 и т.д.
Выходная переменная должна именоваться output.
1. Запрограммируем правило, по которому входные значения обрабатываются следующим образом:
Результат = Переменная1 + Переменная2 + Переменная3
2. Добавим блок «Черный ящик» и напишем подпрограмму:
3. Главная диаграмма будет выглядеть так:
4. «Закроем» блок и сохраним программу.
5. При выполнении программы и обработке блока «Чёрный ящик» появится окно:
6. Введем все значения и нажмем кнопку «Выполнить».
7. Далее можно вводить комбинации значений до тех пор, пока мы не установим правило обработки. Нажмем кнопку «Завершить».
8. После этого продолжиться выполнение алгоритма программы.
Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала.
Блок должен иметь хотя бы две исходящие связи.
Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «» или в блоке «») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — main.
Блок слияния параллельных задач. Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока. Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.
Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.
Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.
Блок для добавления на диаграмму произвольного текста в качестве комментария.
Используется для пояснения конкретного блока или участка диаграммы. Может быть связан с блоком, который он поясняет.
При выполнении программы блок не учитывается.
Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке ). В качестве сообщения может быть любое выражение.
Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».
Перемещает «Исполнителя» на указанное количество клеток вперед. Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».
Перемещает «Исполнителя» на указанное количество клеток назад. Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».
Поворачивает «Исполнителя» направо.
Поворачивает «Исполнителя» налево.
Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Установить указанный цвет светодиода на корпусе контроллера.
Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.
Ждать получения сообщения из другой параллельной задачи. Когда сообщение будет получено, оно будет присвоено указанной в блоке переменной. Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, присвоив переменной пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника. Пример: если вы посылаете число в виде строки, то оно будет принято как число.
Ждать ввода значения от пользователя. После ввода значение будет присвоено указанной в блоке переменной.
Блок «Пользовательский ввод» имеет 3 свойства:
Пример
Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Стереть всё, что нарисовано на экране.
Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.
Закончить рисование маркером.
Закрасить клетку, на которой находится «Исполнитель», выбранным цветом. Цвет выбирается в свойствах блоках в выпадающем меню.
Печатает заданную строку в заданном месте на экране робота.
Для вывода текста:
В свойстве «Текст» напишите нужный текст.
Уберите галочку в свойстве «Вычислять».
Для вывода значения переменной:
В свойстве «Текст» напишите имя переменной.
Поставьте галочку в свойстве «Вычислять».
Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать на экране точку в указанных координатах.
Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.
Нарисовать на экране смайлик.
Нарисовать на экране грустный смайлик.
Задаёт цвет фона экрана.
<wheels left="M4###output###М4###" right="M3###output###М3###"/><wheels left="B###output###В###" right="C###output###С###"/><walls> <!-- начальный (открывающий) тег -->
<wall begin="200:-200" id="{a3ede76b-1d7e-4c72-9ed4-08d8ea9af4bf}" end="200:150"/>
</walls> <!-- конечный (закрывающий) тег --><?xml version='1.0' encoding='utf-8'?>
<root>
<world>
<background/>
<walls/>
<skittles/>
<balls/>
<colorFields/>
<images/>
<regions/>
</world>
<robots>
<robot direction="0" id="trikKitRobot" position="0:0">
<sensors/>
<startPosition direction="0" id="{name}" y="25" x="25"/>
<wheels left="M4###output###М4###" right="M3###output###М3###"/>
</robot>
</robots>
</root><robots>
<robot id="trikKitRobot" position="0:0" direction="0">
</robots><robot id="trikKitRobot" position="0:0" direction="0"><sensors>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###JM4$$$D$$$4###" position="75:25"/>
</sensors><sensor position="75:25" direction="0" port="A1###input###А1###sensorA1"
type="trik::robotModel::parts::TrikInfraredSensor"/><startPosition id="{7a326d25-82f4-4eb4-9b42-1e75576f35a4}" direction="0" x="25" y="25"/><wall id="{wall1}" begin="50:-50" end="250:-50"/><skittle rotation="0" id="{skittle1}" markerY="44" startRotation="0" x="220" y="44"
markerX="220"/><ball rotation="0" id="{ball1}" markerY="169" startRotation="0" x="-18" y="169" markerX="-18"/> <line stroke-width="6" fill-style="none" end="250:-50" id="{line1}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="50:-50"/><cubicBezier id="{cubicBezier1}" fill-style="none" stroke-width="6" end="-106.577:134.894"
begin="-112.95:-192.25" fill="#ff000000" cp1="-142.95:-192.25" cp2="17.0502:-192.25"
stroke="#ff000000" stroke-style="solid"/><rectangle stroke-width="6" fill-style="none" end="344:511" id="{rectengle1}"
stroke-style="solid" fill="#ff000000" stroke="#ff000000" begin="285:229"/><ellipse stroke-width="6" fill-style="none" end="-178:300" id="{ellipse1}"
stroke-style="solid" fill="#ff000000" stroke="#ff000000" begin="-260:7"/><stylus stroke-width="6" fill-style="none" id="{stylus_name}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000"><stylusLine stroke-width="6" fill-style="none" end="-334:259" id="{name1}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-334:260"/>
<stylusLine stroke-width="6" fill-style="none" end="-333:258" id="{name2}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-334:259"/>
<stylusLine stroke-width="6" fill-style="none" end="-333:254" id="{name3}" stroke-style="solid"
fill="#ff000000" stroke="#ff000000" begin="-333:258"/><regions>
<region filled="true" type="rectangle" height="300" width="300" textX="0"
text="Finish" textY="0" x="1300" y="-200" visible="true" id="Start" color="#ff0000"/>
</regions>ColorSensorFull
Датчик цвета (распознания).
ColorSensorBlue
Датчик цвета (синий).
ColorSensorRed
Датчик цвета (красный).
ColorSensorPassive
Датчик цвета (пассивный).
Конфигурация портов моторов.
Инфракрасный датчик расстояния.
Датчик
Описание
RangeSensor
Датчик расстояния.
TouchSensor
Датчик касания.
Ev3Gyroscope
Гиродатчик.
LightSensor
Датчик света.
ColorSensorGreen
regions
Определяет регионы. Используется как контейнер, атрибутов не имеет.
Добавляет стену.
Добавляет банку.
Добавляет мяч.
Добавляет линию.
Добавляет кривую Безье.
Добавляет прямоугольник.
Добавляет эллипс.
Определяет стилус на сцене. Используется как контейнер.
Позволяет рисовать произвольные фигуры с помощью стилуса.
Позволяет добавлять регионы в на сцене.
fill-style="none"
Заливка. В данном случае этот атрибут не имеет смысла, т.к. линия всегда однородная.
stroke-style="solid"
Вид линии. Существует 5 видов линии:
solid — сплошная;
dot — точечный пунктир;
dash — штриховой пунктир;
dashdot — штрихпунктир;
dashdotdot — штрихпунктир с двумя точками.
stroke="#ff000000″
Цвет линии.
id="{name}"
Уникальный идентификатор.
fill-style="none"
Заливка. В данном случае этот атрибут не имеет смысла, т.к. кривая Безье всегда однородная.
stroke-width="6″
Ширина кривой Безье.
stroke="#ff000000″
Цвет заливки кривой Безье.
fill="#ff000000″
Цвет кривой Безье.
fill="#ff000000″
Цвет границ прямоугольника.
stroke-width="6"
Ширина границ прямоугольника.
stroke="#ff000000″
Цвет заливки прямоугольника.
stroke-width="6″
Ширина границ эллипса.
fill="#ff000000″
Цвет границ эллипса.
stroke="#ff000000″
цвет заливки эллипса
stroke="#ff000000″
Цвет заливки стилуса.
stroke="#ff000000″
цвет заливки эллипса стилуса
textX="0″
Положение названия региона относительно левого нижнего угла по оси X.
textY="0″
Положение названия региона относительно левого нижнего угла по оси Y.
x="1300″
Положение начала региона (левого верхнего угла) по оси X (в случае с эллипсом это координата по оси X левого верхнего угла прямоугольника, описывающего эллипс).
y="-200″
Положение начала региона (левого верхнего угла) по оси Y (в случае с эллипсом это координата по оси Y левого верхнего угла прямоугольника, описывающего эллипс).
visible="false"
Видимость в TRIK Studio.
id="finish"
Уникальный идентификатор региона.
color="#ff0000″
Цвет границ и заполнения.
Датчик цвета (зелёный).
Разделение выполнения программы в соответствии с заданным условием.
Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.
Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).
Блок, организующий выполнение последовательности блоков несколько раз.
Условие с несколькими альтернативами.
Считает значение заданного выражения. Также допускается инициализация переменных.
Вызов подпрограммы.
Подпрограмма, которую нельзя отредактировать после сохранения.
Блок разделяет выполнение программы на несколько потоков.
Блок слияния параллельных задач.
Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.
Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.
Блок для добавления на диаграмму произвольного текста в качестве комментария.
Перемещает «Исполнителя» на указанное количество клеток назад.
Поворачивает «Исполнителя» направо.
Поворачивает «Исполнителя» налево.
Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Установить указанный цвет светодиода на корпусе контроллера.
Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Закрасить клетку, на которой находится «Исполнитель».
Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.
Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать на экране точку в указанных координатах.
Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.
Нарисовать на экране смайлик.
Нарисовать на экране грустный смайлик.
Задаёт цвет фона экрана.
Вид
Название
Описание
Начальная точка выполнения программы.
На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.
Процесс интерпретации диаграммы начинается именно с этого блока.
Конец программы.
Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.
У данного блока не может быть исходящих связей.
Блок для объявления новой переменной и задания ей значения.
Свойство
Описание
Значение
Указывается выражение, определяющее начальное значение переменной.
Переменная
Указывается имя переменной.
Свойство
Описание
Условие
Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.
Свойство
Описание
Условие
Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.
Свойство
Описание
Количество переменных
В данном свойстве необходимо указать количество переменных, которые необходимо подать на вход. В подпрограмме должно использоваться такое же количество переменных.
Вид
Название
Описание
Отправляет данное сообщение в параллельную задачу с заданным идентификатором.
Сохраняет в указанную переменную код нажатой на роботе кнопки.
Перемещает «Исполнителя» на указанное количество клеток вперед.
Вид
Название
Описание
Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.
Ждать получения сообщения из другой параллельной задачи.
Ждать ввода значения от пользователя.
Свойство
Описание
Переменная
Имя переменной.
По умолчанию
Значение переменной по умолчанию.
Текст
Описание поля ввода.
Программа
Исполнение программы
Вид
Название
Описание
Стереть всё, что нарисовано на экране.
Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.
Закончить рисование маркером.
Свойство
Описание
Цвет
Цвет, которым будет закрашиваться клетка.
Вычислять
Истина — печатает в клетке значение переменной или выражения.
Ложь — печатает в клетке текст.
Текст
Текст / имя переменной (выражение) для вывода в клетке.
Свойство
Значение
Вычислять
Истина — вывод на экран значения переменной или выражения.
Ложь — вывод на экран текста.
Текст
Текст / имя переменной (выражение) для вывода на экран.
Обновить картинку
Истина — обновить экран. Ложь — не обновлять экран.
X, Y
Координаты начала текста.

Для подготовки упражнений для учеников существует возможность внесения ограничений с помощью редактирования XML-файла.
Ограничения бывают трех видов:
Временны́е. Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.
Пространственные. Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.
Ограничения на устройства. Например, ограничение на набор датчиков или на поведение устройств.
Для описания ограничений используется главный тег <constraints>…</constraints>, в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:
Тег
Описание
Временное ограничение.
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка.
Основной инструмент задания динамических ограничений. Используется как контейнер.
Безусловное событие, выполняющееся перед началом выполнения программы.
Основной тег, в который вписываются все ограничения. Используется как контейнер.
Временное ограничение. Является обязательным.
Атрибут
Описание
value="значение"
Количество миллисекунд, через которое исполнение будет прекращено и выдана ошибка «Превышен лимит времени».
Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег: <conditions>...</conditions>.
Атрибут
Описание
checkOnce="true"
Логический атрибут. Если в значении стоит true, то ограничение будет проверено 1 раз при старте программы и больше проверяться не будет.
Полезно, например, если нужно 1 раз проверить, что датчики расставлены верно, а дальше во время исполнения ничего не поменяется.
failMessage="Ошибка!"
Сообщение об ошибке, которое будет показано при нарушении ограничения.
Основной инструмент задания динамических ограничений. Используется как контейнер. Описывает строго одно событие.
Атрибут
Описание
settedUpInitially="true"
Атрибут, позволяющий указать взведено ли событие при старте программы. Событие может быть взведено или спущено (setted up и dropped). Во взведенном состоянии событие выполняет свой триггер по выполнению своего условия, в спущенном оно просто игнорируется системой. Значение по умолчанию — false.
id="finish checker"
Уникальный идентификатор события. По этому идентификатору можно обращаться к данному событию из других. Опциональный.
dropsOnFire = "true"
Логический атрибут, который указывает, продолжать ли быть событию взведенным после его срабатывания или нет. Опциональный. Значение по умолчанию -- true.
Безусловное событие, выполняющееся перед началом выполнения программы.
Теперь обсудим, какими могут быть условия в элементах <constraint> и <event>. Условия задаются с помощью тега <condition> в случае, если проверяется только одно из атомарных условий, или тега <conditions>, если проверяется составное условие.
Внутри этого тега описывается проверяемое условие.
Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть and или or. Отрицание выражения задается тегом <not> без атрибутов. Среди подвыражений могут также встречаться другие элементы <conditions>.
Атрибут
Описание
glue="and"
Логическая связка.
Атомарное условие представляет собой один из следующих элементов:
Тег
Описание
, , ,
Операции сравнения значений.
Позволяет задавать пространственные ограничения.
Позволяет проверить, взведено событие или нет.
Позволяет задать время в мс, после которого данное условие считается истинным.
Равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Не равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Больше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Меньше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.
Позволяет задавать пространственные ограничения.
Атрибут
Описание
objectId="id"
id взятого объекта.
regionId="id"
id взятого региона.
objectPoint="center|all|any"
Осуществляет проверку того, что:
center — центр объекта находится в зоне, all — все точки объекта находятся в зоне, any — хоть какая-то точка объекта находится в зоне
Позволяет проверить, взведено событие или нет.
Атрибут
Описание
id="event1"
Идентификатор проверяемого события
В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.
Предикат, который начинает выдавать 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 дочерний элемент, значение которого должно быть целочисленным.
Задание константы.
Атрибут
Описание
value="0″
Значение заданной константы.
Значение переменной.
Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.
Атрибут
Описание
name="my_value"
Имя переменной
Взять состояние объекта.
Атрибут
Описание
object="robot1.display.labels.size"
id взятого объекта.
Взять метатип объекта с заданным идентификатором. Например: если взять typeOf объекта wall с id=777, то он вернет, что тип этого объекта wall.
Чаще всего этот элемент будет нужен для проверки типа подключенных датчиков и моторов.
Атрибут
Описание
objectId="id"
Уникальный идентификатор взятого объекта.
Унарные арифметические операции отвечающие за изменение знака и взятие модуля числа.
Сумма и разность значений. Минимальное и максимальное значение.
Тег
Описание
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.
Показать ошибку пользователю, завершить проверку задания.
Показать пользователю сообщение об успешном прохождении задания и завершить проверку.
Установить значение переменной.
Взводит или опускает событие
Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.
Показать ошибку, завершить проверку задания.
Атрибут
Описание
message="Неверный ответ!"
текст выведенной ошибки
Задание успешно пройдено.
Атрибут
Описание
deferred="false"
Опциональный. По умолчанию равен "false". При выставлении его в true данный триггер не остановит выполнение программы, т. е. чекер дождется конца программы и, либо скажет, что программа выполнена успешно, если ошибок не было, либо выпадет с ошибкой в противном случае. Другими словами атрибут deferred не позволяет получить ошибку "Программа закончилась, но задание не выполнено": программа либо завершится с успехом, либо с содержательной ошибкой типа "Превышен лимит времени".
Установить значение переменной
Атрибут
Описание
name="my_value"
Название переменной
Взводит или опускает событие
Атрибут
Описание
id="finish checker"
id выбранного события
Выводит текст в консоль
Атрибуты
Атрибут
Описание
text="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
Датчик цвета (зеленый)
Свойство
Описание
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-ов, выведенных на экран.
Проверяем, что на экран контроллера было выведено слово “сообщение”. Регистр слова важен.
Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.





























































<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><timelimit value="35000"/><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><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><condition>
<!-- Внутри тега описано условие равенства двух значений -->
<equals>
<objectState object="robot1.display.smiles"/>
<bool value="true"/>
</equals>
</condition><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><!-- Задаем ограничение на то, что объект робот находится в регионе с id=”start” -->
<inside objectId="robot1" regionId="start"/><!-- Условие, что событие с id=”event1” взведено -->
<condition>
<settedUp id="event1"/>
</condition>
<!-- Условие, что событие с id=”event2” опущено -->
<condition>
<dropped id="event2"/>
</condition><event id="check event" settedUpInitially="true">
<conditions glue="and">
<settedUp id="Try move"/>
<dropped id="Go back"/>
</conditions>
<trigger>
<success/>
</trigger>
</event><timer timeout="1000" 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><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><int value="0"/>
<string value="finish"/><variableValue name="rotation"/><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 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>
<!— тут только один тег —>
</trigger>
<triggers>
<!— тут —>
<!— несколько —>
<!— тегов —>
</triggers><fail message="Неверный ответ!"/><success/><!-- Создаем переменную 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><!-- Запустить событие "finish checker" -->
<triggers>
<setUp id="finish checker"/>
</triggers><trigger>
<message text="Hello, world!"/>
</trigger>
При срабатывании такого триггера в консоль робота будет выведен текст "Hello, world!"<equals>
<objectState object="robot1.display.labels.first.text"/>
<string value="сообщение"/>
</equals><?xml version="1.0" encoding="UTF-8"?>
<root>
<world>
<background />
<walls>
<!-- Стена -->
<wall id="{wall1}" end="300:150" begin="0:100" />
<wall id="{wall2}" end="550:100" begin="300:150" />
<wall id="{wall3}" end="650:200" begin="550:100" />
<wall id="{wall4}" end="850:300" begin="650:200" />
<wall id="{wall5}" end="1200:300" begin="850:300" />
<wall id="{wall6}" end="1600:50" begin="1200:300" />
</walls>
<skittles />
<balls />
<colorFields />
<images />
<regions>
<!-- Регионы -->
<region visible="true" id="finish" x="1300" color="#ff0000" text="Finish" type="rectangle" width="300" textX="0" textY="0" y="-200" filled="true" height="300" />
<region visible="true" id="start_zone" x="-50" color="#0000ff" text="Start" type="rectangle" width="150" textX="0" textY="0" y="100" filled="true" height="-150" />
<region visible="false" id="warzone_1" x="-50" color="#ffff00" text="warzone1" type="rectangle" width="650" textX="0" textY="0" y="-50" filled="true" height="200" />
<region visible="false" id="warzone_2" x="600" color="#ffff00" text="warzone2" type="rectangle" width="250" textX="0" textY="0" y="0" filled="true" height="250" />
<region visible="false" id="warzone_3" x="850" color="#ffff00" text="warzone3" type="rectangle" width="750" textX="0" textY="0" y="50" filled="true" height="250" />
</regions>
</world>
<robots>
<!-- Описание робота -->
<robot id="trikKitRobot" position="0:0" direction="0">
<sensors>
<sensor port="A1###input###А1###sensorA1" position="75:25" type="trik::robotModel::parts::TrikInfraredSensor" direction="45" />
<sensor port="M3###output###JM3$$$C$$$3###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
<sensor port="M4###output###JM4$$$D$$$4###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0" />
</sensors>
<startPosition id="{ee2c46c1-23fc-4cda-98f4-77d9de775305}" x="25" y="25" direction="0" />
<wheels left="M3###output###М3###" right="M4###output###М4###" />
</robot>
</robots>
<constraints>
<!-- Лимит на выполнение программы (30 секунд) -->
<timelimit value="30000" />
<!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы -->
<constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
<inside regionId="start_zone" objectId="robot1" />
</constraint>
<!-- Ограничение на наличие и тип датчиков -->
<constraint checkOnce="true" failMessage="Должен быть подключен только Датчик расстояния ИК на A1">
<conditions glue="and">
<equals>
<typeOf objectId="robot1.A1" />
<string value="trik::twoDModel::robotModel::parts::RangeSensor" />
</equals>
<equals>
<typeOf objectId="robot1.A2" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.A3" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.A4" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.A5" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.A6" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.D1" />
<string value="undefined" />
</equals>
<equals>
<typeOf objectId="robot1.D2" />
<string value="undefined" />
</equals>
</conditions>
</constraint>
<!-- Контроль езды робота -->
<constraint failMessage="Робот попытался выехать из разрешенной зоны!">
<conditions glue="or">
<inside regionId="warzone_1" objectId="robot1" />
<inside regionId="warzone_2" objectId="robot1" />
<inside regionId="warzone_3" objectId="robot1" />
</conditions>
</constraint>
<!-- Событие, проверяющее не заехал ли робот в зону финиша -->
<event settedUpInitially="true">
<condition>
<timer timeout="100" forceDropOnTimeout="true" />
</condition>
<trigger>
<setUp id="finish checker" />
</trigger>
</event>
<!-- Событие, оповещающее об успешном выполнении программы -->
<event id="finish checker" settedUpInitially="false">
<condition>
<inside regionId="finish" objectId="robot1" />
</condition>
<trigger>
<success />
</trigger>
</event>
</constraints>
</root>













































Бинарные арифметические функции, имеют ровно 2 дочерних элемента, значение каждого из которых должно быть целочисленным.
Выводит текст
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
Компас






























































































Задание ограничений — уникальная возможность TRIK Studio, предназначенная для автоматизированной проверки заданий. Этот инструмент имеет множество применений:
самопроверка домашнего задания учениками,
ускорение процесса проверки заданий учителем,
проведение онлайн-соревнований с автоматической проверкой решений участников.
Язык ограничений в TRIK Studio — очень мощный инструмент, который позволяет проверить практически все аспекты выполнения программы и поведения робота, и может показаться сложным на первый взгляд. Однако не стоит расстраиваться — в данной статье мы разберем процесс создания задач с ограничениями, начиная от простых ограничений, которые покрывают большинство задач, и заканчивая сложными ограничениями, что может быть полезно для энтузиастов.
Для тех, кто только начинает знакомиться с языком создания ограничений в TRIK Studio, мы предлагаем начать с простых ограничений на время исполнения программы, зону «Старт» и «Финиш». Для большинства робототехнических задач этого более чем достаточно.
1. Определите для задачи и модели мира следующие условия и параметры.
Оптимальное время выполнения программы. Если программа будет выполняться больше этого времени, проверяющая система выдаст ошибку «Программа работала слишком долго».
Зона «Старт». Зона, из которой робот должен начать выполнение программы, иначе проверяющая система выдаст ошибку.
Зона «Финиш». Зона, в которую должен приехать робот по окончании выполнения программы, иначе проверяющая система выдаст ошибку.
2. Отредактируйте в xml-файле мира значение тега <regions>, добавив туда зоны «Старт» и «Финиш». Меняя значения x, y, width и height , вы можете редактировать местоположение и размер зон. Чтобы проверить положение зоны, загрузите файл в виртуальную модель мира и проверьте расположение зон. После этого, при необходимости, вы можете сделать зоны «Старт» и «Финиш» невидимыми, выставив атрибут visible="false".
3. Скопируйте в xml-файл мира, для которого необходимы ограничения, шаблон блока <constraints>, приведенный ниже.
4. Заполните тег <timelimit value="300000">. Укажите оптимальное, на ваш взгляд, время выполнения программы. Обратите внимание, что время указывается в миллисекундах, т.е. 300000 мс = 5 минут, 120000 мс = 2 минуты и т.п.
5. Задание с ограничениями готово! Теперь вы умеете проверять стартовое и конечное положение робота, время исполнения программы.
Теперь давайте разберем применение данной техники для различных задач и рассмотрим варианты более детальных проверок.
Задача прохождения лабиринта. Стартовав в синем квадрате, необходимо проехать до зоны финиша. Для того чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, задано пространственное ограничение.
Ниже приведен полный код для проверки этой задачи.
Рассмотрим подробнее, как происходит проверка.
1. Зададим ограничение на время прохождения задания. Это ограничение является обязательным. Время указывается в миллисекундах.
2. Зададим ограничение на зону, в которой должен находиться робот перед началом программы. По условию задачи это должен быть синий квадрат - зона старта. Это ограничение будет проверяться один раз, в начале программы, так как атрибут checkOnce равен true.
С помощью тега мы задаем пространственное ограничение. Он имеет два атрибута. В первом (objectId) указываем id объекта, местоположение которого мы хотим проверить, в нашем случае это робот. Во втором (regionId) указываем id региона, в котором должен находиться наш объект.
В случае, если условие, которое описано в <inside> не выполняется, то программа будет завершена с ошибкой. Для этого у тега есть атрибут failMessage, который позволяет задать текст сообщения об ошибке.
3. Для того, чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, давайте зададим еще одно пространственное ограничение.
Отредактируем в xml-файле мира значение тега <regions>, добавив туда регион с id = “warzone”.
Это ограничение будет проверяться во все время выполнения программы. В теге укажем id объекта и id региона, в нашем случае это робот и черный прямоугольник, ограничивающий лабиринт.
В случае, если робот в любой момент времени окажется вне указанного региона, программа будет завершена с ошибкой, текст которой указан в атрибуте failMessage.
4. Теперь нам осталось проверить, что робот доезжает до зоны финиша.
Для этого давайте создадим событие, которое будет проверять находится робот в нужной зоне или нет. Атрибут settedUpInitially="true" означает, что событие будет запущено (взведено) сразу при старте программы.
В теге мы указываем какое именно условие необходимо проверить. В нашем случае условие аналогично описанным выше - мы проверяем, что робот находится в регионе с id = "finish". В случае, если это условие выполнится, то пользователю будет показано сообщение об успешном выполнении программы. Для этого в теге мы пишем дочерний тег .
Задача проехать вперед и остановиться в зоне финиша.
Эта задача немного отличается от Примера 1 тем, что добавляется еще одно условие для успешного завершения программы - роботу необходимо не просто оказаться в зоне финиша, но и остановиться.
Ниже приведен полный код для проверки этой задачи.
Теперь давайте рассмотрим подробнее как происходит проверка.
1. Зададим ограничение на время прохождения задания.
2. Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы.
3. Зададим ограничение на зону, которую робот не может покидать.
4. А теперь создадим событие, которое будет проверять, что робот находится в финишной зоне и при этом он остановился в ней, а не проехал дальше.
Зональное ограничение задается с помощью тега . Для того, чтобы проверить, что робот остановился, нужно проверить, что мощность на обоих моторах равна нулю. Для этого используем тег . С помощью тега укажем объект, значение которого мы хотим сравнить. В нашем случае это мощность на моторах, поэтому в атрибуте object пишем robot1.M3.power или robot1.M4.power, где M3 и M4 обозначают порты, к которым в текущей конфигурации подключены моторы. А значение, с которым нужно сравниться, записываем с помощью тега и его атрибута value.
Таким образом, в этом событии проверяется три условия: робот находится в зоне финиша, мощность на моторе M3 равна нулю и мощность на моторе M4 также равна нулю. В случае выполнения этих условий пользователю будет показано сообщение об успешном выполнении программы.
Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.
Ниже приведен полный код для проверки этого задания.
Теперь давайте рассмотрим подробнее как происходит проверка.
1. Зададим ограничение на время выполнения задания.
2. По условию задачи у робота должен быть подключен только датчик расстояния (других датчиков быть не должно). Для того чтобы убедиться в этом, сравним значение объекта на порту A1 со значением, которое обозначает датчик расстояния. Подробнее о названиях датчиков для разных конструкторов можно узнать по .
3. Выполним проверку, что к другим портам не подключены никакие датчики. Для этого сравним значение на каждом порту со строкой “undefined”.
4. Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы, потому что выставлен флаг checkOnce .
5. Зададим ограничение на зону, которую робот не может покидать. В предыдущих примерах мы рассматривали ситуацию, когда роботу нужно было находиться в одной зоне. В данном случае допустимая зона состоит из нескольких прямоугольников, поэтому нам нужно проверять, что робот находится в одной из этих зон. Для этого используем тег <conditions></conditions> с атрибутом glue = “or”.
6. И наконец, создадим событие, которое будет оповещать об успешном выполнении программы в случае, если робот находится в зоне финиша.
Движение по линии с подсчетом перекрестков: при заезде на перекресток робот должен выводить на экран номер этого перекрестка.
Ниже приведен полный код для проверки этого задания.
Давайте рассмотрим то, как происходит проверка.
1. После каждого перекрестка зададим зоны, в которых будет проверяться, что на экран выведен правильный номер перекрестка. Для этого в xml-файле мира отредактируйте значение тега , добавив туда необходимое количество зон для проверки. Меняя значения x, y, width и height , вы можете редактировать местоположение и размер зон. Чтобы проверить положение зоны, загрузите файл в виртуальную модель мира и проверьте расположение зон. После этого, при необходимости, вы можете сделать зоны невидимыми, выставив атрибут visible="false".
2. После этого в блоке зададим проверку ограничений. Первым укажем ограничение на время выполнения задания.
3. Зададим ограничение на начальное положение робота.
4. В каждой зоне, которая находится после перекрестка, будем проверять, что на экран выведен правильный номер. Для этого в теге укажем id нужного региона и проверим, что последнее выведенное сообщение на экран контроллера (robot1.display.labels.last.text) равно номеру пройденного перекрестка. После этого по цепочке будем вызывать аналогичные события для остальных зон.
5. Будем выводить сообщение об ошибке в случае, если на экран выведен неправильный номер. Для этого сравним сообщение, которое было выведено на экран, с ожидаемым правильным значением. В случае, если сообщения не совпадают, пользователю будет выведено заданное сообщение об ошибке и программа прекратит выполнение.
6. Зададим событие, которое будет выводить сообщение об успешном выполнении программы, если правильно пройдены все заданные перекрестки.
Робот должен должен вытолкнуть все кегли за пределы круга.
Ниже приведен полный код для проверки этого задания.
Теперь разберем подробнее, как происходит проверка.
1. Отредактируем xml-файл мира, добавив в тег зону круга.
2. Зададим ограничение на время выполнения задания.
3. Зададим ограничение на начальное положение робота.
4. Зададим событие, которое проверяет, что все кегли находятся за пределами круга, и после этого выводит сообщение об успешном выполнении программы.
В начальном положении робот должен находиться в стартовой зоне на расстоянии от стены, к порту А1 должен быть подключен датчик касания. Успешным прохождением считается то, где робот подъедет к стене, коснется ее датчиком касания, отъедет от нее и так 5 раз.
Идея проверяющей программы состоит в том, что в любой момент времени взведено либо событие, ждущее пока робот подъедет к стене, либо что он вернулся назад. Оба эти события взводят друг друга. Когда робот возвращается на исходную позицию, увеличивается счетчик итераций. При этом задано дополнительное событие, проверяющее значение счетчика. Оно выведет сообщение об успешном выполнении программы, когда значение будет равно пяти.
Ниже приведен полный код для проверки этого задания.
Теперь давайте рассмотрим подробнее, как происходит проверка.
1. Зададим ограничение на время выполнения задания.
2. По условию задачи у робота должен быть подключен только датчик касания (других датчиков быть не должно). Для того чтобы убедиться в этом, сравним значение объекта на порту A1 со значением, которое обозначает датчик касания. Подробнее о названиях датчиков для разных конструкторов можно узнать по .
3. Выполним проверку, что к другим портам не подключены никакие датчики. Для этого сравним значение на каждом порту со строкой “undefined”.
4. Зададим ограничение на зону, которую робот не может покидать.
5. Зададим событие, которое проверяет, что робот начал двигаться вперед. В качестве условия укажем, что мощность, которая подана на мотор на порту М3, должна быть больше нуля. В том случае, если это условие выполняется, срабатывает два триггера. Первый запускает (взводит) событие с id = "Touching wall", а второй присваивает переменной counter значение ноль.
Так как у атрибута settedUpInitially установлено значение true, то событие будет запущено (взведено) сразу при старте программы.
6. Зададим событие, которое будет показывать ошибку в случае, если спустя 1000мс(=1сек) после начала выполнения программы робот так и не начал движение вперед (т.е событие с id=”First move” всё ещё находится во взведенном состоянии и не было выполнено). Т.к. в данном событии проверяется выполнение сразу нескольких условий, то используется тег с указанием логической связки.
7. Зададим событие, которое проверяет, что робот проехал до стены. В условии проверяется, что значение датчика касания, расположенного на порту A1, равно единице ( это означает, что сработал датчик касания). При выполнении этого условия срабатывает триггер и запускается (взводится) событие с id="Returned back".
8. Зададим событие, которое проверяет, что робот вернулся в зону старта после касания стены. Для этого необходимо задать условие inside с атрибутами objectId="robot1" (наш робот) и regionId="start_zone" (зона, в которую нужно вернуться).
При выполнении этого условия взводятся два события и инкрементируется счетчик итераций.. Первое событие проверяет, что робот коснулся стены, второе проверяет было ли выполнено условие задачи.
9. Зададим событие, которое будет выводить сообщение об успешном выполнении программы, если значение переменной counter не меньше, чем 5.
<regions>
<region type="rectangle" visible="true" color="blue" text="Старт" x="-450" y="-400" width="150" height="150" id="start_zone"/>
<region type="rectangle" visible="true" color="green" text="Финиш" x="450" y="-400" width="150" height="150" id="finish_zone"/>
</regions><constraints>
<!-- Ограничение на время выполнения программы -->
<timelimit value="300000"/>
<!-- Ограничение, которое проверится один раз перед началом программы -->
<constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Событие, которое проверяет, что робот находится в зоне финиша по окончании выполнения программы -->
<event id="finish checker" settedUpInitially="true">
<condition>
<inside objectId="robot1" regionId="finish_zone"/>
</condition>
<trigger>
<success/>
</trigger>
</event>
</constraints><?xml version='1.0' encoding='utf-8'?>
<root>
<!-- Описание мира -->
<world>
<trace/>
<walls>
<wall end="450:-400" id="" begin="-300:-400"/>
<wall end="-300:200" id="" begin="-300:-250"/>
<wall end="450:200" id="" begin="-300:200"/>
<wall end="450:200" id="" begin="450:-250"/>
<wall end="150:-100" id="" begin="150:-400"/>
<wall end="300:50" id="" begin="300:-250"/>
<wall end="450:-250" id="" begin="300:-250"/>
<wall end="-150:-250" id="" begin="-300:-250"/>
<wall end="0:-250" id="" begin="-150:-250"/>
<wall end="-150:-100" id="" begin="150:-100"/>
<wall end="150:50" id="" begin="-150:50"/>
<wall end="150:200" id="" begin="150:50"/>
</walls>
<colorFields/>
<!-- Задание регионов (зон) на карте мира -->
<regions>
<region type="rectangle" visible="true" color="blue" text="Старт" x="-450" y="-400" width="150" height="150" id="start_zone"/>
<region type="rectangle" visible="true" color="green" text="Финиш" x="450" y="-400" width="150" height="150" id="finish_zone"/>
<region id="warzone" type="rectangle" filled="false" color="black" visible="true" x="-450" y="-400" width="1050" height="600"/>
</regions>
</world>
<robots>
<robot id="trikKitRobot" direction="0" position="-401:-351">
<sensors>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###JM4$$$D$$$4###" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M3###output###JM3$$$C$$$3###" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M2###output###JM2$$$B$$$2###" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M1###output###JM1$$$A$$$1###" position="75:25"/>
</sensors>
<startPosition direction="0" x="-376" y="-326"/>
</robot>
</robots>
<!-- Описание ограничений -->
<constraints>
<!-- Ограничение на время 5 минут -->
<timelimit value="300000"/>
<constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Ограничение, проверяющее, что робот находится в допустимой зоне -->
<constraint failMessage="Робот попытался объехать лабиринт!">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
<!-- Событие, которое проверяет, что робот находится в зоне финиша по окончании выполнения программы -->
<event id="finish checker" settedUpInitially="true">
<condition>
<inside objectId="robot1" regionId="finish_zone"/>
</condition>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root><timelimit value="300000"/><constraint checkOnce="true" failMessage="Робот должен находиться в зоне старта перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint><region id="warzone" type="rectangle" filled="false" color="black" visible="true" x="-450" y="-400" width="1050" height="600"/><constraint failMessage="Робот попытался объехать лабиринт!">
<inside objectId="robot1" regionId="warzone"/>
</constraint><event id="finish checker" settedUpInitially="true">
<!-- Условие -->
<condition>
<inside objectId="robot1" regionId="finish_zone"/>
</condition>
<!-- Триггер -->
<trigger>
<success/>
</trigger>
</event><?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
<world>
<!-- Задание регионов (зон) на карте мира -->
<regions>
<region id="finish_zone" text="Finish" textX="0" width="200" height="150" color="green" x="320" y="-50" visible="true" type="rectangle" filled="true" textY="0"/>
<region id="start_zone" text="Start" textX="0" width="100" height="-100" color="#0000ff" x="-20" y="70" visible="true" type="rectangle" filled="true" textY="0"/>
<region type="rectangle" id="warzone" text="Поле, которое нельзя покидать" x="-20" y="-140" width="610" height="320" color="orange" visible="true"/>
</regions>
</world>
<robots>
<robot id="trikKitRobot" direction="0" position="0:0">
<sensors>
<sensor port="M3###output###М3###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
<sensor port="M4###output###М4###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
<sensor port="M1###output###М1###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
<sensor port="M2###output###М2###" direction="0" position="75:25" type="kitBase::robotModel::robotParts::Motor"/>
</sensors>
<startPosition id="{888338bf-3f53-44a4-ac0a-8aeea2d036b2}" y="25" direction="0" x="25"/>
<wheels left="M3###output###М3###" right="M4###output###М4###"/>
</robot>
</robots>
<settings realisticMotors="false" realisticSensors="false" realisticPhysics="false"/>
<!-- Задание ограничений -->
<constraints>
<!-- Ограничение на время -->
<timelimit value="10000"/>
<!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы-->
<constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Робот находится в допустимой зоне-->
<constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
<!-- Событие, оповещающее об успешном выполнении программы (зона финиша + робот остановился) -->
<event id="finish checker" settedUpInitially="true">
<conditions glue="and">
<inside regionId="finish" objectId="robot1"/>
<equals>
<objectState object="robot1.M3.power"/>
<int value="0"/>
</equals>
<equals>
<objectState object="robot1.M4.power"/>
<int value="0"/>
</equals>
</conditions>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root><timelimit value="10000"/><constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint><constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint><event id="finish checker" settedUpInitially="true">
<!-- Составное условие -->
<conditions glue="and">
<inside regionId="finish" objectId="robot1"/>
<equals>
<objectState object="robot1.M3.power"/>
<int value="0"/>
</equals>
<equals>
<objectState object="robot1.M4.power"/>
<int value="0"/>
</equals>
</conditions>
<trigger>
<success/>
</trigger>
</event><?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
<world>
<walls>
<wall stroke-width="10" end="-110:50" stroke="#ff000000" begin="-200:50" stroke-style="none" fill="#ff000000" id="{f148f786-7d73-4c42-a3aa-c7a29892d3d7}"/>
<wall stroke-width="10" end="0:100" stroke="#ff000000" begin="-110:50" stroke-style="none" fill="#ff000000" id="{8f39faac-9392-4878-86e9-9fe5dbea0007}"/>
<wall stroke-width="10" end="250:110" stroke="#ff000000" begin="0:100" stroke-style="none" fill="#ff000000" id="{bf465864-fa2e-4b59-ac65-e27bd85300d5}"/>
<wall stroke-width="10" end="350:160" stroke="#ff000000" begin="250:110" stroke-style="none" fill="#ff000000" id="{ba5441dd-8dd8-4100-ad8b-66d634792e3f}"/>
<wall stroke-width="10" end="400:260" stroke="#ff000000" begin="350:160" stroke-style="none" fill="#ff000000" id="{ca85b1de-8e9c-49e9-8c40-c2c49f43dcaa}"/>
</walls>
<skittles/>
<balls/>
<colorFields/>
<images/>
<regions>
<region visible="true" type="rectangle" x="350" filled="true" y="50" width="150" height="200" id="good_zone3" color="#ffff00"/>
<region visible="true" type="rectangle" x="-250" filled="true" y="-50" width="150" textY="0" height="100" text="Start" id="start_zone" textX="0" color="#0000ff"/>
<region visible="true" type="rectangle" x="0" filled="true" y="0" width="400" height="150" id="good_zone2" color="#ffff00"/>
<region visible="true" type="rectangle" x="400" filled="true" y="150" width="100" textY="0" height="100" text="Finish" id="finish" textX="0" color="#ff0000"/>
<region visible="true" type="rectangle" x="-200" filled="true" y="-50" width="250" height="150" id="good_zone1" color="#ffff00"/>
</regions>
</world>
<robots>
<robot direction="0" position="-200:-25" id="trikKitRobot">
<sensors>
<sensor type="trik::robotModel::parts::TrikInfraredSensor" direction="69.6769" position="42:18" port="A1###input###А1###sensorA1"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" position="75:25" port="M4###output###М4###"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" position="75:25" port="M3###output###М3###"/>
<sensor type="" direction="0" position="0:0" port="A5###input###А5###sensorA5"/>
<sensor type="" direction="0" position="0:0" port="A6###input###А6###sensorA6"/>
</sensors>
<startPosition direction="0" x="-175" y="0" id="{84223544-d500-411a-9fdb-b382eb98d09f}"/>
<wheels right="M3###output###М3###" left="M4###output###М4###"/>
</robot>
</robots>
<settings realisticPhysics="false" realisticSensors="false" realisticMotors="false"/>
<constraints>
<!-- Лимит времени. Обязательное ограничение -->
<timelimit value="40000"/>
<!-- Проверка, что на порт А1 установлен датчик расстояния -->
<constraint checkOnce="true" failMessage="У робота должен быть установлен датчик расстояния на порт А1">
<equals>
<typeOf objectId="robot1.A1"/>
<string value="twoDModel::robotModel::parts::RangeSensor"/>
</equals>
</constraint>
<!-- Провека, что нет датчиков, кроме датчика расстояния-->
<constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика расстояния">
<conditions glue="and">
<equals>
<typeOf objectId="robot1.A2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A3"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A4"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A5"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A6"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D1"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.F1"/>
<string value="undefined"/>
</equals>
</conditions>
</constraint>
<!-- Зональное ограничение на начало езды. Проверяется один раз в начале программы-->
<constraint checkOnce="true" failMessage="Робот должен находиться в синей зоне перед стартом!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint>
<!-- Проверяет, что робот находится в допустимом регионе на протяжении всего времени выполнения программы -->
<constraint failMessage="Робот покинул допустимую зону!">
<conditions glue="or">
<inside objectId="robot1" regionId="good_zone1"/>
<inside objectId="robot1" regionId="good_zone2"/>
<inside objectId="robot1" regionId="good_zone3"/>
</conditions>
</constraint>
<!-- Событие, оповещающее об успешном выполнении программы -->
<event id="finish checker" settedUpInitially="true">
<condition>
<inside objectId="robot1" regionId="finish"/>
</condition>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root>
<timelimit value="40000"/><constraint checkOnce="true" failMessage="У робота должен быть установлен датчик расстояния на порт А1">
<equals>
<typeOf objectId="robot1.A1"/>
<string value="twoDModel::robotModel::parts::RangeSensor"/>
</equals>
</constraint><constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика расстояния">
<conditions glue="and">
<equals>
<typeOf objectId="robot1.A2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A3"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A4"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A5"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A6"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D1"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.F1"/>
<string value="undefined"/>
</equals>
</conditions>
</constraint><constraint checkOnce="true" failMessage="Робот должен находиться в синем квадрате перед запуском!">
<inside objectId="robot1" regionId="start_zone"/>
</constraint><constraint failMessage="Робот покинул допустимую зону!">
<conditions glue="or">
<inside objectId="robot1" regionId="good_zone1"/>
<inside objectId="robot1" regionId="good_zone2"/>
<inside objectId="robot1" regionId="good_zone3"/>
</conditions>
</constraint><event id="finish checker" settedUpInitially="true">
<condition>
<inside objectId="robot1" regionId="finish"/>
</condition>
<trigger>
<success/>
</trigger>
</event><?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
<world>
<walls/>
<skittles/>
<balls/>
<colorFields>
<cubicBezier id="{6199f811-617a-463d-848f-39b28b918584}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-174.411:98.5051" cp1="-173.503:9.71619" stroke-width="12" cp2="-184.608:-31.2306" fill="#ff000000" end="-103.03:-28.2828"/>
<line id="{311aba08-eff0-4d50-98f1-fc7595e22b79}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-97.2997:-28.5387" stroke-width="12" fill="#ff000000" end="353.7:-28.5387"/>
<line id="{e4428c3f-4ef1-4214-b5be-9a22eb4f875e}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-175.556:244" stroke-width="12" fill="#ff000000" end="-175.556:106.222"/>
<line id="{c921474d-3f18-4f98-b3fd-c83fa6e712b8}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-202.02:102.353" stroke-width="12" fill="#ff000000" end="-149.459:102.353"/>
<line id="{5f4000d6-8494-45bb-8e0c-44a5779f3140}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-49.8316:-64.6465" stroke-width="12" fill="#ff000000" end="-49.8316:11.4478"/>
<line id="{c20e8d67-e66b-4cd1-a4d5-da909d32717a}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="48.2829:-65.5219" stroke-width="12" fill="#ff000000" end="48.2829:10.5724"/>
<line id="{3abe2138-f488-429d-bb27-94b6a13c913e}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="146.599:-64.8485" stroke-width="12" fill="#ff000000" end="146.599:11.2458"/>
<line id="{ccaf1f51-b4b8-4ed4-9110-cf08067e7bf4}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="249.63:-65.5219" stroke-width="12" fill="#ff000000" end="249.63:10.5724"/>
<line id="{6866e178-6a20-4048-8eab-ed3554098cd4}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="460.157:66.3198" stroke-width="12" fill="#ff000000" end="460.157:260.178"/>
<cubicBezier id="{47001b3d-8af4-432d-8e66-9cc7728f2a39}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="358.194:-28.399" cp1="438.051:-29.9289" stroke-width="12" cp2="457.133:13.7415" fill="#ff000000" end="459.881:62.7527"/>
<cubicBezier id="{edb3034d-f57c-4349-a714-3439433d2db2}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="458.622:252.499" cp1="457.591:441.101" stroke-width="12" cp2="251.469:440.071" fill="#ff000000" end="249.408:304.03"/>
<cubicBezier id="{ff2677c7-98f1-46e0-b17c-197a3d94e664}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="249.408:304.03" cp1="251.469:155.622" stroke-width="12" cp2="-10.3061:151.5" fill="#ff000000" end="-9.27549:302.999"/>
<cubicBezier id="{c841736a-ce7b-4bc4-90bb-7bb72bb7dd99}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="-9.27549:302.999" cp1="-9.02218:404.61" stroke-width="12" cp2="-177.667:378.931" fill="#ff000000" end="-175.204:250.438"/>
<line id="{34475443-f1cf-4718-bb44-bd4bfc7221bf}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="428.351:105.655" stroke-width="12" fill="#ff000000" end="489.769:105.655"/>
<line id="{9e883af6-6280-4577-b0da-608011ca26ed}" stroke-style="solid" fill-style="none" stroke="#ff000000" begin="428.197:199.401" stroke-width="12" fill="#ff000000" end="489.615:199.401"/>
</colorFields>
<images/>
<regions>
<region id="region_1" type="rectangle" textX="0" width="80" textY="0" visible="true" y="0" text="1" filled="true" height="80" color="#0000ff" x="-215"/>
<region id="region_2" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="2" filled="true" height="80" color="#0000ff" x="-40"/>
<region id="region_3" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="3" filled="true" height="80" color="#0000ff" x="55"/>
<region id="region_4" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="4" filled="true" height="80" color="#0000ff" x="160"/>
<region id="region_5" type="rectangle" textX="0" width="80" textY="0" visible="true" y="-70" text="5" filled="true" height="80" color="#0000ff" x="260"/>
<region id="region_6" type="rectangle" textX="0" width="80" textY="0" visible="true" y="110" text="6" filled="true" height="80" color="#0000ff" x="420"/>
<region id="region_7" type="rectangle" textX="0" width="80" textY="0" visible="true" y="210" text="7" filled="true" height="80" color="#0000ff" x="420"/>
<region id="start_zone" type="rectangle" textX="0" width="80" textY="0" visible="true" y="130" text="Старт" filled="true" height="80" color="#ff0000" x="-215"/>
</regions>
</world>
<robots>
<robot id="trikKitRobot" position="-199.667:149.444" direction="-90">
<sensors>
<sensor type="kitBase::robotModel::robotParts::Motor" port="M3###output###М3###" position="75:25" direction="0"/>
<sensor type="" port="A1###input###JA1###sensorA1" position="0:0" direction="0"/>
<sensor type="" port="A2###input###JA2###sensorA2" position="0:0" direction="0"/>
<sensor type="" port="LineSensorPort###input###TrikLineSensorPort###lineSensor" position="0:0" direction="0"/>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" port="E3###input###M3$$$Е3###encoder3" position="75:25" direction="0"/>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" port="E4###input###M4$$$Е4###encoder4" position="75:25" direction="0"/>
<sensor type="trik::robotModel::parts::TrikLightSensor" port="A5###input###А5###sensorA5" position="54:42" direction="0"/>
<sensor type="trik::robotModel::parts::TrikLightSensor" port="A6###input###А6###sensorA6" position="54:8" direction="0"/>
<sensor type="kitBase::robotModel::robotParts::Motor" port="M4###output###М4###" position="75:25" direction="0"/>
</sensors>
<startPosition id="{9f3c8967-8967-4a0d-a118-ba8041db8a37}" y="174.444" direction="-90" x="-174.667"/>
<wheels left="M3###output###М3###" right="M4###output###М4###"/>
</robot>
</robots>
<settings realisticMotors="false" realisticSensors="false" realisticPhysics="true"/>
<constraints>
<timelimit value="50000"/>
<constraint failMessage="Робот должен находиться в зоне старта перед запуском!" checkOnce="true">
<inside regionId="start_zone" objectId="robot1"/>
</constraint>
<event id="id_1" settedUpInitially="true">
<conditions glue="and">
<inside regionId="region_1" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="1"/>
</equals>
</conditions>
<trigger>
<setUp id="id_2"/>
</trigger>
</event>
<event id="id_1_fail" settedUpInitially="true">
<conditions glue="and">
<inside regionId="region_1" objectId="robot1"/>
<notEqual>
<objectState object="robot1.display.labels.last.text"/>
<string value="1"/>
</notEqual>
</conditions>
<trigger>
<fail message="Неверный номер перекрестка! Обратите внимание, что номер перекрестка должен выводиться последней строчкой"/>
</trigger>
</event>
<event id="id_2" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_2" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="2"/>
</equals>
</conditions>
<trigger>
<setUp id="id_3"/>
</trigger>
</event>
<event id="id_3" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_3" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="3"/>
</equals>
</conditions>
<trigger>
<setUp id="id_4"/>
</trigger>
</event>
<event id="id_4" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_4" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="4"/>
</equals>
</conditions>
<trigger>
<setUp id="id_5"/>
</trigger>
</event>
<event id="id_5" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_5" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="5"/>
</equals>
</conditions>
<trigger>
<setUp id="id_6"/>
</trigger>
</event>
<event id="id_6" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_6" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="6"/>
</equals>
</conditions>
<trigger>
<setUp id="id_7"/>
</trigger>
</event>
<event id="id_7" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_7" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="7"/>
</equals>
</conditions>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root>
<!-- Пример зоны -->
<region id="region_1" type="rectangle" textX="0" width="80" textY="0" visible="true" y="0" text="1" filled="true" height="80" color="#0000ff" x="-215"/><timelimit value="50000"/><constraint failMessage="Робот должен находиться в зоне старта перед запуском!" checkOnce="true">
<inside regionId="start_zone" objectId="robot1"/>
</constraint><event id="id_1" settedUpInitially="true">
<conditions glue="and">
<inside regionId="region_1" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="1"/>
</equals>
</conditions>
<trigger>
<setUp id="id_2"/>
</trigger>
</event><event id="id_1_fail" settedUpInitially="true">
<conditions glue="and">
<inside regionId="region_1" objectId="robot1"/>
<notEqual>
<objectState object="robot1.display.labels.last.text"/>
<string value="1"/>
</notEqual>
</conditions>
<trigger>
<fail message="Неверный номер перекрестка! Обратите внимание, что номер перекрестка должен выводиться последней строчкой"/>
</trigger>
</event><event id="id_7" settedUpInitially="false">
<conditions glue="and">
<inside regionId="region_7" objectId="robot1"/>
<equals>
<objectState object="robot1.display.labels.last.text"/>
<string value="7"/>
</equals>
</conditions>
<trigger>
<success/>
</trigger>
</event><?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
<world>
<walls/>
<skittles>
<skittle markerY="0.107756" y="0.107756" rotation="0" startRotation="0" id="{skittle1}" x="-90.3433" markerX="-90.3433"/>
<skittle markerY="62.9765" y="62.9765" rotation="0" startRotation="0" id="{skittle2}" x="-63.8519" markerX="-63.8519"/>
<skittle markerY="62.963" y="62.963" rotation="0" startRotation="0" id="{skittle3}" x="62.3031" markerX="62.3031"/>
<skittle markerY="-89.2259" y="-89.2259" rotation="0" startRotation="0" id="{skittle4}" x="-0.323222" markerX="-0.323222"/>
<skittle markerY="89.0101" y="89.0101" rotation="0" startRotation="0" id="{skittle5}" x="-1.45453" markerX="-1.45453"/>
<skittle markerY="-1.44107" y="-1.44107" rotation="0" startRotation="0" id="{skittle6}" x="88.1212" markerX="88.1212"/>
<skittle markerY="-63.1785" y="-63.1785" rotation="0" startRotation="0" id="{skittle7}" x="62.3031" markerX="62.3031"/>
<skittle markerY="-64.7408" y="-64.7408" rotation="0" startRotation="0" id="{skittle8}" x="-63.8519" markerX="-63.8519"/>
</skittles>
<balls/>
<colorFields/>
<images>
<image imageId="{ed8c2ee9-a500-4993-b874-611ba6b78853}" id="{d91a151a-4519-4646-89fd-395c863b5e77}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{9275be02-a681-4b9f-981e-56bcb9f17cee}" id="{8f470550-4bb5-4b34-b46e-c349d686bd9a}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{229679a6-12a5-44d0-97d9-99f132ded1e2}" id="{5dcb114e-03d4-493b-9849-daf4cd364a2a}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{27036474-ec49-423d-9f20-141d0c7d1044}" id="{ebb8366d-61c7-422f-9460-865851d1e0f1}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{69f0b63a-2937-4b12-bad7-2e240210db2e}" id="{f7bd0d83-ae88-46c8-bd9e-95fd3c32c174}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{80069e12-f4e6-4d56-8487-d8d4dd9e5ce2}" id="{1345cda3-f2e1-49b9-ae6b-35b4aa2eb850}" isBackground="false" rect="0:0:-6:-6" position="0:0"/>
<image imageId="{7904d24c-5993-4013-80b5-bc899c0daabf}" id="{116c53b9-aa2c-4a16-bf8c-d291629c416f}" isBackground="false" rect="0:0:-4:-4" position="0:0"/>
<image imageId="{742a7dc4-05a6-47c2-87fc-d04f1b3f0be4}" id="{9ee0c06d-b9c0-4da8-8227-98ffdc24f0be}" isBackground="false" rect="-200:-201:399:401" position="0:0"/>
</images>
<regions>
<region type="ellipse" filled="true" textY="0" y="-150" visible="true" width="300" text="Ring" id="warzone" x="-150" height="300" textX="0" color="#ff0000"/>
</regions>
</world>
<robots>
<robot direction="0" id="trikKitRobot" position="-25:-24.4321">
<sensors>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E1###input###M1$$$Е1###encoder1" position="75:25"/>
<sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A5###input###А5###sensorA5" position="50:25"/>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E2###input###M2$$$Е2###encoder2" position="75:25"/>
<sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A3###input###А3###sensorA3" position="56:43"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M2###output###М2###" position="75:25"/>
<sensor type="trik::robotModel::parts::TrikInfraredSensor" direction="0" port="A1###input###А1###sensorA1" position="22:25"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M1###output###М1###" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M4###output###М4###" position="75:25"/>
<sensor type="trik::robotModel::parts::TrikLightSensor" direction="0" port="A2###input###А2###sensorA2" position="56:5"/>
<sensor type="kitBase::robotModel::robotParts::Motor" direction="0" port="M3###output###М3###" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E3###input###M3$$$Е3###encoder3" position="75:25"/>
<sensor type="kitBase::robotModel::robotParts::EncoderSensor" direction="0" port="E4###input###M4$$$Е4###encoder4" position="75:25"/>
</sensors>
<startPosition y="0.567901" direction="0" id="{2b1161e8-ba72-40ed-bf22-be49c2ab4cb9}" x="0"/>
<wheels left="M4###output###М4###" right="M3###output###М3###"/>
</robot>
</robots>
<settings realisticSensors="false" realisticPhysics="true" realisticMotors="false"/>
<constraints>
<timelimit value="60000"/>
<constraint failMessage="Робот должен находиться в круге перед запуском!" checkOnce="true">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
<event settedUpInitially="true">
<condition>
<timer forceDropOnTimeout="true" timeout="100"/>
</condition>
<trigger>
<setUp id="finish checker"/>
</trigger>
</event>
<event id="finish checker" settedUpInitially="false">
<conditions glue="and">
<not>
<inside objectId="{skittle1}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle2}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle3}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle4}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle5}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle6}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle7}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle8}" regionId="warzone"/>
</not>
</conditions>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root><region type="ellipse" filled="true" textY="0" y="-150" visible="true" width="300" text="Ring" id="warzone" x="-150" height="300" textX="0" color="#ff0000"/><timelimit value="60000"/><constraint failMessage="Робот должен находиться в круге перед запуском!" checkOnce="true">
<inside objectId="robot1" regionId="warzone"/>
</constraint><event id="finish checker" settedUpInitially="false">
<conditions glue="and">
<not>
<inside objectId="{skittle1}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle2}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle3}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle4}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle5}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle6}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle7}" regionId="warzone"/>
</not>
<not>
<inside objectId="{skittle8}" regionId="warzone"/>
</not>
</conditions>
<trigger>
<success/>
</trigger>
</event><?xml version='1.0' encoding='utf-8'?>
<root version="20190819">
<world>
<walls>
<wall fill="#ff000000" stroke-width="0" stroke="#ff000000" begin="-68:-204" id="{6f8bd6be-2983-4b0b-bbf8-5a26d1ed1ef7}" end="-68:77" stroke-style="none"/>
</walls>
<skittles/>
<balls/>
<colorFields/>
<images/>
<regions>
<region x="-270" textY="0" y="-110" text="Стартовое поле" id="start_zone" color="#0000ff" filled="true" width="80" visible="true" textX="0" type="rectangle" height="80"/>
<region x="-280" textY="0" y="-230" text="Поле, которое нельзя покидать" id="warzone" color="#ffff00" filled="true" width="210" visible="false" textX="0" type="rectangle" height="285"/>
</regions>
</world>
<robots>
<robot position="-256:-103" id="trikKitRobot" direction="0">
<sensors>
<sensor port="A5###input###А5###sensorA5" position="0:0" type="" direction="0"/>
<sensor port="M3###output###М3###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0"/>
<sensor port="M4###output###М4###" position="75:25" type="kitBase::robotModel::robotParts::Motor" direction="0"/>
<sensor port="A1###input###А1###sensorA1" position="75:25" type="trik::robotModel::parts::TrikTouchSensor" direction="0"/>
</sensors>
<startPosition x="-231" y="-78" id="{99807fe9-54b1-42d7-991b-2b9cf102abe7}" direction="0"/>
<wheels left="M4###output###М4###" right="M3###output###М3###"/>
</robot>
</robots>
<settings realisticPhysics="false" realisticMotors="false" realisticSensors="false"/>
<constraints>
<!-- Ограничение на временя в 30 секунд -->
<timelimit value="300000"/>
<!-- Проверка, что на порту А1 установлен датчик касания -->
<constraint checkOnce="true" failMessage="На порту А1 должен быть выставлен датчик касания">
<equals>
<typeof objectId="robot1.А1"/>
<string value="twoDModel::robotModel::parts::TouchSensor"/>
</equals>
</constraint>
<!-- Провека, что нет датчиков, кроме датчика касания на порту А1 -->
<constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика касания на порту А1">
<conditions glue="and">
<equals>
<typeOf objectId="robot1.A2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A3"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A4"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A5"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A6"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D1"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.F1"/>
<string value="undefined"/>
</equals>
</conditions>
</constraint>
<!-- Проверка, что в течении времени выполнения программы робот находится в допустимой зоне -->
<constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint>
<!-- Событие, которое говорит о том, что робот поехал и стартует цепочку проверки -->
<event id="First move" settedUpInitially="true">
<condition>
<greater>
<objectState object="robot1.M3.power"/>
<int value="0"/>
</greater>
</condition>
<triggers>
<setUp id="Touching wall"/>
<setter name="counter">
<int value="0"/>
</setter>
</triggers>
</event>
<!-- Событие, которое выдает ошибку, если робот не тронулся с места в первую секунду -->
<event id="Waiting for going forward too long" settedUpInitially="true">
<conditions glue="and">
<timer timeout="1000" forceDropOnTimeout="true"/>
<settedUp id="First move"/>
</conditions>
<trigger>
<fail message="Робот так и не поехал в первую секунду"/>
</trigger>
</event>
<!-- Событие, которое проверяет, что робот подъехал к стене (сработал датчик касания) и взводит второе -->
<event id="Touching wall">
<condition>
<equals>
<objectState object="robot1.A1.value"/>
<int value="1"/>
</equals>
</condition>
<trigger>
<setUp id="Returned back"/>
</trigger>
</event>
<!-- Событие, которое проверяет, что робот вернулся назад, инкрементирует счетчик итераций и снова взводит первое -->
<event id="Returned back">
<condition>
<inside objectId="robot1" regionId="start_zone"/>
</condition>
<triggers>
<setUp id="Touching wall"/>
<setUp id="Done?"/>
<setter name="counter">
<sum>
<variableValue name="counter"/>
<int value="1"/>
</sum>
</setter>
</triggers>
</event>
<!-- Событие, которое проверяет, что количество итераций дошло до 5 и, таким образом, задание выполнено -->
<event id="Done?">
<condition>
<notLess>
<variableValue name="counter"/>
<int value="5"/>
</notLess>
</condition>
<trigger>
<success/>
</trigger>
</event>
</constraints>
</root>
<timelimit value="40000"/><constraint checkOnce="true" failMessage="На порту А1 должен быть выставлен датчик касания">
<equals>
<typeof objectId="robot1.А1"/>
<string value="twoDModel::robotModel::parts::TouchSensor"/>
</equals>
</constraint><constraint checkOnce="true" failMessage="У робота не должно быть датчиков, кроме датчика касания">
<conditions glue="and">
<equals>
<typeOf objectId="robot1.A2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A3"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A4"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A5"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.A6"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D1"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.D2"/>
<string value="undefined"/>
</equals>
<equals>
<typeOf objectId="robot1.F1"/>
<string value="undefined"/>
</equals>
</conditions>
</constraint><constraint failMessage="Робот покинул допустимую зону!">
<inside objectId="robot1" regionId="warzone"/>
</constraint><event id="First move" settedUpInitially="true">
<condition>
<greater>
<objectState object="robot1.M3.power"/>
<int value="0"/>
</greater>
</condition>
<triggers>
<setUp id="Touching wall"/>
<setter name="counter">
<int value="0"/>
</setter>
</triggers>
</event><event id="Waiting for going forward too long" settedUpInitially="true">
<conditions glue="and">
<timer timeout="1000" forceDropOnTimeout="true"/>
<settedUp id="First move"/>
</conditions>
<trigger>
<fail message="Робот так и не поехал в первую секунду"/>
</trigger>
</event><event id="Touching wall">
<condition>
<equals>
<objectState object="robot1.A1.value"/>
<int value="1"/>
</equals>
</condition>
<trigger>
<setUp id="Returned back"/>
</trigger>
</event><!-- Событие, которое проверяет, что робот вернулся назад, инкрементирует счетчик итераций и снова взводит первое -->
<event id="Returned back">
<condition>
<inside objectId="robot1" regionId="start_zone"/>
</condition>
<triggers>
<setUp id="Touching wall"/>
<setUp id="Done?"/>
<setter name="counter">
<sum>
<variableValue name="counter"/>
<int value="1"/>
</sum>
</setter>
</triggers>
</event><event id="Done?">
<condition>
<notLess>
<variableValue name="counter"/>
<int value="5"/>
</notLess>
</condition>
<trigger>
<success/>
</trigger>
</event>





