Робот Ф-2 - Редактор жестов
Редактор позволяет создавать новые жесты для робота. Жесты сохраняются в файлы формата JSON, например, жест neutral хранится в файле neutral.json. Новые жесты можно сделать, если не хватает жестов из стандартного словаря. После создания жесты можно добавить в робота и использовать их в своих скриптах поведения на языке BML.
Запуск программы
При запуске редактора жестов нужно выбрать папку, откуда будут взяты лицо и параметры робота. Для этого нужно нажать кнопку 1. После выбора паки активируется кнопка 4. С её нажатием будет выполнен переход к основному интерфейсу.

Если жесты и конфигурация лица робота находятся в разных папках, на исходном экране нужно нажать кнопку 4 Extra Settings. В этом случае можно отдельно выбрать путь к каждому из ресурсов:

Выбор папки, откуда будут взяты лицо и параметры робота.

Выбор папки нужно подтвердить нажатием кнопки 1 Select. Конфигурация лица будет взята из вложенной папки RobotGestures/faces/main-face.txt
Интерфейс редактора

- Трёхмерная модель робота
- Приводы рук и шеи с указанием текущих координат. Для каждого привода указываются кнопка сброса координаты, величина приращения, кнопки увеличения и уменьшения, текущая координата
- Управление лицом, бровями и глазами
- Меню приложения
Модель робота можно вращать, зажимая левую кнопку мыши. Поставить модель ровно можно кнопкой R (Reset).

Для редактирования мимики можно переключиться в режим лица крупным планом. Для этого нужно нажать кнопку H (Head). Для выхода из этого режима нужно повторно нажать H.

Меню приложения

Раздел Gesture (1) позволяет создавать новый жест, открывать и закрывать жесты. Раздел ShapeSetting (2) позволяет выбрать источник ресурсов - лица робота (как при запуске программы). Меню Help (3) выводит подсказку назначения клавиш. 4 – Кнопка закрытия редактора.
Меню взаимодействия с жестами

- Кнопка создания нового жеста 1.1. Создание абсолютного жеста 1.2. Создание относительного жеста
- Кнопка открытия жеста из файла - при этом открывается диалог выбора файла
- Кнопка сохранить жест как (если нужно переименовать уже сохраненный жест)
- Кнопка сохранить жест (сохраняет поверх старого файла)
- Кнопка закрытия режима создания жеста
Абсолютный жест задаётся в координатах робота. Эти координаты не зависят от окружающих объектов.
Относительный жест задаётся в координатах относительно направления на некоторый объект. Относительный жест должен обязательно вызываться в отношении некоторого референта (target), например, так:
<scenario>
<bml>
<figure lexeme="agree1_rel" target="#front"/>
</bml>
</scenario>
В данном примере используется референт #front, который автоматически всегда задан.
При создании относительного жеста робот встаёт в позу, где он смотрит вперед и направляет обе руки вперёд, как бы указывая на референт перед ним (руки и взгляд параллельны, как если бы референт находился на горизонте бесконечно далеко). Если фактический референт расположен выше, ниже, левее или правее, поза робота будет автоматически поправлена на основе положения референта. Если в относительном жесте не задать положение рук, то руки не будут подниматься в направлении референта: относительный жест просто никак не будет управлять руками.
В жесте нельзя использовать абсолютные и относительные элементы. Например, нельзя, чтобы робот соединял руки (абсолютный жест) и смотрел на собеседника (относительный жест). Если требуется создать такое поведение, то нужно комбинировать абсолютный и относительный жест в одном пакете BML.
Открытие файла
При открытии файла нужно выбрать требуемый файл через диалог:

Кнопка открытия меню настройки файлов для лица робота


Меню помощи

В меню помощи кратко представлены основные команды для управления редактором. Меню помощи можно вызвать по кнопке F1.

Редактирование жеста
Жест представляет собой множество точек, расставленных на шкале времени (2). Каждая точка хранит координату или состояние элемента робота в конкретный момент времени. Движение робота – это переход между двумя ключевыми точками.
Название жеста отображается в заголовке окна (1).

Общий принцип создания жеста робота состоит в следующем: на шкале времени мы можем указать, что в определённый момент времени робот должен стоять в определённой позе. Для этого на шкале времени будет поставлена ключевая точка. Точка указывает, что в данный момент времени определённый привод должен быть повёрнут на некоторый угол или что на лице в этот момент должен отображаться некоторый элемент мимики. Ключевая точка может относится только к одному элементу робота, например, указывать только координату правой руки. Между соседними ключевыми точками тело робота будет перемещаться с постоянной скоростью. Скорость движения элемента робота отображается в редакторе цветом. Жест задаёт множество перемещений робота между ключевыми точками.
Если выбрана конкретная точка, то в меню подсвечиваются установленные для неё координаты или параметры. Для удаления точки нужно удалить все её параметры нажатием кнопки “крестик”. Это можно сделать, если время шкалы времени совпадает с временем точки.

Меню управления телом робота
В этом меню в текущей точке времени можно редактировать положение каждого привода робота:
- Шея: NeckLR/NeckUD
- Правая рука: RShoulder/RHand
- Левая рука: LShoulder/LHand
Если положение какого-то привода было изменено, на шкале времени будет автоматически поставлена ключевая точка. Удалить ключевую точку можно или кнопкой сброса координаты или кнопкой Delete на клавиатуре.

