Understanding ROS Topics
ROS/ Tutorials/ UnderstandingTopics
描述:介绍 ROS 话题(Topics),以及 rostopic 和 rqt_plot 命令行工具使用。
下一节:Understanding ROS services and parameters
Setup
roscore
打开新窗口,启动roscore:
$ roscore如果roscore已经启动,将提示以下错误信息:
roscore cannot run as another roscore/master is already running.
Please kill other roscore/master processes before relaunching.
The ROS_MASTER_URI is http://ml-ros-kinetic:11311/
The traceback for the exception was written to the log file这是正常的,因为有且仅需要一个roscore。
turtlesim
在这一部分,我们将用到turtlesim功能包(包含在ros_tutorials元功能包中)。开启新命令窗口输入以下命令启动turtlesim gui:
$ rosrun turtlesim turtlesim_nodeturtle keyboard teleoperation
为了控制乌龟运动,在新窗口运行:
现在就可以通过方向键控制乌龟移动。如果乌龟没有移动,请先确保当前鼠标焦点在turtle_teleop_key所在的窗口。

下面将讲述其背后的原理和实现。
ROS Topics
turtlesim_node和turtle_teleop_key 通过ROS Topic进行通信。turtle_teleop_key 在话题中发布当前按下的方向键信息,turtlesim_node订阅相同的话题以获得当前按键信息。使用rqt_graph可以展示当前节点和话题的关系。
Note: 如果使用的是electric 会更早版本,rqt是不可用的。可以使用rxgraph代替。
Using rqt_graph
rqt_graph会创建当前系统运行的节点和话题的动态图。rqt_graph是rqt功能包的一部分。如果尚未安装,可以输入:
replacing with the name of your ROS distribution (e.g. indigo, jade, kinetic, lunar ...)
打开新窗口,输入:
将会弹出以下类似窗口:

如果将鼠标悬停在/turtle1/com_vel,图形将会高亮,节点显示为蓝色和绿色,话题显示为红色。正如图片表示的那样, turtlesim_node 和 turtle_teleop_key 通过 /turtle1/com_vel话题通信。

Introducing rostopic
使用 rostopic 命令行工具可以获取ROS 话题(topics) 相关信息。
可以使用帮助选项-h获取可用的子命令:
或者在rostopic后面按下tab键,打印可能的子命令:
Using rostopic echo
rostopic echo能够展示话题发布的数据。
Usage:
查看turtle_teleop_key节点发布的数据。
对于 ROS Hydro 以及之后的版本,数据发布在 /turtle1/cmd_vel 话题。打开新窗口,输入:
对于 ROS Groovy 以及之前的版本,数据发布在 /turtle1/command_velocity 话题。打开新窗口,输入:
你可能不会看到任何信息,因为当前话题未发布任何信息。此时,为了看到turtle_teleop_key发布的信息需要继续按下方向键。如果乌龟没有移动,请先重新选择turtle_teleop_key窗口。
对于 ROS Hydro 以及之后的版本,在按下按键后将看到以下信息:
对于 ROS Groovy 以及之前的版本,在按下按键后将看到以下信息:
打开rqt_graph图形窗口,点击左上角的刷新按钮。图中红色的节点现在也订阅了 /turtle1/cmd_vel 话题。

Using rostopic list
rostopic list返回当前订阅和发布的所有话题。
查看rostopic list子命令,打开新窗口,运行:
使用rostopic list下的verbose选项:
将展示当前订阅和发布的话题以及他们的消息类型。
对于 ROS Hydro 以及之后的版本:
ROS Messages
ROS节点间的话题通信,通过发送ROS messages完成。对于发布者(turtle_teleop_key) 和订阅者(turtlesim_node) 之间的通信,发布者和订阅者必须发布和订阅相同的数据类型。这就意味着话题类型被定义为发布的消息类型。使用rostopic type可以获取指定话题所发送的消息类型。
Using rostopic type
rostopic type返回获取任意正在发布的话题的消息类型。
Usage:
对于 ROS Hydro 以及之后的版本:
打开新窗口,输入:
使用rosmsg查看消息的详细定义:
在已知turtlesim接受的消息类型后,我们可以发布相应的消息内容给我们的乌龟。
rostopic continued
Using rostopic pub
使用rostopic pub发布/turtle1/cmd_vel话题所需要的数据。
Usage:
对于 ROS Hydro 以及之后的版本,输入:
这一指令将发布一次消息给turtlesim,指引乌龟以2.0的线速度和1.8的角速度运动。

这是一条较为复杂的指令,下面将给出详细的解释.
对于 ROS Hydro 以及之后的版本,这一命令将发布消息给特定的话题:
-1这一选项表示,仅发布一次消息然后退出:
以下是本次发布消息的话题名称:
以下是该话题的消息类型:
这里的双破折号--选项告诉解析器,后面的参数不是可选项。如果您的参数具有前导破折号“-”(如负数),那么就会出现双破折号的情况。
前面已经提到,geometry_msgs/Twist消息有两个长度为三的浮点数组:linear 和 angular。在这个例子中,'[2.0, 0.0, 0.0]' 将为线速度linear赋值为x=2.0, y=0.0, 和z=0.0, '[0.0, 0.0, 1.8]'将为角速度 angular赋值为 x=0.0, y=0.0, 和 z=1.8。这是符合YAML 语法的格式,详细内容请参见 YAML command line documentation.
值得注意的是,乌龟运动一会后会自动停下来。为了使乌龟持续的运动下去,需要通过 rostopic pub -r持续发布稳定的消息流。
对于 ROS Hydro 以及之后的版本:
这一条速度发布指令的速率是1Hz。

在rqt_graph的图形界面中,我们可以清楚看到各节点以及话题之间的关系。这里的红色节点,即为当前发布速度消息的节点。

在turtlesim的图形界面中,能清楚的看到小乌龟沿着一个连续的圆运动。打开一个新窗口,使用rostopic echo来查看乌龟的位姿信息:
Using rostopic hz
rostopic hz 命令可以监控消息发布的频率。
Usage:
查看turtlesim_node 正在发布/turtle1/pose的频率:
可以得到以下信息:
可以看出,当前turtlesim发布位姿消息的频率大概为62 Hz。同样的,我们可以使用rostopic type 和 rosmsg show 联合的方式获取消息的详细定义:
对于 ROS Hydro 以及之后的版本:
Using rqt_plot
rqt_plot显示有关主题的已发布数据随时间推进的图。在这里,我们将使用rqt_plot来绘制在 /turtle1/pose 主题上发布的数据。在新窗口通过输入以下内容,打开rqt_plot图形界面:
在左上角的文本框,可以输入任何想要绘制的话题数据。输入 /turtle1/pose/x ,点击高亮的加号按钮,或者直接回车。按同样的方式添加 /turtle1/pose/y。很快就可以看到 x-y坐标绘制在图中。

点击减号➖,下拉选择需要隐藏的绘图。隐藏前面添加的话题内容,添加/turtle1/pose/theta以形成如下绘图。

Reference
http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics
Last updated