2.6 重要的话题Topics
机器人有许多的功能,这些功能的实现是依靠着机器人各个模块之间的通信来完成。在ros中有两种通信方式,其中一种就是topic通信(异步通信),而另一种是service(同步通信)通信。本节只对rostopic做一些简单的讲解,详细的了解可以前往ros的wiki上的rostopic。如果您还想了解servicr,可以前往ros的wiki上的rosservice。
我们先来了解一下异步通信和同步通信:
- 异步通信:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
- 同步通信:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
topic是一种节点对节点的单向通信方式,这里的节点指的是ros中的node,单向就是这个节点要么只负责这个话题消息的接受,要么负责这个话题消息的发送,不会同时存在消息接受和发送。在ros中,负责发送消息给话题的叫发布者(Publisher),负责将话题传来的消息接受到的叫订阅者(Subscriber)。
例如:
我们通过键盘控制机器人的移动,就需要键盘和机器人的驱动来进行通信。我们会开启机器人驱动节点和键盘控制节点,其中键盘就是就是发布者,机器人的驱动就是订阅者。
2.6.1 rostopic命令
ros有很多的命令行工具,rostopic就是其中的一个,通过对rostopic的学习,我们可以较直观的看到机器人各个节点是如何通过topic进行通信的。
我们可以通过终端来看看rostopic的用法,打开终端,输入下面指令
rostopic -h
会在终端显示一些关于rostopic的用法
翻译如下:
rostopic是一个命令行工具,用于打印有关ROS话题的信息。
命令:
rostopic bw 显示话题使用的带宽
rostopic delay 从标题中时间戳显示话题延迟
rostopic echo 将消息打印到屏幕
rostopic find 按类型查找话题
rostopic hz 显示话题发布率
rostopic info 打印有关活动主题的信息
rostopic list 列出活动话题
rostopic pub 将数据发布到话题
rostopic type 打印话题或字段类型
键入rostopic -h以了解更详细的用法,例如“rostopic echo -h”。我们主要讲解rostopic list
、 rostopic echo
和rostopic pub
2.6.1.1 通过rostopic list列出活动话题
1)打开一个终端,开启机器人的驱动节点
roslaunch handsfree_hw handsfree_hw.launch
2)打开一个新终端,将机器人驱动节点的活动话题列出来
rostopic list
下图为列出来的活动话题
3)关掉这两个终端,(关掉机器人驱动节点的终端时,先Ctrl+C结束节点进程,再关掉该终端)
4)重新打开一个终端,开启键盘控制节点,输入下面这段话
roslaunch handsfree_hw keyboard_teleop.launch
5)打开一个新终端,将键盘控制节点的活动话题列出来
rostopic list
下图为列出来的活动话题
6)通过对比,我们可以看到机器人驱动节点和键盘节点的活动话题有 3 条是相同的,这就代表两个节点之间有通过这几个相同的topcis进行通讯。