说明:本文主要是结合 ROS 官网的相关内容以及自己的相应操作心得整理而成,记录在此处仅仅是为了自己查找方便!
ROS 官网相关参考内容网址:http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics
1. 设置
1.1 roscore
确保 roscore 正在运行。只能运行一个 roscore。
1.2 turtlesim
在一个新终端中运行
rosrun turtlesim turtlesim_node
1.3 海龟键盘遥操作
还需要一些东西来驱动乌龟。 在新终端中运行:
rosrun turtlesim turtle_teleop_key
现在可以使用键盘的箭头键来驱动海龟四处行走了。 如果不能驱动海龟,请选择 turtle_teleop_key 的终端窗口以确保键入的键被记录。
接下来让我们看看驱动海龟四处走动的幕后发生了什么。
2. ROS topics
turtlesim_node 和 turtle_teleop_key 这两个 node 通过 ROS topic 相互通信。 turtle_teleop_key 会在一个 topic 上 publish 关键笔画,而 turtlesim 通过 subscribe 同一 topic 以接收关键笔画。 让我们使用 rqt_graph 来显示当前运行的 node 和 topic。
2.1 使用 rqt_graph
rqt_graph 创建系统中正在发生的事情的动态图。 rqt_graph 是 rqt package 的一部分。 除非已经安装了它,否则运行:
sudo apt-get install ros-melodic-rqt
sudo apt-get install ros-melodic-rqt-common-plugins
再打开一个新终端运行:
rosrun rqt_graph rqt_graph
如果把鼠标放在 /turtle1/comd_vel 上,它将突出显示 ROS node 和 topic,类似下面这样。这表明 turtlesim_node 和 turtle_teleop_key 这两个 node 正在就名为/turtle1/comd_vel 的 topic 进行通信。
2.2 介绍 rostopic
rostopic 工具可以获取有关 ROS topic 的信息。可以使用 help 选项获取 rostopic 的可用子命令。
或者在输入 rostopic 后按 Tab 键来显示可能的子命令。
接下来让我们使用其中一些子命令来检查 turtlesim。
2.3 使用 rostopic echo
rostopic echo 展现 topic 上发布的数据。用法:
rostopic echo [topic]
让我们来看看 turtle_teleop_key 这个 node 发布的 command velocity 数据,打开一个新终端,并运行:
rostopic echo /turtle1/cmd_vel
这时应该看不到任何现象,因为这个 topic 还没有 publish 数据。通过按下方向键使得 turtle_teleop_key 节点开始 publish 数据,就可以看到了,类似下面这样。
现在再回到 rqt_graph,点击左上角的刷新按钮。rostopic echo 也在 subscribe 了 turtle1/command_velocity 这个 topic。
2.4 使用 rostopic list
rostopic list 展现的是当前所有 subscribe 和 publish 的 topic 清单。
让我们看看 list 子命令需要哪些参数。打开一个新终端并运行
rostopic list -h
使用 verbose 选项,会展现 publish 的和 subscribe 的 topic 清单以及 topic 的 type。
rostopic list -v
3. ROS messages
topic 的通信依靠 node 之间传递 ROS message 来实现。对 publisher (turtle_teleop_key) 和 subscriber (turtlesim_node) 来说,publisher 和 subscriber 必须发送和接收相同类型的 message。这意味着 topic 的类型被其所 publish 的 message 的类型所决定。message 的类型可以通过 rostopic type 来确定。
3.1 使用 rostopic type
rostopic type 展现所有 topic 正在 publish 的 message 类型。用法:
rostopic type [topic]
运行:
rostopic type /turtle1/cmd_vel
我们可以使用 rosmsg 来看看细节:
rosmsg show geometry_msgs/Twist
现在我们知道了 turtlesim 期望什么类型的消息,可以向 turtle 发布命令了。
4. 继续 rostopic
现在我们已经了解了 ROS message 了,让我们在 message 中使用 rostopic 吧。
4.1 使用 rostopic pub
rostopic pub 可以将数据 publish 到当前宣传的 topic 上。用法:
rostopic pub [topic] [msg_type] [args]
下面这条命令将向 turtlesim 发送一条 message,告诉它以 2.0 的线速度和 1.8 的角速度移动。
rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这是一个非常复杂的示例,因此让我们详细查看每个参数。
- 这条命令会 publish 一条 message 给到 topic。
rostopic pub
- 这个选项使得 rostopic 只 publish 一条 message 然后就退出。
-1
- 这是要 publish 的 topic 的名字。
/turtle1/cmd_vel
- 这是 publish 给 topic 的时候使用的 message 的类型。
geometry_msgs/Twist
- 这个选项(双破折号)告诉选项解析器后面的参数都不是选项。 当参数有前导破折号时,这是必需的,比如负数。
--
- 如前所述,geometry_msgs/Twist 这条 message 有两个向量,每个向量包含三个浮点元素:线性和角度。 在这种情况下,'[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 命令行文档中有更多描述。
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
你可能已经注意到海龟已经停止移动了,这是因为海龟需要 1 Hz 的稳定命令流才能保持移动。 我们可以使用 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]'
这条命令将在 velocity topic 上以 1 Hz 的速率发布 velocity 命令。
我们还可以查看 rqt_graph 中发生了什么。 按左上角的刷新按钮,rostopic pub 这个 node 正在与 rostopic echo 这个 node 进行通信:
正如你所看到的,海龟在一个连续的圆圈中运动。 打开一个新的终端,我们可以使用 rostopic echo 来查看我们的 turtlesim 所 publish 的数据:
rostopic echo /turtle1/pose
4.2 使用 rostopic hz
rostopic hz 展现数据 publish 的速率。用法:
rostopic hz [topic]
让我们看看 turtlesim_node publish /turtle1/pose 的速度有多快:
rostopic hz /turtle1/pose
现在我们可以说,turtlesim 正在以 60 Hz 的速率 publish 有关海龟的数据。 我们还可以将 rostopic type 与 rosmsg show 结合使用以获取有关一个 topic 的深入信息:
rostopic type /turtle1/cmd_vel | rosmsg show
现在我们已经使用 rostopic 检查了 topic,接下来让我们使用另一个工具来看看我们的 turtlesim 所 publish 的数据。
5. 使用 rqt_plot
rqt_plot 显示 publish 在 topic 上的数据的滚动时间图。 在这里,我们使用 rqt_plot 绘制在 /turtle1/pose 这个 topic 上发布的数据。 首先,通过在一个新终端中输入如下命令来启动 rqt_plot:
rosrun rqt_plot rqt_plot
在应该弹出的新窗口中,通过左上角的文本框能够将任何 topic 添加到绘图中。 键入 /turtle1/pose/x 将突出显示以前禁用的加号按钮,按下它并对 /turtle1/pose/y 这个 topic 重复相同的动作, 现在将看到图中绘制的海龟的 x-y 位置。
按减号按钮将显示一个菜单,允许从图中隐藏指定的 topic。 隐藏刚刚添加的 topic 并添加 /turtle1/pose/theta 后将如下图所示。
现在可以使用 Ctrl-C 关闭 rostopic 终端,但下一节依旧要保持 turtlesim 的运行。