ОписаниеЦели и преимуществаАрхитектураРепозиторий модулейHTTP APIДокументацияДорожная карта (MVP)Демонстрация (видео)Загрузки
XORDE at GitHub  XORDE on YouTube

© 2018—2021 МФТИ
Лаборатория Нейророботехники

Состав системы

1. Ядро

Ядро операционной среды XORDE:

  • реализовано на C++ (QT)
  • доступно к запуску на виртуально любой операционной системе (Windows, Linux, MacOS, Android)
  • является программным обеспечением с открытым исходным кодом
  • организовывает слежение за состоянием и жизненным циклом модулей
  • работает по составленной пользователем схеме соединений и настроек
  • инициализирует компоненты модулей
  • оказывает минимальное влияние на операционную систему, в которой оно запущено (консольное приложение).
  • осуществляет передачу данных по протоколу ONB
  • для соединения мультимодальных модулей использует интерфейс WebSocket
Структура ядра XORDE

1.1. Схема

Схема – это описание состава компонентов, их родительских модулей и соединений входов и выходов.
Для визуального программирования схема также дополнена информацией о размере и положении компонентов на виртуальной плоскости чертежа схемы.

1.2. Хаб

Обеспечивает обмен данными между компонентами, согласно загруженной схеме.

1.3. Менеджер локальных модулей

Осуществляет запуск и слежение за жизненным циклом локальных модулей, представляющих собой отдельные (замкнутые) приложения. Согласно настройкам запуска, модули могут иметь:
  • горячую загрузку – должны быть запущены во время работы системы постоянно. Такой вид загрузки рекомендован для модулей, отвечающих за работу с физическими устройствами (например, камеры и приводы), так как их наличие и состав может меняться (например, подключена новая камера, отключился сервопривод)
  • холодную (отложенную) загрузку – запускаются только по необходимости при наличии их в схеме. К таким модулям относятся чисто алгоритмические модули, не зависящие от устройств.

    1.4. Сервер данных

    Используется для опроса модулей, двусторонней передачи данных между компонентами посредством протокола ONB через WebSocket

    1.5. Оперативный http-сервер

    Используется для высокоуровневого опроса и управления состоянием ядра, текущей схемы; предоставляет возможности управления и наблюдения за компонентами (запрос значений на выходах компонентов). Работает посредством http-запросов, результатом которых является ответ в формате JSON.
    Предоставляет также ограниченные возможности взаимодействия с файловой системой (чтение и запись файлов в защищённой среде), предоставляет встроенный Web-интерфейс в формате HTML-страницы.

    1.6. Web-интерфейс

    Высокоуровневый HTML+JavaScript интерфейс, доступный для браузера любого устройства в той же локальной сети.
    Web-интерфейс позволяет:
  • Наблюдать и влиять на состояниеv операционной среды: модулей и компоненты
  • Строить схему посредством визуального Drag’n’Drop’n’Connect интерфейса
  • Осуществлять запуск и останов построенных схем
  • Минимизировать нагрузку на операционную среду, в которой запущен XORDE, путём передачи тяжёлых графических задач в браузер клиента

    2. Модули

    Основными исполнительными элементами являются модули. Модуль представляет собой подпрограмму, реализующую определенные алгоритмы или взаимодействие с аппаратной частью.

    Состав модуля XORDE
    Виды модулей по расположению:
    • Встроенные – загружаются как плагин (динамическая библиотека) в ядре, наследуют то же адресное пространство памяти и при соединении двух встроенных компонентов взаимодействие между ними происходит в оперативной памяти.
    • Локальные – запускаемые программы на том же компьютере, что и ядро. Взаимодействие с такими модулями происходит по внутренней локальной сети (localhost)
    • Внешние – программы, запущенные на другом компьютере, доступном в единой локальной сети.

    Каждый модуль представляет собой менеджер компонентов его составляющих.

    Функции модуля:
    • Описательная – сообщает о своём составе (компонентах) и своих возможностях
    • Трансферная – передача сообщений ядру и от ядра для:
      • выполнения внутренних операций
      • передачи данных отдельному компоненту и от него
    Требования к модулю:
    • Предоставлять совместимый ONB-интерфейс (плагины – через память, локальные и внешние – через WebSocket): конфигурация, инициализация компонентов, приёмо-передача данных
    • Предоставление текущей конфигурации по запросу
    • (Опционально) Иконка
    • (Опционально) Иконки компонентов
    • Если не требуется визуализация (XORDE предоставляет возможности встроенного просмотра и редактирования настроек компонентов в виде таблицы) – то выполнять в виде консольного приложения, чтобы минимизировать нагрузку на процессор-исполнитель

    3. Компоненты

    Компонент — это составляющая модуля, отвечающая за исполнение отдельной функции. Например, отдельный привод, видеокамера или детектор лица на изображении.

    Состав компонента XORDE

    Родительский модуль отвечает за жизненный цикл компонента, передает ему настройки при инициализации (загрузке схемы), получает и передает данные.

    Компоненты по виду бывают:
    • Уникальные – осуществляют связь с объектом, взаимодействие с которым возможно по одному единственному каналу. К таким компонентам относятся представители физических устройств (приводы, датчики, камеры) или, например, обёртки программного обеспечения, таких как Gazebo и других высоконагруженных или самостоятельных алгоритмов.
    • Фабричные – компоненты, которые можно произвольно создавать и настраивать. Примером могут служить конвертеры данных, логические и арифметические элементы и другие алгоритмы
    Для операционной системы компонент представляется в виде:
    • Названия
    • Уникального для схемы имени
    • Набора полей входов, выходов и настроек

    Каждое поле компонента представляет собой объект экосистемы ONB (ObjectONB).

    4. Процедуры и принципы инициализации модулей и компонентов

    Конфигурация (конфиг) - это описание компонента в формате, описывающий возможности компонента, его состав и возможности.

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

    Последовательность запуска модулей

    1. Модули-плагины (динамические библиотеки) из папки "xoPlugins".
      Плагин подключается к серверу. Если конфига для этого плагина не существует или конфиг имеет другую версию (например, модуль был обновлён) - то производится сбор конфига

    2. Локальные модули-приложения из папки "xoModules".
      Эти модули могут иметь холодную и горячую загрузку, иначе говоря, загрузку по необходимости и загрузку принудительную.
      Сбор конфигов для них проводится в случае:
      • Отсутствия конфига (в случае "холодного" модуля - он запускается, сохраняется его конфиг, модуль закрывается)
      • Изменения состава объявлений компонентов (прежде всего при добавлении уникальных компонентов)
      • Изменении версии модуля (обновление модуля)

    3. Внешние модули
      Эти модули поключаются каким-либо образом к серверу (с локального компьютера и другого компьютера в локальной сети). Сбор конфигов производится каждый раз при подключении модуля к серверу (так как процесс этого модуля никак не регулируется операционной средой) и изменении состава объявлений компонентов (уникальные компоненты).