ROS学习——通信机制(参数服务器)

news2024/9/27 23:31:00

一、引言

参数服务器在ROS中主要用于实现不同节点之间的数据共享。参数服务器相当于是独立于所有节点的一个公共容器,可以将数据存储在该容器中,被不同的节点调用,当然不同的节点也可以往其中存储数据,关于参数服务器的典型应用场景如下:

导航实现时,会进行路径规划,比如: 全局路径规划,设计一个从出发点到目标点的大致路径。本地路径规划,会根据当前路况生成时时的行进路径

上述场景中,全局路径规划和本地路径规划时,就会使用到参数服务器:

  • 路径规划时,需要参考小车的尺寸,我们可以将这些尺寸信息存储到参数服务器,全局路径规划节点与本地路径规划节点都可以从参数服务器中调用这些参数

参数服务器,一般适用于存在数据共享的一些应用场景。

概念

以共享的方式实现不同节点之间数据交互的通信模式。

作用

存储一些多节点共享的数据,类似于全局变量。

二、理论模型

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

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

ROS Master 作为一个公共容器保存参数,Talker 可以向容器中设置参数,Listener 可以获取参数。

1.Talker 设置参数

Talker 通过 RPC 向参数服务器发送参数(包括参数名与参数值),ROS Master 将参数保存到参数列表中。

2.Listener 获取参数

Listener 通过 RPC 向参数服务器发送参数查找请求,请求中包含要查找的参数名。

3.ROS Master 向 Listener 发送参数值

ROS Master 根据步骤2请求提供的参数名查找参数值,并将查询结果通过 RPC 发送给 Listener。

4.参数可使用数据类型

  • 32-bit integers(4个字节int)

  • booleans

  • strings

  • doubles

  • iso8601 dates(时间类型数据)

  • lists

  • base64-encoded binary data

  • 字典

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

需求:实现参数服务器参数的增删改查操作。

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

  • ros::NodeHandle

  • ros::param

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

1.新建文件-->添加依赖包-->新建文件,搭建框架 

2.初始化ROS节点

3.创建ROS节点句柄

4.参数增

①方法一

 参数2——键名;参数2——参数值

(ctrl+shift+空格出提示)

 ②方法二

 5.配置

6.编译、测试

 7.参数改

①方法一

②方法二

 8.编译、测试

9.全代码 

/*
    参数服务器操作之新增与修改(二者API一样)_C++实现:
    在 roscpp 中提供了两套 API 实现参数操作
    ros::NodeHandle
        setParam("键",值)
    ros::param
        set("键","值")

    示例:分别设置整形、浮点、字符串、bool、列表、字典等类型参数
        修改(相同的键,不同的值)

*/
#include "ros/ros.h"

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

    std::vector<std::string> stus;
    stus.push_back("zhangsan");
    stus.push_back("李四");
    stus.push_back("王五");
    stus.push_back("孙大脑袋");

    std::map<std::string,std::string> friends;
    friends["guo"] = "huang";
    friends["yuang"] = "xiao";

    //NodeHandle--------------------------------------------------------
    ros::NodeHandle nh;
    nh.setParam("nh_int",10); //整型
    nh.setParam("nh_double",3.14); //浮点型
    nh.setParam("nh_bool",true); //bool
    nh.setParam("nh_string","hello NodeHandle"); //字符串
    nh.setParam("nh_vector",stus); // vector
    nh.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;
}

四、参数服务器获取参数

 参数服务器操作之查询_C++实现:
    在 roscpp 中提供了两套 API 实现参数操作
    ros::NodeHandle
    ros::param

1.新建文件

 2.配置文件

3.搭建框架

 4.方法1——ros::NodeHandle

(1)param

param(键,默认值) 
            存在,返回对应结果,否则返回默认值

 (2)getParam

 getParam(键,存储结果的变量)
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

 (3)getParamCached

 getParamCached(键,存储结果的变量)--提高变量获取效率
            存在,返回 true,且将值赋值给参数2
            若果键不存在,那么返回值为 false,且不为参数2赋值

 (4)getParamNames

getParamNames(std::vector<std::string>)
            获取所有的键,并存储在参数 vector 中 

 如果这里编译出错,就在cmakelists里打开第五行注释add_compile_options(-std=c++11),即可正常编译

(5)hasParam

