Первичный механизм для 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
Следующие шаги