【ROS】—— ROS通信机制——参数服务器(四)
文章目錄
- 前言
- 1. 參數服務器理論模型
- 2. 參數操作(C++)
- 2.1 增加參數
- 2.2 參數修改
- 2.3 參數的獲取
- 2.3.1 ros::NodeHandle
- 2.3.2 ros::param
- 2.4 參數的刪除
- 3. 參數操作(python)
- 3.1 增加參數與修改參數
- 3.2 獲取參數
- 3.3 刪除參數
前言
📢本系列將依托趙虛左老師的ROS課程,寫下自己的一些心得與筆記。
📢課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ
📢講義鏈接:http://www.autolabor.com.cn/book/ROSTutorials/index.html
📢 文章可能存在疏漏的地方,懇請大家指出。
參數服務器在ROS中主要用于實現不同節點之間的數據共享。參數服務器相當于是獨立于所有節點的一個公共容器,可以將數據存儲在該容器中,被不同的節點調用,當然不同的節點也可以往其中存儲數據。
概念
以共享的方式實現不同節點之間數據交互的通信模式。
作用
存儲一些多節點共享的數據,類似于全局變量。
1. 參數服務器理論模型
參數服務器實現是最為簡單的,該模型如下圖所示,該模型中涉及到三個角色:
- ROS Master (管理者)
- Talker (參數設置者)
- Listener (參數調用者)
ROS Master 作為一個公共容器保存參數,Talker 可以向容器中設置參數,Listener 可以獲取參數。
整個流程由以下步驟實現:
1.Talker 設置參數
Talker 通過 RPC 向參數服務器發送參數(包括參數名與參數值),ROS Master 將參數保存到參數列表中。
2.Listener 獲取參數
Listener 通過 RPC 向參數服務器發送參數查找請求,請求中包含要查找的參數名。
3.ROS Master 向 Listener 發送參數值
ROS Master 根據步驟2請求提供的參數名查找參數值,并將查詢結果通過 RPC 發送給 Listener。
參數可使用數據類型:
- 32-bit integers
- booleans
- strings
- doubles
- iso8601 dates
- lists
- base64-encoded binary data
- 字典
2. 參數操作(C++)
在 C++ 中實現參數服務器數據的增刪改查,可以通過兩套 API 實現:
- ros::NodeHandle
- ros::param
2.1 增加參數
#include "ros/ros.h" /* 實現參數的新增與修改需求:首先設置機器人的共享參數、類型、半徑(0.15m)實現:ros::NodeHandlesetParam()ros::paramset()*/int main(int argc, char *argv[]) {//初始化ros節點ros::init(argc,argv,"set_param");//創建ROS節點句柄ros::NodeHandle nh;//參數增//方案1:nhnh.setParam("type","silun");nh.setParam("radius",0.15);//方案2:ros::paramros::param::set("type_param","silun");ros::param::set("radius_param",0.15);//參數改return 0; }配置完后,運行如下
使用rosparam list可以查看參數是否已經設置進入參數服務器
使用rosparam get 參數名可以查看所設置的參數值。
2.2 參數修改
#include "ros/ros.h" /* 實現參數的新增與修改需求:首先設置機器人的共享參數、類型、半徑(0.15m)實現:ros::NodeHandlesetParam()ros::paramset()*/int main(int argc, char *argv[]) {//初始化ros節點ros::init(argc,argv,"set_param");//創建ROS節點句柄ros::NodeHandle nh;//參數增//方案1:nhnh.setParam("type","silun");nh.setParam("radius",0.15);//方案2:ros::paramros::param::set("type_param","silun");ros::param::set("radius_param",0.15);//參數改//方案1:nhnh.setParam("radius",0.20);//方案2:ros::paramros::param::set("radius_param",0.25);return 0; }重新rosrun后,再查看參數:
參數的修改其實是一個參數覆蓋的過程。
2.3 參數的獲取
2.3.1 ros::NodeHandle
param(鍵,默認值)
存在,返回對應結果,否則返回默認值
getParam(鍵,存儲結果的變量)
存在,返回 true,且將值賦值給參數2
若果鍵不存在,那么返回值為 false,且不為參數2賦值
getParamCached(鍵,存儲結果的變量)–提高變量獲取效率
存在,返回 true,且將值賦值給參數2
若果鍵不存在,那么返回值為 false,且不為參數2賦值
會判斷之前是否已經查詢過參數,若查詢過,直接從本地返回。是底層性能上的提升。一般情況下看不出來
getParamNames(std::vector<std::string>)
獲取所有的鍵,并存儲在參數 vector 中
hasParam(鍵)
是否包含某個鍵,存在返回 true,否則返回 false
searchParam(參數1,參數2)
搜索鍵,參數1是被搜索的鍵,參數2存儲搜索結果的變量
2.3.2 ros::param
ros::param基本與nodehandle方式一致。
2.4 參數的刪除
ros::NodeHandle
deleteParam(“鍵”)
根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 false
ros::param
del(“鍵”)
根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 false
3. 參數操作(python)
3.1 增加參數與修改參數
#! /usr/bin/env python #-- coding:UTF-8 --"""參數服務器操作之新增與修改(二者API一樣)_Python實現: """import rospyif __name__ == "__main__":rospy.init_node("set_update_paramter_p")# 設置各種類型參數rospy.set_param("p_int",10)rospy.set_param("p_double",3.14)rospy.set_param("p_bool",True)rospy.set_param("p_string","hello python")rospy.set_param("p_list",["hello","haha","xixi"])rospy.set_param("p_dict",{"name":"hulu","age":8})# 修改rospy.set_param("p_int",100)3.2 獲取參數
#! /usr/bin/env python #-- coding:UTF-8 -- """參數服務器操作之查詢_Python實現: get_param(鍵,默認值)當鍵存在時,返回對應的值,如果不存在返回默認值get_param_cachedget_param_nameshas_paramsearch_param """import rospyif __name__ == "__main__":rospy.init_node("get_param_p")#獲取參數int_value = rospy.get_param("p_int",10000)double_value = rospy.get_param("p_double")bool_value = rospy.get_param("p_bool")string_value = rospy.get_param("p_string")p_list = rospy.get_param("p_list")p_dict = rospy.get_param("p_dict")rospy.loginfo("獲取的數據:%d,%.2f,%d,%s",int_value,double_value,bool_value,string_value)for ele in p_list:rospy.loginfo("ele = %s", ele)rospy.loginfo("name = %s, age = %d",p_dict["name"],p_dict["age"])# get_param_cachedint_cached = rospy.get_param_cached("p_int")rospy.loginfo("緩存數據:%d",int_cached)# get_param_namesnames = rospy.get_param_names()for name in names:rospy.loginfo("name = %s",name)rospy.loginfo("-"*80)# has_paramflag = rospy.has_param("p_int")rospy.loginfo("包含p_int嗎?%d",flag)# search_paramkey = rospy.search_param("p_int")rospy.loginfo("搜索的鍵 = %s",key)3.3 刪除參數
#! /usr/bin/env python #-- coding:UTF-8 -- """參數服務器操作之刪除_Python實現:rospy.delete_param("鍵")鍵存在時,可以刪除成功,鍵不存在時,會拋出異常 """ import rospyif __name__ == "__main__":rospy.init_node("delete_param_p")try:rospy.delete_param("p_int")except Exception as e:rospy.loginfo("刪除失敗")/p_int 被刪除
總結
以上是生活随笔為你收集整理的【ROS】—— ROS通信机制——参数服务器(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真无线蓝牙耳机选购小知识,全网口碑前五的
- 下一篇: 三十三、Java图形化界面设计——布局管