【ROS参数服务器】

news2024/11/17 23:30:03

参数服务器是以共享方式实现不同节点间数据交互的通信方式。主要用于存储多节点共享的数据,类似于全局变量。ROS中的参数服务器主要包含三个角色,分别是ROS Master(节点管理者)、Talker(参数设置者)、Listener(参数使用者),其中Talker和Listener均通过RPC协议进行数据的交互,ROS Master根据Listener提供的请求,查询参数,并通过RPC协议将其发送给Listener,由于通信协议的限制,参数服务器适用于不是高性能的场景,一般用于存储一些非二进制的静态简单数据。

在这里插入图片描述

C++实现参数服务器

1 Talker(参数设置者)
#include "ros/ros.h"
/**
 * @brief 
 * 实现参数服务器数据的增加和修改
 * 即 设置一个参数,然后修改其值
 * @param argc 
 * @param argv 
 * @return int 
 */
int main(int argc,char *argv[]){
    setlocale(LC_ALL,"");
    //初始化ros节点
    ros::init(argc,argv,"set_param_c");
    //创建句柄
    ros::NodeHandle nh;
    //使用句柄创建参数服务器
    nh.setParam("type","ceshi");
    nh.setParam("radius",1.0);
    //使用ros::param来设置参数
    ros::param::set("type_param","ceshi_1");
    ros::param::set("radius_param",1.2);
    return 0;
}

1.1 CmakeLists.txt的配置,这个和普通节点的配置一样了
在这里插入图片描述
在这里插入图片描述
1.2 测试
打开终端,启动主节点 roscore

roscore

打开终端,启动配置好的C++节点

source ./devel/setup.bash
#该步骤会自动将参数发布至 rosparam list
rosrun plumbing_param_server ps_set_node

打开终端,使用rosparam list 查看话题
在这里插入图片描述
然后可以使用下面命令对参数进行操作

rosparam get /type# 得到参数ceshi

在这里插入图片描述

 rosparam set /type 123#可以修改 /type的值

在这里插入图片描述

2 Listener(参数获取)

记录nodeHandler参数的获取方法,定义 param_server_get.cpp 文件,然后内容如下:

#include "ros/ros.h"

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

    //nodehandler实现
    //1 param(键,默认值),键值不存在,则返回默认值
    double radius = nh.param("radius",0.01);
    ROS_INFO("the radius param=%.2f",radius);
    //2. getParam(键,存储的返回值变量)
    //如果键存在,则返回true,且将返回值赋值给变量
    double res = 0.0;
    bool flag = nh.getParam("radius",res);
    if(flag){
        ROS_INFO("the res is :%.2f",res);
    }else{
        ROS_INFO("the res not exists..");
    }
    //3. getParamCached(键,存储的返回值变量) 从缓存中获取数据
    //如果之前获取过,则返回true,一般速度较快 并将 值赋值给返回值变量
    flag = nh.getParamCached("radius",res);
    if(flag){
        ROS_INFO("the cached res is :%.2f",res);
    }else{
        ROS_INFO("the cached res not exists..");
    }
    //4 getParamNames(std::vector<std::string>)
    std::vector<std::string> names;
    nh.getParamNames(names);
    for(auto &&name : names){
        ROS_INFO("the param name is: %s",name.c_str());
    }
    //5 hasParam(string) 有 true 无 false
    bool flag1 = nh.hasParam("radius");
    bool flag2 = nh.hasParam("tt");
    ROS_INFO("the flag1 res: %d, the flag2 res: %d",flag1,flag2);
    //searchParam("keyName",res)
    // 如果 keyName存在,则将keyName 返回给res
    std::string r;
    nh.searchParam("radius",r);
    ROS_INFO("the res %s",r.c_str());
    return 0;
}

2.1 将上面的 param_server_get,cpp 配置到 CmakeLists.txt
在这里插入图片描述
在这里插入图片描述
2.2 打开终端,先启动 roscore
2.3 启动 Talker 节点,发布参数

