ros2subscriber

Subscribe to messages on a topic

Description

Use the ros2subscriber to receive messages on a topic. When ROS 2 nodes publish messages on that topic, MATLAB® will receive those message through this subscriber.

Creation

Description

example

sub = ros2subscriber(node,topic) creates a subscriber, sub, for a topic with name topic that already exists on the ROS 2 network. node is the ros2node object to which this subscriber attaches. The subscriber gets the topic message type from the network topic list.

Note

The topic must be on the network topic list.

example

sub = ros2subscriber(node,topic,type) creates a subscriber for a topic and adds that topic to the network topic list. If the topic list already contains a matching topic, sub will be added to the list of subscribers for that topic. The type must be the same as the topic. Use this syntax to avoid errors when it is possible for the subscriber to subscribe to a topic before a topic has been added to the network.

example

sub = ros2subscriber(node,topic,callback) specifies a callback function, callback, and optional data, to run when the subscriber object handle receives a topic message. Use this syntax if action needs to be taken on every message, while not blocking code execution. callback can be a single function handle or a cell array. The first element of the cell array needs to be a function handle or a string containing the name of a function. The remaining elements of the cell array can be arbitrary user data that will be passed to the callback function.

Note

The subscriber callback function uses a single input argument, the received message object, msg. The function header for the callback is as follows:

function subCallback(src, msg)
You pass additional parameters to the callback function by including both the callback function and the parameters as elements of a cell array when setting the callback.

example

sub = ros2subscriber(node,topic,type,callback) specifies a callback function callback, and subscribes to a topic that has the specified name topic and message type type.

sub = ros2subscriber(___,Name,Value) specifies additional options using one or more name-value pair arguments. Specify name-value pair arguments after all other input arguments.

Input Arguments

expand all

A ros2node object on the network.

Name of the published topic, specified as a string scalar or character vector. If the topic does not exist, the object creates the topic based on the associated message type.

Example: "/chatter"

This property is read-only.

The message type of subscribed messages.

Example: "std_msgs/String"

Name-Value Pair Arguments

Specify optional comma-separated pairs of Name,Value arguments. Name is the argument name and Value is the corresponding value. Name must appear inside quotes. You can specify several name and value pair arguments in any order as Name1,Value1,...,NameN,ValueN.

Determines the mode of storing messages in the queue. If the queue fills with messages waiting to be processed, then old messages will be dropped to make room for new. If set to "keeplast", the queue stores the number of messages set by the Depth property. If set to "keepall", the queue stores all messages up to the MATLAB resource limits.

Number of messages stored in the message queue when History is set to "keeplast".

Example: 42

Data Types: double

Requirement on the guarantee of message delivery. If "reliable", then delivery is guaranteed, but may retry multiple times. If "besteffort", then attempt delivery and do not retry.

Example: "reliable"

Data Types: char | string

Requirement on the persistence of messages in connected publishers, which allows late-joining subscribers to receive the number of old messages specified by Depth. If "volatile", then message persistence is not required and no messages are requested when the subscriber joins the network. If "transientlocal", then the subscriber will require publishers to persist messages, and will request the number of messages specified by Depth.

Example: "volatile"

Data Types: char | string

Properties

expand all

Name of the published topic, specified as a string scalar or character vector. If the topic does not exist, the object creates the topic based on the associated message type.

Example: "/chatter"

Data Types: char

This property is read-only.

The message type of subscribed messages.

Example: "std_msgs/String"

Data Types: char | string

This property is read-only.

The most recently received ROS 2 message, specified as a Message object handle, received.

This property is read-only.

Callback function for subscriber callbacks.

Note

The subscriber callback function uses a single input argument, the received message object, msg. The function header for the callback is as follows:

function subCallback(msg)
You pass additional parameters to the callback function by including both the callback function and the parameters as elements of a cell array when setting the callback.

This property is read-only.

Determines the mode of storing messages in the queue. If the queue fills with messages waiting to be processed, then old messages will be dropped to make room for new. When set to "keeplast", the queue stores the number of messages set by the Depth property. Otherwise, when set to "keepall", the queue stores all messages up to the MATLAB resource limits.

Example: "keeplast"

Data Types: char | string

This property is read-only.

Number of messages stored in the message queue when History is set to "keeplast".

Example: 42

Data Types: double

This property is read-only.