hasParam(键)
            是否包含某个键,存在返回 true,否则返回 false

 (6)seaerchParam

searchParam(参数1,参数2)
            搜索键,参数1是被搜索的键,参数2存储搜索结果的变量

 5.编译、运行

roscore

 

 6.方法2——ros::param

//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());

五、参数服务器删除参数

1.新建文件,配置

 2. 搭建框架

3.方法1——NodeHandle

 ros::NodeHandle
        deleteParam("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

 4.编译、测试

 5.方法2——ros::param

 ros::param
        del("键")
        根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false

 

 

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

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

相关文章

【c++】组合类+继承情况下构造顺序

组合类继承情况下构造顺序 构造顺序同普通继承&#xff0c;先父后子&#xff0c;内部类是最老的&#xff08;最先调用构造的&#xff09;。 示例代码 class A { public:A(int a 0):_a(a){cout << "A()" << endl;}~A(){cout << "~A()" …

如何将本地python项目部署到阿里云服务器上(完整版)

一、准备阿里云服务器 首先在阿里云服务器免费试用网站中选择相应的服务器&#xff0c;本次搭建选择的服务器是适合入门级开发者的服务器。在阿里云控制台上创建一个云服务器&#xff08; ECS 实例&#xff09;并获取访问凭证&#xff0c;包括主机 IP 地址、用户名和密码。在服…

K Shortest Paths算法之Eppstein algorithm

Eppstein的算法是David Eppstein于1998年提出的一种高效且易于实现的k条最短路径寻找方法。它的时间复杂度为O(m n log n k)&#xff0c;其中m是边的数量&#xff0c;n是节点的数量&#xff0c;k是要寻找的路径数。相较于其他方法&#xff0c;它具有较好的性能和实用性。 Epp…

路漫漫其修远兮

其实不仅是专业&#xff0c;AI冲击波才刚刚开启&#xff0c;包括博客、自媒体作用也在大幅度下降呢。 很多人看过如下这幅图&#xff1a; 提示工程师确实是在当前大型语言模型不够完善的情况下&#xff0c;通过微调输入的方式来提高模型的性能。随着模型的迭代&#xff0c;这些…

算法模板(8):网络流(1):最大流

算法模板&#xff08;8&#xff09;&#xff1a;网络流&#xff08;1&#xff09;&#xff1a;最大流 网络流基本概念 基本概念 流网络&#xff0c;不考虑反向边可行流&#xff0c;不考虑反向边 两个条件&#xff08;根据《算法导论》&#xff0c;这两个条件可以看作可行流的充…

mapbox实现线要素的文字标注功能

效果图 操作步骤 首先查看mapbox自己的api里面有没有&#xff0c;好像里面并没有类似于line-text的属性 然后打开mapbox studio&#xff0c;发现里面确实是有这种样式的&#xff0c;他的图层名字叫 然后我们下载下来这个样式 打开style.json文件之后&#xff0c;找到这个图…

【数据可视化】Plotly Express绘图库使用

Plotly Express是一个基于Plotly库的高级Python可视化库。它旨在使绘图变得简单且直观&#xff0c;无需繁琐的设置和配置。通过使用Plotly Express&#xff0c;您可以使用少量的代码创建具有丰富交互性和专业外观的各种图表。以下是Plotly Express的一些主要特点和优势&#xf…

Maven教学--上

Maven教程–上 先看一个问题&#xff0c;引出Maven 需求说明/图解 编写一个类, 有一个方法sum&#xff0c;可以返回两个数的和编写测试类TestSum, 可以测试sum 是否正确. 使用传统方式完成 创建传统的java 项目java-hello 创建Hello.java public class Hello {public S…

【30天熟悉Go语言】5 Go 基本数据类型

文章目录 一、前言二、数据类型总览1、基本数据类型1&#xff09;数值型-整数类型1> 有符号整数类型&#xff1a;2> 无符号整数类型&#xff1a;3> 其他整数类型&#xff1a;4> PS:Go的整数类型&#xff0c;默认声明为int类型&#xff1a;5> 变量占用的字节数 2…

PowerShell系列(六):PowerShell脚本执行策略梳理

目录 1、执行策略等级 2、执行策略范围 3、执行策略命令语法格式 4、执行策略常用命令 PowerShell 是一种用于操作 系统的命令行界面&#xff0c;支持跨平台&#xff0c;它提供了许多功能来自动化和优化各种任务。PowerShell 是由微软官方开发的&#xff0c;并作为 Windows Ser…

教培行业的“智能GPT私教”?WorkPlusAI助理帮助教培机构实现十倍人效!

从横空出世到掀起高潮&#xff0c;当下&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;模式下的ChatGPT它正以惊人的速度席卷各个领域&#xff0c;在线教培行业也不例外。那么&#xff0c;正式进入落地期的ChatGPT&#xff0c;在在线教培行业有那些应用前景呢&#…

QT中信号和槽的概念

信号就是发生什么事件&#xff0c;槽就是触发什么函数&#xff0c;所以信号与槽就是发生什么事件(比如点击某个按钮)然后就会触发某个函数 connect(信号的发送者&#xff0c;发送的具体信号&#xff0c;信号的接受者&#xff0c;信号的处理&#xff09; connect(myButton , &a…

Android 内存泄漏

名词解释 内存泄漏:即memory leak。是指内存空间使用完毕后无法被释放的现象&#xff0c;虽然Java有垃圾回收机制&#xff08;GC&#xff09;&#xff0c;但是对于还保持着引用&#xff0c; 该内存不能再被分配使用&#xff0c;逻辑上却已经不会再用到的对象&#xff0c;垃圾回…

阿里P8整理的《亿级并发系统设计》实战教程,面面俱到,实在太全了

候&#xff0c;那系统架构一定不是那么简单的&#xff0c;用个 redis&#xff0c;用 mq 就能搞定&#xff1f;当然不是&#xff0c;真实的系统架构搭配上业务之后&#xff0c;会比这种简单的所谓“高并发架构”要复杂很多倍。 如果有面试官问你个问题说&#xff0c;如何设计一…

亚马逊、eBay新品期没有出单怎么办?自养买家号的重要性和技巧

一&#xff1a;新品期没有出单怎么办&#xff1f; 1.刚开始,低bid 调整&#xff0c;20元预算&#xff0c;让位置可以靠后点&#xff0c;因为前期跟前面比&#xff0c;比不赢&#xff0c;不如去后面比。 2.价格不是由卖家单一决定&#xff0c;而是由市场决定的。 3.切记自嗨型…

Kotlin Lambda表达式和匿名函数的组合简直太强了

Kotlin Lambda表达式和匿名函数的组合简直太强了 简介 首先&#xff0c;在 Kotlin 中&#xff0c;函数是“第一公民”&#xff08;First Class Citizen&#xff09;。因此&#xff0c;它们可以被分配为变量的值&#xff0c;作为其他函数的参数传递或者函数的返回值。同样&…

去中心化公链生态是否还有未来

2020年流动性挖矿带来的高收益让 DeFi Summer 点燃了2021年的大牛市。质押借贷、AMM作市、DEX、GameFi以及元宇宙等赛道的相继爆火&#xff0c;让整个行业看到了区块链的未来潜力&#xff0c;公链生态的繁荣也给项目带来了更多的可能性。而当市场进入熊市时&#xff0c;不少公链…

【netty基础】Java NIO三件套

文章目录 一. 缓冲区1&#xff0e;Buffer操作基本API2&#xff0e;Buffer的基本原理2.1. put操作2.2. get操作2.3. clear()回到初始化buffer的值 3&#xff0e;缓冲区的分配4&#xff0e;缓冲区分片5&#xff0e;只读缓冲区6. 直接(direct)缓冲区7. 内存映射 二. 选择器三. 通道…

直接插入排序--C语言(附详细代码)(附图详解)

目录 插入排序法的介绍 什么是插入排序法&#xff1f; 稳定性分析 插入排序基本思想 例子分析 实现代码 运行结果 插入排序法的介绍 什么是插入排序法&#xff1f; 插入排序&#xff0c;一般也被称为直接插入排序。对于少量元素的排序&#xff0c;它是一个有效的算法 。…

Django-3.2-LTS兼容哪些Python版本?支不支持Python3.9.10?

问&#xff1a;请问Python的3.9.10版本兼不兼容Django的3.2版&#xff1f; 答&#xff1a;Python 3.9.10 和 Django 3.2 之间是兼容的。Django 3.2 是一个长期支持&#xff08;LTS&#xff09;版本&#xff0c;它支持 Python 3.6、3.7、3.8 和 3.9。因此&#xff0c;Python 3.9…