(五)ROS通信编程——参数服务器

前言

参数服务器在ROS中主要用于实现不同节点之间的数据共享(P2P)。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径。上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数(有些路径限宽限高)。参数服务器,一般适用于存在数据共享的一些应用场景。我们将小车尺寸放到一个参数服务器中,这样各个节点使用小车尺寸判断是否能通行直接从参数服务器里取就行

动作编程通信:数据共享模式

1.参数服务器的理论模型

1.演员列表

ROS管理者(其中有一个管理参数的公共容器)、参数的设置方、参数的调用方

2.流程

1.参数的设置方提交参数到管理者,管理者将参数保存至一个参数列表

2.参数的调用者向管理者发送一个参数调用请求

3.管理者到参数列表中查找相关参数,将参数值返回给调用者

3.注意

参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据。

参数服务器可以使用的数据类型:32-bit integers、booleans、strings、doubles、iso8601 dates、lists、base64-encoded binary data、字典。

2.参数服务器的实现(c++)

1.创建一个参数的实例

在工作空间下的源码空间src中建立功能包 plumbing_param_server,并建立依赖包 roscpp、rospy,std_msgs.定位到新建功能包下的src文件,新建文件 demo_param_set.cpp

1.参数新增
#include "ros/ros.h"
 
/*
需要实现参数的新增和修改
1.需求:首先设置机器人的共享参数,类型、半径、再修改半径
2.通过两套api实现  ros::NodeHandle  setParam    ros::param set
*/
 
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"setpara_c");
    ros::NodeHandle nh;
 
    //参数增加
    //方案1:参数名字,参数值
    nh.setParam("type","xiaoHuang");
    nh.setParam("radius",0.15);
 
    //方案2:参数名字,参数值
    ros::param::set("type_param","xiaobai");
    ros::param::set("radius_param",0.1);
    return 0;
}
2.参数修改

直接在原有的基础上进行修改

   //修改 方案一:参数覆盖
    nh.setParam("radius",0.2);
    
    //修改 方案二
    ros::param::set("radius_param",0.25);
#include "ros/ros.h"
 
/*
需要实现参数的新增和修改
1.需求:首先设置机器人的共享参数,类型、半径、再修改半径
2.通过两套api实现  ros::NodeHandle  setParam    ros::param set
*/
 
int main(int argc, char  *argv[])
{
    ros::init(argc,argv,"setpara_c");
    ros::NodeHandle nh;
 
    //参数增加
    //方案1:参数名字,参数值
    nh.setParam("type","xiaoHuang");
    nh.setParam("radius",0.2);
 
    //方案2:参数名字,参数值
    ros::param::set("type_param","xiaobai");
    ros::param::set("radius_param",0.25);
    return 0;
}
 3.参数获取

在功能包的源码空间src下创建文件demo_param_get.cpp

#include "ros/ros.h"
 
/*
演示参数查询
*/
 
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"get_param_c");
    ros::NodeHandle nh;
 
    //ros::NodeHandle----------------------------------------
    //1.param(键,默认值)   存在,返回对应结果,否则返回默认值(0.5)
    double radius = nh.param("radius",0.5);
    ROS_INFO("radius = %.2f",radius);
 
    //2.getParam(键,存储结果的变量):键存在返回值是true,并且将值赋给参数2。不存在为false,不为参数二赋值
    double radius2;
    bool result = nh.getParam("radius",radius2);
    if(result)
    {
        ROS_INFO("获取的半径是 radius = %.2f",radius2);
    }
    else
    {
        ROS_INFO("被查询的变量不存在");
    }
 
    //3.getParamCached(键,存储结果的变量)  --从缓存获取,效率更高,结果与3一样的
 
    //4.getParamNames(std::vector<std::string>) 获取所有的键名称,并存储在参数 vector 中
    std::vector<std::string> names;
    nh.getParamNames(names);
    for(auto && name:names)
    {
        ROS_INFO("遍历到的元素:%s",name.c_str());
    }
    
    //5.hasParam(键) 是否包含某个键 是返回true 否则返回false
    bool flag1  = nh.hasParam("radius");
    bool flag2 = nh.hasParam("sjsjsjs");
    ROS_INFO("参数一存在吗?%d",flag1);
    ROS_INFO("参数二存在吗?%d",flag2);
 
    //6.searchParam(参数一,参数二)  参数一是搜索的键,参数二存储键的名称
    std::string key ;
    nh.searchParam("radius",key);
    ROS_INFO("搜索结果%s",key.c_str());
    return 0;
}

