IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> ROS通信机制~参数服务器·笔记4 -> 正文阅读

[系统运维]ROS通信机制~参数服务器·笔记4

相关系列文章:

ROS开发(ubuntu)笔记·1_嘻·嘻的博客-CSDN博客

ROS通信机制~话题通信(Publisher&Subscriber)·笔记2_嘻·嘻的博客-CSDN博客

ROS通信机制~服务通信(server&client)·笔记3_嘻·嘻的博客-CSDN博客

参数服务器在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。

参数可使用数据类型:

  • 32-bit integers

  • booleans

  • strings

  • doubles

  • iso8601 dates

  • lists

  • base64-encoded binary data

  • 字典

?对于iso8601 dates,就是用来表示时间的,

?对于boolean

当转换其他的数值类型为?boolean?值时,0 会转成 False,而其他的值则变成 True。当转换?boolean?值为其他的数据类型时,False 成为 0,而 True 成为 -1。

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

  • ros::NodeHandle

  • ros::param

?【1】参数服务器新增(修改)参数

#include"ros/ros.h"
/*
   需要实现参数的新增与修改
   需求:首先设置机器人的共享参数,类型  半径(0.15m)
        再修改半径(0.2m)
    实现:
        ros::NodeHandle
             setParam("键",值)
        ros::param
            set("键",值)
    修改,只需要继续调用  setParam 或 set函数,保证键是已经存在的,值就会覆盖
*/



int main(int argc, char *argv[])
{
    //初始化ROS节点
    ros::init(argc,argv,"set_param_c");//节点名称不能存在空格
    //创建ROS节点句柄
    ros::NodeHandle nh;
    //参数新增---------------------------
    //方案1:nh
    nh.setParam("type","xiaoHuang");
      //  参数1为"键" 参数2是个值(支持多种数据类型)
    nh.setParam("radius",0.15);
    //方案2: ros::param
    ros::param::set("type_param","xiaoBai");
    ros::param::set("radius_param",0.15);
    //参数修改-----------其实就是参数新增,只不过若 键 已经存在,就会改变 值
    //方案1:nh
    nh.setParam("radius",0.2);
    //方案2:ros::param
    ros::param::set("radius_param",0.25);

    return 0;
}

?上图中出现的setParam函数有多种重载,使用了这两种,现给出源码:

下一步就是配置CMakelists.txt了(下图是把3个cpp文件都配置了)?

Ctrl+Shift+B编译一下,没有出现ERROR的话,就可以打开终端运行1了

在一个终端rosrun启动设置参数,

另一个终端可以输入rosparam list ,就可以列出现有的参数(有我们自己创建的,也有系统创建的)

再输入rosparam get 自己设的参数名 就可以查看自己设的值(没加上修改的代码之前)

?加上修改的代码后

【2】?参数服务器获取参数

自己创建一个新的cpp文件实现提交参数的作用
? ? 演示参数查询
? ? 实现:两套API
? ? ? ? ros::NodeHandle-------------------------------------
? ? ? ? ? ?1. ?param(键,默认值);
? ? ? ? ? ? ? ? ? 键存在,返回对应结果,否则返回默认值

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

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

该函数可以完成本地参数的缓存,命令参数服务器一旦参数变化就立即通知这个节点。可以大大提高速度(首次调用之后),但是为了防止重载,应该谨慎使用。

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

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

? ? ? ? ? ?6.serachParam(参数1,参数2)
? ? ? ? ? ? ? ?搜索键,参数1是被搜索的键,参数2储存搜索结果的变量 ? ? ??

? ? ? ? ros::param ----与ros::NodeHandle的函数功能几乎相同-------------------------------------------
? ? ? ? 各函数与上面一一对应
? ? ? ? 1.ros::param::param(键,默认值) ? ? ??
? ? ? ? 2.ros::param::get(键,存储结果的变量)
? ? ? ? 3.ros::param::getCached(键,存储结果的变量)
? ? ? ? 4.ros::param::getParamNames(std::vector<std::string>)
? ? ? ? 5.ros::param::has(键)
? ? ? ? 6.ros::param::search(参数1,参数2)

#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 radius = nh.param("radius",0.5);
//这个0.5是默认值,如果""中的键值在服务端中不存在,则返回默认值
   ROS_INFO("radius = %.2f",radius);

   //2.getParam
   double radius2 = 0.0;
   //bool result =nh.getParam("radius",radius2);
   bool result =nh.getParamCached("radius",radius2);
//3.getParamCached 与 getParam 类似,只是性能上有提升,一般测试看不出来

   if(result)
   {
       ROS_INFO("获取的半径是:%.2f",radius2);
   }
   else
   {
       ROS_INFO("被查询的变量不存在");
   }
    
  //4.getParamNames
  std::vector<std::string>names;
  nh.getParamNames(names);
  for(auto &&name : names)//for循环,引用数组names中的每个元素(string类型)
  {
      ROS_INFO("遍历的元素:%s",name.c_str());
  }
  //5.hasParam
  bool flag1 = nh.hasParam("radius");
  bool flag2 = nh.hasParam("radiusxxxxx");
  ROS_INFO("radius 存在吗? %d",flag1);
  ROS_INFO("radiusxxxxx 存在吗? %d",flag2);

  //6.searchParam
  std::string key,key1;

  nh.searchParam("radius",key);
  ROS_INFO("搜索结果:%s",key.c_str());

  nh.searchParam("radiusxxxx",key1);
  ROS_INFO("搜索结果:%s",key1.c_str());

   return 0;

}

?c_str():生成一个const char*指针,指向以空字符终止的数组。返回一个指向正规C字符串的指针常量, 内容与本string串相同。
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

1.首先是前4个函数(param,getParam,getParamCached,getParamNames)的运行结果

?2.然后是第5个函数(hasParam)的运行结果:

?3.然后是第6个函数(serachParam)的运行结果:

?如果搜索不到某个参数,就无输出。

【3】参数服务器删除参数

#include"ros/ros.h"
/*
   演示参数列表:
   实现:
       ros::NodeHandle
            delParam()
       ros::param
            del("键",值);

*/    

int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"param_del_c");
    ros::NodeHandle nh ;
    //删除: NodeHandle--------------------
    bool flag1 = nh.deleteParam("radius");
    if(flag1)
    {
        ROS_INFO("删除成功!");
    }
    else
    {
        ROS_INFO("删除失败!");
    }

    //删除:ros::param----------------------
    bool flag2 = ros::param::del("radius_param");
    if(flag2)
    {
        ROS_INFO("删除成功!");
    }
    else
    {
        ROS_INFO("删除失败!");
    }
    return 0;
}

先执行删除名为radius的键,运行结果:

?再重复一遍操作,因为上一步已经删过了,所以运行结果如图:

?下一步,我们再输入rosparam list,就会发现radius键已经无了,再进行下一步删除radius_param

运行结果:

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:55:01  更:2021-12-24 18:56:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 5:53:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码