ROS学习之参数
ROS學(xué)習(xí)之參數(shù)
??????? 除 了 前 面 介 紹 過 的 消 息 傳 遞 , ROS 還 提 供 另 一 種 參 數(shù)( parameters )機(jī)制用于獲取節(jié)點(diǎn)的信息。其主要思想是使用集中參數(shù)服務(wù)器( parameter server )維護(hù)一個(gè)變量集的值,包括整數(shù)、浮點(diǎn)數(shù)、字符串以及其他數(shù)據(jù)類型,每一個(gè)變量用一個(gè)較短的字符串標(biāo)識(shí)? 。由于允許節(jié)點(diǎn)主動(dòng)查詢其感興趣的參數(shù)的值,它們適用于配置那些不會(huì)隨時(shí)間頻繁變更的信息。
0.1命令行指令
0.1.1參數(shù)列表
rosparam list 顯示當(dāng)前所有參數(shù)
??? 注意:在當(dāng)前版本的 ROS 中,參數(shù)服務(wù)器是節(jié)點(diǎn)管理器的一部分,因此,它總是通過 roscore 或者 roslaunch 自動(dòng)啟動(dòng)。在所有情況下,參數(shù)服務(wù)器都能在后臺(tái)正常工作,因此沒有必要去花心思考慮它。然而,需要銘記的是,所有的參數(shù)都屬于參數(shù)服務(wù)器而不是任何特定的節(jié)點(diǎn)。這意味著參數(shù)——即使是由節(jié)點(diǎn)創(chuàng)建的——在節(jié)點(diǎn)終止時(shí)仍將繼續(xù)存在。
0.1.2查詢參數(shù)
rosparam get parameter_name? 查詢某個(gè)參數(shù)值
??? 例如,如下命令將讀取參數(shù)/rosdistro 的值:
rosparam get /rosdistro
??? 其輸出為字符串 indigo,這并不奇怪(譯者注:rosdistro 指ROS 的版本,如果讀者使用其他的發(fā)行版,將產(chǎn)生不同的輸出)。
0.1.3設(shè)置參數(shù)
rosparam set parameter_name parameter_value
??? 該命令可以修改已有參數(shù)的值或者創(chuàng)建一個(gè)新的參數(shù)。例如,以下命令可以創(chuàng)建一系列字符串參數(shù),用以存儲(chǔ)一組卡通鴨子的顏色偏好:
rosparam set /duck_colors/huey red
rosparam set /duck_colors/dewey blue
rosparam set /duck_colors/louie green
rosparam set /duck_colors/webby pink
???? 另外,我們可以同時(shí)設(shè)置同一命名空間中的幾個(gè)參數(shù):
rosparam set namespace values
???? 這里要以 YAML 字典的形式表示參數(shù)和對應(yīng)值的映射關(guān)系。
???? 下面的例子和前面四行命令具有同樣的作用:
rosparam set /duck_colors "huey: red
dewey: blue
louie: green
webby: pink"
???? 需要注意的是,這種語法需要在命令中使用換行符。當(dāng)然,這并不會(huì)造成什么問題,因?yàn)榈谝粋€(gè)引號(hào)告訴 bash 命令尚未完成。當(dāng)在引號(hào)內(nèi)按下回車時(shí),終端將插入一個(gè)換行符而不是執(zhí)行命令。
0.1.4創(chuàng)建和加載參數(shù)文件
????? 為了以 YAML 文件的形式存儲(chǔ)命名空間中的所有參數(shù),可以使用 rosparam dump 命令:
rosparam dump filename namespace
????? 與 dump 相反的命令是 load,它從一個(gè)文件中讀取參數(shù),并將它們添加到參數(shù)服務(wù)器:
rosparam load filename namespace
0.2用C++獲取參數(shù)
??? 使用ROS參數(shù)的C++接口是相當(dāng)簡單的:
void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
??? 在這兩種情況下,參數(shù)名是一個(gè)字符串,它可以是全局的、相對的或者是私有的。set 函數(shù)中的輸入值 input_value 可以是std::string、bool、int 或 double 類型;get 函數(shù)的輸出值應(yīng)該是上述某個(gè)類型的變量(通過引用傳遞)。如果參數(shù)值讀取成功,則get 函數(shù)返回 true;如果出現(xiàn)了問題,通常表示所請求的參數(shù)還沒有被指定一個(gè)值,則該函數(shù)返回 false。舉例如下:
以上為設(shè)置我們的背景顏色參數(shù)。
const std::string PARAM_NAME = "~max_vel" ; double maxVel ; bool ok = ros::param::get (PARAM_NAME, maxVel) ;?以上為讀取“~max_vel”參數(shù)值,并存儲(chǔ)到本地變量maxvel中。
?
0.3在啟動(dòng)文件中設(shè)置參數(shù)
0.3.1設(shè)置參數(shù)
???可以使用param元素請求roslaunch設(shè)置參數(shù)值 :<param name="param-name" value="param-value" />這個(gè)元素,正如你所猜測的,將給定的值賦給給定名稱的參數(shù)。通常,這個(gè)參數(shù)名是相對的。例如,下面的啟動(dòng)文件片段相當(dāng)于第 129 頁的 rosparam 命令集:
<group ns="duck_colors">
<param name="huey" value="red" />
0.3.2私有參數(shù)
設(shè)置私有參數(shù) 另一個(gè)可選方法是在節(jié)點(diǎn)元素中包含 param 元素。
<node . . . >
<param name="param-name" value="param-value" />
. . .
</node>
在該結(jié)構(gòu)下,參數(shù)名將被當(dāng)做該節(jié)點(diǎn)的私有名稱。
0.3.3在文件中讀取參數(shù)
??? 最后,啟動(dòng)文件也支持 與rosparam load等價(jià)的命令,可以一次性從文件中加載多個(gè)參數(shù) 7 :
<rosparam command="load" file="path-to-param-file" />
??? 這里列出的參數(shù)文件通常是通過 rosparam dump 命令創(chuàng)建的。與其他特定文件的引用相同(例如 6.5.1 節(jié)的 include 元素),使用查找替換來指定功能包的相對路徑是常見做法:
<rosparam
file="$(find package-name)/param-file"
/>
與 rosparam load 一樣,這個(gè)功能有助于測試,因?yàn)樗试S用
戶重現(xiàn)在過去的某個(gè)時(shí)間有效的參數(shù)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/flyingjun/p/8856981.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
- 上一篇: 【编程语言】Java基础进阶——面向对象
- 下一篇: OSI协议和TCP/IP协议笔记