一些修改的API模板

/*
    参数服务器操作之查询_C++实现:
    在 roscpp 中提供了两套 API 实现参数操作
    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 类似
*/
4.参数删除

在功能包的源码空间src下创建文件demo_param_delete.cpp

#include "ros/ros.h"
/*
仍然两种方式实现
*/
 
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"param_del");
    ros::NodeHandle nh;
 
    //删除一
    bool flag1 = nh.deleteParam("radius");
    if(flag1)
    {
        ROS_INFO("success");
    }
    else{
        ROS_INFO("Failed");
    }
    //删除二
    bool flag2 = ros::param::del("radius_param");
     if(flag2)
    {
        ROS_INFO("success");
    }
    else{
        ROS_INFO("Failed");
    }
    return 0;
}

2.修改CmakeLists.txt配置文件

3.编译catkin_make

4.运行可执行文件

别忘了source

5.检验

rosparam list命令:列出所有参数列表

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自动化测试框架搭建-数据库方法连接-初阶

目的 将数据库连接的步骤封装成一个方法&#xff0c;在需要连接数据库时&#xff0c;传入指定的参数&#xff08;SQL&#xff09;即可实现对数据查询和修改 代码实现 1、编写数据库连接方法 2、导入其他方法中使用步骤一 import pymysqldef mysqlConnetion(Sql):# 数据库连…

vivado 时钟指南

时钟指南 每个 FPGA 架构都为时钟提供有专用资源。掌握 FPGA 架构中的时钟资源&#xff0c;使您能够规划好自己的时钟&#xff0c;从而实现时钟 资源的最佳利用。大多数设计无需您了解这些细节。但如果您能够控制布局&#xff0c;同时对每个时钟域上的扇出有良好的思 路&a…

【微信小程序】回到顶部图标-页面滚动事件 | 漫画-综合实训

一、回到顶部-页面滚动事件 在微信小程序中&#xff0c;如果你想将“回到顶部”的功能按钮换成图标&#xff0c;你可以通过以下步骤实现&#xff1a; 1. 准备图标 首先&#xff0c;你需要准备一个图标图片。这个图标可以是任何你选择的格式&#xff0c;如 PNG 或 SVG。将图标…

通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性

目录 1 引言2 手工构建3 基于Maven的构建4 总结 1 引言 最近在阅读一本Java Web的书籍1时&#xff0c;手工实现书上的一个含多个Packages的例子&#xff0c;手工进行编译、运行&#xff0c;最终实现了效果。但感觉到整个构建过程非常繁琐&#xff0c;不仅要手写各个源文件的编…

el-tree拖拽光标错位问题

背景&#xff1a;el-tree实现的分类树增加拖拽功能后&#xff0c;当分类树由于数量较多产生滚动条&#xff0c;如果分类树已滚动&#xff0c;进行拖拽时会造成光标错位的问题: 原因&#xff1a;el-tree拖拽光标定位的高度并未加上滚动的高度解决&#xff1a;将滚动的样式属性放…

【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号“;“报错

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7863046.html?templateId1718516 现象 mybatis或mybaits-plus的mapper文件sql结尾加分号";" 执行时报错&#xff1a;”YAS-04209 unexpected word;“ 解决办法 将sql结尾…

day03-前端Web-Vue3.0基础

目录 前言1. Vue概述2. 快速入门2.1 需求2.2 步骤2.3 实现 3. Vue指令3.1 介绍3.2 v-for3.2.1 介绍3.2.2 演示3.2.3 v-for的key3.2.4 案例-列表渲染 3.3 v-bind3.3.1 介绍3.3.2 演示3.3.3 案例-图片展示 3.4 v-if & v-show3.4.1 介绍3.4.2 案例-性别职位展示 3.6 v-model3.…