source ./devel/setup.bash
rosrun plumbing_param_server ps_set_node

2.4 启动Listener节点,获取参数

source ./devel/setup.bash
rosrun plumbing_param_server ps_get_node

在这里插入图片描述
在这里插入图片描述

3. 使用ros::param获取参数

如果以上使用NodeHandler获取参数看懂了,下面使用ros::param进行获取其实是大差不差,可以看下图的 API
在这里插入图片描述
部分源代码:

#include "ros/ros.h"

int main(int argc,char *argv[]){
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"get_para");
    // ros::param下面的参数获取
    double re = ros::param::param("radius",0.2);
    ROS_INFO("rosParam res: %.2f",re);
    //等价于std::vector<std::string> nameRes;
    ros::V_string nameRes;
    ros::param::getParamNames(nameRes);
    for(auto &&name : nameRes){
        ROS_INFO("the name :%s",name.c_str());
    }
    return 0;
}

执行过程和上面的一样,可以看到最终的执行结果
在这里插入图片描述

3 删除节点

创建 param_server_del.cpp 文件

#include "ros/ros.h"

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

    //nh.deleteParam
    bool flag = nh.deleteParam("radius");
    if(flag){
        ROS_INFO("delete complete...");
    }else{
        ROS_INFO("Wrong...");
    }
    //ros:param::del
    bool flag1 = ros::param::del("radius");
    if(flag1){
        ROS_INFO("delete  success");
    }else{
        ROS_INFO("delete wrong");
    }
    return 0;
}

先运行 param_server_set.cpp 节点,然后再进行按照键值删除。注意不要忘了配置CMakeLists.txt,和上面的配置方法相同, 配置完全后,再进行运行即可。

Python实现参数服务器

1 设置参数
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy

if __name__=="__main__":
    #初始化node
    rospy.init_node("set_param_server_p")
    #设置参数
    rospy.set_param("type_p","set_server")
    rospy.set_param("radius",1.0)
    rospy.set_param("p_list",[1,2,3])

1.1 在 CMakeLists.txt 中设置 Python 脚本的执行
在这里插入图片描述
1.2 编译,随后切换到 scripts文件目录,使用以下命令:

chmod +x *.py #修改python 文件的可执行权限

1.3 打开终端 运行 roscore
1.4 运行新建立的节点

source ./devel/setup.bash
rosrun plumbing_param_s(你的项目名) param_server_set.py#即可设置参数 
2 获取参数
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
'''
get_param_cached
get_param_names
has_param
search_param
'''
if __name__=="__main__":
    rospy.init_node("param_server_get")

    type_p = rospy.get_param("type_p","aa")
    rospy.loginfo("info : %s",type_p)

    type_p = rospy.get_param_cached("type_p","aa")
    rospy.loginfo("info : %s",type_p)

    names = rospy.get_param_names()
    for name in names:
        rospy.loginfo("res: %s",name)
    if rospy.has_param("type_p"):
        rospy.loginfo("the type_p : %s",rospy.get_param("type_p"))
    else:
        rospy.loginfo("wrong ... ")
    
    key = rospy.search_param("type_p")
    rospy.loginfo(key)

执行过程和上面的 set.py 同

3 删除参数
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy

if __name__=="__main__":
    rospy.init_node("del_p")

    try:
        rospy.delete_param("type_p")
    except Exception as e:
        rospy.loginfo("key is not exists")

执行过程和上面的 set.py 同

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

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

相关文章

创新京东T7开创“新算法宝典”,图文并茂,全新演绎,太酷了

导言 算法是一门学问&#xff0c;但却总遭到一些程序员的冷落。现在的开发人员&#xff0c;更热衷于编程语言的修炼&#xff0c;以应付面试需求时的需要&#xff0c;所以对算法的学习&#xff0c;稍许忽略了些。实际上&#xff0c;近些年来&#xff0c;各互联网公司对于算法的…

