[ROS]ROS Topic的学习

本贴最后更新于 3043 天前,其中的信息可能已经水流花落

##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。

  • ROS
    23 引用 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 216 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 5 关注
  • CodeMirror
    1 引用 • 2 回帖 • 129 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 5 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 591 关注
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    93 引用 • 899 回帖 • 3 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2388 回帖 • 1 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 536 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 44 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1520 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    16 引用 • 130 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1737 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    343 引用 • 723 回帖
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 548 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 6 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 106 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    943 引用 • 1460 回帖 • 3 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    132 引用 • 795 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 5 关注
  • App

    App(应用程序,Application 的缩写)一般指手机软件。

    91 引用 • 384 回帖 • 2 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 28 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 7 关注