Topic话题和Message消息

本文介绍了ROS(RobotOperatingSystem)中节点间的通信机制,包括基本概念、Publisher和Subscriber的C++实现,以及如何使用std_msgs中的不同类型消息。还讨论了消息频率控制、回调函数和图形化显示topic关系等内容。
摘要由CSDN通过智能技术生成

每个节点Node都有其各自独立的小功能,若想实现一个大任务,需要各个节点之间相互配合。那么就需要实现Node间的通信,来相互传递信息。

一、基本概念

1.1 两个节点通信

消息发布者叫Publisher,消息接收者叫Subsciber;消息发布者发布的消息叫Message,他们之间联系的通道叫Topic。

1.2 多个节点通信

一个话题是可以有多个Publisher和多个Subscriber的,但是若有多个Publisher的话,会造成下种情况,从而订阅者不知道接受的消息是谁发来的什么消息。

因此通常情况下,只有一个发布者,可以有多个接收者。

多个发布者情况:这时需要控制发布者顺序,同一时刻只能有一个发言的节点

 总结:

 1.3 Message

不同的消息,会有不同的数据结构,我们需要指定消息的类型。std_msgs这个依赖包中就包含很多消息类型。如何查看他有那些数据类型呢?

step1:进入ROS Index网站,在搜索栏中搜索std_msgs

step2: 选择与下载的Ubuntu对应的std_msgs的版本号。

step3:点击 std_msgs,进入详情页。点击Website,可以查看它所包含的数据类型。

step4:点击你想了解的数据类型,可以看到消息类型的内容格式。

二、发布者Publisher的C++实现

首先确定两个事情,一个是话题的名称,一个是消息的类型。假如我们需要发布字符串型的消息。

step1:在apt商店查找std_msgs依赖包,查找它里面能发布的消息类型中有没有可以满足我们要求的。这里我们可以选择String

step2:点进去查看详细说明,可以看出,数据类型就是string,数据名称为data,到时候我们直接给data赋值就可以啦。

step3: 在Node中定义一个NodeHandle对象,这个对象是咱们节点和ROS通讯的关键。可以将其理解成大管家,他管理通讯之间的所有事情。

step4:再定义一个ROS的Publisher对象,这个Publisher对象是我们发送消息的工具。那这个工具怎么来呢?就需要由大管家给出。

缓存长度,可以理解成有限定容量的队列,接收者不一定会立马接受发布者发布的消息,那么发送的消息就要先保存起来,若保存的容量超过了缓存长度,那么最先发送的消息就会丢失。他的数值表示缓存里可以容纳多少个消息包排队。

用到了std_msgs中的String类型,为了能够使用,我们需要加上头文件。#include <std_msgs::Stri ng.h>

step5:发布消息。首先定义发布的数据(代码行15),并为数据复制(代码行16),最后由发布者将消息发布出去(17)。

step6:编译+启动ros核心+运行节点。

2.1 rostopic

1、查看活跃着的话题名称。

2、查看对应话题里的消息内容。

3、查看对应话题中每秒发送消息的个数

2.2 控制发布消息的频率

话题中每秒发送消息的个数,取决于while循环每秒钟执行的次数。

step1:首先定义一个频率对象,实参10表示每秒执行的次数

step2:这个函数会在while循环内做一个短时间的阻塞,以便让循环的执行频率能和刚才咱们给的参数对应上。

2.3 总结

三、订阅者Subscriber的C++实现

3.1 创建订阅者节点

step1:第一个参数:需要订阅的话题名称;第二个参数:缓存长度;第三个参数:接收消息包的回调函数的函数名xxx,可以随便起。

我们需要定义回调函数xxx,形参是接受的消息包。这个函数不需要我们手动调动,而是系统接收到发布者的消息时,就会自动触发的函数。

while循环内一定要加个ros::spinOnce函数。它可以允许节点在监听消息的同时执行其他任务。

step2:在CMakeLists.txt文件中找到Bulid篇章,复制示例代码。

step3:编译+roscore启动核心+source+运行发布者节点+运行订阅者节点

3.2 调整和优化

在回调函数里,使用printf显示消息,这样的话我们只能看到显示的消息内容。

将其换成ROS_INFO,能够同时显示接收时间和消息内容。

【注意】不能显示中文,这与他的编码格式有关。若想解决这个问题,可以设置下面这个函数。

一个节点可以同时订阅多个消息。ROS_WARN与ROS_INFO作用相同,只是ROS_WARN会将消息显示成黄色。

3.3 图形化显示话题通讯关系

ROS为咱们提供了个图形化显示话题通讯关系的工具,可以显示节点间通讯的关系。

会弹出一个窗口:

3.4 总结

当运行发布者节点时,使用rostopic list命令,可以查看到相对应的话题名称。但是如果不运行发布者节点,而只运行订阅者节点,使用rostopic list命令,也可以查看到相对应的话题名称。

这说明,话题并不只属于发布者或者订阅者,而是由ROS系统创建管理的,只要节点向NodeHandle 大管家,提出的话题发布需求或者话题订阅需求,这个话题就会自动被创建。这个特性对咱们阅读别人的ROS源码包会非常有帮助,通过系统中的活跃话题作为突破口,再配合ROS提供的辅助工具,就能很轻松的捋清楚各个节点之间的关系。

ros::spinOnce函数并不局限于while循环,可以放在程序的任何环节。当我们觉得必要时,就可以调用一次。它可以转身看一眼未读消息,可以灵活的把握对外来消息包的处理时机。

  • 26
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值