ROS参数服务器增删改查实操C++

ROS参数服务器增删改查实操C++

  • 创建功能包
  • 参数服务器新增(修改)参数
  • 参数服务器获取参数
  • 参数服务器删除参数

ROS通信机制包括话题通信、服务通信和参数服务器三种通信方式,各原理及代码实现如下表

在这里插入图片描述

功能博客链接说明
VScode配置 ROS 环境VScode创建ROS项目 ROS集成开发环境使用VScode使用配置了ROS开发环境,实现ROS开发的第一步
话题通信理论ROS话题通信流程理论介绍了话题通信机制的原理
ROS话题通信机制实操C++ROS话题通信机制实操C++手把手的用C++实现了话题通信机制
ROS话题通信机制实操PythonROS话题通信机制实操Python手把手的用Python实现了话题通信机制
ROS话题通信流程自定义msg格式ROS话题通信流程自定义msg格式介绍了如何准备话题通信机制自定义msg数据格式,及相关配置
ROS话题通信机制自定义msg实战C++ROS话题通信机制自定义msg实战C++手把手的用C++实现了话题通信机制自定义msg数据通信
ROS话题通信机制自定义msg实战PythonROS话题通信机制自定义msg实战Python手把手的用Python实现了话题通信机制自定义msg数据通信
服务通信理论ROS服务通信流程理论介绍了服务通信机制的原理
ROS服务通信自定义srvROS服务通信自定义srv介绍了如何准备服务通信机制自定义srv数据格式,及相关配置
ROS服务通信机制实操C++ROS服务通信机制实操C++手把手的用C++实现了服务通信机制
ROS服务通信机制实操PythonROS服务通信机制实操Python手把手的用Python实现了话题通信机制
参数服务器理论ROS参数服务器理论模型介绍了参数服务器的原理
ROS参数服务器增删改查实操C++ROS参数服务器增删改查实操C++用 C++ 实现了参数服务器的的增删改查操作
ROS参数服务器增删改查实操PythonROS参数服务器增删改查实操Python用 Python 实现了参数服务器的的增删改查操作

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

  • ros::NodeHandle

  • ros::param

创建功能包

  • 选定 src 右击 —> create catkin package
    在这里插入图片描述

  • 创建一个 pluming_param_server 功能包

    在这里插入图片描述

  • 使用 roscpp rospy std_msgs 作为依赖库

    在这里插入图片描述

  • 编辑配置文件
    修改 plumbing_param_server 功能包下的CMakeLists.txt,找到add_executable和target_link_libraries,修改成如图所示:

    在这里插入图片描述

参数服务器新增(修改)参数

  • 新增方法,调用API,设置的格式

    • ros::NodeHandle

      ros::NodeHandle nh;
      nh.setParam("键",); //整型
      
    • ros::param

      ros::param::set("键","值");
      
  • 代码实现

    #include "ros/ros.h"/*参数服务器操作之新增与修改(二者API一样)_C++实现:在 roscpp 中提供了两套 API 实现参数操作ros::NodeHandlesetParam("键",值)ros::paramset("键","值")示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数修改(相同的键,不同的值)*/int main(int argc, char *argv[])
    {setlocale(LC_ALL, ""); // 设置中文输出ros::init(argc, argv, "set_param_c");std::vector<std::string> stus;stus.push_back("lishi");stus.push_back("zhf");std::map<std::string,std::string> friends;friends["zeng"] = "hua";friends["li"] = "cui";// ---------------------------NodeHandle--------------------------ros::NodeHandle nh;nh.setParam("nh_int",10); //整型nh.setParam("nh_double",3.14); //浮点型nh.setParam("nh_bool",true); //boolnh.setParam("nh_string","hello NodeHandle"); //字符串nh.setParam("nh_vector",stus); // vectornh.setParam("nh_map",friends); // map//修改演示(相同的键,不同的值)nh.setParam("nh_int",10000);// ---------------------------param-------------------------------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_vector",stus);ros::param::set("param_map",friends);//修改演示(相同的键,不同的值)ros::param::set("param_int",20000);return 0;
    }
  • 查看设置的参数
    开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行 source ./devel/setup.bash rosrun plumbing_param_server demo_param_set_c ;再开启一个Terminal,运行 rosparam list,查看设置的参数

    在这里插入图片描述

修改参数与新增参数相同,设置不同值就可以

