ros2subscriber

Подписаться на сообщения по теме

Описание

Используйте ros2subscriber для получения сообщений по теме. Когда узлы ROS 2 публикуют сообщения по этой теме, MATLAB® получит это сообщение через этого абонента.

Создание

Описание

пример

sub = ros2subscriber(node,topic) создает абонента, sub, для темы с именем topic который уже существует в сети ROS 2. node является ros2node объект, к которому присоединяется этот абонент. Абонент получает тип сообщения темы из списка тем сети.

Примечание

Тема должна находиться в списке тем сети.

пример

sub = ros2subscriber(node,topic,type) создает абонента для темы и добавляет эту тему в список тем сети. Если список тем уже содержит соответствующий раздел, sub будет добавлен в список подписчиков на эту тему. The type должно совпадать с темой. Используйте этот синтаксис, чтобы избежать ошибок, когда абонент может подписаться на тему перед добавлением темы в сеть.

пример

sub = ros2subscriber(node,topic,callback) задает функцию обратного вызова, callbackи необязательные данные для запуска, когда указатель на объект абонента получает сообщение тематики. Используйте этот синтаксис, если нужно предпринять действие над каждым сообщением, не блокируя при этом выполнение кода. callback может быть одним указателем на функцию или массивом ячеек. Первым элементом массива ячеек должен быть указатель на функцию или строка, содержащая имя функции. Остальные элементы массива ячеек могут быть произвольными пользовательскими данными, которые будут переданы в функцию обратного вызова.

Примечание

Функция обратного вызова абонента использует один входной параметр, объект полученного сообщения msg. Заголовок функции для коллбэка следующий:

function subCallback(src, msg)
Вы передаете дополнительные параметры в функцию обратного вызова, включая функцию обратного вызова и параметры как элементы массива ячеек при установке коллбэка.

пример

sub = ros2subscriber(node,topic,type,callback) задает функцию обратного вызова callback, и подписывается на тему с заданным именем topic и тип сообщения type.

sub = ros2subscriber(___,Name,Value) задает дополнительные опции, используя один или несколько аргументы пары "имя-значение". Задайте аргументы пары "имя-значение" после всех других входных параметров.

Входные параметры

расширить все

A ros2node объект в сети.

Имя опубликованной темы, заданное как строковый скаляр или вектор символов. Если тема не существует, объект создает тему на основе связанного типа сообщения.

Пример: "/chatter"

Это свойство доступно только для чтения.

Тип сообщения подписанных сообщений.

Пример: "std_msgs/String"

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Определяет режим хранения сообщений в очереди. Если очередь заполняется сообщениями, ожидающими обработки, то старые сообщения будут удалены, чтобы освободить место для новых. Если установлено значение "keeplast", в очереди хранится количество сообщений, установленных Depth свойство. Если установлено значение "keepall"в очереди сохраняются все сообщения до пределов ресурсов MATLAB.

Количество сообщений, хранящихся в очереди сообщений при History установлено в "keeplast".

Пример: 42

Типы данных: double

Требование к гарантии доставки сообщения. Если "reliable", тогда доставка гарантируется, но может повториться несколько раз. Если "besteffort", затем попытайтесь доставить и не повторяйте попытку.

Пример: "reliable"

Типы данных: char | string

Требование о сохранении сообщений в подключенных издателях, что позволяет поздно присоединяющимся подписчикам получать количество старых сообщений, заданное Depth. Если "volatile"в этом случае постоянство сообщения не требуется, и никакие сообщения не запрашиваются, когда абонент присоединяется к сети. Если "transientlocal", тогда подписчик потребует от издателей сохранения сообщений и запросит количество сообщений, заданное Depth.

Пример: "volatile"

Типы данных: char | string

Свойства

расширить все

Имя опубликованной темы, заданное как строковый скаляр или вектор символов. Если тема не существует, объект создает тему на основе связанного типа сообщения.

Пример: "/chatter"

Типы данных: char

Это свойство доступно только для чтения.

Тип сообщения подписанных сообщений.

Пример: "std_msgs/String"

Типы данных: char | string

Это свойство доступно только для чтения.

Последнее полученное сообщение ROS 2, заданное как Message указатель на объект, полученный.

Это свойство доступно только для чтения.

Функция обратного вызова для обратных коллбэков абонентов.

Примечание

Функция обратного вызова абонента использует один входной параметр, объект полученного сообщения msg. Заголовок функции для коллбэка следующий:

function subCallback(msg)
Вы передаете дополнительные параметры в функцию обратного вызова, включая функцию обратного вызова и параметры как элементы массива ячеек при установке коллбэка.

Это свойство доступно только для чтения.

Определяет режим хранения сообщений в очереди. Если очередь заполняется сообщениями, ожидающими обработки, то старые сообщения будут удалены, чтобы освободить место для новых. Когда установлено значение "keeplast", в очереди хранится количество сообщений, установленных Depth свойство. В противном случае, если установлено значение "keepall"в очереди сохраняются все сообщения до пределов ресурсов MATLAB.

Пример: "keeplast"

Типы данных: char | string

Это свойство доступно только для чтения.

Количество сообщений, хранящихся в очереди сообщений при History установлено в "keeplast".

Пример: 42

Типы данных: double

Это свойство доступно только для чтения.

Требование к гарантии доставки сообщения. Если "reliable", тогда доставка гарантируется, но может повториться несколько раз. Если "besteffort", затем попытайтесь доставить и не повторяйте попытку.

Пример: "reliable"

Типы данных: char | string

Это свойство доступно только для чтения.

