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

Подключение робота

Подробная инструкция по настройке и подключению робота к сети находится на вики проекта, Инструкция по настройке и подсоединению к контроллеру. Здесь будем считать, что робот и компьютер с TRIKStudio уже находятся в одной сети. В таком случае достаточно выбрать конструктор ТРИК в окне настроек и указать IP-адрес робота (его можно посмотреть в меню "Сеть" на роботе):

Выбор конструктора ТРИК

Указать IP-адрес робота можно и в окне конфигурации сенсоров прямо на главном окне TRIKStudio:

Быстрый выбор IP-адреса

Этих действий достаточно для работы с ТРИК в режиме генерации, для работы интерпретатора необходимо ещё установить соединение с роботом, нажав на кнопку "Подключиться" на панели инструментов:

Кнопка 'Подключиться'

Блоки ТРИК

Специализированные блоки для ТРИК делятся на несколько категорий:

  • Действия – блоки, выполняющие какое-либо действие на роботе: включение моторов, проигрывание звука и т.д.
  • Ожидания – блоки, ждущие наступления какого-либо события: определённых показаний датчиков, нажатия на кнопку и т.д.
  • Рисования на дисплее – блоки, используемые для вывода графики и текста на экран.

Действия

Название элемента Пиктограмма Описание
Играть звук
Гудок
Проиграть на роботе заданный звуковой файл, который должен быть заранее загружен на робот. Путь до файла указывается относительно папки trik на роботе. Загрузить файл на робот можно, например, с помощью программы WinSCP
Моторы вперёд
Моторы вперёд
Включить моторы по заданным портам с заданной мощностью. Порты задаются строками M1, M2, M3 и M4, разделенными запятыми. Мощность задается в процентах числом от -100 до 100, если задано отрицательное значение, мотор включается в режиме реверса. Так, на картинке изображена команда включения моторов на портах M3 и M4 с мощностью 100%.
Моторы назад
Моторы назад
Включить моторы в режиме реверса по заданным портам с заданной мощностью. Параметры аналогичны параметрами блока "Моторы вперёд".
Моторы стоп
Моторы стоп
Выключить моторы по заданным портам.
Сбросить показания энкодера
Сбросить показания энкодера
Сбросить показания количества оборотов моторов по указанным портам.
Угловой сервомотор
Угловой сервомотор
Установить валы угловых сервомоторов на указанных портах в указанное положение (в градусах, от -90 до 90).
Сказать
Сказать
Произнести с помощью динамика фразу, переданную в качестве аргумента блока.
Светодиод
Светодиод
Установить цвет светодиода на корпусе робота в указанный.
Системный вызов
Системный вызов
Блок имеет булевый параметр "Код". Если он установлен в "Истина", содержимое параметра "Команда" генерируется напрямую в текст программы при генерации этого блока. Если он установлен в "Ложь", генерируется вызов консольной команды операционной системы. Например, команда, представленная на рисунке, перезагружает робот.
Включить видеокамеру
Включить видеокамеру
Включить видеокамеру на роботе в одном из трёх режимов:
  1. Сенсор линии – детектирует цветную линию в центре кадра и в дальнейшем возвращает отклонение центра линии от центра кадра, как число в интервале от -100 (влево) до 100 (вправо).
  2. Сенсор объекта – детектирует контрастный объект в центре кадра и в дальнейшем возвращает координаты его центра и диаметр в пикселах.
  3. Сенсор цвета – возвращает доминирующий цвет в центре кадра в виде его координат в цветовой шкале RGB.
