send
Publish ROS 2 message to topic
Syntax
Description
Examples
Exchange Data with ROS 2 Publishers and Subscribers
The primary mechanism for ROS 2 nodes to exchange data is to send and receivemessages. Messages are transmitted on atopic和每个主题都有一个惟一名称2 netw ROSork. If a node wants to share information, it must use apublisherto send data to a topic. A node that wants to receive that information must use asubscriberfor that same topic. Besides its unique name, each topic also has amessage 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
先决条件: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
Useros2 topic list
to see which topics are available.
ros2topiclist
/parameter_events /pose /rosout /scan
Assume you want to subscribe to the/scan
topic. Useros2subscriber
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)
Usereceive
to wait for a new message. Specify a timeout of 10 seconds. The outputscanData
contains the received message data.status
indicates whether a message was received successfully andstatustext
provides additional information about thestatus
.
[scanData,status,statustext] = receive(laserSub,10);
You can now remove the subscriberlaserSub
and the node associated to it.
clearlaserSubcleardetectNode
Subscribe Using Callback Functions
Instead of usingreceive
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 functionexampleHelperROS2PoseCallback
, 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 variablespos
andorient
.
controlNode = ros2node("/base_station"); poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback);globalposglobalorient
The global variablespos
andorient
are assigned in theexampleHelperROS2PoseCallback
function when new message data is received on the/pose
topic.
functionexampleHelperROS2PoseCallback(message)% Declare global variables to store position and orientationglobalposglobalorient% 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.0409 0.0076 0.0183
disp(orient)
0.0047 -0.0074 0.0144
If you type inpos
andorient
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
clearposeSubclearcontrolNode
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 theCallback Definitiondocumentation for more information about defining callback functions.
发布消息
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';
Useros2 topic list
to verify that the/chatter
topic is available in the ROS 2 network.
ros2topiclist
/chatter /parameter_events /pose /rosout /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'
TheexampleHelperROS2ChatterCallback
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 variablespos
andorient
clearglobalposorientclear
Next Steps
Input Arguments
pub
—ros2publisher
object
ros2publisher
ros2publisher
object, specified as a handle, that publishes the specified topic.
msg
—ROS 2 message
Message
structure
ROS 2 message, specified as a structure, with compatible fields for that message type.
Extended Capabilities
C/C++ Code Generation
Generate C and C++ code using MATLAB® Coder™.
Version History
Open Example
You have a modified version of this example. Do you want to open this example with your edits?
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select:.
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina(Español)
- Canada(English)
- United States(English)
Europe
- Belgium(English)
- Denmark(English)
- Deutschland(Deutsch)
- España(Español)
- Finland(English)
- France(Français)
- Ireland(English)
- Italia(Italiano)
- Luxembourg(English)
- Netherlands(English)
- Norway(English)
- Österreich(Deutsch)
- Portugal(English)
- Sweden(English)
- Switzerland
- United Kingdom(English)