ROS参数服务器

ROS通信之参数服务器

参数服务器(参数共享模式)是ROS 中的基本通信机制

1 参数服务器

​ 参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据。类似于全局变量。

1.1 理论模型

  • ROS Master (管理者)
  • Talker (参数设置者)
  • Listener (参数调用者)

​ ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。

在这里插入图片描述

1.2 参数操作(增删改查)

1.2.1 新增与修改

#include "ros/ros.h"

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

    // 参数增(设置键值对)
    // 方1:nh
    nh.setParam("type","phd");   //参数:键值对
    nh.setParam("age",25);
    // 方2:param
    ros::param::set("type_param","phd");
    ros::param::set("age_param",25);


    // 参数改--实际上就是修改键对应的值
    nh.setParam("age",25);
    ros::param::set("age_param",25);

    return 0;
}

1.2.2 查

参数服务器操作之查询_C++实现: 在 roscpp 中提供了两套 API 实现参数操作

ros::NodeHandle

    param(,默认值) 
        存在,返回对应结果,否则返回默认值

    getParam(,存储结果的变量)
        存在,返回 true,且将值赋值给参数2
        如果·键不存在,那么返回值为 false,且不为参数2赋值
        
---------------------------------------------------------------------------------------
关于上面两种方法区别,getParam():Get an  value from the parameter server. If you want to provide a default value in case the key does not exist use param().就是说,如果只是想获取一个参数,不设置默认值,可以使用getParam(),如果想在参数服务器没有提供这个参数值的时候使用默认值,请使用param()

ros::NodeHandle nh;
nh.param<int>("grid_row", processor_config.grid_row, 4);
nh.getParam("cam0/resolution", cam0_resolution_temp);

--------------------------------------------------------------------------------------
    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"
using namespace std;

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"get_param");
    ros::NodeHandle nh;
    // 1.param
    int get_age = nh.param("age",30);  // 把键age的值给get_age,如果没有键没有对应的值,就令值为30
    ROS_INFO("age = %d",get_age);
    ros::param::param("age",30);
    ROS_INFO("age = %d",get_age);
    // 2.getParam
    int getParam_age;
    bool result = nh.getParam("age",getParam_age);
    if(result)
    {
        ROS_INFO("age = %d",getParam_age);
    }
    else
    {
        ROS_INFO("don't find parameter");
    }
 
    // 3.getParamCached 与 getParam相似,性能提升
    int getParamCache_age;
    bool result1 = nh.getParamCached("age",getParamCache_age);
    if(result1)
    {
        ROS_INFO("age = %d",getParamCache_age);
    }
    else
    {
        ROS_INFO("don't find parameter");
    }

    bool result2 = ros::param::getCached("age",getParamCache_age);
    if(result2)
    {
        ROS_INFO("age = %d",getParamCache_age);
    }
    else
    {
        ROS_INFO("don't find parameter");
    }


    // 4. getParamNames(std::vector<std::string>)
    vector<std::string> names;
    nh.getParamNames(names);
    for(auto &k:names)
    {
        ROS_INFO("遍历的键:%s",k.c_str());
    }

    ros::param::getParamNames(names);
    for(auto &k:names)
    {
        ROS_INFO("遍历的键:%s",k.c_str());
    }


    // 5. hasParam(键)
    bool a = nh.hasParam("type");
    ROS_INFO("Pair is %d exit",a);

    bool n = ros::param::has("type");
    ROS_INFO("Pair is %d exit",n);


    // 6. searchParam(参数1,参数2)
    string key;
    nh.searchParam("type",key);
    ROS_INFO("search result:%s",key);

    ros::param::search("type",key);
    ROS_INFO("search result:%s",key);

    return 0;
}

3.2.3 删

  • 方法
参数服务器操作之删除_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,"del");
    ros::NodeHandle nh;

    bool r1 = nh.deleteParam("age");
    ROS_INFO("nh 删除结果:%d",r1);

    bool r2 = ros::param::del("age_param");
    ROS_INFO("param 删除结果:%d",r2);

    return 0;
}

2 关于launch文件中参数

MSCKFimage_processor_euroc.launch为例

<launch>
  <!-- 动态参数  -->
  <arg name="robot" default="firefly_sbx"/>
  <arg name="calibration_file" default="$(find msckf_vio)/config/camchain-imucam-euroc.yaml"/>

  <!-- Image Processor Nodelet  -->
  <group ns="$(arg robot)">
    <node pkg="nodelet" type="nodelet" name="image_processor"
      args="standalone msckf_vio/ImageProcessorNodelet"
      output="screen">
	  
	  <!-- 从配置文件加载参数,存入参数服务器  -->
      <rosparam command="load" file="$(arg calibration_file)"/>
       <!-- 在参数服务器上设置参数  -->
      <param name="grid_row" value="4"/>
      <param name="grid_col" value="5"/>
      <param name="grid_min_feature_num" value="3"/>
      <param name="grid_max_feature_num" value="4"/>
      <param name="pyramid_levels" value="3"/>
      <param name="patch_size" value="15"/>
      <param name="fast_threshold" value="10"/>
      <param name="max_iteration" value="30"/>
      <param name="track_precision" value="0.01"/>
      <param name="ransac_threshold" value="3"/>
      <param name="stereo_threshold" value="5"/>

      <remap from="~imu" to="/imu0"/>
      <remap from="~cam0_image" to="/cam0/image_raw"/>
      <remap from="~cam1_image" to="/cam1/image_raw"/>

    </node>
  </group>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值