我們常常會在 Parameter Server 設置一些參數,當節點在執行的時候,讓節點依據不同的參數設定而做出不同的行為。這個時候我們會用到的就是這個 <param> 標籤,這個標籤可以讓我們在 Launch 文件中配置 Parameter Server 中的參數。以下就來講講要如何使用 <param> 標籤。
標籤說明
- <param>
此標籤用來配置 Parameter Server 中的參數,有下列屬性可以使用:
name="namespace/name" : 參數名稱,命名空間 (Namespace) 可以包含在參數名稱中。但是,應盡量避免使用全局指定的名稱。
value="value" (optional) : 定義參數的設定值。若不使用此屬性設定參數值,則必須使用 binfile, textfile 或 command 等屬性來設定參數值。
type="str|int|double|bool|yaml" (optional) : 指定參數的資料型態。若不指定資料型態,則 roslaunch 將會自動決定其資料型態。
roslaunch 設定其資料型態的規則為:
- 帶小數點的數字為浮點數 (floating point)
- 不帶小數點的數字為整數 (integer)
- "true" 和 "false" (不區分大小寫) 為布林值 (boolean)
- 其餘的全部視為字串 (string)
textfile="$(find pkg-name)/path/file.txt" (optional) : 使用文檔來指定參數值,讀取的檔案內容將被儲存為字串型態。檔案必須確認在本地端可存取,強烈建議使用 $(find pkg-name)/file.txt 語法來指定檔案的位置。(參考下面範例三)
binfile="$(find pkg-name)/path/file" (optional) : 使用二進制檔案來指定參數值,讀取的檔案內容將被儲存為 base64-encoded XML-RPC binary object。檔案必須確認在本地端可存取,強烈建議使用 $(find pkg-name)/file.txt 語法來指定檔案的位置。
command="$(find pkg-name)/exe '$(find pkg-name)/arg.txt'" (optional) : 使用指令的輸出做為參數值,指令的輸出將被儲存為字串型態。若有使用到檔案作為參數,強烈建議使用 $(find pkg-name)/file.txt 語法來指定檔案的位置。另外,由於 XML 字符轉義的要求,應該使用單引號將檔案參數框起來。(參考下面範例四)
補充說明:
- 可以將 <param> 標籤放在 <node> 標籤內,在這種情況下,該參數被視為私有參數 (Private Parameter)。(參考下面範例二)
- 也可以使用 ~param 語法在一組節點上設置私有參數。這些在相同範圍內(即在同一個 group 或 ns 標籤中)的 <node> 標籤,該參數將被設置為這些節點的區域參數 (Local Parameter)。
- 這些參數將在啟動任何節點之前就先設定到 Parameter Server 上。
實例說明
下面舉一些例子來做說明。我們在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。
範例一:
此範例使用 <param> 標籤建立了一個 Parameter Server 中的參數,參數名稱為 myparam,並且將其值設定為 "Hello World!"。並且,透過 <node> 標籤啟動 Python 撰寫的節點,以讀取該參數,並在螢幕上顯示其參數值。
-- param1.launch
<launch> <param name="myparam" value="Hello World!" /> <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 mypackage param1.launch 之後,可以看見螢幕顯示 Hello World!,表示 <param> 標籤設定的參數可被節點讀取。另外,使用 rosparam list 指令可以看到設置的參數為 /myparam,使用 rosparam get /myparam 指令可以查看參數值為 "Hello World!"。
範例二:
此範例將 <param> 標籤放到 <node> 標籤內,該參數將會被設置為私有參數 (Private Parameter)。
-- param2.launch
<launch> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen"> <param name="myparam" value="Hello World!" /> </node> </launch> |
執行 roslaunch mypackage param2.launch 之後,會看到無法讀取 myparam 參數而報錯。因為節點讀取的參數為 /myparam,我們設定的參數被設置為私有參數,變成 /checkparam/myparam,所以節點會讀取不到而報錯。
只要將 checkparam.py 中的 rospy.get_param('myparam'),改為 rospy.get_param('/checkparam/myparam') 或 rospy.get_param('~myparam') 就可以讀取了。
範例三:
此範例將參數值儲存在 param.txt 文檔中,然後在 textfile 屬性中使用該文檔來設定參數值。
-- param3.launch
<launch> <param name="myparam" textfile="$(find mypackage)/launch/param.txt" /> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
-- param.txt
Parameter in a file. |
執行 roslaunch mypackage param3.launch 之後,可以看見螢幕顯示 Parameter in a file,表示可以成功使用文檔來設定參數值。也可以使用 rosparam list 和 rosparam get 來確認參數。
範例四:
此範例使用指令的輸出來做為參數值。
-- param4.launch
<launch> <param name="myparam" command="date" /> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
執行 roslaunch mypackage param4.launch 之後,可以看見螢幕顯示 Thu Oct 29 18:03:02 CST 2020。這是 date 指令輸出的日期、時間,此日期、時間被設定為 myparam 的參數值。表示可以成功使用指令的輸出來設定參數。
參考資料
- roslaunch: <param> tag
沒有留言:
張貼留言