2020年10月29日 星期四

[ROS] roslaunch: <param> 標籤的用法

我們常常會在 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 字符轉義的要求,應該使用單引號將檔案參數框起來。(參考下面範例四)

 

補充說明:

 

  1. 可以將 <param> 標籤放在 <node> 標籤內,在這種情況下,該參數被視為私有參數 (Private Parameter)(參考下面範例二)

 

  1. 也可以使用 ~param 語法在一組節點上設置私有參數。這些在相同範圍內(即在同一個 group ns 標籤中)的 <node> 標籤,該參數將被設置為這些節點的區域參數 (Local Parameter)

 

  1. 這些參數將在啟動任何節點之前就先設定到 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

http://wiki.ros.org/roslaunch/XML/param

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *