[ROS]ROS Topic的学习

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

##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 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • App

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

    91 引用 • 384 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 456 关注
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 643 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    586 引用 • 3538 回帖
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    34 引用 • 467 回帖 • 759 关注
  • 快应用

    快应用 是基于手机硬件平台的新型应用形态;标准是由主流手机厂商组成的快应用联盟联合制定;快应用标准的诞生将在研发接口、能力接入、开发者服务等层面建设标准平台;以平台化的生态模式对个人开发者和企业开发者全品类开放。

    15 引用 • 127 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 415 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    12 引用 • 54 回帖 • 12 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 319 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 2 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    116 引用 • 54 回帖 • 3 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    556 引用 • 675 回帖
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 107 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 543 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 548 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    5 引用 • 7 回帖 • 1 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    267 引用 • 666 回帖 • 3 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 782 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • JWT

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

    20 引用 • 15 回帖 • 19 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 28 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 654 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 400 关注