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服務和參數。

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