有時候我們會需要在作業系統的環境變數裡面設置一些參數,當程式在執行的時候,可以讀取這些環境變數,依據環境變數不同的設定值,讓程式執行不同的動作。同時,我們又希望這些自訂的環境變數,只有在我們設置的範圍內可見,也就是僅對我們的程式有作用,對範圍外的程式則沒有效果,這是為了避免影響其他程式的執行。這個時候就可以使用 roslaunch 的 <env> 標籤來實現。
標籤說明
- <env>
此標籤用來新增或修改環境變數。需要設定兩個屬性:
name="environment-variable-name" : 環境變數的名稱,可以是新的環境變數名稱,或是現有的環境變數名稱。若是新的環境變數名稱,則會新增該環境變數;若是現有的環境變數,則用於修改現有環境變數的設定值。
value="environment-variable-value" : 環境變數的設定值,欲將環境變數設定成什麼值。可以為空字串,但是不能省略此屬性。
注意事項:
- <env> 標籤只能在 <launch>, <include>, <node> 或 <machine> 這幾個標籤的範圍內使用。
- 當 <env> 標籤直接嵌在 <launch> 標籤下的時候,此 <env> 標籤的設定只對宣告在其後的節點發生作用,對宣告在其之前的節點沒有效果。
- 使用 <env> 標籤設置的環境變數,對 $(env ...) 語句而言是不可見的,也就是無法使用 $(env ...) 語句來讀取 <env> 標籤的設定。
- roslaunch 結束執行之後,<env> 標籤配置的環境變數即自動清除,不會儲存起來。
實例說明
下面舉一些例子來做說明。我們在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取環境變數。
範例一:
此範例使用 <env> 標籤建立了一個環境變數,環境變數名稱為 MY_ENV_TEST,並且將其值設定為 "Hello World!"。並且,透過 <node> 標籤啟動 Python 撰寫的節點,以讀取該環境變數,並在螢幕上顯示其設定值。
-- env1.launch
<launch> <env name="MY_ENV_TEST" value="Hello World!" /> <node pkg="mypackage" type="checkenv.py" name="checkenv" output="screen" /> </launch> |
-- checkenv.py
#!/usr/bin/env python import os, rospy
print os.environ['MY_ENV_TEST'] rospy.init_node('checkenv') rospy.spin() |
執行 roslaunch mypackage env1.launch 之後,可以看見螢幕顯示 Hello World!,表示 <env> 標籤設定的環境變數可被節點讀取。
範例二:
此範例在 <node> 標籤中設置一個 <env> 標籤,修改如下:
-- env2.launch
<launch> <env name="MY_ENV_TEST" value="This is a test!" /> <node pkg="mypackage" type="checkenv.py" name="checkenv" output="screen"> <env name="MY_ENV_TEST" value="Hello World!" /> </node> <node pkg="mypackage" type="checkenv.py" name="checkenv2" output="screen" /> </launch> |
執行 roslaunch mypackage env2.launch 之後,可以看見螢幕先顯示 checkenv 節點輸出的 Hello World!,再顯示 checkenv2 節點輸出的 "This is a test!"。這是因為設置在 <node> 標籤中的 <env> 標籤,僅對該節點有作用,對其他節點不起作用。所以,checkenv2 節點讀到的環境變數值仍然會是 "This is a test!"。
範例三:
此範例將 <env> 標籤移至 <node> 標籤的後面,修改如下:
-- env3.launch
<launch> <node pkg="mypackage" type="checkenv.py" name="checkenv" output="screen" /> <env name="MY_ENV_TEST" value="Hello World!" /> </launch> |
執行 roslaunch mypackage env3.launch 之後,會看到沒有 MY_ENV_TEST 環境變數而報錯。這是因為 <env> 標籤的設定只對宣告在其後的節點發生作用,對宣告在其之前的節點沒有效果。
範例四:
此範例利用 <env> 標籤修改 ROS_DISTRO 環境變數的設定,ROS_DISTRO 環境變數的原設定值為 kinetic。另外,利用 $(env ROS_DISTRO) 來取得 ROS_DISTRO 的設定值,並將此設定值指定為節點名稱。
-- env4.launch
<launch> <env name="MY_ENV_TEST" value="Hello World!" /> <env name="ROS_DISTRO" value="helloworld" /> <node pkg="mypackage" type="checkenv.py" name="$(env ROS_DISTRO)" output="screen" /> </launch> |
執行 roslaunch mypackage env4.launch 之後,可以看到節點名稱為 kinetic,這是 ROS_DISTRO 環境變數的原設定值。所以,利用 $(env ROS_DISTRO) 只能取得原先環境變數的設定值,無法取得 <env> 標籤的設定。
參考資料
- roslaunch: <env> tag
http://wiki.ros.org/roslaunch/XML/env
沒有留言:
張貼留言