【知识梳理】前端路由的两种模式

一、概述 这是几年前写的的一篇文章&#xff0c;发在了简书上面&#xff0c;现在看来仍然有一些不足&#xff0c;所以再次整理一下发在掘金。 二、什么是单页面应用&#xff08;SPA&#xff09;&#xff1f; 首先我们需要了解一下前置的基础知识————SPA&#xff08;单页面…

S3 #DooTrader 经典组冠军以良好盘感,创下近 900% 收益率摘得桂冠

本届 S3 #DooTrader 慈善杯全球交易大赛现已经进入白热化阶段&#xff0c;第二轮赛事冲刺在即&#xff0c;各位选手摩拳擦掌争取赢得最终的丰厚奖金。目前&#xff0c;领先的选手调整策略和仓位&#xff0c;以保持排位优势。我们看到现阶段经典组 TOP 1 选手已经创造了 1,300% …

WMS类图分析-android12

为什么要分析类图&#xff1f; WMS是一个复杂的模块&#xff0c;就像一个很大的家族&#xff0c;里面有各种角色&#xff0c;认识类图就像是认识WMS模块中的各个角色&#xff0c;不先把人认清楚了&#xff0c;怎么更好的理解他们之间的交互&#xff1f; 我觉得&#xff0c;这…

vue+antd搭建后台管理界面模版(PC端),适配中文、英文、日文 mock数据,开箱即用

vueantd搭建后台管理界面模版&#xff08;PC端&#xff09; 完整代码下载地址&#xff1a;vueantd搭建后台管理界面模版&#xff08;PC端&#xff09; 技术栈 vue2 vuex vue-router webpack ES6/7 axios antd 阿里图标iconfont 项目预览 http://nmgwap.gitee.io/vue…

【软件工程】实验4:校园二手物品交易过程的UI设计

文章目录校园二手物品交易过程的UI设计通过“用户画像”对用户群体进行分析校园二手物品交易过程UI设计&#xff08;Figma&#xff09;校园二手物品交易过程的UI设计 通过“用户画像”对用户群体进行分析 大学校园交易市场特点&#xff1a; 容量大。随着我国高等教育近年来的连…

Kubernetes部署_使用kubernetes部署Mysql主从结构(Kubernetes工作实践类)

文章目录一、前言二、实际操作步骤1&#xff1a;编写namespace脚本步骤2&#xff1a;编写configmap脚本步骤3&#xff1a;编写secret脚本(用来存放mysql密码)步骤4&#xff1a;编写initContainer脚本步骤5&#xff1a;编写StorageClass相关脚本1&#xff09;权限设置&#xff1…

干货分享 | To B业务的用户运营五要点

随着产业互联网格局的逐渐深化&#xff0c;近年来&#xff0c;To B业务逐渐被互联网改变和赋能。为了更高效地获客和服务&#xff0c;更多的运营手段逐渐被运用在To B业务之中&#xff0c;而To B运营也变得越来越重要。 作为一家To B企业&#xff0c;AdBright常常收到网友的提问…

YOLOV3论文学习

YOLOv3论文链接&#xff1a;https://pjreddie.com/media/files/papers/YOLOv3.pdf 综述 一、摘要 1、320*320的YOLOv3推理时间22ms&#xff0c;准确率28.2mAP&#xff0c;达到了SSD的精确度&#xff0c;推理速度却快了三倍。 2、基于.5mAp Iou 的YOLOv3的检测效果还比较不错&a…

Python使用Pandas导入数据库sql

Python使用Pandas导入数据库sql一、前言二、准备工作三、从数据库导入数据到Pandas一、前言 对于关系数据库的访问&#xff0c;Python社区已经制定出一个标准&#xff0c;称为Python Database API Specification。Mysql&#xff0c;Oracal等特定数据库模块都遵从这一规范&…