Requirement on the guarantee of message delivery. If "reliable", then delivery is guaranteed, but may retry multiple times. If "besteffort", then attempt delivery and do not retry.

Example: "reliable"

Data Types: char | string

This property is read-only.

Requirement on the persistence of messages in connected publishers, which allows late-joining subscribers to receive the number of old messages specified by Depth. If "volatile", then message persistence is not required and no messages are requested when the subscriber joins the network. If "transientlocal", then the subscriber will require publishers to persist messages, and will request the number of messages specified by Depth.

Example: "volatile"

Data Types: char | string

Object Functions

receiveWait for new message
ros2messageCreate ROS 2 message structures

Examples

collapse all

The primary mechanism for ROS 2 nodes to exchange data is to send and receive messages. Messages are transmitted on a topic and each topic has a unique name in the ROS 2 network. If a node wants to share information, it must use a publisher to send data to a topic. A node that wants to receive that information must use a subscriber for that same topic. Besides its unique name, each topic also has a message type, which determines the type of messages that are allowed to be transmitted in the specific topic.

This publisher-subscriber communication has the following characteristics:

  • Topics are used for many-to-many communication. Multiple publishers can send messages to the same topic and multiple subscribers can receive them.

  • Publisher and subscribers are decoupled through topics and can be created and destroyed in any order. A message can be published to a topic even if there are no active subscribers.

This example shows how to publish and subscribe to topics in a ROS 2 network. It also shows how to:

  • Wait until a new message is received, or

  • Use callbacks to process new messages in the background

Prerequisites: Get Started with ROS 2, Connect to a ROS 2 Network

Subscribe and Wait for Messages

Create a sample ROS 2 network with several publishers and subscribers.

exampleHelperROS2CreateSampleNetwork

Use ros2 topic list to see which topics are available.

ros2 topic list
/clock
/parameter_events
/pose
/scan

Assume you want to subscribe to the /scan topic. Use ros2subscriber to subscribe to the /scan topic. Specify the name of the node with the subscriber. If the topic already exists in the ROS 2 network, ros2subscriber detects its message type automatically, so you do not need to specify it.

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

Use receive to wait for a new message. Specify a timeout of 10 seconds. The output scanData contains the received message data.

scanData = receive(laserSub,10);

You can now remove the subscriber laserSub and the node associated to it.

clear laserSub
clear detectNode

Subscribe Using Callback Functions

Instead of using receive to get data, you can specify a function to be called when a new message is received. This allows other MATLAB code to execute while the subscriber is waiting for new messages. Callbacks are essential if you want to use multiple subscribers.

Subscribe to the /pose topic, using the callback function exampleHelperROS2PoseCallback, which takes a received message as the input. One way of sharing data between your main workspace and the callback function is to use global variables. Define two global variables pos and orient.

controlNode = ros2node("/base_station");
poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback);
global pos
global orient

The global variables pos and orient are assigned in the exampleHelperROS2PoseCallback function when new message data is received on the /pose topic.

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

Wait a moment for the network to publish another /pose message. Display the updated values.

pause(3)
disp(pos)
    0.0138    0.0458   -0.0259
disp(orient)
    0.0176   -0.0211    0.0172

If you type in pos and orient a few times in the command line you can see that the values are continuously updated.

Stop the pose subscriber by clearing the subscriber variable

clear poseSub
clear controlNode

Note: There are other ways to extract information from callback functions besides using globals. For example, you can pass a handle object as additional argument to the callback function. See the Callback Definition (MATLAB) documentation for more information about defining callback functions.

Publish Messages

Create a publisher that sends ROS 2 string messages to the /chatter topic.

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

Create and populate a ROS 2 message to send to the /chatter topic.

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

Use ros2 topic list to verify that the /chatter topic is available in the ROS 2 network.

ros2 topic list
/chatter
/clock
/parameter_events
/pose
/scan

Define a subscriber for the /chatter topic. exampleHelperROS2ChatterCallback is called when a new message is received, and displays the string content in the message.

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'

Publish a message to the /chatter topic. Observe that the string is displayed by the subscriber callback.

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

The exampleHelperROS2ChatterCallback function was called when the subscriber received the string message.

Disconnect From ROS 2 Network

Remove the sample nodes, publishers and subscribers from the ROS 2 network. Also clear the global variables pos and orient

clear global pos orient
clear 

Next Steps

Introduced in R2019b