Only this pageAll pages
Powered by GitBook
Couldn't generate the PDF for 132 pages, generation stopped at 100.
Extend with 50 more pages.
1 of 100

Русский

Loading...

TRIK Studio

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 Junior

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 — универсальное программное обеспечение для преподавания основ программирования. В ней предусмотрен переход .

Поддерживаемые платформы

TRIK Studio поддерживает 4 платформы:

  • .

  • .

  • .

  • .

Скачать

Последнюю версию TRIK Studio можно скачать на сайте .

Рекомендуемые системные требования

  • Оперативная память: 4 ГБ или больше.

  • Операционная система:

    • 64-разрядная Windows 10.

    • Ubuntu 16.04 и выше.

Справочный центр ТРИК

Справочный центр ТРИК — руководство по работе с бесплатной средой программирования роботов TRIK Studio. Открытый код TRIK Studio вы можете найти в нашем репозитории на GitHub.

О TRIK Studio

Также в справке описано взаимодействие TRIK Studio с поддерживаемыми платформами:

  • Контроллером ТРИК.

  • LEGO EV3.

  • .

  • .

Как узнать версию TRIK Studio

Версия TRIK Studio отображается в заголовке окна.

А также на стартовой странице.

Начало работы и создание проекта

Создание нового проекта и запуск существующего

Главное окно

После запуска TRIK Studio откроется стартовая страница, на которой будет отображена TRIK Studio, быстрый доступ к недавним проектам, а также кнопки для и .

Сбои из-за антивирусов

Некоторые антивирусы распознают TRIK Studio как угрозу, что мешает корректной работе TRIK Studio.

Ниже приведены инструкции для решения подобных проблем с антивирусами:

  • Антивирус Avast блокирует TRIK Studio. Что делать?

Редактирование свойств элементов в TRIK Studio Junior

Редактирование свойств элементов в TRIK Studio Junior аналогичен редактированию свойств элементов в TRIK Studio:

Редактирование свойств элементов

Упражнения в TRIK Studio Junior

Упражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).

Создание и загрузка упражнений в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:

Упражнения

Программирование ТРИК на визуальном языке

Для программирования контроллера ТРИК на визуальном языке в TRIK Studio есть специализированные блоки, а также сенсорные переменные.

Подробнее о визуальном программировании читайте в статье

Программирование на визуальном языке

macOS 10.12 Sierra и выше.

от диаграмм к текстовым языкам
Контроллер ТРИК
LEGO EV3
LEGO NXT 2.0
Квадрокоптер Геоскан Пионер
trikset.com
Как узнать версию TRIK Studio
Создание проекта

Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio.

Или в главном меню выберите Файл → Новый проект.

Откроется окно с новой программой на визуальном языке программирования:

О программировании на визуальном языке читайте в статье:

Про создание новой текстовой программы читайте в статье:

Запуск существующего проекта

Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio.

Или в главном меню выберите Файл → Открыть....

По умолчанию TRIK Studio ищет файлы в формате *.qrs или последнего открытого формата (например, *.js). Если требуется существующий проект в другом формате, выберите в выпадающем меню нужный формат (например, *.py) или Все файлы (*.*).

версия
открытия существующего проекта
создания нового
Стартовая страница TRIK Studio
Программирование на визуальном языке
Программирование на текстовом языке
LEGO NXT
Квадрокоптером Геоскан Пионер

Работа с графиками

Если программа запущена в режиме интерпретации на роботе или в двумерной модели, можно посмотреть показания сенсоров робота на графике в специальном окне.

График масштабируется автоматически таким образом, чтобы кривая показаний помещалась по высоте целиком.

Из выпадающего списка снизу можно выбрать сенсор, значения с которого будут отображаться на графике.

При наведении курсора мыши на точку на графике отобразится значение в этой точке.

Справа от графика есть четыре кнопки для работы с ним:

Как изменить язык интерфейса TRIK Studio?

Изменить язык можно в настройках TRIK Studio.

1. Выберите в главном меню Настройки → Настройки....

2. В открывшемся окне во вкладке «Поведение» выберите нужный язык. «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.

3. Нажмите «OK» и перезапустите TRIK Studio.

Сторонние утилиты

PuTTY, WinSCP, TRIK Gamepad

В TRIK Studio доступны три сторонние утилиты:

  1. PuTTY.

  2. WinSCP.

  3. TRIK Gamepad.

Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты.

VSCode

TRIK Studio можно интегрировать с внешней средой программирования VSCode.

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

  • статические анализаторы,

  • автоформаттеры,

  • цветовые темы.

О том, как интегрировать VSCode с TRIK Studio читайте в статьях:

Как узнать версию встроенного ПО контроллера ТРИК?

1. Включите контроллер.

2. Перейдите в Ещё... → Версия и обновление.

3. «Версия ОС» и есть версия встроенного программного обеспечения контроллера.

Главное меню TRIK Studio

Главное меню TRIK Studio содержит набор базовых операций и настроек среды:

Как открыть настройки робота?

Настройки робота в TRIK Studio можно открыть двумя способами.

Способ 1

С помощью кнопки на панели инструментов:

Сенсорные переменные

Кроме , в TRIK Studio доступны зарезервированные переменные, которые хранят значения показаний сенсоров, подключенных к соответствующим портам.

Эти значения можно присваивать переменным и использовать в математических выражениях.

Переменные имеют вид

Например, sensorA1 для ТРИК или sensor1 для Lego NXT.

Полный список сенсорных переменных приводится в разделах к конкретным платформам:

Настройки TRIK Studio Junior

Окно настроек

Окно настроек TRIK Studio Junior открывается выбором соответствующего пункта в :Настройки → Настройки....

Интерфейс окна с настройками в TRIK Studio Junior совпадает с интерфейсом настроек в TRIK Studio:

Программирование на визуальном языке в TRIK Studio Junior

Программа в TRIK Studio Junior представляется в виде последовательности , соединённых .

Каждой программе соответствует , которая может содержать . Диаграммы упаковываются в проекты, хранящиеся на диске.

Главная диаграмма

Главная диаграмма создаётся при

Добавление и удаление блоков в TRIK Studio Junior

Добавление и удаление блоков в TRIK Studio Junior происходит таким же образом, как и в TRIK Studio:

Связи между блоками в TRIK Studio Junior

Связи между блоками в TRIK Studio Junior обозначают направление передачи управления между блоками.

Пример

Пусть необходимо, чтобы вслед за задержкой программа сразу же завершилась. Для этого надо соединить блоки и стрелкой, имеющей направление от блока «Таймер» к блоку завершения программы.

Создание и удаление связей в TRIK Studio Junior происходит так же, как и в TRIK Studio:

Интерфейс TRIK Studio Junior

TRIK Studio Junior так же, как и , имеет два режима работы.

  1. Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.

  2. Предназначен для исполнения и отладки программы на 2D-модели.

Интерфейс TRIK Studio Junior зависит от выбранного режима и совпадает с интерфесом для TRIK Studio:

Как узнать версию TRIK Studio Junior

Версия TRIK Studio Junior отображается в заголовке окна.

А также на стартовой странице.

Класс «battery»

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

readVoltage

Возвращает текущий вольтаж батареи (или блока питания) в вольтах.

Подпрограммы в TRIK Studio Junior

Любую программу в TRIK Studio Junior можно сохранить как подпрограмму и использовать в другой программе.

Работа с подпрограммами в TRIK Studio Junior аналогична работе с подпрограммами в TRIK Studio:

Sublime Text

TRIK Studio можно интегрировать с внешней средой программирования .

Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

  • статические анализаторы,

  • автоформаттеры,

Синтаксис выражений в блоках в TRIK Studio Junior

Синтаксис выражений в блоках в TRIK Studio Junior аналогичен синтаксису выражиний в блоках TRIK Studio:

Синтаксис
brick.battery().readVoltage()
brick.battery().readVoltage();

Запуск 2D-модели в TRIK Studio из VSCode
Загрузка программ на нескольких роботов ТРИК из VSCode
Добавление и удаление блоков
TRIK Studio
Режим редактирования
Режим отладки
Интерфейс TRIK Studio
Подпрограммы
Синтаксис выражений в блоках

Константы

В TRIK Studio сейчас только одна встроенная константа. С ней можно работать так же, как и с сенсорными переменными, но ее значение не меняется.

pi

3.14159265358979

Представляет отношение длины окружности к ее диаметру, определяемое константой π.

цветовые темы.

О том, как интегрировать Sublime с TRIK Studio читайте в статьях:

