Робот
Устройство и подключение робота
Управляющее программное обеспечение
Описание поведения на языке BML
API
Использование системы диалога DialogFlow
Локализация роботом лица пользователя
Когнитивный компонент
Как устроена обработка текста?
Синтаксический парсер
Обработка массива текстов
База данных результатов разбора

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

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

<bml>
  <head id="1" lexeme="eyes_up_left3"/>
  <pupils id="2" lexeme="eyes_up_left3"/>
  <body id="3" lexeme="breath2"/>
</bml>

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

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

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

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

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

<bml>
  <hand_r id="1" lexeme="eyes_up_left3"/>
  <head id="2" lexeme="nod3"/>
</bml>

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

gaze (дополнителен с pupils)
speech
figure
pupils (дополнителен с gaze)
head
eyes
brows
lids
mouth (дополнителен с speech)
neck (ранее head_rotation)
body
hands
hand_l
hand_r

Если использовать более общий тэг (например, <figure>), то в том же BML уже нельзя использовать конкретный тэг (например, <hands>).

Синхронизация движений в пакете BML

Отдельные движения внутри пакета BML могут быть связаны друг с другом. Например, робот может кивнуть одновременно с махом рукой, то есть пик движения кивок должен совпадать с пиком движения мах рукой. Задать такие соответствия можно через контрольные точки. У каждого жеста есть контрольные точки start и end. У жеста могут быть и другие контрольные точки, например, пик выполнения жеста – stroke. Узнать, какие контрольные точки присутствуют у конкретного жеста, можно из описания жеста или из базы жестов.

<bml>
  <head id="my_nod" lexeme="head_lexeme"/>
  <hands lexeme="hands_lexeme" stroke="my_nod:stroke"/>
</bml>

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

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

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

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

Наличие у одного сценария двух пакетов BML записывается следующим образом:

<scenario>
  <bml>
    <head id="head" lexeme="head_lexeme"/>
  </bml>
  <bml>
    <hands id="hands" lexeme="hands_lexeme"/>
  </bml>
</scenario>

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

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

<scenario>
  <bml>
    <head id="head1" lexeme="head_lexeme"/>
  </bml>
</scenario>
<scenario>
  <bml>
    <hands id="hands" lexeme="hands_lexeme"/>
  </bml>
</scenario>

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

<scenario>
  <bml>
    <head id="head1" lexeme="head_lexeme"/>
  </bml>
</scenario>
<scenario>
  <bml>
    <hands id="hands" lexeme="hands_lexeme"/>
  </bml>
  <bml>
    <head id="head2" lexeme="hands_lexeme"/>
  </bml>
</scenario>

Если сценарий Sc1 с большой активизацией добавляется в очередь, где уже выполняется пакет BML из менее активизированного сценария Sc2, то выполнение сценария Sc2 будет приостановлено. Будет выполнен BML-пакет из сценария Sc1, а затем будет продолжено выполнение сценария Sc2.



Пакеты BML можно передавать роботу из программы RobotGUI.exe или из внешней программы через API.

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