2020年11月4日 星期三

[ROS] roslaunch: if 和 unless 屬性

這兩個屬性算是比較特別的,所有的標籤都支援這兩個屬性。使用這兩個屬性的標籤,會根據 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')


rospy.spin()

 

執行 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

 

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *