理解ROS话题

首先需要打开一个终端在里面运行roscore:

roscore

再打开一个终端,在里面运行一个turtlesim_node节点:

rosrun turtlesim turtlesim_node

打开另一个终端,在里面输入:

rosrun turtlesim turtle_teleop_key

从命令行可以看出,这是两个node,他们在同一个包中。


在运行完这条命令后,在运行turtle_teleop_key的终端下,按键盘上的方向键可以看到,之前我们运行的乌龟开始移动,:-),很有意思吧。

turtlesim_nodeturtle_teleop_key通过ROS的话题(Topic)来相互通信。turtle_teleop_key把用户按下的键发布到话题上,turtlesim_node也订阅了同一个话题用来接收用户按下的键,并做出相应的动作。我们有这个例子可以体会到话题的作用,更加深刻的认识到了节点的概念。


rqt_graph创建了一个当前系统中运行的节点的动态图。如果你没有安装rqt的话,请首先安装:

sudo apt-get install ros-hydro-rqt
sudo apt-get install ros-hydro-rqt-common-plugins

通过上面的配置,我们实现了通过键盘按键来控制小乌龟的移动,然后我们在终端输入命令:

rosrun rqt_graph rqt_graph

理解ROS话题_第1张图片

就可以看到一个表示节点之间的关系的图。将鼠标放在图片上面可以看到图片会变为高亮。可以看到两个节点是通过/turtle1/command_velocity话题来进行通信的。

使用rostopic echo命令可以查看在一个话题上发布的数据。它的使用方法如下:

rostopic echo [topic]

You can use the help option to get the available sub-commands for rostopic

可以用过rostopic的help选项来查看一些子命令:

$ rostopic -h
rostopic bw     display bandwidth used by topic
rostopic echo   print messages to screen
rostopic hz     display publishing rate of topic    
rostopic list   print information about active topics
rostopic pub    publish data to topic
rostopic type   print topic type

例如:我们输入:

rostopic echo /turtle1/cmd_vel

之后我们在运行turtle_teleop_key节点的窗口下按方向键,就可以在刚才的窗口看到输出的数据如下:

linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---
linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

这个就是显示的线速度和角速度,这也就是两个node之间信息通信的内容。注意这个流程,turtle_teleop_key这个node接收键盘的按键,然后发布消息到cmd_vel这个Topic中,然后turtlesim_node这个节点也订阅了这个Topic,所以能接收到命令。

现在我们重新运行(或者是刷新之前运行的那个rqt_graph):

rosrun rqt_graph rqt_graph

理解ROS话题_第2张图片

就可以看到话题刚才只有一个订阅者 现在又多了一个订阅者。可以看到,新的node的名字的rostopic打头的,也就是我们刚才输入的指令,可以理解为新的node,这个node的作用是把输入的指令打印在电脑上,说白点就是你给小龟的指令也给我一份,我把它显示在屏幕上,你给小龟的那个指令就控制它去乱跑吧!


使用rostopic list可以列举出当前系统中的话题:

rostopic list

使用:

rostopic list -v

可以查看每一个话题的发布者和订阅者的个数


话题上的通信通过节点之间发送消息来完成。对于发布者(turtle_teleop_key)和接收者(turtlesim_node)的通信,发布者和接收者必须使用类型相同的消息。也就是说,一个话题的类型是通过在它上面发布的消息的类型来定义的。可以通过:

rostopic type /turtle1/cmd_vel

来查看/turtle1/cmd_vel的消息类型。你得到的返回类型如下:

geometry_msgs/Twist

我们可以使用rosmsg来查看一个消息类型的详细信息:

rosmsg show geometry_msgs/Twist

得到的结果如下:

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

现在我们已经知道了turtlesim接收的消息类型,现在我们可以给它发布消息了。rostopic pub命令用来发布消息,它的使用方法如下:

rostopic pub [topic] [msg_type] [args]

实例如下:

rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

我们可以看到,乌龟运动了一个弧度。这是一个非常复杂的命令,我们详细分析一下:

rostopic pub:这个命令发布话题
-1:这个参数的意思是只发布一条命令,然后退出
/turtle1/cmd_vel:这是要发布消息的话题
-- [2.0] [1.8]:这两个参数我们可以先不用深究

我们可以使用rostopic pub -r命令让乌龟持续运动,如:

rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

1的意思是:输出频率为1HZ,不间断进行输出。这样我们会发现小龟正在转圈圈。

总结:通过这节的内容,我们了解到在运行中,有一些节点node向某个topic上发布消息,同时另外的一些节点从这个topic中订阅消息,这样就实现了两个节点之间的通信。

当然我们能把节点上传输的消息截获下来,显示到屏幕上,我们也能向这个topic上发布消息,让相关订阅这个topic的节点做出相应的相应。在我们截获消息或者发布消息的时候,利用rostopic list -v显示的某个消息的发布者和订阅者都会增加。

这是查看rqt_graph看到各个节点和topic的关系图:

理解ROS话题_第3张图片


注意:这时使用命令:

rostopic list -v

能看到另外的一些topic,例如其中的/turtle1/pose这个topic就是表示小乌龟当前的位置信息。我们可以把这些位置信息输出到屏幕上显示出来:

rostopic echo /turtle1/pose

然后rqt_graph会是这个样子,也就是说/turtle1/pose这个topic现在有一个发布者和一个订阅者(原来只有一个发布者,没有订阅者)。

image


你可能感兴趣的:(OS)