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

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

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

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

      cpp 复制代码
      ros::NodeHandle nh;
      nh.setParam("键",值); //整型
    • ros::param

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

    cpp 复制代码
    #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("键","默认值")

        键存在,返回对应的键的值,否则返回默认值

        cpp 复制代码
        ros::NodeHandle nh;
        int res = nh.param("键","默认值"); // 键存在,返回对应的键的值,否则返回默认值
      • getParam("键", get_param_int)

        如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给get_param_int

        cpp 复制代码
        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

        cpp 复制代码
        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中

        cpp 复制代码
        std::vector<std::string> names;
        nh.getParamNames(names);  // 获取服务器种所有的键,并存在name中
        for (auto &&name : names)
        {
            ROS_INFO("查询到的键为 %s",name.c_str());        
        }
      • hasParam("键")

        判断某个键是否存在,存在返回true,不存在返回false

        cpp 复制代码
        bool flag = nh.hadParam("键"); // 判断某个键是否存在,存在返回true,不存在返回false
      • searchParam("键",key)

        如果键存在,并将键名赋值给 key;如果键不存在,并不赋值给 key

        cpp 复制代码
        std::string key;
        nh.searchParam("nh_int",key);
        ROS_INFO("搜索键:%s", key.c_str());
    • ros::param

      与NodeHandle类似

  • 代码实现

    cpp 复制代码
    #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

      cpp 复制代码
      ros::NodeHandle nh;
      bool r1 = nh.deleteParam("nh_int");
      ROS_INFO("nh 删除结果:%d",r1);
    • ros::param

      del("键");

      删除键及对应的值,删除成功返回true,否则返回false

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

    cpp 复制代码
    #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;
    }
相关推荐
码哝小鱼9 分钟前
iptables限制网速
linux·服务器·网络
Persistence is gold12 分钟前
cassandra指定配置文件的docker启动方法
运维·docker·容器
leaoleao沄18 分钟前
linux-IO-进程-线程(相关函数)
linux·运维·服务器
frank006007136 分钟前
linux 使用mdadm 创建raid0 nvme 磁盘
linux·运维
iangyu40 分钟前
linux命令之pwdx
linux·运维·服务器
MengYiKeNan1 小时前
C++二分函数lower_bound和upper_bound的用法
开发语言·c++·算法
C语言扫地僧1 小时前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
Xinan_____1 小时前
Linux——高流量 高并发(访问场景) 高可用(架构要求)
linux·运维·架构
HPC_fac130520678161 小时前
RTX 4090 系列即将停产,RTX 5090 系列蓄势待发
服务器·人工智能·gpu算力
小林熬夜学编程1 小时前
C++第五十一弹---IO流实战:高效文件读写与格式化输出
c语言·开发语言·c++·算法