ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ROS:参数服务器的增删改查

2021-08-01 19:02:07  阅读:193  来源: 互联网

标签:nh INFO ros 改查 param 参数 增删 ROS


参数服务器的框架


参数服务器实现是最为简单的,该模型如下图所示,该模型中涉及到三个角色:

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

ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。
在这里插入图片描述

增加参数与修改参数

代码

#include "ros/ros.h"

/*
        需要实现参数的新增与修改
        需求:首先设置机器人的共享参数,类型、半径(0.15m)
                再修改半径(0.2m)
        实现:
                ros::NodeHandle
                        setParam();
                ros::param
                        set();
*/

int main(int argc,char *argv[])
{
        setlocale(LC_ALL,"");
        //初始化ROS节点
        ros::init(argc,argv,"jiqi");
        //创建ROS节点句柄
        ros::NodeHandle nh;
        ROS_INFO("成功操作参赛服务器");
        //参数增------------------------------
        //方案一:nh
        nh.setParam("type1","xiaohong");
        nh.setParam("radius1",0.15);
        //方案二:ros::param
        ros::param::set("type2","xiaobai");
        ros::param::set("radius2",0.2);
        //参数改------------------------------
        //方案一:nh
        nh.setParam("radius1",0.35);
        //方案二:ros::param
        ros::param::set("radius2",0.4);
        return 0;
}

配置修改

在这里插入图片描述

add_executable(demo01_param_set src/demo01_param_set.cpp)

target_link_libraries(demo01_param_set
  ${catkin_LIBRARIES}
)

程序实现

在这里插入图片描述

查找参数

    参数查询
    实现:
            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_c");
        //创建节点句柄
        ros::NodeHandle nh;
        //ros::NodeHandle---------------------------------------------------------
        //1.param
                // double arr1 = nh.param("radius1",0.1);
                // ROS_INFO("半径:%.2f",arr1);
        //2.getParam
                // double radius = 0.0;
                // bool arr2 = nh.getParam("radius12",radius);
                // if(arr2)
                // {
                //         ROS_INFO("获取的半径是:%.2f",radius);
                // }
                // else
                // {
                //         ROS_INFO("查询变量不存在。");
                // }
        //3.getParamCached
                // double radius2 = 0.0;
                // bool arr3 = nh.getParamCached("radius1",radius2);
                // if(arr3)
                // {
                //         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("radius1");
                // bool flag2 = nh.hasParam("radius1xxx");
                // ROS_INFO("radius1存在吗?%d",flag1);
                // ROS_INFO("radius1xxx存在吗?%d",flag2);
        //6.searchParam
                // std::string key;
                // nh.searchParam("radius1",key);
                // ROS_INFO("搜索结果:%s",key.c_str());
        //ros::param-----------------------------------------------------------------
                //1.param
                        // double arr = ros::param::param("radius1",0.1);
                        // ROS_INFO("半径:%.2f",arr);
                //2.getParam
                        std::vector<std::string> names;
                        ros::param::getParamNames(names);
                        for (auto &&name  :names)
                        {
                                ROS_INFO("遍历的元素:%s",name.c_str());
                        }
        return 0;
}

配置修改

在这里插入图片描述

add_executable(demo02_param_gat src/demo02_param_gat.cpp)

target_link_libraries(demo02_param_gat
  ${catkin_LIBRARIES}
)

程序实现

在这里插入图片描述

删除参数

代码

#include "ros/ros.h"

/*
        需要实现参数的新增与修改
        需求:首先设置机器人的共享参数,类型、半径(0.15m)
                再修改半径(0.2m)
        实现:
                ros::NodeHandle
                        setParam();
                ros::param
                        set();
*/

int main(int argc,char *argv[])
{
        setlocale(LC_ALL,"");
        //初始化ROS节点
        ros::init(argc,argv,"jiqi");
        //创建ROS节点句柄
        ros::NodeHandle nh;
        ROS_INFO("成功操作参数服务器");
        //参数增------------------------------
        //方案一:nh
        nh.setParam("type1","xiaohong");
        nh.setParam("radius1",0.15);
        //方案二:ros::param
        ros::param::set("type2","xiaobai");
        ros::param::set("radius2",0.2);
        //参数改------------------------------
        //方案一:nh
        nh.setParam("radius1",0.35);
        //方案二:ros::param
        ros::param::set("radius2",0.4);
        return 0;
}

配置修改

在这里插入图片描述

add_executable(demo03_param_del src/demo03_param_del.cpp)

target_link_libraries(demo03_param_del
  ${catkin_LIBRARIES}
)

程序实现

在这里插入图片描述

标签:nh,INFO,ros,改查,param,参数,增删,ROS
来源: https://blog.csdn.net/qq_51183186/article/details/119299024

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有