當我們需要啟動多個節點的時候,若使用 rosrun 來啟動每個節點,就必須開啟多個 Terminal 窗口來執行各個節點。如果只有一兩個節點需要啟動,這種方式或許還可以接受,但是如果要啟動的節點非常多,這種方式就很不方便了。
因此,ROS 提供另一種啟動節點的方式。把要啟動的節點列在 Launch 文件中,然後再使用 roslaunch 指令來執行這個 Launch 文件。roslaunch 就會把所有列在 Launch 文件裡面的節點一一啟動,就不需要手動開啟多個 Terminal 窗口來啟動每個節點了。
簡單的說,rosrun 一次只能啟動一個節點,roslaunch 一次可以啟動多個節點。若要使用 roslaunch 一次啟動多個節點,會有兩件事情要做,一是撰寫一個 Launch 文件,二是執行 roslaunch 指令,也就是這篇文章接下來要介紹的主題。
roslaunch 和 Launch 文件除了可以用來啟動多個節點之外,還附帶了其他額外的功能,例如:設定節點名稱、修改參數 (Parameter) 的設定值、設置節點的命名空間 (Namespace),還有修改環境變數 (像是 ROS_ROOT及ROS_PACKAGE_PATH) 等等功能。由於包含的內容甚廣,本文不會涵蓋上述所有內容,相關部分之後有空再另闢文章說明。
撰寫 Launch 文件
Launch 文件採用 XML 格式撰寫,命名時通常以 .launch 作為副檔名。並且,一般會在套件目錄中,創建一個 launch 目錄來放置 Launch 文件。在此已經先行建立一個 mypackage 套件,並且在 mypackage 下新增一個 launch 目錄。
接著,要撰寫一個 Launch 文件來啟動 turtlesim 套件的兩個節點。turtlesim 套件很常在 ROS 教學裡面出現,在這邊也使用這個套件來做為示範。turtlesim 的兩個主要的程式:turtlesim_node 和 turtle_teleop_key,其執行的指令如下。使用 rosrun 來執行的時候,需要開啟兩個 Terminal 窗口來分別執行這兩個指令。
$ rosrun turtlesim turtlesim_node $ rosrun turtlesim turtle_teleop_key |
turtlesim_node 會開啟一個新的視窗,在這個視窗裡面會出現一隻小烏龜。turtle_teleop_key 則是用來接收鍵盤的輸入,在鍵盤輸入上下左右鍵的時候,turtlesim_node 視窗中的小烏龜就會依照鍵盤的輸入來做移動。需要注意的一點是,鍵盤必須在 turtle_teleop_key 運行的這個 Terminal 窗口進行輸入,否則 turtle_teleop_key 是無法接收到鍵盤輸入的,小烏龜也就不會移動了。
接下來,使用一個 Launch 文件來取代上面兩個指令的動作。在 launch 目錄下新增 mytest.launch,並在文件中輸入下列內容。
<launch> <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" /> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop_turtle" /> </launch> |
標籤說明
由於 Launch 文件是採用 XML 格式,因此文件裡面主要是以標籤 (Tag) 組成。在 mytest.launch 文件中,主要使用到兩個標籤:<launch> 和 <node>。
- <launch>
此標籤用來標記 roslaunch 語法的起始和結尾,簡單的說就是標記 Launch 文件的開頭和結束。一個 Launch 文件,會以 <launch> 開始,以 </launch> 結束。
- <node>
此標籤用來啟動一個節點。需要設定三個屬性:
pkg="mypackage" : 套件名稱,指定節點所在的套件。
type="nodetype" : 執行檔名稱,指定啟動節點時所要執行的檔名。
name="nodename" : 節點名稱,可以為啟動的節點取一個名稱。在 ROS 中,節點名稱必須是唯一的,不能重複。
執行 roslaunch 指令
Launch 文件必須使用 roslaunch 指令來執行,roslauch 指令格式如下。
指令格式:
$ roslaunch [package] <filename> |
參數說明:
package: 套件名稱,指定 Launch 文件所在的套件。
filename: 檔案名稱,指定 Launch 文件的檔名。
因此,使用下列指令來啟動 mypackage 套件下的 mytest.launch 文件:
$ roslaunch mypackage mytest.launch |
若要執行的 Launch 文件就在當前操作的目錄,也可以省略套件名稱。例如:
$ roslaunch mytest.launch |
使用 roslaunch 啟動 mytest.launch 之後,可以看到新開啟的視窗,裡面有一隻小烏龜。這個時候,可以在執行 roslaunch 的 Terminal 窗口中,輸入上下左右鍵來控制小烏龜,效果跟先前使用 rosrun 分別執行兩個節點是一樣的。採用這樣的方式,就可以達到使用 roslaunch 來啟動多個節點。
另外,當使用 rosrun 來啟動節點的時候,必須先自行執行 roscore 來啟動 ROS Master。但是,使用 roslaunch 的時候,roslaunch 會自動檢查 ROS Master 是否已經啟動。若 ROS Master 尚未啟動,則 roslaunch 會自動啟動 ROS Master。因此,也就不需要自行執行 roscore 來啟動 ROS Master 了。
參考資料
- ROS Robot Programming
http://wiki.ros.org/Books/ROS_Robot_Programming_English
- roslaunch: <launch> tag
http://wiki.ros.org/roslaunch/XML/launch
- roslaunch: <node> tag
http://wiki.ros.org/roslaunch/XML/node
沒有留言:
張貼留言