日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

rosparam和ROS参数服务器的使用(C++ Python)

發(fā)布時(shí)間:2024/1/18 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 rosparam和ROS参数服务器的使用(C++ Python) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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ù),先上代碼:

#include <ros/ros.h>int main(int argc, char** argv){ros::init(argc, argv, "read_param");ros::NodeHandle nh;double joint1;nh.getParam("/init_ang1",joint1); //獲取指定名的參數(shù)printf("joint1: %f\n",joint1);nh.setParam("init_ang1", 2.5); //對(duì)指定名的參數(shù)進(jìn)行設(shè)置,若沒有對(duì)應(yīng)的名字就建立一個(gè)對(duì)應(yīng)名字的參數(shù)nh.setParam("init_ang4", 1.57);nh.getParam("/init_ang1",joint1);nh.getParam("/init_ang4",joint4);printf("joint1: %f\n",joint1);printf("joint4: %f\n",joint4);nh.deleteParam("init_ang4"); // 刪除指定名的參數(shù)if (nh.getParam("/init_ang4",joint4)==false)printf("joint4 was deleted!\n");std::string point_pth; nh.getParam("/point_path",point_pth);printf("point: %s\n",point_pth.c_str()); //注意如果要printf字符串,要加上.c_str(),不然出亂碼}

輸出:

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ù),先上代碼:

#!/usr/bin/env python # coding:utf-8import rospydef param_demo():rospy.init_node("read_param")joint1 = rospy.get_param("/init_ang1") # 獲取指定名的參數(shù)rospy.loginfo('joint1 = %f', joint1)rospy.set_param('init_ang1',2.5) # 設(shè)置參數(shù)rospy.set_param('init_ang4',1.57)joint1 = rospy.get_param("/init_ang1")joint4 = rospy.get_param("/init_ang4")rospy.loginfo('joint1 = %f', joint1)rospy.loginfo('joint4 = %f', joint4)rospy.delete_param('/init_ang4') # 刪除參數(shù)if(rospy.has_param("/init_ang4")==False): # 檢查參數(shù)是否存在rospy.loginfo('joint4 was deleted!\n')point_pth = rospy.get_param("/point_path")rospy.loginfo('point_path = %s', point_pth)if __name__=="__main__":param_demo()

輸出:

[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

  • rosparam和ROS參數(shù)服務(wù)
  • 【ROS學(xué)習(xí)】ROS param 的使用
  • 總結(jié)

    以上是生活随笔為你收集整理的rosparam和ROS参数服务器的使用(C++ Python)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。