Spring Web 嵌套对象校验失效

问题复现 当开发一个学籍管理系统时&#xff0c;我们会提供了一个 API 接口去添加学生的相关信息&#xff0c;学生中有个嵌套属性联系电话&#xff0c;其对象定义参考下面的代码&#xff1a; import lombok.Data; import javax.validation.constraints.Size; Data public class…

计算机网络 (27)IP多播

前言 IP多播&#xff08;也称多址广播或组播&#xff09;技术是一种允许一台或多台主机&#xff08;多播源&#xff09;发送单一数据包到多台主机&#xff08;一次性的、同时的&#xff09;的TCP/IP网络技术。 一、基本概念 定义&#xff1a;多播作为一点对多点的通信&#xff…

计算机毕业设计PyHive+Hadoop深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

口碑很好的国产LDO芯片,有哪些?

在几乎任何一个电路设计中&#xff0c;都可能会使用LDO&#xff08;低压差线性稳压器&#xff09;这个器件。 虽然LDO不是什么高性能的IC&#xff0c;但LDO芯片市场竞争异常激烈。最近几年&#xff0c;诞生了越来越多的精品国产LDO&#xff0c;让人看得眼花缭乱。 业内人士曾经…

Transformer:深度学习的变革力量

深度学习领域的发展日新月异&#xff0c;在自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域取得了巨大突破。然而&#xff0c;早期的循环神经网络&#xff08;RNN&#xff09;在处理长序列时面临着梯度消失、并行计算能力不足等瓶颈。而 Transformer 的横空出世&am…

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中&#xff0c;从宏观层面来看&#xff0c;新技术的落地速度不断加快&#xff0c;各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析&#xff0c;企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…

01-51单片机LED与独立按键

一、单片机概述 注意&#xff1a;个人学习笔记&#xff0c;里面涉及到的C语言和进程转换相关的知识在C语言部分已经写了&#xff0c;这里是默认都会的状态学习单片机。 1.什么是单片机 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU。其内部集成了CPU、R…

腾讯云AI代码助手编程挑战赛-刑说

作品简介 鉴于当代普法力度不够大&#xff0c;这个刑说可以帮助大家更好的普及法律知识 技术架构 采用了全后端分离的架构&#xff0c;前端使用Vue.js&#xff0c;腾讯云的AI服务处理自然语言理解与生成。 实现过程 开发环境、开发流程 系统&#xff1a;win11 开发工具&…

Elasticsearch:聚合操作

这里写目录标题 一、聚合的概述二、聚合的分类1、指标聚合&#xff08;Metric Aggregation&#xff09;2、桶聚合&#xff08;Bucket Aggregation&#xff09;3、管道聚合&#xff08;Pipeline Aggregation&#xff09; 三、ES聚合分析不精准原因分析四、聚合性能优化1、ES聚合…

升级 Spring Boot 3 配置讲解 —— 为何 SpringBoot3 淘汰了 JDK8?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者发现了一个重要的变化&#xff1a;Spring Boot 3 不再支持 JDK 8。这一变化引发了不少讨论&#xff0c;尤其是对于那些仍然在使用 JDK …

rhcsa练习(3)

1 、创建文件命令练习&#xff1a; &#xff08; 1 &#xff09; 在 / 目录下创建一个临时目录 test &#xff1b; mkdir /test &#xff08; 2 &#xff09;在临时目录 test 下创建五个文件&#xff0c;文件名分别为 passwd &#xff0c; group &#xff0c; bashrc &#x…

汽车免拆诊断 | 2007款保时捷Carrera S车行驶中发动机冷却液温度报警灯异常点亮

故障现象 一辆2007款保时捷Carrera S车&#xff0c;搭载3.8 L自然吸气发动机&#xff0c;累计行驶里程约为7.8万km。车主反映&#xff0c;车辆行驶一段距离后&#xff0c;组合仪表上的发动机冷却液温度报警灯异常点亮。为此&#xff0c;在其他维修厂已更换过节温器、发动机冷却…

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小&#xff08;缓存5帧数据&#xff09; #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …