文档章节

理解ROS话题

慕水
 慕水
发布于 2017/09/08 13:18
字数 2523
阅读 3
收藏 0
点赞 0
评论 0

开始

 

roscore

首先确保roscore已经运行, 打开一个新的终端:

 

$ roscore

如果你没有退出在上一篇教程中运行的roscore,那么你可能会看到下面的错误信息:

  • roscore cannot run as another roscore/master is already running.
    Please kill other roscore/master processes before relaunching

这是正常的,因为只需要有一个roscore在运行就够了。

 

turtlesim

在本教程中我们也会使用到turtlesim,请在一个新的终端中运行:

 

$ rosrun turtlesim turtlesim_node

 

通过键盘远程控制turtle

我们也需要通过键盘来控制turtle的运动,请在一个新的终端中运行:

 

$ 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运动了。如果不能控制,请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获。

  • turtle_key.png

现在你可以控制turtle运动了,下面我们一起来看看这背后发生的事。

 

ROS Topics

turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息。下面让我们使用rqt_graph来显示当前运行的节点和话题。

注意:如果你使用的是electric或更早期的版本,那么rqt是不可用的,请使用rxgraph代替。

 

使用 rqt_graph

rqt_graph能够创建一个显示当前系统运行情况的动态图形。rqt_graph是rqt程序包中的一部分。如果你没有安装,请通过以下命令来安装:

  • $ sudo apt-get install ros-<distro>-rqt
    $ sudo apt-get install ros-<distro>-rqt-common-plugins

请使用你的ROS版本名称(比如fuerte、groovy、hydro等)来替换掉<distro>。

在一个新终端中运行:

 

$ rosrun rqt_graph rqt_graph

你会看到类似下图所示的图形:

rqt_graph_turtle_key.png

如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。正如你所看到的,turtlesim_node和turtle_teleop_key节点正通过一个名为 /turtle1/command_velocity的话题来互相通信。

rqt_graph_turtle_key2.png

 

rostopic介绍

rostopic命令工具能让你获取有关ROS话题的信息。

你可以使用帮助选项查看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 echo

rostopic echo可以显示在某个话题上发布的数据。

用法:

 

rostopic echo [topic]

让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocity话题(非hydro版)上发布的数据。

 

$ rostopic echo /turtle1/command_velocity

如果你是用ROS Hydro 及其之后的版本(下同),请运行:

 

$ rostopic echo /turtle1/cmd_vel

你可能看不到任何东西因为现在还没有数据发布到该话题上。接下来我们通过按下方向键使turtle_teleop_key节点发布数据。记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。

现在当你按下向上方向键时应该会看到下面的信息:

  • ---
    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

或者在hrydro中如下:

 

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

现在让我们再看一下rqt_graph(你可能需要刷新一下ROS graph)。正如你所看到的,rostopic echo(红色显示部分)现在也订阅了turtle1/command_velocity话题。

rqt_graph_echo.png

 

使用 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中使用verbose选项:

 

$ 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

 

ROS Messages

话题之间的通信是通过在节点之间发送ROS消息实现的。对于发布器(turtle_teleop_key)和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面的消息类型决定的。使用rostopic type命令可以查看发布在某个话题上的消息类型

 

使用 rostopic type

rostopic type 命令用来查看所发布话题的消息类型。

用法:

 

rostopic type [topic]

运行(非hydro版):

 

$ rostopic type /turtle1/command_velocity
  • 你应该会看到:
    turtlesim/Velocity

hydro版请运行:

 

$ rostopic type /turtle1/cmd_vel
  • 你应该会看到:
    geometry_msgs/Twist

我们可以使用rosmsg命令来查看消息的详细情况(非hydro版):

 

$ rosmsg show turtlesim/Velocity
  • float32 linear
    float32 angular

hydro版:

 

$ 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

现在我们已经知道了turtlesim节点所期望的消息类型,接下来我们就可以给turtle发布命令了。

 

继续学习 rostopic

现在我们已经了解了什么是ROS的消息,接下来我们开始结合消息来使用rostopic。

 

使用 rostopic pub

rostopic pub可以把数据发布到当前某个正在广播的话题上。

