Robotics Operating System — это гибкий Open Source-фреймворк для написания ПО для роботов. Брайен Поузи, вице-президент Relevant Technologies по исследованиям и разработкам, рассказывает на портале ITPro Today об архитектуре ROS, включая узлы, темы, сообщения, сервисы, действия и пакеты.

ROS (произносится как «Роз»), — это популярная платформа для создания робототехнических проектов с открытым исходным кодом. Несмотря на свое название, ROS не является традиционной ОС, хотя и предоставляет некоторые функции, похожие на функции ОС. Подобно ОС Windows или Linux, ROS выступает в качестве уровня аппаратной абстракции, позволяя коду для робототехники работать с различными аппаратными платформами. В моей организации, например, ROS работает на различных платформах, включая Raspberry Pi и Jetson Nano.

Так же как ROS совместима с различными аппаратными платформами, она поддерживает несколько различных языков программирования. Python, безусловно, самый популярный выбор для написания приложений ROS, но C++ также широко используется.

Ключом к успешной разработке робототехники на базе ROS является понимание архитектуры ROS. Существует несколько высокоуровневых компонентов, составляющих основу всех ROS-проектов.

Самый основной строительный блок в ROS — это узел (nod). Каждое приложение ROS содержит как минимум один узел, хотя обычно проекты включают в себя несколько узлов. Каждый узел выполняет определенную задачу. Например, если у робота есть лазерный скалер (устройство, использующее лазер для измерения расстояния), то, как правило, есть узел, связанный с этим оборудованием. Аналогично, если у робота есть колеса, то, скорее всего, будет узел для колес или даже отдельные узлы для каждого колеса. В моем текущем проекте я строю робота с гусеницами (как у танка) вместо колес. Поскольку две гусеницы движутся независимо друг от друга, для каждой из них будет отдельный узел.

Следующий важный элемент ROS — тема (topic), по сути, именованная шина связи между узлами. Чтобы понять, как работают темы, рассмотрим предыдущий пример с роботом, оснащенным колесами и лазерным скалером. Для простоты представим, что один узел управляет всеми колесами. Кроме того, нам нужно, чтобы робот двигался по прямой линии, пока не окажется в 12 дюймах от стены.

Проблема заключается в том, что, хотя у робота есть необходимое оборудование, лазерный скалер и колеса управляются разными узлами. Таким образом, узел колеса не знает, как далеко робот находится от стены.

Вот тут-то на помощь и приходят темы. Тема позволяет этим узлам общаться, предоставляя именованный канал для обмена сообщениями.

Сообщение (message) — это структура данных, используемая для передачи информации между темами. Данные в этих сообщениях должны быть в стандартном формате, понятном как узлам-отправителям, так и узлам-получателям.

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

Это требование позволяет понять важную концепцию: большинство узлов в ROS имеют отношения издателя и подписчика. В нашем примере узел лазерного скалера выступает в роли издателя, поскольку он собирает данные датчиков и отправляет (публикует) их по теме. Узел колеса является подписчиком, поскольку получает данные от узла-издателя. Хотя часто между издателями и подписчиками существует отношение «один к одному», вы можете легко создать связь «один ко многим», когда один издатель отправляет данные многим подписчикам.

Иногда возникает ситуация, когда издатель отправляет данные подписчику и нуждается в ответе. Например, узел лазерного скалера может захотеть узнать, остановились ли колеса, когда робот приблизился к стене. В таких случаях мы используем сервисы (services). Сервис похож на сообщение, но включает в себя пару сообщений: одно отправленное (запрос) и одно полученное (ответ).

В ситуациях, требующих постоянного общения, мы обычно используем действия (actions), а не сервисы. Действие похоже на сервис, но предназначено для более длительных задач.

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

Продолжение следует.