[ROS]ROS Topic的学习

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • AWS
    11 引用 • 28 回帖 • 11 关注
  • Postman

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

    4 引用 • 3 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    85 引用 • 165 回帖
  • SMTP

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

    4 引用 • 18 回帖 • 637 关注
  • Access
    1 引用 • 3 回帖 • 7 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 442 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • 反馈

    Communication channel for makers and users.

    126 引用 • 929 回帖 • 266 关注
  • 代码片段

    代码片段分为 CSS 与 JS 两种代码,添加在 [设置 - 外观 - 代码片段] 中,这些代码会在思源笔记加载时自动执行,用于改善笔记的样式或功能。

    用户在该标签下分享代码片段时需在帖子标题前添加 [css] [js] 用于区分代码片段类型。

    132 引用 • 876 回帖 • 4 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 735 关注
  • Node.js

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

    139 引用 • 269 回帖
  • Markdown

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

    169 引用 • 1527 回帖
  • LaTeX

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

    12 引用 • 54 回帖 • 20 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 299 关注
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 819 关注
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 512 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 661 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • SQLite

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

    5 引用 • 7 回帖
  • Dubbo

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

    60 引用 • 82 回帖 • 610 关注
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    729 引用 • 1278 回帖
  • Spring

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

    946 引用 • 1460 回帖
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1395 回帖 • 3 关注
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 1 关注
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 3 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