ubuntu16.04下ROS作業系統學習(三)小海龜模擬
主要知識點:
1.啟動小海龜。
2.檢視計算圖,計算圖中的節點通過話題連線,在真實機器人的開發過程當中,機器人的很多功能都是通過節點實現的。
3.檢視話題列表、釋出話題訊息。
4.釋出服務請求。
5.rqt_plot視覺化工具。
6.ROS的應用框架。
1.啟動ROS Master:
我們首先要啟動rosmaster,rosmaster是ros系統首先都要啟動的部分。
開啟第一個終端
roscore
2.啟動小海龜模擬器:
我們另外開啟一個終端,第二個終端,輸入以下命令:
rosrun turtlesim turtlesim_node
會開啟一個介面,如下圖所示:
rosrun是一個啟動節點的命令,後面需要跟兩個引數,第一個是我們所需要啟動的這個節點的功能包的名字turtlesim,之後是改節點的名字turtlesim_node。那麼通過上面的命令,我們就相當於先啟動了哪個功能包,之後啟動了這個功能包下面的哪個節點。
3.啟動海龜控制節點:
我們再開啟一個終端,第三個終端,輸入以下命令:
rosrun turtlesim turtle_teleop_key
之後的話就會提示使用鍵盤,可以控制小海龜。
這行命令也是在turtlesim功能包下面的turtle_teleop_key節點。這個節點的功能就是啟動鍵盤來控制小海龜。
這個ros例子其實是ros非常基本的例子。
4.計算圖:
當我們遇到一個非常陌生的程式,我們可以通過檢視計算圖的方式來檢視這個包裡面有哪些節點,節點之間的關係是怎麼樣的:
我們可以通過rqt來檢視計算圖,是一種基於qt開發的。我們再開啟一個終端,輸入以下命令:
rqt_graph
得出以下結果:
可以看到上圖是有兩個節點,一個小海龜模擬器的節點,一個鍵盤控制的節點。兩個節點之間通過一個話題進行連線,也就是/turtle1/cmd_vel,裡面釋出的具體資料就是通過鍵盤控制小海龜線速度和角速度的具體數值。除此之外還有兩個節點,/rosout是ros裡面一定會存在的兩個節點,它的功能就是去訂閱所有節點發布的一個日誌資訊,每一個節點都可以通過rosout這個話題把日誌資訊傳送給/rosout這個節點。這樣看來的話rosout就是日誌管理的一個節點。rqt的節點就是我們當前介面的節點。
我們把debug選上,我們就能看到系統當中主要的兩個節點:
我們也可以通過rosnode這個命令來檢視系統當中存節點的相關資訊。
如,我們可以使用rosnode list列出所有節點:
rosnode list
這個和我們之前視覺化介面中顯示的節點是一樣的。
我們可以使用rosnode info來檢視節點當中的資訊。比如檢視小海龜模擬器當中的節點資訊:
rosnode info /turtlesim
輸出結果如下所示:
Node [/turtlesim]:表示節點的名字。
Publications:表示節點發布的一些話題。有:
* /rosout [rosgraph_msgs/Log]
* /turtle1/color_sensor [turtlesim/Color]
* /turtle1/pose [turtlesim/Pose]
Subscriptions:表示這個節點訂閱的一些話題。有:
* /turtle1/cmd_vel [geometry_msgs/Twist] # 這個就是訂閱的我們之前鍵盤控制的話題。
Services: 表示所提供的一些服務。
* /clear
* /kill
* /reset
* /spawn
* /turtle1/set_pen
* /turtle1/teleport_absolute
* /turtle1/teleport_relative
* /turtlesim/get_loggers
* /turtlesim/set_logger_level
我們可以使用其他工具來呼叫這裡列出來的服務。
Pid: 19714:表示節點的ID號。
Connections:釋出和訂閱的話題,基於TCP協議。
* topic: /rosout
* to: /rosout
* direction: outbound
* transport: TCPROS
* topic: /turtle1/cmd_vel
* to: /teleop_turtle (http://zhiqianghe:40291/)
* direction: inbound
* transport: TCPROS
除了節點之外,計算圖中還有很重要的兩個概念,一個是話題,一個是服務。
1.話題
如果我們想知道系統當中現在有哪些話題在釋出,或者在訂閱。與rosnode類似,我們也可以檢視相關資訊。
如果我們相關要知道某個話題的資訊是什麼樣的,我們可以通過以下命令檢視:
可以看到當前節點的釋出者是teleop_turtle節點,訂閱者是turtlesim節點。
我們也可以通過命令列來監聽某個話題資訊裡面的具體內容是什麼樣的
我們可以通過命令列來監聽這些資訊:
如,我們想要監聽小海龜控制器速度的輸出,我們可以採取以下命令:
rostopic echo /turtle1/cmd_vel
可以看到是沒有什麼內容的輸出的。這是因為我們當前並沒有釋出這個話題的訊息。如果我們去鍵盤控制終端中點選鍵盤的上下左右按鍵的話,我們就會看到訂閱的話題是有釋出的。
釋出的主要就是小海龜運動的線速度和小海龜執行的角速度。線速度的單位是m/s,角速度的單位是弧度每秒。
我們也可以通過終端簡單地釋出一些測試的訊息
程式碼如下:
傳入的引數為:具體的話題名; 該話題的資料型別; 話題的資料內容。表示釋出的內容為讓小海龜向前移動一下
執行前後的對比圖如下圖所示:
這樣釋出完了之後小海龜就走了一下,如果我們想要以一定的頻率釋出這樣的訊息的話,我們需要在pub命令之後加一個頻率,如想一秒鐘十次這樣的頻率釋出:
之後的話我們的小海龜就撞牆了,還會彈出一個提示框,告訴我們,小海龜撞牆了:
以上就是小海龜話題相關的一些操作。
2.服務
檢視有哪些service:
rosservice list
我們也可以看服務的具體資訊:
我們可以看到這個服務提供的節點就是/turtlesim。資料的型別為:turtlesim/Spawn。裡面包括的一些引數是:Args: x y theta name。
這個服務的功能是在模擬器裡面新生一直海龜,現在模擬器裡面只有一直海龜,如果我們想新生一隻海龜就可以使用這個服務來完成。
這裡面要傳入一些引數,如x,y的座標,表示的是我們要新生的這隻海龜要放在什麼地方,theta表示這個小海龜的角度,我們還要給它設定一個名字。
這樣的話就有一隻新的海龜產生了:
5.常用的視覺化工具
我們在終端中輸入:
就會生成出下面一個這樣的視覺化介面:
中間是一個繪製曲線的顯示區域,如果我們現在想將系統當中的某一個話題當中的具體資訊通過曲線的形式繪製出來。比如這裡我們可以來繪製小海龜的x,y的座標資訊。我們將Topic裡面的斜槓刪除,然後再輸入,這行的話我們就可以看到所有的話題資訊。然後我們選擇turtle1/pose這個話題。
之後的話我們就可以用鍵盤控制一下小海龜移動,然後在介面中就能看到相關資訊的一個流動情況,也可以檢視之前的資訊資料:
6.ROS應用框架
大概的話可以分為上圖所示的三個層次
最底層是Linux層,中間部分是通訊層,ROS已經幫我們實現了TCP/UDP的網路通訊,除此之外,ROS還提供了另外一種通訊方法,叫Nodelet,我們在應用當中會涉及到大級別的資料傳輸,比如說是影象資料,點雲資料等,在本地做資料傳輸的話採用TCP/UDP的話肯呢個會有比較大的資料延時。這個時候如果我們採用共享記憶體的方式來傳輸資料的話,效率會有很大的提升。Nodelet就是採用共享記憶體的方式來採取的通訊方式。在應用層的話是我們比較關心的,ros master是一定存在的。像之前的例子中,我們是運行了兩個節點,第一個節點是運行了小海龜的模擬器,第二個節點我們運行了鍵盤控制的終端。。