ubuntu16.04下ROS作業系統學習(四 / 四)ROS基礎-ROS中的關鍵元件
ROS當中的關鍵元件:
- Launch檔案
- TF座標變換
- Qt工具箱
- Rviz視覺化平臺
- Gazebo物理模擬環境
-
Launch檔案
我們之前都是使用rosrun命令來執行具體的節點的。當我們啟動一個比較複雜的功能的時候,我們需要啟動很多個節點。很多時候這種方法非常麻煩。ROS提供了另一種機制來實現多個節點的啟動,同時也可以具體地配置每個節點之間的引數。比rosrun這樣的命令要方便地多。並且launch檔案可以自動啟動ros master。我們接下來看一個比較簡單的launch檔案:
這個檔案裡面有兩個標籤,launch的標籤和node的標籤。
launch標籤是整個launch檔案中的根元素。也就是說內容都要在launch檔案裡面。
node標籤的意思就是啟動ros當中的一個節點。
格式如上圖所示,其中含有以下引數:
- pkg:節點所在功能包名稱。要啟動的節點的功能包的名字。
- type:節點的可執行檔名稱。功能包下面的可執行檔案。
- name:節點執行時的名稱。節點執行成功之後的名字。這個名字會覆蓋程式碼當中的名字的。
- output、respawn、required、ns、args。除了上述引數之外還有這些引數。output表示的是節點當中的一些內部資訊是否要列印到螢幕上。或者說列印到日誌檔案裡面去。respawn表示的是如果當前節點啟動失敗他會重新啟動。required節點表示的是如果這個節點不啟動的話,那麼整個launch檔案將不會啟動。ns表示的是name space表示節點空間的命名屬性。args表示的是節點當中具體有哪些引數,比如說從命令列輸入兩個引數的加數這樣的。
除了launch標籤和node標籤之外還有另外的一些標籤,比如像引數設定的標籤等
更多的標籤可以在以下連結中進行學習:http://wiki.ros.org/roslaunch/xml
-
TF座標變換
在ros裡面TF功能包能夠幫助我們更好地管理使用座標變換。那麼TF功能包具體可以做什麼呢?
- 我們可以查詢五秒鐘之前,機器人頭部座標系相對於全域性座標系的關係是什麼樣的?
- 機器人夾取的物體相對於機器人中心座標的位置在哪裡?
- 機器人中心座標系相對於全域性座標系的位置在哪裡?
我們可以通過廣播TF變換或者監聽TF變換實現座標變換。
接下來我們通過一個簡單的例子來具體說明一下:
安裝一個功能包,是關於小海龜的一個例子
sudo apt-get install ros-kinetic-turtle-tf
接下來執行demo:
roslaunch turtle_tf turtle_tf_demo.launch
這裡報了一個錯誤:ImportError: No module named rospkg。這是由於anaconda裡面的環境變數設定導致的。可以由以下方法解決:
conda install setuptools
pip install -U rosdep rosinstall_generator wstool rosinstall six vcstools
之後我們執行demo,可以看到以下場景:
之後我們啟動鍵盤控制節點:
rosrun turtlesim turtle_teleop_key
之後我們控制小海龜移動,你會發現一個是跟隨著另一個在做移動的:
在這個例子當中就是展示了座標變換的關係,我們可以通過以下命令看一下它是如何體現座標變換的。
生成的pdf檔案會放到終端執行的根目錄下面:
這裡面是一個樹型結構,可以看到裡面有三個座標系,一個world,一個turtle1和一個turtle2。這三個座標系有什麼關係呢?
我們已知turtle1的位置,也已知turtle2的位置。我們現在的目的是想讓第二隻海龜向第一隻海龜移動。我們可以通過命令列來查詢這兩個座標之間的關係:
我們可以看到平移關係的距離為0,旋轉角度有一點角度的偏差,角度的表示是通過三種方式來表達的。
我們如何來通過程式碼展示剛才的這樣一個例子呢?
- 定義TF廣播器(TransformBroadcaster)
- 建立座標變換值
- 釋出座標變換(sendTransform)
我們在我們的工作空間下面單獨編寫一下關於tf的程式碼。建立功能包,然後編寫程式碼:
這兩個檔案分別是tf的給廣播者和監聽者。
我們首先看一下TF的廣播器:
我們看main函式:首先需要訂閱具體的海龜位置,訂閱成功之後呼叫回撥函式。在回撥函式裡面呼叫廣播器,之後封裝一個海龜的座標變換,這個海龜的座標變換是與世界座標系的變換,其實只有z軸有旋轉,x,y軸都是0。之後的話我們通過sendTransform來將其釋出出去。
之後我們看一下TF監聽器:
- 定義TF監聽器(TransformListener);
- 查詢座標變換(waitForTransform、lookupTransform)
寫好程式碼之後就可以編譯程式碼了
之後在工作空間目錄下對其進行catkin_make編譯就可以了,編譯成功之後就可以通過launch檔案啟動:
-
Qt工具箱
一個視覺化的工具,裡面有多種視覺化的工具,基於qt開發。
rqt__console:日誌輸出工具。
rqt_graph:計算圖視覺化工具。
rqt_plot:資料繪圖工具。
rqt_reconfigure:引數動態配置工具。
-
Rviz視覺化平臺
Rviz是一款三維視覺化工具,可以很好的相容基於ROS軟體的機器人平臺。用於顯示資料的,如機器人模型,座標資訊,運動規劃,導航,點雲,影象,slam等。
- 在rviz中,可以使用可擴充套件標記語言xml對機器人、周圍物體等任何實物進行尺寸、質量、位置、材質、關節等屬性的描述,並且在介面中呈現出來。
- 同時,rviz還可以通過圖形化的方式,實時顯示機器人感測器的資訊、機器人的運動狀態、周圍環境的變化等資訊。
- 總而言之,rviz通過機器人模型引數、機器人釋出的感測資訊等資料,為使用者進行所有可監測資訊的圖形化顯示。使用者和開發者也可以在rviz的控制介面下,通過按鈕、滑動條,數值等方式,控制機器人的行為。
rviz還提供了外掛機制,可以提供給我們一種視覺化地程式設計效果。
-
Gazebo物理模擬引擎
Gazebo是一款強大的三維物理模擬平臺。具備強大的物理引擎,高質量的圖形渲染,方便的程式設計與圖形介面,開源免費。
gazebo的介面如下圖所示:
我們可以通過以下命令啟動一個gazebo的空的模型:
roslaunch gazebo_ros empty_world.launch
由於這個模型是放在國外的伺服器上面的,我們載入它的話就會比較慢,顯示的gazebo就是黑的,沒有關係你可以等一會,或者在網上找找別的方法。在這裡面我們就可以去新增一個機器人模型。
我們可以在左邊新增一些模型:
gazebo本身是一個開源軟體。跟ros相比其實是比較獨立的。跟ros之間有一個介面,來完成跟ros的連線。
gazebo_ros:主要用於gazebo介面封裝、gazebo服務端和客戶端的啟動、URFD模型生成等。
gazeb_msg:是gazebo的Msg和Srv資料結構。
gazebo_plugins:用於gazebo的通用感測器外掛。
gazebo_ros_api_plugin和gazebo_ros_path_plugin這兩個gazebo的外掛實現介面封轉。
如何使用gazebo來進行模擬?
建立模擬環境
配置機器人模型
開始模擬
我們以後再說