主要内容

与ROS交换数据发布者和订阅者

这个例子展示了如何发布和订阅主题ROS网络。

活性氧的主要机制节点交换数据发送和接收消息。消息传播的的话题,和ROS网络中每个主题都有一个唯一的名称。如果一个节点想分享信息,它使用一个出版商发送数据到一个话题。一个节点想要得到这些信息使用订阅者同样的话题。除了其独特的名字,每个主题也有一个消息类型,决定了类型的消息能够被传播的主题。

这个出版商和用户通信具有以下特点:

  • 主题是用于多对多通信。许多出版商可以将消息发送到相同的话题,许多用户可以接收他们。

  • 发布者和订阅者通过主题是解耦的,可以按照任何顺序创建和销毁。一个消息可以发表一个主题即使没有活跃的用户。

主题的概念、出版商和用户见图:

除了如何发布和订阅主题ROS网络,这个例子也展示了如何:

  • 等到收到新消息

  • 使用回调函数来处理新信息的背景

先决条件:开始使用ROS,连接到一个ROS网络

订阅,等待消息

在MATLAB®使用开始ROS大师rosinit命令。

rosinit
启动ROS .....核心…在5.4209秒内完成。初始化ROS主在http://172.21.16.85:56764上。初始化全局节点/ matlab_global_node_69902 NodeURI http://ah-avijayar: 62300 /和MasterURI http://localhost: 56764。

创建一个示例ROS和几个出版商和网络用户使用提供的辅助功能exampleHelperROSCreateSampleNetwork

exampleHelperROSCreateSampleNetwork

使用rostopic列表看到哪些话题是可用的。

rostopic列表
/ / rosout /扫描/ tf

使用rostopic信息检查是否有节点发布的/扫描的话题。下面的命令显示node_3出版。

rostopic信息/扫描
类型:sensor_msgs /提升出版商:* / node_3 (http://ah-avijayar: 62315 /)用户:* / node_1 (http://ah-avijayar: 62305 /) * / node_2 (http://ah-avijayar: 62310 /)

使用rossubscriber订阅的/扫描的话题。如果主题已经存在在ROS网络(这里)一样,rossubscriber自动检测其消息类型,因此您不需要指定它。使用结构中的消息格式更好的效率。

激光= rossubscriber (“/扫描”,“DataFormat”,“结构”);暂停(2)

使用收到等待新的消息。(第二个参数是一个超时秒。)输出scandata包含接收到的消息数据。

scandata =接收(激光、10)
scandata =结构体字段:MessageType:“sensor_msgs /提升”标题:[1×1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10范围:[640×1单]强度:[]

一些消息类型与他们专业相关的。提升的消息,rosPlot情节扫描数据。的MaximumRange名称-值对将指定的最大范围。

图rosPlot (scandata,“MaximumRange”7)

订阅使用回调函数

而不是使用收到获取数据,您可以指定一个函数被称为当收到新消息。这允许其他MATLAB代码执行在用户等待新消息。回调是必不可少的,如果你想使用多个订阅者。

订阅/构成话题,使用回调函数exampleHelperROSPoseCallback

robotpose = rossubscriber (“/姿势”@exampleHelperROSPoseCallback,“DataFormat”,“结构”)
robotpose =用户属性:TopicName:“/姿势”LatestMessage: [] MessageType:“geometry_msgs /扭曲”BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback DataFormat:“结构”

间共享数据的一种方式你的主要工作区和回调函数是使用全局变量。定义两个全局变量pos东方

全球pos全球东方

的全局变量pos东方被分配的exampleHelperROSPoseCallback当收到新消息数据的函数/构成的话题。

等待几秒钟,以确保用户可以接收消息。最当前的位置和姿态数据将永远存储在pos东方变量。

暂停(2)pos
pos =1×3-0.0292 -0.0199 -0.0029
东方
东方=1×3-0.0270 0.0344 -0.0305

如果你输入pos东方几次在命令行中,您可以看到,不断更新的值。

停止造成用户通过清除用户变量

清晰的robotpose

请注意:有其他方法来从回调函数除了使用全局变量中提取信息。例如,您可以将一个处理对象作为附加参数传递给回调函数。看到为图形对象创建回调定义回调函数文档了解更多信息。

发布消息

创建一个发送的出版商ROS字符串消息/喋喋不休主题(见处理基本的ROS消息)。

chatterpub = rospublisher (“/喋喋不休”,“std_msgs /字符串”,“DataFormat”,“结构”)
chatterpub =出版商的属性:TopicName: /喋喋不休的NumSubscribers: 0 IsLatching: 1 MessageType:“std_msgs /字符串”DataFormat:“结构”
暂停(2)%等确保发行人注册

创建并填充一个ROS消息发送到/喋喋不休的话题。

chattermsg = rosmessage (chatterpub);chattermsg。Data =“hello world”
chattermsg =结构体字段:MessageType: std_msgs /字符串的数据:“hello world”

使用rostopic列表来验证/喋喋不休主题是ROS网络中可用。

rostopic列表
/聊天/ / rosout /扫描/ tf

定义一个用户的/喋喋不休的话题。exampleHelperROSChatterCallback被称为当收到新消息和消息中显示的字符串内容。

chattersub = rossubscriber (“/喋喋不休”@exampleHelperROSChatterCallback,“DataFormat”,“结构”)
chattersub =用户属性:TopicName: /喋喋不休的LatestMessage: [] MessageType:“std_msgs /字符串”BufferSize: 1 NewMessageFcn: @exampleHelperROSChatterCallback DataFormat:“结构”

发布的消息/喋喋不休的话题。所显示的字符串是订户回调。

发送(chatterpub chattermsg)暂停(2)
ans =“hello world”

exampleHelperROSChatterCallback函数被称为一旦你发表了字符串消息。

ROS关闭网络

删除示例节点,从ROS网络出版商和用户。明确的全局变量pos东方。

exampleHelperROSShutDownSampleNetwork清晰全球pos东方

关闭ROS掌握全球节点和删除。

rosshutdown
关闭全局节点/ matlab_global_node_69902 NodeURI http://ah-avijayar: 62300 /和MasterURI http://localhost: 56764。在http://172.21.16.85:56764上关闭ROS的主人。

下一个步骤