用法:

 

rostopic pub [topic] [msg_type] [args]

示例(非hydro版):

 

$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8

示例(hydro版):

 

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。

  • turtle(rostopicpub).png

这是一个非常复杂的例子,因此让我们来详细分析一下其中的每一个参数。

  • rostopic pub
    • 这条命令将会发布消息到某个给定的话题。
  • -1
    • (单个破折号)这个参数选项使rostopic发布一条消息后马上退出。
  • /turtle1/command_velocity
    • 这是消息所发布到的话题名称。
  • turtlesim/Velocity
    • 这是所发布消息的类型。
  • --
  • (双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。这在参数里面包含有破折号-(比如负号)时是必须要添加的。

  • 2.0 1.8
  • 正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。在本例中,2.0是linear的值,1.8是angular的值。这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。

你可能已经注意到turtle已经停止移动了。这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopic pub -r命令来发布一个稳定的命令流(非hydro版):

 

$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0  -1.8

hydro版:

 

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

这条命令以1Hz的频率发布速度命令到速度话题上。

  • turtle(rostopicpub)2.png

我们也可以看一下rqt_graph中的情形,可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信:

rqt_graph_pub.png

正如你所看到的,turtle正沿着一个圆形轨迹连续运动。我们可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。

 

使用 rostopic hz

rostopic hz命令可以用来查看数据发布的频率。

用法:

 

rostopic hz [topic]

我们看一下turtlesim_node发布/turtle/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的频率发布数据给turtle。我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息(非hydro版):

 

$ rostopic type /turtle1/command_velocity | rosmsg show

hydro版:

 

rostopic type /turtle1/cmd_vel | rosmsg show

到此我们已经完成了通过rostopic来查看话题相关情况的过程,接下来我将使用另一个工具来查看turtlesim发布的数据。

 

使用 rqt_plot

注意:如果你使用的是electric或更早期的ROS版本,那么rqt命令是不可用的,请使用rxplot命令来代替。

rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。首先,在一个新终端中运行rqt_plot命令:

 

$ rosrun rqt_plot rqt_plot

这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。按一下该按钮,并对/turtle1/pose/y重复相同的过程。现在你会在图形中看到turtle的x-y位置坐标图。

rqt_plot.png

按下减号按钮会显示一组菜单让你隐藏图形中指定的话题。现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形:

rqt_plot2.png

本部分教程到此为止,请使用Ctrl-C退出rostopic命令,但要保持turtlesim继续运行。

到此我们已经理解了ROS话题是如何工作的,接下来我们开始学习理解ROS服务和参数

本文转载自:

共有 人打赏支持
慕水
粉丝 1
博文 11
码字总数 0
作品 0
深圳
ROS 自定义消息类型

引言 学习ROS的过程中,在话题的发布与订阅之间,我一直在思考,我们能不能定义自己的话题名,甚至在编写我们自己的ROS软件包时,定义我们自己的消息类型。 首先能不能定义自己的话题名 当然...

CSDNhuaong
2017/11/22
0
0
预告:贾子枫 与 Top Liu 的Live - - 如何玩转 ROS 机器人程序设计

首先要非常感谢贾子枫邀请我来参与这次「机器人」主题的系列live,并与大家分享ROS学习的话题。 本次活动定位为公益及技术传播活动 1. 门票定为最低价9.9元 2. 本次live全部收入将用于资助贫...

Top Liu
2017/03/08
0
0
ros打开笔记本摄像头,单目标定

笔记本摄像头多是usb 镜头 下载包或者sudo apt-get install ros-indigo-usb-cam 打开驱动 端口为/dev/video0, 如果你外接了usb摄像头,你应该把该端口改成video1,自行从/dev下验证 对应的话题...

qq_35508344
2017/12/21
0
0
ROS2.0时代

ROS1.0的诟病 Realtime Performance 基于话题的发布与订阅,这种方式本身就不能保证实时性 Node management 当分布式部署的时候,每个node都要指定自己的IP和master在哪 Master(roscore) ...

CSDNhuaong
01/07
0
0
ROS 服务 消息传递

自定义服务的消息类型 定义服务的消息类型与自定义话题的消息类型类似 1、首先在软件包目录下 新建一个 srv文件夹,并且新建一个消息类型文件 mkdir ~/rosworkspace/src/helloros/srv cd ~/r...

CSDNhuaong
2017/11/22
0
0
无人机自主跟踪系统(总体概述)

系统的硬件结构: 摄像头作为图像的输入 机载计算机TX1执行侦测算法 机载计算机TK1执行跟踪算法 大疆M100和飞控作为载体和执行单元 手机作为一个辅助的监控后台,既可以查看状态和图像,也可...

CSDNhuaong
01/06
0
0
boost解析io转换成为imu_msgs

下面使用SYD Dynamics的9轴AHRS(Attitude and heading reference system),来发布sensor_msgs/Imu类型的消息。   将传感器用USB转串口接到Ubuntu系统上,可以用如下命令查看串口信息: ls...

datase
04/16
0
0
做机械臂导航时遇到的问题4:如何订阅joint_states话题(输出关节状态)

在完成用arbotix测试机械臂后,我们想控制真实的机械臂伺服电机。由于arbotix是针对舵机的,我们要想控制伺服电机,要将ROS里机械臂的关节信息(角度、角速度、加速度、力等)发给下位机,首...

weixin_39579805
2017/12/13
0
0
ROS学习笔记(三)先锋机器人的使用 — 参考 ROS wiki 和 Mobile wiki

–参考方案: 找到了关于p3-dx的一些关于ROS的资料 https://github.com/ManolisCh/pioneerp3dx https://github.com/SeRViCE-Lab/p3-dx http://wiki.ros.org/demopioneer 先锋机器人ROS的教程......

David_Han008
2017/01/25
0
0
gstcam开发(ROS+gstreamer)

写在前面 gstcam是github上一个开元的ros软件包,它巧妙地将gstream流媒体框架引入ROS系统。通过利用 gstreamer 实现一个标准的ROS API接口.比如捕获usb uav camera 的图像,然后转化成 ros...

CSDNhuaong
01/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

单身税的时代就要来临,你还没有用Python帮你找一个女朋友吗?

单身税的历史可以追溯到2015年韩国的新政, 低生育率逼得韩国产生了这一政策。 现在我国也要实行这一政策, 很多单身狗就接受不了了 很可惜,国家不包分配对象, 男的都说找对象难, 有没有向...

猫咪编程
18分钟前
0
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
22分钟前
0
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
0
0
编程学习笔记之python深入之装饰器案例及说明文档[图]

编程学习笔记之python深入之装饰器案例及说明文档[图] 装饰器即在不对一个函数体进行任何修改,以及不改变整体的原本意思的情况下,增加函数功能的新函数,因为这个新函数对旧函数进行了装饰...

原创小博客
昨天
0
0
流利阅读笔记33-20180722待学习

黑暗中的生物:利用奇技淫巧快活生存 Daniel 2018-07-22 1.今日导读 如果让你在伸手不见五指的黑暗当中生存,你能熬过几天呢?而大千世界,无奇不有。在很多你不知道的角落,有些生物在完全黑...

aibinxiao
昨天
5
0
Hystrix降级逻辑中如何获取触发的异常

通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际...

程序猿DD
昨天
0
0
gin endless 热重启

r := gin.New()r.GET("/", func(c *gin.Context) {c.String(200, config.Config.Server.AppId)})s := endless.NewServer(":8080", r)s.BeforeBegin = func(add string) ......

李琼涛
昨天
0
0
JAVA模式之代理模式

平时一直在用spring,spring中最大的特效IOC和AOP,其中AOP使用的就是代理模式.闲着无聊,随手写了一个代理模式,也记录下代理模式的实现Demo. 比如现在有一个场景是:客户想要增加一个新的功能,...

勤奋的蚂蚁
昨天
0
0
ES15-JAVA API 索引管理

1.创建连接 创建连接demo package com.sean.esapi.client;import java.net.InetSocketAddress;import org.elasticsearch.action.get.GetResponse;import org.elasticsearch.clien......

贾峰uk
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部