参数服务器(c++实现)

作用

存储一些多节点共享的数据,类似于全局变量。

案例

实现参数增删改查操作。

注意:参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据

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

  • ros::NodeHandle

  • ros::param

1.创建工作空间并初始化

mkdir -p demo03_ws/src
cd demo03_ws
catkin_make

2.进入 src 创建 ros 包并添加依赖

配置功能包 plumbing_param_server

导入依赖的包 roscpp rospy std_msgs

3.在功能包plumbing_param_server目录src下新建demo01_param_set.cpp(参数的新增与修改)

#include "ros/ros.h"

/*
    需求:实现参数服务器参数的增删改查操作。
    设置机器人共享参数,类型,半径(0.15m)
    实现:
    ros::NodeHandle
    setParam()

    ros::param
    set()

*/
int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    //初始化ros节点 set_param_c  节点名
    ros::init(argc,argv,"set_param_c");

    //创建节点句柄
    ros::NodeHandle nh;
    //NodeHandle--------------------------------------------------------
    nh.setParam("type","xiaohuang");
    nh.setParam("radius",0.15);
    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_int",10000);

    //param--------------------------------------------------------
    ros::param::set("type_param","xiaobai");
    ros::param::set("radius_param",0.15);
    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_int",20000);

    return 0;
}

4.在功能包plumbing_param_server目录src下新建demo02_param_get.cpp(参数的新增与修改)

/*
    演示参数 -查询
        在 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 类似
*/

#include "ros/ros.h"

int main(int argc, char *argv[])
{
    //设置编码
    setlocale(LC_ALL,"");
    //初始化ros节点
    ros::init(argc,argv,"get_param");
    //创建节点句柄
    ros::NodeHandle nh;

     //NodeHandle------------------------------
      // 1.param 函数
    double radius= nh.param("radius",0.5);
    ROS_INFO("radius = %.2f",radius);

      // 2. getParam 函数
      double radius2 =0.0;
      bool result=nh.getParam("radius",radius2);
      if(result)
      {
          ROS_INFO("获取的半径是:%.2f",radius2);
      }
      else{
            ROS_INFO("备查询的变量不存在");  
      }

      // 3.getParamCached() 
      // 与getParam类似,只是在性能上有提升,一般测试下,类能提升看不出来
    //  double radius2 =0.0;
    //   bool result=nh.getParamCached("radius",radius2);
    //   if(result)
    //   {
    //       ROS_INFO("获取的半径是:%.2f",radius2);
    //   }
    //   else{
    //         ROS_INFO("备查询的变量不存在");  
    //   }

      //4.getParamNames()
    std::vector<std::string> param_names1;  //创建一个容器,存放这些名称
    nh.getParamNames(param_names1);
    for (auto &&name : param_names1)
    {
        ROS_INFO("遍历的元素 = %s",name.c_str());        
    }

    // 5.hasParam
    bool flag1 =nh.hasParam("radius");
    bool flag2 =nh.hasParam("radiusxxx");
    ROS_INFO("存在 radius吗? %d",flag1);
    ROS_INFO("存在 radiusxxx吗? %d",flag2);

    //6.searchParam(参数1,参数2)
            //搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
    std::string key;
    nh.searchParam("radius",key);
    ROS_INFO("搜索键:%s",key.c_str());

    return 0;
}

4.在功能包plumbing_param_server目录src下新建demo03_param_delete.cpp(参数的新增与修改)

/* 
    参数服务器操作之删除_C++实现:

    ros::NodeHandle
        deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

    ros::param
        del("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false


*/
#include "ros/ros.h"


int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"delete_param");
    ros::NodeHandle nh;

//deleteParam("键")
        //根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
    bool flag1 = nh.deleteParam("radius");
    if(flag1)
    {
        ROS_INFO("删除成功");

    }
    else{
        ROS_INFO("删除失败");
    }
    

    return 0;
}


 

5.编辑配置文件

add_executable(demo01_param_set src/demo01_param_set.cpp)
add_executable(demo02_param_get src/demo02_param_get.cpp)
add_executable(demo03_param_del src/demo03_param_del.cpp)

target_link_libraries(demo01_param_set
  ${catkin_LIBRARIES}
)
target_link_libraries(demo02_param_get
  ${catkin_LIBRARIES}
)
target_link_libraries(demo03_param_del
  ${catkin_LIBRARIES}
)

6.编译与执行

第一个命令行:启动 roscore

第二个命令行:

 cd demo04_ws 

catkin_make

source ./devel/setup.bash

rosrun plumbing_param_server demo01_param_set

第三个命令行:

 cd demo04_ws 

catkin_make

source ./devel/setup.bash

rosrun plumbing_param_server demo02_param_get

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值