Требование о сохранении сообщений в подключенных издателях, что позволяет поздно присоединяющимся подписчикам получать количество старых сообщений, заданное Depth. Если "volatile"в этом случае постоянство сообщения не требуется, и никакие сообщения не запрашиваются, когда абонент присоединяется к сети. Если "transientlocal", тогда подписчик потребует от издателей сохранения сообщений и запросит количество сообщений, заданное Depth.

Пример: "volatile"

Типы данных: char | string

Функции объекта

receiveПодождите нового сообщения
ros2messageСоздайте структуры сообщений ROS 2

Примеры

свернуть все

Основным механизмом обмена данными между узлами ROS 2 является отправка и прием сообщений. Сообщения передаются по теме, и каждая тема имеет уникальное имя в сети ROS 2. Если узел хочет поделиться информацией, он должен использовать издателя для отправки данных в раздел. Узел, который хочет получить эту информацию, должен использовать абонента для этой же темы. Помимо своего уникального имени, каждая тема также имеет тип сообщения, который определяет тип сообщений, которые разрешено передавать в конкретной теме.

Эта коммуникация издатель-абонент имеет следующие характеристики:

  • Темы используются для общения «многие ко многим». Несколько издателей могут отправлять сообщения в одну тему, и несколько подписчиков могут их получать.

  • Издатель и подписчики разделены на темы и могут быть созданы и уничтожены в любом порядке. Сообщение может быть опубликовано в тему, даже если нет активных подписчиков.

В этом примере показано, как публиковать и подписываться на темы в сети ROS 2. Также показано, как:

  • Подождите, пока будет получено новое сообщение, или

  • Используйте коллбэки для обработки новых сообщений в фоновом режиме

Необходимые условия: Запуск с ROS 2, Подключение к сети ROS 2

Подписка и ожидание сообщений

Создайте пример сети ROS 2 с несколькими издателями и подписчиками.

exampleHelperROS2CreateSampleNetwork

Использование ros2 topic list чтобы увидеть, какие темы доступны.

ros2 topic list
/parameter_events

Предположим, что вы хотите подписаться на /scan тема. Использование ros2subscriber подписаться на /scan тема. Укажите имя узла с абонентом. Если тема уже существует в сети ROS 2, ros2subscriber определяет его тип сообщения автоматически, поэтому вам не нужно указывать его.

detectNode = ros2node("/detection");
pause(2)
laserSub = ros2subscriber(detectNode,"/scan");
pause(2)

Использование receive чтобы дождаться нового сообщения. Задайте тайм-аут 10 секунд. Область выхода scanData содержит полученные данные сообщения.

scanData = receive(laserSub,10);

Теперь можно удалить абонента laserSub и связанный с ним узел.

clear laserSub
clear detectNode

Подписка с использованием функций обратного вызова

Вместо использования receive для получения данных можно задать функцию, которая будет вызываться при получении нового сообщения. Это позволяет выполнять другой код MATLAB во время ожидания абонентом новых сообщений. Коллбэки необходимы, если вы хотите использовать несколько абонентов.

Подпишитесь на /pose topic, использование функции обратного вызова exampleHelperROS2PoseCallback, который принимает полученное сообщение в качестве входов. Одним из способов обмена данными между вашей основной рабочей областью и функцией обратного вызова является использование глобальных переменных. Задайте две глобальные переменные pos и orient.

controlNode = ros2node("/base_station");
poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback);
global pos
global 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 сообщение. Отображение обновленных значений.

pause(3)
disp(pos)
   -0.0156    0.0281    0.0175
disp(orient)
   -0.0493    0.0102   -0.0113

Если вы вводите pos и orient несколько раз в командной строке можно увидеть, что значения постоянно обновляются.

Остановите абонента положения путем очистки переменной абонента

clear poseSub
clear controlNode

Примечание: Существуют другие способы извлечения информации из функций обратного вызова, помимо использования globals. Для примера можно передать объект указателя в качестве дополнительного аргумента в функцию обратного вызова. Для получения дополнительной информации об определении функций обратного вызова см. документацию «Определение обратного вызова».

Публикация сообщений

Создайте издателя, который отправляет строковые сообщения ROS 2 в /chatter тема.

chatterPub = ros2publisher(node_1,"/chatter","std_msgs/String");

Создайте и заполните ROS 2 сообщение для отправки в /chatter тема.

chatterMsg = ros2message(chatterPub);
chatterMsg.data = 'hello world';

Использование ros2 topic list чтобы проверить, что /chatter тема доступна в сети ROS 2.

ros2 topic list
/chatter
/parameter_events
/pose
/scan

Определите абонента для /chatter тема. exampleHelperROS2ChatterCallback вызывается при получении нового сообщения и отображает строку содержимое сообщения.

chatterSub = ros2subscriber(node_2,"/chatter",@exampleHelperROS2ChatterCallback)
chatterSub = 
  ros2subscriber with properties:

        TopicName: '/chatter'
    LatestMessage: []
      MessageType: 'std_msgs/String'
    NewMessageFcn: @exampleHelperROS2ChatterCallback
          History: 'keeplast'
            Depth: 10
      Reliability: 'reliable'
       Durability: 'volatile'

Опубликовать сообщение в /chatter тема. Обратите внимание, что строка отображается при коллбэке абонента.

send(chatterPub,chatterMsg)
pause(3)
ans = 
'hello world'

The exampleHelperROS2ChatterCallback функция была вызвана, когда абонент получил строку сообщение.

Отсоединение от сети ROS 2

Удалите примеры узлов, издателей и подписчиков из сети ROS 2. Также очистите глобальные переменные pos и orient

clear global pos orient
clear 

Следующие шаги

Введенный в R2019b