QT 学习笔记(十一)

文章目录一、绘图设备1. QPixmap1.1 QPixmap 简介1.2 QPixmap 演示2. QBitmap2.1 QBitmap 简介2.2 QBitmap 演示见 QPixmap 和 QBitmap 的区别。3. QImage3.1 QImage 简介3.2 QImage 演示4. QPicture4.1 QPicture 简介4.2 QPicture 演示二、QPixmap 和 QBitmap 的区别1. widget…

Python正在消亡?致命弱点是否会让Python被新语言取代?

被业界称为“瑞士军刀”的编程语言&#xff0c;可能会被更适合该任务的其他语言取代吗&#xff1f; 自从1990年代初Python发布以来&#xff0c;它引起了很多热议。当然&#xff0c;编程社区花了至少20年的时间才逐渐注意到它的存在&#xff0c;而当它一旦开始流行起来&#xf…

Web入门开发【一】- Web开发介绍

欢迎来到霍大侠的小院&#xff0c;我们来学习Web入门开发的系列课程。 首先我们来了解下这个课程能学到什么&#xff1f; 1、你将可以掌握Web网站的开发全过程。 2、了解基础的HTML&#xff0c;CSS&#xff0c;JavaScript语言。 3、开发自己的第一个网站。 4、认识很多对编…

UML类关系

1、聚合关系&#xff08;aggregation&#xff09; 用空心菱形箭头表示&#xff0c;整体和部分有各自的生命周期。部分可以属于多个整体对象! class Student; class Class { private: Student s; public: void set_student(Student s) { this.s s; } }; student() { print(“c…

电脑商城网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 作为一个网上商城系统&#xff0c;就应该做到能提供强大的业务支持功能&#xff0c;系统能实现用户的注册功能、登录 功…

整理各种Vue项目在IE浏览器白屏报错 SCRIPT1002:语法错误

目录 一、关于 sockjs-client 依赖包 二、关于 highlight 依赖包 三、关于 swiper 依赖包 四、IE 不支持 ES6 语法 五、第三方插件引入导致 六、本地环境正常&#xff0c;生产环境仍旧白屏 这篇文章主要介绍了 Vue 项目在 IE 浏览器显示白屏并报错 SCRIPT1002: 语法错误 …

【数字信号处理】卷积和乘法系列3之傅里叶变换对III

“傅里叶”家族 引言 虽然你知道傅里叶级数和变换,但看看它们之间的关系是很有趣的。本节的目的是展示各种基于傅立叶的变换如何相互关联。 要做到这一点,有必要认识到存在一个具有四个成员的傅里叶“家族”,如图 30 所示。有四个是因为除了具有系列与变换选项(行)外,…

转行的35岁程序员们

“大龄程序员去哪儿了”&#xff0c;10月24日程序员节当天&#xff0c;这成为了社交媒体上最火的话题之一。根据澎湃新闻统计&#xff0c;在知乎、豆瓣上关于“大龄程序员”的369个有效提问里&#xff0c;大龄程序员的职场成长问题最受关注&#xff0c;一共有242个&#xff0c;…

给刚入职场的年轻人八条建议

年轻人刚入职场时&#xff0c;总会碰到各种各样的难题&#xff0c;作为过来人&#xff0c;很多新人的难处我也深有体会。想要快速融入职场是没有捷径的&#xff0c;但是如果处理得当&#xff0c;还是可以少走很多弯路&#xff0c;以下就是我总结的给刚入职场的年轻人的八条建议…

JavaDS1-时间复杂度空间复杂度

目录 1.算法效率 1.1.时间效率&#xff08;时间复杂度&#xff09;——衡量算法运行速度 1.2.空间效率&#xff08;空间复杂度&#xff09;——衡量算法所需额外空间&#xff08;如今不再特别关注&#xff09; 2.时间复杂度 2.1.概念 2.2.大O的渐进表示法 2.2.1.O(F(n))…