Part2.3.2 参数通信的实践 (C++)

本文以c语言为例子,对参数进行增删改查的操作

#include "ros/ros.h"

/*
 实现参数的新增和修改

  需求:首先设置小车的共享参数和类型,半径 0.5 然后修改为 0.2

   实现:使用两套API
   使用1.ros::NodeHandle 
       setParam(“键”,值)
       2.ros::param
        set("键",值)
*/

 int main(int argc,char *argv[])
 {
   ros::init(argc,argv,"set_param");
   ros::NodeHandle nh ;
   /*参数的新增 方案一*/
   nh.setParam("type","wall_E");/*设置参数的名称和内容*/
   nh.setParam("radius",0.5);
    /*参数的新增 方案二*/
    ros::param::set("type_p","wall_A");
    ros::param::set("radius_a",0.5);
/*在终端,rosparam list 可以列出所有的参数 rosparam get 参数名 可以查看参数的详细情况*/
    /*修改参数,会把之前的参数设置进行覆盖*/
    nh.setParam("radius",0.2);
    ros::param::set("radius_a",0.22);
     return 0;
 }
#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[])
{
   ros::init(argc,argv,"get_param");
   ros::NodeHandle nh ;
   // ros::nodehandle -----
   //1.param
   double  radius = nh.param("radius",0.1);//查询键为radius的值,如果值不存在就输出默认值0.1
   ROS_INFO("RADIUS = %.2f",radius);
  //2.getParam
  double radius2=0.0;
  bool result=nh.getParam("radius_a",radius2); //getParem的返回值是bool类型
  if(result)
  {
      ROS_INFO ("radius2 = %.2f",radius2);

  }
  else{
      ROS_INFO("don't find !");
  }
  //3.getParamCached 与getParam 类似只是性能上有所提升
  bool result1=nh.getParamCached("radius",radius2);
  if(result)
  {
      ROS_INFO("radius2 = %.3f",radius2);
  }
  else {
      ROS_INFO("DON'T find !");
  }
  //4.getParamNames 遍历所有的参数名称
  std::vector<std::string> names;
  nh.getParamNames(names);
  for(auto &&name : names)
  {
      ROS_INFO ("element %s", name.c_str());
  }
  //5 hasParam(键)
  bool result2=nh.hasParam("radius");
  bool result3=nh.hasParam("ddd");
  ROS_INFO("radius ? %d",result2);
  ROS_INFO("ddd ? %d",result3);
   //6.searhParam 搜索键名,并把搜索到的键存入key1
   std::string key1;
   nh.searchParam("radius",key1);
   ROS_INFO("KEY1 = %s ",key1.c_str());
 //ros::param::  -----------------
 //ros::param::param 获取参数的值通过输入的键名,如果没有该参数则返回一个默认值
 double rds=ros::param::param("radius",12);
    ROS_INFO (" rds = %.2f",rds);
    //其他的ros::param 的函数 和nodehandle的函数是类似的
    return 0;
}
#include "ros/ros.h"
/*
参数的删除操作:
 还是使用两套API 
    ros::nodehandle
    ros::param
*/
int main(int argc,char*argv[])
{
  ros::init(argc,argv,"delete_param");
  // API1 nodehandle . deletParam
  ros::NodeHandle nh;
   bool flag1=nh.deleteParam("radius");
   if(flag1)
   {
       ROS_INFO("deledt successuful ");
   }
   else {

       ROS_INFO("failed !!");
   }
  //API2  ros::param::del  
   bool flag2=ros::param::del("radius_a");
   if(flag2)
   {
       ROS_INFO (" DELETE SUCCESSEFUL");
   }
   else {
       ROS_INFO("FAILED");
   }


    return 0;
}
上一篇:科研向(仿真验证) ROS 学习笔记二 C:ROS 通信机制 —— 参数服务器


下一篇:一篇文章让你明白CPU缓存一致性协议MESI