使用 <include> 標籤可以在目前的 Launch 文件中,匯入另一個 Launch 文件。可以依照各種功能來撰寫不同的 Launch 文件,再靈活地透過 <include> 標籤組合這些 Launch 文件。不同的功能匯入不同的 Launch 文件,就能以想要的功能組合來啟動節點。以下就來說明 <include> 標籤要如何使用。
標籤說明
- <include>
此標籤可以用來匯入另一個 Launch 文件,有下列屬性可以使用:
file="$(find pkg-name)/path/filename.xml" : 指定要匯入的檔案名稱和所在位置。
ns="foo" (optional) : 相對於此命名空間 (Namespace) 來匯入文件。
clear_params="true|false" (optional Default: false) : 先前設置在此 <include> 標籤所指定命名空間中的參數,在啟動之前將會被全部刪除。此功能非常危險,應謹慎使用。使用時必須指定 ns。 預設值為 false。
pass_all_args="true|false" (optional Default: false) : 若設定為 true,則當前設定的所有 arg 參數,都會被傳遞到 include 的文件中使用。
在 <include> 標籤中,還可以內嵌下列標籤:
<env> : 設置一個環境變數,此環境變數可以在整個 include 文件中使用。
<arg> : 傳遞 arg 參數到 include 文件中。
注意事項:
- <include> 標籤會將文件匯入到當前的命名範圍內,包括 <group> 和 <remap> 標籤。
實例說明
下面舉一些例子來做說明。我們在 mypackage 套件裡面的 launch 目錄,新增兩個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。
範例:
在 include.launch 中,此設置了兩個 arg 參數,一個放置在 <include> 標籤之前,一個放置在 <include> 標籤之後。並且,在 <include> 標籤中設定 pass_all_args="true",將 arg 參數傳遞到 include 的文件中。
-- include.launch
<launch> <arg name="myarg1" value="Hello" /> <include file="$(find mypackage)/launch/dummy.launch" pass_all_args="true" /> <arg name="myarg2" value="World" /> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
在 dummy.launch 中,為兩個 arg 參數設定了預設值,若上一層的 arg 參數沒有傳遞下來,就會使用這邊設定的預設值。並且,後面兩行使用 arg 參數值來設定 param 參數。
-- dummy.launch
<launch> <arg name="myarg1" default="default" /> <arg name="myarg2" default="default" /> <param name="myparam1" value="$(arg myarg1)" /> <param name="myparam2" value="$(arg myarg2)" /> </launch> |
在 checkparam.py 中,分別讀取兩個 param 參數,並顯示在螢幕上。
-- checkparam.py
#!/usr/bin/env python import rospy
rospy.init_node('checkparam') print rospy.get_param('myparam1') print rospy.get_param('myparam2') rospy.spin() |
執行 roslaunch mypackage include.launch 之後,可以看見 myparam1 被設定為 "Hello",表示 include.launch 中的 myarg1 參數有傳遞到 dummy.launch 文件中。
但是 myparam2 的值為 "default",表示 myarg2 參數沒有傳遞到 dummy.launch 文件中,myarg2 仍使用 dummy.launch 文件中所設定的預設值。這是因為在 include.launch 中,myarg2 的設定被放置在 <include> 標籤之後,所以在 <include> 標籤執行時,myarg2 還沒被設定起來,也就不會傳遞到 dummy.launch 文件中。
所以,若使用 pass_all_args="true",則要傳遞到 include 文件中的 arg 參數,必須在 <include> 標籤之前就先設定好。或者,也可以將 <arg> 標籤設置在 <include> 標籤內。
參考資料
- roslaunch: <include> tag
http://wiki.ros.org/roslaunch/XML/include
沒有留言:
張貼留言