exponenta event banner

ros2subscriber

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

Описание

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

Создание

Описание

пример

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

Примечание

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

пример

sub = ros2subscriber(node,topic,type) создает подписчика для темы и добавляет эту тему в список тем сети. Если список тем уже содержит соответствующий раздел, sub будет добавлен в список подписчиков для этой темы. 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

Примеры

свернуть все

Основным механизмом обмена данными между узлами АФК 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 тема, использование функции обратного вызова 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

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

Опубликовать сообщения

Создание издателя, который отправляет строковые сообщения 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'

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

Отключение от сети ROS 2

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

clear global pos orient
clear 

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

Представлен в R2019b