ROS2与Matlab入门教程-与ROS2发布者和订阅者交换数据
说明:
- 介绍如何在ROS2网络中发布和订阅主题
介绍:
ROS2节点交换数据的主要机制是发送和接收消息
消息在一个主题上传输,每个主题在ROS2网络中都有一个唯一的名称
如果一个节点想要共享信息,它必须使用发布者将数据发送到一个主题。想要接收该信息的节点必须使用同一主题的订阅者
每个主题除了其唯一的名称外,还有一个消息类型,它决定了在特定主题中允许传输的消息类型
这种发布者-订阅者通信具有以下特点:主题用于多对多通信。多个发布者可以向同一个主题发送消息,多个订阅者可以接收它们。发布者和订阅者通过主题解耦,可以任意顺序创建和销毁。即使没有活动订阅者,也可以将消息发布到主题
步骤:
- 订阅并等待消息,创建一个包含多个发布者和订阅者的示例 ROS 2 网络
exampleHelperROS2CreateSampleNetwork
- 用于ros2 topic list查看可用的主题
ros2 topic list
/parameter_events
/pose
/rosout
/scan
- 要订阅该/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] = 接收(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和。orientexampleHelperROS2PoseCallback/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.0409 0.0076 0.0183
disp(orient)
0.0047 -0.0074 0.0144
如果您在命令行中输入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
/rosout
/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当订阅者收到字符串消息时调用该函数
断开与ROS2网络的连接,从 ROS 2 网络中删除示例节点、发布者和订阅者。同时清除全局变量pos和orient
clear global pos orient
clear
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号