[ROS]ROS Topic的学习

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 52 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 383 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 754 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 596 关注
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 2 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    127 引用 • 1705 回帖
  • Bug

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

    75 引用 • 1737 回帖
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 306 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 131 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 30 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 8 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 5 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖 • 1 关注
  • 爬虫

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

    106 引用 • 275 回帖
  • Python

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

    541 引用 • 672 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 615 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 637 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 63 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    176 引用 • 995 回帖 • 1 关注
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 3 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 613 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    247 引用 • 1347 回帖