ROS学习总结(6)

理解ROS话题

说明:

  • 本教程介绍ROS话题(topics)以及如何使用rostopic 和 rxplot 命令行工具。

目录

  • roscore
  • turtlesim
  • 通过键盘远程控制turtle
  • ROS Topics
  • 使用 rqt_graph
  • rostopic介绍
  • 使用 rostopic echo
  • 使用 rostopic list
  • ROS Messages
  • rostopic type
  • 继续学习 rostopic
  • 使用 rostopic pub
  • 使用 rostopic hz
  • 使用 rqt_plot

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所在的终端窗口以确保你的按键输入能够被捕获。

ROS Topics

  • turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。
  • turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息。
  • 下面让我们使用rqt_graph来显示当前运行的节点和话题。
  • 注意:如果你使用的是electric或更早期的版本,那么rqt是不可用的,请使用rxgraph代替。
  • 在一个新终端中运行:
$ rosrun rqt_graph rqt_graph

 

$ 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

 

使用 rostopic echo

 

 

rostopic echo [topic]

 

$ rostopic echo /turtle1/command_velocity

 

$ rostopic echo /turtle1/cmd_vel

 

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

 

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_echo.png

使用 rostopic 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

ROS Messages

使用 rostopic type

rostopic type [topic]
$ rostopic type /turtle1/command_velocity
turtlesim/Velocity
$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ rosmsg show turtlesim/Velocity
float32 linear
float32 angular
$ 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

继续学习 rostopic

使用 rostopic pub

rostopic pub [topic] [msg_type] [args]
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity  -- 2.0  1.8
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

turtle(rostopicpub).png

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

turtle(rostopicpub)2.png

rqt_graph_pub.png

使用 rostopic hz

rostopic hz [topic]
$ 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
$ rostopic type /turtle1/command_velocity | rosmsg show
rostopic type /turtle1/cmd_vel | rosmsg show

使用 rqt_plot

$ rosrun rqt_plot rqt_plot

rqt_plot.png

rqt_plot2.png

  • 你会看到类似下图所示的图形:
  • rqt_graph_turtle_key.png
  • rostopic介绍

  • rostopic命令工具能让你获取有关ROS话题的信息。
  • 你可以使用帮助选项查看rostopic的子命令:
  • 显示:
  • 接下来我们将使用其中的一些子命令来查看turtlesim。
  • rostopicecho可以显示在某个话题上发布的数据。
  • 用法:
  • 让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题(非hydro版)上发布的数据。
  • 如果你是用ROS Hydro 及其之后的版本(下同),请运行:
  • 你可能看不到任何东西因为现在还没有数据发布到该话题上。

  • 接下来我们通过按下方向键使turtle_teleop_key节点发布数据。

  • 记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。

  • 或者在hrydro中如下:
  • 现在让我们再看一下rqt_graph(你可能需要刷新一下ROS graph)。

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

    •  

    • 正如你所看到的rostopic echo(红色显示部分)现在也订阅了turtle1/command_velocity话题。

    • rostopic list能够列出所有当前订阅和发布的话题。
    • 让我们查看一下list子命令需要的参数,在一个新终端中运行:
    • 显示:
    • 在rostopic list中使用verbose选项:
    • 这会显示出有关所发布和订阅的话题及其类型的详细信息。

      Published topics:

      Subscribed 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
      • /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
      • /rosout [roslib/Log] 1 subscriber
    • 话题之间的通信是通过在节点之间发送ROS消息实现的。
    • 对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。
    • 这意味着话题的类型是由发布在它上面的消息类型决定的。
    • 使用rostopic type命令可以查看发布在某个话题上的消息类型。
    • rostopic type命令用来查看所发布话题的消息类型。
    • 用法:
    • 运行(非hydro版):
    • 你应该会看到:
    • hydro版请运行:
    • 你应该会看到:
    • 我们可以使用rosmsg命令来查看消息的详细情况(非hydro版):
    • 显示:
    • hydro版:
    • 显示:
    • 现在我们已经知道了turtlesim节点所期望的消息类型,接下来我们就可以给turtle发布命令了。
    • 现在我们已经了解了什么是ROS的消息,接下来我们开始结合消息来使用rostopic。
    • rostopicpub可以把数据发布到当前某个正在广播的话题上。
    • 用法:
    • 示例(非hydro版):
    • 示例(hydro版):
    • 以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。
    • 这是一个非常复杂的例子,因此让我们来详细分析一下其中的每一个参数。
    • 这条命令将会发布消息到某个给定的话题。
    • (单个破折号)这个参数选项使rostopic发布一条消息后马上退出。
    • 这是消息所发布到的话题名称。
    • 这是所发布消息的类型。
    • (双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。
    • 这在参数里面包含有破折号-(比如负号)时是必须要添加的。
    • 正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。

    • 在本例中2.0是linear的值,1.8是angula的值。

    • 这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。

    • 你可能已经注意到turtle已经停止移动了。

    • 这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。

    • 我们可以使用rostopic pub -r命令来发布一个稳定的命令流(非hydro版):

    • hydro版:
    • 这条命令以1Hz的频率发布速度命令到速度话题上。
    • 我们也可以看一下rqt_graph中的情形
    • 可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信:
    • 正如你所看到的,turtle正沿着一个圆形轨迹连续运动。
    • 我们可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。
    • rostopic hz命令可以用来查看数据发布的频率。
    • 用法:
    • 我们看一下turtlesim_node发布/turtle/pose时有多快:
    • 你会看到:
    • 现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle。
    • 我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息(非hydro版):
    • hydro版:
    • 到此我们已经完成了通过rostopic来查看话题相关情况的过程,接下来我将使用另一个工具来查看turtlesim发布的数据。
    • 注意:如果你使用的是electric或更早期的ROS版本,那么rqt命令是不可用的,请使用rxplot命令来代替。

    • rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。

    • 这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。

    • 首先,在一个新终端中运行rqt_plot命令:

    • 这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。
    • 在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。
    • 按一下该按钮,并对/turtle1/pose/y重复相同的过程。
    • 现在你会在图形中看到turtle的x-y位置坐标图。
    • 按下减号按钮会显示一组菜单让你隐藏图形中指定的话题。
    • 现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形:
    • 本部分教程到此为止,请使用Ctrl-C退出rostopic命令,但要保持turtlesim继续运行。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值