這兩個屬性算是比較特別的,所有的標籤都支援這兩個屬性。使用這兩個屬性的標籤,會根據 if/unless 屬性值的運算結果 ("true" 或 "false"),來決定該標籤被引入 (include) 或排除 (exclude)。
若 if 屬性求值結果為 "1" 或 "true",則引入該標籤內容;若求值結果為 "0" 或 "false",則排除該標籤內容。若 unless 屬性求值結果為 "0" 或 "false",則引入該標籤內容;若求值結果為 "1" 或 "true",則排除該標籤內容。
若求值結果為 "1", "true" 和 "0", "false" 以外的其他值,將會顯示錯誤。
屬性說明
- if=value (optional)
若 value 求值為 true,則引入 (include) 該標籤及其內容,即該標籤有作用。否則排除 (exclude) 該標籤,即該標籤沒有作用。
下例中,當 if 為 true,即 arg 參數 foo 為 true 時,此時 <group> 標籤才有作用,<group> 標籤中的內容才會被引入。
<group if="$(arg foo)">
<!-- stuff that will only be evaluated if foo is true -->
</group>
- unless=value (optional)
若 value 求值為 false,則引入 (include) 該標籤及其內容,即該標籤有作用。否則排除 (exclude) 該標籤,即該標籤沒有作用。
下例中,當 unless 為 false,即 arg 參數 foo 為 false 時,此時 <param> 標籤才有作用,param 參數 foo 才會被設置。
<param name="foo" value="bar" unless="$(arg foo)" /> <!-- This param won't be set when "unless" condition is met -->
注意事項:if 和 unless 的求值結果必須為 bool 值,即值必須為 "true", "1" 或 "false", "0",否則將會顯示錯誤。
實例說明
下面舉一些例子來做說明。我們在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。
-- ifunless.launch
<launch> <arg name="show_ros" default="true" /> <param name="myparam" value="Hello, ROS!" if="$(arg show_ros)" /> <param name="myparam" value="Hello, World!" unless="$(arg show_ros)" /> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
-- checkparam.py
#!/usr/bin/env python import rospy
rospy.init_node('checkparam') print rospy.get_param('myparam')
|
執行 roslaunch ifunless.launch show_ros:=true 之後,if 屬性為 "true",該標籤生效;unless 屬性亦為 "true",該標籤失效。因此,螢幕會顯示 Hello, ROS!
執行 roslaunch ifunless.launch show_ros:=false 之後,if 屬性為 "false",該標籤失效;unless 屬性亦為 "false",該標籤生效。因此,螢幕會顯示 Hello, World!
參考資料
- roslaunch: XML - if and unless attributes
http://wiki.ros.org/roslaunch/XML
沒有留言:
張貼留言