- Кнопка сброса координаты
- Поле величины приращения в радианах
- Кнопка убавления угла на величину, указанную в поле 2
- Кнопка увеличения угла на величину, указанную в поле 2
- Текущая координата в радианах, можно редактировать с клавиатуры
Если для некоторой координаты задан слишком большой угол, цифры в поле 5 будут подсвечены красным. Например, если для шеи (NeckLR) задать угол 6,3 радиан, голова будет направлена вперёд (как если бы она имела координату 0), но в координатах робота она будет перекручена на целый оборот. Такой жест может даже правдоподобно выполняться в редакторе, поскольку редактор не прокручивает голову на указанный угол, а переходит от одной координаты к другой по кратчайшей траектории. При этом на роботе жест с превышением допустимых координат работать не будет. Превышение координат нужно контролировать на этапе разработки жеста.
Кликая мышью в поле 5, можно автоматически создавать ключевую точку:
- Shift-клик: создаётся ключевая точка с текущей координатой (с той координатой, в которой привод находился в этой точке времени)
- Ctrl-клик: копируется координата предыдущей ключевой точки - при этом движение между двумя ключевыми точками будет отсутствовать
Меню контроля лица
В меня контроля лица можно управлять формой элементов лица (закладка 1 Shape), положением бровей (закладка 2 Brows) и положением глаз (закладка 3 Eyes)

Формы элементов лица можно выбирать из выпадающего списка

Если в жесте не переопределены какие-то элементы лица, при выполнении на роботе эти элементы могут остаться от предыдущего жеста. Например, если предыдущий жест закрыл глаза, а текущий жест не устанавливает никакой элемент в поле Lids, то глаза при выполнении жеста останутся закрытыми.
Меню управления бровями
Для каждой брови можно задать её смещение на лице по горизонтали или по вертикали в условных единицах, а также поворот брови на некоторой угол относительно внутреннего конца брови (точка брови, наиболее близкая к носу).

- Поле величины приращения в условных единицах
- Кнопка движения брови влево
- Кнопка движения брови вправо
- Кнопка движения брови вверх
- Кнопка движения брови вниз
- Кнопка поворота брови против часовой стрелки
- Кнопка поворота брови по часовой стрелке
- Текущая координата брови
- Кнопка включения режима симметрии (брови будут двигаться зеркально)
- Кнопка сброса позиции брови
Меню управления глазами
Каждый глаз считается шаром. Глаз поворачивается по вертикали и горизонтали на угол в радианах. Зрачок проецируется на лице в точку, являющуюся проекцией центра зрачка на плоское лицо при данном повороте глаза. При этом само изображение зрачка на лице не деформируется: зрачок остаётся круглым в проекции на лицо.

- Поле величины приращения в радианах
- Кнопка поворота глаза влево
- Кнопка поворота глаза вправо
- Кнопка поворота глаза вверх
- Кнопка поворота глаза вниз
- Кнопка сброса вращения глаза
- Текущая координата глаза
- Кнопка включения режима синхронизации глаз (глаза будут двигаться одинаково)
Шкала времени

- Названия треков
- Поле точек
- Меню управления шкалой времени
Кнопки управления шкалой времени

- Текущее время
- Промотать шкалу времени к началу жеста (к точке start)
- Запустить проигрывание жеста. Проигрывание начинается с текущего времени или с 0, если курсор стоит в конце жеста
- Промотать шкалу времени к концу жеста (к точке end)
- Добавить 1000 мс (1 секунду) к шкале времени
Поле точек

- Точка начала жеста
- Точка окончания жеста
- Указатель текущего времени (можно двигать колесиком мыши или перетаскивать мышкой)
- Точки жеста. Они создаются автоматически, если какой-то из параметров движения робота был изменён. Точку можно выбрать нажатием мыши. Несколько точек можно выбрать, если зажать shift.
- Шкала времени. Один интервал соответствует 40мс, то есть одному кадру в кино.
Перемещение точек
Комбинациями клавиш Shift-влево, Shift-вправо точку можно двигать по шкале времени

Комбинациями клавиш Ctrl-влево, Ctrl-вправо можно двигать по шкале времени стек точек, то есть все точки, находящиеся в одной координате времени

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

Фазы жеста
Жесту может быть приписано несколько фазовых точек. По этим точкам может проводиться синхронизация нескольких жестов в пакете BML. Это точки:
- start – начало жеста (обязательная точка)
- ready – ожидание
- stroke_start – начало замаха
- stroke – пик жеста
- stroke_end – конец замаха
- relax – отдых
- end – окончание жеста (обязательная точка)
Самая левая точка жеста автоматически создает фазовую точку start:

Самая правая точка жеста автоматически создает фазовую точку end:

Между точками состояния start и end можно поставить другие фазовые точки жеста:

Каждый жест должен обладать хотя бы двумя точками в разных координатах времени. То есть жест должен иметь протяжённость во времени. Нельзя сохранить жест, который имеет только одну точку. Жест должен обязательно содержать точки start и end.