##1.搭建
###1.1roscore
首先启动 roscore,在新的命令窗口运行:
$ roscore
如果现有一个 roscore 在运行,则会看到如下提示:
roscore cannot run as another roscore/master is already running.
Please kill other roscore/master processes before relaunching
这是正常的,同一时间只能有一个 roscore 在运行.
###1.2turtlesim
本节依然还要使用到 turtlesim. 在新的命令窗口运行:
$ rosrun turtlesim turtlesim_node
###1.3turtle keyboard teleoperation
我们需要某个东西来驱动这个小乌龟转圈. 在新的命令窗口运行:
$ rosrun turtlesim turtle_teleop_key
[ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
现在你可以使用方向键来驱动小乌龟行动了。如果不能驱动小乌龟,选择运行 turtle_teleop_key 的命令窗口确定按键确实是在这个窗口点击的。
现在,你可以驱动小乌龟到处转了,让我们来看看这个布景背后发生了什么。
##2.ROS Topic
turtlesim_node 和_teleop 节点之间通过 ROS Topic 进行通信。turtle_teleop_key 通过 Topic 来发布按键的敲击,当 turtlesim 订阅了相同的主题获取敲击的按键。使用 rqt_graph 来显示目前正在运行的节点和主题。
注意:如果之前在用 electric,rqt 将变得不可用。使用 rxgraph 代替。
###2.1 使用 rqt_graph
rqt_graph 提供了系统运行状态的图形界面。rqt_graph 是 rqt 包的一部分。如果没有安装,运行:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
用你的系统版本替换 (indigo, jade, kinetic)。
打开新的命令窗口,运行:
$ rosrun rqt_graph rqt_graph
可以看到类似下面的界面:
如果把鼠标放在/turtle1/command_velocity 上方,它使得 ROS 节点(这里是蓝色和绿色)和主题(红色)高亮。正如你能看到的,turtlesim_node 和 turtle_teleop_key 节点通过主题/turtle1/command_velocity 通信。
###2.2 rostopic 介绍
rostopic 允许从 ROS 主题获取信息.
Y 可以使用帮助选项 rostopic 的子命令:
\$ 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
让我们在 turtlesim 上试试 rostopic 命令.
用法:
rostopic echo [topic]
让我们来看看 turtle_teleop_key 节点发布的命令速度数据。
对于 ROS Hydro 或之后的版本, 这个数据是/turtle1/cmd_vel 主题发布的.在新的命令行窗口,运行:
$ rostopic echo /turtle1/cmd_vel
对于 ROS Groovy 之前的版本,这个是由/turtle1/command_velocity 主题发布的.打开新的命令行窗口,运行:
$ rostopic echo /turtle1/command_velocity
你可能看不到任何情况发生,因为这个主题没有数据发布。让我们通过按方向键来看看 turtle_teleop_key 发布的数据。记住如果如果小乌龟没有在移动,你需要重新选择 turtle_teleop_key 命令窗口。
对于 ROS Hydro 或之后的版本,按下按键可能看到一下信息:
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
---
对于 ROS Groovy 之前的版本,看到的是:
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
---
linear: 2.0
angular: 0.0
现在让我们看看 rqt_graph。点击在左上方 的刷新按钮,这样就可以看到新的节点。正如你看到的,rostopic echo 在这里是红色,现在也从 turtle1/command_velocity 主题订阅消息。
###2.3 rostopic list
rostopic list 返回当前正在发布和订阅的主题.
让我们看下 list 子命令需要什么参数. 打开新的命令窗口,运行:
$ rostopic list -h
Usage: rostopic list [/topic]
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
使用额外的选项:
$ rostopic list -v
这个命令显示一大串信息,包括发布者、订阅者以及他们的类型。
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
* /rosout [roslib/Log] 2 publishers
* /rosout_agg [roslib/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
* /rosout [roslib/Log] 1 subscriber
##3.ROS Messages
发生在主题上的通信是通过节点之间发送ROS消息完成的。 turtle_teleop_key发布者和 turtlesim_node订阅者之间为了通信,发布者和订阅者必需发送和接受相同的消息类型。这意味者一个主题的类型是它上面发布的消息类型决定的。主题上发布的消息类型由rostopic type 决定。
###3.1 使用 rostopic type
Rostopic type 返回任意主题发布的消息的类型.
用法:
rostopic type [topic]
ROS Hydro 及其之后,
尝试:
$ 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
ROS Groovy 及其之前的版本,
尝试:
$ rostopic type /turtle1/command_velocity
可以看到:
turtlesim/Velocity
通过 rosmsg 查看具体的信息:
$ rosmsg show turtlesim/Velocity
float32 linear
float32 angular
现在我们可以知道 turtlesim 接收的是什么类型的消息了,我们可以发布命令到我们的小乌龟。
##4.rostopic 进阶
知道了 ROS Message 是什么东西之后, 让我们结合 messages 来看看 rostopic.
###4.1 使用 rostopic pub
rostopic pub 发布消息到一个正在广而告之的主题.
用法:
rostopic pub [topic] [msg_type] [args]
对于 ROS Hydro 及其之后的版本,示例:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
对于 ROS Groovy 或之前的版本,示例:
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8
上一条命令发布 一条单独的命令到 turtlesim,让它以线速度 2.0, and 角速度 1.8 运动 .
这是个有点复杂的例子, 接下来详细的查看一下每一个参数的含义.
对于 ROS Hydro 及其以后,
这条命令将向给定的主题发布消息:
rostopic pub
这个选项 (-1) 导致 rostopic 只发布一次消息就退出了:
-1
需要发布消息到主题的名字:
/turtle1/cmd_vel
向主题发布的消息类型:
geometry_msgs/Twist
选项 (--) 告诉 选项解析器 接下来的参数没有选项 . 这个以防你的参数以-开头,比如负数:
--
正如前面提示的, geometry_msgs/Twist 消息有包含 3 个单精度浮点元素的 2 个向量:线性的和角度的。'[2.0, 0.0, 0.0]'依次表示线性值:x=2.0,y=0.0,z=0.0。'[0.0, 0.0, 1.8]'表示角度值:x=0.0,y=0.0,z=1.8。这些参数使用的是 YAML 语法,具体的参考 YAML command line documentation.
你可能已经注意到这只小乌龟停止了移动,这是因为小乌龟需要 1HZ 稳定的命令流来保持移动。我们可以发布一个稳定的命令留,通过使用 rostopic pub -r 命令:
ROS Hydro 及其之后的版本,
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
ROS Groovy 及其之前的版本,
$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8
这使得速度主题一直以 1HZ 的速度发布速度命令.
可以通过 rqt_graph 来查看具体发生了什么:
我们可以看到小乌龟一只在循环的转圈圈. 在一个新的命令行, 使用 rostopic echo 来查看 turtlesim 发布了什么数据:
4.2 使用 rostopic hz
Rostopic hz 以消息发布的速率报告消息.
用法:
rostopic hz [topic]
让我们看看 turtlesim_node 以多块的速度发布/turtle1/pose:
$ 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
现在我们可以看到 turtlesim 向我们的小乌龟以 60HZ 的速度发布数据。我们也可以使用 rostopic type 结合 rosmsg 来得到一个主题的深度信息:
ROS Hydro 及其之后的版本,
$ rostopic type /turtle1/cmd_vel | rosmsg show
ROS Groovy 及其之前的版本,
$ rostopic type /turtle1/command_velocity | rosmsg show
现在我们已经可以使用 rostopic 来检查这个主题。让我们用另外一个工具来查看 turtlrsim 节点发布的所有数据。
###4.3 使用 rqt_plot
注意:如果你使用的是 eclectric 或之前的版本,rqt 是不可用的,使用 rxplot 代替。
rqt_plot 以滑动的时间波形显示主题发布的数据. 在这里我们使用 rqt_plot 划分/turtle1/pose 主题发布的数据. 首先, 在新的命令窗口开启 rqt_plot:
$ rosrun rqt_plot rqt_plot
在弹出的新窗口中,左上角的文本狂为你提供添加任意主题到波形图的能力。输入/turtle1/pose/x 将高亮之前是灰色的加号按钮。点击它,然后重复对/turtle1/pose/y 做同样的步骤。你可以在图中看到乌龟的 xy 坐标波形图。
点击减号按钮是一个允许你在波形图中隐藏指定的主题的菜单。
隐藏添加的两个主题,然后添加/turtle1/pose/theta 将使得波形图像下面一样。
对这个区域,使用 Ctrl-C 可以停止 rostopic 终端,但是可以保持 turtlesim 继续运行。
现在你应该已经理解了主题是如何工作的, 下面让我们查看 services and parameters work.
##5.视频教程
接下来的视频展现了一个小的教程,关于如何使用在 ROS 节点和主题上使用 turtlesim。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于