Основным механизмом обмена данными между узлами АФК является передача и прием сообщений. Сообщения передаются по теме, и каждая тема имеет уникальное имя в сети ROS. Если узел хочет поделиться информацией, он использует издателя для отправки данных в раздел. Узел, который хочет получить эту информацию, использует подписчика для этой же темы. Помимо своего уникального имени, каждый раздел также имеет тип сообщения, который определяет типы сообщений, которые могут быть переданы в рамках этого раздела.
Эта связь между издателем и абонентом имеет следующие характеристики:
Темы используются для общения «многие ко многим». Многие издатели могут отправлять сообщения на одну тему и многие подписчики могут их получать.
Издатели и подписчики разобщены по темам и могут создаваться и уничтожаться в любом порядке. Сообщение может быть опубликовано в раздел, даже если нет активных подписчиков.
Концепция тем, издателей и подписчиков проиллюстрирована на рисунке:

В этом примере показано, как публиковать и подписываться на разделы в сети ROS. В нем также показано, как:
Дождитесь получения нового сообщения
Использовать обратные вызовы для обработки новых сообщений в фоновом режиме
Предпосылки: начало работы с ROS, подключение к сети ROS
Запустите основную запись ROS в MATLAB ® с помощью rosinit команда.
rosinit
Launching ROS Core... Done in 0.84361 seconds. Initializing ROS master on http://192.168.0.10:49966. Initializing global node /matlab_global_node_39840 with NodeURI http://bat6315glnxa64:41167/
Создание примера сети ROS с несколькими издателями и подписчиками с использованием функции помощника exampleHelperROSCreateSampleNetwork.
exampleHelperROSCreateSampleNetwork
Использовать rostopic list для просмотра доступных тем.
rostopic list/pose /rosout /scan /tf
Использовать rostopic info чтобы проверить, публикуются ли какие-либо узлы в /scan тема. Команда ниже показывает, что node_3 публикует на него.
rostopic info /scan
Type: sensor_msgs/LaserScan Publishers: * /node_3 (http://bat6315glnxa64:46535/) Subscribers: * /node_1 (http://bat6315glnxa64:39337/) * /node_2 (http://bat6315glnxa64:35615/)
Использовать rossubscriber чтобы подписаться на /scan тема. Если тема уже существует в сети ROS (как здесь), rossubscriber автоматически определяет тип сообщения, поэтому указывать его не требуется.
laser = rossubscriber('/scan');
pause(2)Использовать receive для ожидания нового сообщения. (Второй аргумент - тайм-аут в секундах.) Продукция scandata содержит полученные данные сообщения.
scandata = receive(laser,10)
scandata =
ROS LaserScan message with properties:
MessageType: 'sensor_msgs/LaserScan'
Header: [1x1 Header]
AngleMin: -0.5216
AngleMax: 0.5243
AngleIncrement: 0.0016
TimeIncrement: 0
ScanTime: 0.0330
RangeMin: 0.4500
RangeMax: 10
Ranges: [640x1 single]
Intensities: [0x1 single]
Use showdetails to show the contents of the message
С некоторыми типами сообщений связаны визуализаторы. Для сообщения LaserScan: rosPlot отображает данные сканирования. MaximumRange пара «имя-значение» определяет максимальный диапазон печати.
figure
plot(scandata,'MaximumRange',7)
Вместо использования receive для получения данных можно указать вызываемую функцию при получении нового сообщения. Это позволяет выполнять другой код MATLAB, пока абонент ожидает новых сообщений. Обратные вызовы необходимы для использования нескольких абонентов.
Подпишитесь на /pose тема, использование функции обратного вызова exampleHelperROSPoseCallback.
robotpose = rossubscriber('/pose',@exampleHelperROSPoseCallback)robotpose =
Subscriber with properties:
TopicName: '/pose'
LatestMessage: [0x1 Twist]
MessageType: 'geometry_msgs/Twist'
BufferSize: 1
NewMessageFcn: @exampleHelperROSPoseCallback
DataFormat: 'object'
Одним из способов совместного использования данных между основной рабочей областью и функцией обратного вызова является использование глобальных переменных. Определение двух глобальных переменных pos и orient.
global pos global orient
Глобальные переменные pos и orient назначены в exampleHelperROSPoseCallback при получении новых данных сообщения в /pose тема.
Подождите несколько секунд, чтобы убедиться, что абонент может получать сообщения. Самые последние данные о положении и ориентации всегда сохраняются в pos и orient переменные.
pause(2) pos
pos = 1×3
-0.1612 -0.2381 0.0105
orient
orient = 1×3
-0.2323 0.2905 0.1572
При вводе pos и orient несколько раз в командной строке можно увидеть, что значения постоянно обновляются.
Остановите абонента позы, очистив переменную абонента
clear robotposeПримечание.Существуют и другие способы извлечения информации из функций обратного вызова, помимо использования глобальных функций. Например, можно передать объект дескриптора в качестве дополнительного аргумента функции обратного вызова. Дополнительные сведения об определении функций обратного вызова см. в документации по определению обратного вызова.
Создание издателя, отправляющего строковые сообщения ROS в /chatter (см. раздел Работа с основными сообщениями ROS).
chatterpub = rospublisher('/chatter','std_msgs/String')
chatterpub =
Publisher with properties:
TopicName: '/chatter'
NumSubscribers: 0
IsLatching: 1
MessageType: 'std_msgs/String'
DataFormat: 'object'
pause(2) % Wait to ensure publisher is registeredСоздание и заполнение сообщения ROS для отправки в /chatter тема.
chattermsg = rosmessage(chatterpub);
chattermsg.Data = 'hello world'chattermsg =
ROS String message with properties:
MessageType: 'std_msgs/String'
Data: 'hello world'
Use showdetails to show the contents of the message
Использовать rostopic list для проверки того, что /chatter раздел доступен в сети ROS.
rostopic list/chatter /pose /rosout /scan /tf
Определение абонента для /chatter тема. exampleHelperROSChatterCallback вызывается при получении нового сообщения и отображает строковое содержимое в сообщении.
chattersub = rossubscriber('/chatter', @exampleHelperROSChatterCallback)chattersub =
Subscriber with properties:
TopicName: '/chatter'
LatestMessage: [0x1 String]
MessageType: 'std_msgs/String'
BufferSize: 1
NewMessageFcn: @exampleHelperROSChatterCallback
DataFormat: 'object'
Опубликовать сообщение в /chatter тема. Строка отображается при обратном вызове абонента.
send(chatterpub,chattermsg) pause(2)
ans = 'hello world'
exampleHelperROSChatterCallback функция была вызвана сразу после публикации строкового сообщения.
Удалите образцы узлов, издателей и подписчиков из сети ROS. Очистить глобальные переменные pos и orient.
exampleHelperROSShutDownSampleNetwork clear global pos orient
Завершите работу хозяина ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_39840 with NodeURI http://bat6315glnxa64:41167/ Shutting down ROS master on http://192.168.0.10:49966.
Дополнительные сведения об обработке сообщений ROS в MATLAB см. в разделах Работа с базовыми сообщениями ROS и Работа со специализированными сообщениями ROS.
Для получения информации об услугах ROS см. раздел Вызов и предоставление услуг ROS.