Sublime Text
Запуск 2D-модели в TRIK Studio из Sublime Text
Загрузка программ на нескольких роботов ТРИК из Sublime Text
.
  • LEGO EV3.

  • LEGO NXT.

  • sensor<имя порта сенсора>
    констант
    ТРИК

    Инструменты

  • Настройки

  • Справка

  • Файл

    • Новый проект — создать новый проект.

    • Недавние проекты — открыть один из недавно использовавшихся проектов.

    • Новая диаграмма — создать новую диаграмму в текущем проекте.

    • Открыть… — открыть сохраненный проект. Проекты хранятся на диске в файлах с расширением .qrs.

    • Сохранить — сохранить текущий проект.

    • Сохранить как… — сохранить текущий проект в выбранное местоположение. Последующие сохранения будут производиться в выбранный файл.

    • Сохранить диаграмму как картинку… — сохранить на диск текущее изображение на сцене.

    • Печать — распечатать диаграмму или текст, используя стандартный диалог печати.

    • Выход — выйти из программы.

    • Восстановить настройки по-умолчанию и выйти — восстановить настройки по-умолчанию и выйти из программы.

    Правка

    • Отменить — отменить выполненное действие.

    • Повторить — сделать снова отмененное действие.

    • Копировать — копировать выбранный элемент.

    • Вставить — вставить выбранный элемент.

    • Вырезать — вырезать выбранный элемент.

    • Найти... — открыть диалог поиска по проекту.

    • Найти и заменить — открыть диалог поиска по проекту и заменить.

    Вид

    • Приблизить — увеличить масштаб сцены.

    • Отдалить — уменьшить масштаб сцены.

    • Панели — включить / выключить отображение различных окон.

    • На главную — вернуться на главную.

    Инструменты

    Внимание! Пункты в этом меню могут появляться и исчезать в зависимости от конфигурации программы.

    • Жесты мышью — открыть вкладку со списком доступных жестов мышью (см. раздел «Добавление блоков жестами мыши»).

    • Выполнить — запустить выполнение отображаемой в данный момент диаграммы на роботе в режиме интерпретации (пункт отображается только в режиме интерпретации).

    • 2D-модель — переключить режим работы интерпретатора на двумерную модель.

    • Реальный робот — переключить режим работы интерпретатора на управление реальным роботом по Wi-Fi, Bluetooth или USB в зависимости от используемой и настроек соединения с роботом.

    • Настройки — открыть окно настройки модели робота, с которой осуществляется работа в TRIK Studio (подробнее см. раздел «» в статье «»).

    • Сохранить как упражнение… — сохранить текущую диаграмму и двумерную модель как упражнение для учащихся. В упражнении нельзя модифицировать некоторые части решения. Например, расположение объектов в двумерной модели или конфигурацию датчиков. Выбор этого пункта меню открывает диалог, в котором можно выбрать фиксируемые части (подробнее про упражнения см. в статье «»)

    • Подпрограммы — управление подпрограммами (подробнее см. в статье «»).

    • Генерировать код — открыть вкладку со сгенерированным кодом, соответствующим текущей диаграмме и выбранному текстовому языку (этот пункт может выглядеть как «Генерировать код на JavaScript», «Генерировать код на Python», «Генерировать код на C» и т.д.). Код не загружается на робот и не исполняется, но может быть отредактирован и загружен позже.

    • Загрузить программу — только сгенерировать код и загрузить на робот, не исполняя его.

    • Загрузить и выполнить программу — сгенерировать код, соответствующий текущей диаграмме, загрузить его и исполнить на роботе.

    • Остановить робота — прервать выполнение программы и послать роботу команды отключения моторов.

    • Подключиться — установить соединение с роботом. Робот должен быть включен. Показывается только в том случае, если выбранный режим работы с роботом предполагает необходимость постоянного подключения (например, интерпретация программы по Bluetooth или Wi-Fi).

    Настройки

    • Настройки… — открыть окно настроек среды TRIK Studio (см. статью «Настройки TRIK Studio»).

    • Показать сетку — включить/отключить отображение сетки на сцене.

    • Показать направляющие — включить/отключить режим отображения вертикальных и горизонтальных направляющих линий для позиционирования объектов относительно друг друга.

    • Включить сетку — включить/отключить режим автоматического выравнивания по сетке.

    • Включить направляющие — включить/отключить режим вертикальных и горизонтальных направляющих линий для позиционирования блоков относительно друг друга.

    • Показать весь текст — включить/отключить отображение всех свойств блока прямо на диаграмме. Если текст под блоками отключён, свойства можно просматривать и редактировать в редакторе свойств слева вверху.

    Справка

    • Помощь — открыть справку.

    • О программе — просмотреть краткую информацию о TRIK Studio.

    • Открыть лог-файлы — открыть папку с лог-файлами.

    • Проверить на наличие обновлений — получить из интернета информацию о наличии новой версии среды или какого-либо из подключаемых модулей и запустить при необходимости автообновление.

    Файл
    Правка
    Вид
    Способ 2

    1. Выберите в главном меню Настройки → Настройки....

    2. В открывшемся окне выберите вкладку «Роботы».

    . Про добавление и удаление блоков на
    читайте в статье:

    Подпрограммы

    Диаграммы с подпрограммами создаются автоматически при добавлении блока «Подпрограмма» на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.

    Подробнее о подпрограммах читайте в статье:

    блоков
    связями
    главная диаграмма
    другие диаграммы (подпрограммы)
    создании проекта
    сцену
    Добавление и удаление блоков в TRIK Studio Junior
    Подпрограммы в TRIK Studio Junior

    Кнопка

    Описание

    Изменение масштаба графика.

    Очистить график.

    Экспорт показаний графика в формате .csv (comma-separated value). Экспортируются все показания выбранного датчика с начала их записи.

    главном меню
    Настройки TRIK Studio
    «Таймер»
    «Конец»
    Связи между блоками

    Интерфейс TRIK Studio

    Режимы TRIK Studio

    Интерфейс TRIK Studio зависит от выбранного режима. TRIK Studio имеет два режима:

    1. Режим редактирования Предназначен для создания диаграммы управления роботом и исполнения её на роботе в режиме генерации.

    2. Предназначен для исполнения и отладки программы на 2D-модели или в режиме интерпретации на реальном роботе.

    Переключение между режимами

    Переключение режимов возможно тремя способами. С помощью:

    1. Сочетаний клавиш Ctrl+1 / Ctrl+2.

    2. .

    3. .

    Режим редактирования

    TRIK Studio в режиме редактирования имеет следующие элементы интерфейса:

    Окно редактора / сцена

    Сцена отображает диаграмму и позволяет ее редактировать.

    О создании нового проекта и работе с диаграммами читайте в статьях:

    Здесь же осуществляется отображение текущего исполняемого блока при интерпретации диаграмм.

    Главное меню

    Главное меню TRIK Studio содержит набор базовых операций и настроек среды:

    Подробнее смотрите в статье:

    Панель «Файл»

    Панель «Файл» повторяет основные операции, доступные из меню «».

    Создать новый проект. Открыть сохраненный проект. Сохранить текущий проект.

    Панель «Правка»

    Отмена операции. Повтор операции.

    Панель «Вид»

    Панель «Вид» содержит кнопки, позволяющие масштабировать диаграммы.

    Приблизить / отдалить.

    Также масштабировать сцену можно с помощью:

    1. Зажатия клавиши Ctrl и вращения колесика мыши.

    2. Сочетания клавиш Ctrl+= и Ctrl+-.

    Панель «Интерпретатор»

    Панель «Интерпретатор» содержит команды запуска и остановки выполнения программы, кнопки переключения режимов интерпретации между двумерной моделью и реальным роботом, а также кнопку открытия , доступных из меню «Инструменты».

    При работе с реальным роботом в режиме интерпретации эта панель также содержит кнопку «Подключиться».

    Запуск выполнения программы. Остановка выполнения программы. Двумерная модель. Реальный робот. Настройки робота.

    Панель «Генераторы»

    Команды на этой панели изменяются в зависимости от конфигурации программы.

    Панель «Генераторы» содержит команды генерации кода и загрузки программы на контроллер.

    Генерировать код. Загрузить программу.

    Панель «Прочее»

    Панель «Прочее» может содержать различную информацию в зависимости от выбранной платформы.

    Например, для на данной панели отображается IP-адрес контроллера, к которому вы подключаетесь.

    Панель переключения режимов редактирования и отладки

    Панель переключения режимов отображает текущий режим TRIK Studio и позволяет переключаться между режимами редактирования и отладки.

    Редактор. Отладка.

    Панель «Редактор свойств»

    Редактор свойств используется для отображения и редактирования значений свойств выделенных объектов (блоков, связей).

    О работе с редактором смотрите статью:

    Панель «Настройки сенсоров»

    Настройки сенсоров позволяют указать, какие сенсоры использованы на каком порту. То же можно сделать из диалога настроек робота.

    Набор сенсоров зависит от выбранной платформы в настройках на вкладке «».

    Панель «Палитра»

    Палитра элементов содержит набор доступных блоков и связей между ними, которые можно добавить на диаграмму.

    1. Состав палитры может меняться в зависимости от выбранной в платформы.

    2. Серым выделены блоки, недоступные в выбранной модели выполнения (2D-модели или на реальном роботе).

    О добавлении и удалении блоков на сцену в TRIK Studio читайте в статье:

    Панель «Переменные»

    Список переменных, используемых при выполнении диаграммы с их текущими значениями, включая . При исполнении в режиме интерпретации на двумерной модели или реальном роботе берутся с робота в реальном времени. В режиме генерации не используются.

    Строка статуса

    Строка статуса отображает текущий режим TRIK Studio ( или ) и позволяет переключаться между режимами. Для переключения достаточно кликнуть на строку статуса.

    Режим отладки

    Элементы интерфейса TRIK Studio в режиме отладки повторяют элементы в , кроме окна редактора, панелей редактора свойств и палитры. Вместо этих элементов отображаются:

    Окно «Двумерная модель»

    Окно «Двумерная модель» открывается, если в качестве режима исполнения программы выбрана 2D-модель.

    Окно позволяет задать окружение, в котором будет работать робот, задать датчики робота и наблюдать, как будет работать написанная в режиме редактирования программа.

    Подробнее о 2D-модели читайте в статье:

    В режиме интерпретации и генерации программы на реальном роботе это окно не показывается, вместо него отображается исполняемая диаграмма.

    Панель «Настройки робота»

    На панели настроек робота отображается вид контроллера и параметры робота, которые зависят от выбранной .

    Открытие панели «Настройки робота»

    Окно «Ошибки»

    В случае синтаксических и семантических ошибок в TRIK Studio появляется окно с соответствующими сообщениями.

    Для просмотра блока, в котором допущена ошибка, необходимо кликнуть на сообщение.

    Панель «Графики»

    Окно «Графики» отображает в реальном времени значения, присылаемые датчиками.

    Подробнее читайте в статье:

    Программирование на визуальном языке

    Программа в TRIK Studio представляется в виде последовательности блоков, соединённых связями.

    Каждой программе соответствует главная диаграмма, которая может содержать другие диаграммы (подпрограммы). Диаграммы упаковываются в проекты, хранящиеся на диске.

    Главная диаграмма

    Главная диаграмма создаётся при . Про добавление и удаление блоков на читайте в статье:

    Подпрограммы

    Диаграммы с подпрограммами создаются автоматически при добавлении блока на сцену. При этом отображение подпрограммы происходит при двойном клике на блок «Подпрограмма» на сцене.

    Подробнее о подпрограммах читайте в статье:

    Редактирование свойств элементов

    В TRIK Studio есть два способа редактирования значений свойств, которые имеются у блоков и связей на диаграммах:

    1. С помощью панели «Редактор свойств».

    2. Прямо на диаграмме.

    Внимание! Редактирование свойств блока осуществляется только с помощью контекстного меню.

    Редактирование свойств с помощью панели

    При выделении блока, связи, или элемента, на панели отображаются все свойства текущего элемента.

    Редактор свойств представляет собой таблицу. В левой колонке отображается название свойства элемента, в правой — его значение.

    Изменить значение любого свойства можно, кликнув на соответствующей ячейке правой колонки и введя нужное значение.

    Для свойств, которые допускают только определенный набор значений, например, свойство «Порт» у блока , при попытке их редактирования, появится выпадающее меню, где выбирается нужное значение:

    Редактирование свойств на диаграмме

    Для редактирования свойств прямо на диаграмме:

    1. Наведите курсор мыши на значение нужного свойства.

    2. Двойным нажатием левой кнопки мыши активируйте редактирование свойства.

    3. Введите нужное значение.

    4. Кликните в произвольное место сцены.

    Внимание! Данный подход может служить источником ошибок, поскольку позволяет ввести произвольное текстовое значение свойства, в том числе и некорректное. Будьте внимательны.

    PuTTY

    PuTTY — клиентская программа для работы с сетевыми протоколами. К контроллеру ТРИК можно подключиться, используя протоколы SSH и Serial.

    Запуск PuTTY из TRIK Studio

    Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты → PuTTY.

    Подключение к контроллеру ТРИК в PuTTY

    1. Подключите контроллер к компьютеру по .

    2. Пропишите в настройках студии на вкладке «» IP-адрес контроллера, который отображается на главном экране контроллера.

    3. Запустите PuTTY из TRIK Studio, выбрав в главном меню Инструменты → Сторонние утилиты → PuTTY.

    4. В открывшемся окне введите логин root. Поле Пароль оставьте пустым.

    Подключения по Wi-Fi к контроллеру ТРИК

    На контроллере ТРИК стоит Wi-Fi-модуль, который может работать в двух режимах:

    1. В режиме точки доступа, то есть когда контроллер сам создает новую сеть, и мы к нему подключаем устройства.

    2. В режиме Wi-Fi-клиента, то есть когда мы подключаем контроллер к уже существующей сети.

    Для выбора режима в меню контроллера выберите пункт Сеть.

    О подключении контроллера к устройствам в разных режимах и взаимодействии нескольких контроллеров читайте в статьях:

    Подключение контроллера ТРИК к TRIK Studio

    1. Подключите контроллер к компьютеру, на котором установлена TRIK Studio, любым из двух способов.

    2. В настройках TRIK Studio перейдите в раздел «Роботы» и выберите платформу ТРИК в окне «Платформы».

    Выбор платформы

    3. Укажите IP-адрес контроллера в строке «Настройки TCP».

    Настройки TCP

    Также IP-адрес контроллера можно указать на панели инструментов:

    4. Нажмите «OK».

    Как проверить соединение?

    Попробуйте программу на контроллер.

    Что делать, если соединения нет?

    Если соединения с контроллером нет, TRIK Studio выдаст ошибку:

    В этом случае проверьте:

    1. Совпадает ли IP-адрес в TRIK Studio с IP-адресом на контроллере.

    2. Отображает ли контроллер ТРИК свой IP-адрес. IP-адреса может не быть, если контроллер в режиме Wi-Fi-клиента подключен к Wi-Fi-сети, но роутер не выдал его. Рекомендуем немного подождать или переключиться в режим «Точка доступа» и обратно в режиме Wi-Fi-клиента. Также это может произойти в режиме «Точка доступа». Рекомендуем выключить контроллер на некоторое время, а затем снова запустить.

    Функция include

    Описание функции

    Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек.

    В качестве передаваемого параметра нужно указать полный системный путь до файла с необходимыми функциями либо имя файла. Во втором случае файл для подключения должен лежать в той же директории, что и основной файл, в котором вызывается include.

    Вызов функции

    PyCharm

    TRIK Studio можно интегрировать с внешней средой программирования PyCharm.

    Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов:

    • статические анализаторы,

    • автоформаттеры,

    • цветовые темы.

    О том, как интегрировать PyCharm с TRIK Studio читайте в статьях:

    Типы языка TRIK Studio

    В отличие от язык TRIK Studio статически типизирован, то есть тип каждого выражения и каждой переменной должен быть известен во время компиляции. При этом язык не требует (и даже не позволяет!) явно писать типы переменных. Используется автоматический вывод типов по использованию переменных.

    Например, по выражению a = 1 среда «поймёт», что тип a — целое.

    Массив

    Массив — один из , хранящий набор значений (элементов массива), идентифицируемых по индексу. Нумерация индексов в массиве начинается с 0.

    Массивы можно создавать явно, используя следующие выражения (варианты записи равносильны):

    Или с явным указанием индексов:

    Можно использовать массивы, не создавая их. Например, так:

    При этом «пустые места» в массиве (индексы, которым не было явного присваивания) будут заполнены значениями по умолчанию:

    • 0 — для целых и вещественных;

    Лексемы языка TRIK Studio

    Язык использует пробелы, табуляции и переводы строк вне строковых литералов только как разделители между лексемами — влияния на интерпретацию выражений они не оказывают.

    В языке есть следующие ключевые слова:

    • and

    • false

    Программирование на текстовом языке

    Создание новой текстовой программы, генерация диаграммы в код и поддерживаемые языки программирования

    Текстовый режим программирования позволяет редактировать по диаграмме программу перед загрузкой на робота или в текстовом виде с нуля.

    Создание новой текстовой программы

    1. , содержащую блоки «Начало» и «Конец».

    2. Выберите режим реального робота.

    3. Нажмите на кнопку «Генерировать код». После этого появится пустой шаблон программы, которая содержит все необходимые объявления, но ничего не делает.

    О TRIK Studio Junior

    TRIK Studio Junior — бесплатная среда программирования с для начальной и средней школы.

    Среда имеет общий интерфейс со средой программирования роботов , что позволяет вести непрерывный процесс обучения, начиная с начальной школы.

    Особенности TRIK Studio Junior

    1. Поддержаны основные алгоритмические структуры (следование, ветвление, циклы, подпрограммы, массивы), математические и логические операции, а также команды для перемещения «Исполнителя».

    Как заменить изображение «Исполнителя» в TRIK Studio Junior?

    Изменить изображение «Исполнителя» можно двумя способами:

    1. . Здесь можно добавить несколько изображений, которые будут менятся в зависимости от направления движения «Исполнителя».

    2. .

    Антивирус Avast блокирует TRIK Studio. Что делать?

    Avast выдаёт сообщение о блокировке файла

    Если при установке или запуске TRIK Studio антивирус Avast выдает сообщение о блокировке файла, то указанный файл следует добавить в исключения в настройках антивируса.

    Для этого:

    1. В появившемся окне нажмите на кнопку «Другие параметры» и выберите «Создать исключение».

    О контроллере ТРИК

    Контроллер ТРИК — образовательная робототехническая платформа, разработанная командой опытных инженеров специально для робототехники.

    поддерживает данную платформу для .

    Контроллер ТРИК снабжён цветным сенсорным дисплеем, и Wi-Fi-модулем, который может работать в .

    Контроллер ТРИК совместим с широким спектром периферийных , имеет в своем составе все необходимое оборудование для управления двигателями постоянного тока и сервоприводами, а также для приема и обработки информации от цифровых и аналоговых датчиков, микрофонов, видеомодулей. На борту у контроллера имеются встроенные гироскоп и акселерометр.

    Контроллер ТРИК поддерживает различные способы , .

    Подключение контроллера ТРИК к компьютеру и смартфону

    В режимах точки доступа и клиента

    Контроллер ТРИК может быть подключен к другим устройствам двумя способами:

    1. Используем контроллер ТРИК как **(**то есть контроллер сам создает новую сеть) и подключаем к нему устройства.

    2. Используем контроллер ТРИК в режиме и подключаем устройства и сам контроллер к существующей сети.

    Класс «sensor»

    —Представляет сенсор (аналоговый или цифровой), подключающийся к портам A1, …, A6, D1, D2.

    Класс «led»

    Предоставляет управление светодиодом на корпусе робота.

    read

    Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту. Возвращается приведённое значение, зависящее от конфигурации порта, которая описывается в файле 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();

    readRawData

    Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту. Диапазон значений зависит от конкретного сенсора и не учитывает конфигурацию робота (возвращаются физические показания сенсора, например, задержка принятого ультразвукового сигнала).

    Синтаксис

    data1 = brick.sensor(sensorName).readRawData()
    data2 = brick.sensor("sensorName").readRawData()
    var data1 = brick.sensor(sensorName).readRawData();
    var data2 = brick.sensor("sensorName").readRawData();

    Метод

    Описание

    read

    Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту.

    readRawData

    Возвращает текущее «сырое» показание сенсора (цифрового или аналогового), подключённого к данному порту.

    Запуск 2D-модели в TRIK Studio из PyCharm
    other_file.js
    // Функции должны быть объявлены как глобальные переменные
    sum = function(a, b) {
        return a + b
    }
    include("other_file.js");
    print(sum(1, 2));
    red

    Включает светодиод в режим «красный».

    Синтаксис

    brick.led().red()
    brick.led().red();	

    green

    Включает светодиод в режим «зеленый».

    Синтаксис

    brick.led().green()
    brick.led().green();	

    orange

    Включает светодиод в режим «оранжевый».

    Синтаксис

    off

    Выключает светодиод.

    Синтаксис

    Метод

    Описание

    red

    Включает светодиод в режим «красный».

    green

    Включает светодиод в режим «зеленый».

    orange

    Включает светодиод в режим «оранжевый».

    off

    Выключает светодиод.

    false — для булевых;

  • пустыми строками для строковых массивов.

  • Значения массива также могут использоваться без фигурных скобок, если используются в качестве возвращаемого значения. Например, данное выражение вернёт массив из чисел 1 и 2:

    Сделано это для того, чтобы интерпретировать перечисления значений (например, порты моторов в блоке «Моторы вперёд») как массивы. Поэтому везде, где используется запись значений через запятую, можно использовать массив.

    a = {1; 2; 3; 4};
    a = {1, 2, 3, 4};
    a = {[0] = 1, [10] = 2, [20] = 3};
    типов языка TRIK Studio

    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 
    34e1​
    a = 1; -- комментарий

    Панель «Вид»

  • Панель «Интерпретатор»

  • Панель «Генераторы»

  • Панель «Прочее»

  • Панель переключения режимов

  • Редактор свойств элементов

  • Настройки сенсоров

  • Палитра (набор блоков для создания диаграмм)

  • Список переменных

  • Строка статуса

  • Настройки

  • Справка

  • Режим отладки
    Панели переключения режимов
    Строки статуса
    Окно редактора / сцена
    Главное меню
    Панель «Файл»
    Панель «Правка»
    Начало работы и создание проекта
    Добавление и удаление блоков
    Файл
    Правка
    Вид
    Инструменты
    Главное меню TRIK Studio
    Файл
    настроек робота
    конструктора ТРИК
    Редактирование свойств элементов
    Роботы
    настройках
    Добавление и удаление блоков
    сенсорные переменные
    редактирования
    отладки
    режиме редактирования
    Окно «Двумерная модель»
    Окно «Ошибки»
    Панель «Настройки робота»
    Панель «Графики»
    2D-модель
    платформы
    Работа с графиками
    Интерфейс TRIK Studio в режиме редактирования
    Сцена
    Главное меню
    Инструменты панели «Интерпретатор»
    Панель «Редактор свойств»
    Настройки сенсоров для контроллера ТРИК
    Панель «Палитра»
    Панель «Переменные»
    Строка статуса
    Режим отладки
    Окно 2D-модели
    Панель «Настройки робота»

    Целое число

    Использует 32-битное знаковое представление (позволяет хранить значения от -2 147 483 648 до 2 147 483 647).

    Строка

    Позволяет хранить символьные строки произвольной длины в кодировке UTF-8.

    Нулевой тип

    Имеет только одно значение nil и означает отсутствие «настоящего» значения.

    Позволяет хранить произвольное количество значений произвольного (но для каждого значения в одном массиве одинакового) типа, в том числе и другие массивы, и обращаться к значениям по индексу.

    О синтаксисе выражений в блоках читайте в статье

    Тип

    Описание

    Булевый (логический) тип

    Принимает значения true (истина) и false (ложь).

    Вещественное число

    Lua

    Использует 64-битное представление binary64 стандарта IEEE 754 (позволяет хранить значения до 1.7E+308).

    Синтаксис выражений в блоках

    Генерация диаграммы в код

    1. Выберите режим реального робота.

    2. Нажмите на кнопку «Генерировать код».

    При повторной генерации диаграммы ручные изменения не потеряются, если текстовый файл сохранен. Результат новой генерации сохранится в другой файл.

    Поддерживаемые языки программирования

    Поддерживаемый текстовый язык программирования зависит от платформы. Одна платформа может иметь несколько целевых текстовых языков.

    Внимание! Доступные генераторы зависят от установленных подключаемых модулей.

    Контроллер ТРИК

    Для платформы ТРИК возможна генерация в:

    • Python.

    • JavaScript.

    Контроллер Lego EV3

    Эксперты в EV3 могут посмотреть на сгенерированный на внутреннем языке EV3 код с помощью кнопки «Сгенерировать в байт-код EV3». Теоретически его можно подредактировать и запустить на исполнение или вообще использовать для текстового программирования EV3, но делать это неудобно — язык создавался для автоматической генерации, а не написания программ.

    Контроллер Lego NXT

    Для Lego NXT поддерживается генерация в язык С с использованием библиотеки ECRobot.

    Квадрокоптер Геоскан Пионер

    Для квадрокоптера Геоскан Пионер возможна генерация в Lua.

    сгенерированную
    написать программу
    Создайте диаграмму

    2. Вы можете загрузить как своего «Исполнителя» и мир, так и выбрать из заготовленных.

    3. Вы можете создавать упражнения для самостоятельного выполнения с автоматической проверкой.

    4. Так же, как и в TRIK Studio, в TRIK Studio Junior есть интерактивный режим имитационного моделирования. Чтобы научиться программировать, необязательно иметь конструктор.

    Так как интерфейс и работа в TRIK Studio Junior во многих моментах совпадает с интерфейсом и работой в TRIK Studio, в некоторых статьях данного раздела будут даны ссылки на аналогичные статьи раздела справки про TRIK Studio.

    Что такое «Исполнитель»

    «Исполнитель» — объект, который понимает и исполняет команды алгоритма. В TRIK Studio Junior можно менять изображение исполнителя.

    Скачать TRIK Studio Junior

    Последнюю версию TRIK Studio Junior можно скачать на сайте trikset.com.

    Рекомендуемые системные требования для TRIK Studio Junior

    • Оперативная память: 4 ГБ или больше.

    • Операционная система:

      • 64-разрядная Windows 10.

      • Ubuntu 16.04 и выше.

      • macOS 10.12 Sierra и выше.

    «Исполнителем»
    TRIK Studio
    Блоки в TRIK Studio Junior
    Как заменить изображение «Исполнителя» в TRIK Studio Junior?
    Упражнения в TRIK Studio Junior
    Как заменить изображение «Исполнителя» в TRIK Studio Junior?
    Как узнать версию TRIK Studio Junior
    Если выбрано изображение в контекстном меню «Исполнителя», то изображение, выбранное в настройках TRIK Studio Junior игнорируется.

    Замена изображения «Исполнителя» в контекстном меню

    1. Кликните левой кнопкой мыши на «Исполнителя».

    2. Поставьте «галочку» во второй строке. Появится иконка для выбора изображения «Исполнителя».

    Если вы захотите вернуться к варианту изображения «Исполнителя» по умолчанию (изображение, выбранное в настройках), уберите «галочку».

    3. Нажмите на появившуюся иконку и выберите одно или несколько изображений «Исполнителей».

    Выбор нескольких изображений «Исполнителей» необходим, если у вас есть изображения в разных проекциях. Имя таких файлов должны оканчиваться на:

    • _up — для изображения, когда «Исполнитель» движется наверх

    • _down— для изображения, когда «Исполнитель» движется вниз

    • _right — для изображения, когда «Исполнитель» движется направо

    • _left — для изображения, когда «Исполнитель» движется налево

    Замена изображения «Исполнителя» в настройках TRIK Studio Junior

    1. Выберите в главном меню Настройки → Настройки....

    2. В открывшемся окне выберите вкладку «Роботы», нажмите рядом с полем «Картинка робота в 2D» кнопку «Обзор» и выберите нужное изображение.

    3. Нажмите «OK».

    Скачать изображения «Исполнителя»

    На сайте trikset.com вы можете скачать заготовленные изображения «Исполнителей».

    В контекстом меню исполнителя
    В настройках TRIK Studio Junior
    2. Нажмите на кнопку «Понятно».

    3. После данных действий TRIK Studio запустится.

    Avast не выдает сообщение об угрозе

    Возможна ситуация, при которой Avast может удалить исполняемый файл TRIK Studio или просто не выдавать сообщение об угрозе при запуске TRIK Studio.

    В данном случае:

    1. Откройте главное окно Avast.

    2. В «Меню» выберите пункт «Моя статистика».

    3. Затем «Угрозы в хранилище вирусов (Открыть хранилище вирусов)».

    4. Наведите курсор мыши на запись о заблокированном файле, после чего справа появится кнопка выпадающего меню «...». Нажмите на нее и выберите «Другие параметры».

    5. Затем выберите «Восстановить и добавить в исключения».

    6. После этих действий TRIK Studio должна запускаться и работать в штатном режиме.

    Подробную информацию о контроллере ТРИК смотрите на сайте производителя.

    Программирование контроллера ТРИК

    Для программирования контроллера ТРИК выберите «ТРИК» в настройках TRIK Studio во вкладке «Роботы».

    Используйте специализированные и общие блоки для написания программ на визуальном языке. Подробнее о визуальном программировании читайте в статье

    О текстовом программировании читайте в статье

    TRIK Studio
    программирования
    программируемыми кнопками
    двух режимах
    устройств
    подключения по Wi-Fi
    подключение и работу с внешними устройствами
    Программирование на визуальном языке
    Программирование на текстовом языке
    Способ 1. Контроллер в режиме точки доступа Wi-Fi

    В этом режиме контроллер сам создает новую сеть, и мы к нему подключаем устройства.

    1. Выберите в меню Сеть → Wi-Fi точка доступа. Контроллер раздаст Wi-Fi, а на экране появятся параметры сети:

    • Имя сети.

    • Пароль сети.

    • IP-адрес контроллера.

    2. При подключении к сети Wi-Fi компьютера или смартфона выберите сеть контроллера и введите пароль.

    Способ 2. Контроллер в режиме Wi-Fi-клиента

    В этом режиме контроллер и устройства мы подключаем к уже существующей Wi-Fi-сети.

    Для этого нам в веб-интерфейсе контроллера надо прописать имя и пароль сети, к которой будем подключать контроллер.

    1. Для запуска веб-интерфейса подключите компьютер или смартфон к контроллеру как к точке доступа.

    2. В адресной строке браузера введите IP-адрес контроллера. Откроется веб-интерфейс.

    3. В поле «Wi-Fi-клиент» введите имя и пароль сети, к которой хотите подключить контроллер. Нажмите кнопку «Сохранить».

    4. Переключите контроллер в режим Wi-Fi-клиента.

    5. При успешном подключении вверху экрана рядом с иконкой отобразится ip-адрес контроллера, а в списке иконкой будет выделено имя сети.

    точку доступа
    Wi-Fi-клиента
    платформы
    Роботы
    Настройки TRIK Studio
    Упражнения
    Подпрограммы
    создании проекта
    сцену
    Добавление и удаление блоков
    «Подпрограмма»
    Подпрограммы
    «Подпрограмма»
    «Редактор свойств»
    «Ждать ИК датчик расстояния»
    Редактор свойств блока «Моторы вперёд» для ТРИК
    Свойство «Порт» блока «Ждать ИК датчик расстояния»
    Wi-Fi
    Роботы
    Пример ввода IP-адреса контроллера
    Подключение контроллера ТРИК к компьютеру и смартфону
    Подключение контроллера ТРИК к TRIK Studio
    Взаимодействие контроллеров ТРИК
    Меню контроллера ТРИК
    загрузить

    Встроенные функции

    В математических выражениях можно использовать функции, доступные для любой платформы.

    Функция

    Описание

    time()

    Возвращает время в миллисекундах с начала работы программы.

    sin(angle)

    Синус угла, где «angle» — угол в радианах.

    cos(angle)

    Косинус угла, где «angle» — угол в радианах.

    ln(a)

    Подпрограммы

    Любую программу в TRIK Studio можно сохранить как подпрограмму и использовать в другой программе.

    Подпрограммы можно сохранять в локальную коллекцию или экспортировать в отдельный файл для переноса на другие компьютеры.

    Для работы с коллекцией подпрограмм используйте пункт меню Инструменты → Подпрограммы:

    1. Экспортировать в файл.

    2. .

    3. .

    4. .

    5. .

    Экспорт подпрограмм в файл

    Используйте экспорт подпрограмм в файл для их переноса на другие компьютеры. Если же вы планируете использовать подпрограммы на своем компьютере, то используйте .

    Для экспорта подпрограмм из открытого проекта в отдельный qrs-файл выберите в главном меню Инструменты → Подпрограммы → Экспортировать в файл.

    В данный файл будут экспортированы все подпрограммы из текущего проекта.

    Импорт подпрограмм из файла

    Для загрузки сохраненных ранее подпрограмм выберите в главном меню Инструменты → Подпрограммы → Импортировать из файла.

    Внимание! Если в импортируемом файле присутствуют подпрограммы с такими же именами, как в текущем проекте, то подпрограммы из проекта будут заменены импортируемыми.

    Сохранение подпрограмм в коллекцию

    Для переноса подпрограмм на другие компьютеры используйте функцию .

    Для сохранения подпрограмм из открытого проекта выберите в главном меню Инструменты → Подпрограммы → Сохранить в коллекцию.

    Затем выберите подпрограммы, которые хотите сохранить, и нажмите OK.

    Внимание! Если в коллекции подпрограмм есть подпрограммы с такими же именами, они будут перезаписаны.

    Загрузка подпрограмм из коллекции

    Для загрузки подпрограмм из коллекции, выберите в главном меню Инструменты → Подпрограммы → Загрузить из коллекции.

    Затем выберите подпрограммы, которые хотите импортировать в текущий проект, и нажмите OK.

    Удаление коллекции подпрограмм

    Для удаления всех сохраненных в коллекцию подпрограмм выберите в главном меню Инструменты → Подпрограммы → Очистить коллекцию.

    Коллекция подпрограмм хранится в каталоге пользователя и не теряется при удалении или переустановке TRIK Studio.

    Начало работы и создание проекта в TRIK Studio Junior

    Создание нового проекта и запуск существующего

    Главное окно

    После запуска TRIK Studio Junior откроется стартовая страница, на которой будет отображена версия TRIK Studio Junior, быстрый доступ к недавним проектам, а также кнопки для открытия существующего проекта и создания нового.

    Создание проекта

    Для создания нового проекта нажмите кнопку «Создать проект» на стартовой странице TRIK Studio Junior.

    Или в выберите Файл → Новый проект.

    Откроется окно с новой программой на визуальном языке программирования:

    Запуск существующего проекта

    Для запуска существующего проекта нажмите кнопку «Открыть проект» на стартовой странице TRIK Studio Junior.

    Или в выберите Файл → Открыть....

    По умолчанию TRIK Studio Junior ищет файлы в формате *.tsj .

    Класс «colorSensor»

    Видеокамера в режиме датчика цвета.

    Метод

    Описание

    Включает видеокамеру и инициализирует её в режиме датчика цвета.

    Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра.

    Выключает видеокамеру и прекращает работу датчика.

    init

    Включает видеокамеру и инициализирует её в режиме датчика цвета.

    Синтаксис

    Булевый параметр определяет, выводить ли на экран изображение с камеры:

    • true — выводить,

    • false — не выводить.

    read

    Возвращает массив с координатами доминирующего цвета в цветовой шкале 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.

    stop

    Выключает видеокамеру и прекращает работу датчика.

    Синтаксис

    WinSCP

    WinSCP — графический клиент протоколов SFTP и SCP, предназначенный для Windows. С помощью него можно обмениваться файлами между контроллером ТРИК и компьютером по протоколу SCP.

    Запуск WinSCP из TRIK Studio

    Для запуска утилиты зайдите в меню Инструменты → Сторонние утилиты → WinSCP.

    Подключение к контроллеру ТРИК в WinSCP

    1. В каталоге с установленной TRIK Studio зайдите в папку winscp и запустите WinSCP.exe

    2. Заполните данные:

    • File protocol: SCP

    • Host name: .

    • User name: root.

    Поле Password оставьте пустым.

    3. Нажмите кнопку «Login».

    4. Если у вас появилось окно «Warning», нажмите «Yes».

    Это предупреждение возникает, когда WinSCP подключается к новому серверу SSH.

    5. В левой части приложения будет находиться файловая система вашего компьютера, в правой — файловая система контроллера ТРИК.

    Класс «accelerometer»

    Представляет акселерометр контроллера ТРИК.

    Метод

    Описание

    Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.

    Сигнал

    Описание

    Сигнал, посылаемый сенсором, когда у него готовы новые данные.

    read

    Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.

    Синтаксис

    newData

    Сигнал, посылаемый сенсором, когда у него готовы новые данные.

    Класс «irCamera»

    Предоставляет доступ к инфракрасному датчику MLX90640, подключенному по шине I2C, в режиме камеры и сенсора.

    Метод
    Описание

    Инициализирует ИК-камеру и запускает захват кадров.

    Возвращает цветное изображение в виде массива байтов.

    Возвращает среднее значение температуры в специальной шкале в указанном участке кадра.

    Останавливает захват кадров.

    init

    Инициализирует инфракрасную камеру и запускает захват кадров.

    Синтаксис

    getImage

    Возвращает цветное изображение ширины 32 и высоты 24 пикселя в виде массива байтов в формате «rgb32».

    Синтаксис

    Пример

    Вывод изображения на экран.

    readSensor

    Возвращает среднее значение температуры в специальной шкале в указанном участке кадра.

    Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в model-config.xml на роботе. Квадраты индексируются с 1. То есть (1, 1) — это левый верхний край кадра, (2, 2) — его центр.

    Возвращаемое значение — среднее значение температуры в указанном квадрате в следующей шкале:

    • Значение меньше 0 — камера не инициализирована

    • 0 — соответствует температуре льда из морозильной камеры и ниже

    • 1 — соответствует температуре воды из холодильника

    Синтаксис

    В качестве параметра необходимо указать индексы квадрата x и y.

    stop

    Синтаксис

    Останавливает захват кадров до следующего вызова init().

    Загрузка программ на нескольких роботов ТРИК из Sublime Text

    В данной статье рассматривается возможность одновременной загрузки программ на группу роботов с использованием внешнего текстового редактора 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.

    Программирование ТРИК на Python и JavaScript

    Создание текстовой программы

    Про создание новой текстовой программы и генерацию диаграммы в код читайте в статье:

    Программирование на текстовом языке

    Программирование на Python и JavaScript

    Доступ к функциональности среды выполнения предоставляется с помощью предопределённых объектов и функций.

    Объекты

    Функции

    Связи между блоками

    Связи между блоками в TRIK Studio обозначают направление передачи управления между блоками.

    Пример

    Пусть необходимо, чтобы вслед за задержкой программа сразу же завершилась. Для этого надо соединить блоки и стрелкой, имеющей направление от блока «Таймер» к блоку завершения программы.

    Синтаксис выражений в блоках

    Для объявления переменных и задания им определенных значений используется блок .

    А для записи математических вычислений — блок .

    Также математические выражения, в том числе и изменяющие значения переменных, могут встречаться почти везде, где можно указать какое-либо значение.

    Блоки и их свойства, не допускающие использования математических выражений, описаны в разделе .

    Все переменные в программе являются глобальными, т.е. их значения могут использоваться в любом блоке в программе.

    Упражнения

    Создание и загрузка упражнений

    Упражнение — это обычная программа, в которой нельзя модифицировать некоторые части решения. То есть любую диаграмму можно сохранить как упражнение для учеников (если она еще не является таковой).

    Создание упражнения

    1. Нарисуйте на сцене поле с помощью , если это необходимо для вашей задачи.

    2. Создайте диаграмму.

    Горячие клавиши в TRIK Studio

    В таблице ниже указаны горячие клавиши, установленные по умолчанию. Изменить сочетание клавиш для действий можно в .

    Запуск 2D-модели в TRIK Studio из PyCharm

    В данной статье рассматривается настройка и использование внешней среды программирования PyCharm для вызова программ в TRIK Studio.

    Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.

    Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, ).

    Подготовка

    Загрузка программ на нескольких роботов ТРИК из VSCode

    В данной статье рассматривается возможность одновременной загрузки программ на группу роботов с использованием внешнего текстового редактора VSCode. Статья является продолжением материала

    Настройка

    Скачайте файл для Windows и поместите его в папку, в которую установлена TRIK Studio.

    Запуск программ и их загрузка на контроллер ТРИК

    Для работы с контроллером ТРИК в настройках TRIK Studio перейдите в и выберите платформу ТРИК.

    Существует несколько вариантов выполнения программ для контроллера ТРИК:

    • .

    • .

    Взаимодействие контроллеров ТРИК

    Контроллеры ТРИК могут взаимодействовать друг с другом, что позволяет решать по передаче сообщений между роботами.

    Для взаимодействия контроллеров необходимо будет выбрать ведущий контроллер — тот, к которому мы будем подключать остальные контроллеры. А также подключить все контроллеры к одной сети. Это можно сделать двумя способами:

    1. С помощью существующей сети.

    2. С помощью создания точки доступа Wi-Fi на одном из контроллеров.

    Объект «Threading»

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

    Класс «objectSensor»

    Видеокамера в режиме датчика объекта. Захватывает контрастный объект в центре кадра и возвращает его координаты и размер в кадре.

    Запуск 2D-модели в TRIK Studio из Sublime Text

    В данной статье рассматривается настройка и использование внешней среды программирования 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».

    Объект

    Описание

    brick

    Представляет контроллер ТРИК и предоставляет доступ к устройствам робота.

    script

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

    mailbox

    Реализует связь между роботами в сети посредством механизма почтовых ящиков.

    gamepad

    Служит для работы с пультом управления.

    Threading

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

    Функция

    Описание

    getPhoto

    Возвращает одномерный массив байт, в который записаны пиксели изображения в формате rgb32​, снятого с камеры.

    include(“path”)

    Позволяет использовать функции, реализованные пользователем в других файлах. Предполагается для написания собственных библиотек. В качестве передаваемого параметра необходимо указать полный системный путь до файла с необходимыми функциями.

    Массив
    brick.accelerometer().read()
    read
    newData
    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

    настройках TRIK Studio

    detect

    Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта. После этого метод «read» начинает возвращать данные для объекта.

    Синтаксис

    brick.objectSensor().detect()
    brick.objectSensor().detect();

    init

    Включает видеокамеру и инициализирует её в режиме датчика объекта. Булевый параметр определяет, выводить ли на экран изображение с камеры (true — выводить).

    Синтаксис

    brick.objectSensor().init(True)
    brick.objectSensor().init(true);

    Булевый параметр определяет, выводить ли на экран изображение с камеры:

    • true — выводить,

    • false — не выводить.

    read

    Возвращает массив, в ячейках которого находятся следующие данные:

    • в нулевой ячейке координата по оси X центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра слева);

    • в первой ячейке — координата по оси Y центра объекта относительно центра кадра (от -100 до 100, -100 — центр объекта на краю кадра сверху);

    • во второй ячейке — относительный размер объекта, число от 0 до 100 (100 — объекта занимает почти весь кадр, 0 — объекта нет на кадре).

    Синтаксис

    stop

    Выключает видеокамеру и прекращает работу датчика.

    Синтаксис

    Метод

    Описание

    detect

    Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта.

    init

    Включает видеокамеру и инициализирует её в режиме датчика объекта.

    read

    Возвращает массив с координатой по оси X центра объекта относительно центра кадра, координатой по оси Y центра объекта относительно центра кадра, относительным размером объекта.

    stop

    Выключает видеокамеру и прекращает работу датчика.

    init​
    read​
    stop
    brick.colorSensor("video1").init(True)
    brick.colorSensor("video1").init(true);
    2 — соответствует температуре в помещении
  • 3 — соответствует температуре тела человека

  • 4 — соответствует температуре тёплой воды

  • 5 — соответствует температуре горячей (близкой к температуре кипения) воды

  • 6 — соответствует температуре больше температуры кипения воды

  • init
    getImage
    readSensor
    stop
    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();
    Создание связей

    Связи можно создавать двумя способами:

    1. Жестом мыши.

    2. С помощью линкеров.

    Создание связи жестом мыши

    Наведите курсор на блок, зажмите правую кнопку мыши и проведите линию до второго блока. Форма линии может быть произвольной. Важно, чтобы она начиналась строго на одном блоке и заканчивалась на втором.

    Если навести на связь курсор мыши, то на ее концах отобразятся серые маркеры. Потянув за один из этих маркеров, можно управлять связью. Чтобы присоединить один из концов связи к блоку, нужно потянуть за соответствующий серый маркер и отпустить его на интересующем блоке.

    Создание связи с помощью линкеров

    Линкер — цветной кружок справа от блока, появляющийся после выделения блока. При нажатии на этот кружок и движении мыши с зажатой левой клавишей, из элемента начинает вытягиваться связь.

    Если «бросить» эту связь на существующем элементе, произойдет соединение данных элементов.

    Если же отпустить левую клавишу мыши, когда курсор находится на пустом участке диаграммы, то появится меню с пунктами:

    • Удалить

    • Создать новый элемент

    При выборе пункта меню «Удалить» созданная связь удаляется.

    При наведении на пункт меню «Создать новый элемент» появляется новое меню, в котором перечислены все возможные для создания элементы. При выборе одного из этих пунктов на диаграмме создастся соответствующий элемент и присоединится к текущему связью.

    Удаление связей

    Удаление связей осуществляется аналогично удалению блоков.

    Добавление нового блока на связь

    Если необходимо добавить новый блок между двумя связанными блоками, перетащите из панели «Палитра» блок на связь. Отпустите кнопку мыши при наведении курсора (не блока) на связь.

    Создание точек излома

    Связи в TRIK Studio могут быть ломаными линиями. Для добавления точки излома наведите курсор мыши на линию связи, нажмите левую кнопку мыши и потяните появившийся серый маркер.

    Если точку излома связи разместить так, что она и две ближайшие к ней будут располагаться примерно на одной прямой, то это приведет к уничтожению этой точки излома и сглаживанию ломаной в этом месте.

    «Таймер»
    «Конец»
    Язык TRIK Studio

    Используемый внутри блоков язык создан на базе Lua 5.3 и во многом следует его синтаксису. Тем не менее имеются существенные отличия, поэтому полное описание используемого в TRIK Studio языка приводится здесь.

    • Типы языка TRIK Studio

    • Лексемы языка

    • Операторы языка

    • Сенсорные переменные

    Примеры записи выражений

    Объявление нескольких переменных в одном блоке «Выражение»:

    То же через блоки «Инициализация переменной»:

    Пропорциональный регулятор для езды по линии с использованием двух датчиков света для платформы ТРИК:

    Пример использования массивов для задания портов блока «Моторы вперёд». Создаётся массив с именем a, нулевому элементу присваивается порт M3, первому — M1, потом содержимое первого элемента массива меняется на M4, затем получившийся массив передаётся в свойство «Порты» блока «Моторы вперёд»:

    «Инициализация переменной»
    «Выражение»
    «Общие блоки»
    Блок «Инициализация переменной»
    Блок «Выражение»
    3. Удалите из диаграммы все или часть блоков. Блок «Начало» обязательно должен присутствовать.

    4. Выберите в главном меню Инструменты → Сохранить как упражнение….

    5. В появившемся диалоговом окне выберите ограничения для упражнения.

    Название

    Описание

    1

    Двумерная модель неизменяема

    Запрещает редактировать стены и цветные линии в двумерной модели.

    2

    Положение и конфигурация сенсоров неизменяемы

    Запрещает изменять конфигурацию датчиков, а также их положение и направление в двумерной модели.

    3

    Начальное положение робота в двумерной модели неизменяемо

    Запрещает двигать робот «вручную».

    4

    6. Нажмите «OK» и выберите путь для сохранения упражнения.

    7. После сохранения упражнение автоматически откроется в TRIK Studio, где можно будет убедиться, что выбранные опции недоступны для редактирования.

    Окно настроек сенсоров при их запрещенном редактировании

    Загрузка упражнения

    Загрузка сохраненного упражнения происходит как обычная программа. Например, с помощью панели «Файл».

    панели редактирования мира
    Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате
    .xml
    (подробнее в статье
    ), так и в формате .qrs.
    1. Скачайте файл run_2d_model.cmd для Windows или run_2d_model.sh для Linux и поместите его в папку, в которой установлена TRIK Studio.

    2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате .xml, создайте в данной папке пустой проект default.qrs.

    Настройка PyCharm

    Инструкция протестирована на 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.

    2D-модели
    Олимпиады НТИ ИРС
    «Гибкая настройка 2D-модели»
    Инструкция протестирована на январском релизе 2020 года (version 1.42). Скачать VSCode можно на официальном сайте.

    При первом запуске программы для установки соединения с роботом потребуется подтверждение от пользователя.

    Чтобы разрешить соединение, введите в командной строке 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.

    Запуск 2D-модели в TRIK Studio из VSCode
    send_files.cmd
    Интерпретация с моделированием поведения робота

    В режиме двумерной модели робота команды не передаются роботу, а исполняются пошагово для виртуальной модели, отображающейся на экране. Подробнее см. в статье «2D-модель».

    1. Включите режим двумерной модели.

    2. Нажмите на кнопку «Выполнить».

    3. Откроется окно двумерной модели и начнется выполнение программы.

    4. При переключении в режим редактирования можно отслеживать шаги выполнения программы.

    Загрузка на контроллер

    Из TRIK Studio можно загрузить готовую программу на робота, чтобы в дальнейшем автономно её исполнять без связи с компьютером. 1 . Подключите контроллер ТРИК к TRIK Studio. 2 . Нажмите на кнопку «Загрузить программу».

    3 . Для запуска программы на контроллере зайдите в меню «Файлы», выберите нужную программу и нажмите на кнопку «Ввод».

    раздел «Роботы»
    Пошаговая интерпретация диаграммы с моделированием поведения робота на двумерной модели
    Загрузка программы на робот и дальнейшее её автономное исполнение без связи с компьютером
    Способ 1. Взаимодействие с помощью существующей Wi-Fi-сети

    1. Выберите ведущий контроллер и подключите его к существующей Wi-Fi-сети в режиме клиента.

    2. В веб-интерфейсе ведущего контроллера в поле «Взаимодействие роботов» укажите бортовой номер (обычно для ведущего это 01, но можно любой другой) и его IP-адрес.

    Пример ввода бортномера и IP-адреса ведущего контроллера

    3. Подключите все остальные контроллеры к этой же Wi-Fi-сети в режиме клиента.

    4. Укажите для каждого из них в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес ведущего контроллера.

    Пример ввода бортномера и IP-адреса ведущего контроллера

    Также бортномер и IP-адрес ведущего контроллера можно указать на контроллере в пункте меню Взаимодействие.

    4. На всех контроллерах зайдите в пункт меню Взаимодействие и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллеров должна появиться иконка.

    Скриншоты экранов двух подключенных к друг другу контроллеров

    Способ 2. Взаимодействие с помощью Wi-Fi точки доступа одного из контроллеров

    Действия с ведущим контроллером

    1. Выберите ведущий контроллер и раздайте с него Wi-Fi с помощью режима точки доступа (выберите в меню Сеть → Wi-Fi точка доступа).

    2. Далее вернитесь на главный экран меню и выберите пункт Взаимодействие.

    3. Укажите бортовой номер (обычно для ведущего это 01, но можно любой другой) и его IP-адрес.

    Действия с остальными контроллерами

    4. Подключите остальные контроллеры к ведущему с помощью режима Wi-Fi-клиент. Для этого в веб-интерфейсе каждого контроллера необходимо в полях «Wi-Fi клиент» указать имя и пароль сети ведущего контроллера в режиме Wi-Fi точки доступа.

    5. Зайдите в веб-интерфейс, используя IP-адрес, который отображается на контроллере в режиме Wi-Fi клиент.

    6. Укажите для каждого из контроллеров в своих веб-интерфейсах в поле «Взаимодействие роботов» бортовой номер (отличный от других) и IP-адрес ведущего контроллера.

    Пример ввода бортномера и IP-адреса ведущего контроллера

    Также бортномер и IP-адрес ведущего контроллера можно указать на контроллере в пункте меню Взаимодействие.

    Действие со всеми контроллерами

    7. На всех контроллерах зайдите в пункт меню Взаимодействие и нажмите кнопку «Подключиться». В правом верхнем углу на экранах контроллера должна появиться иконка.

    Скриншоты экранов двух подключенных к друг другу контроллеров
    задачи
    Пример решения задачи по взаимодействию двух роботов

    Запускает переданную в качестве параметра функцию в отдельном потоке.

    joinThread

    Ожидает завершения указанного потока.

    Синтаксис

    Threading.joinThread("threadId")

    В качестве параметра необходимо указать id потока.

    killThread

    Заканчивает исполнение указанного потока.

    Синтаксис

    Threading.killThread("threadId")

    В качестве параметра необходимо указать id потока.

    receiveMessage

    Запрашивает принятое сообщение.

    Синтаксис

    Если wait равен true, то ожидает, пока не придет сообщение.

    sendMessage

    Посылает сообщение указанному потоку.

    Синтаксис

    В качестве параметров необходимо указать id потока и сообщение.

    startThread

    Запускает переданную в качестве параметра функцию в отдельном потоке.

    Внимание! При этом создаётся новая копия для всех глобальных переменных. Так что если в одном потоке значение переменной меняется, в другом потоке оно остаётся старым.

    Синтаксис

    В качестве параметров необходимо указать id потока и функцию.

    Метод

    Описание

    joinThread

    Ожидает завершения указанного потока.

    killThread

    Заканчивает исполнение указанного потока.

    receiveMessage

    Запрашивает принятое сообщение.

    sendMessage

    Посылает сообщение указанному потоку.

    Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате
    .xml
    (подробнее в статье
    ), так и в формате .qrs.
    1. Скачайте файл run_2d_model.cmd для Windows или run_2d_model.sh для Linux и поместите его в папку, в которой установлена TRIK Studio.

    2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате .xml, создайте в данной папке пустой проект default.qrs.

    Настройка Sublime Text

    Инструкция протестирована на 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 гг. Александра Журавлева.

    2D-модели
    Олимпиады НТИ ИРС
    «Гибкая настройка 2D-модели»
    официальном сайте
    ссылке
    запуску 2D-модели
    Импортировать из файла
    Сохранить в коллекцию
    Загрузить из коллекции
    Очистить коллекцию
    сохранение в коллекцию
    экспорта
    Список подпрограмм в проекте
    Список подпрограмм
    Список подпрограмм в коллекции
    главном меню
    главном меню
    IP-адрес контроллера

    Добавление и удаление блоков

    Добавление блоков на сцену

    Блоки на сцену в TRIK Studio можно добавить тремя способами:

    1. Перетаскиванием соответствующих иконок из палитры элементов на диаграмму.

    2. .

    3. между блоками с помощью линкеров.

    Добавление блоков перетаскиванием из «Палитры»

    Кликнете левой кнопкой мыши на необходимый блок, расположенный на панели . Не отпуская кнопку мыши, передвиньте блок на сцену.

    Добавление блоков жестами мыши

    Нарисуйте на сцене условное изображение блока левой кнопкой мыши. Блок появится в центре нарисованного изображения.

    Жесты можно рисовать несколькими штрихами. Ввод жеста заканчивается, если штрихи некоторое время не рисовали (настроить время можно в окне настроек на вкладке ).

    Доступные условные изображения можно посмотреть двумя способами:

    1. В окне «Жесты мышью», открывающемся через главное меню Инструменты → Жесты мышью.

    2. Во всплывающей подсказке, появляющейся при наведении курсора мыши на блок на панели «Палитра».

    Добавление блоков при создании связи

    1. Начните (цветного кружка справа от блока, появляющегося после выделения блока) и отпустите левую клавишу мыши, когда курсор будет находится на пустом участке диаграммы.

    2. В появившемся меню выберите пункт «Создать новый элемент». Появится новое меню с блоками.

    3. Выберите нужный блок.

    Удаление блоков

    Удаление добавленного блока возможно двумя способами:

    1. Выделите блок левой кнопкой мыши и затем нажмите кнопку «Delete».

    2. Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Удалить».

    Удаление нескольких блоков

    1. Выберите необходимые блоки одним из способов.

    1.1. Зажмите кнопку «Ctrl» и выделите правой кнопкой мыши необходимые блоки.

    1.2. Правой кнопкой мыши выделите область на сцене с необходимыми блоками.

    2. Удалите выбранные блоки одним из способов.

    2.1. Нажмите кнопку «Delete» на клавиатуре.

    2.2. Нажмите правой клавишей мыши на любой выделенный блок и выберите в появившемся меню пункт «Удалить».

    Замена блоков

    Для замены добавленного блока:

    1. Нажмите на блок правой кнопкой мыши и в появившемся меню выберите «Заменить на…».

    2. Выберите из списка блок, которым хотите заменить выделенный.

    Запуск 2D-модели в TRIK Studio из VSCode

    В данной статье рассматривается настройка и использование внешней среды программирования VSCode для вызова программ в 2D-модели TRIK Studio.

    Это позволит опытным пользователям TRIK Studio использовать все возможности профессиональных текстовых редакторов и их плагинов: статические анализаторы, автоформаттеры, цветовые темы.

    Также рассказывается как автоматически запускать программу на нескольких полях, что может быть полезно участникам соревнований с автоматизированными системами проверки (например, Олимпиады НТИ ИРС).

    Подготовка

    Предполагается, что пользователь пишет программу во внешнем редакторе и хотел бы запустить данную программу на одном или нескольких полях. Поля могут быть представлены как в формате .xml (подробнее в статье ), так и в формате .qrs.

    1. Скачайте файл для Windows или для Linux и поместите его в папку, в которой установлена TRIK Studio.

    2. Поместите поля, на которых необходимо тестировать программу, в отдельную папку. Если поля представлены в формате xml, создайте в данной папке пустой проект default.qrs.

    Инструкция протестирована на январском релизе 2020 года (version 1.42). Скачать VSCode можно на .

    Настройка 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 гг. Александра Журавлева.

    Класс «lineSensor»

    Видеокамера в режиме датчика линии.

    Метод

    Описание

    Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии.

    Включает видеокамеру и инициализирует её в режиме датчика линии.

    Возвращает массив с координатой по оси X центра линии относительно центра кадра, вероятность перекрёстка, относительный размер линии.

    Выключает видеокамеру и прекращает работу датчика.

    detect

    Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии. После этого метод «» начинает возвращать данные для этой линии.

    Синтаксис

    init

    Включает видеокамеру и инициализирует её в режиме датчика линии. Булевый параметр определяет, выводить ли на экран изображение с камеры (true — выводить).

    Синтаксис

    Булевый параметр определяет, выводить ли на экран изображение с камеры:

    • true — выводить,

    • false — не выводить.

    read

    Возвращает массив, в ячейках которого находятся следующие данные:

    • в нулевой ячейке координата по оси X центра линии относительно центра кадра (от -100 до 100, -100 — центр линии на краю кадра слева);

    • в первой ячейке — вероятность перекрёстка (число от 0 до 100, показывающее сколько точек цвета линии находится в горизонтальной полосе в центре кадра);

    • во второй ячейке — относительный размер линии, число от 0 до 100 (100 — линия занимает почти весь кадр, 0 — линии нет на кадре).

    Синтаксис

    stop

    Выключает видеокамеру и прекращает работу датчика.

    Синтаксис

    Класс «encoder»

    Представляет энкодеры силовых моторов, подключающиеся к портам E1, E2, E3, E4.

    Метод

    Описание

    Возвращает текущее показание энкодера в градусах на заданном порту.

    Сбрасывает на 0 текущее показание энкодера.

    Возвращает текущее показание энкодера в «тиках» на заданном порту.

    read

    Возвращает текущее показание энкодера в градусах на заданном порту.

    Синтаксис

    В качестве параметра необходимо указать порт.

    Примеры

    reset

    Сбрасывает в 0 текущее показание энкодера.

    Синтаксис

    В качестве параметра необходимо указать порт.

    Примеры

    readRawData

    Возвращает текущее показание энкодера в «тиках» на заданном порту.

    Синтаксис

    Примеры

    Скриншот экрана контроллера ТРИК

    С помощью веб-интерфейса, а также утилит PuTTY и WinSCP

    Скриншот экрана контроллера ТРИК можно сделать двумя способами:

    1. С помощью веб-интерфейса.

    2. С помощью утилит PuTTY и WinSCP.

    С помощью веб-интерфейса

    1. Подключитесь к контроллеру по Wi-Fi любым из .

    2. Войдите в , набрав ip-адрес контроллера в браузере.

    3. Убедитесь, что на экран контроллера выведено изображение или текст, скриншот которого хотите сделать.

    4. Выберите в веб-интерфейсе пункт меню «Изображение» и нажмите кнопку «Сделать снимок экрана».

    5. После этого скриншот появится в списке. Если этого не произошло, обновите страницу.

    6. Для загрузки сделанных скриншотов нажмите кнопку «Загрузить всё».

    С помощью утилит PuTTY и WinSCP

    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. Выберите в левом окне директорию, в которую хотите сохранить снимок. Перетащите созданное изображение из правого окна в левое.

    Класс «motor»

    Предоставляет управление мотором робота (силовым или сервомотором), подключающимся к портам M1, …, M4, S1, ..., S6.

    Метод

    Описание

    Блокировка моторов для торможения в течение указанного времени.

    Возвращает текущую мощность мотора.

    Выключает мотор.

    brake

    Блокировка моторов для торможения в течение указанного времени в миллисекундах. Функция асинхронная, то есть не блокирующая (после ее вызова программа переходит к следующему действию, а не ожидает указанное время торможения).

    Синтаксис

    В качестве параметра необходимо указать время в миллисекундах. По умолчанию (если параметр не указан), моторы блокируются на 500 миллисекунд.

    При написании алгоритма учитывайте, что после блокировки подача тока на двигатели выключается, поэтому необходимо дождаться этого состояния прежде чем подавать новую мощность на двигатели.

    power

    Возвращает текущую мощность мотора (от -100 до 100).

    Синтаксис

    powerOff

    Выключает мотор. Перестает подавать на него питание, но мотор может продолжить свободное вращение по инерции или под действием иных внешних сил.

    Синтаксис

    setPower

    Включает мотор с указанной мощностью.

    Синтаксис

    В качестве параметра необходимо указать мощность.Мощность задаётся в диапазоне от -100 («полный назад») до 100 («полный вперёд»). 0 соответствует force break, то есть мотор останавливается, при этом он заблокирован и остаётся под напряжением.

    Класс «keys»

    Служит для работы с кнопками на пульте робота.

    Метод

    Описание

    Посылается, когда кнопка с указанным кодом нажата или отпущена.

    Возвращает true, если кнопка с указанным кодом нажата в данный момент.

    Сбрасывает запомненные нажатия кнопок.

    Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки.

    buttonPressed

    Посылается, когда кнопка с указанным кодом нажата или отпущена.

    Синтаксис

    Первый параметр — код кнопки, второй — 1, если кнопка нажата, 0, если отпущена.

    isPressed

    Возвращает true, если кнопка с указанным кодом нажата в данный момент. Возможные варианты:

    • KeysEnum.Left (код 105),

    • KeysEnum.Up (код 103),

    • KeysEnum.Down (код 108),

    Синтаксис

    reset

    Сбрасывает запомненные нажатия кнопок.

    Синтаксис

    wasPressed

    Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки. Возможные варианты:

    • KeysEnum.Left (код 105),

    • KeysEnum.Up (код 103),

    • KeysEnum.Down (код 108),

    Синтаксис

    Класс «marker»

    Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме 2D модели.

    Метод

    Описание

    Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен.

    Закончить рисование маркером.

    Возвращает true, если маркер активен, false- если нет.

    down

    Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия. Если был установлен маркер другого цвета, он будет заменен.

    Синтаксис

    Пример

    up

    Закончить рисование маркером.

    Синтаксис

    isDown

    Возвращает true, если маркер активен, false- если нет.

    Синтаксис

    setDown

    Вызывает метод down("black"), или up() в зависимости от аргумента.

    Синтаксис

    Пример решения задачи по взаимодействию двух роботов

    Условие задачи

    Отправить сообщение «5» с одного робота и принять его на втором.

    Обратите внимание, что решить задачу возможно только в режиме реального робота.

    Решение

    Для решения задачи необходимо:

    1. Написать для ведущего робота.

    2. Написать для второго робота.

    3. роботов в единую сеть.

    4. Запустить программы на роботах.

    Алгоритм передачи сообщения

    1. Перейдите в TRIK Studio в режим .

    2. Введите переменную для сообщения message и инициализируйте её, присвоив ей цифру 5 в блоке «».

    3. Добавьте блок «» и «». В свойствах блока «» укажите бортномер робота, на который вы хотите отправить сообщение, и переменную, содержащую сообщение.

    Общий вид алгоритма

    Алгоритм приема сообщения

    1. Перейдите в TRIK Studio в режим .

    2. Добавьте блок «». В свойствах блока укажите переменную, в которую хотите записать сообщение, отправленное с другого робота. Переменная может называться как угодно. В свойстве «Дождаться сообщения» укажите значение истина.

    3. После того как сообщение пришло, выведите его на экран робота в течение 3 секунд, а затем закончите выполнение алгоритма. Для этого добавьте блоки «», «» и «». В свойствах блока «Напечатать текст» поставьте флажок Вычислять и укажите значение истина в поле «Обновить картинку».

    Общий вид алгоритма

    Объект «mailbox»

    Реализует связь между роботами в сети посредством механизма почтовых ящиков.

    {
        "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"]
    startThread
    read
    brick.lineSensor("video1").detect()
    detect
    init
    read
    stop
    brick.lineSensor("video1").detect();
    brick.lineSensor("video1").init(True)
    brick.lineSensor("video1").init(true);
    read
    reset
    readRawData
    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();

    Включает мотор с указанной мощностью.

    brake
    power
    powerOff
    setPower
    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).

  • buttonPressed
    isPressed
    reset
    wasPressed
    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() в зависимости от аргумента.

    down
    up
    isDown
    setDown
    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"
    «Гибкая настройка 2D-модели»
    run_2d_model.cmd
    run_2d_model.sh
    официальном сайте

    Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.

    Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.

    joinNetwork

    Подключается к роботу с заданным 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(""
    

    hasMessages

    Возвращает true, если роботу пришло новое сообщение.

    Синтаксис

    myHullNumber

    Возвращает бортовой номер робота.

    Синтаксис

    newMessage

    Посылает сообщение после получения нового сообщения.

    Синтаксис

    Первый параметр — бортовой номер отправителя, второй — само сообщение.

    receive

    Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.

    Синтаксис

    send

    Посылает роботу с указанным бортовым номером (или всем роботам) указанное сообщение.

    Синтаксис

    В качестве параметра необходимо указать бортовой номер робота, которому хотите послать сообщение и сообщение. Если бортовой номер не указан, то сообщение отправляется всем роботам, зарегистрированным в сети.

    Пример

    Метод

    Описание

    joinNetwork

    Подключается к роботу с заданным IP-адресом по заданному порту (или порту по умолчанию)номеру. Сообщает ему свой бортовой номер и регистрируется в сети «почтовых ящиков».

    hasMessages

    Возвращает true, если роботу пришло новое сообщение.

    myHullNumber

    Возвращает бортовой номер робота.

    newMessage

    Посылает сообщение после получения сообщения.

    Соответствие портов моторов и колёс неизменяемо

    Запрещает менять моторы в настройках двумерной модели.

    5

    Настройки симуляции двумерной модели (физика, шумы и т.д.) неизменяемы

    Запрещает менять настройки шумов датчиков и моторов, а также физический движок в двумерной модели.

    Константы
    Встроенные функции
    Жестом мыши
    При создании новой связи
    «Палитра»
    «Поведение»
    создавать связь с помощью линкера
    Окно «Жесты мышью»
    Появляющаяся подсказка при наведении на блок
    Добавление блока с помощью новой связи
    Замена блока
    способов
    веб-интерфейс
    способов
    PuTTY
    WinSCP
    алгоритм передачи сообщения
    алгоритм приема сообщения
    Подключить
    реального робота
    Выражение
    Послать сообщение
    Конец
    Послать сообщение
    реального робота
    Получить сообщение
    Напечатать текст
    Таймер
    Конец

    Операторы языка TRIK Studio

    1. Бинарные операторы.

    2. Унарные операторы.

    3. Оператор присваивания.

    4. .

    5. .

    Бинарные операторы

    Унарные операторы

    Оператор присваивания

    Имеет следующий вид:

    переменная1, переменная2, …, переменнаяN = выражение1, выражение2, …, выражениеN

    В самом простом виде переменная = выражение.

    Оператор возврата значения

    Записывается как обычное выражение и должен находиться в конце блока операторов.

    Пустой оператор

    Записывается как ;.

    Пример

    Блок операторов с двумя операторами присваивания и оператором возврата значения:

    Обновление встроенного программного обеспечения контроллера ТРИК

    Инструкция для Windows, Linux и Ubuntu

    Выберите операционную систему:

    • Windows

    • Linux

    • Ubuntu

    Windows

    1. Скачайте последнюю версию . 2. Скачайте и установите программу .

    Внимание! Для установки и использования DiskImager вам понадобятся права администратора.

    3. Извлеките карту памяти microSD из контроллера ТРИК. 4. Вставьте её в компьютер, используя картридер. 5. Запустите DiskImager. Для смены языка выберите в меню About → Language.

    6. Выберите диск для записи.

    7. Нажмите «Восстановить флешки из образа» («Restore drives from»).

    8. В появившемся окне отфильтруйте файлы по типу .xz и выберите скачанный файл.

    9. Нажмите «Открыть».

    10. Дождитесь выполнения операции.

    Linux

    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.

    Пример:

    Ubuntu

    Инструкция для версии 14.04 и старше.

    1. Скачайте последнюю версию . 2. Извлеките карту памяти microSD из контроллера ТРИК. 3. Вставьте её в компьютер, используя картридер. 4. Откройте в файловом менеджере местоположение загруженного образа прошивки. 5. Вызовите контекстное меню правым кликом мыши по архиву и выберите первый пункт «Открыть в „Создание загрузочного диска“». 6. Из выпадающего меню выберите диск, на который хотите записать прошивку. Затем нажмите кнопку «Начать восстановление».

    Класс «gyroscope»

    Представляет гироскоп контроллера ТРИК. В состоянии покоя среднее значение выходного сигнала гироскопа не равно нулю и называется смещением нуля (bias) или систематической ошибкой (bias error).

    Параметр обусловлен многими факторами и может изменяться, например, в зависимости от окружающей температуры.

    Для правильной работы гироскопа необходимо вычитать смещение нуля из приходящих значений. Вычислить его можно с помощью метода «calibrate».

    Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «getCalibrationVaules», а при запуске программы вместо калибровки вызывать «setCalibrationValues».

    calibrate

    Вычисляет смещение нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона.Рекомендуемое время калибровки — 10−20 секунд.

    Синтаксис

    В качестве параметра необходимо указать:

    • msec — время в миллисекундах.

    calibrationFinished

    Сигнал, посылаемый сенсором после окончания калибровки.

    getCalibrationValues

    Возвращает объект, в котором содержатся необходимые данные о смещении нуля.

    Синтаксис

    isCalibrated

    Возвращает true в случае завершении калибровки, false — в противном случае.

    Синтаксис

    newData

    Сигнал, посылаемый сенсором, когда у него готовы новые данные.

    read

    Возвращает массив из семи элементов:

    • 0−2 — угловые скорости по трем осям (в миллиградусах/секунды),

    • 3 — время последнего замера (в микросекундах),

    • 4−6 — углы наклона по трем осям (в миллиградусах).

    Синтаксис

    readRawData

    Возвращает массив из трех элементов с угловыми скоростями по трем осям.

    Синтаксис

    setCalibrationValues

    Устанавливает объект, содержащий необходимые параметры о смещении нуля.

    Так как калибровка занимает длительное время, то при частом запуске модели можно выполнять ее один раз, после чего запоминать значение в переменную с помощью «», а при запуске программы вместо калибровки вызывать «setCalibrationValues».

    Синтаксис

    В качестве параметра необходимо указать:

    • values — объект, содержащий данные о биасе.

    Функция getPhoto

    Описание функции

    Функция возвращает одномерный массив байт, в который записаны пиксели изображения в формате rgb32, снятого с камеры (размер изображения — 160x120). Данная функция может быть использована для решения задач распознавания маркеров.

    Вызов функции

    Пример работы

    Рассмотрим пример преобразования кадра, снятого на камеру, в цветовые форматы «оттенок серого» и «черно-белый».

    Сделайте снимок и выведите результат на экран c помощью функции .

    Результат:

    Реализация функции перевода изображения в оттенок серого

    Перевод изображения в черно-белый формат и вывод на дисплей:

    Результат:

    Реализация функции бинаризации изображения

    Перевод изображения в черно-белого и вывод на дисплей:

    Результат:

    .

    Дополнительный материал: презентация Университета Иннополис «».

    2D-модель в TRIK Studio Junior

    Интерфейс и работа с 2D-моделью (интерактивным режимом имитационного моделирования) в TRIK Studio Junior почти полностью совпадает с интерфейсом и работой в TRIK Studio:

    Отличительной особенностью является только элемент на панели редактирования модели мира.

    Редактирование модели мира

    Редактирование модели мира осуществляется с помощью соответствующей панели.

    Объект «gamepad»

    Служит для работы с программируемым пультом управления «».

    {
    "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") # отправка сообщения роботу с бортовым номер 1
    mailbox.send(1, "Hello"); // отправка сообщения роботу с бортовым номер 1
    //Подключение к 192.168.77.1, порту 8889 со сменой бортномера на 2
    mailbox.joinNetwork("", -1, 2)
    //Смена бортномера без подключения
    ,
    -
    1
    ,
    2
    );
    //Смена бортномера без подключения
    receive
    send

    Применимо к вещественным и целым значениям. Результат вещественный.

    //

    Целочисленное деление

    Применимо к целым значениям. Результат целый.

    ^

    Возведение в степень

    Применимо к вещественным и целым значениям. Результат вещественный.

    %

    Остаток от деления

    Применим к целым значениям. Результат целый.

    &

    Побитовое «и»

    Применимо к целым значениям. Результат целый.

    |

    Побитовое «или»

    Применимо к целым значениям. Результат целый.

    >>, <<

    Побитовые сдвиги вправо и влево

    Применимы к целым значениям. Результат целый.

    ..

    Конкатенация

    Применим к строковым значениям. Результат — строка.

    >=, >, <, <=

    Операции сравнения

    Применимы к целым и вещественным значениям. Результат булевый.

    ==

    Операция проверки равенства

    Применима к значениям любых типов. Результат булевый.

    ~=, !=, '~=', '!='

    Операция проверки неравенства

    Применима к значениям любых типов. Результат булевый. Альтернативные способы записи операции не различаются по смыслу.

    and, &&

    Логическое «и»

    Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются.

    or, ||

    Логическое «или»

    Применимо к целым, вещественным и булевым значениям. Результат булевый. Альтернативные способы записи операции по смыслу не различаются.

    Применим к строковым значениям. Результат целый.

    ​Title

    ​Title

    ​Title

    +

    Сложение

    Применимо к вещественным и целым значениям. Результат целый,

    если оба аргумента целые, иначе вещественный.

    -

    Вычитание

    Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.

    *

    Умножение

    Применимо к вещественным и целым значениям. Результат целый, если оба аргумента целые, иначе вещественный.

    /

    ​Title

    ​Title

    ​Title

    -

    Арифметический унарный минус

    Применим к целым и вещественным значениям. Результат целый или вещественный (в зависимости от типа аргумента).

    ~

    Побитовое «не»

    Применимо к целым значениям. Результат целый.

    not

    Логическое «не»

    Применимо к булевым, целым, вещественным и строковым значениям, результат булевый (0 или пустая строка считается false, всё остальное — true).

    #

    Оператор возврата значения
    Пустой оператор

    Деление

    Оператор взятия длины

    Метод

    Описание

    calibrate

    Вычисляет смещением нуля в течение указанного времени и инициализирует гироскоп этим параметром, сбрасывает текущие углы наклона.

    getCalibrationValues

    Возвращает объект, в котором содержатся необходимые данные о смещении нуля.

    isCalibrated

    Возвращает true в случае завершении калибровки, false — в противном случае.

    read

    Возвращает массив из семи элементов: угловые скорости по трем осям, время последнего замера, углы наклона по трем осям.

    readRawData

    Возвращает массив из трех элементов с угловыми скоростями по трем осям.

    setCalibrationValues

    Устанавливает объект, содержащий необходимые параметры о смещении нуля.

    Сигнал

    Описание

    calibrationFinished

    Сигнал, посылаемый сенсором после окончания калибровки.

    newData

    Сигнал, посылаемый сенсором, когда у него готовы новые данные.

    brick.gyroscope().calibrate(msec)
    getCalibrationVaules
    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

    Кубик

    Элемент «Кубик» позволяет создавать упражнения в виде игр-головоломок, в которой «Исполнителю» необходимо расставить ящики по обозначенным местам лабиринта.

    2D-модель
    «Кубик»

    Посылается, когда пользователь оторвал палец от области управления с указанным номером.

    Сбрасывает запомненные события от пульта.

    Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.

    Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство.

    Сигнал

    Описание

    Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.

    Посылается при подключении пульта к роботу.

    Посылается при отключении пульта.

    Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней.

    button

    Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта.

    buttonWasPressed

    Возвращает true, если на пульте была нажата кнопка с указанным номером. Сбрасывает запомненное нажатие для этой кнопки.

    Синтаксис

    В качестве параметра необходимо указать номер кнопки — от 1 до 5.

    Пример

    connected

    Посылается при подключении пульта к роботу.

    disconnect

    Посылается при отключении пульта.

    isPadPressed

    Возвращает, нажата ли в данный момент область управления на пульте. Области управления имеют номера 0 и 1.

    Синтаксис

    В качестве параметра необходимо указать номер области управления — 0 или 1.

    Пример

    pad

    Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней.

    padX

    Если указанная область управления на пульте нажата, возвращает текущую x-координату нажатия.

    Синтаксис

    В качестве параметра необходимо указать — номер области управления padId.

    padY

    Если указанная область управления на пульте нажата, возвращает текущую y-координату нажатия.

    Синтаксис

    В качестве параметра необходимо указать — номер области управления padId.

    padUp

    Посылается, когда пользователь оторвал палец от области управления с указанным номером.

    Синтаксис

    В качестве параметров необходимо указать:

    • padId — номер области управления.

    • x, y — координаты последнего известного нажатия от -100 до 100. Координата (-100, -100) соответствует левому верхнему углу области управления.

    reset

    Сбрасывает запомненные события от пульта.

    Синтаксис

    wheel

    Если на пульте включён «руль» (события от акселерометра устройства), возвращает текущий наклон пульта.

    Наклон кодируется числом от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.

    Синтаксис

    wheelEvent

    Посылается, когда на пульте включён «руль» (события от акселерометра устройства) и пользователь повернул устройство.

    Синтаксис

    В качестве параметра необходимо указать число от -100 до 100, -100 соответствует крайнему левому положению «руля», 100 — крайнему правому.

    Метод

    Описание

    buttonWasPressed

    Возвращает true, если на пульте была нажата кнопка с указанным номером.

    isPadPressed

    Возвращает, нажата ли в данный момент область управления на пульте.

    padX

    Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси X.

    padY

    TRIK Gamepad

    Если указанная область управления на пульте нажата, возвращает текущую координату нажатия по оси Y.

    встроенного программного обеспечения
    DiskImager
    встроенного программного обеспечения
    встроенного программного обеспечения
    Установка DiskImager
    Для смены языка выберите в меню «About» → «Language»
    show
    Пример программы с использованием функции getPhoto
    Распознавание меток ARTag
    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 -i
    fdisk -l
    umount /dev/{first partition}
    umount /dev/{second partition}
    ...
    umount /dev/sdb1
    fdisk /dev/{устройство}
    sudo fdisk /dev/sdb
    p
    d
    p
    n
    Command (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}: +2G
    Command (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}:
    p
    w
    sudo mkfs.ext4 /dev/{раздел}
    sudo mkfs.ext4 /dev/sdb1
    sudo mkfs.ext4 /dev/sdb2
    umount /dev/{first partition}
    umount /dev/sdb1
    sudo 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/sdb1
    def 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 bufPic
    function 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);
    padUp
    reset
    wheel
    wheelEvent
    button
    connected
    disconnect
    pad
    Кубик
    настраивать
    настраивать
    настраивать
    настраивать
    настраивать
    Картинка

    Сенсорные переменные для контроллера ТРИК

    Сенсорные переменные — зарезервированные переменные для получения показаний сенсоров, подключенных к соответствующим портам.

    Эти значения можно присваивать переменным и использовать в математических выражениях.

    Изменение переменных можно отследить по ходу программы в таблице переменных.

    Переменная

    Описание

    Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z.

    buttonDown

    buttonUp

    buttonEnter

    buttonEsc

    buttonPower

    buttonLeft

    buttonRight

    Состояние кнопок на корпусе контроллера ТРИК: «Вниз»,

    «Вверх»,

    «Ввод»,

    «Отмена», «Питание», «Влево»,

    «Вправо». Возможные значения: 0 — кнопка не нажата. 1 — нажатая кнопка.

    accelerometer

    Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z соответственно.

    Пример

    colorSensor

    Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.

    Обновляются только когда датчик цвета включён и инициализирован.

    Возможные значения

    От 0 до 255.

    Пример

    gamepadPad1, gamepadPad2

    Координаты нажатия активных областей на пульте.

    Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.

    Возможные значения

    От (-100, -100) до (100, 100), (-100, -100) — левый верхний угол активной области. (-101, -101) — если нажатия нет.

    gyroscope

    Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.

    Пример

    lineSensor

    Массив из трёх элементов, содержащий показания камеры в режиме датчика линии.Значения обновляются при включенном и инициализированном датчике.

    Настройки TRIK Studio

    Окно настроек

    Окно настроек TRIK Studio открывается выбором соответствующего пункта в :Настройки → Настройки....

    Интерфейс окна с настройками содержит две панели:

    1. Панель со списком вкладок с настройками:

    Объект «script»

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

    Поведение.

  • Разное.

  • Редактор.

  • Роботы.

  • Горячие клавиши.

  • 2. Панель с полями для редактирования настроек текущей вкладки. Кнопки «Импорт» и «Экспорт» внизу окна позволяют сохранить текущие настройки в файл и загрузить его на другом компьютере.

    Поведение

    Вкладка «Поведение»

    Пользовательский интрефейс

    • Язык — язык среды. После изменения требуется перезапуск TRIK Studio. Настройка «<Системный язык>» означает, что язык будет определяться по текущему языку операционной системы.

    Автоматизация

    • Автосохранение — возможность включить или выключить автосохранение открытого проекта, а также задать интервал автосохранения в секундах.

    • Жесты мышью — включить или выключить механизм распознавания жестов мышью.

    • Задержка после жеста — временной отрезок системного ожидания между выполнением жеста мышью и его исполнением. Задержка позволяет рисовать жест в несколько штрихов. Значение указывается в миллисекундах.

    • Проверять на наличие обновлений при старте — связываться при запуске с сервером обновлений и запускать автообновление при необходимости.

    Тач

    • Режим работы на тач-экране — включить оптимизацию пользовательского интерфейса для сенсорных экранов.

    Элементы интерфейса

    • Режим плавающих окон — открепляет окна для свободного передвижения.

    Разное

    Вкладка «Разное»

    Графика

    • Антиалиасинг — режим рисования линий со сглаживанием, улучшает внешний вид диаграмм за счёт незначительного снижения скорости работы системы.

    Прочее

    • Показывать сплешскрин — включить/выключить отображение стартового экрана с логотипом TRIK Studio.

    • Длина списка недавних проектов — сколько проектов показывать в пункте «Недавние проекты» меню «Файл».

    Изображения

    Какой набор иконок использовать для отображения диаграммы.

    Панель инструментов

    • Размер панели инструментов — задать размер кнопок на панели инструментов.

    Редактор

    Вкладка «Редактор»

    Шрифт

    • Использовать системный шрифт — заменить шрифт для отображения надписей на диаграмме по умолчанию на один из шрифтов, установленных в системе. Размеры надписей на блоках заданы жёстко, поэтому изменение шрифта может привести к наползанию надписей друг на друга, однако можно экспериментировать.

    Сетка

    • Показывать сетку — отображать выравнивающую сетку на сцене редактора диаграмм.

    • Выравнивание по сетке — осуществлять выравнивание блоков по сетке.

    • Показать направляющие — отображать направляющие линии на сцене редактора диаграмм. Направляющие линии появляются, когда блок находится на одной горизонтали или вертикали с другим блоком, и помогают выравнивать блоки на сцене.

    • Выравнивание по направляющим — осуществлять выравнивание блоков по направляющим.

    • Толщина сетки — толщина линий сетки. Настраивается в зависимости от яркости монитора или проектора.

    • Размер ячейки — размер одной ячейки сетки. Размер по умолчанию подобран так, чтобы блок накрывал четыре ячейки.

    Элементы

    • Размер области масштабирования — размер области, потянув за которую, можно изменить размер блока «Комментарий».

    Связи

    • Тип связей — режим рисования связей на диаграмме.

      • Ломаные линии — связи рисуются как ломаные с точками излома, которые добавляются пользователем.

      • Прямоугольные линии — связи рисуются как ломаные линии, каждый сегмент которых параллелен осям координат. Точки излома в этом случае добавляются системой автоматически.

      • Кривые Безье — связи рисуются как гладкие кривые, кривизна которых может быть задана пользователем.

    • Отступ связей-петель — насколько связь, входящая в тот же блок, из которого она исходит, должна отступать от блока.

    Встроенные линкеры

    • Размер — размер встроенного линкера, т.е. кружка рядом с блоком на диаграмме, осуществляющего создание связей между элементами (см. статью «Связи между блоками»).

    • Отступ — отступ встроенного линкера от пиктограммы блока.

    Палитра

    • Представление — выбор между режимом отображения иконок и названий или только иконок в палитре.

    • Количество иконок в строке — количество иконок на строку палитры при выбранном режиме «Иконки».

    Роботы

    Состав этой вкладки зависит от установленных подключаемых модулей поддержки платформ и от текущей выбранной платформы. Типовые элементы вкладки описаны ниже.

    Вкладка «Роботы»

    Платформа

    Конструктор, для которого пишутся программы в среде. От этой опции зависит список доступных блоков в палитре и доступных действий на панели инструментов.

    Модель робота

    Выбор типа модели исполнения для выбранного конструктора. В большинстве случаев это 2D-модель или реальный робот, но для некоторых конструкторов одна из моделей может быть недоступной, в этом случае этот пункт в окне не отображается.

    Картинка робота в 2D

    Внешний вид робота в 2D-модели.

    Настройки соединения

    Специфичные для конструктора настройки подключения к роботу, такие как IP-адрес робота для ТРИК или COM-порт Bluetooth-соединения для Lego NXT. Если соединение в выбранном режиме не требуется, данный пункт не отображается.

    Настройки сторонних программ

    Специфичные для конструктора настройки программ, непоставляемых в комплекте с TRIK Studio, которые должны быть установлены на компьютере. Для большинства режимов работы дополнительные установленные программы не нужны, так что соответствующие пункты не отображаются в окне.

    Настройка сенсоров

    Здесь указывается, какие сенсоры подключены к портам робота.

    Загрузка и запуск программ

    • Запуск после загрузки — запускать программу сразу после загрузки её на робот или нет. Применимо только для некоторых режимов некоторых конструкторов (например, для Lego NXT в режиме генерации).

    Интервалы обновления графиков

    • Сенсоры — интервал в миллисекундах, после которого добавляется новая точка с показанием сенсора.

    • Масштабирование — интервал в миллисекундах, после которого график автоматически изменяет свой масштаб, чтобы оптимально отобразить значения.

    • Текстовая информация — интервал в миллисекундах, после которого на графике обновляются надписи со значениями.

    Горячие клавиши

    Данная вкладка позволяет задать или изменить горячие клавиши для наиболее часто используемых действий. Для этого надо выбрать ячейку, соответствующую действию, и в строке «Сочетание» внизу окна нажать нужное сочетание клавиш.

    Кнопка «Очистить» удаляет сочетание клавиш из ячейки.

    Вкладка «Горячие клавиши»

    Все горячие клавиши, установленные по умолчанию, вы можете посмотреть в статье:

    Экспорт настроек

    TRIK Studio позволяет экспортировать текущие настройки в файл для загрузки их на другом компьютере. Для этого необходимо нажать кнопку «Экспорт» внизу окна.

    Импорт настроек

    TRIK Studio позволяет импортировать настройки из экспортированного ранее файла. Для этого необходимо нажать кнопку «Импорт» внизу окна и выбрать нужный файл .ini.

    главном меню
    Пункт «Настройки» в главном меню
    Горячие клавиши в TRIK Studio

    Устанавливает флаг событийно-ориентированной программы.

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

    Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу.

    Создаёт и возвращает таймер.

    Приостанавливает выполнение скрипта на переданное количество миллисекунд.

    Записывает строку в файл.

    quit

    Устанавливает флаг окончания работы для событийно-ориентированной программы. Как только будет завершён текущий обработчик события, исполнение скрипта закончится.

    Синтаксис

    script.quit()
    script.quit();	

    random

    Возвращает случайное число из заданного диапазона.

    Синтаксис

    В качестве параметров необходимо указать границы диапазона.

    Пример

    readAll

    Считывает всё содержимое указанного файла в массив строк.

    Синтаксис

    В качестве параметра необходимо указать название файла с расширением.

    Пример

    removeFile

    Удаляет указанный файл.

    Синтаксис

    В качестве параметра необходимо указать название файла с расширением.

    Пример

    run

    Устанавливает флаг событийно-ориентированной программы. По окончанию работы скрипт не выгружается из памяти, а продолжает ждать наступления событий до тех пор, пока какой-либо из обработчиков не вызовет метод «quit».

    Синтаксис

    system

    Выполняет переданную команду.

    Синтаксис

    В качестве параметра необходимо указать команду консоли операционной системы.

    Пример

    time

    Возвращает временной штамп — количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу.

    Синтаксис

    timer

    Создаёт и возвращает таймер (класс «QTimer»), посылающий сигнал timeout каждые n миллисекунд.

    Синтаксис

    В качестве параметра передаётся n .

    Пример

    wait

    Приостанавливает выполнение скрипта на переданное количество миллисекунд.

    Синтаксис

    В качестве параметра передаётся количество миллисекунд.

    Пример

    writeToFile

    Записывает сроку в файл.

    Синтаксис

    В качестве параметров необходимо указать название файла и записываемую строку.

    Пример

    Метод

    Описание

    quit

    Устанавливает флаг окончания работы для событийно-ориентированной программы.

    random

    Возвращает случайное число из заданного диапазона.

    readAll

    Считывает всё содержимое указанного файла в массив строк.

    removeFile

    Удаляет указанный файл.

    colorSensor

    Показания датчика цвета по видеокамере в центре кадра — интенсивность красного, зелёного и синего соответственно.

    Обновляются только когда датчик цвета включён и инициализирован.

    Возможные значения: 0 .. 255

    encoder1 encoder2 encoder3 encoder4

    Показания энкодеров на портах E1, E2, E3, E4 соответственно.

    gamepadButton1

    ...

    gamepadButton5

    Состояние кнопок на пульте с 1 по 5 соответственно. 0 — кнопка не нажата. 1 — кнопка нажата.

    gamepadConnected

    Состояние подключения пульта.

    0 — пульт не подключен. 1 — пульт подключен.

    gamepadPad1 gamepadPad2

    Координаты нажатия активных областей на пульте. Каждая переменная хранит в себе массив из двух элементов, соответствующих координате точки нажатия.

    Возможные значения: От (-100, -100) до (100, 100).

    (-101, -101) — если нажатия нет.

    gamepadPad1Pressed gamepadPad2Pressed

    Состояние нажатия на область левую и правую область пульта соответственно. Координаты нажатия можно узнать с помощью переменных gamepadPad1 и gamepadPad2. Возможные значения: 1 — активная область на пульте нажата. 0 — активная область на пульте не нажата.

    gamepadWheel

    Значение наклона пульта (если он подключён и на нём включён «руль»). Возможные значения: -100 ... 100.

    -101 — если данных о положении «руля» нет.

    -100 — крайнее левое положение. 100 — крайнее правое положение.

    gyroscope

    Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.

    lineSensor

    Массив из трёх элементов, содержащий показания камеры в режиме датчика линии. Значения обновляются при включенном и инициализированном датчике линии.

    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 (весь кадр распознан как линия).

    accelerometer

    Подключение к контроллеру ТРИК с помощью UART

    Подробная инструкция

    Кроме подключения контроллера ТРИК к компьютеру с помощью Wi-Fi, его можно подлючить через преобразователь интерфейса USB в интерфейс UART на базе чипа CP2102:

    Ниже описан алгоритм подключения.

    1. Установка драйверов

    2. Настройка COM-порта

    1. Установка драйверов

    1. с официального сайта производителя преобразователя: .

    2. Распакуйте архив и запустите установщик драйвера, соответствующий вашей операционной системе (32 или 64 бит).

    3. После окончания установки подключите преобразователь USB — UART к компьютеру (без контроллера). Дождитесь, пока устройство определится.

    4. Проверьте в «Диспетчере устройств», правильно ли установился драйвер.

    5. Если в «Диспетчере устройств» CP2102 USB to UART Bridge Controller отображается с восклицательным знаком, как на примере ниже, значит драйвер устройства не установлен. Повторите процедуру установки или обратитесь к специалисту.

    Если данное устройство в списке «Диспетчера устройств» отсутствует, проверьте работоспособность USB-порта и правильность установки устройства в USB-порт. При корректном подключении преоразователя на нем должен загореться красный светодиод «POWER».

    2. Настройка COM-порта

    1. В «Диспетчере Устройств» вызовите свойства Silicon Labs CP210x USB to UART Bridge (COMx).

    На вкладке «Параметры порта» установите:

    • Бит в секунду: 115200.

    • Управление потоком: Нет.

    По кнопке «Дополнительно» можно выбрать номер COM-порта, если это необходимо:

    3. Установка модема

    1. На панели управления выберите раздел «Телефон и модем».

    2. Введите любой телефонный код города и нажмите «ОК».

    3. На вкладке «Модемы» нажмите кнопку «Добавить».

    4. Выберите «Не определять тип модема (выбор из списка)» и нажмите «Далее».

    5. Выберите «Стандартные типы модемов» → «Последовательный кабель для соединения компьютеров» и нажмите «Далее».

    6. Выберите указанный ранее порт (в нашем примере — COM3), затем нажмите «Далее» и «Готово».

    4. Настройка модема

    1. Вновь на панели управления выберите «Телефон и модем» и перейдите на вкладку «Модемы».

    2. Выберите «Последовательный кабель для соединения компьютеров (COM3)» и нажмите кнопку «Свойства».

    3. Если параметры на вкладках «Модем» и «Дополнительные параметры связи» невозможно изменить,

    на вкладке «Общие» нажмите кнопку «Изменить параметры».

    4. На вкладке «Дополнительные параметры связи» нажмите кнопку «Изменить умолчания...»

    5. На вкладке «Общие» установите: – Скорость порта: 115200. – Управление потоком: Отсутствует.

    И нажмите «ОК».

    6. На вкладке «Модем» должны правильно отображаться COM-порт (COM3) и скорость соединения (115200).

    5. Создание сетевого подключения

    1. На панели управления выберите «Центр управления сетями и общим доступом».

    2. Затем «Настройка нового подключения или сети».

    3. Выберите «Настройка телефонного подключения» и нажмите «Далее».

    4. В поле «Набираемый номер» введите 1 и нажмите кнопку «Подключить».

    5. Затем выберите «Всё равно создать это подключение».

    6. Нажмите «Закрыть».

    6. Настройка сетевого подключения

    1. На панели управления выберите «Центр управления сетями и общим доступом», а затем нажмите «Изменение параметров адаптера».

    2. Зайдите в свойства «Телефонного подключения».

    3. На вкладке «Общие» в окне «Подключаться через» выберите «Последовательный кабель для соединения компьютеров (COMx)» и нажмите «Настроить».

    4. Выберите следующий параметр: – Наибольшая скорость: 115200.

    И уберите галочку «Аппаратное управление потоком». Нажмите «ОК».

    5. На вкладке «Параметры» нажмите на кнопку «Параметры PPP...»

    6. Уберите галочку «Использовать программное сжатие данных» и нажмите «ОК».

    7. На вкладке «Сеть» должен быть включен протокол «IPv4».

    7. Подключение к контроллеру

    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 для управления контроллером.

    Меню контроллера ТРИК

    Меню контроллера ТРИК состоит из шести разделов:

    1. Файлы — запуск и удаление программ.

    2. Тестирование — тестирование подключенных к контроллеру ТРИК устройств.

    3. Сеть — подключение контроллера ТРИК к другим устройствам.

    4. — взаимодействие нескольких контроллеров ТРИК.

    5. — выбор языка.

    6. — программирование на контроллере, настройки системы и информация о версии прошивки.

    Для работы с меню используйте кнопки контроллера.

    «Вверх», «Вниз», «Вправо», «Влево» — перемещение по меню. «Ввод» (галочка) — выбора раздела меню. «Выход» (крестик) — выход из подменю.

    Файлы

    Раздел «Файлы» предназначен для просмотра, запуска и удаления загруженных на контроллер программ.

    Запуск программы

    Для запуска программы нажмите кнопку «Ввод» (галочка).

    Удаление программы

    Для удаления программы нажмите кнопку «Вправо» и подтвердите удаление.

    Удаление всех программ

    Для удаления всех программы выберите пункт «Удалить всё...» и подтвердите удаление.

    Тестирование

    На контроллере ТРИК с помощью данного пункта меню можно протестировать подключенные устройства:

    1. Аналоговые датчики.

    2. Сервоприводы.

    3. Силовые моторы.

    4. Цифровые датчики.

    Подробнее смотрите в статье

    Сеть

    Данный раздел предназначен для настройки подключения контроллера к компьютеру или смартфону.

    В пункте «Сеть» вы можете подключить контроллер к компьютеру или смартфону в двух режимах:

    1. Wi-Fi точка доступа.

    2. Wi-Fi клиент.

    Подробнее смотрите в статье

    Взаимодействие

    В пункте «Взаимодействие» вы можете настроить параметры для взаимодействия контроллеров.

    Подробнее смотрите в статье

    Язык / Language

    Данный раздел позволяет выбрать язык меню контроллера ТРИК.

    1. Выберите требуемый язык и нажмите «Ввод». 2. После появления предупреждения о перезапуске контроллера нажмите еще раз кнопку «Ввод». 3. После перезагрузки язык сменится на выбранный.

    Ещё...

    Пункт меню «Ещё…» состоит из подпунктов:

    1. .

    2. .

    Программирование

    Раздел «Программирование» предназначен для написания программы на контроллере из готовых команд.

    1. Добавьте последовательно команды в алгоритм с помощью пункта .

    2. После завершения составления алгоритма выберите пункт .

    3. Для очистки алгоритма используйте пункт меню .

    Новая команда

    Пункт «<новая команда>» позволяет добавить команду в конец алгоритма.

    Выберите необходимую команду с помощью кнопок «Вверх» и «Вниз» и нажмите «Ввод».

    Добавляя последовательно команды в список, вы получите конечную программу.

    При добавлении в алгоритм команды «Моторы вперед» необходимо указать мощность.

    При добавлении в алгоритм команды «Таймер» необходимо указать время ожидания в миллисекундах.

    Запустить программу

    Пункт «Запустить программу» позволяет выполнить написанный алгоритм.

    Очистить список

    Пункт «Очистить список» позволяет удалить написанный алгоритм.

    Настройки системы

    В данном подразделе вы можете выбрать, что будет отображаться в папке «Файлы»:

    • Папка со скриптами. В данном случае будут отображаться только загруженные программы из TRIK Studio.

    • Файловая система.

    Версия ПО

    В данном подразделе вы можете посмотреть версию прошивки и MAC-адрес.

    script.random(min, max)
    script.random(min, max);
    a = script.random(0, 10) # случайное число от 0 до 10
    var a = script.random(0, 10); // случайное число от 0 до 10
    script.readAll("fileName")
    script.readAll("fileName");
    lines = script.readAll("input.txt") # считывает текстовый файл input.txt
    var lines = script.readAll("input.txt"); // считывает текстовый файл input.txt
    script.removeFile("fileName")
    script.removeFile("fileName");
    script.removeFile("file.txt"); # удалить файл file.txt
    script.removeFile("file.txt"); // удалить файл file.txt
    script.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.t
    script.writeToFile("output.txt", "Hello, world"); // записать «Hello, world» в файл output.t
    x = accelerometer[0]; -- показания акселерометра по оси X
    y = accelerometer[1]; -- показания акселерометра по оси Y
    z = accelerometer[2]; -- показания акселерометра по оси Z
    r = 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 (градусы)
    run
    system
    time
    timer
    wait
    writeToFile

    Энкодеры.

  • Гироскоп.

  • Акселерометр.

  • Взаимодействие
    Язык / Language
    Ещё…
    Тестирование подключенных к контроллеру ТРИК устройств
    Подключения по Wi-Fi к контроллеру ТРИК
    Взаимодействие контроллеров ТРИК
    Программирование
    Настройки системы
    Версия ПО.
    «<новая команда>»
    «Запустить программу»
    «Очистить список»
    Установка модема
    Настройка модема
    Создание сетевого подключения
    Настройка сетевого подключения
    Подключение к контроллеру
    Скачайте драйвера
    silabs.com
    веб-интерфес

    Объект «brick»

    Объект «brick» представляет контроллер ТРИК и предоставляет доступ к устройствам робота.

    Метод
    Описание

    Предоставляет доступ к акселерометру.

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

    Предоставляет доступ к датчику цвета по видеокамере.

    Предоставляет доступ к дисплею робота.

    accelerometer

    Предоставляет доступ к акселерометру (класс «»).

    Синтаксис

    battery

    Предоставляет доступ к информации об аккумуляторе.(класс «»).

    Синтаксис

    colorSensor

    Предоставляет доступ к датчику цвета по видеокамере (класс «»).

    Синтаксис

    display

    Предоставляет доступ к дисплею робота (класс «»).

    Синтаксис

    encoder

    Предоставляет доступ к энкодеру на указанном порту (класс «»).

    Синтаксис

    В качестве параметра необходимо указать порт.

    Пример

    getStillImage

    Получить фотографию с камеры в виде массива байт.

    Синтаксис

    gyroscope

    Предоставляет доступ к гироскопу (класс «»).

    Синтаксис

    keys

    Предоставляет доступ к кнопкам на корпусе робота (класс «»).

    Синтаксис

    led

    Предоставляет доступ к светодиоду на корпусе робота (класс «»).

    Синтаксис

    lineSensor

    Предоставляет доступ к датчику линии по видеокамере (класс «»).

    Синтаксис

    motor

    Предоставляет доступ к мотору (силовому или сервомотору) на указанном порту (класс «»).

    Синтаксис

    В качестве параметра необходимо указать порт.

    Пример

    objectSensor

    Предоставляет доступ к датчику объекта по видеокамере (класс «»).

    Синтаксис

    playSound

    Проиграть звуковой файл.

    Синтаксис

    В качестве параметра необходимо указать имя файла с абсолютным путем или путем относительно папки trik на контроллере.

    Внимание! Файл должен быть предварительно загружен на контроллер.

    Пример

    playTone

    Проиграть звук с заданной частотой.

    Синтаксис

    В качестве параметров необходимо указать частоту звука frequency и время time в мс, в течение которого необходимо проигрывать звук.

    Пример

    say

    Произнести строку (на русском или английском языке).

    Синтаксис

    В качестве параметра необходимо указать строку на английском или русском языке.

    Пример

    sensor

    Предоставляет доступ к сенсору на указанном порту (класс «»).

    Синтаксис

    В качестве параметра необходимо указать порт.

    Пример

    stop

    Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.

    Синтаксис

    marker

    Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели (класс «»)

    Синтаксис

    irCamera

    Предоставляет доступ к инфракрасному датчику (класс «»).

    Синтаксис

    encoder

    Предоставляет доступ к энкодеру на указанном порту.

    getStillImage

    Получить фотографию с камеры в виде массива байт.

    gyroscope

    Предоставляет доступ к гироскопу.

    keys

    Предоставляет доступ к кнопкам на корпусе робота.

    playSound

    Проиграть звуковой файл.

    playTone

    Проиграть звук с заданной частотой.

    led

    Предоставляет доступ к светодиоду на корпусе робота.

    lineSensor

    Предоставляет доступ к датчику линии по видеокамере.

    motor

    Предоставляет доступ к мотору на указанном порту.

    objectSensor

    Предоставляет доступ к датчику объекта по видеокамере.

    say

    Произнести переданную как параметр строку (на русском или английском языке).

    sensor

    Предоставляет доступ к сенсору на указанном порту.

    stop

    Останавливает все моторы и активные датчики, убирает нарисованное на дисплее.

    marker

    Предоставляет доступ к рисованию маркером заданного цвета на полу. Доступен только в режиме двумерной модели.

    irCamera

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

    Accelerometer
    Battery
    ColorSensor
    Display
    Encoder
    Gyroscope
    Keys
    Led
    LineSensor
    Motor
    ObjectSensor
    Sensor
    Marker
    IrCamera
    accelerometer
    battery
    colorSensor
    display
    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") # вызов энкодера на порту E2
    brick.encoder(E1); // вызов энкодера на порту E1
    brick.encoder("E2"); // вызов энкодера на порту E2
    brick.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") # вызов мотора на порту M2
    brick.motor(M1) // вызов мотора на порту M1
    brick.motor("M2") // вызов мотора на порту M2
    brick.objectSensor()
    brick.objectSensor();
    brick.playSound("filename")
    brick.playSound("filename");
    brick.playSound("media/sound.mp3") # проиграть файл sound.mp3 из папки media
    brick.playSound("media/sound.mp3"); // проиграть файл sound.mp3 из папки media
    brick.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") # вызов сенсора на порту A2
    brick.sensor(A1) // вызов сенсора на порту A1
    brick.sensor("A2") // вызов сенсора на порту A2
    brick.stop()
    brick.stop();
    brick.marker()
    brick.marker();
    brick.irCamera()
    brick.irCamera();

    Общие блоки

    Список доступных блоков зависит от выбранной платформы и от модели робота (реальный робот или двумерная модель). При этом недоступные для данной платформы блоки не показываются вообще, а недоступные для данной модели в рамках одной платформы блоки показываются в палитре серым и недоступны для перетаскивания на сцену.

    Недоступные блоки для 2D-модели выделены серым

    Общие блоки для всех платформ представлены ниже. Программа, использующая только эти блоки, будет исполняться на любой платформе без каких-либо правок.

    Список блоков, специфичных для конкретного конструктора, можно найти в соответствующих разделах:

    • ТРИК

    Все общие блоки

    Начало

    Начальная точка выполнения программы.

    На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

    Процесс интерпретации диаграммы начинается именно с этого блока.

    Конец

    Конец программы.

    Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.

    У данного блока не может быть исходящих связей.

    Инициализация переменной

    Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «», но этот блок делает программу понятнее.

    Свойства

    Условие

    Разделение выполнения программы в соответствии с заданным условием.

    У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».

    Свойства

    Конец условия

    Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «» или «» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов goto.

    Цикл с предусловием

    Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

    Свойства

    Цикл

    Блок, организующий выполнение последовательности блоков несколько раз. Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз. Бесконечные циклы и циклы вида while/do и while организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «».

    Выбор

    Условие с несколькими альтернативами. В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.

    Выражение

    Считает значение заданного выражения. Также допускается инициализация переменных. Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «».

    Подпрограмма

    Вызов подпрограммы. Подпрограммы используются для вынесения повторяющихся фрагментов программы на отдельную диаграмму. При добавлении этого блока на диаграмму будет предложено ввести имя подпрограммы, после чего двойным кликом на блоке можно будет перейти на диаграмму, соответствующую данной подпрограмме. Также появится дополнительная палитра со всеми подпрограммами. Подпрограммы из неё можно перетаскивать на сцену и использовать как обычные блоки. Вид, имя и свойства блока можно изменить с помощью контекстного меню.

    Свойства

    Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».

    В открывшемся окне вы можете:

    • Изменить имя подпрограммы.

    • Добавить и изменить параметры подпрограммы, задав имя, тип и значение.

    • Изменить картинку на иконке вашей подпрограммы.

    • Изменить фон иконки подпрограммы.

    Параллельные задачи

    Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала. Блок должен иметь хотя бы две исходящие связи. Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «» или в блоке «») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — main.

    Слияние задач

    Блок слияния параллельных задач. Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока. Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.

    Завершить задачу

    Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

    Случайное число

    Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.

    Комментарий

    Блок для добавления на диаграмму произвольного текста в качестве комментария.

    Используется для пояснения конкретного блока или участка диаграммы. Может быть связан с блоком, который он поясняет.

    При выполнении программы блок не учитывается.

    Таймер

    Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.

    Опустить маркер

    Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.

    Блок доступен только в режиме двумерной модели.

    Поднять маркер

    Закончить рисование маркером.

    Блок доступен только в режиме двухмерной модели.

    Класс «display»

    Предоставляет доступ к дисплею робота.

    Размер экрана: 240*320 пикселей.

    Метод

    Описание

    Вывести на экран указанный текст, начиная с указанной координаты.

    addLabel

    Вывести на экран указанный текст в указанные координаты. Если в указанных координатах уже был текст, он будет заменён новым.

    Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать:

    • text — выводимый текст,

    • x, y — координаты экрана.

    • size – размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).

    Пример

    clear

    Очистить окно для рисования.

    drawArc

    Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать:

    • x, y — координаты левого верхнего угла прямоугольника на экране,

    • l — ширина прямоугольника,

    • h — высота прямоугольника,

    Пример

    drawEllipse

    Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать:

    • x, y — координаты левого верхнего угла прямоугольника,

    • l — ширина прямоугольника,

    • h — высота прямоугольника,

    Пример

    drawLine

    Нарисовать линию с началом и концом в заданных координатах. Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать:

    • x0, y0 — координаты начала линии,

    • x1, y1 — координаты конца линии.

    Пример

    drawPoint

    Нарисовать точку в заданных координатах. Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать координаты точки x, y.

    Пример

    drawRect

    Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Изменения на дисплее произойдут только после вызова метода «».

    В качестве параметров необходимо указать:

    • x, y — координаты левого верхнего угла прямоугольника,

    • l — ширина прямоугольника,

    • h — высота прямоугольника,

    Пример

    hide

    Закрыть и очистить окно для рисования.

    redraw

    Перерисовать окно для рисования. Изменения на дисплее произойдут только после вызова этого метода.

    removeLabels

    Удалить с экрана весь текст, добавленный на него вызовами метода «».

    setBackground

    Установить фон экрана в указанный цвет.

    Возможные цвета:

    • white,

    • red, darkRed,

    • green, darkGreen,

    • blue, darkBlue,

    В качестве параметра необходимо указать цвет.

    Пример

    setPainterColor

    Установить цвет кисти, которой рисуются графические примитивы.

    Возможные цвета:

    • white,

    • red, darkRed,

    • green, darkGreen,

    • blue, darkBlue,

    В качестве параметра необходимо указать цвет.

    Пример

    setPainterWidth

    Установить толщину кисти, которой рисуются графические примитивы, в пикселях.

    В качестве параметра необходимо указать толщину d.

    Пример

    show

    Вывести на дисплей контроллера изображение, преобразованное из однородного массива данных.

    Параметры:

    • array — одномерный целочисленный массив, имеющий размеры width×height

    • width и height — ширина и высота изображения соответственно

    Пример

    Примеры использования show() на изображении, снятом с использованием функции .

    showImage

    Вывести на экран изображение, предварительно загруженное на робот.

    В качестве параметра необходимо указать имя файла с изображением (в форматах 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.

  • В качестве параметра format необходимо передать формат, в котором представлен каждый элемент массива. Сейчас поддержаны форматы: «rgb32», «grayscale8», «rgb888».

    Очистить окно для рисования.

    drawArc

    Нарисовать дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.

    drawEllipse

    Нарисовать эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.

    drawLine

    Нарисовать линию с началом и концом в заданных координатах.

    drawPoint

    Нарисовать точку в заданных координатах.

    drawRect

    Нарисовать прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.

    hide

    Закрыть и очистить окно для рисования.

    redraw

    Перерисовать окно для рисования. Изменения в окне произойдут только после вызова этого метода.

    removeLabels

    Удалить с экрана весь текст, добавленный на него вызовами метода «addLabel».

    setBackground

    Установить фон экрана в указанный цвет.

    setPainterColor

    Установить цвет кисти, которой рисуются графические примитивы.

    setPainterWidth

    Установить толщину кисти, которой рисуются графические примитивы, в пикселях.

    show

    Вывести на дисплей контроллера изображение, сформированное в одномерном массиве.

    showImage

    Вывести на экран изображение, предварительно загруженное на робот.

    redraw
    redraw
    redraw
    redraw
    redraw
    redraw
    addLabel
    getPhoto()
    addLabel
    clear
    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");

    Разделение выполнения программы в соответствии с заданным условием.

    Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.

    Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

    Блок, организующий выполнение последовательности блоков несколько раз.

    Условие с несколькими альтернативами.

    Считает значение заданного выражения. Также допускается инициализация переменных.

    Вызов подпрограммы.

    Блок разделяет выполнение программы на несколько потоков.

    Блок слияния параллельных задач.

    Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

    Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.

    Блок для добавления на диаграмму произвольного текста в качестве комментария.

    Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.

    Начать рисование маркером заданного цвета на полу. При движении робота в двумерной модели за ним будет оставаться цветная линия.

    Закончить рисование маркером.

    Вид

    Название

    Описание

    Начало

    Начальная точка выполнения программы.

    На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

    Процесс интерпретации диаграммы начинается именно с этого блока.

    Конец

    Конец программы.

    Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.

    У данного блока не может быть исходящих связей.

    Инициализация переменной

    Блок для объявления новой переменной и задания ей значения.

    Свойство

    Описание

    Значение

    Указывается выражение, определяющее начальное значение переменной.

    Переменная

    Указывается имя переменной.

    Свойство

    Описание

    Условие

    Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.

    Свойство

    Описание

    Условие

    Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.

    LEGO EV3
    LEGO NXT
    Квадрокоптер Геоскан Пионер
    Выражение
    Условие
    Выбор
    Условие
    Синтаксис выражений
    Синтаксис выражений
    Завершить задачу
    Слияние задач
    Начало
    Конец
    Инициализация переменной
    Условие
    Конец условия
    Цикл с предусловием
    Цикл
    Выбор
    Выражение
    Подпрограмма
    Параллельные задачи
    Слияние задач
    Завершить задачу
    Случайное число
    Комментарий
    Таймер
    Опустить маркер
    Поднять маркер

    Условие
    Конец условия
    Цикл с предусловием
    Цикл
    Выбор
    Выражение
    Подпрограмма
    Параллельные задачи
    Слияние задач
    Завершить задачу
    Случайное число
    Комментарий
    Таймер
    Опустить маркер
    Поднять маркер

    2D-модель

    Интерактивный режим имитационного моделирования — отличительная особенность 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. Действия — блоки, выполняющие какое-либо действие на контроллере: включение моторов, проигрывание звука и т. д.

    2. Ожидания — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.

    3. Рисования — блоки, используемые для вывода графики и текста на экран.

    Блоки, доступные для всех платформ см. в статье

    Блоки действия

    Отправить сообщение в задачу

    Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке ). В качестве сообщения может быть любое выражение.

    Получить код кнопки

    Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».

    Играть звук

    Проигрывает на контроллере звук с заданной частотой и длительностью.

    Играть звуковой файл

    Проиграть на контроллере заданный звуковой файл. Файл должен быть заранее загружен на контроллер. Путь до файла указывается относительно папки trik на контроллере. Загрузить файл на контроллер можно, например, с помощью программы .

    Моторы вперёд

    Включить моторы по заданным портам с заданной мощностью. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми. Мощность задается в процентах числом от -100 до 100. Если задано отрицательное значение, мотор включается в режиме реверса.

    Моторы назад

    Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока .

    Моторы стоп

    Выключить моторы по заданным портам. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми.

    Сбросить показания энкодера

    Сбросить показания количества оборотов моторов по указанным портам. Порты задаются строками E1, E2, E3 и E4, разделенными запятыми.

    Угловой сервомотор

    Установить валы угловых сервомоторов на указанных портах в указанное положение (в градусах, от -90 до 90). Порты задаются строками, разделенными запятыми.

    Сказать

    Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

    Светодиод

    Установить указанный цвет светодиода на корпусе контроллера.

    Системный вызов

    Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.

    Включить видеокамеру

    Включить видеокамеру на контроллере в одном из трёх режимов:

    1. Сенсор линии — детектирует цветную линию в центре кадра и в дальнейшем возвращает отклонение центра линии от центра кадра, как число в интервале от -100 (влево) до 100 (вправо).

    2. Сенсор объекта — детектирует контрастный объект в центре кадра и в дальнейшем возвращает координаты его центра и диаметр в пикселях.

    3. Сенсор цвета — возвращает доминирующий цвет в центре кадра в виде его координат в цветовой шкале RGB.

    Детектировать по камере

    Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта. Камера должна быть включена в соответствующем режиме блоком .

    Датчик линии в переменную

    Помещает текущее показание датчика линии в указанную переменную. Камера должна быть включена в режиме датчика линии блоком и инициализирована блоком .

    Запустить видеотрансляцию

    Запускает видеотрансляцию на роботе. Видео может быть просмотрено на пульте управления ТРИК или в браузере по адресу вида: {ip-адрес робота}:8080/?action=stream/.

    Послать сообщение

    Отправляет данное сообщение роботу с данным бортовым номером. Робот должен быть в той же сети, что и робот, отправляющий сообщение, и зарегистрирован как ведущий или ведомый с помощью меню Настройки → Сообщения на роботе. Если роботов с данным бортовым номером в сети несколько, сообщение получат все они.

    Записать в файл

    Записывает значение данного выражения в заданный файл на роботе. Путь до файла может быть абсолютным или относительно папки с trik-studio.exe. Файл можно получить с контроллера, например, с помощью программы для Windows или scp для Linux.

    Удалить файл

    Удаляет заданный файл на роботе. Путь до файла может быть абсолютным или относительно папки с trik-studio.exe.

    Выключить видеокамеру

    Выключает видеокамеру.

    Отключить видеотрансляцию

    Останавливает видеотрансляцию с камеры робота.

    Калибровка гироскопа

    Устанавливает гироскоп в 0 в текущей позиции.

    Join network

    Устанавливает соединение между роботами и объединяет их в одну сеть. Имеет 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 (максимально вправо). Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра «Угол».

    Ждать отключения пульта

    Ждать, пока пульт не отключится от робота. Если пульт не подключен, программа продолжит выполнение.

    Ждать подключения пульта

    Ждать, пока к роботу не подключится пульт. Если пульт уже подключен, программа продолжит выполнение.

    Блоки рисования

    Цвет кисти

    Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.

    Ширина кисти

    Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

    Нарисовать точку

    Нарисовать на экране точку в указанных координатах.

    Нарисовать линию

    Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

    Нарисовать прямоугольник

    Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.

    Нарисовать эллипс

    Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

    Нарисовать дугу

    Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.

    Смайлик

    Нарисовать на экране смайлик.

    Грустный смайлик

    Нарисовать на экране грустный смайлик.

    Цвет фона

    Задаёт цвет фона экрана.

    Напечатать текст

    Печатает заданную строку в заданном месте на экране робота.

    Свойства

    Как вывести текст на экран?

    Для вывода текста:

    1. В свойстве «Текст» напишите нужный текст.

    2. Уберите галочку в свойстве «Вычислять».

    Как вывести значение переменной на экран?

    Для вывода значения переменной:

    1. В свойстве «Текст» напишите имя переменной.

    2. Поставьте галочку в свойстве «Вычислять».

    Очистить экран

    Стереть всё, что нарисовано на экране.

    Гибкая настройка 2D-модели

    Помимо создания роботов в TRIK Studio, можно делать более гибкую настройку при помощи редактирования XML-файла: указывать точнее расположения объектов, цвет, ширину и другие параметры.

    Для начала необходимо XML-файл виртуальной модели.

    Система координат в 2D-модели

    В отладке 2D-модели оси расположены следующим образом:

    Проиграть на контроллере заданный звуковой файл.

    Включить моторы по заданным портам с заданной мощностью.

    Включить моторы в режиме реверса по заданным портам с заданной мощностью.

    Выключить моторы по заданным портам.

    Сбросить показания количества оборотов моторов по указанным портам.

    Установить валы угловых сервомоторов на указанных портах в указанное положение

    Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

    Установить указанный цвет светодиода на корпусе контроллера.

    Блок имеет логический параметр «Код». Если он имеет значение «Истина», содержимое параметра «Команда» генерируется напрямую в текст программы при генерации этого блока. Если «Ложь», генерируется вызов консольной команды операционной системы.

    Включить видеокамеру на контроллере в одном из трёх режимов.

    Выключить видеокамеру.

    Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта.

    Помещает текущее показание датчика линии в указанную переменную.

    Запускает видеотрансляцию на роботе.

    Останавливает видеотрансляцию с камеры робота.

    Отправляет данное сообщение роботу с данным бортовым номером.

    Записывает значение данного выражения в заданный файл на роботе.

    Удаляет заданный файл на роботе.

    Устанавливает гироскоп в 0 в текущей позиции.

    Устанавливает соединение между роботами и объединяет их в одну сеть.

    Ждать срабатывания датчика касания на указанном порту.

    Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным значением в параметре «Проценты».

    Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо со значением, указанным в параметре «Расстояние».

    Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра «Расстояние».

    Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра «Предел оборотов».

    Ждать, пока не будет нажата указанная кнопка на корпусе робота.

    Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную.

    Ждать нажатия на кнопку на пульте, подключённом к роботу.

    Ждать нажатия на одну из двух активных областей пульта, подключённого к роботу.

    Ждать нужного наклона пульта, подключённого к роботу.

    Ждать, пока пульт не отключится от робота. Если пульт не подключен, программа продолжит выполнение.

    Ждать, пока к роботу не подключится пульт. Если пульт уже подключен, программа продолжит выполнение.

    Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

    Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.

    Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

    Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.

    Нарисовать на экране смайлик.

    Нарисовать на экране грустный смайлик.

    Задаёт цвет фона экрана.

    Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.

    Стереть всё, что нарисовано на экране.

    Вид

    Название

    Описание

    Отправить сообщение в задачу

    Отправляет данное сообщение в параллельную задачу с заданным идентификатором.

    Получить код кнопки

    Сохраняет в указанную переменную код нажатой на роботе кнопки.

    Играть звук

    Проигрывает на контроллере звук с заданной частотой и длительностью.

    Вид

    Название

    Описание

    Получить сообщение из другой задачи

    Ждать получения сообщения из другой параллельной задачи.

    Пользовательский ввод

    Ждать ввода значения от пользователя.

    Ждать гиродатчик

    Ждать, пока значение, возвращаемое гиродатчиком на указанном порту, не будет сравнимо с указанным в значении параметра «градусы».

    Свойство

    Описание

    Переменная

    Имя переменной.

    По умолчанию

    Значение переменной по умолчанию.

    Текст

    Описание поля ввода.

    Программа

    Исполнение программы

    Вид

    Название

    Описание

    Цвет кисти

    Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.

    Ширина кисти

    Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

    Нарисовать точку

    Нарисовать на экране точку в указанных координатах.

    Свойство

    Значение

    Вычислять

    Истина — вывод на экран значения переменной или выражения.

    Ложь — вывод на экран текста.

    Текст

    Текст / имя переменной (выражение) для вывода на экран.

    Обновить картинку

    Истина — обновить экран. Ложь — не обновлять экран.

    X, Y

    Координаты начала текста.

    Размер

    Размер шрифта в пикселях (необязательный параметр, по-умолчанию шрифт размером 20 пикселей).

    Общие блоки
    «Параллельные задачи»
    WinSCP
    «Моторы вперёд»
    «Включить видеокамеру»
    «Включить видеокамеру»
    «Детектировать по камере»
    WinSCP
    «gamepadPad»
    Отправить сообщение в задачу
    Получить код кнопки
    Играть звук
    Играть звуковой файл
    Моторы вперед
    Моторы назад
    Моторы стоп
    Сбросить показания энкодера
    Угловой сервомотор
    Сказать
    Светодиод
    Системный вызов
    Включить видеокамеру
    Детектировать по камере
    Датчик линии в переменную
    Запустить видеотрансляцию
    Послать сообщение
    Записать в файл
    Удалить файл
    Выключить видеокамеру
    Отключить видеотрансляцию
    Калибровка гироскопа
    Join network
    Получить сообщение из другой задачи
    Пользовательский ввод
    Ждать гиродатчик
    Ждать датчик касания
    Ждать свет
    Ждать УЗ датчик расстояния
    Ждать ИК датчик расстояния
    Ждать энкодер
    Ждать нажатия кнопки
    Получить сообщение
    Ждать кнопки на пульте
    Ждать нажатия на пульт
    Ждать «руля» на пульте
    Ждать отключения пульта
    Ждать подключения пульта
    Цвет кисти
    Ширина кисти
    Нарисовать точку
    Нарисовать линию
    Нарисовать прямоугольник
    Нарисовать эллипс
    Нарисовать дугу
    Смайлик
    Грустный смайлик
    Цвет фона
    Напечатать текст
    Очистить экран

    Внимание! Одна клетка имеет размеры 17,5×17,5 сантиметров или 50×50 пикселей.

    Создание XML-файла

    Для создания пустого XML-файла используйте стандартные средства вашей операционной системы.

    Для сохранения нарисованной в TRIK Studio модели мира:

    1. Перейдите в режим 2D.

    2. Перейдите в «Режим отладки».

    3. Нажмите правой кнопкой мыши на сцену и в появившемся контекстном меню выберите «Сохранить модель мира…».

    4. Укажите место сохранения и имя файла.

    Редактирование XML-файла

    Откройте сохраненный XML-файл в любом текстовом редакторе. Например, Notepad++.

    XML-файл состоит из тегов и атрибутов.

    Теги

    Тег — это элемент языка разметки. Существует начальный (открывающий) и конечный (закрывающий) тег. Текст, содержащийся между начальным и конечным тегом, отображается и размещается в соответствии со свойствами, указанными в начальном теге.

    Например:

    Атрибуты

    Атрибуты — это свойства тега, дающие дополнительные возможности форматирования текста. Они записываются в виде сочетания «имя атрибута — значение». Текстовые значения заключаются в кавычки.

    В вышеуказанном примере атрибутами являются:

    begin="200:-200" id="{a3ede76b-1d7e-4c72-9ed4-08d8ea9af4bf}" end="200:150"

    Самая простая виртуальная модель мира без объектов в формате .xml выглядит следующим образом:

    Роботы

    Для описания роботов имеются следующие теги:

    Тег

    Описание

    Определяет робота на сцене. Используется как контейнер и должен содержать элемент .

    Добавляет робота на сцену. Может использоваться как контейнер.

    Определяет датчики на роботе. Используется как контейнер.

    Конфигурация портов датчиков.

    Определяет стартовое положение робота.

    <robots>...</robots>

    Определяет робота на сцене. Используется как контейнер, атрибутов не имеет.

    <robot>...</robot>

    Добавляет робота на сцену. Может использоваться как контейнер.

    Внимание! В TRIK Studio нельзя добавить несколько роботов на сцену.

    Атрибуты

    Атрибут

    Описание

    direction="0″

    Направление робота, которое можно регулировать, нажав на робота и потянув за стрелку.

    position="x:y"

    Положение робота, где x, y — положение левой верхней точки квадрата робота в .

    id="trikKitRobot"

    Уникальный идентификатор.

    Пример

    <sensors>...</sensors>

    Определяет датчики на роботе. Используется как контейнер, атрибутов не имеет.

    <sensor/>

    Конфигурация портов датчиков.

    Атрибуты

    Атрибут

    Описание

    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

    Пример

    <startPosition/>

    Определяет стартовое положение робота.

    Атрибуты

    Атрибут

    Описание

    id="{name}"

    Уникальный идентификатор.

    direction="0″

    Направление робота, если нажать на кнопку «вернуть». Чтобы отрегулировать, нажмите на крестик и потяните за стрелку.

    x="25″

    Положение по оси x в .

    y="25″

    Положение по оси y в .

    Пример

    <wheels/>

    Конфигурация портов моторов.

    Атрибуты

    Атрибут

    Описание

    left="M4###output###М4###"

    Порт, к которому подключен левый двигатель.

    right="M3###output###М3###"

    Порт, к которому подключен правый двигатель.

    Пример

    Объекты

    Для описания объектов имеются следующие теги:

    Тег

    Описание

    walls

    Определяет стены. Используется как контейнер, атрибутов не имеет.

    skittles

    Определяет банки. Используется как контейнер, атрибутов не имеет.

    balls

    Определяет мячи. Используется как контейнер, атрибутов не имеет.

    colorFields

    Определяет элементы, которые вы можете нарисовать (линию, кривую Безье, прямоугольник, эллипс, элементы, нарисованные с помощью стилуса). Используется как контейнер, атрибутов не имеет.

    images

    Определяет вставленную картинку. Используется как контейнер, атрибутов не имеет.

    <wall>

    Добавляет на сцену стену.

    Атрибуты

    Атрибут

    Описание

    id="{name}"

    Уникальный идентификатор.

    begin="x:y"

    Начало стены, где x, y — положение начальной точки в .

    end="x:y"

    Конец стены, где x, y — положение конечной точки в .

    Пример

    <skittle>

    Добавляет банку на сцену.

    Атрибуты

    Атрибут

    Описание

    markerY="44″

    Позиция, на которую встанет банка по оси Y, если нажать на кнопку «вернуть».

    markerX="220″

    Позиция, на которую встанет банка по оси X, если нажать на кнопку «вернуть».

    id="{name}"

    Уникальный идентификатор.

    y="44″

    Положение по оси Y.

    x="220″

    Положение по оси X.

    Пример

    <ball>

    Добавляет мяч на сцену.

    Атрибуты

    Атрибут

    Описание

    markerY="169″

    Позиция, на которую встанет мяч по оси Y, если нажать на кнопку «вернуть».

    markerX="-18″

    Позиция, на которую встанет мяч по оси X, если нажать на кнопку «вернуть».

    id="{name}"

    Уникальный идентификатор.

    y="169″

    Положение по оси Y.

    x="-18″

    Положение по оси X.

    Пример

    <line>

    Добавляет линию на сцену.

    Атрибуты

    Атрибут

    Описание

    begin="x:y"

    Начало линии, где x, y — положение начальной точки в .

    end="x:y"

    Конец линии, где x, y — положение конечной точки в .

    id="{name}"

    Уникальный идентификатор.

    stroke-width="6″

    Ширина линии.

    fill="#ff000000″

    Цвет заливки линии.

    Пример

    <cubicBezier>

    Добавляет кривую Безье.

    Атрибуты

    Атрибут

    Описание

    cp1="x:y"

    Маркер, задающий изгиб кривой.

    cp2="x:y"

    Маркер, задающий изгиб кривой.

    stroke-style="solid"

    Вид кривой Безье. Виды кривой Безье аналогичны видам линии.

    begin="x:y"

    Начало кривой Безье, где x, y — положение начальной точки в .

    end="x:y"

    Конец кривой Безье, где x, y — положение конечной точки в системе координат.

    Пример

    <rectangle>

    Добавляет прямоугольник.

    Атрибуты

    Атрибут

    Описание

    stroke-style="solid"

    Вид границ прямоугольника. Виды прямоугольника аналогичны видам линии.

    begin="x:y"

    Начало прямоугольника, где x, y — положение начальной точки в .

    end="x:y"

    Конец прямоугольника, где x, y — положение конечной точки в .

    id="{name}"

    Уникальный идентификатор.

    fill-style="none"

    Заливка. По умолчанию стоит «none». Заполненный прямоугольник будет со значением «solid».

    Пример

    <ellipse>

    Добавляет эллипс.

    Атрибуты

    Атрибут

    Описание

    stroke-style="solid"

    Вид границ эллипса. Виды эллипса аналогичны видам линии.

    begin="x:y"

    Начало эллипса, где x, y — положение начальной точки в .

    end="x:y"

    Конец эллипса, где x, y — положение конечной точки в .

    id="{name}"

    Уникальный идентификатор.

    fill-style="none"

    Заливка. По умолчанию стоит «none». Заполненный эллипс — будет со значением «solid».

    Пример

    <stylus>

    Определяет стилус для рисования.

    Атрибуты

    Атрибут

    Описание

    stroke-style="solid"

    Вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии.

    id="{name}"

    Уникальный идентификатор.

    fill-style="none"

    Заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные.

    stroke-width="6″

    Толщина стилуса.

    fill="#ff000000″

    Цвет стилуса.

    Пример

    <stylusLine>

    Позволяет рисовать произвольные фигуры с помощью стилуса. Этот блок кода состоит из множества отрезков.

    Атрибуты

    Атрибут

    Описание

    stroke-style="solid"

    вид фигуры. Виды фигур, нарисованных с помощью стилуса, аналогичны видам линии

    id="{name}"

    уникальный идентификатор

    fill-style="none"

    заливка. В данном случае этот атрибут не имеет смысла, т.к. нарисованные фигуры с помощью стилуса всегда однородные

    stroke-width="6″

    толщина стилуса

    fill="#ff000000″

    цвет стилуса

    Пример

    <region>

    Позволяет добавлять регионы на сцене. Существует 2 вида региональных ограничений:

    • rectangle — прямоугольник

    • ellipse — эллипс

    Атрибуты

    Атрибут

    Описание

    filled="true"

    Заполненность. Значение по умолчанию — true.

    type="rectangle"

    Геометрический вид региона.

    height="300″

    Высота региона (в случае с эллипсом это высота прямоугольника, описывающего эллипс).

    width="300″

    Ширина региона (в случае с эллипсом это длина прямоугольника, описывающего эллипс).

    text="Finish"

    Название, которое будет выводиться в TRIK Studio.

    Пример

    Пример настройки 2D-модели

    Задача «Штрихкод»

    Необходимо нарисовать штрихкод. Штрихкод состоит из белых и черных линий одинаковой толщины. Черная линия задает 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 без зазоров, чтобы получился ровный штрихкод.

    Результат

    Пример модели мира

    виртуального мира
    создать
    5KB
    example-2d-restrictions.xml
    Open
    Скачать

    Блоки в TRIK Studio Junior

    Блоки в TRIK Studio Junior делятся на четыре категории:

    1. Алгоритмы — блоки для описания алгоритмов.

    2. Действия — блоки, выполняющие какое-либо действие «Исполнителя»: команды проезда вперед, поворотов, проигрывания звука и других.

    3. Ожидания — блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т. д.

    4. — блоки, используемые для вывода графики и текста на экран.

    Алгоритмы

    Начало

    Начальная точка выполнения программы.

    На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

    Процесс интерпретации диаграммы начинается именно с этого блока.

    Конец

    Конец программы.

    Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.

    У данного блока не может быть исходящих связей.

    Инициализация переменной

    Блок для объявления новой переменной и задания ей значения. Этого же можно добиться с помощью блока «», но этот блок делает программу понятнее.

    Свойства

    Условие

    Разделение выполнения программы в соответствии с заданным условием.

    У данного блока должны быть две исходящие связи, у хотя бы одной из которых должно быть задано значение параметра «Условие»: «истина» или «ложь».

    Свойства

    Конец условия

    Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы. Если придерживаться правила, что все ветки операторов «» или «» сходятся на таком блоке, это существенно повысит шансы на то, что генератор сможет породить код на текстовом языке без операторов goto.

    Цикл с предусловием

    Цикл с предусловием — цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

    Свойства

    Цикл

    Блок, организующий выполнение последовательности блоков несколько раз. Число повторений задается значением параметра «Итерации». Блок должен иметь две исходящие связи, одна из которых должна быть помечена значением «тело цикла» (то есть значение параметра «Условие» у связи должно быть «тело цикла»). Другая связь, исходящая из блока «Цикл», должна оставаться непомеченной: по ней будет осуществляться переход, когда программа пройдет через блок «Цикл» указанное число раз. Бесконечные циклы и циклы вида while/do и while организуются без использования этого блока, зацикливанием потока управления с помощью связей. Выход из такого цикла осуществляется с помощью блока «».

    Выбор

    Условие с несколькими альтернативами. В параметре «Выражение» можно указать произвольное выражение (подробнее см. в разделе «»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы. У данного блока должны быть несколько исходящих связей. Все связи, кроме одной, должны быть помечены элементарным значением (строка, число и др.), которое может принимать выражение (значение просто пишется в свойство «Условие» у связи). Одна из связей должна быть не помечена: по ней осуществляется переход, если выражение не равно ни одному из перечисленных значений.

    Выражение

    Считает значение заданного выражения. Также допускается инициализация переменных. Подробнее про синтаксис допустимых выражений параметра «Выражение» см. в разделе «».

    Подпрограмма

    Вызов подпрограммы. Подпрограммы используются для вынесения повторяющихся фрагментов программы на отдельную диаграмму. При добавлении этого блока на диаграмму будет предложено ввести имя подпрограммы, после чего двойным кликом на блоке можно будет перейти на диаграмму, соответствующую данной подпрограмме. Также появится дополнительная палитра со всеми подпрограммами. Подпрограммы из неё можно перетаскивать на сцену и использовать как обычные блоки. Вид, имя и свойства блока можно изменить с помощью контекстного меню.

    Свойства

    Изменение свойств у данного блока происходит не на панели «Редактор свойств», а с помощью пункта «Изменить свойства» в контекстном меню. Для вызова контекстного меню нажмите правой кнопкой мыши на блок «Подпрограмма».

    В открывшемся окне вы можете:

    • Изменить имя подпрограммы.

    • Добавить и изменить параметры подпрограммы, задав имя, тип и значение.

    • Изменить картинку на иконке вашей подпрограммы.

    • Изменить фон иконки подпрограммы.

    Черный ящик

    Блок «Черный ящик» используется для составления задач на поиск правила обработки информации.

    Свойства блока

    Как работает блок

    На вход подается одно или несколько значений, на выходе выдается одно значение. Ученику необходимо понять, по какому правилу обрабатывается информация.

    Само правило записывается в виде алгоритма «внутри» блока «Черный ящик». То есть по сути это подпрограмма, которую нельзя отредактировать после сохранения.

    Алгоритм работы с блоком

    1. Добавить блок «Черный ящик» на сцену.

    2. Написать алгоритм подпрограммы «Черного ящика».

    3. Указать в свойствах количество переменных.

    4. В контекстном меню выбрать «Закрыть "Черный ящик"». После этого подпрограмму отредактировать будет нельзя.

    Важно! Если вы используете одну переменную в подпрограмме, то её имя должно быть input. Если вы используете несколько переменных, то input1, input2, input3 и т.д.

    Выходная переменная должна именоваться output.

    Пример

    1. Запрограммируем правило, по которому входные значения обрабатываются следующим образом:

    Результат = Переменная1 + Переменная2 + Переменная3

    2. Добавим блок «Черный ящик» и напишем подпрограмму:

    3. Главная диаграмма будет выглядеть так:

    4. «Закроем» блок и сохраним программу.

    5. При выполнении программы и обработке блока «Чёрный ящик» появится окно:

    6. Введем все значения и нажмем кнопку «Выполнить».

    7. Далее можно вводить комбинации значений до тех пор, пока мы не установим правило обработки. Нажмем кнопку «Завершить».

    8. После этого продолжиться выполнение алгоритма программы.

    Параллельные задачи

    Блок разделяет выполнение программы на несколько потоков. Например, можно одновременно ждать срабатывания сенсора и истечения временного интервала. Блок должен иметь хотя бы две исходящие связи. Чтобы иметь возможность далее ссылаться на параллельные задачи, порождённые этим блоком (например, в блоке «» или в блоке «») надо дать задачам имена. Это делается на исходящих связях, в свойстве «Условие». Именем задачи может быть любая строка, но одним из имён должно быть имя задачи, которая входит в этот блок. Имя главной программы — main.

    Слияние задач

    Блок слияния параллельных задач. Блокирует исполнение программы до тех пор, пока исполнение всех параллельных задач, входящих в этот блок, не достигнет этого блока. Блок должен иметь не менее двух входящих связей. На исходящей связи (в свойстве «Условие») должен быть идентификатор задачи, которая продолжится после того, как блок отработает.

    Завершить задачу

    Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

    Случайное число

    Блок для присвоения указанной переменной случайного целого числа из заданного с помощью свойств «От» и «До» промежутка.

    Комментарий

    Блок для добавления на диаграмму произвольного текста в качестве комментария.

    Используется для пояснения конкретного блока или участка диаграммы. Может быть связан с блоком, который он поясняет.

    При выполнении программы блок не учитывается.

    Блоки действия

    Отправить сообщение в задачу

    Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке ). В качестве сообщения может быть любое выражение.

    Получить код кнопки

    Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство «Ожидание» позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, переменной присваивается значение «-1».

    Вперед

    Перемещает «Исполнителя» на указанное количество клеток вперед. Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».

    Назад

    Перемещает «Исполнителя» на указанное количество клеток назад. Свойство «Количество» позволяет задать количество клеток, на которое должен переместиться «Исполнитель».

    Направо

    Поворачивает «Исполнителя» направо.

    Налево

    Поворачивает «Исполнителя» налево.

    Сказать

    Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

    Светодиод

    Установить указанный цвет светодиода на корпусе контроллера.

    Блоки ожидания

    Таймер

    Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.

    Получить сообщение из другой задачи

    Ждать получения сообщения из другой параллельной задачи. Когда сообщение будет получено, оно будет присвоено указанной в блоке переменной. Свойство «Дождаться сообщения» позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, присвоив переменной пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника. Пример: если вы посылаете число в виде строки, то оно будет принято как число.

    Пользовательский ввод

    Ждать ввода значения от пользователя. После ввода значение будет присвоено указанной в блоке переменной.

    Свойства

    Блок «Пользовательский ввод» имеет 3 свойства:

    Пример

    Ждать нажатия кнопки

    Ждать, пока не будет нажата указанная кнопка на корпусе робота.

    Блоки рисования

    Очистить экран

    Стереть всё, что нарисовано на экране.

    Опустить маркер

    Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.

    Поднять маркер

    Закончить рисование маркером.

    Закрасить клетку

    Закрасить клетку, на которой находится «Исполнитель», выбранным цветом. Цвет выбирается в свойствах блоках в выпадающем меню.

    Свойства

    Напечатать текст

    Печатает заданную строку в заданном месте на экране робота.

    Свойства

    Как вывести текст на экран?

    Для вывода текста:

    1. В свойстве «Текст» напишите нужный текст.

    2. Уберите галочку в свойстве «Вычислять».

    Как вывести значение переменной на экран?

    Для вывода значения переменной:

    1. В свойстве «Текст» напишите имя переменной.

    2. Поставьте галочку в свойстве «Вычислять».

    Цвет кисти

    Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.

    Толщина кисти

    Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

    Нарисовать точку

    Нарисовать на экране точку в указанных координатах.

    Нарисовать линию

    Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

    Нарисовать прямоугольник

    Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.

    Нарисовать эллипс

    Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

    Нарисовать дугу

    Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.

    Смайлик

    Нарисовать на экране смайлик.

    Грустный смайлик

    Нарисовать на экране грустный смайлик.

    Цвет фона

    Задаёт цвет фона экрана.

    <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

    Датчик цвета (пассивный).

    wheels

    Конфигурация портов моторов.

    Инфракрасный датчик расстояния.

    Датчик

    Описание

    RangeSensor

    Датчик расстояния.

    TouchSensor

    Датчик касания.

    Ev3Gyroscope

    Гиродатчик.

    LightSensor

    Датчик света.

    ColorSensorGreen

    regions

    Определяет регионы. Используется как контейнер, атрибутов не имеет.

    wall

    Добавляет стену.

    skittle

    Добавляет банку.

    ball

    Добавляет мяч.

    line

    Добавляет линию.

    cubicBezier

    Добавляет кривую Безье.

    rectangle

    Добавляет прямоугольник.

    ellipse

    Добавляет эллипс.

    stylus

    Определяет стилус на сцене. Используется как контейнер.

    stylusLine

    Позволяет рисовать произвольные фигуры с помощью стилуса.

    region

    Позволяет добавлять регионы в на сцене.

    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″

    Цвет границ и заполнения.

    robots
    robot
    robot
    sensors
    sensor
    startPosition
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат
    системе координат

    Датчик цвета (зелёный).

    Разделение выполнения программы в соответствии с заданным условием.

    Обозначает слияние двух веток условного оператора. Никаких действий не выполняет, но полезен для обеспечения структурности программы.

    Цикл, который выполняется пока истинно некоторое условие, указанное перед его началом. Это условие проверяется до выполнения тела цикла, поэтому тело может быть не выполнено ни разу (если условие с самого начала ложно).

    Блок, организующий выполнение последовательности блоков несколько раз.

    Условие с несколькими альтернативами.

    Считает значение заданного выражения. Также допускается инициализация переменных.

    Вызов подпрограммы.

    Подпрограмма, которую нельзя отредактировать после сохранения.

    Блок разделяет выполнение программы на несколько потоков.

    Блок слияния параллельных задач.

    Завершает задачу с указанным в свойстве «Задача» идентификатором. Должен применяться из другой задачи.

    Блок для присвоения указанной переменной случайного целого числа из заданного промежутка.

    Блок для добавления на диаграмму произвольного текста в качестве комментария.

    Перемещает «Исполнителя» на указанное количество клеток назад.

    Поворачивает «Исполнителя» направо.

    Поворачивает «Исполнителя» налево.

    Произнести с помощью динамика фразу, переданную в качестве аргумента блока.

    Установить указанный цвет светодиода на корпусе контроллера.

    Ждать, пока не будет нажата указанная кнопка на корпусе робота.

    Закрасить клетку, на которой находится «Исполнитель».

    Печатает заданную строку в заданном месте на экране робота. Значение свойства «Текст» по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран.

    Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.

    Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.

    Нарисовать на экране точку в указанных координатах.

    Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.

    Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.

    Нарисовать на экране эллипс, вписанный в заданный прямоугольник.

    Нарисовать на экране дугу, заданную координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована окружность.

    Нарисовать на экране смайлик.

    Нарисовать на экране грустный смайлик.

    Задаёт цвет фона экрана.

    Вид

    Название

    Описание

    Начало

    Начальная точка выполнения программы.

    На каждой диаграмме должен быть только один такой блок. В него не должно быть входящих связей, а исходящая связь из этого элемента должна быть только одна.

    Процесс интерпретации диаграммы начинается именно с этого блока.

    Конец

    Конец программы.

    Если программа состоит из нескольких параллельных участков выполнения, достижение этого блока завершает соответствующий участок выполнения.

    У данного блока не может быть исходящих связей.

    Инициализация переменной

    Блок для объявления новой переменной и задания ей значения.

    Свойство

    Описание

    Значение

    Указывается выражение, определяющее начальное значение переменной.

    Переменная

    Указывается имя переменной.

    Свойство

    Описание

    Условие

    Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.

    Свойство

    Описание

    Условие

    Указывается логическое выражение (подробнее см. в статье «Синтаксис выражений»), на основе значения которого будет осуществлен выбор дальнейшего пути выполнения диаграммы.

    Свойство

    Описание

    Количество переменных

    В данном свойстве необходимо указать количество переменных, которые необходимо подать на вход. В подпрограмме должно использоваться такое же количество переменных.

    Вид

    Название

    Описание

    Отправить сообщение в задачу

    Отправляет данное сообщение в параллельную задачу с заданным идентификатором.

    Получить код кнопки

    Сохраняет в указанную переменную код нажатой на роботе кнопки.

    Вперед

    Перемещает «Исполнителя» на указанное количество клеток вперед.

    Вид

    Название

    Описание

    Таймер

    Блок для задания задержки. Устанавливается время задержки в параметре «Задержка» в миллисекундах.

    Получить сообщение из другой задачи

    Ждать получения сообщения из другой параллельной задачи.

    Пользовательский ввод

    Ждать ввода значения от пользователя.

    Свойство

    Описание

    Переменная

    Имя переменной.

    По умолчанию

    Значение переменной по умолчанию.

    Текст

    Описание поля ввода.

    Программа

    Исполнение программы

    Вид

    Название

    Описание

    Очистить экран

    Стереть всё, что нарисовано на экране.

    Опустить маркер

    Начать рисование маркером заданного цвета на полу. При движении «Исполнителя» за ним будет оставаться цветная линия.

    Поднять маркер

    Закончить рисование маркером.

    Свойство

    Описание

    Цвет

    Цвет, которым будет закрашиваться клетка.

    Вычислять

    Истина — печатает в клетке значение переменной или выражения.

    Ложь — печатает в клетке текст.

    Текст

    Текст / имя переменной (выражение) для вывода в клетке.

    Свойство

    Значение

    Вычислять

    Истина — вывод на экран значения переменной или выражения.

    Ложь — вывод на экран текста.

    Текст

    Текст / имя переменной (выражение) для вывода на экран.

    Обновить картинку

    Истина — обновить экран. Ложь — не обновлять экран.

    X, Y

    Координаты начала текста.

    Рисования
    Выражение
    Условие
    Выбор
    Условие
    Синтаксис выражений
    Синтаксис выражений
    Завершить задачу
    Слияние задач
    «Параллельные задачи»
    Начало
    Конец
    Инициализация переменной
    Условие
    Конец условия
    Цикл с предусловием
    Цикл
    Выбор
    Выражение
    Подпрограмма
    Черный ящик
    Параллельные задачи
    Слияние задач
    Завершить задачу
    Случайное число
    Комментарий
    Отправить сообщение в задачу
    Получить код кнопки
    Сказать
    Светодиод
    Таймер
    Получить сообщение из другой задачи
    Пользовательский ввод
    Ждать нажатия кнопки
    Очистить экран
    Опустить маркер
    Поднять маркер
    Напечатать текст
    Цвет кисти
    Ширина кисти
    Нарисовать точку
    Нарисовать линию
    Нарисовать прямоугольник
    Нарисовать эллипс
    Нарисовать дугу
    Смайлик
    Грустный смайлик
    Цвет фона

    Играть звуковой файл
    Моторы вперёд
    Моторы назад
    Моторы стоп
    Сбросить показания энкодера
    Угловой сервомотор
    Сказать
    Светодиод
    Системный вызов
    Включить видеокамеру
    Выключить видеокамеру
    Детектировать по камере
    Датчик линии в переменную
    Запустить видеотрансляцию
    Отключить видеотрансляцию
    Послать сообщение
    Записать в файл
    Удалить файл
    Калибровка гироскопа
    Join network
    Ждать датчик касания
    Ждать свет
    Ждать УЗ датчик расстояния
    Ждать ИК датчик расстояния
    Ждать энкодер
    Ждать нажатия кнопки
    Получить сообщение
    Ждать кнопки на пульте
    Ждать нажатия на пульт
    Ждать "руля" на пульте
    Ждать отключения пульта
    Ждать подключения пульта
    Нарисовать линию
    Нарисовать прямоугольник
    Нарисовать эллипс
    Нарисовать дугу
    Смайлик
    Грустный смайлик
    Цвет фона
    Напечатать текст
    Очистить экран

    Добавление ограничений в 2D-модель

    Типы переменных и арифметические операции
  • Триггеры

  • Названия датчиков

  • Дополнительные свойства робота

  • Работа с экраном контроллера

  • Пример добавления ограничений

  • Для подготовки упражнений для учеников существует возможность внесения ограничений с помощью редактирования XML-файла.

    Ограничения бывают трех видов:

    1. Временны́е. Например, лимит времени на исполнение задачи или конкретное действие в конкретный временной отрезок.

    2. Пространственные. Например, добавление регионов («Старт», «Финиш») или запрет / принуждение робота, его датчика или какого-то подвижного предмета находиться в определенные промежутки времени в определенном месте.

    3. Ограничения на устройства. Например, ограничение на набор датчиков или на поведение устройств.

    Структура написания ограничений

    Для описания ограничений используется главный тег <constraints>…</constraints>, в который вписываются все ограничения. Используется как контейнер. Ограничения описываются внутри тега, каждый дочерний тег должен быть одним из четырех:

    Тег

    Описание

    Временное ограничение.

    Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка.

    Основной инструмент задания динамических ограничений. Используется как контейнер.

    Безусловное событие, выполняющееся перед началом выполнения программы.

    <constraints>...</constraints>

    Основной тег, в который вписываются все ограничения. Используется как контейнер.

    <timelimit/>

    Временное ограничение. Является обязательным.

    Атрибуты

    Атрибут

    Описание

    value="значение"

    Количество миллисекунд, через которое исполнение будет прекращено и выдана ошибка «Превышен лимит времени».

    Синтаксис

    <constraint>...</constraint>

    Ограничение с произвольным условием, при нарушении которого будет выдана заданная ошибка. Может использоваться как контейнер. Имеет один дочерний тег: <conditions>...</conditions>.

    Атрибуты

    Атрибут

    Описание

    checkOnce="true"

    Логический атрибут. Если в значении стоит true, то ограничение будет проверено 1 раз при старте программы и больше проверяться не будет.

    Полезно, например, если нужно 1 раз проверить, что датчики расставлены верно, а дальше во время исполнения ничего не поменяется.

    failMessage="Ошибка!"

    Сообщение об ошибке, которое будет показано при нарушении ограничения.

    Синтаксис

    <event>...</event>

    Основной инструмент задания динамических ограничений. Используется как контейнер. Описывает строго одно событие.

    Событие - это просто пара (условие, триггер).

    Атрибуты

    Атрибут

    Описание

    settedUpInitially="true"

    Атрибут, позволяющий указать взведено ли событие при старте программы. Событие может быть взведено или спущено (setted up и dropped). Во взведенном состоянии событие выполняет свой триггер по выполнению своего условия, в спущенном оно просто игнорируется системой. Значение по умолчанию — false.

    id="finish checker"

    Уникальный идентификатор события. По этому идентификатору можно обращаться к данному событию из других. Опциональный.

    dropsOnFire = "true"

    Логический атрибут, который указывает, продолжать ли быть событию взведенным после его срабатывания или нет. Опциональный. Значение по умолчанию -- true.

    Синтаксис

    <init>...</init>

    Безусловное событие, выполняющееся перед началом выполнения программы.

    Пример

    Условия

    Теперь обсудим, какими могут быть условия в элементах <constraint> и <event>. Условия задаются с помощью тега <condition> в случае, если проверяется только одно из атомарных условий, или тега <conditions>, если проверяется составное условие.

    <condition>...</condition>

    Внутри этого тега описывается проверяемое условие.

    Пример

    <conditions>...</conditions>

    Используется для создания составных условий. Обязательным атрибутом должна быть указана логическая связка. Связкой может быть and или or. Отрицание выражения задается тегом <not> без атрибутов. Среди подвыражений могут также встречаться другие элементы <conditions>.

    Атрибуты

    Атрибут

    Описание

    glue="and"

    Логическая связка.

    Синтаксис

    Атомарные условия

    Атомарное условие представляет собой один из следующих элементов:

    Тег

    Описание

    , , ,

    Операции сравнения значений.

    Позволяет задавать пространственные ограничения.

    Позволяет проверить, взведено событие или нет.

    Позволяет задать время в мс, после которого данное условие считается истинным.

    <equals>...</equals>

    Равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

    Синтаксис

    <notEqual>...</notEqual>

    Не равно. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

    Синтаксис

    <greater>...</greater>

    Больше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

    Синтаксис

    <less>...</less>

    Меньше. Операция сравнения значений функциональных символов. Может использоваться как контейнер.

    Синтаксис

    <inside/>

    Позволяет задавать пространственные ограничения.

    Атрибуты

    Атрибут

    Описание

    objectId="id"

    id взятого объекта.

    regionId="id"

    id взятого региона.

    objectPoint="center|all|any"

    Осуществляет проверку того, что:

    center — центр объекта находится в зоне, all — все точки объекта находятся в зоне, any — хоть какая-то точка объекта находится в зоне

    Синтаксис

    <settedUp/> и <dropped/>

    Позволяет проверить, взведено событие или нет.

    Атрибуты

    Атрибут

    Описание

    id="event1"

    Идентификатор проверяемого события

    Синтаксис

    Пример

    В условиях события “check event” проверяется, что другое событие с id=”Try move” находится во взведенном состоянии, а событие с id=”Go back” опущено и не выполняется. Если оба эти условия после проверки возвращают значение true, то программа успешно завершается.

    <timer/>

    Предикат, который начинает выдавать true, когда с момента взведения данного события прошло заданное время, а до этого момента выдает false.

    Атрибуты

    Атрибут

    Описание

    timeout="1000"

    Промежуток времени, через которой данный предикат станет истинным. Обязательный, значение должно быть неотрицательным и целочисленным.

    forceDropOnTimeout="true"

    Логический атрибут, позволяющий опустить событие, которое имеет в условии данный таймер. Если выставлен в true, событие будет опущено даже при наличии других активных таймеров и невыполненных условий. Опциональный. Значение по умолчанию -- true

    Синтаксис

    Пример

    Рассмотрим использование <timer/> c различными значениями атрибута forceDropOnTimeout .

    В событии “check region” проверяются временное и пространственное ограничения. Первое условие (timer) становится истинным спустя 1000мс, а до этого момента ложно. После этого его значение больше не изменяется. Второе условие (inside) проверяет, что робот находится в регионе с id=”start_zone”. В тот момент, когда оба этих условия будут выполнены одновременно, программа будет выполнена успешно.

    1. Т. к. атрибут forceDropOnTimeout равен "false", то после заданного количества времени событие будет продолжать оставаться взведенным и ждать выполнения второго условия.

    2. Т. к. атрибут forceDropOnTimeout равен "true", то после заданного количества миллисекунд событие будет опущено, несмотря на наличие .другого условия. Таким образом, если в момент времени 1000 мс робот не находится в нужном регионе, то сообщение об успешном выполнении не будет выведено даже в случае, если робот окажется там спустя некоторое время.

    Типы переменных и арифметические операции

    Переменная

    Описание

    Целочисленная, дробная, строковая и логическая константы.

    Значение переменной.

    Взять состояние объекта.

    Взять метатип объекта с заданным идентификатором.

    Унарные арифметические функции, имеют ровно 1 дочерний элемент, значение которого должно быть целочисленным.

    <int/>, <double/>, <string>, <bool/>

    Задание константы.

    Атрибуты

    Атрибут

    Описание

    value="0″

    Значение заданной константы.

    Синтаксис

    <variableValue/>

    Значение переменной.

    Возможно взятие свойства какой-либо переменной, для этого используется точка. Например, значение rect.width вернет ширину прямоугольника, сохраненного в переменной rect.

    Атрибуты

    Атрибут

    Описание

    name="my_value"

    Имя переменной

    Синтаксис

    <objectState/>

    Взять состояние объекта.

    Атрибуты

    Атрибут

    Описание

    object="robot1.display.labels.size"

    id взятого объекта.

    Синтаксис

    Пример

    <typeOf/>

    Взять метатип объекта с заданным идентификатором. Например: если взять typeOf объекта wall с id=777, то он вернет, что тип этого объекта wall.

    Чаще всего этот элемент будет нужен для проверки типа подключенных датчиков и моторов.

    Атрибуты

    Атрибут

    Описание

    objectId="id"

    Уникальный идентификатор взятого объекта.

    Синтаксис

    <minus>..</minus>, <abs>...</abs>

    Унарные арифметические операции отвечающие за изменение знака и взятие модуля числа.

    Синтаксис

    Пример

    <sum>, <difference>, <min>, <max>

    Сумма и разность значений. Минимальное и максимальное значение.

    Пример

    Триггеры

    Тег

    Описание

    Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.

    Показать ошибку пользователю, завершить проверку задания.

    Показать пользователю сообщение об успешном прохождении задания и завершить проверку.

    Установить значение переменной.

    Взводит или опускает событие

    <trigger>...</trigger>

    Действие или группа действий, которые будут выполнены один или множество раз по факту выполнения условия события.

    Синтаксис

    <fail/>

    Показать ошибку, завершить проверку задания.

    Атрибуты

    Атрибут

    Описание

    message="Неверный ответ!"

    текст выведенной ошибки

    Синтаксис

    <success/>

    Задание успешно пройдено.

    Атрибуты

    Атрибут

    Описание

    deferred="false"

    Опциональный. По умолчанию равен "false". При выставлении его в true данный триггер не остановит выполнение программы, т. е. чекер дождется конца программы и, либо скажет, что программа выполнена успешно, если ошибок не было, либо выпадет с ошибкой в противном случае. Другими словами атрибут deferred не позволяет получить ошибку "Программа закончилась, но задание не выполнено": программа либо завершится с успехом, либо с содержательной ошибкой типа "Превышен лимит времени".

    Синтаксис

    <setter>...</setter>

    Установить значение переменной

    Атрибуты

    Атрибут

    Описание

    name="my_value"

    Название переменной

    Пример

    <setUp/>, <drop/>

    Взводит или опускает событие

    Атрибуты

    Атрибут

    Описание

    id="finish checker"

    id выбранного события

    Пример

    <message/>

    Выводит текст в консоль

    Атрибуты

    Атрибут

    Описание

    text="Hello, world!"

    Необходимый текст

    Названия датчиков

    Датчики для робота TRIK

    Название

    Описание

    twoDModel::robotModel::parts::RangeSensor

    Датчик расстояния

    trik::robotModel::twoD::parts::TwoDLightSensor

    Датчик освещенности

    twoDModel::robotModel::parts::TouchSensor

    Датчик касания

    trik::robotModel::twoD::parts::LineSensor

    Датчик линии

    Датчики для робота Lego EV3

    Название

    Описание

    twoDModel::robotModel::parts::RangeSensor

    Датчик расстояния

    twoDModel::robotModel::parts::LightSensor

    Датчик освещённости

    twoDModel::robotModel::parts::TouchSensor

    Датчик касания

    twoDModel::robotModel::parts::ColorSensorRed

    Датчик цвета (красный)

    twoDModel::robotModel::parts::ColorSensorGreen

    Датчик цвета (зеленый)

    Дополнительные свойства робота

    Свойство

    Описание

    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>
    

    sum, difference, min, max

    Бинарные арифметические функции, имеют ровно 2 дочерних элемента, значение каждого из которых должно быть целочисленным.

    message

    Выводит текст

    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

    Компас

    timelimit
    constraint
    event
    init
    equals
    notEqual
    greater
    less
    inside
    settedUp и dropped
    timer
    int, double, string, bool
    variableValue
    objectState
    typeOf
    minus, abs
    trigger
    fail
    success
    setter
    setUp, drop

    Примеры задания ограничений

    Задание ограничений — уникальная возможность 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. Проезд из зоны «Старт» в зону «Финиш» с ограничением на зону для перемещений

    Задача прохождения лабиринта. Стартовав в синем квадрате, необходимо проехать до зоны финиша. Для того чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, задано пространственное ограничение.

    Ниже приведен полный код для проверки этой задачи.

    Рассмотрим подробнее, как происходит проверка.

    1. Зададим ограничение на время прохождения задания. Это ограничение является обязательным. Время указывается в миллисекундах.

    2. Зададим ограничение на зону, в которой должен находиться робот перед началом программы. По условию задачи это должен быть синий квадрат - зона старта. Это ограничение будет проверяться один раз, в начале программы, так как атрибут checkOnce равен true.

    С помощью тега мы задаем пространственное ограничение. Он имеет два атрибута. В первом (objectId) указываем id объекта, местоположение которого мы хотим проверить, в нашем случае это робот. Во втором (regionId) указываем id региона, в котором должен находиться наш объект.

    В случае, если условие, которое описано в <inside> не выполняется, то программа будет завершена с ошибкой. Для этого у тега есть атрибут failMessage, который позволяет задать текст сообщения об ошибке.

    3. Для того, чтобы проверять, что пользователь действительно проходит лабиринт, а не объезжает его, давайте зададим еще одно пространственное ограничение.

    Отредактируем в xml-файле мира значение тега <regions>, добавив туда регион с id = “warzone”.

    Это ограничение будет проверяться во все время выполнения программы. В теге укажем id объекта и id региона, в нашем случае это робот и черный прямоугольник, ограничивающий лабиринт.

    В случае, если робот в любой момент времени окажется вне указанного региона, программа будет завершена с ошибкой, текст которой указан в атрибуте failMessage.

    4. Теперь нам осталось проверить, что робот доезжает до зоны финиша.

    Для этого давайте создадим событие, которое будет проверять находится робот в нужной зоне или нет. Атрибут settedUpInitially="true" означает, что событие будет запущено (взведено) сразу при старте программы.

    В теге мы указываем какое именно условие необходимо проверить. В нашем случае условие аналогично описанным выше - мы проверяем, что робот находится в регионе с id = "finish". В случае, если это условие выполнится, то пользователю будет показано сообщение об успешном выполнении программы. Для этого в теге мы пишем дочерний тег .

    Пример 2. Проезд из зоны «Старт» в зону «Финиш» с остановкой

    Задача проехать вперед и остановиться в зоне финиша.

    Эта задача немного отличается от Примера 1 тем, что добавляется еще одно условие для успешного завершения программы - роботу необходимо не просто оказаться в зоне финиша, но и остановиться.

    Ниже приведен полный код для проверки этой задачи.

    Теперь давайте рассмотрим подробнее как происходит проверка.

    1. Зададим ограничение на время прохождения задания.

    2. Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы.

    3. Зададим ограничение на зону, которую робот не может покидать.

    4. А теперь создадим событие, которое будет проверять, что робот находится в финишной зоне и при этом он остановился в ней, а не проехал дальше.

    Зональное ограничение задается с помощью тега . Для того, чтобы проверить, что робот остановился, нужно проверить, что мощность на обоих моторах равна нулю. Для этого используем тег . С помощью тега укажем объект, значение которого мы хотим сравнить. В нашем случае это мощность на моторах, поэтому в атрибуте object пишем robot1.M3.power или robot1.M4.power, где M3 и M4 обозначают порты, к которым в текущей конфигурации подключены моторы. А значение, с которым нужно сравниться, записываем с помощью тега и его атрибута value.

    Таким образом, в этом событии проверяется три условия: робот находится в зоне финиша, мощность на моторе M3 равна нулю и мощность на моторе M4 также равна нулю. В случае выполнения этих условий пользователю будет показано сообщение об успешном выполнении программы.

    Пример 3. Проезд из зоны «Старт» в зону «Финиш» вдоль стены с проверкой датчиков

    Стартовав в синем квадрате, необходимо проехать вдоль стены с помощью датчика расстояния ИК до красного квадрата.

    Ниже приведен полный код для проверки этого задания.

    Теперь давайте рассмотрим подробнее как происходит проверка.

    1. Зададим ограничение на время выполнения задания.

    2. По условию задачи у робота должен быть подключен только датчик расстояния (других датчиков быть не должно). Для того чтобы убедиться в этом, сравним значение объекта на порту A1 со значением, которое обозначает датчик расстояния. Подробнее о названиях датчиков для разных конструкторов можно узнать по .

    3. Выполним проверку, что к другим портам не подключены никакие датчики. Для этого сравним значение на каждом порту со строкой “undefined”.

    4. Зададим ограничение на начальное положение робота. Оно проверится один раз в начале программы, потому что выставлен флаг checkOnce .

    5. Зададим ограничение на зону, которую робот не может покидать. В предыдущих примерах мы рассматривали ситуацию, когда роботу нужно было находиться в одной зоне. В данном случае допустимая зона состоит из нескольких прямоугольников, поэтому нам нужно проверять, что робот находится в одной из этих зон. Для этого используем тег <conditions></conditions> с атрибутом glue = “or”.

    6. И наконец, создадим событие, которое будет оповещать об успешном выполнении программы в случае, если робот находится в зоне финиша.

    Пример 4. Подсчет перекрестков и вывод на экран

    Движение по линии с подсчетом перекрестков: при заезде на перекресток робот должен выводить на экран номер этого перекрестка.

    Ниже приведен полный код для проверки этого задания.

    Давайте рассмотрим то, как происходит проверка.

    1. После каждого перекрестка зададим зоны, в которых будет проверяться, что на экран выведен правильный номер перекрестка. Для этого в xml-файле мира отредактируйте значение тега , добавив туда необходимое количество зон для проверки. Меняя значения x, y, width и height , вы можете редактировать местоположение и размер зон. Чтобы проверить положение зоны, загрузите файл в виртуальную модель мира и проверьте расположение зон. После этого, при необходимости, вы можете сделать зоны невидимыми, выставив атрибут visible="false".

    2. После этого в блоке зададим проверку ограничений. Первым укажем ограничение на время выполнения задания.

    3. Зададим ограничение на начальное положение робота.

    4. В каждой зоне, которая находится после перекрестка, будем проверять, что на экран выведен правильный номер. Для этого в теге укажем id нужного региона и проверим, что последнее выведенное сообщение на экран контроллера (robot1.display.labels.last.text) равно номеру пройденного перекрестка. После этого по цепочке будем вызывать аналогичные события для остальных зон.

    5. Будем выводить сообщение об ошибке в случае, если на экран выведен неправильный номер. Для этого сравним сообщение, которое было выведено на экран, с ожидаемым правильным значением. В случае, если сообщения не совпадают, пользователю будет выведено заданное сообщение об ошибке и программа прекратит выполнение.

    6. Зададим событие, которое будет выводить сообщение об успешном выполнении программы, если правильно пройдены все заданные перекрестки.

    Пример 5. Кегельринг

    Робот должен должен вытолкнуть все кегли за пределы круга.

    Ниже приведен полный код для проверки этого задания.

    Теперь разберем подробнее, как происходит проверка.

    1. Отредактируем xml-файл мира, добавив в тег зону круга.

    2. Зададим ограничение на время выполнения задания.

    3. Зададим ограничение на начальное положение робота.

    4. Зададим событие, которое проверяет, что все кегли находятся за пределами круга, и после этого выводит сообщение об успешном выполнении программы.

    Пример 6. Проверка поведения робота

    В начальном положении робот должен находиться в стартовой зоне на расстоянии от стены, к порту А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.

  • Пример 3. Проезд из зоны «Старт» в зону «Финиш» вдоль стены с проверкой датчиков

  • Пример 4. Подсчет перекрестков и вывод на экран

  • Пример 5. Кегельринг

  • Пример 6. Проверка поведения робота

  • Ограничения на время исполнения программы и на зоны «Старт» и «Финиш»
    Разбор примеров
    Пример 1. Проезд из зоны «Старт» в зону «Финиш» с ограничением на зону для перемещений
    <inside>
    <constraint>
    <inside>
    <condition>
    <trigger>
    <success/>
    <inside>
    <equals>
    <objectState>
    <int>
    ссылке
    <regions>
    <constraints>
    <inside>
    <regions>
    ссылке
    <conditions></conditions>
    Синий квадрат - зона старта, красный квадрат - зона финиша, черный прямоугольник - поле, которое нельзя покидать роботу
    Пример 2. Проезд из зоны «Старт» в зону «Финиш» с остановкой
    <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>