Bootstrap

ROS参数服务器增删改查实操C++

ROS通信机制包括话题通信、服务通信和参数服务器三种通信方式,各原理及代码实现如下表

在这里插入图片描述

功能博客链接说明
VScode配置 ROS 环境VScode创建ROS项目 ROS集成开发环境使用VScode使用配置了ROS开发环境,实现ROS开发的第一步
话题通信理论ROS话题通信流程理论介绍了话题通信机制的原理
ROS话题通信机制实操C++ROS话题通信机制实操C++手把手的用C++实现了话题通信机制
ROS话题通信机制实操PythonROS话题通信机制实操Python手把手的用Python实现了话题通信机制
ROS话题通信流程自定义msg格式ROS话题通信流程自定义msg格式介绍了如何准备话题通信机制自定义msg数据格式,及相关配置
ROS话题通信机制自定义msg实战C++ROS话题通信机制自定义msg实战C++手把手的用C++实现了话题通信机制自定义msg数据通信
ROS话题通信机制自定义msg实战PythonROS话题通信机制自定义msg实战Python手把手的用Python实现了话题通信机制自定义msg数据通信
服务通信理论ROS服务通信流程理论介绍了服务通信机制的原理
ROS服务通信自定义srvROS服务通信自定义srv介绍了如何准备服务通信机制自定义srv数据格式,及相关配置
ROS服务通信机制实操C++ROS服务通信机制实操C++手把手的用C++实现了服务通信机制
ROS服务通信机制实操PythonROS服务通信机制实操Python手把手的用Python实现了话题通信机制
参数服务器理论ROS参数服务器理论模型介绍了参数服务器的原理
ROS参数服务器增删改查实操C++ROS参数服务器增删改查实操C++用 C++ 实现了参数服务器的的增删改查操作
ROS参数服务器增删改查实操PythonROS参数服务器增删改查实操Python用 Python 实现了参数服务器的的增删改查操作

在 C++ 中实现参数服务器数据的增删改查,可以通过两套 API 实现:

  • ros::NodeHandle

  • ros::param

创建功能包

  • 选定 src 右击 —> create catkin package
    在这里插入图片描述

  • 创建一个 pluming_param_server 功能包

    在这里插入图片描述

  • 使用 roscpp rospy std_msgs 作为依赖库

    在这里插入图片描述

  • 编辑配置文件
    修改 plumbing_param_server 功能包下的CMakeLists.txt,找到add_executable和target_link_libraries,修改成如图所示:

    在这里插入图片描述

参数服务器新增(修改)参数

  • 新增方法,调用API,设置的格式

    • ros::NodeHandle

      ros::NodeHandle nh;
      nh.setParam("键",); //整型
      
    • ros::param

      ros::param::set("键","值");
      
  • 代码实现

    #include "ros/ros.h"
    
    /*
        参数服务器操作之新增与修改(二者API一样)_C++实现:
        在 roscpp 中提供了两套 API 实现参数操作
        ros::NodeHandle
            setParam("键",值)
        ros::param
            set("键","值")
    
        示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数
            修改(相同的键,不同的值)
    
    */
    
    
    int main(int argc, char *argv[])
    {
        setlocale(LC_ALL, ""); // 设置中文输出
        ros::init(argc, argv, "set_param_c");
        
        std::vector<std::string> stus;
        stus.push_back("lishi");
        stus.push_back("zhf");
    
        std::map<std::string,std::string> friends;
        friends["zeng"] = "hua";
        friends["li"] = "cui";
    
        // ---------------------------NodeHandle--------------------------
    
        ros::NodeHandle nh;
    
        nh.setParam("nh_int",10); //整型
        nh.setParam("nh_double",3.14); //浮点型
        nh.setParam("nh_bool",true); //bool
        nh.setParam("nh_string","hello NodeHandle"); //字符串
        nh.setParam("nh_vector",stus); // vector
        nh.setParam("nh_map",friends); // map
    
        //修改演示(相同的键,不同的值)
        nh.setParam("nh_int",10000);
    
        
    
        // ---------------------------param-------------------------------
    
        ros::param::set("param_int",20);
        ros::param::set("param_double",3.14);
        ros::param::set("param_string","Hello Param");
        ros::param::set("param_bool",false);
        ros::param::set("param_vector",stus);
        ros::param::set("param_map",friends);
    
        //修改演示(相同的键,不同的值)
        ros::param::set("param_int",20000);
    
        return 0;
    }
    
    
  • 查看设置的参数
    开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行 source ./devel/setup.bash rosrun plumbing_param_server demo_param_set_c ;再开启一个Terminal,运行 rosparam list,查看设置的参数

    在这里插入图片描述

