与ROS发布者和订阅者交换数据
ROS节点交换数据的主要机制是发送和接收消息.消息在a上传输的话题,每个主题在ROS网络中都有一个唯一的名称。如果一个节点想要共享信息,它使用出版商向主题发送数据。希望接收该信息的节点使用订阅者同样的话题。除了它独特的名字,每个话题也有一个消息类型,它决定了能够在该主题下传输的消息类型。
这种发布者与订阅者之间的通信具有以下特点:
主题用于多对多通信。许多发布者可以向同一主题发送消息,而许多订阅者可以接收消息。
发布者和订阅者通过主题分离,可以以任何顺序创建和销毁。即使没有活动订阅者,也可以将消息发布到主题。
主题、发布者和订阅者的概念如下图所示:
此示例演示如何在ROS网络中发布和订阅主题。它还展示了如何:
等待,直到收到新消息
使用回调在后台处理新消息
订阅和等待消息
启动ROS master在MATLAB®使用rosinit
命令。
rosinit
启动ROS Core…用时0.4251秒。在http://172.29.200.150:56911上初始化ROS master。使用NodeURI http://dcc396515glnxa64:46047/和MasterURI http://localhost:56911初始化全局节点/matlab_global_node_44033。
使用提供的帮助器功能创建一个包含多个发布者和订阅者的示例ROS网络exampleHelperROSCreateSampleNetwork
.
exampleHelperROSCreateSampleNetwork
使用rostopic
列表
查看哪些主题可用。
rostopic列表
/pose /rosout /scan /tf
使用rostopic信息
来检查是否有节点正在发布到/扫描
的话题。下面的命令显示了这一点node_3
就是向它发布。
rostopic信息/扫描
类型:sensor_msgs/LaserScan publisher: * /node_3 (http://dcc396515glnxa64:35087/) subscriber: * /node_1 (http://dcc396515glnxa64:34719/) * /node_2 (http://dcc396515glnxa64:38927/)
使用rossubscriber
订阅/扫描
的话题。如果主题已经存在于ROS网络中(如图所示),rossubscriber
自动检测其消息类型,因此不需要指定它。使用结构格式的消息可以提高效率。
激光= rossubscriber(“/扫描”,“DataFormat”,“结构”);暂停(2)
使用收到
等待新消息。(第二个参数是以秒为单位的超时。)输出scandata
包含接收到的消息数据。
scanata =接收(激光,10)
scandata =带有字段的结构:MessageType: 'sensor_msgs/LaserScan' Header: [1x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single]强度:[]
有些消息类型具有与之关联的可视化器。对于LaserScan消息,rosPlot
绘制扫描数据。的MaximumRange
名称-值对指定最大的绘图范围。
图rosPlot (scandata,“MaximumRange”7)
使用回调函数订阅
而不是使用收到
要获取数据,可以指定在接收到新消息时要调用的函数。这允许在订阅者等待新消息时执行其他MATLAB代码。如果您想使用多个订阅者,回调是必不可少的。
订阅/构成
主题,使用回调函数exampleHelperROSPoseCallback
.
Robotpose = rossubscriber(“/姿势”@exampleHelperROSPoseCallback,“DataFormat”,“结构”)
robotpose =具有属性的订户:TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback DataFormat: 'struct'
在主工作区和回调函数之间共享数据的一种方法是使用全局变量。定义两个全局变量pos
和东方
.
全球pos全球东方
全局变量pos
和东方
在exampleHelperROSPoseCallback
对象上接收到新消息数据时/构成
的话题。
等待几秒钟,以确保订阅者能够收到消息。最新的位置和方向数据将始终存储在pos
和东方
变量。
暂停(2)pos
pos =1×3-0.0133 0.0488 -0.0462
东方
东方=1×30.0385 0.0413 0.0296
如果你输入pos
和东方
在命令行中,您可以看到值不断更新。
通过清除订阅者变量来停止姿势订阅者
清晰的robotpose
请注意:除了使用全局变量,还有其他方法从回调函数中提取信息。例如,可以将句柄对象作为附加参数传递给回调函数。看到为图形对象创建回调函数有关定义回调函数的更多信息的文档。
发布消息
创建一个发送ROS字符串消息到/喋喋不休
主题(见处理基本ROS消息).
Chatterpub“/喋喋不休”,“std_msgs /字符串”,“DataFormat”,“结构”)
chatterpub =带有属性的发布者:TopicName: '/chatter' NumSubscribers: 0 IsLatching: 1 MessageType: 'std_msgs/String' DataFormat: 'struct'
暂停(2)等待以确保已注册发布者
创建并填充要发送到/喋喋不休
的话题。
Chattermsg = rosmessage(聊天酒吧);chattermsg。Data =“hello world”
chattermsg =带有字段的结构:MessageType: 'std_msgs/String'
使用rostopic列表
验证/喋喋不休
主题在ROS网络中可用。
rostopic列表
/chatter /pose /rosout /scan /tf
对象的订阅者/喋喋不休
的话题。exampleHelperROSChatterCallback
在接收到新消息时调用,并显示消息中的字符串内容。
查特子= rossubscriber(“/喋喋不休”@exampleHelperROSChatterCallback,“DataFormat”,“结构”)
chattersub =具有属性的订阅服务器:TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' BufferSize: 1 NewMessageFcn: @exampleHelperROSChatterCallback DataFormat: 'struct'
将消息发布到/喋喋不休
的话题。该字符串由订阅者回调函数显示。
发送(chatterpub chattermsg)暂停(2)
Ans = 'hello world'
的exampleHelperROSChatterCallback
函数在发布字符串消息时立即被调用。
关闭ROS网络
从ROS网络中删除示例节点、发布者和订阅者。清除全局变量pos
和东方。
exampleHelperROSShutDownSampleNetwork清晰全球pos东方
关闭ROS主节点并删除全局节点。
rosshutdown
使用NodeURI http://dcc396515glnxa64:46047/和MasterURI http://localhost:56911关闭全局节点/matlab_global_node_44033。在http://172.29.200.150:56911上关闭ROS master。
下一个步骤
要了解更多关于如何在MATLAB中处理ROS消息的信息,请参见处理基本ROS消息和使用专门的ROS消息.
要了解ROS服务,请参考呼叫并提供ROS服务.