理解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所在的終端窗口以確保你的按鍵輸入能夠被捕獲。

這裏寫圖片描述

現在你可以控制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等)來替換掉。

在一個新終端中運行:

$ rosrun rqt_graph rqt_graph

你會看到類似下圖所示的圖形:

rqt_graph_turtle_key.png

如果你將鼠標放在/turtle1/command_velocity上方,相應的ROS節點(藍色和綠色)和話題(紅色)就會高亮顯示。正如你所看到的,turtlesim_node和turtle_teleop_key節點正通過一個名爲 /turtle1/command_velocity的話題來互相通信。

這裏寫圖片描述

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的頻率發佈速度命令到速度話題上。

rqt_graph_pub.png

我們也可以看一下rqt_graph中的情形,可以看到rostopic發佈器節點(紅色)正在與rostopic echo節點(綠色)進行通信:

這裏寫圖片描述

正如你所看到的,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服務和參數。

原文地址:http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingTopics

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章