理解了节点怎样运行,以及怎样查看节点的信息,现在来看看节点之间是怎样实现互相通信的。
节点之间基本的通信方式有三种:
1、主题通信,通过发布和订阅的形式;
2、服务通信,通过请求和响应的形式;
3、参数服务器,通过定义参数键值对的形式,保存和加载参数信息。
我们先来看看主题通信的形式。
首先还是先打开命令终端运行roscore,这是一切开始的前提:
roscore
接着我们试着运行乌龟节点(turtlesim_node),记住要在新的命令终端运行:
rosrun turtlesim turtlesim_node
此时有一个小乌龟出现:
接着在新的终端再运行另外一个节点:
rosrun turtlesim turtle_teleop_key
这个节点我们可以翻译成“乌龟键盘控制节点”,此节点开启之后,我们就可以使用键盘来控制小乌龟的运动了。控制时注意,请选中turtle_teleop_key所在的终端窗口以确保我们的按键输入能够被捕获:
但是这两个节点之间究竟做了什么不为人知的事情?
答案是两个节点之间存在主题(或话题)的发布和订阅关系,即turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS主题来互相通信的,也就是说如果一个节点要向另一个节点发送数据,就要发布主题消息,另一个节点再订阅这个主题,以此接收消息,这个发布和订阅的主题名称要一致。
那这个主题是什么呢?要理解,得先使用ROS的一个脚本程序来显示节点和主题之间的关系图,程序是:rqt_graph,它是rqt程序包中的一部分,如果没有安装它,可以使用下面的命令安装:
sudo apt-get install ros-indigo-rqt
注:这里的indigo可以替换为其他ROS版本。
装完之后,我们新开一个命令终端,运行它:
rosrun rqt_graph rqt_graph
或者直接:
rqt_graph
此时我们可以看到两个节点和一个主题之间的关系图:
没错,上面两个节点(turtlesim_node节点和turtle_teleop_key节点)就是通过/turtle1/cmd_vel这个主题进行互相通信的。如果我们是用ROS Hydro之前的版本,这个主题就是/turtle1/command_velocity。
那这个主题里面的信息都有什么,结构是怎么样的……没问题,我们可以使用一个命令工具进行查询:rostopic。
比如我们想查询刚才联系两个节点的主题/turtle1/cmd_vel的内部信息和结构,那么使用以下命令:
rostopic info /turtle1/cmd_vel
这时我们会发现显示了这个主题的消息类型、发布者和订阅者有关的信息,这个主题的发布者就是节点teleop_turtle,订阅者就是乌龟节点turtlesim,如图:
当然我们可以显示“乌龟键盘控制节点”turtle_teleop_key在这个主题/turtle1/cmd_vel上发布的消息数据,查看的格式是:
rostopic echo topic_name
例如:打开新的终端,输入:
rostopic echo /turtle1/cmd_vel
这时我们就可以按键盘的上下左右键来查看了,当然前提是已经运行了节点turtle_teleop_key:
rosrun turtlesim turtle_teleop_key
并且处于活动的窗口也是这个turtle_teleop_key所在的终端窗口,以确保我们的按键输入能够被捕获:
在turtle_teleop_key所在的终端窗口按了上下左右键之后,/turtle1/cmd_vel所在终端窗口可能出现下面显示内容:
注:ROS版本不同显示内容不同,ROS Hydro之前的版本显示的内容为:
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
综上所述,我们对ROS主题这一概念有一个比较清晰的认识了,概括的说就是:
两个节点之间通过发布主题和订阅主题进行通信,主题的发布和订阅对象都是节点(通过rosnode info查看一个运行的节点,我们会发现节点信息里包含它发布的主题和订阅的主题)。另外,节点之间在发布和订阅同一个主题时,主题的名称和消息类型要一致。
用上面的“乌龟节点”和“键盘控制乌龟节点”例子来解释就是:
turtle_teleop_key(键盘控制乌龟节点/teleop_turtle):发布者;
turtlesim_node(乌龟节点/turtlesim):订阅者;
/turtle1/cmd_vel:主题。
此时如果我们用命令:rostopic info /turtle1/cmd_vel,去查这个主题的内容的话,我们会发现里面确实有上面两个节点的名字,分别在发布者和订阅者项里。geometry_msgs/Twist指主题发布的消息类型,即节点要通过主题发送出去的消息数据类型,这也意味着节点之间通过主题发布和主题订阅进行通信时,消息类型要一致。
主题命令行工具rostopic的其余参数选项的使用,会在之后继续深入了解。
如有说得不准确的地方欢迎各位指正。