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) задает дополнительные опции с помощью одного или нескольких аргументов пары "имя-значение". Задайте аргументы пары "имя-значение" после всех других входных параметров.

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

развернуть все

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. Если узел хочет поделиться информацией, он должен использовать издателя, чтобы отправить данные в тему. Узел, который хочет получить ту информацию, должен использовать подписчика для той же самой темы. Помимо ее уникального имени, каждая тема также имеет тип сообщения, который определяет тип сообщений, которым позволяют быть переданными в определенной теме.

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

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

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

В этом примере показано, как опубликовать и подписаться на темы в сети 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 содержит полученные данные о сообщении. status указывает, было ли сообщение получено успешно и statustext предоставляет дополнительную информацию о status.

[scanData,status,statustext] = 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