Первичный механизм для ROS 2 узла, чтобы обмениваться данными должен отправить и получить сообщения. Сообщения передаются по теме, и каждая тема имеет уникальное имя в сети ROS 2. Если узел хочет поделиться информацией, он должен использовать издателя, чтобы отправить данные в тему. Узел, который хочет получить ту информацию, должен использовать подписчика в той же самой теме. Помимо ее уникального имени, каждая тема также имеет тип сообщения, который определяет тип сообщений, которым позволяют быть переданными в определенной теме.
В этом примере показано, как опубликовать и подписаться на темы в сети ROS 2. Это также показывает как:
Подпишитесь и ожидайте сообщений
Создайте демонстрационную сеть ROS 2 с несколькими издателями и подписчиками.
Используйте ros2 topic list
видеть, какие темы доступны.
/clock
/parameter_events
/pose
/scan
Примите, что вы хотите подписаться на /scan
тема. Используйте ros2subscriber
подписываться на /scan
тема. Задайте имя узла с подписчиком. Если тема уже существует в сети ROS 2, ros2subscriber
обнаруживает его тип сообщения автоматически, таким образом, вы не должны задавать его.
Используйте receive
ожидать нового сообщения. Задайте тайм-аут 10 секунд. Выход scanData
содержит полученные данные о сообщении.
Можно теперь удалить подписчика laserSub
и узел, сопоставленный к нему.
Подпишитесь Используя функции обратного вызова
Вместо того, чтобы использовать receive
чтобы получить данные, можно задать функцию, которая будет названа, когда новое сообщение получено. Это позволяет другому коду MATLAB выполняться, в то время как подписчик ожидает новых сообщений. Коллбэки важны, если вы хотите использовать несколько подписчиков.
Подпишитесь на /pose
тема, с помощью функции обратного вызова exampleHelperROS2PoseCallback
, который берет полученное сообщение в качестве входа. Один способ осуществлять обмен данными между вашей основной рабочей областью и функцией обратного вызова состоит в том, чтобы использовать глобальные переменные. Задайте две глобальных переменные pos
и orient
.
Глобальные переменные pos
и orient
присвоены в exampleHelperROS2PoseCallback
функционируйте, когда новые данные о сообщении будут получены на /pose
тема.
function exampleHelperROS2PoseCallback(message)
% Declare global variables to store position and orientation
global pos
global orient
% Extract position and orientation from the ROS message and assign the
% data to the global variables.
pos = [message.linear.x message.linear.y message.linear.z];
orient = [message.angular.x message.angular.y message.angular.z];
end
Подождите сеть, чтобы опубликовать другой /pose
сообщение. Отобразите обновленные значения.
Если вы вводите в pos
и orient
несколько раз в командной строке вы видите, что значения постоянно обновляются.
Остановите подписчика положения путем очищения переменной подписчика
Примечание: существуют другие способы извлечь информацию из функций обратного вызова помимо использования глобальных переменных. Например, можно передать объект указателя в качестве дополнительного аргумента к функции обратного вызова. См. Определение Коллбэка (MATLAB) документация для получения дополнительной информации об определении функций обратного вызова.
Опубликуйте сообщения
Создайте издателя, который отправляет сообщения строки ROS 2 в /chatter
тема.
Создайте и заполните сообщение ROS 2, чтобы отправить к /chatter
тема.
Используйте ros2 topic list
проверять что /chatter
тема доступна в сети ROS 2.
/chatter
/clock
/parameter_events
/pose
/scan
Задайте подписчика для /chatter
тема. exampleHelperROS2ChatterCallback
называется, когда новое сообщение получено и отображает содержимое строки в сообщении.
chatterSub =
ros2subscriber with properties:
TopicName: '/chatter'
LatestMessage: []
MessageType: 'std_msgs/String'
NewMessageFcn: @exampleHelperROS2ChatterCallback
History: 'keeplast'
Depth: 10
Reliability: 'reliable'
Durability: 'volatile'
Опубликуйте сообщение к /chatter
тема. Заметьте, что строка отображена коллбэком подписчика.
exampleHelperROS2ChatterCallback
функция была вызвана, когда подписчик получил сообщение строки.
Отключитесь от сети ROS 2
Удалите демонстрационные узлы, издателей и подписчиков от сети ROS 2. Также очистите глобальные переменные pos
и orient
Следующие шаги