可以使用 <node> 標籤來指定你想要啟動的節點,這是最常使用的 roslaunch 標籤。在使用 <node> 標籤時,有一點必須要特別注意,就是 roslaunch 不保證節點的啟動順序,也就是節點不一定會依照在 Launch 文件中編排的順序來啟動。這是可以理解的,因為節點的初始化需要一些時間,而每個節點初始化的時間不一樣,roslaunch 從程式外部無法得知節點初始化的狀況。所以,必須自行確保撰寫的 Launch 文件夠嚴謹,不管節點以任何的順序執行都要能夠正常啟動。
標籤說明
- <node>
此標籤用來啟動指定的節點,有下列屬性可以使用:
pkg="mypackage" : 指定節點所在的套件名稱。
type="nodetype" : 節點型態,必須設定為用來啟動節點的可執行檔名稱。
name="nodename" : 節點名稱。注意:此名稱中不能包含命名空間,可以使用 ns 屬性來指定命名空間。
args="arg1 arg2 arg3" (optional) : 傳遞參數給節點。
machine="machine-name" (optional, see <machine>) : 設備名稱,在指定的設備上啟動節點。
respawn="true" (optional, default: False) : 若此節點被關閉,將自動重啟此節點。
respawn_delay="30" (optional, default 0) : 若 respawn 屬性設定為 true,則在檢測到節點失效後,會等待 respawn_delay 所設定的秒數過後,再嘗試重啟節點。
required="true" (optional) : 若此節點被關閉,就終止整個 roslaunch 的執行。
ns="foo" (optional) : 在此命名空間下啟動節點。
clear_params="true|false" (optional) : 在啟動之前,刪除先前設置在此節點私有命名空間中的所有參數,也就是以此節點名稱為命名空間下的所有參數。預設值為 false。
output="log|screen" (optional, default: log) : 若設定為 'screen',則從節點輸出到 stdout/stderr 的訊息,將會被顯示在螢幕上。若設定為 'log',則輸出到 stdout/stderr 的訊息,將會被寫入到 $ROS_HOME/log 目錄下的日誌檔案中,而且 stderr 訊息仍會顯示在螢幕上。預設值為 log。
cwd="ROS_HOME|node" (optional) : 設定節點的工作目錄 (working directory)。若為 'node',則設定節點的可執行檔目錄為節點的工作目錄。預設為 ROS_HOME 環境變數所設定的目錄。
launch-prefix="prefix arguments" (optional) : 設定指令和參數,用以添加到節點的啟動參數中。這是一個強大的功能,讓你可以使用 gdb, valgrind, xterm, nice 或其他方便的工具。(See Roslaunch Nodes in Valgrind or GDB for examples.)
在 <node> 標籤中,還可以內嵌下列標籤:
<env> : 設置一個環境變數供此節點使用,此環境變數僅在此節點內有作用。
<remap> : 為此節點設置一個重映射參數。
<rosparam> : 在節點的私有命名空間中,透過 rosparam 指令來設置 Parameter 參數。
<param> : 在節點的私有命名空間中,設置一個 Parameter 參數。
實例說明
範例一:
此範例簡單地啟動 turtlesim 示例,並且設定 turtlesim_node 為 respawn="true"。因此若 turtlesim_node 的節點被關閉,就會自動重啟該節點。可以手動把顯示小海龜的視窗關閉,就會看到視窗又自行重新開啟。
-- node1.launch
<launch> <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" respawn="true" /> <node pkg="turtlesim" type="turtle_teleop_key" name="teleop_turtle" /> </launch> |
範例二:
此範例在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。
-- node2.launch
<launch> <node pkg="mypackage" type="checkparam.py" name="node1" output="screen"> <param name="myparam" value="param in node1" /> </node> <node pkg="mypackage" type="checkparam.py" name="node2" output="screen"> <param name="myparam" value="param in node2" /> </node> </launch> |
-- checkparam.py
#!/usr/bin/env python import os, rospy
rospy.init_node('checkparam') print rospy.get_param('~myparam')
rospy.spin() |
此範例設置兩個 <node> 標籤來執行 checkparam.py,並分別在兩個 <node> 標籤下,透過 <param> 標籤來設置 Parameter 參數。設置的 Parameter 參數會位於該節點的私有命名空間中,因此兩個參數分別為:
/node1/myparam: param in node1
/node2/myparam: param in node2
執行 roslaunch mypackage node2.launch 之後,可以看見螢幕顯示:
param in node1
param in node2
因為在 checkparam.py 中,使用 ~ 來表示讀取私有命名空間中的參數。所以 node1 會讀取 /node1/myparam,node2 會讀取 /node2/myparam。
參考資料
- roslaunch: <node> tag
http://wiki.ros.org/roslaunch/XML/node
沒有留言:
張貼留言