ROS第六课:参数服务器

本文详细介绍了ROS(机器人操作系统)中参数服务器的使用,包括如何通过NodeHandle和ros::param API进行参数的增加、修改、查询和删除。示例代码展示了在C++中实现这些操作的方法,并提到了rosparam命令行工具进行参数管理的命令。此外,还强调了参数服务器主要用于存储静态非二进制简单数据,不适合高性能需求。
摘要由CSDN通过智能技术生成

参数服务器在ROS中主要用于实现不同节点之间的数据共享。比如,导航实现时,会进行路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成实时的行进路径。
需关注三个角色:ROS Master、Talker、Listener。
注意:参数服务器不失为高性能而设计的,因此最好用于储存静态的非二进制的简单数据。
对于参数服务器的操作,主要有增删查改四方面,下面分别从增改、差、删来进行实现:

  • 增改
    改其实是通过参数覆盖来实现的,所以本质上改和增实现方法相同。增改可以通过两套API来实现:①设置节点句柄对象,节点句柄对象中内置了对参数服务器进行增删查改的命令;②使用param命名空间下的增删查改函数:
#include "ros/ros.h"
/*
      需要实现参数的新增与修改
      需求:首先设置机器人的共享参数,类型、半径(0.15m)
           再修改半径(0.2m)
      实现:
           ros::NodeHandle
               setParam("键",值)
           ros::param
               set("键",值)
      修改:只需继续调用setParam 或set 函数,保证键是已经存在的,值会自行覆盖。

*/

int main(int argc, char *argv[])
{
    //初始化ROS节点
    ros::init(argc,argv,"set_param_c");
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数增----------------------------------
    //方案1:nh
    nh.setParam("type","xiaoHuang");//key的名字为type,值为xiaoHuang
    nh.setParam("radius",0.15);
    //方案2:ros::param
    ros::param::set("type_param","xiaoBai");//键名不可重复
    ros::param::set("radius_param",0.15);
    //参数改----------------------------------
    //方案1:nh
    nh.setParam("radius",0.2);//键已经存在,不需重新设置,这里参数进行了覆盖
    //方案2:ros::param
    ros::param::set("radius_param",0.2);
    
    return 0;
}


  • 同上,C++实现对参数服务器的查询,也可以通过两套API完成。且两套API中有一一对应的函数,这里对设置节点句柄对象的六种方法进行了演示,而仅对param命名空间中的内置函数中的两种进行了演示:
#include "ros/ros.h"
/*
    演示参数查询
    实现:
        ros::NodeHandle----------------------------
             param("键",默认值)
                 存在,返回对应结果,否则返回默认值

             getParam("键",存储结果的变量)
                 存在,返回ture,且将值赋给参数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节点
    ros::init(argc,argv,"get_param_c");
    //创建节点句柄
    ros::NodeHandle nh;

    //ros::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.getParamCaches 与getParam 类似。只是性能上有提升,一般测试下,看不出来
    /* 
    bool result = nh.getParamCached("radius",radius2);
    if (result)
    {
        ROS_INFO("获取的半径是:%.2f",radius2);
    }else
    {
        ROS_INFO("被查询的变量不存在。");
    }
    */

    //4.getParamNames,未运行成功
    /*
    std::vector<std::string> names;
    nh.getParamNames(names);
    for (auto &name : names)
    {
        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
    std::string key;
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果:%s",key.c_str());

    //ros:param-----------------------------------------
    //1.param
    double radius_param = ros::param::param("radius",100.5);
    ROS_INFO("radius_param = %.2f",radius_param);
    
    //2.getParamNames,未运行成功
    /*
    std::vector<std::string> names_param;
    ros::param::getParamNames(names_param);
    for (auto &&name : names_param)
    {
        ROS_INFO("键:%s",name.c_str());
    }
    */
    
    return 0;
}


  • 参数的删除同前,也有两套API来实现:
#include "ros/ros.h"
/*
      演示参数删除:
      实现:
         ros::NodeHandel
              delParam()
         ros::param
              del()
*/

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

    //删除::NodeHandel-------------------------------------
    bool flag1 = nh.deleteParam("radius");
    if (flag1)
    {
        ROS_INFO("删除成功!");
    } else
    {
        ROS_INFO("删除失败!");
    }
    
    
    //删除::ros::param-------------------------------------
    bool flag2 = ros::param::del("radius_param");
    if (flag2)
    {
        ROS_INFO("radius_param 删除成功!");
    } else
    {
        ROS_INFO("radius_param 删除失败!");
    }
    
    return 0;
}

  • 终端中实现参数增删改查
    ROS提供了一系列实用的命令行工具来获得不同的节点信息,其中rosparam命令可以对参数进行相应操作。
    ①增改:rosparam set <参数名> <参数值>命令可以实现,如:
    rosparam set name huluwa
    rosparam set length 1.5
    ②查:rosparam get <参数名>命令可以实现,如:
    输入rosparam set name,出现结果huluwa
    ③删:rosparam del <参数名>命令可以实现。
    一些其他的rosparam命令将在下一课中介绍。

参考:AutoLabor

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值