Первичный механизм для ROS 2 узла, чтобы обмениваться данными должен отправить и получить сообщения. Сообщения передаются по теме, и каждая тема имеет уникальное имя в сети ROS 2. Если узел хочет поделиться информацией, он должен использовать издателя, чтобы отправить данные в тему. Узел, который хочет получить ту информацию, должен использовать подписчика для той же самой темы. Помимо ее уникального имени, каждая тема также имеет тип сообщения, который определяет тип сообщений, которым позволяют быть переданными в определенной теме.
В этом примере показано, как опубликовать и подписаться на темы в сети ROS 2. Это также показывает как:
Подпишитесь и ожидайте сообщений
Создайте демонстрационную сеть ROS 2 с несколькими издателями и подписчиками.
Используйте ros2 topic list видеть, какие темы доступны.
Примите, что вы хотите подписаться на /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 несколько раз в командной строке вы видите, что значения постоянно обновляются.
Остановите подписчика положения путем очищения переменной подписчика
Примечание: существуют другие способы извлечь информацию из функций обратного вызова помимо использования глобальных переменных. Например, можно передать объект указателя в качестве дополнительного аргумента к функции обратного вызова. См. документацию Определения Коллбэка для получения дополнительной информации об определении функций обратного вызова.
Опубликуйте сообщения
Создайте издателя, который отправляет сообщения строки ROS 2 в /chatter тема.
Создайте и заполните сообщение ROS 2, чтобы отправить к /chatter тема.
Используйте ros2 topic list проверять что /chatter тема доступна в сети ROS 2.
/chatter
/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
Следующие шаги