Описание поведения на языке BML
Язык BML (Behavior Markup Language) позволяет описывать поведение робота. Мы основываемся на международном стандарте языка BML.
Язык BML создан на базе языка XML, это делает BML так похожим на привычный язык описания страниц интернета – HTML. Из-за простоты и сходства с HTML язык BML очень просто освоить.
Отдельный пакет на языке BML описывает фрагмент поведения – это движения, которые робот выполнит одновременно. Пакет ограничивается тэгами <bml>
, а внутри пакета описываются движения, которые нужно выполнить разными частями робота: головой, глазами, телом и т. д. Конкретный тэг (head, pupils, body
) описывает часть тела робота, а параметр lexeme
обозначает жест, из которого нужно взять движение для данной части тела.
Здесь робот головой и глазами выполняет жест eyes_up_left3
, а телом выполняет жест breath23
. Оба эти жеста должны быть заранее нарисованы и сохранены в базе жестов.
Мы используем термин жест в очень широком значении. Мы считаем, что жест – это некоторое движение, элемент поведения, которое входит в словарь и сохранено в качестве отдельного элемента в базу жестов.
Комбинация движений в пакете BML
Жест может быть нарисован для нескольких частей робота: например, для двух рук и головы. В конкретном BML можно обратиться ко всем элементам этого жеста с помощью общего тэга <figure>
:
От общего жеста можно взять только часть, например, движение правой руки. В этом случае можно использовать более конкретный тэг <hand_r>
– тэг для правой руки. Можно даже добавить в тот же BML движение для головы из другого жеста. Таким образом, можно скомбинировать пакет BML из элементов разных жестов.
В этом случае головой и глазами робот выполняет жест eyes_up_left3
, а левой рукой - жест appeal3
.
Речь
Робот может произносить высказывания с помощью тэга <speech text="Привет"/>
. Речь комбинируется с другими жестами и исполняется одновременно с ними.
Вот тэги языка BML, которые можно использовать для обозначения частей робота:
gaze (использует pupils, neck - если тэг neck свободен)
speech (перезаписывает mouth)
figure
head
neck (ранее head_rotation)
face
pupils (дополнителен с gaze)
brows
mouth (дополнителен с speech)
eyes
lids
body
hands
hand_l
hand_r
При выполнении тэг займёт все исполнительные органы, которые от него зависят. Поэтому более общий тэг (например, <figure>
), займет все исполнительные органы робота и для конкретного тэга (например, <hands>
) не останется места - второй из этих тэгов будет выполнен, когда закончится первый тэг.
Тэг <speech>
может накладываться на другие жесты, кроме <mouth>
: если <mouth>
и <speech>
появляются в одном пакете BML, они будут исполнены последовательно.
Синхронизация движений в пакете BML
Отдельные движения внутри пакета BML могут быть связаны друг с другом. Например, робот может кивнуть одновременно с махом рукой, то есть пик движения кивок будет совпадать с пиком движения мах рукой. Задать такие соответствия можно через контрольные точки. У каждого жеста есть контрольные точки start
и end
. У жеста могут быть и другие контрольные точки, например, пик выполнения жеста – stroke
. Узнать, какие контрольные точки присутствуют у конкретного жеста, можно из описания жеста или из базы жестов.
Внутри пакета BML синхронизация тэгов должна быть устроена древовидно: нельзя, чтобы два тэга ссылались друг на друга или чтобы у двух тэгов было две точки синхронизации.
Сценарии и объединение пакетов BML
Мы используем расширение языка BML – sBML (Scenario BML), где каждый пакет BML принадлежит тому или иному сценарию. Сценарий – это поведенческая реакция робота, которая может быть выражена через любые принадлежащие ей пакеты BML.
Чтобы описать длинную последовательность в поведении, объедините в один сценарий несколько пакетов, тогда они будут выполнены последовательно:
Поведение робота определяется множеством разных сценариев. Два пакета BML могут быть выполнены одновременно, если они принадлежат разным сценариям и совместимы по своим тэгам. Например, в этом примере первый пакет BML задаёт движение головой, а второй – движение рукой. Поскольку пакеты BML принадлежат разным сценариям, они будут выполнены одновременно:
Чтобы объединить несколько сценариев, используется общий тэг </behavior>
При реальном поведении робота сценарии конкурируют за исполнительные органы. Первым выполняется тот сценарий, который имеет наибольшую активацию. Если некоторый другой сценарий имеет меньшую активизацию, то из данного сценария будет выполнен тот пакет, который совместим по тэгам с пакетами более активированных сценариев.