1 设置
1.1 roscore
如果上次运行的Terminal已经关掉了,就重新roscore
一下,必须先启动ROS才能继续。
1.2 turtlesim
然后再打开一个命令窗口,运行一个海龟:
$ rosrun turtlesim turtlesim_node
1.3 海龟键盘操作
再打开一个窗口,我们要运行对它的键盘操作了:
$ rosrun turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
这个时候你必须点运行键盘的窗口,这样键盘的操作才能被记下来。
2 ROS Topics
刚才打开的turtlesim_node 和turtle_teleop_key 两个node就是通过Topic通信的。
turtle_teleop_key 把键盘点击发布到一个Topic,如果turtlesim_node 订阅了这个Topic,它就可以得到键盘点击的内容。我们可以通过rqt_graph查看正在运行的node和topic。
Note: If you're using electric or earlier, rqt is not available. Use rxgraph instead.
2.1 使用rqt_graph
这个东西能够创建一个动态图来描述系统里面正在运行什么。rqt_graph 是rqt包的一部分。除非你已经安装过了,不然就得安装一下:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
还是一样的<distro>要换成版本号,比如kinetic。
开个新窗口,运行:
$ rosrun rqt_graph rqt_graph
然后你就会看到这样一张图:
把鼠标移到 /turtle1/command_velocity 上之后,node就会变成蓝色和绿色,Topic就会变成红色。可以看到两个node是通过/turtle1/cmd_vel交流的。
2.2 引入rostopic
这个嘞,就是可以从ROS topic获取信息。
可以使用help查看一些相关命令用法:
$ rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.
Commands:
rostopic bw display bandwidth used by topic
rostopic delay display delay of topic from timestamp in header
rostopic echo print messages to screen
rostopic find find topics by type
rostopic hz display publishing rate of topic
rostopic info print information about active topic
rostopic list list active topics
rostopic pub publish data to topic
rostopic type print topic or field type
Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'
我们可以试着用一下。
2.3 使用rostopic echo
rostopic echo展示发布到topic上的数据
用法:
rostopic echo [topic]
看一下刚才那个topic:
$ rostopic echo /turtle1/cmd_vel
这个时候什么都不会显示,因为还没有按按键,选择小海龟那个命令行窗口,然后按按键,就会有数据了。
类似这样的数据。
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
---
重新看一下rqt_graph ,点一下refresh,你会发现rostopic echo也订阅了 /turtle1/cmd_vel主题。
使用rostopic list
这个命令会列举出当前正在被发布和订阅的所有topic。
看一下怎么用:
$ rostopic list -h
Usage: rostopic list [/namespace]
Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file
-v, --verbose list full details about each topic
-p list only publishers
-s list only subscribers
--host group by host name
我们可以列举出所有信息:
$ rostopic list -v
显示如下:
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 4 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
* /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber
3 ROS Messages
node就是通过在topic上面发送message来交流的。发布者和订阅者能够交流,是因为他们使用了相同的Message类型,topic的类型就取决于message的类型。message的类型可以由rostopic type来定义。
3.1 使用rostopic type
它可以返回任何topic被发布的message类型。
用法:
rostopic type [topic]
比如:
$ rostopic type /turtle1/cmd_vel
然后得到这个:
geometry_msgs/Twist
我们可以看一下他的详细信息:
$ 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
现在我们就知道我们的小海龟想要的数据类型了,我们可以直接给它发命令。
4 深入一步学习rostopic
我们要结合message使用topic了。
4.1 使用rostopic pub
rostopic pub publishes data on to a topic currently advertised.
我翻译不好,英语渣渣,这个笔记只是记录我的学习历程,并不是教程,如果其他人看见了,权当参考,我基本就是在翻译,没有写多少自己的理解。
这个命令可以向正在运行的topic发布数据消息。
用法:
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]'
官网说这个例子还挺复杂的,我们具体看一下:
- 这个命令会把message发送到指定的topic
rostopic pub
- 这个选项是让rostopic只发布一次message,然后退出
-1
- 这个是message要发布到的topic的名字
/turtle1/cmd_vel
- 这个是发布message到topic的时候要使用的消息类型
geometry_msgs/Twist
- 这个就是告诉选项解析器,后面如果再出现“-”就不要管了,不是选项了。
--
- 最后一部分就是参数了,就是对应之前获得的数据类型写的。
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这么写的原因,是这个满足YAML语法,可以详细看看YAML命令行文档
小乌龟移动了一下就不动了,原因是它需要持续的1Hz命令流才能保持移动,我们可以用 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]'
现在小乌龟就一直在转圈了,我们可以再看一下rqt_graph:
4.2 使用rostopic hz
这个可以显示每个发布数据的速率
用法:
rostopic hz [topic]
我们可以来看一下, turtlesim_node发布 /turtle1/pose的速度有多快:
$ rostopic hz /turtle1/pose
可以看到:
subscribed to [/turtle1/pose]
average rate: 63.174
min: 0.008s max: 0.022s std dev: 0.00229s window: 59
average rate: 62.830
min: 0.008s max: 0.022s std dev: 0.00195s window: 122
average rate: 62.716
min: 0.008s max: 0.022s std dev: 0.00191s window: 185
average rate: 62.659
min: 0.008s max: 0.022s std dev: 0.00195s window: 247
average rate: 62.583
min: 0.008s max: 0.022s std dev: 0.00192s window: 310
average rate: 62.583
min: 0.008s max: 0.023s std dev: 0.00195s window: 372
average rate: 62.574
min: 0.008s max: 0.023s std dev: 0.00192s window: 435
average rate: 62.557
min: 0.008s max: 0.023s std dev: 0.00189s window: 498
average rate: 62.575
min: 0.008s max: 0.023s std dev: 0.00187s window: 560
average rate: 62.566
我们可以看到turtlesim 发布数据的速度是60Hz,我们也可以通过 rostopic type和 rosmsg show 结合获得更多关于topic的信息。
$ rostopic type /turtle1/cmd_vel | rosmsg show
5 使用rqt_plot
首先运行rqtploat:
$ rosrun rqt_plot rqt_plot
等一会儿就会弹出来一个框,在左上角输入 /turtle1/pose/x ,然后点击“+”再输入/turtle1/pose/y,点击“+”。
就可以看到两条曲线,是发布到topic上的数据关于时间的曲线。