rosparam和ROS参数服务器的使用(C++ Python)
1. Prob.
在一個(gè)項(xiàng)目里經(jīng)常會(huì)處理很多不同的參數(shù),同時(shí)有很多參數(shù)是共用的,每個(gè)節(jié)點(diǎn)都分別定義的話,某一次修改容易造成不同步的問(wèn)題。為了方便統(tǒng)一和同步,可以使用ROS的參數(shù)服務(wù)器來(lái)完成上述的事情,即通過(guò)rosparam把我們的參數(shù)列表加載到ROS參數(shù)服務(wù)器上,然后所有的ROS節(jié)點(diǎn)都可以讀取和修改其中的參數(shù),非常方便。
2. Method
rosparam的命令可以在terminal中使用,也可以在代碼中使用,在這里測(cè)試了C++和python的代碼,可行!
1)先說(shuō)第一點(diǎn),在terminal中使用的指令:
Commands:rosparam set set parameter 設(shè)置參數(shù)rosparam get get parameter 獲得指定名的參數(shù)值rosparam load load parameters from file 從文件中加載參數(shù)到參數(shù)服務(wù)器rosparam dump dump parameters to file 將參數(shù)服務(wù)器中的參數(shù)寫入到文件rosparam delete delete parameter 從參數(shù)服務(wù)器中刪除參數(shù)rosparam list list parameter names 列出參數(shù)服務(wù)器中的參數(shù)以上也可以通過(guò)使用rosparam -h獲得。
2)C++中使用
主要記錄如何從yaml文件中讀取參數(shù),然后在代碼如何通過(guò)參數(shù)服務(wù)器獲得這些代碼以及修改或刪除
① 首先寫一個(gè)yaml文件,先建一個(gè)以params.yaml命名的文件,然后寫下如下參數(shù):
delta_t: 0.2 init_ang1: 0.08726646111111111 point_path: "/home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt"② 在launch文件中加入下面這句,加載這個(gè)yaml文件
<rosparam command="load" file="$(find gazebo_mobile_manipulator)/config/params.yaml" />上面的file參數(shù)就是對(duì)應(yīng)的路徑,改成自己文件的保存路徑即可
③ 代碼中如何獲取,修改和刪除這些參數(shù)服務(wù)器中的參數(shù),先上代碼:
輸出:
joint1: 0.087266 joint1: 2.500000 joint4: 1.570000 joint4 was deleted! point: /home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt關(guān)鍵函數(shù)說(shuō)明:
nh.getParam("/init_ang1",joint1); : 這句調(diào)用的getParam()函數(shù)從參數(shù)服務(wù)器中獲取指定名的參數(shù),如果成功,變量joint1的值就變成參數(shù)服務(wù)器中保存的數(shù)值,并且函數(shù)會(huì)返回true;如果不成功(如參數(shù)服務(wù)器沒有這個(gè)參數(shù)),變量joint1維持原值,函數(shù)會(huì)返回false。可以加一個(gè)返回值判斷來(lái)是否成功獲取數(shù)值。
nh.setParam("init_ang1", 2.5);: 這句調(diào)用的setParam()函數(shù)可以修改或建立一個(gè)指定名的參數(shù),很好用,如果參數(shù)服務(wù)器中已經(jīng)有對(duì)應(yīng)名稱的參數(shù)就會(huì)進(jìn)行修改,沒有就創(chuàng)建一個(gè)新的。但是記住,修改完后,要重新讀取一遍才會(huì)update已經(jīng)獲取的參數(shù),即再run一次nh.getParam("/init_ang1",joint1);
nh.deleteParam("init_ang4");: 這句調(diào)用的deleteParam()函數(shù)可以從參數(shù)服務(wù)器中刪除一個(gè)指定名的參數(shù),如果在刪除了這個(gè)參數(shù)之后再重新讀這個(gè)參數(shù),getParam()會(huì)返回false,然后參數(shù)保持原來(lái)的數(shù)值。
3)Python中使用
根C++版本的一樣,主要記錄如何從yaml文件中讀取參數(shù),然后在代碼如何通過(guò)參數(shù)服務(wù)器獲得這些代碼以及修改或刪除
① 首先寫一個(gè)yaml文件,先建一個(gè)以params.yaml命名的文件,然后寫下如下參數(shù):
delta_t: 0.2 init_ang1: 0.08726646111111111 point_path: "/home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt"② 在launch文件中加入下面這句,加載這個(gè)yaml文件
<rosparam command="load" file="$(find gazebo_mobile_manipulator)/config/params.yaml" />上面的file參數(shù)就是對(duì)應(yīng)的路徑,改成自己文件的保存路徑即可
③ 代碼中如何獲取,修改和刪除這些參數(shù)服務(wù)器中的參數(shù),先上代碼:
輸出:
[INFO] [1644648822.089715]: joint1 = 0.087266 [INFO] [1644648822.091329]: joint1 = 2.500000 [INFO] [1644648822.091718]: joint4 = 1.570000 [INFO] [1644648822.092529]: joint4 was deleted![INFO] [1644648822.093152]: point_path = /home/will/25_ws/src/gazebo_mobile_manipulator/data/selected_painting.txt關(guān)鍵函數(shù)說(shuō)明:
joint1 = rospy.get_param("/init_ang1"): 這里使用get_param()獲取指定名的參數(shù),跟c++差不多;
rospy.set_param('init_ang1',2.5): 使用set_param()設(shè)置指定名的參數(shù),用法跟c++一樣,有就修改,沒有就創(chuàng)建一個(gè);
rospy.delete_param('/init_ang4'): 使用delete_param()刪除指定名的參數(shù);
rospy.has_param("/init_ang4"):使用has_param()檢查參數(shù)服務(wù)器中是否有這個(gè)名稱的參數(shù),有就返回True,沒有就返回False,這點(diǎn)跟C++有所不同,在C++中可以直接使用get_param()來(lái)判斷,但是在python中需要使用has_param()做判斷。
Reference
總結(jié)
以上是生活随笔為你收集整理的rosparam和ROS参数服务器的使用(C++ Python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: rosparam和ROS参数服务
- 下一篇: C++编程原则2 tcy