ROS 学习笔记(7)- 理解 ROS topics

说明:本文主要是结合 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 的运行。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值