Детектировать по камере
Детектировать по камере
Фиксирует изображение в центре кадра и инициализирует им датчик линии или датчик объекта. Камера должна быть включена в соответствующем режиме блоком "Включить видеокамеру"
Датчик линии в переменную
Значение детектора в переменную
Помещает текущее показание датчика линии в указанную переменную. Камера должна быть включена в режиме датчика линии блоком "Включить видеокамеру" и проинициализирована блоком "Детектировать по камере"
Послать сообщение
Послать сообщение
Отправляет данное сообщение роботу с данным бортовым номером. Робот должен быть в той же сети, что и робот, отправляющий сообщение, и зарегистрирован как ведущий или ведомый с помощью меню "Настройки" -> "Сообщения" на роботе. Если роботов с данным бортовым номером в сети несколько, сообщение получат все они.
Отправить сообщение в задачу
Отправить сообщение в задачу
Отправляет данное сообщение в параллельную задачу с заданным идентификатором (идентификатор должен быть указан при создании задачи в блоке "Параллельные задачи". В качестве сообщения может быть любое выражение.
Записать в файл
Записать в файл
Записывает значение данного выражения в заданный файл на роботе. Файл можно получить с робота, например, с помощью программы WinSCP под Windows или scp под Linux.
Удалить файл
Удалить файл
Удаляет заданный файл на роботе.
Получить код кнопки
ПОлучить код кнопки
Сохраняет в указанную переменную код нажатой на роботе кнопки. Свойство "Ожидание" позволяет дождаться или не дожидаться, когда кнопка действительно будет нажата. Если нажатия кнопки блок не дожидается и кнопка не нажата, в переменную кладётся -1.

Ожидания

Название элемента Пиктограмма Описание
Ждать датчик касания
Ждать датчик касания
Ждать срабатывания датчика касания на указанном порту.
Ждать свет
Ждать свет
Ждать, пока значение, возвращаемое сенсором света на указанном порту, не будет сравнимо с указанным в значении параметра "Проценты". Еще один парамер — номер порта, к которому подключен сенсор цвета. Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра "Проценты". Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое соответствующим сенсором света, не будет больше, чем 60 процентов.
Ждать УЗ датчик расстояния
Ждать УЗ датчик расстояния
Ждать, пока расстояние, возвращаемое ультразвуковым сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние" (расстояние задается в сантиметрах, от 0 до 300). Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет больше, чем 40 см.
Ждать ИК датчик расстояния
Ждать ИК датчик расстояния
Ждать, пока расстояние, возвращаемое инфракрасным сенсором расстояния, не будет сравнимо с указанным в значении параметра "Расстояние". По умолчанию на портах A1 и A2 расстояние задается в сантиметрах (от 0 до 100), к остальным подключение не рекомендуется, так как чистое значение с датчика будет обработано с ожиданием другого подключенного датчика. Еще один парамер — номер порта, к которому подключен датчик расстояния. Также параметром указывается операция, которая будет использоваться для сравнения с введенным расстоянием. Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое сонаром, не будет больше, чем 40 см.
Ждать энкодер
Ждать энкодер
Ждать, пока показания счетчика количества оборотов на заданном порту не станут больше или меньше указанного в значении параметра "Предел оборотов".
Ждать нажатия кнопки
Ждать нажатия кнопки
Ждать, пока не будет нажата указанная кнопка на корпусе робота.
Получить сообщение
Ждать сообщения
Ждать получения сообщения через систему почтовых ящиков. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. Свойство "Дождаться сообщения" позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.
Ждать кнопки на пульте
Ждать кнопки на пульте
Ждать нажатия на "магическую кнопку" на Android-пульте, подключённом к роботу. Кнопки имеют номера с 1 по 5.
Ждать нажатия на пульт
Ждать нажатия пульта
Ждать нажатия на одну из двух активных областей Android-пульта, подключённого к роботу. Координаты нажатия можно получить с помощью сенсорных переменных gamepadPad1 и gamepadPad2.
Ждать "руля" на пульте
Ждать "руля" на пульте
Ждать нужного наклона Android-пульта, подключённого к роботу. Наклон регистрируется только если на пульте включён режим "руля", угол наклона кодируется числами от -100 (максимально влево) до 100 (максимально вправо). Также параметром указывается операция, которая будет использоваться для сравнения со значением параметра "Угол". Так, при выполнении приведенного блока выполнение программы остановится до тех пор, пока значение, возвращаемое "рулём", не будет больше 0
Ждать отключения пульта
Ждать отключения пульта
Ждать, пока Android-пульт не отключится от робота. Если пульт не подключен, немедленно продолжает выполнение.
Ждать подключения пульта
Ждать подключения пульта
Ждать, пока к роботу не подключится Android-пульт. Если пульт уже подключен, немедленнно продолжает выполнение.
Получить сообщение из другой задачи
Получить сообщение из другой задачи
Ждать получения сообщения из другой параллельной задачи. Когда сообщение будет получено, оно будет помещено в указанную в параметре блока переменную. Свойство "Дождаться сообщения" позволяет указать, что делать, если очередь сообщений пуста: дождаться прихода нового сообщения или продолжить работу, положив в переменную пустую строку. Сообщение автоматически приводится к типу, соответствующему типу переменной-приёмника, то есть, например, можно послать число в виде строки и принять его как число.

Рисование на дисплее

Название элемента Пиктограмма Описание
Цвет кисти
Цвет кисти
Указать цвет, которым будут рисоваться простые графические фигуры на экране робота.
Ширина кисти
Ширина кисти
Указать ширину линии, которой будут рисоваться простые графические фигуры на экране робота.
Нарисовать точку
Нарисовать точку
Нарисовать на экране точку в указанных координатах.
Нарисовать линию
Нарисовать линию
Нарисовать на экране отрезок. В качестве параметров блоку указываются концы отрезка.
Нарисовать прямоугольник
Нарисовать прямоугольник
Нарисовать на экране прямоугольник. В качестве параметров указываются координаты левого верхнего угла, ширина и высота прямоугольника.
Нарисовать эллипс
Нарисовать эллипс
Нарисовать на экране эллипс, вписанный в заданный прямоугольник.
Нарисовать дугу
Нарисовать дугу
Нарисовать на экране дугу, задающуюся координатами прямоугольника, в который она будет вписана, и углами (в градусах) её начала и конца на окружности. Если начало и конец совпадают, будет нарисована полная окружность.
Смайлик
Смайлик
Нарисовать на экране смайлик.
Грустный смайлик
Грустный смайлик
Нарисовать на экране грустный смайлик.
Цвет фона
Цвет фона
Задаёт цвет фона экрана.
Напечатать текст
Напечатать текст
Печатает заданную строку в заданном месте на экране робота. Значение свойства "Текст" по умолчанию трактуется как строка в чистом виде, оно так и будет выведено на экран. Чтобы система считала, что это выражение на текстовом языке (это может быть полезно, например, при отладке значения переменных), поставьте галочку "Вычислять" в редакторе свойств.
Очистить экран
Очистить экран
Стереть всё, что нарисовано на экране.

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

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

Название Описание
accelerometer Массив из трёх элементов, содержащий показания акселерометра по оси X, Y и Z соответственно.
colorSensorR, colorSensorG, colorSensorB Показания датчика цвета по видеокамере в центре кадра (интенсивность красного, зелёного и синего соответственно, от 0 до 255). Обновляются только когда датчик цвета включён и проинициализирован.
encoder1, encoder2, encoder3, encoder4 Показания экодера на порту E1, E2, E3 или E4 соответственно.
buttonDown, buttonEnter, buttonEsc, buttonLeft, buttonRight, buttonUp Состояние кнопок на корпусе робота: кнопки "Вниз", "Ввод", "Отмена", "Влево", "Питание", "Вправо", "Вверх" соответственно. 0 соответствует ненажатой кнопке, 1 – нажатой.
gamepadButton1, gamepadButton2, gamepadButton3, gamepadButton4, gamepadButton5 Состояние кнопок на Android-пульте, кнопки с 1 по 5 соответственно. 0 соответствует ненажатой кнопке, 1 – нажатой.
gamepadConnected Состояние подключения Android-пульта, 0 соответствует неподключенному пульту, 1 – подключенному.
gamepadPad1, gamepadPad2 Координаты нажатия активных областей на Android-пульте. Каждая переменная хранит в себе массив из двух элементов, соответствующих x- и y-координате точки нажатия. Координаты изменяются в границах от (-100, -100) до (100, 100), где (-100, -100) соответствует левому верхнему углу активной области. В случае, если область не нажата, в переменной находится значение (-101, -101).
gamepadPad1Pressed, gamepadPad2Pressed Содержат 1, если соответствующая активная область на Android-пульте нажата и 0, если нет. Координаты нажатия можно узнать с помощью переменных gamepadPad1 и gamepadPad2.
gamepadWheel Содержат текущий наклон Android-пульта, если он подключён и на нём включён "руль". Наклон кодируется числами от -100 (крайнее левое положение) до 100 (крайнее правое положение). Если данных о положении "руля" нет, в переменной находится число -101.
gyroscope Массив из трёх элементов, содержащий показания гироскопа по оси X, Y и Z соответственно.
lineSensor Массив из трёх элементов:
  1. Координата линии датчика линии по видеокамере от -100 (крайнее левое положение линии в кадре) до 100 (крайнее правое положение). Обновляется только когда датчик линии включён и проинициализирован.
  2. Вероятность перекрёстка, возвращаемая датчиком линии по видеокамере. Определяется как процент точек внутри горизонтальной полосы в центре кадра, распознанных как линия. В диапазоне от 0 (таких точек нет) до 100 (все точки в горизонтальной полосе распознаны как линия). Обновляется только когда датчик линии включён и проинициализирован.
  3. Относительный размер линии, то есть количество точек в кадре, определённых как линия, от 0 (линии в кадре нет) до 100 (весь кадр распознан как линия). Обновляется только когда датчик линии включён и проинициализирован.
objectSensorX, objectSensorY, objectSensorSize Показания датчика объекта по видеокамере: координаты X, Y распознанного объекта (относительно центра кадра, от -100 до 100) и размер объекта (от 0 до 100, 100 – объект занимает весь кадр). Обновляются только когда датчик объекта включён и проинициализирован.
sensorA1, sensorA2, sensorA3, sensorA4, sensorA5, sensorA6, sensorD1, sensorD2, sensorF1 Показания датчиков на портах A1, A2, A3, A4, A5, A6, D1, D2, F1 соответственно.

Текстовое программирование

Qt Script

Qt Script – интерпретируемый объектно-ориентированный язык с динамической типизацией, реализация стандарта ECMAScript (как и JavaScript, так что Qt Script можно рассматривать как диалект JavaScript). Подробное описание языка на русском можно найти, например, здесь: http://javascript.ru/ecma. При программировании на контроллере ТРИК используется библиотека, обеспечивающая взаимодействие скрипта с аппаратным обеспечением и некоторые расширения ECMAScript, описанные ниже.

Пример простой программы на Qt Script:

brick.smile();
script.wait(2000);

Здесь мы видим объект brick, у которого вызывается метод smile (нарисовать смайлик на экране) и объект script, у которого вызывается метод wait – ждать указанное количество миллисекунд. brick – объект, обеспечивающий взаимодействие скрипта с аппаратным обеспечением контроллера, script же отвечает за взаимодействие с операционной системой и управление исполнением скрипта. brick также предоставляет доступ к другим объектам, отвечающим за конкретные устройства, например, обращение к мотору на порту M1 выглядит так:

brick.motor(M1).setPower(100);

Пример более сложной программы, движение по линии с двумя сенсорами света:

var k = 1.3;
var power = 50;

var left = brick.sensor("A1").read();
var right = brick.sensor("A2").read();
while (true) {
	var u = k * (brick.sensor(A1).read() - left - (brick.sensor(A2).read() - right));
	brick.motor("M3").setPower(power + u);
	brick.motor("M4").setPower(power - u);
	script.wait(30);
}

Здесь видны объявления переменных – тип для них не указывается, он соответствует значениям, помещаемым в переменную.

Одно из расширений стандартного ECMAScript, реализованное в Qt Script – возможность подписываться на события. Делается это с помощью функции connect, вызываемой от объекта-события, как в примере ниже. Там с помощью анонимной функции (описываемой с помощью ключевого слова function) скрипт подписывается на событие pad, соответствующее нажатию на одну из активных областей Android-пульта. На пульте их всего две, на какую именно из них нажали передаётся в параметре padId сигнала. x и y – координаты точки нажатия. Функция будет вызываться каждый раз, когда пользователь Android-пульт будет присылать сообщение, что на него нажали.

gamepad.pad.connect(
	function(padId, x, y) {
		if (padId == 1) {
			brick.motor("E1").setPower(y);
			brick.motor("E2").setPower(-x);
		}

		if (padId == 2) {
			brick.motor("M1").setPower(y + x);
			brick.motor("M2").setPower(y - x);
		}
	}
)

Подобный стиль программирования называется реактивным (система реагирует на события) и пока не поддержан при генерации по диаграмме из TRIKStudio. То есть генерируемый код никогда не содержит вызовов connect, реактивные программы можно писать только вручную. Для того, чтобы программа не завершилась сразу же, а осталась работать и ожидать событий, используется метод run объекта script. Для выхода из режима ожидания и завершения работы событийно-ориентированного скрипта используется метод stop объекта script. Пример полной событийно-ориентированной программы, которая ждёт нажатия на кнопку "Ввод" и выходит, приведён ниже.

brick.keys().buttonPressed.connect(
	function(code, value) {
		if (code == KeysEnum.Enter && value == 1) {
			print("'Enter' pressed, exiting");
			script.quit();
		}
	}
);

script.run();

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

Список доступных методов и событий по классам и объектам приведён в таблице ниже.

Объект "brick"

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

Название метода Пример вызова Описание
playSound brick.playSound('media/sound.mp3'); Проиграть звуковой файл. Принимает в качестве параметра имя файла, который должен быть предварительно загружен на робот (с путём, абсолютным или относительно папки trik на роботе).
say brick.say('Привет, я ТРИК'); Произнести переданную как параметр строку (на русском или английском языке).
stop brick.stop(); Останавливает все моторы и активные датчики (такие как датчик линии или датчик объекта), убирает нарисованное на дисплее.
motor brick.motor("M1"); Возвращает мотор (класс Motor, силовой или сервомотор) на указанном порту.
sensor brick.sensor("A1"); Возвращает сенсор (класс Sensor) на указанном порту.
accelerometer brick.accelerometer(); Возвращает акселерометр (класс Sensor3d).
gyroscope brick.gyroscope(); Возвращает гироскоп (класс Sensor3d).
lineSensor brick.lineSensor(); Возвращает датчик линии по видеокамере (класс LineSensor).
colorSensor brick.colorSensor(); Возвращает датчик цвета по видеокамере (класс ColorSensor).
objectSensor brick.objectSensor(); Возвращает датчик объекта по видеокамере (класс ObjectSensor).
encoder brick.encoder('B1'); Возвращает энкодер на указанном порту (класс Encoder).
battery brick.battery(); Возвращает объект, предоставляющий доступ к батарее (класс Battery).
keys brick.keys(); Возвращает объект, предоставляющий доступ к кнопкам на корпусе робота (класс Keys).
display brick.display(); Возвращает объект, предоставляющий доступ к дисплею робота (класс Display).
led brick.led(); Возвращает объект, предоставляющий доступ к светодиоду на корпусе робота (класс Led).
Объект "script"

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

Название метода Пример вызова Описание
timer script.timer(100); Создаёт и возвращает таймер (класс QTimer), посылающий сигнал timeout каждые n миллисекунд, где n передаётся в качестве параметра.
wait script.wait(1000); Приостанавливает выполнение скрипта на переданное количество миллисекунд.
time script.time(); Возвращает временной штамп (число: количество миллисекунд, прошедших с начала 1 января 1970 года по Гринвичу).
random var a = script.random(0, 10); Возвращает случайное число в диапазоне от первого до второго своего параметра.
run script.run(); Устанавливает флаг событийно-ориентированной программы. По окончанию работы скрипт не выгружается из памяти, а продолжает ждать наступления событий до тех пор, пока какой-либо из обработчиков не вызовет script.quit()
quit script.quit(); Устанавливает флаг окончания работы для событийно-ориентированной программы. Как только будет завершён текущий обработчик события, исполнение скрипта закончится.
system script.system("reboot"); Выполняет переданную в качестве параметра команду консоли операционной системы.
writeToFile script.writeToFile('output.txt', 'Hello, world'); Записывает значение второго параметра в файл, указанный в качестве первого параметра.
readAll var lines = script.readAll('input.txt'); Считывает всё содержимое указанного файла в массив строк.
removeFile script.removeFile('file.txt'); Удаляет указанный файл.
Объект "mailbox"

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

Название метода Пример вызова Описание
connect mailbox.connect("192.168.0.20", 8889); Подключается к роботу с заданным IP-адресом по заданному порту, сообщает ему свой бортовой номер и регистрируется в сети "почтовых ящиков".
connect mailbox.connect("192.168.0.20"); Подключается к роботу с заданным IP-адресом и портом по умолчанию, сообщает ему свой бортовой номер и регистрируется в сети "почтовых ящиков".
send mailbox.send(1, "Hello"); Посылает роботу с указанным бортовым номером указанное сообщение.
send mailbox.send("Hello"); Посылает указанное сообщение всем зарегистрированным роботам в сети.
hasMessages mailbox.hasMessages(); Возвращает true, если роботу пришло новое сообщение.
receive var message = mailbox.receive(); Получает новое сообщение или блокирует исполнение скрипта до тех пор, пока сообщение не придёт.
myHullNumber var x = mailbox.myHullNumber(); Возвращает бортовой номер робота.
newMessage mailbox.newMessage.connect(function(sender, message) { print(message); }); Посылается, когда робот получает новое сообщение. Первый параметр – бортовой номер отправителя, второй – само сообщение.
Объект "gamepad"

Служит для работы с Android-пультом управления, https://play.google.com/store/apps/details?id=com.trik.gamepad.

Название метода Пример вызова Описание
reset gamepad.reset(); Сбрасывает запомненные события от Android-пульта.
buttonWasPressed gamepad.buttonWasPressed(1); Возвращает true, если на пульте была нажата кнопка с указанным номером. Сбрасывает запомненное нажатие для этой кнопки. Кнопки нумеруются от 1 до 5.
isPadPressed gamepad.isPadPressed(1); Возвращает, нажата ли в данный момент область управления на пульте. Области управления имеют номера 0 и 1.
padX gamepad.padX(1); Если указанная область управления на пульте нажата, возвращает текущую x-координату нажатия.
padY gamepad.padY(1); Если указанная область управления на пульте нажата, возвращает текущую y-координату нажатия.
wheel gamepad.wheel(); Если на пульте включён "руль" (события от акселерометра Android-устройства), возвращает текущий наклон Android-пульта. Наклон кодируется числом от -100 до 100, -100 соответствует крайнему левому положению "руля", 100 – крайнему правому.
padUp gamepad.padUp.connect( function(padId, x, y) { brick.stop(); }); Посылается, когда пользователь оторвал палец от области управления с указанным номером. В качестве параметров имеет номер области управления и координаты последнего известного положения пальца на ней.
wheelEvent gamepad.wheelEvent.connect( function(percent) { brick.motor("E1").setPower(percent); }); Посылается, когда на пульте включён "руль" (события от акселерометра Android-устройства) и пользователь повернул Android-устройство. В качестве параметра передаётся число от -100 до 100, -100 соответствует крайнему левому положению "руля", 100 – крайнему правому.
pad gamepad.pad.connect(function(padId, x, y) { print(padId + ":" + x + "," + y); }); Посылается, когда пользователь нажал на область управления на пульте или переместил палец по ней. В качестве параметров передаётся номер области управления и координаты нажатия (числа от -100 до 100, координата -100, -100 соответствует левому верхнему углу области управления).
button gamepad.button.connect(function(button, pressed) { if (button == 1) brick.stop(); }); Посылается, когда пользователь нажал на одну из пяти кнопок внизу пульта. Первый параметр – номер кнопки (от 1 до 5), второй – 1, если кнопка нажата, 0 – если кнопка отпущена.
disconnect gamepad.button.disconnect(function() { brick.stop(); }); Посылается при отключении пульта.
Объект "Threading"

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

Название метода Пример вызова Описание
startThread Threading.startThread("New thread id", "Function name"); Запускает переданную в качестве параметра функцию в отдельном потоке. Обратите внимание, что при этом создаётся новая копия для всех глобальных переменных, так что если в одном потоке значение переменной меняется, в другом потоке оно остаётся старым.
killThread Threading.killThread("Thread id"); Заканчивает исполнение потока с заданным Thread id.
joinThread Threading.joinThread("Thread id"); Ожидает завершения всех потока с заданным Thread id.
sendMessage Threading.sendMessage("Thread id", "New message"); Посылает сообщение потоку с заданным Thread id.
receiveMessage Threading.receiveMessage(wait); Запрашивает принятое сообщение, если wait равен true, то ожидает пока не придет сообщение.
Класс "Battery"

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

Название метода Пример вызова Описание
readVoltage brick.battery().readVoltage(); Возвращает текущий вольтаж батареи (или блока питания) в вольтах.
Класс "ColorSensor"

Датчик цвета по видеокамере.

Название метода Пример вызова Описание
init brick.colorSensor().init(true); Включает видеокамеру и инициализирует её в режиме датчика цвета. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
read brick.colorSensor().read(2, 2); Возвращает массив с координатами доминирующего цвета в цветовой шкале RGB в указанном участке кадра. Кадр делится на квадраты сеткой, по умолчанию 3 на 3, размерность сетки можно задать в config.xml на роботе. Квадраты индексируются с 1, то есть (1, 1) – это левый верхний край кадра, (2, 2) – его центр. Возвращаемое значение – массив из трёх элементов от 0 до 255, индексирующийся с 0. Нулевой элемент содержит интенсивность красного (0 – совсем нет, 255 – очень много), первый – интенсивность зелёного, второй – интенсивность синего. Например, (0, 0, 0) – чёрный, (255, 255, 255) – белый, (255, 0, 0) – красный.
stop brick.colorSensor().stop(); Выключает видеокамеру и прекращает работу датчика.
Класс "LineSensor"

Датчик линии по видеокамере.

Название метода Пример вызова Описание
init brick.lineSensor().init(true); Включает видеокамеру и инициализирует её в режиме датчика линии. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
detect brick.lineSensor().detect(); Определяет доминирующий цвет в вертикальной полосе в центре кадра и запоминает его как цвет линии. После этого read() начинает возвращать данные для этой линии.
read brick.lineSensor().read(); Возвращает массив, в ячейках которого находятся следующие данные:
  • в нулевой ячейке координата по оси x центра линии относительно центра кадра (от -100 до 100, -100 – центр линии на краю кадра слева);
  • в первой ячейке – вероятность перекрёстка (число от 0 до 100, показывающее сколько точек цвета линии находится в горизонтальной полосе в центре кадра);
  • во второй ячейке – относительный размер линии, число от 0 до 100. 100 – линия занимает почти весь кадр, 0 – линии нет на кадре.
stop brick.lineSensor().stop(); Выключает видеокамеру и прекращает работу датчика.
Класс "ObjectSensor"

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

Название метода Пример вызова Описание
init brick.objectSensor().init(true); Включает видеокамеру и инициализирует её в режиме датчика объекта. Булевый параметр определяет, выводить ли на экран изображение с камеры (true – выводить).
detect brick.objectSensor().detect(); Определяет доминирующий цвет в центре кадра и запоминает его как цвет объекта. После этого read() начинает возвращать данные для объекта.
read brick.objectSensor().read(); Возвращает массив, в ячейках которого находятся следующие данные:
  • в нулевой ячейке координата по оси x центра объекта относительно центра кадра (от -100 до 100, -100 – центр объекта на краю кадра слева);
  • в первой ячейке – координата по оси y центра объекта относительно центра кадра (от -100 до 100, -100 – центр объекта на краю кадра сверху);
  • во второй ячейке – относительный размер объекта, число от 0 до 100. 100 – объекта занимает почти весь кадр, 0 – объекта нет на кадре.
stop brick.objectSensor().stop(); Выключает видеокамеру и прекращает работу датчика.
Класс "Sensor"

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

Название метода Пример вызова Описание
read brick.sensor("A1").read(); Возвращает текущее показание сенсора (цифрового или аналогового), подключённого к данному порту. Возвращается приведённое значение, зависящее от конфигурации порта, которая описывается в файле config.xml в папке trik на роботе. Например, ИК-датчик расстояния возвращает значение в сантиметрах.
readRawData brick.sensor("A1").readRawData(); Возвращает текущее "сырое" показание сенсора (цифрового или аналогового), подключённого к данному порту. Диапазон значений зависит от конкретного сенсора и не учитывает конфигурацию робота (возвращаются физические показания сенсора, например, задержка принятого ультразвукового сигнала).
Класс "Sensor3d"

Представляет сенсор, возвращающий в качестве значения массив из трёх чисел (гироскоп или акселерометр).

Название метода Пример вызова Описание
read brick.gyroscope().read(); Возвращает текущее показание сенсора в виде массива из трёх элементов, соответствующих показаниям сенсора по каждой из осей.
newData brick.gyroscope().newData.connect(function (x) { print(x[0]); }); Сигнал, посылаемый сенсором, когда у него готовы новые данные. В качестве параметра передаётся массив из трёх элементов, соответствующих показаниям сенсора по каждой из осей.
Класс "Display"

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

Название метода Пример вызова Описание
showImage brick.display().showImage('media/trik_smile_sad.png'); Вывести на экран изображение, предварительно загруженное на робот. Параметр – имя файла с изображением (в форматах BMP, GIF, JPG, JPEG, PNG, PBM, PGM, PPM, TIFF, XBM, XPM), путь указывается либо абсолютным, либо относительно папки trik.
addLabel brick.display().addLabel('Привет, мир!', 1, 1); Вывести на экран переданный в качестве параметра текст в указанные координаты. Если в указанных координатах уже был текст, он будет заменён новым.
removeLabels brick.display().removeLabels(); Удаляет с экрана весь текст, добавленный на него вызовами метода addLabel().
setPainterColor brick.display().setPainterColor("red"); Устанавливает цвет кисти, которой рисуются графические примитивы. Возможные цвета таковы: white, red, darkRed, green, darkGreen, blue, darkBlue, cyan, darkCyan, magenta, darkMagenta, yellow, darkYellow, gray, darkGray, lightGray, black.
setPainterWidth brick.display().setPainterWidth(5); Устанавливает толщину кисти, которой рисуются графические примитивы, в пикселах.
drawLine brick.display().drawLine(0, 0, 10, 10); Рисует линию с началом и концом в заданных координатах.
drawPoint brick.display().drawPoint(10, 10); Рисует точку в заданных координатах.
drawRect brick.display().drawRect(0, 0, 10, 10); Рисует прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
drawEllipse brick.display().drawEllipse(0, 0, 10, 10); Рисует эллипс, вписанный в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту.
drawArc brick.display().drawArc(0, 0, 10, 10, 20, 50); Рисует дугу эллипса, вписанного в прямоугольник с левым верхним углом в указанных координатах и имеющий заданную ширину и высоту. Последние два параметра – начальный и конечный угол, ограничивающие дугу.
setBackground brick.display().setBackground("red"); Устанавливает фон экрана в указанный цвет. Возможные цвета таковы: white, red, darkRed, green, darkGreen, blue, darkBlue, cyan, darkCyan, magenta, darkMagenta, yellow, darkYellow, gray, darkGray, lightGray, black.
hide brick.display().hide(); Закрывает и очищает окно для рисования.
clear brick.display().clear(); Очищает окно для рисования.
redraw brick.display().redraw(); Перерисовывает окно для рисования. Изменения в окне произойдут только после вызова этого метода.
Класс "Encoder"

Представляет энкодеры силовых моторов, подключающиеся к портам B1, B2, B3, B4.

Название метода Пример вызова Описание
read brick.encoder("B1").read(); Возвращает текущее показание энкодера в градусах на заданном порту.
readRawData brick.encoder("B1").readRawData(); Возвращает текущее показание энкодера в "тиках" на заданном порту.
reset brick.encoder("B1").reset(); Сбрасывает в 0 текущее показание энкодера.
Класс "Keys"

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

Название метода Пример вызова Описание
reset brick.keys().reset(); Сбрасывает запомненные нажатия кнопок.
wasPressed brick.keys().wasPressed(KeysEnum.Up); Возвращает, была ли нажата кнопка с указанным кодом, сбрасывает запомненные нажатия для этой кнопки. Возможные варианты: KeysEnum.Left (код 105), KeysEnum.Up (код 103), KeysEnum.Down (код 108), KeysEnum.Enter (код 28), KeysEnum.Right (код 106), KeysEnum.Power (код 116), KeysEnum.Esc (код 1).
isPressed brick.keys().isPressed(KeysEnum.Up); Возвращает true, если кнопка с указанным кодом нажата в данный момент.
buttonPressed brick.keys().buttonPressed.connect(function(code, value) { if (code == KeysEnum.Up) brick.stop(); }); Посылается, когда кнопка с указанным кодом нажата или отпущена. Первый параметр – код кнопки, второй – 1, если кнопка нажата, 0, если отпущена.
Класс "Led"

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

Название метода Пример вызова Описание
red brick.led().red(); Включает светодиод в режим "красный".
green brick.led().green(); Включает светодиод в режим "зелёный".
orange brick.led().orange(); Включает светодиод в режим "оранжевый".
off brick.led().off(); Выключает светодиод.
Класс "Motor"

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

Название метода Пример вызова Описание
setPower brick.motor().setPower(100); Включает мотор с указанной мощностью. Мощность задаётся в диапазоне от -100 ("полный назад") до 100 ("полный вперёд"). 0 соответствует "force break", то есть мотор останавливается, при этом он заблокирован и остаётся под напряжением.
power var x = brick.motor().power(); Возвращает текущую мощность мотора (от -100 до 100).
powerOff brick.motor().powerOff(); Выключает мотор.

F#

При программировании ТРИК на языке F# в качестве библиотеки поддержки времени выполнения используется библиотека TRIK-Sharp (https://github.com/kashmervil/trik-sharp), её описание и набор примеров доступны в Github-репозитории проекта. Познакомиться с языком F# и функциональным программированием вообще можно, например, с помощью книги Д. Сошникова "Программирование на F#" (http://www.ozon.ru/context/detail/id/6151130/). Обратите внимание, что для компиляции программ потребуется компилятор F# (устанавливаемый вместе со средой Microsoft Visual Studio версий не ниже 2010, отдельно его можно скачать отсюда: http://www.microsoft.com/en-us/download/details.aspx?id=44011), а исполнения программ на роботе должен быть установлен пакет mono, который не устанавливается по умолчанию.

Pascal

В качестве языка текстового программирования для ТРИК также может использоваться язык Паскаль (точнее, его диалект PascalABC.NET). Для этого должен быть установлен плагин поддержки Паскаля в TRIK Studio и компилятор PascalABC.NET, который можно скачать по ссылке http://pascalabc.net/ssyilki-dlya-skachivaniya. Достаточно консольного компилятора и необходимых компонент (PABCNETC.ZIP), если на компьютере установлен .NET Framework версии не ниже 4.5.1 или Mono. Путь до установленного компилятора (pabcnetc.exe) надо указать в настройках на вкладке "Роботы". При этом в этом же окне должна быть выставлена модель ТРИК версии 2015 года.

В качестве библиотеки поддержки времени выполнения для программ на Паскале, как и в случае с F#, тоже используется библиотека TRIK-Sharp (https://github.com/kashmervil/trik-sharp), а в качестве среды выполнения – виртуальная машина mono, установленная на роботе (поэтому программы, как и в случае с F#, могут запускаться несколько секунд, это вполне нормально).

Множество полезной информации о Паскале и его диалекте PascalABC.NET можно получить на сайте авторов этого компилятора, http://pascalabc.net/.

Запуск программ

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

  • пошаговая интерпретация диаграммы с посылкой команд в робота по Wi-Fi, или моделированием поведения робота с помощью двумерной модели
  • загрузка и дальнейшее автономное исполнение программы на роботе без связи с компьютером.

Интерпретация по Wi-Fi

Чтобы запустить программу на выполнение, необходимо подключиться к роботу (как описано в разделе Подключение робота) и нажать кнопку "Выполнить" панели "Интерпретатор" или меню "Инструменты":

Запуск программы

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

Для того, чтобы остановить выполнение программы, нужно нажать кнопку "Прервать выполнение" панели "Интерпретатор" или меню "Инструменты"

Загрузка программы на робот

Для загрузки и немедленного запуска программы в режиме Qt Script достаточно подключиться к Wi-Fi-сети с роботом, указать его IP-адрес в окне настроек или на панели справа (подробнее см. в разделе Подключение робота) и нажать на кнопку "Загрузить и выполнить программу" (или выбрать соответствующий пункт меню):

Загрузить и выполнить программу

Остановить исполняющуюся программу можно нажатием кнопки "Питание" на корпусе робота или кнопкой "Остановить робота" слева от кнопки "Загрузить и выполнить программу".

Справа от кнопки "Загрузить и выполнить программу" находятся кнопки

  • Загрузить программу – загружает программу на робот, но не исполняет её. Программа может быть исполнена из меню "Файлы" на роботе.
  • Генерировать код на Qt Script – не загружать программу на робот, а просто получить и открыть её представление на языке Qt Script. Программа может быть отредактирована (см. раздел Текстовое программирование – Qt Script) и загружена на робот нажатием кнопок "Загрузить программу" или "Загрузить и выполнить программу" при открытой текстовой вкладке.

Панель загрузки программ

Для работы в режиме генерации в F# требуется сначала указать компилятор F# в окне настроек на вкладке "Роботы":

Путь до компилятора F#

Затем можно пользоваться кнопками на панели F#, функциональность которых аналогична кнопкам на панели Qt Script. Обратите внимание, что программы на F# могут стартовать довольно долго, порядка 8-10 секунд.

Не все диаграммы, работающие в режиме интерпретации, могут быть сгенерированы в код на текстовых языках. Связано это с тем, что современные текстовые языки не позволяют явно управлять потоком исполнения, и программа должна быть представима в виде последовательно исполняемых операторов, подпрограмм, условий и циклов, быть может, вложенных друг в друга. Визуальные языки дают большую свободу, поэтому не всегда хорошо отображаются на текстовые. Если в окне сообщений об ошибках при попытке генерации появляется сообщение "ОШИБКА: Данная диаграмма не может быть сгенерирована в структурированный код", следует попытаться реструктуризовать и упростить программу, чтобы упростить задачу генератору.