这部分我们介绍ROS主题并且学习rostopic和rqt_plot命令用法。我们依然使用turtlesim,这次我们想让他动起来。老规矩先运行ROS,然后新开一个terminal运行turtlesim:
$ rosrun turtlesim turtlesim_node之后我们可以新开一个terminal输入命令;也可以将刚刚的窗口放到ubuntu后台运行,在原先的terminal输入命令。但是一定要先运行turtlesim,否则两个节点不能通信,就无法实现了:
$ rosrun turtlesim turtle_teleop_keyOK,现在让我们来思考一下这是怎么做到的?首先turtle_teleop_key发布按键消息给主题,与此同时turtlesim订阅相同的主题接收按键消息,这样turtle_teleop_key和turtlesim就在主题上通信了。让我们用一个新的命令看一下节点和主题目前的运行情况,同理在输入命令之前,上一条命令暂挂ubuntu后台运行或者再开一个新的terminal来输入新的命令:
$ rosrun rqt_graph rqt_graphrqt_graph构建了一个动态图来描述现在ROS里面发生的事情,rqt_graph是rqt package的一部分,待会我们会学习他的另一个命令。好了,你输入了上一条命令,一定能够看到类似这样的图片: 如果你将鼠标移动到/turtle1/command_velocity你会看到高亮成蓝色和绿色的节点,还有红色的主题,整幅图形象的描述了Nodes(节点)之间通过Topics(主题)传递Messages(消息)的机制。
rostopic允许我们去获取有关主题的信息,可以用help选项来查看所有关于rostopic的命令:
$ rostopic -h 返回如下: rostopic bw 显示主题占用的带宽 rostopic echo 将节点发布在主题的消息打印在屏幕上 rostopic hz 显示主题发布速率 rostopic list 打印活跃主题的信息 rostopic pub 发布信息给主题 rostopic type 打印主题类型我们用echo命令来查看节点发布在主题的消息,当然这里和上面一样,可以开一个新的terminal也可以挂在后台运行,当然挂在后台的话,最后一定要将按键移动命令调到前台来,否则他是吃不到你的按键信息的。
用法:rostopic echo [topic] $ 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 ---很容易想到,为什么echo可以打印turtle_teleop_key发布在主题的消息呢?很显然,echo命令本身就会创建一个节点,这个节点就是在订阅turtle_teleop_key发布在主题的消息,我们来验证一下这个想法:
$ rosnode list 返回如下: /rosout /rostopic_14245_1355179857944 /teleop_turtle /turtlesim很明显多了一个节点/rostopic_18823_1489116551489,那么这个节点是不是还是通过原来那个主题在订阅呢?我们用rqt命令来验证一下:
$ rosrun rqt_graph rqt_graph可以看到,依然是通过/turtl1/cmd_vel这个主题在发布订阅。我们还可以用list -v命令来查看每个主题发布订阅的次数:
$ rostopic list -v 返回如下: Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [turtlesim/Velocity] 1 publisher * /rosout [roslib/Log] 2 publishers * /rosout_agg [roslib/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [turtlesim/Velocity] 1 subscriber * /rosout [roslib/Log] 1 subscriber我们观察/turtle1/cmd_vel发布一次,订阅两次,根据rqt_graph我们很容易知道是/teleop_turtle发布了一次,/rostopic_14245_1355179857944和/turtlesim各订阅了一次。
上一部分我们已经详细的介绍了关于主题的发布订阅,已知节点可以通过主题来发布订阅消息,那么消息对节点们来说应该是都可以理解的,这说明消息的类型应该是一致的,决定消息类型的很显然应该就是主题了。主题的类型决定了发布何种类型的消息,而主题发出的消息能够由rostopic type命令查看。接下来我们学习一下该命令相关知识:
用法:rostopic type [topic] $ rostopic type /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这样我们就清楚的知道/turtle1/cmd_vel发布消息的类型和/turtlesim订阅消息的类型。 现在我们尝试在/turtle1/cmd_vel发布消息,使用rostopic pub命令:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'其中“-1”是只发布一次消息的含义,“–”表示后面跟着的是参数选项,而’[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’我们应该能够猜到就是设置linear和angular的值,这里值得注意的是“–”之后需要空格,后面参数之间也需要空格隔开。 那如果我们想要小乌龟一直动,那么是不是需要持续发送消息呢?让我们来用一句话实现该功能:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'“-r”是让发布按一定的速率,“1”就代表了速率是1hz。虽然发布速率可以调整快慢,但是如果/turtlesim没有设计对快慢的考虑的话,小乌龟的速率也是不会提升的。 这个时候如果用rqt_graph去查看系统里的消息传递,你就会看到下图: 这是因为我们发布消息就是创建了一个节点在发布,那么显然/turtlesim收到了订阅消息,在不停的转圈,同时/rostopic_14245_1355179857944也收到了订阅消息,在不停的打印linear和angular。 接下来我们可以查看下节点在主题发布订阅的速率(这里感觉官网的描述不够准确,我自己调整了一下):
用法:rostopic hz [topic] $ rostopic hz /turtle1/pose 返回如下: subscribed to [/turtle1/pose] average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58 average rate: 59.459 min: 0.005s max: 0.027s std dev: 0.00271s window: 118 average rate: 59.539 min: 0.004s max: 0.030s std dev: 0.00339s window: 177 average rate: 59.492 min: 0.004s max: 0.030s std dev: 0.00380s window: 237 average rate: 59.463 min: 0.004s max: 0.030s std dev: 0.00380s window: 290这里我们通过/turtle1/pose主题测试了/turtlesim节点的发布速率为60Hz,同样的我们可以测试rostopic_14405_1355179938589在/turtle1/cmd_vel主题的发布速率,其实我们刚刚“ -r 1 ”的命令已经确定了必然是1Hz的速率。
我们已经用过rqt_graph来绘制ROS中正在发生的事情。虽然我们已经能够看到节点经过主题将消息发布,然后另外的节点又经过主题订阅。但是我们仍然看不见消息数据,所以我们现在要用rqt_plot来查看消息数据:
$ rosrun rqt_plot rqt_plot我们可以在Topic处添加我们想看的消息,然后点击加号,这样消息数据就会以滚动时间图的形式展现出来了,减号则是可以删减不想看的消息数据。
相信经过这节内容,应该知道了Topic是如何工作的了吧。