参数服务器获取参数

  • 查看参数

    • ros::NodeHandle

      • param(“键”,“默认值”)
        键存在,返回对应的键的值,否则返回默认值

        ros::NodeHandle nh;
        int res = nh.param("键","默认值"); // 键存在,返回对应的键的值,否则返回默认值
        
      • getParam(“键”, get_param_int)
        如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给get_param_int

        ros::NodeHandle nh;
        int get_param_int
        bool flag = nh.getParam("键", get_param_int); // 如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给get_param_intif (flag)
        {ROS_INFO("getParam 获取结果:%d", get_param_int);
        }
        else
        {ROS_INFO("查询的变量不存在!!!");
        }
        
      • getParamCached(“键”, get_param_int2)
        是对getParam的优化,提高变量获取效率
        如果键存在,则返回true,并将结果赋给get_param_int;如果键不存在,返回false,并不赋值给 get_param_int

        ros::NodeHandle nh;
        int get_param_int2
        bool flag = nh.getParamCached("键", get_param_int2); // 如果键存在,则返回true,并将结果赋给get_param_int2;如果键不存在,返回false,并不赋值给get_param_int2if (flag)
        {ROS_INFO("getParamCached 获取结果:%d", get_param_int2);
        }
        else
        {ROS_INFO("查询的变量不存在!!!");
        }
        
      • getParamNames(name)
        获取服务器种所有的键,存储在参数name中

        std::vector<std::string> names;
        nh.getParamNames(names);  // 获取服务器种所有的键,并存在name中
        for (auto &&name : names)
        {ROS_INFO("查询到的键为 %s",name.c_str());        
        }
        
      • hasParam(“键”)
        判断某个键是否存在,存在返回true,不存在返回false

        bool flag = nh.hadParam("键"); // 判断某个键是否存在,存在返回true,不存在返回false
      • searchParam(“键”,key)
        如果键存在,并将键名赋值给 key;如果键不存在,并不赋值给 key

        std::string key;
        nh.searchParam("nh_int",key);
        ROS_INFO("搜索键:%s", key.c_str());
        
    • ros::param
      与NodeHandle类似

  • 代码实现

    #include "ros/ros.h"
    /*参数服务器操作之查询_C++实现:在 roscpp 中提供了两套 API 实现参数操作ros::NodeHandleparam(键,默认值) 存在,返回对应结果,否则返回默认值getParam(键,存储结果的变量)存在,返回 true,且将值赋值给参数2若果键不存在,那么返回值为 false,且不为参数2赋值getParamCached(键,存储结果的变量)--提高变量获取效率存在,返回 true,且将值赋值给参数2如果键不存在,那么返回值为 false,且不为参数2赋值getParamNames(std::vector<std::string>)获取所有的键,并存储在参数 vector 中 hasParam(键)是否包含某个键,存在返回 true,否则返回 falsesearchParam(参数1,参数2)搜索键,参数1是被搜索的键,参数2存储搜索结果的变量ros::param ----- 与 NodeHandle 类似
    */int main(int argc, char *argv[])
    {setlocale(LC_ALL,"");ros::init(argc,argv,"get_param");// ------------------------------------NodeHandle--------------------------ros::NodeHandle nh;// 1.param 函数int res1 = nh.param("nh_int",100); // 键存在int res2 = nh.param("nh_int2",100); // 键不存在ROS_INFO("param获取结果:%d,%d",res1,res2);// 2.getParam 函数int nh_int_value;double nh_double_value;bool nh_bool_value;std::string nh_string_value;std::vector<std::string> stus;std::map<std::string, std::string> friends;nh.getParam("nh_int",nh_int_value);nh.getParam("nh_double",nh_double_value);nh.getParam("nh_bool",nh_bool_value);nh.getParam("nh_string",nh_string_value);nh.getParam("nh_vector",stus);nh.getParam("nh_map",friends);ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",nh_int_value,nh_double_value,nh_string_value.c_str(),nh_bool_value);for (auto &&stu : stus){ROS_INFO("stus 元素:%s",stu.c_str());        }for (auto &&f : friends){ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());}// 3.getParamCached()nh.getParamCached("nh_int",nh_int_value);ROS_INFO("通过缓存获取数据:%d",nh_int_value);// 4.getParamNames()std::vector<std::string> param_names1;nh.getParamNames(param_names1);for (auto &&name : param_names1){ROS_INFO("名称解析name = %s",name.c_str());        }ROS_INFO("----------------------------");// 5.hadParam ROS_INFO("存在 nh_int 吗? %d",nh.hasParam("nh_int")); //判断某个键是否存在,存在返回true,不存在返回falseROS_INFO("存在 nh_intttt 吗? %d",nh.hasParam("nh_intttt"));// 6.searchParam()std::string key;nh.searchParam("nh_int",key);ROS_INFO("搜索键:%s",key.c_str());//--------------------------------------------param---------------------------------ROS_INFO("++++++++++++++++++++++++++++++++++++++++");int res3 = ros::param::param("param_int",20); //存在int res4 = ros::param::param("param_int2",20); // 不存在返回默认ROS_INFO("param获取结果:%d,%d",res3,res4);// getParam 函数int param_int_value;double param_double_value;bool param_bool_value;std::string param_string_value;std::vector<std::string> param_stus;std::map<std::string, std::string> param_friends;ros::param::get("param_int",param_int_value);ros::param::get("param_double",param_double_value);ros::param::get("param_bool",param_bool_value);ros::param::get("param_string",param_string_value);ros::param::get("param_vector",param_stus);ros::param::get("param_map",param_friends);ROS_INFO("getParam获取的结果:%d,%.2f,%s,%d",param_int_value,param_double_value,param_string_value.c_str(),param_bool_value);for (auto &&stu : param_stus){ROS_INFO("stus 元素:%s",stu.c_str());        }for (auto &&f : param_friends){ROS_INFO("map 元素:%s = %s",f.first.c_str(), f.second.c_str());}// getParamCached()ros::param::getCached("param_int",param_int_value);ROS_INFO("通过缓存获取数据:%d",param_int_value);// getParamNames()std::vector<std::string> param_names2;ros::param::getParamNames(param_names2);for (auto &&name : param_names2){ROS_INFO("名称解析name = %s",name.c_str());        }ROS_INFO("----------------------------");ROS_INFO("存在 param_int 吗? %d",ros::param::has("param_int"));ROS_INFO("存在 param_intttt 吗? %d",ros::param::has("param_intttt"));std::string key;ros::param::search("param_int",key);ROS_INFO("搜索键:%s",key.c_str());return 0;
    }
    

