Следующим после уровня файловой системы в архитектуре ROS является уровень вычислительного графа. ROS создает сеть, в которой соединены все процессы. Любой узел в системе может получить доступ к этой сети, взаимодействовать с другими узлами, смотреть информацию, которую они посылают и передавать данные в сеть.
Базовыми понятиями на этом уровне являются: узлы, мастер, сервер параметров, сообщения, сервисы, темы и бэги. Все они различными способами обеспечивают граф данными.
- Узлы (nodes) — являются процессами, производящими вычисления. Если вам нужен процесс, который может взаимодействовать с другими узлами, вам нужно создать узел с этим процессом, подключив его к сети ROS. Обычно, система имеет множество узлов для управления различными функциями. Лучше иметь множество узкоспециализированных узлов, выполняющих единственную функцию, чем большой универсальный узел, который бы делал в системе все на свете. Узлы записываются в клиентскую библиотеку ROS. Примером могут служить roscpp или rospy.
- Мастер (master) — обеспечивает регистрацию имени и ищет оставшиеся узлы. Если его нет в системе, вы не сможете обмениваться информацией с узлами, сервисами, сообщениями и прочим. Мастер может быть на компьютере, где узлы работают с другими компьютерами.
- Сервер параметров (parameter server) — дает возможность сохранять данные, используя ключи, размещенные централизованно. С этим параметром возможно конфигурировать узлы во время их работы или для изменения рабочего узла.
- Сообщения(messages) — узлы взаимодействуют друг с другом посредством сообщений. Сообщение содержит данные, передающие информацию другим узлам. ROS имеет много типов сообщений. Возможно разработать свой собственный тип сообщения, используя стандартные сообщения.
- Темы (topics) — Каждое сообщение должно иметь имя, чтобы направляться в сети ROS. Когда узел является отправителем данных, мы говорим, что узел опубликовал тему. Узлы могут получить темы от других узлов, просто подписавшись на тему. Узел может подписаться на тему, и не обязательно, чтобы узел, который бы публиковал тему, должен в настоящий момент существовать. Это позволяет отделить выпуск от потребления. Важно, чтобы название темы было уникальным, чтобы избежать проблем и недоразумений между темами с одинаковыми названиями.
- Сервисы (services) — при публикации темы, вы отправляете данные, имеющие отношения многие-ко-многим, но когда вам нужно сделать запрос или получить ответ от узла, вы не можете сделать это, используя темы. Сервисы дают нам возможность взаимодействовать с узлами. Сервисы также должны иметь уникальное имя. Когда у узла есть сервис, все узлы могут общаться с ним, благодаря клиентским библиотекам ROS.
- Бэги (bags): формат для сохранения и воспроизведения данных сообщений ROS. Бэги являются важным механизмом для хранения данных, таких как данные сенсоров, которые сложно собирать, но они требуются для разработки и тестирования алгоритмов. Бэги часто используются при работе со сложными роботами.
На рисунке ниже показано графическое представление уровня вычислительного графа. Это представление реального робота в реальных условиях. На графе есть узлы, темы, информация о том, на какие темы подписан узел и т.д. На этом графе не представлены сообщения, бэги, сервер параметров и сервисы. Для их графического представления требуются другие инструменты. Инструментом для создания графа является rxgraph.
Узлы
Узлы являются исполнительными элементами, которые могут соединяться с другими процессами, используя темы, сервисы и сервер параметров. Использование узлов в ROS дает нам отказоустойчивость и отделяет код от функционала, тем самым, упрощая систему.
Узел должен иметь в системе уникальное имя. Это имя используется для получения доступа узлом к обмену информацией с другим узлом, используя недвусмысленное имя. Код узла может быть написан с использованием различных библиотек, таких как roscpp (C++) и rospy (Python).
ROS имеет инструменты для обработки узлов и получения информации о них, например, rosnode. rosnode — это инструмент командной строки для отображения информации об узлах, например списка выполняющихся в настоящее время узлов. Поддерживаемые команды:
- rosnode info node — информация об узле
- rosnode kill node — завершает работу узла или отправляет такой сигнал
- rosnode list — список активных узлов
- rosnode machine hostname — список узлов, выполняющихся на конкретной машине или список компьютеров
- rosnode ping node — тест подключения к узлу
- rosnode cleanup — очищает регистрационную информацию о недоступных узлах
Важной особенностью узлов ROS является возможность изменять параметры в момент его запуска. Эта функция позволяет изменить имя узла, имена тем, и названия параметров. Это используется для перенастройки узла без повторной компиляции кода, так что мы можем использовать узел в разных ситуациях.
Пример изменения имени темы:
$ rosrun robotosha_tutorials tutorialX topic1:=/level1/topic1
Эта команда изменит имя темы topic1 на /level1/topic1.
Для изменения параметров узла необходимо добавить нижнее подчеркивание к названию параметра. Например:
$ rosrun robotosha_tutorials tutorialX _param:=9.0
В результате param будет присвоено вещественное число 9.0.
Нельзя использовать зарезервированные системой имена:
- _name — специально зарезервированное ключевое слово для имени узла
- _log — зарезервированное ключевое слово, обозначающее место, куда должен записываться лог-файл узла
- _ip и _hostname — синонимы для ROS_IP и ROS_HOSTNAME
- _master — синоним для ROS_MASTER_URI
- _ns — синоним для ROS_NAMESPACE
Темы
Темы являются шинами, используемыми узлами для передачи данных. Темы могут передаваться без прямого соединения между узлами. Это означает, что выдача и потребление данных разделены. Тема может иметь различных подписчиков.
Каждая тема строго типизирована по используемому для ее публикации типу сообщения ROS, и узлы могут получать только сообщения от узлов соответствующего типа. Узел может подписаться на тему, только если он имеет тот же тип сообщения.
Темы в ROS могут передаваться, используя TCP/IP и UDP. Основанная на TCP/IP передача называется TCPROS и использует постоянное TCP/IP соединение. Это используемый по умолчанию тип передачи в ROS.
Передача, основанная на UDP, называется UDPROS. Это передача с низкой задержкой. Лучше всего подходит для задач дистанционного управления.
В ROS есть инструмент для работы с темами, называемый rostopic. Это инструмент командной строки, который дает информацию о теме или публикует данные непосредственно в сети.
Этот инструмент имеет следующие параметры:
- rostopic bw /topic — отображает ширину канала данных, используемую темой
- rostopic echo /topic — отображает сообщения на экране
- rostopic find meggage_type — ищет темы по их типу
- hz /topic — отображает скорость публикации темы
- rostopic info /topic — информация об активной теме, опубликованных темах, подписчиках и сервисах
- rostopic list — информация об активных темах
- rostopic pub /topic type args — публикует данные к теме. Позволяет создавать и публиковать данные в желаемую тему, прямо из командной строки
- rostopic type /topic — отображает тип темы, то есть тип сообщения, который она выдает.
Сервисы
Когда необходимо обмениваться сообщениями с узлами и получать от них ответ, то это нельзя сделать, используя темы. Для этого нужны сервисы.
Сервисы разрабатываются пользователем и для узлов не существует стандартных сервисов. Файлы с исходным кодом сообщений хранятся в папке srv.
Как и темы, сервисы имеют соответствующий тип, который является файлом с расширением .srv для названия пакета источника. Как и с другими основными типами файловой системы ROS, тип сервиса предсталяет собой имя пакета и имя .srv файла. Например, файл robotosha_tutorials/srv/robotosha_srv1.srv имеет тип сервиса robotosha_tutorials/robotosha_srv1.
В ROS есть два инструмента командной строки для работы с сервисами, rossrv и rosservice. С rossrv мы можем понять информацию о структуре данных сервисов и он используется также как и rosmsg.
С rosservice мы можем перечислять и запрашивать сервисы. Поддерживаемые команды:
- rosservicecall/serviceargs — вызывает сервис, используя указанные параметры
- rosservice find msg-type — ищет сервисы по типу сервиса
- rosservice info /service — информация о сервисе
- rosservice list — список активных сервисов
- rosservice type /service — тип сервиса
- rosservice uri /service — отображает сервис ROSRPC URI
Сообщения
Узел посылает информацию на другой узел, используя сообщения, которые публикуются темами. Сообщение имеет простую структуру, которая использует стандартные типы или типы, разработанные пользователем.
Типы сообщений используют следующие стандартные соглашения об именах ROS: имя пакета, затем прямой слеш и имя .msg файла. Например, std_msgs/msg/String.msg имеет тип сообщения std_msg/String.
В ROS есть иструмент командной строки rosmsg для получения информации о сообщениях.
Используемые параметры:
- rosmsg show — отображает поля сообщения
- rosmag list — список всех сообщений
- rosmsg package — список всех сообщений в пакете
- rosmsg packages — список всех пакетов, в которых есть сообщение
- rosmsg users — ищет файлы с кодом, которые используют тип сообщиения
- rosmsg md5 — отображает MD5 сумму сообщения
Бэги
Бэг — файл, созданный ROS с расширением .bag для сохранения всей информации сообщений, тем, сервисов и так далее. Эти данные можно использовать для визуализации, можно воспроизводить, останавливать, перематывать и производить другие операции.
Бэг-файл может быть воспроизведен в ROS как реальный сеанс, посылая темы одновременно с теми же данными. Обычно, мы используем эту функциональность для отладки алгоритмов. Для использования бэг-фалов в ROS есть следующие инструменты:
- rosbag — используется для записи, воспроизведения и других операций
- rxbag — используется для визуализации данных в графическом окружении
- rostopic — помогает выяснить темы, отправленные в узлы
Мастер
Мастер ROS обеспечивает именование и регистрацию сервисов в остальных узлах в системе ROS. Он отслеживает издателей и подписчиков на темы, также как и на сервисы. Ролью мастера является дать возможность узлам ROS находить друг друга. После того, как узлы соединены друг с другом, они обмениваются информацией по принципу один-к-одному.
Мастер также обеспечивает сервер параметров. Мастер, в общем случае, запускается, используя команду roscore, которая загружает мастер ROS наряду с другими основными компонентами.
Сервер параметров
Сервер параметров является используемым совместно многомерным словарем, доступным через сеть. Узлы используют этот сервер для хранения и извлечения параметров во время выполнения.
Сервер параметров реализуется, используя XML-RPC и запускается внутри мастера ROS. Это означает. что его API доступны из обычных XMLRPC библиотек.
Сервер параметров использует типы данных XMLRPC для значений параметров, включая следующие:
- 32-bit integer
- Boolean
- String
- Double
- ISO 8601 date
- List
- Base 64-encoded binary data
В ROS для работы с сервером параметров имеется инструмент rosparam. Поддерживаемые параметры:
- rosparam list — списки всех параметров на сервере
- rosparam get parameter — получает значение параметра
- rosparam set param value — устанавливает значение параметра
- rosparam delete parameter — удаляет параметр
- rosparam dump file — сохраняет сервер параметров в файл
- rosparam load file — загружает файл (с параметрами) на сервер параметров
[add_ratings]