五、参数服务器原理,代码实现

五、参数服务器原理,代码实现,第1张

文章目录
  • 1、参数服务器理论模型
  • 2、代码实现
    • 1.C++
    • 2.Python

1、参数服务器理论模型

参数服务器类似于一个数据容器,用于多节点之间的数据共享,流程如下:

  1. Talker通过RPC协议向参数服务器发送参数名和参数值,ROS Master将参数保存到参数列表中
  2. Listener通过RPC向参数服务器请求数据,包含查找的参数名
  3. ROS Master通过RPC向Listener返回查询结果

数据类型:

* 32-bit integers

* booleans

* strings

* doubles

* iso8601 dates

* lists

* base64-encoded binary data

* 字典
2、代码实现 1.C++

在C++中,有两套API可以完成相同的功能

  • ros::NodeHandle;
  • ros::param;
  1. 增与改
    /*
    参数服务器的新增与修改使用的是相同的函数,共有两套API实现参数 *** 作:
    ros::NodeHandle()
    ros::param()
    */
    #include"ros/ros.h"
    
    int main(int argc, char *argv[]){
        setlocale(LC_ALL,"");
        ros::init(argc,argv,"set_param");
        /*
        vector声明格式:
            vector<数据格式> 名字
        本次声明均使用std命名空间下的元素
        */
        std::vector<std::string> stus;
        //向vector容器中写入参数
        stus.push_back("张三");
        stus.push_back("李四");
        stus.push_back("王五");
        //创建一个map键值对容器
        std::map<std::string,std::string> friends;
        friends["郭"] = "阳";
        friends["李"] = "明";
        
        //NodeHandle---------------------------------
        //setParam(参数名,参数值)
        ros::NodeHandle nh;
        nh.setParam("nh_int",10);
        nh.setParam("nh_double",3.14);
        nh.setParam("nh_bool",true);
        nh.setParam("nh_string","xiaomage");
        nh.setParam("nh_vector",stus);
        nh.setParam("nh_map",friends);
        //修改参数值,采用覆盖的方式
        nh.setParam("nh_int",1000);
        ros::param::set("nh_int_param",99);
        return 0;
    }
    
  2. #include"ros/ros.h"
    
    int main(int argc, char *argv[]){
        setlocale(LC_ALL,"");
        ros::init(argc,argv,"get_param");
        //NodeHandle----------------------------------------------
        ros::NodeHandle nh;
    
        //param(键,默认值):
        //键存在,返回结果,不存在,返回默认结果
        int rest1 = nh.param("nh_int",101);
        int rest2 = nh.param("nh_int_no",1000);
    
        //getParam(键,存储结果的变量):
        //存在,返回true,并将结果赋值给参数2,否则,返回false,不给参数2赋值
        int nh_int_value;
        double nh_double_value;
        bool nh_bool_value;
        std::string nh_string_value;
        std::vector<std::string> stus;
        std::map<std::string,std::string> friends;
        nh.getParam("nh_int",nh_int_value);
        nh.getParam("nh_double",nh_double_value);
        nh.getParam("nh_bool",nh_bool_value);
        nh.getParam("nh_string",nh_string_value);
        nh.getParam("nh_vector",stus);
        nh.getParam("nh_map",friends);
        //c_str():返回一个指向c字符串的指针,输出的是相应的值
        ROS_INFO("获取的结果:%d,%.2f,%s,%d",
                            nh_int_value,
                            nh_double_value,
                            nh_string_value.c_str(),
                            nh_bool_value);
        //输出stus中的元素
        for(auto &&stu : stus){
            ROS_INFO("stus元素:%s",stu.c_str());
        }
        //输出friends中的键值对
        for(auto &&f : friends){
            ROS_INFO("map元素:%s = %s",f.first.c_str(),f.second.c_str());
        }
    
        //getParamCached(键,存储结果的变量):
        //类似于getParam,不过,速度更快
        ros::param::getCached("param_int",nh_int_value);
        ROS_INFO("通过缓存获取的数据:%d",nh_int_value);
        
        //param------------------------------------------
        //getParamNames(std::vector):
        //获取所有键,并存储在参数vector中
        std::vector<std::string> param_names2;
        ros::param::getParamNames(param_names2);
        for (auto &&name : param_names2){
            ROS_INFO("名称解析name = %s",name.c_str());
        }
        //hasParam(键):
        //是否包含某个键,包含返回true,否则,返回false
        ROS_INFO("存在param_int吗:%d",ros::param::has("nh_int"));
        //serchParam(参数1,参数2):
        //参数1:被搜索的键     参数2:存储搜索的结果
        //存在则返回 /变量名,否则参数2没有值
        std::string key;
        ros::param::search("nh_int",key);
        ROS_INFO("搜索到的结果:%s",key.c_str());
        return 0;
    }
    
  3. #include"ros/ros.h"
    
    int main(int argc, char *argv[]){
        setlocale(LC_ALL,"");
        ros::init(argc,argv,"delet_param");
    
        //NodeHandle-----------------------
        //deleteParam("键"):成功返回true,否则返回false
        ros::NodeHandle nh;
        bool r1 = nh.deleteParam("nh_int");
        ROS_INFO("删除结果:%d",r1);
    
        //param-----------------------------------
        //del("键"):成功返回true,否则返回false
        bool r2 = ros::param::del("param_int");
        ROS_INFO("删除结果:%d",r2);
    
        return 0;
    }
    

常用命令:

  • 获取当前参数列表:rosparam list
  • 获取当前参数值:rosparam get
2.Python
  1. 增与改
    #! /usr/bin/env python
    
    from operator import rshift
    import rospy
    
    if __name__ == "__main__":
        #初始化
        rospy.init_node("param_set_p")
        #增加
        rospy.set_param("p_int",10)
        rospy.set_param("p_double",1.23)
        rospy.set_param("p_bool",True)
        rospy.set_param("p_string","xiaomage")
        rospy.set_param("p_list",["xiao","ma","ge"])
        rospy.set_param("p_dict",{"name":"xiaoma","age":24})
        #修改
        rospy.set_param("p_int",20)
    
  2. #! /usr/bin/env python
    
    import rospy
    
    if __name__ == "__main__":
    
        rospy.init_node("param_get_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_cached
        int_cached = rospy.get_param_cached("p_int")
        rospy.loginfo("缓存数据:%d",int_cached)
    
        # get_param_names
        names = rospy.get_param_names()
        for name in names:
            rospy.loginfo("name = %s",name)
    
        rospy.loginfo("-"*80)
    
        # has_param
        flag = rospy.has_param("p_int")
        rospy.loginfo("包含p_int吗?%d",flag)
    
        # search_param
        key = rospy.search_param("p_int")
        rospy.loginfo("搜索的键 = %s",key)
    
  3. #! /usr/bin/env python
    
    import rospy
    
    if __name__ == "__main__":
        rospy.init_node("param_del_p")
    
        try:
            rospy.delete_param("p_int")
        except Exception as e:
            rospy.loginfo("删除失败")
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1323466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存