在 roslaunch 的標籤中,有兩個標籤可以用來配置 Parameter Server 的參數:<param> 和 <rosparam>。兩者雖然都可以用來配置參數,但是功能上還是有些不同。下面將要介紹 <rosparam> 標籤如何使用,至於 <param> 標籤的使用,可以參考《roslaunch: <param> 標籤的用法》。
標籤說明
- <rosparam>
此標籤用來配置 Parameter Server 中的參數,可以從 YAML 文檔中載入參數,或是將參數傾印到 YAML 文檔,也可以用來設定或刪除參數。有下列屬性可以使用:
command="load|dump|delete" (optional, default=load) : 指定使用哪個 rosparam 指令。
file="$(find pkg-name)/path/foo.yaml" (load or dump commands) : 指定檔案位置,用於 load 或 dump 指令。
param="param-name" (optional) : 指定參數名稱,不能用在 load 或 dump 指令上。
ns="namespace" (optional) : 將參數設置到指定的命名空間 (Namespace) 中。
subst_value="true|false" (optional) : 允許在 YAML 文本中使用 $(…) 等替代參數,例如:$(env ROS_MASTER_URI)。
(參考範例二)
補充說明:
- 可以將 <rosparam> 標籤放在 <node> 標籤內,在這種情況下,該參數被視為私有參數 (Private Parameter)。
- 在執行順序上,rosparam delete 和 dump 指令會比 load 指令優先,也會在任何其他參數上載到 Parameter Server 之前執行。至於 delete 和 dump 指令,則以在文檔中宣告的順序執行。
- rosparam load 指令有附加的作用,也就是如果宣告了一個命名空間,則這些參數將會被添加到該命名空間中。同理,load 指令也可以覆蓋先前宣告的參數。
- 在設置參數時,若使用 YAML 語法宣告一個字典 (dictionary),以此來設定參數的話,則可以省略 param 屬性。(參考範例三)
實例說明
下面舉一些例子來做說明。我們在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。
範例一:
此範例使用 <rosparam> 標籤的 load 指令,從一個 YAML 文檔載入參數。
-- rosparam1.launch
<launch> <rosparam command="load" file="$(find mypackage)/launch/myparam.yaml" /> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
-- myparam.yaml
myparam1: Hello myparam2: World |
-- 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 rosparam1.launch 之後,可以看見螢幕分兩行顯示 Hello World。
範例二:
此範例使用 <rosparam> 標籤設定單一參數,其中第二個 <rosparam> 標籤使用 $(env ROS_DISTRO) 替代參數的方式,取得 ROS_DISTRO 環境變數值來做為設定。
-- rosparam2.launch
<launch> <rosparam param="myparam1">Hello</rosparam> <rosparam param="myparam2" subst_value="true">$(env ROS_DISTRO)</rosparam> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
範例三:
此範例使用 <rosparam> 標籤一次設定多個參數,使用 YAML 語法宣告一個字典的方式來定義參數。
-- rosparam3.launch
<launch> <rosparam> myparam1: Hello myparam2: World </rosparam> <node pkg="mypackage" type="checkparam.py" name="checkparam" output="screen" /> </launch> |
參考資料
- roslaunch: <rosparam> tag
http://wiki.ros.org/roslaunch/XML/rosparam
沒有留言:
張貼留言