修改参数与新增参数相同,设置不同值就可以

参数服务器获取参数

  • 查看参数

    • ros::NodeHandle

      • param(“键”,“默认值”)
        键存在,返回对应的键的值,否则返回默认值

        ros::NodeHandle nh;
        int res = nh.param("键","默认值"); // 键存在,返回对应的键的值,否则返回默认值
        
      • getParam(“键”, get_param_int)
        如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给get_param_int

        ros::NodeHandle nh;
        int get_param_int
        bool flag = nh.getParam("键", get_param_int); // 如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给get_param_int
        
        if (flag)
        {
        	ROS_INFO("getParam 获取结果:%d", get_param_int);
        }
        else
        {
        	ROS_INFO("查询的变量不存在!!!");
        }
        
      • getParamCached(“键”, get_param_int2)
        是对getParam的优化,提高变量获取效率
        如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给 get_param_int

        ros::NodeHandle nh;
        int get_param_int2
        bool flag = nh.getParamCached("键", get_param_int2); // 如果键存在,则返回true,并将结果赋给get_param_int2;如果键不存在,返回false,并不赋值给get_param_int2
        
        if (flag)
        {
        	ROS_INFO("getParamCached 获取结果:%d", get_param_int2);
        }
        else
        {
        	ROS_INFO("查询的变量不存在!!!");
        }
        
      • getParamNames(name)
        获取服务器种所有的键,存储在参数name中

        std::vector<std::string> names;
        nh.getParamNames(names);  // 获取服务器种所有的键,并存在name中
        for (auto &&name : names)
        {
            ROS_INFO("查询到的键为 %s",name.c_str());        
        }
        
      • hasParam(“键”)
        判断某个键是否存在,存在返回true,不存在返回false

        bool flag = nh.hadParam("键"); // 判断某个键是否存在,存在返回true,不存在返回false
        
        
      • searchParam(“键”,key)
        如果键存在,并将键名赋值给 key;如果键不存在,并不赋值给 key

        std::string key;
        nh.searchParam("nh_int",key);
        ROS_INFO("搜索键:%s", key.c_str());
        
    • ros::param
      与NodeHandle类似

  • 代码实现

    #include "ros/ros.h"
    /*
        参数服务器操作之查询_C++实现:
        在 roscpp 中提供了两套 API 实现参数操作
        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存储搜索结果的变量
    
        ros::param ----- 与 NodeHandle 类似
    */
    
    int main(int argc, char *argv[])
    {
        setlocale(LC_ALL,"");
        ros::init(argc,argv,"get_param");
    
        // ------------------------------------NodeHandle--------------------------
        ros::NodeHandle nh;
        
        // 1.param 函数
        int res1 = nh.param("nh_int",100); // 键存在
        int res2 = nh.param("nh_int2",100); // 键不存在
        ROS_INFO("param获取结果:%d,%d",res1,res2);
    
        // 2.getParam 函数
        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);
    
        ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",
                nh_int_value,
                nh_double_value,
                nh_string_value.c_str(),
                nh_bool_value
                );
        for (auto &&stu : stus)
        {
            ROS_INFO("stus 元素:%s",stu.c_str());        
        }
    
        for (auto &&f : friends)
        {
            ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());
        }
    
        // 3.getParamCached()
        nh.getParamCached("nh_int",nh_int_value);
        ROS_INFO("通过缓存获取数据:%d",nh_int_value);
    
        // 4.getParamNames()
        std::vector<std::string> param_names1;
        nh.getParamNames(param_names1);
        for (auto &&name : param_names1)
        {
            ROS_INFO("名称解析name = %s",name.c_str());        
        }
        ROS_INFO("----------------------------");
    	
    	// 5.hadParam 
        ROS_INFO("存在 nh_int 吗? %d",nh.hasParam("nh_int")); //判断某个键是否存在,存在返回true,不存在返回false
        ROS_INFO("存在 nh_intttt 吗? %d",nh.hasParam("nh_intttt"));
    	
    	// 6.searchParam()
        std::string key;
        nh.searchParam("nh_int",key);
        ROS_INFO("搜索键:%s",key.c_str());
    
    
        //--------------------------------------------param---------------------------------
        
        ROS_INFO("++++++++++++++++++++++++++++++++++++++++");
        int res3 = ros::param::param("param_int",20); //存在
        int res4 = ros::param::param("param_int2",20); // 不存在返回默认
        ROS_INFO("param获取结果:%d,%d",res3,res4);
    
        // getParam 函数
        int param_int_value;
        double param_double_value;
        bool param_bool_value;
        std::string param_string_value;
        std::vector<std::string> param_stus;
        std::map<std::string, std::string> param_friends;
    
        ros::param::get("param_int",param_int_value);
        ros::param::get("param_double",param_double_value);
        ros::param::get("param_bool",param_bool_value);
        ros::param::get("param_string",param_string_value);
        ros::param::get("param_vector",param_stus);
        ros::param::get("param_map",param_friends);
    
        ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",
                param_int_value,
                param_double_value,
                param_string_value.c_str(),
                param_bool_value
                );
        for (auto &&stu : param_stus)
        {
            ROS_INFO("stus 元素:%s",stu.c_str());        
        }
    
        for (auto &&f : param_friends)
        {
            ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());
        }
    
        // getParamCached()
        ros::param::getCached("param_int",param_int_value);
        ROS_INFO("通过缓存获取数据:%d",param_int_value);
    
        // getParamNames()
        std::vector<std::string> param_names2;
        ros::param::getParamNames(param_names2);
        for (auto &&name : param_names2)
        {
            ROS_INFO("名称解析name = %s",name.c_str());        
        }
        ROS_INFO("----------------------------");
    
        ROS_INFO("存在 param_int 吗? %d",ros::param::has("param_int"));
        ROS_INFO("存在 param_intttt 吗? %d",ros::param::has("param_intttt"));
    
        std::string key;
        ros::param::search("param_int",key);
        ROS_INFO("搜索键:%s",key.c_str());
    
        return 0;
    }
    

