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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【ROS】—— ROS通信机制——参数服务器(四)

發布時間:2024/1/18 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 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方式一致。

#include "ros/ros.h" /* 實現參數的查詢實現:ros::NodeHandleparam(鍵,默認值) 存在,返回對應結果,否則返回默認值getParam(鍵,存儲結果的變量)存在,返回 true,且將值賦值給參數2若果鍵不存在,那么返回值為 false,且不為參數2賦值getParamCached鍵,存儲結果的變量)--提高變量獲取效率存在,返回 true,且將值賦值給參數2若果鍵不存在,那么返回值為 false,且不為參數2賦值getParamNames(std::vector<std::string>)獲取所有的鍵,并存儲在參數 vector 中 hasParam(鍵)是否包含某個鍵,存在返回 true,否則返回 falsesearchParam(參數1,參數2)搜索鍵,參數1是被搜索的鍵,參數2存儲搜索結果的變量ros::param ----- 與 NodeHandle 類似*/ int main(int argc, char *argv[]) {setlocale(LC_ALL,"");//初始化ros節點ros::init(argc,argv,"get_param");//創建ROS節點句柄ros::NodeHandle nh;//param(鍵,默認值) double radius = nh.param("radius",0.5);ROS_INFO("查詢結果為: radius=%lf",radius);// getParam(鍵,存儲結果的變量)double radius2 = 0.0;bool result1 = nh.getParam("radius",radius2);if(result1){ROS_INFO("查詢變量為:%0.2f",radius2);}else{ROS_INFO("結果不存在");}//getParamCached鍵,存儲結果的變量)--提高變量獲取效率double radius3= 0.0;bool result2 = nh.getParamCached("radius1",radius3);if(result2){ROS_INFO("查詢變量為:%0.3f",radius3);}else{ROS_INFO("結果不存在");}// getParamNames(std::vector<std::string>) std::vector<std::string> names;nh.getParamNames(names);for(auto &&name : names){ROS_INFO("遍歷的元素:%s",name.c_str());}//hasParam(鍵)bool flag1 = nh.hasParam("radius");bool flag2 = nh.hasParam("");ROS_INFO("查詢的元素是否存在:%d",flag1);ROS_INFO("查詢的元素是否存在:%d",flag2);//searchParam(參數1,參數2)std::string key;nh.searchParam("raduis",key);ROS_INFO("搜尋到的結果為:%s",key.c_str());nh.searchParam("radius",key);ROS_INFO("搜尋到的結果為:%s",key.c_str());//ros::paramdouble radius_param = ros::param::param("radius",10);ROS_INFO("結果為:%lf",radius_param);return 0; }

2.4 參數的刪除

ros::NodeHandle
deleteParam(“鍵”)
根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 false

ros::param
del(“鍵”)
根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 false

#include "ros/ros.h"/* 參數服務器操作之刪除_C++實現:ros::NodeHandledeleteParam("鍵")根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 falseros::paramdel("鍵")根據鍵刪除參數,刪除成功,返回 true,否則(參數不存在),返回 false*/ int main(int argc, char *argv[]) {setlocale(LC_ALL,"");//初始化ros節點ros::init(argc,argv,"get_param");//創建ROS節點句柄ros::NodeHandle nh; // ros::NodeHandlebool flag1 = nh.deleteParam("radius");if(flag1){ROS_INFO("刪除成功");}else{ROS_INFO("刪除失敗");}//ros::parambool flag2 =ros::param::del("radius");if(flag2){ROS_INFO("刪除2成功");}else{ROS_INFO("刪除2失敗");}return 0; }

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通信机制——参数服务器(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。