Робот
Устройство и подключение
Управляющее ПО
Язык BML
Словарь жестов
SSSender
API робота
Когнитивный компонент
Обработка текста
Парсер
Массивы текстов
База разборов

Описание поведения на языке BML

Язык BML (Behavior Markup Language) позволяет описывать поведение робота. Мы основываемся на международном стандарте языка BML. Язык BML создан на базе языка XML, это делает BML так похожим на привычный язык описания страниц интернета – HTML. Из-за простоты и сходства с HTML язык BML очень просто освоить. Отдельный пакет на языке BML описывает фрагмент поведения – это движения, которые робот выполнит одновременно. Пакет ограничивается тэгами <bml>, а внутри пакета описываются движения, которые нужно выполнить разными частями робота: головой, глазами, телом и т. д. Конкретный тэг (head, pupils, body) описывает часть тела робота, а параметр lexeme обозначает жест, из которого нужно взять движение для данной части тела.

<bml>
  <head lexeme="eyes_up_left3"/>
  <pupils lexeme="eyes_up_left3"/>
  <body lexeme="breath23"/>
</bml>

Здесь робот головой и глазами выполняет жест eyes_up_left3, а телом выполняет жест breath23. Оба эти жеста должны быть заранее нарисованы и сохранены в базе жестов.

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

Комбинация движений в пакете BML

Жест может быть нарисован для нескольких частей робота: например, для двух рук и головы. В конкретном BML можно обратиться ко всем элементам этого жеста с помощью общего тэга <figure>:

<bml>
  <figure lexeme="eyes_up_left3"/>
</bml>

От общего жеста можно взять только часть, например, движение правой руки. В этом случае можно использовать более конкретный тэг <hand_r> – тэг для правой руки. Можно даже добавить в тот же BML движение для головы из другого жеста. Таким образом, можно скомбинировать пакет BML из элементов разных жестов.

<bml>
  <head lexeme="eyes_up_left3"/>
  <hand_l lexeme="appeal3"/>
</bml>

В этом случае головой и глазами робот выполняет жест eyes_up_left3, а левой рукой - жест appeal3.

Речь

Робот может произносить высказывания с помощью тэга <speech text="Привет"/>. Речь комбинируется с другими жестами и исполняется одновременно с ними.

<bml>
  <head lexeme="eyes_up_left3"/>
  <hand_l lexeme="appeal3"/>
  <speech text="Привет"/>
</bml>

Вот тэги языка 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>
  <head id="my_nod" lexeme="head_lexeme"/>
  <hands lexeme="hands_lexeme" stroke="my_nod:stroke"/>
</bml>

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

Сценарии и объединение пакетов BML

Мы используем расширение языка BMLsBML (Scenario BML), где каждый пакет BML принадлежит тому или иному сценарию. Сценарий – это поведенческая реакция робота, которая может быть выражена через любые принадлежащие ей пакеты BML.

Чтобы описать длинную последовательность в поведении, объедините в один сценарий несколько пакетов, тогда они будут выполнены последовательно:

<scenario id="test">
  <bml>
    <head lexeme="nod4"/>
  </bml>
  <bml>
    <hands lexeme="appeal3"/>
  </bml>
</scenario>

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

<behavior>
  <scenario id="head_reaction">
    <bml>
      <head lexeme="nod4"/>
    </bml>
  </scenario>
  <scenario id="hands_reaction">
    <bml>
      <hands lexeme="appeal3"/>
    </bml>
  </scenario>
</behavior>

Чтобы объединить несколько сценариев, используется общий тэг </behavior>

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



Подробнее про API программного обеспечения робота