参数服务器删除参数

  • 删除参数

    • ros::NodeHandle
      deleteParam(“键”);
      删除键及对应的值,删除成功返回true,否则返回false

      ros::NodeHandle nh;
      bool r1 = nh.deleteParam("nh_int");
      ROS_INFO("nh 删除结果:%d",r1);
      
    • ros::param
      del(“键”);
      删除键及对应的值,删除成功返回true,否则返回false

      bool r2 = ros::param::del("param_int");
      ROS_INFO("param 删除结果:%d",r2);
      
  • 代码实现

    #include "ros/ros.h"/* 参数服务器操作之删除_C++实现:ros::NodeHandledeleteParam("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 falseros::paramdel("键")根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
    */int main(int argc, char *argv[])
    {   setlocale(LC_ALL,"");ros::init(argc,argv,"delete_param");// -------------------------NodeHandle---------------------------------ros::NodeHandle nh;bool r1 = nh.deleteParam("nh_int");ROS_INFO("nh 删除结果:%d",r1);// ---------------------------param------------------------------------bool r2 = ros::param::del("param_int");ROS_INFO("param 删除结果:%d",r2);return 0;
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Vue实战教程】之Vuex状态管理详解

Vuex状态管理 1 Vuex简介 1.1 什么是Vuex Vuex是一个专为Vue.js应用程序开发的状态管理工具。它采用了集中式存储管理应用的所有的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 简单来说&#xff0c;Vuex是一个适用于在Vue项目开发时使用的状态管理…

机器学习 | 回归算法原理——多项式回归

Hi&#xff0c;大家好&#xff0c;我是半亩花海。接着上次的最速下降法&#xff08;梯度下降法&#xff09;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享多项式回归这一回归算法原理。本章的回归算法原理基于《基于广告费预测点击量》项目&#xff0c;…

Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习多输入单输出时间序列预测

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于LSTM-Adaboost长短期记忆神经网络结合Adaboost集成学习时间序列预测(股票价格预测) 模型设计 步骤1: 数据准备 收集和整理历史数据。确保数据集经过适当的预处理,如归一…

【人工智能】Transformers之Pipeline(五):深度估计(depth-estimation)

目录 一、引言 二、深度估计&#xff08;depth-estimation&#xff09; 2.1 概述 2.2 技术路径 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipeline&#xff08…

mysql JSON特性优化

有朋友问到&#xff0c;mysql如果要根据json中的某个属性过滤&#xff0c;数据量大的话&#xff0c;性能很差&#xff0c;要如何提高性能&#xff1f; 为什么要用json串&#xff1f; 由于一些特定场景&#xff0c;mysql需要用到json串&#xff0c;例如文档&#xff0c;不同的…

详解Stable Diffusion 原理图

参考英文文献&#xff1a;The Illustrated Stable Diffusion – Jay Alammar – Visualizing machine learning one concept at a time. 在这个Stable Diffusion模型的架构图中&#xff0c;VAE&#xff08;变分自编码器&#xff09;模型对应的是图中的 E 和 D 部分。 具体来说…

【BUG】已解决:NameError: name ‘python‘ is not defined

NameError: name ‘python‘ is not defined 目录 NameError: name ‘python‘ is not defined 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于…

深入学习STL标准模板库

C STL standard template libaray 标准模板库 目录 C STL standard template libaray 标准模板库 一、标准容器顺序容器vectordequelistvector deque list对比 容器适配器stackqueuepriority_queue 关联容器(1)无序关联容器unordered_setunordered_multisetunordered_mapunorde…

Cxx Primer-chap7

类的基本思想是数据抽象和封装&#xff0c;前者强调interface和implement分离&#xff0c;后者在此基础上&#xff0c;强调访问控制符&#xff08;存疑&#xff09;。同时类的实现者和使用者考虑的角度不同&#xff0c;前者考虑实现效率&#xff0c;后者仅需关注功能即可&#…

C++相关概念和易错语法(23)(set、仿函数的应用、pair、multiset)

1.set和map存在的意义 &#xff08;1&#xff09;set和map的底层都是二叉搜索树&#xff0c;可以达到快速排序&#xff08;当我们按照迭代器的顺序来遍历set和map&#xff0c;其实是按照中序来遍历的&#xff0c;是排过序的&#xff09;、去重、搜索的目的。 &#xff08;2&a…

与众不同的社交体验:Facebook的新功能与新变化

在快速变化的社交媒体领域&#xff0c;Facebook不断引入创新功能和变化&#xff0c;以满足用户日益增长的需求&#xff0c;并提供与众不同的社交体验。从增强现实到数据隐私&#xff0c;Facebook的新功能和更新正在塑造一个全新的社交平台。本文将深入探讨这些新功能和变化&…

arm环境下构建Flink的Docker镜像

准备工作 资源准备 按需下载 flink&#xff0c;我的是1.17.2版本。官方说1.13版本之后的安装包兼容了arm架构&#xff0c;所以直接下载就行。 如需要cdc组件&#xff0c;提前下载好。 服务器准备 可在某云上购买arm服务器&#xff0c;2c/4g即可&#xff0c;按量付费。 带宽…

谷粒商城实战笔记-43-前端基础-Vue-使用Vue脚手架进行模块化开发

文章目录 一&#xff0c;Vue的模块化开发1&#xff0c;目录结构2&#xff0c;单文件组件 (SFC)3&#xff0c;模块化路由4&#xff0c;Vuex 模块5&#xff0c;动态组件和异步组件6&#xff0c;抽象和复用7&#xff0c;构建和打包8&#xff0c;测试9&#xff0c;文档和注释10&…

Nginx反向代理概述

正向代理与反向代理概述 正向代理&#xff1a; 定义&#xff1a;正向代理位于客户端和目标服务器之间&#xff0c;客户端的请求首先发送到代理服务器&#xff0c;然后由代理服务器转发到目标服务器&#xff0c;最后将目标服务器的响应返回给客户端。 作用&#xff1a;正向代理…

Linux - 进程的概念、状态、僵尸进程、孤儿进程及进程优先级

目录 进程基本概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程- fork初始 fork函数创建子进程 使用if进行分流 Linux进程状态 运行状态-R 浅度睡眠状态-S…

uni-app:踩坑路---关于使用了transform导致fixed定位不生效的问题

前言&#xff1a; 继续记录&#xff0c;在上篇文章中&#xff0c;弹出框遮罩层在ios上没有正确的铺盖全屏&#xff0c;是因为机型的原因&#xff0c;也和我们的代码结构有相关的问题。今天再来展示另外一个奇葩的问题。 这次我使用了在本篇博客中的弹出框组件CustomDialog.vue…

《昇思25天学习打卡营第19天|基于MobileNetv2的垃圾分类》

基于MobileNetv2的垃圾分类 本文档主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写&#xff08;Python语言&#xff09;&a…

【C++】:AVL树的深度解析及其实现

目录 前言一&#xff0c;AVL树的概念二&#xff0c;AVL树节点的定义三&#xff0c;AVL树的插入3.1 第一步3.2 第二步 四&#xff0c;AVL树的旋转4.1 右单旋4.2 左单旋4.3 右左双旋4.4 左右双旋4.5 插入代码的完整实现4.6 旋转总结 五&#xff0c;AVL树的验证六&#xff0c;实现…

插入和选择排序

1.1直接插入排序 void InsertSort(int* a, int n) {for (int i 1; i < n - 1; i) {//i的范围要注意的&#xff0c;防止指针越界int end i;int tmp a[end 1];while (end>0) {if (tmp< a[end]) {a[end 1] a[end];//小于就挪动&#xff0c;虽然会覆盖后面空间的值…

【Linux】通过分配虚拟内存的方式来解决因内存不够而导致部署的项目自动挂掉

多个 jar 包项目部署在同一台服务器上&#xff0c;当服务器配置低&#xff0c;内存不足时&#xff0c;有可能出现 nohup java -jar 启动的进程就莫名其妙挂掉的问题。 解决方式&#xff1a; 第一种方法&#xff1a;进行JVM调优可以改善这种情况&#xff0c;但是项目太多&…