参数服务器删除参数

  • 删除参数

    • ros::NodeHandle
      deleteParam(“键”);
      删除键及对应的值,删除成功返回true,否则返回false

      ros::NodeHandle nh;
      bool r1 = nh.deleteParam("nh_int");
      ROS_INFO("nh 删除结果:%d",r1);
      
    • ros::param
      del(“键”);
      删除键及对应的值,删除成功返回true,否则返回false

      bool r2 = ros::param::del("param_int");
      ROS_INFO("param 删除结果:%d",r2);
      
  • 代码实现

    #include "ros/ros.h"
    
    /* 
        参数服务器操作之删除_C++实现:
    
        ros::NodeHandle
            deleteParam("键")
            根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
    
        ros::param
            del("键")
            根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
    */
    
    
    int main(int argc, char *argv[])
    {   
        setlocale(LC_ALL,"");
        ros::init(argc,argv,"delete_param");
    	// -------------------------NodeHandle---------------------------------
        ros::NodeHandle nh;
        bool r1 = nh.deleteParam("nh_int");
        ROS_INFO("nh 删除结果:%d",r1);
    
    	// ---------------------------param------------------------------------
        bool r2 = ros::param::del("param_int");
        ROS_INFO("param 删除结果:%d",r2);
    
        return 0;
    }
    
;